buto > /dev/null

だいたい急に挑戦してゴールにたどり着かずに飽きる日々です

Python scikit-learnで学習②

前回の記事Python scikit-learnで学習してみるから続きscikit-learnで学習をやってみます! 「学習データとテストデータの割合」と「学習の繰り返し回数」を変えて 予測値がどのように変化するのか見てみます

回帰分析に使うデータです 練習時間とスコアのデータです(ダーツをイメージしました) データは40件作成しました

f:id:butorisa:20201020140651j:plain

学習データとテストデータの割合を変更

学習の繰り返し回数は1000回に固定します

学習データ:50% テストデータ:50% 正解と予測値の平均の差:122.03615159659951

f:id:butorisa:20201020140515j:plain

学習データ:80% テストデータ:20% 正解と予測値の平均の差:96.92544867699897

f:id:butorisa:20201020140950j:plain

学習データ:90% テストデータ:10% 正解と予測値の平均の差:67.66762450162437

f:id:butorisa:20201020141020j:plain

学習の繰り返し回数を変更

学習データとテストデータの割合は「8:2」に固定します

学習の繰り返し回数:200回 正解と予測値の平均の差:96.96033203239628

f:id:butorisa:20201020141041j:plain

学習の繰り返し回数:1000回 正解と予測値の平均の差:96.92544867699897 ※画像は上の「学習データ:80% テストデータ:20%」と同じです

f:id:butorisa:20201020140950j:plain

学習の繰り返し回数:10000回 正解と予測値の平均の差:96.92617541353572

f:id:butorisa:20201020141104j:plain

分かったこと

学習データの割合を増やしたほうが予測値が正解に近づいた 学習の回数は増やしても予測値と正解の差はあまり変わらなかった

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()))