前回の記事Python scikit-learnで学習してみるから続きscikit-learnで学習をやってみます! 「学習データとテストデータの割合」と「学習の繰り返し回数」を変えて 予測値がどのように変化するのか見てみます
回帰分析に使うデータです 練習時間とスコアのデータです(ダーツをイメージしました) データは40件作成しました
学習データとテストデータの割合を変更
学習の繰り返し回数は1000回に固定します
学習データ:50% テストデータ:50% 正解と予測値の平均の差:122.03615159659951
学習データ:80% テストデータ:20% 正解と予測値の平均の差:96.92544867699897
学習データ:90% テストデータ:10% 正解と予測値の平均の差:67.66762450162437
学習の繰り返し回数を変更
学習データとテストデータの割合は「8:2」に固定します
学習の繰り返し回数:200回 正解と予測値の平均の差:96.96033203239628
学習の繰り返し回数:1000回 正解と予測値の平均の差:96.92544867699897 ※画像は上の「学習データ:80% テストデータ:20%」と同じです
学習の繰り返し回数:10000回 正解と予測値の平均の差:96.92617541353572
分かったこと
学習データの割合を増やしたほうが予測値が正解に近づいた 学習の回数は増やしても予測値と正解の差はあまり変わらなかった
import numpy as np import pandas as pd from sklearn import preprocessing, linear_model from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt %matplotlib inline data = pd.read_csv('./score.csv', header=0) pd.DataFrame(data) # 説明変数 x = data[['train_hour']] # 目的変数 y = data['score'] #データの整形 sc=preprocessing.StandardScaler() sc.fit(x) x_std = sc.transform(x) #学習データとテストデータに分割する #test_sizeがテストデータの割合 X_train, X_test, Y_train, Y_test = train_test_split(x_std, y, test_size=0.2, random_state=0) #線形回帰モデルの生成および学習 #max_iterの値が学習の繰り返し回数 clf = linear_model.SGDRegressor(max_iter=1000) clf.fit(X_train, Y_train.values.ravel()) print("回帰式の係数") print('y切片:', clf.intercept_) print('各項目の係数',clf.coef_) # グラフを表示 plt.scatter(X_train, Y_train) plt.plot(X_train, clf.predict(X_train), color='red') plt.xlabel('train_hour') plt.ylabel('score') plt.show Y_pred = clf.predict(X_test) #与えられたデータに対する予測 compare = pd.DataFrame(np.array([Y_test, Y_pred]).T) compare.columns = ['正解','予測値'] compare # 正解と予測値の差の平均 err = abs(compare.iloc[:, 0] - compare.iloc[:, 1]) print('正解と予測値の平均の差:{}'.format(err.mean()))