ある回帰問題について以下の3つの決定木のモデルをscikit-learnを用いて作成し、
モデルを作った後に以下の4つのスコアを出力しました
①訓練セットに対するスコア
②テストセットに対するスコア
③グリッドサーチで一番良かったパラメータ
④交差検証セットに対するスコア
ました。
データ数は約5万点
特徴量は26種類あるデータを使いました
以下結果です
1番良い性能を表しているのがGradientBoostingRegressorかなと思ったのですが
3つとも共通して交差検証時のスコアがかなり低いことが気になりました。
交差検証は5分割で3つのモデルは統一し、訓練セット、テストセット共に
train_test_splitメソッドでデータのシャッフルもかけています。
このスコアの低さは5回分割する中で検証セットに対して上手くいかなかったときがあるからと思うのですが、テストセットに対する評価は高く、この3つのモデルはどこまで信用性があるのか疑問に感じています。
訓練セットに対する評価が高く、テストセットに対しては低い場合は過学習している可能性があるなどは分かるのですが、DecisionTreeRegressorのように訓練セットに対しては低くテストセットに対しては高いです。
これは汎化性能が高いと考えてもよい物なのかどうかも疑問に感じます。
この値くらい出てるからOKというように一概に言えないとは思うのですが、モデルの評価基準や目安、このモデルは正しい、などはどのように決めているのでしょうか?
漠然としてしまっているかもしれませんがアドバイスや考え方を教えて頂けたら嬉しいです。
DecisionTreeRegressor
1Training Data Score: 0.85 2Test Data Score: 0.98 3Best parameters: {'max_depth': 3, 'max_features': None, 'random_state': 42} 4Best Cross Validation score: 0.37
RandomForestRegressor
1Training Data Score: 0.85 2Test Data Score: 0.69 3Best parameters: {'max_depth': 5, 'n_estimators': 500} 4Best Cross Validation score: 0.36
GradientBoostingRegressor
1Training Data Score: 0.97 2Test Data Score: 0.85 3Best parameters: {'learning_rate': 0.1, 'max_depth': 5, 'n_estimators': 300, 'random_state': 42} 4Best Cross Validation score: 0.66
以下コード
python
1import pandas as pd 2from sklearn.tree import DecisionTreeRegressor 3from sklearn.ensemble import RandomForestRegressor 4from sklearn.ensemble import GradientBoostingRegressor 5from sklearn.model_selection import train_test_split 6from sklearn.tree import export_graphviz 7import graphviz 8import matplotlib.pyplot as plt 9import numpy as np 10from sklearn.model_selection import GridSearchCV 11import time 12from sklearn.metrics import roc_curve, auc, accuracy_score 13import mglearn 14from sklearn.model_selection import cross_val_score 15 16 17#ファイル読み込み 18df = pd.read_csv(r'C:\Users\Desktop\test3.csv', engine='python') 19df.describe() 20 21#必要ないカラム除去 22drop_columns = [数が多いので割愛します] 23 24#データ作成 25X = df.drop(drop_columns, axis=1) 26Y = df['結果'] 27 28print(X.shape) 29print(Y.shape) 30 31X_train1, X_test1, y_train1, y_test1 = train_test_split(X, Y, random_state=42) 32 33 34#---------------DecisionTreeRegressor 35 36dr = DecisionTreeRegressor() 37dr_param_grid = {'max_depth':[3, 4, 5, 6], 38 'max_features':[None, 0.1, 1, 2, 3], 39 'random_state':[42]} 40 41 42dr_cv = GridSearchCV(dr, dr_param_grid, cv=5) 43dr_cv.fit(X_train1, y_train1) 44 45print('Training Data Score: {:.2f}'.format(dr_cv.score(X_train1, y_train1))) 46print('Test Data Score: {:.2f}'.format(dr_cv.score(X_test1, y_test1))) 47 48print('Best parameters: {}'.format(dr_cv.best_params_)) 49print('Best Cross Validation score: {:.2f}'.format(dr_cv.best_score_)) 50 51 52#---------------RandomForestRegressor 53 54param_grid = {'n_estimators':[200, 300, 400, 500, 600], 55 'max_depth':[3, 4, 5], 56 } 57 58 59t = time.time() 60forest = RandomForestRegressor(random_state=42, n_jobs=-1) 61cv = GridSearchCV(forest, param_grid, cv=5) 62cv.fit(X_train1, y_train1) 63 64print('Training Data Score: {:.2f}'.format(cv.score(X_train1, y_train1))) 65print('Test Data Score: {:.2f}'.format(cv.score(X_test1, y_test1))) 66 67print('Best parameters: {}'.format(cv.best_params_)) 68print('Best Cross Validation score: {:.2f}'.format(cv.best_score_)) 69 70#---------------GradientBoostingRegressor 71 72gb = GradientBoostingRegressor() 73gb_param_grid = {'max_depth':[3, 4, 5], 74 'learning_rate':[0.01, 0.05, 0.07, 0.1], 75 'n_estimators':[100, 150, 200, 250, 300], 76 'random_state':[42] 77 } 78 79 80gb_cv = GridSearchCV(gb, gb_param_grid, cv=5, n_jobs=-1) 81gb_cv.fit(X_train1, y_train1) 82 83print('Training Data Score: {:.2f}'.format(gb_cv.score(X_train1, y_train1))) 84print('Test Data Score: {:.2f}'.format(gb_cv.score(X_test1, y_test1))) 85 86print('Best parameters: {}'.format(gb_cv.best_params_)) 87print('Best Cross Validation score: {:.2f}'.format(gb_cv.best_score_)) 88
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/21 05:59