回帰でも交差検証を使わないとですね。
そうだね、リッジ回帰には交差検証もやってくれるRidgeCVっていうものもあるらしいね。
前回までの回帰問題に対しては、train_test_splitでデータを分割するのみでした。分類の時も交差検証という方法で訓練データとテストデータに分けてモデルを訓練していたのを忘れていたいので、リッジ回帰の流れで交差検証を行い、パラメータチューニングをしてテストデータで精度を確認という一連の流れをやってみました。
交差検証や訓練するときのデータの使い方についてはこちらの記事もご参考ください。
回帰を行うまでの流れ
早速プログラムを書いていきます。
importでは、cross_val_scoreを忘れないようにします。その後、ボストンの住宅価格データを読み込みます。読み込んだボストンの住宅価格データは、多重共線性を避けるため、お互い相関が強そうな説明変数を省きました。
多重共線性については、こちらの記事もご参考ください。
#リッジ回帰
from sklearn.datasets import load_boston
from sklearn import linear_model
from sklearn.model_selection import train_test_split
#交差検証のimport
from sklearn.model_selection import cross_val_score
import numpy as np
panda_box = load_boston()
X = panda_box.data
y = panda_box.target
#0:CRIM 1:ZN 2:INDUS 3:CHAS 4:NOX 5:RM 6:AGE 7:DIS 8:RAD 9:TAX 10:PTRATIO 11:B 12:LSTAT
X = X[:,[0, 1, 2, 3, 5, 8, 10, 11, 12]]
#訓練データとテストデータに分割(テストデータ25%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25)
今回は、25%をテストデータとして残しておき、残りの75%のデータにて交差検証をしてリッジ回帰のパラメータ「alpha」を調整していきます。
リッジ回帰の「alpha」が0.1のときです。ちなみに交差検証のデータ分割は5分割(cv=5)としています。
#リッジ回帰 alpha=0.1
reg = linear_model.Ridge(alpha=0.1)
#5分割で交差検証を行う。
score = cross_val_score(reg, X_train, y_train, cv=5)
print("交差検証の結果")
print(score)
print("交差検証の平均")
print("{:.4f}".format(np.mean(score)))
#訓練
reg.fit(X_train, y_train)
print("テストデータの評価")
print("{:.4f}".format(reg.score(X_test, y_test)))
交差検証の結果
[0.69100166 0.47415753 0.65200425 0.76652686 0.7649051 ]
交差検証の平均
0.6697
テストデータの評価
0.6587
5回の訓練と評価を一度に行うことができるので、交差検証した方がよかったね・・・
train_test_splitだけで何回か実行させると、決定係数が「0.5~0.7」と数値のばらつきがみられ、それを何回も実行して平均をとってとするのが面倒なので、交差検証「cross_val_score」の「cvパラメータ」を5として行うことで、一度に5回の平均的な訓練モデルの結果が得られるようになりました。
同じように、パラメータalphaを1と10でもやってみます。
#リッジ回帰 alpha=1
reg = linear_model.Ridge(alpha=1)
#5分割で交差検証を行う。
score = cross_val_score(reg, X_train, y_train, cv=5)
print("交差検証の結果")
print(score)
print("交差検証の平均")
print("{:.4f}".format(np.mean(score)))
#訓練
reg.fit(X_train, y_train)
print("テストデータの評価")
print("{:.4f}".format(reg.score(X_test, y_test)))
交差検証の結果
[0.69090617 0.47664987 0.6547677 0.765795 0.76279148]
交差検証の平均
0.6702
テストデータの評価
0.6599
全体的に精度が訓練、テスト共に上がっている感じがあります。
#リッジ回帰 alpha=10
reg = linear_model.Ridge(alpha=10)
#5分割で交差検証を行う。
score = cross_val_score(reg, X_train, y_train, cv=5)
print("交差検証の結果")
print(score)
print("交差検証の平均")
print("{:.4f}".format(np.mean(score)))
#訓練
reg.fit(X_train, y_train)
print("テストデータの評価")
print("{:.4f}".format(reg.score(X_test, y_test)))
交差検証の結果
[0.6910053 0.49195182 0.6720402 0.75730594 0.74557925]
交差検証の平均
0.6716
テストデータの評価
0.6668
リッジ回帰のαを強くすることで、テストデータ(未知データ)への精度が向上しました。
リッジ回帰のパラメータについては、こちらの記事もご参考ください。
RidgeCVが便利
scikit-learnには、交差検証を合体させて、リッジ回帰ができるものがあります。
その名も、RidgeCV!
そのままですね。
先ほど行った長々としたプログラムを下のように短く書くことができます。train_test_splitで75%のデータに交差検証をするとことからです。
from sklearn.linear_model import RidgeCV
r_cv = RidgeCV(alphas=[0.1, 1, 10],cv = 5).fit(X_train, y_train)
print("{:.4f}".format(r_cv.score(X_test, y_test)))
RidgeCVのパラメータのalphaには、交差検証で試したいRidge回帰の「alpha」パラメータを配列で指定しておきます。今回は、先に「0.1と1と10」で行ったものと同じに設定したいと思います。
RidgeCVのパラメータ、「alpha=[0.1, 1, 10]」のように指定することができます。
0.6668
このように、テストデータで精度をみてみると、alpha=10のときの精度が返ってきます。今回RidgeCVで訓練された結果、選択されたalphaは10であることがわかります。
どうやら、訓練データでの精度がもっとも良いチューニング行ってモデルを構築してくれるようです。
これからはRidgeCVだね!
短く書くことができるのが良いかは、場合によるかもね