線形単回帰
線形単回帰とは、y = b0 + b1*xという式で表され、xからyを予測できるようなそれっぽい直線(つまり切片b0と傾きb1)を求めるものである。
ここで、yは従属変数(dependent variable)であり、xは独立変数(independent variable)である。
そしてこのようなデータを使うことを考える。
YearsExperience |
Salary |
1.1 |
39343.00 |
1.3 |
46205.00 |
1.5 |
37731.00 |
2.0 |
43525.00 |
2.2 |
39891.00 |
2.9 |
56642.00 |
3.0 |
60150.00 |
3.2 |
54445.00 |
3.2 |
64445.00 |
3.7 |
57189.00 |
3.9 |
63218.00 |
4.0 |
55794.00 |
4.0 |
56957.00 |
4.1 |
57081.00 |
4.5 |
61111.00 |
4.9 |
67938.00 |
5.1 |
66029.00 |
5.3 |
83088.00 |
5.9 |
81363.00 |
6.0 |
93940.00 |
6.8 |
91738.00 |
7.1 |
98273.00 |
7.9 |
101302.00 |
8.2 |
113812.00 |
8.7 |
109431.00 |
9.0 |
105582.00 |
9.5 |
116969.00 |
9.6 |
112635.00 |
10.3 |
122391.00 |
10.5 |
121872.00 |
YearsExperienceが勤続年数であり、Salaryが給与である。
x成分が勤続年数でy成分が給与とする。
そして特徴行列Xは勤続年数、目的行列yは給与とする。
今回の特徴行列の中にある特徴量は勤続年数1つだけなのでFeature Scalingは必要ない。前回のデータの前処理で使ったような特徴量がいくつかある時で、スケールを同じにしたい時に使う。
最小二乗法を使う
それっぽい直線を求めるにはどうすれば良いか。
答えは最小二乗法を用いることにある。
それっぽい直線を最初に引き、あるxの値のところの、予測値yハットと実際の値yを比べる。
比べる時に、(y-yハット)^2の値を用いる。これが二乗誤差である。これは一辺の長さがy-yハットの正方形の面積を求めていることと同じ意味である。そして、この面積(値)が小さければ小さいほど、予測値と実際の値の差が小さいことになる。
そして、この計算をそれぞれのxの値に対して行い、得た二乗誤差を足す。
これをそれっぽい直線を何本かひき、それぞれの二乗誤差を求め、最二乗誤差が最小になる直線を選ぶ。
その直線が答えである。
線形単回帰モデルの作成
from sklearn.linear_model import LinearRegression
regressor = LinearRegression
regressor.fit(X_train,y_train)
linear_modelのfitは何をしているか??
第一引数のX_train、第二引数のy_trainから値を抽出し、上述の手法で線形単回帰の方程式y=b0+b1*xの係数b0とb1を計算している。
データの予測
作成したモデルを用いてデータを予測する。
y_pred = regressor.predict(X_test)
ここでy_predは予測した給料の値であり、y_testは実際の給料の値である。
y_test
37731
122391
57081
63218
116969
109431
112635
55794
83088
101302
y_pred
40835.1
123079
65134.6
63265.4
115603
108126
116537
64200
76349.7
100649
大体似たような値になっていることがわかる。
図にプロットしてみてみる
plt.scatter(X_train,y_train,color='red')
plt.plot(X_train,regressor.predict(X_train),color='blue')
plt.title('Salary vs Experience (Training set)')
plt.xlabel('Years of Experiece')
plt.ylabel('Salaries')
plt.show()
赤の点が実際の値である。
青い線が勤務年数を与えた時に、線形単回帰モデルを用いて予測した給料の値である。
次にテストセットは以下のようになる。
plt.scatter(X_test,y_test,color='red')
plt.plot(X_test,regressor.predict(X_test),color='blue')
plt.title('Salary vs Experience (Testing set)')
plt.xlabel('Years of Experiece')
plt.ylabel('Salaries')
plt.show()
赤い点が実際の値で、青い線は勤務年数を与えた時に、線形単回帰モデルで予測した給料の値である。
非常に高い精度で予測できていることがわかる。