はじめに
前回、線形回帰にて実装したが今回は非線形を用いての実装してみた。
引き続きこちらの記事を参考にデータ前処理を実装した。
「データ前処理」- Kaggle人気チュートリアル
モデルを作成
① 線形回帰(LinearRegression)
② Ridge回帰(Ridge)
③ サポートベクターマシン回帰(SVR)
④ ランダムフォレスト回帰(RandomForestRegressor)
こちらの4つについてモデルを作成した。
# 説明変数と目的変数
x = df_train[['OverallQual', 'YearBuilt', 'TotalBsmtSF', 'GrLivArea']]
y = df_train['SalePrice']
# モジュールをインポートする
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 訓練データとテストデータとに分ける
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)
平均二乗誤差を算出する関数を作成する
def calc_model(model):
# モデルを学習させる
model.fit(X_train, y_train)
# X_testに対する予測値
pred_y = model.predict(X_test)
# 平均二乗誤差を出す
score = mean_squared_error(y_test, pred_y)
return score
####線形回帰
# 線形回帰のとき
from sklearn.linear_model import LinearRegression
# モデルを構築
lr = LinearRegression()
# 平均二乗誤差を算出
lr_score = calc_model(lr)
lr_score
# >>>出力
0.02824050462867693
####Ridge回帰
# Ridge回帰のとき
from sklearn.linear_model import Ridge
# モデルを構築
ridge = Ridge()
# 平均二乗誤差を算出
ridge_score = calc_model(ridge)
ridge_score
# >>>出力
0.028202963714955512
####サポートベクターマシン回帰
# サポートベクターマシン回帰のとき
from sklearn.svm import SVR
# モデルを構築
svr = SVR()
# 平均二乗誤差を算出
svr_score = calc_model(svr)
svr_score
# >>>出力
0.08767857928794534
####ランダムフォレスト回帰
# ランダムフォレスト回帰のとき
from sklearn.ensemble import RandomForestRegressor
forest = RandomForestRegressor()
# 平均二乗誤差を算出
forest_score = calc_model(forest)
forest_score
# >>>出力
0.03268455739481754
結果として非線形回帰の平均二乗誤差は大きく出た。
テストデータの前処理
欠損値の有無
# テストデータの前処理
# Idの値を抜き出す
df_test_index = df_test['Id']
# 欠損値の確認
df_test = df_test[['OverallQual', 'YearBuilt', 'TotalBsmtSF', 'GrLivArea']]
df_test.isnull().sum()
# >>>出力
OverallQual 0
YearBuilt 0
TotalBsmtSF 1
GrLivArea 0
dtype: int64
TotalBsmtSFの欠損値を平均値で補完する。
# 欠損値を平均値で補完する
df_test['TotalBsmtSF'] = df_test['TotalBsmtSF'].fillna(df_test['TotalBsmtSF'].mean())
# 欠損値を確認する
df_test.isnull().sum()
# >>>出力
OverallQual 0
YearBuilt 0
TotalBsmtSF 0
GrLivArea 0
dtype: int64
欠損値はなくなった。
CSVファイルへ出力
# モデルを当てはめる
pred_y = ridge.predict(df_test)
# データフレームの作成
submission = pd.DataFrame({'Id': df_test_index,
'SalePrice': np.exp(pred_y)})
# CSVファイルに出力
submission.to_csv('submission.csv', index=False)
結果は、0.17184と結果は伸びず。