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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

Python

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

Q&A

解決済

1回答

4135閲覧

python 決定木の性能評価について

---stax---

総合スコア148

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

Python

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

0グッド

1クリップ

投稿2018/08/10 00:05

ある回帰問題について以下の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

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

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

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

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

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

guest

回答1

0

ベストアンサー

回帰分析でしたら、自分は決定係数を使用することが多いです。
(参考:https://pythondatascience.plavox.info/scikit-learn/%E5%9B%9E%E5%B8%B0%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E8%A9%95%E4%BE%A1)

python

1 from sklearn.metrics import r2_score

とした後に、

python

1y_pred = gb_cv.predict(y_train1) 2 3r2_score(y_test1, y_pred)

とかで評価できるんじゃないかなと思います。
よければ、試してみてください!

投稿2018/08/19 09:29

nissyl

総合スコア17

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

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

---stax---

2018/08/21 05:59

回答ありがとうございます。 返答遅くなって申し訳ありません。 お恥ずかしい話なのですが、モデルの評価にはmodel.score()メソッドでいつも評価するのですが、ここでいう「精度」とはいったい何を指しているのでしょうか。 線形モデルでは.score()で帰ってくる値は決定係数を出しているようなのですが、決定木では公式を見ると平均精度となっており何に対しての平均の精度なのか分からないまま使っています・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問