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

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

新規登録して質問してみよう
ただいま回答率
85.48%
scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

機械学習

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

Python

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

Q&A

解決済

1回答

3155閲覧

scikit-learnによる重回帰分析の公差検証と学習曲線の質問

piyotechi

総合スコア15

scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

機械学習

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

Python

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

0グッド

1クリップ

投稿2020/05/25 08:20

前提・実現したいこと

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までしかプロットできないと思うのですが...。
learning_curveグラフ
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を使用しました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

acc_mean = np.mean(accuracies)

上記までのコードとそれ以降のコードはやろうとしていることが別物です。前半部分は交差検証をしていますが、可視化していません。後半部分は学習曲線の可視化をしていますが、前半部分の交差検証の結果を使っていません。

ちなみに後半部分は、「学習に使用するデータ件数を変えることでモデルの性能にどのような影響があるか」を可視化したものということになります。一番の核になる部分は以下です。

train_sizes, train_scores, valid_scores = learning_curve(estimator=model, X=X, y=Y, train_sizes=np.linspace(0.01, 1.0, 100), cv=5, n_jobs=1)

これは、学習データの件数をnp.linspace(0.01, 1.0, 100)を使って100パターン用意して、学習時の性能と検証データの性能を得る、という意味合いになります。

よって、ひとつめの質問については、acc_meanとvalidation accuracyは別物なので、関連付けることに意味はないという答えになるかと思います。また、ふたつめの質問については、training samplesは文字通りに学習に使用したデータ件数が答えになります。

投稿2020/05/25 19:53

R.Shigemori

総合スコア3376

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

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

piyotechi

2020/05/26 00:37

回答していただきありがとうございます。training samplesについては訓練データ数に対する予測性能の評価をグラフにしているということで理解できました。もう1つの方がまだ腑に落ちてなく、acc_meanは交差検証とRondomForestで評価した際のテストデータ(検証データ)の決定係数と思うのですが、validation accuracyは導出方法が異なり同じ決定係数ではないということなのでしょうか?また、モデルの性能としてはacc_meanの数値を信頼すればよいのでしょうか?ご回答いただければと思います。
R.Shigemori

2020/05/26 08:05

私自身はlearning_curveは使ったことはないこともあり、具体的な計算式は公式ドキュメントで確認されたほうがいいかと思います。
piyotechi

2020/05/27 23:44

返信ありがとうございます。参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問