質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2522閲覧

リッジ回帰のテストデータに対するスコア異常

unk01

総合スコア5

scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/06 03:15

前提・実現したいこと

お世話になります。

首題の件、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.6257974860.339329850.308598303-1.122433002-3.264840788-0.033962561-0.282805475-0.01585202-1.647171362-1.592571672-1.7483525470.288508967-1.6735875441.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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Ridge.scoreはデフォルトでは決定係数を返してくれる訳ですが、これはとても悪い予測では負になりえます。

sklearn.linear_model.Ridge — scikit-learn 0.22.2 documentation

決定係数 - Wikipedia

そもそも説明変数と目的変数の間に回帰で捉えられるような相関・因果関係があるのかというところから検討し直す必要があるでしょう。

投稿2020/05/06 12:44

編集2020/05/06 12:45
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unk01

2020/05/09 01:22

ご回答ありがとうございます。 決定係数に対する私の理解不足でした。 0~1の値をとるものだと認識しておりましたが、予測が悪すぎると負の値をとるのですね。 説明変数と目的変数の関係について見直してみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問