前提・実現したいこと
いろいろなウェブサイトを参考に、サポートベクトル回帰のスクリプトを作成しました。
GridSearchCVで分割数を指定して、各分割ごとにR2値等のスコアを出したいです。
・分割数を変更する方法を知りたいです。
・以下のスクリプトで出力される分割ごとのスコアがR2値になっているのかどうかを知りたいです。
発生している問題・エラーメッセージ
エラーメッセージが出るわけではありませんが、
GridSearchCV の変数の cv = KFold(n_splits=5, shuffle=True) の n_splits の数値を何に変えても、cross_val_score が必ず5個出力されるので、5分割以外にできていない様子です。
該当のソースコード
python
1import numpy as np 2import matplotlib.pyplot as plt 3import pandas as pd 4import matplotlib.patches as mpatches 5 6from sklearn.datasets import load_boston 7from sklearn.model_selection import train_test_split 8from sklearn.preprocessing import StandardScaler 9from sklearn.metrics import r2_score 10from sklearn import svm 11from sklearn.svm import SVR 12from sklearn.model_selection import GridSearchCV, cross_val_score, KFold 13 14# データのロード 15boston = load_boston() 16X = boston['data'] 17y = boston['target'] 18 19# データの分割 20X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) 21 22# 訓練データとテストデータとを基準に標準化(平均、標準偏差で標準化) 23scaler = StandardScaler() 24X_train_std = scaler.fit_transform(X_train) 25X_test_std = scaler.transform(X_test) 26 27# モデル設定 28svr = svm.SVR() 29svr.fit(X_train_std, y_train) 30 31# ハイパラメータの候補値をリストにして GridSearchCV に渡す 32params_cnt = 5 33params = {"C":np.logspace(0,3,params_cnt), "epsilon":np.logspace(-2,1,params_cnt)} 34gridsearch = GridSearchCV(SVR(), params, cv = KFold(n_splits=5, shuffle=True), scoring="r2") 35gridsearch.fit(X_train_std, y_train) 36 37# 結果の表示 38print("Best parameters:", gridsearch.best_params_) 39print('Cross-Validation scores:', cross_val_score(svr, X_train_std, y_train)) 40 41svr = SVR(C=gridsearch.best_params_["C"], epsilon=gridsearch.best_params_["epsilon"]) 42svr.fit(X_train_std, y_train) 43y_train_pred = svr.predict(X_train_std) 44y_test_pred = svr.predict(X_test_std) 45print("Train set R2:", r2_score(y_train_pred, y_train)) 46print("Test set R2:", r2_score(y_test_pred, y_test))
試したこと
GridSearchCV の変数の cv = KFold(n_splits=5, shuffle=True) の n_splits の数値を5以外の3や10にしても、print('Cross-Validation scores:', cross_val_score(svr, X_train_std, y_train))から出力されるのは5個のスコアです。
そのため、5分割以外の分割数にできていない様子です。
補足情報(FW/ツールのバージョンなど)
pythonはgoogle colabで実施しています。
データは「ボストンの住宅価格」を使用しています。
データ分割は、train、validation、test、の3分割です。
trainデータでサポートベクトル回帰を学習し、validationデータでハイパーパラメータのCとεを決定し、決定したCとεを使用してtrainデータとvalidationデータから再度サポートベクトル回帰を学習し、最後にtestデータで精度を検証しています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。