はじめに
はじめまして,yukineと申します.
機械学習のモデリングを勉強するため,1つ1つ実装していこうと思います.
間違い等ありましたら指摘していただけると幸いです.
更新は不定期です.
数式の理解
今回は単回帰を扱います.
回帰直線は,回帰係数$a$と切片$b$を用いて,
y = ax + b
と表されます.
実際のデータが$(x_1,y_1),(x_2,y_2), ... ,(x_n,y_n)$で与えられているとき,
L(残差平方和) = \sum_{i=1}^{n}(y_i - (ax_i + b))^2
$L$を最小化するように$a,b$を求めます.
まず,$b$に関しての偏微分
\displaylines{
\frac{\partial L}{\partial b}
= -2 \sum_{i=1}^n (y_i - ax_i - b) = 0 \\
\sum_{i=1}^n y_i - a\sum_{i=1}^n x_i - nb = 0 \\
b = \bar{y} - a \bar{x}
}
次に,$a$に関しての偏微分
\displaylines{
\frac{\partial L}{\partial a}
= -2 \sum_{i=1}^n x_i(y_i - ax_i - b) = 0 \\
\sum_{i=1}^n x_i y_i - a\sum_{i=1}^n x_i^2 - b \sum_{i=1}^n x_i = 0
}
ここに $b = \bar{y} - a\bar{x}$ を代入すると,
\displaylines{
a = \frac{\sum_{i=1}^n (x_i - \bar{x})(y_i - \bar{y})}{\sum_{i=1}^n (x_i - \bar{x})^2} = \frac{S_{xy}}{Sx} = r_{xy}\frac{S_x}{S_y}
}
コーディング
まずNumpyで実装してみます.
import numpy as np
x_mean = np.mean(x)
y_mean + np.mean(y)
# 回帰係数 a
a = np.sum((x - x_mean) * (y - y_mean)) / np.sum((x - x_mean)**2)
# 切片 b
b = y_mean - a * x_mean
Scikit-learnのLinearRegressionで同じことができます.
from sklearn.linear_model import LinearRegression
model = LinearRegression()
# 学習
model.fit(X, y)
# 予測
_y = model.predict(_X)
実践:kaggleの住宅価格予測
実際にkaggleの「House Prices - Advanced Regression Techniques」で試してみます。
データの確認
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
train_df = pd.read_csv("/content/drive/MyDrive/機械学習モデリング記録/DataSet/house-prices-advanced-regression-techniques/train.csv")
# 1階面積との相関
train_df.plot.scatter(x='1stFlrSF', y='SalePrice')
1階面積との相関が強そうなので利用してみます.
学習
from sklearn.linear_model import LinearRegression
model = LinearRegression()
X = train_df[['1stFlrSF']]
y = train_df['SalePrice']
# 学習
model.fit(X, y)
次にテストデータで予測してみます。
test_df = pd.read_csv("/content/drive/MyDrive/機械学習モデリング記録/DataSet/house-prices-advanced-regression-techniques/test.csv")
X_test = test_df[['1stFlrSF']]
y_pred = model.predict(X_test)
submission = pd.DataFrame({"Id": test_df["Id"], "SalePrice": y_pred})
submission.to_csv("submission.csv", index=False)
結果
こうして出力したcsvファイルを提出してみます。
RMSLEで0.33という結果になりました。単回帰なのでこんなものなのではないでしょうか。
次回↓
https://qiita.com/yukine_kamihata/items/6fb2b249507860ce94b7

