前提・実現したいこと
お世話になります。
首題の件、scikit-learnのリッジ回帰で、自分で用意した株のデータから株の指標の予測を行った結果、ridge.score()で得られるテストデータに対するスコアが負の値になるなど異常値となりました。
何が原因でこのような事象が起きているのか突き止めたいです。
アドバイスなど頂けたら幸いです。
お手数おかけしますが、よろしくお願いいたします。
発生している問題・エラーメッセージ
銘柄ごとに予測モデルを作成し、訓練データ、テストデータそれぞれに対するスコアが以下の通り出力されました。訓練データに対するスコアはそれらしい結果となっていますが、テストデータに対するスコアが負の値となります。
1332-TS.csv Training set score: 0.58 Test set score: -22.20 1333-TS.csv Training set score: 0.78 Test set score: -2.58 1605-TS.csv Training set score: 0.49 Test set score: -8.96 1801-TS.csv Training set score: 0.58 Test set score: -29.81 1802-TS.csv Training set score: 0.34 Test set score: -13.37 1803-TS.csv Training set score: 0.67 Test set score: -21.60 1808-TS.csv Training set score: 0.77 Test set score: -18.13 1812-TS.csv Training set score: 0.69 Test set score: -342.58
該当のソースコード
python
1import os 2import glob 3import pandas as pd 4from sklearn.linear_model import Ridge 5 6dirlist1 = glob.glob('C:/XXXX/*.csv') 7for dir1 in dirlist1: 8 print(os.path.split(dir1)[1][6:]) 9 df = pd.read_csv(dir1) 10 11 train = df.iloc[:split_rate, :] 12 test = df.iloc[split_rate:-1, :] 13 train = train.sample(frac=1, random_state=42) 14 test = test.sample(frac=1, random_state=42) 15 X_train = train.iloc[:, :-1] 16 y_train = train['TARGET'] 17 X_test = test.iloc[:, :-1] 18 y_test = test['TARGET'] 19 20 ridge = Ridge(alpha=1).fit(X_train, y_train) 21 print("Training set score: {:.2f}".format(ridge.score(X_train, y_train))) 22 print("Test set score: {:.2f}".format(ridge.score(X_test, y_test))) 23
準備したデータの一行抜粋
変数1 | 変数2 | 変数3 | 変数4 | 変数5 | 変数6 | 変数7 | 変数8 | 変数9 | 変数10 | 変数11 | 変数12 | 変数13 | 変数14 | 変数15 | 変数16 | 変数17 | 目的変数 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
3.514667295 | -1.014498977 | -1.41034733 | -1.625797486 | 0.33932985 | 0.308598303 | -1.122433002 | -3.264840788 | -0.033962561 | -0.282805475 | -0.01585202 | -1.647171362 | -1.592571672 | -1.748352547 | 0.288508967 | -1.673587544 | 1.769072133 | -0.132757815 |
試したこと
train_test_splitを使用して、以下のようにshuffle=Trueにするとテストスコアとしてそれらしい結果が出ました。(テストのほうがスコアが高いものがあったりでこれはこれでおかしいですが、、、)
また、shuffle=Falseとすると、今回と同様にテストスコアが負の値となりました。
時系列データの分割なので、本来このような分割方法は間違っていると思いますが、確認のためにやってみました。
■shuffle=Trueの場合
python
1 X = df.iloc[:, :-1] 2 y = df['TARGET'] 3 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42) 4
1332-TS.csv Training set score: 0.61 Test set score: 0.63 1333-TS.csv Training set score: 0.73 Test set score: 0.70 1605-TS.csv Training set score: 0.52 Test set score: 0.55
■shuffle=Falseの場合
python
1 X = df.iloc[:, :-1] 2 y = df['TARGET'] 3 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42, shuffle=False) 4
1332-TS.csv Training set score: 0.67 Test set score: -72.65 1333-TS.csv Training set score: 0.75 Test set score: -3.37 1605-TS.csv Training set score: 0.60 Test set score: -16.21
補足情報(FW/ツールのバージョンなど)
Microsoft Windows 10 Pro
Python 3.7.3
scikit-learn 0.22.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/09 01:22