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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python

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

Q&A

1回答

1841閲覧

GridSearchCVで分割数を指定したい。また、各分割ごとにR2値等のスコアを出したい。

tera3

総合スコア0

Python

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

0グッド

0クリップ

投稿2020/08/12 14:08

前提・実現したいこと

いろいろなウェブサイトを参考に、サポートベクトル回帰のスクリプトを作成しました。
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データで精度を検証しています。

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

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

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

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

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

guest

回答1

0

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個のスコアです。

cross_val_scoreはGridSearchCVの結果を表示するものではなく、GridSearchCVとは別に計算した結果が表示されるので、たとえば下記のようにしてcross_val_scoreにもcvで数を指定する必要があります

python

1# 結果の表示 2print("Best parameters:", gridsearch.best_params_) 3print('Cross-Validation scores:', cross_val_score(gridsearch.best_estimator_, X_train_std, y_train, cv=3)) 4print("Best score:", gridsearch.best_score_) 5 6print("Test set score:", gridsearch.score(X_test_std, y_test)) 7y_train_pred = gridsearch.predict(X_train_std) 8y_test_pred = gridsearch.predict(X_test_std) 9print("Train set R2:", r2_score(y_train_pred, y_train)) 10print("Test set R2:", r2_score(y_test_pred, y_test))

省略した場合は5-fold cross validationです
sklearn.model_selection.cross_val_score

投稿2020/11/23 10:11

jbpb0

総合スコア7653

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問