線形単回帰

線形単回帰とは、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()

f:id:minmin_std:20191228205907p:plain

赤の点が実際の値である。

青い線が勤務年数を与えた時に、線形単回帰モデルを用いて予測した給料の値である。

 

 

 

次にテストセットは以下のようになる。

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

f:id:minmin_std:20191228210220p:plain

赤い点が実際の値で、青い線は勤務年数を与えた時に、線形単回帰モデルで予測した給料の値である。

 

非常に高い精度で予測できていることがわかる。