前提・実現したいこと
scikit-learnにより重回帰分析をしようと思い、適当にサンプルソースをつないで理解している最中です。説明変数に8(種類)×267のデータ、目的変数に1(種類)×267のデータを使っています。
質問したいことは以下2点です
・acc_meanの値に比べlearning_curveで描かれたグラフ中のvalidation accuracy(紺青)の値が低い(0.9ない)のはなぜでしょうか?同データをFold数5で分割し、どちらともRandomForestをモデルとしているので、同じ値になると思うのですが...。
・learning_curveのグラフ中のtraining samplesの値は何を意味しているのでしょうか?数としては説明変数の267(データ数)×4/5(cv = 5 としたときのtrainの割合?)と思われます。グラフがデータ数ごとの学習を表しているものであれば、validの方はtraining samplesの1/5までしかプロットできないと思うのですが...。
Mean accuracy: 96.5%
ご回答や参考になるサイト・書籍等の紹介をお願いいたします。
該当のソースコード
python
1import numpy as np 2import pandas as pd 3import matplotlib.pyplot as plt 4from sklearn.preprocessing import StandardScaler 5from sklearn import ensemble 6from sklearn.metrics import mean_squared_error 7from sklearn.metrics import r2_score 8from sklearn.model_selection import learning_curve 9from sklearn.model_selection import KFold 10 11 12#CSVファイルの取り込み 13data = pd.read_csv("C:\Users\I06136\data3.csv", sep=",") 14 15X = data.loc[:,['C2','D','E','F','G2','G3','H2','L']] 16Y = data['K2'] 17 18#配列の作成 19X = np.array(X).reshape(-1, 8) 20Y = np.array(Y,dtype=np.float64).reshape(-1, 1) 21 22#標準化 23ss = StandardScaler() 24X = ss.fit_transform(X) 25 26#K-Fold法 27kf = KFold(n_splits=5, shuffle=True, random_state=42) 28#決定係数の配列 29accuracies = [] 30# 検証データをずらして 5 回繰り返される 31for train_index, test_index in kf.split(X): 32 X_k_train, X_k_test = X[train_index], X[test_index] 33 y_k_train, y_k_test = Y[train_index], Y[test_index] 34 #モデルの学習 35 model = ensemble.RandomForestRegressor() 36 model.fit(X_k_train, y_k_train) 37 print("a") 38 # 予測 39 y_pred = model.predict(X_k_test) 40 print("b") 41 #配列を一次元に 42 y_pred = y_pred.flatten() 43 # ここでモデルの評価を行う 44 r2 = r2_score(y_k_test, y_pred) 45 accuracies.append(r2) 46 print("c") 47 48# 各Foldの精度を平均する 49acc_mean = np.mean(accuracies) 50#K-Fold法による決定係数の可視化 51train_sizes, train_scores, valid_scores = learning_curve(estimator=model, 52 X=X, y=Y, 53 train_sizes=np.linspace(0.01, 1.0, 100), 54 cv=5, n_jobs=1) 55print(train_sizes) 56# calculate the coorinates for plots 57train_mean = np.mean(train_scores, axis=1) 58train_std = np.std(train_scores, axis=1) 59valid_mean = np.mean(valid_scores, axis=1) 60valid_std = np.std(valid_scores, axis=1) 61 62plt.style.use('seaborn-whitegrid') 63 64# draw the training scores 65plt.plot(train_sizes, train_mean, color='orange', marker='o', markersize=5, label='training accuracy') 66plt.fill_between(train_sizes, train_mean + train_std, train_mean - train_std, alpha=0.1, color='orange') 67 68# draw the validation scores 69plt.plot(train_sizes, valid_mean, color='darkblue', marker='o', markersize=5,label='validation accuracy') 70plt.fill_between(train_sizes, valid_mean + valid_std,valid_mean - valid_std, alpha=0.1, color='darkblue') 71 72plt.xlabel('#training samples') 73plt.ylabel('accuracy') 74plt.legend(loc='lower right') 75plt.ylim([0.5, 1.01]) 76plt.savefig('learning_curve2.png') 77plt.show() 78print(f"Mean accuracy: {acc_mean:.1%}")
補足情報(FW/ツールのバージョンなど)
環境:python3.7
補足:参考にしたサイトでは決定係数の導出にaccuracy_scoreを使用していたが、エラーが出たためr2_scoreを使用しました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/26 00:37
2020/05/26 08:05
2020/05/27 23:44