はじめに
タイタニック号の次のステップでkaggleの入門編である住宅価格予測に挑戦してみた。
タイタニックはかなりの記事があったが住宅価格は少なかったので投稿しようと思う。
初心者なのでスコアは低い結果となったのでアドバイス等いただけると幸いです。
こちらの記事を参考にデータ前処理を実施した。
「データ前処理」- Kaggle人気チュートリアル
モデルの構築
今回は、回帰分析なので線形回帰、Lasso回帰、Ridge回帰にてトライしてみる。
# トレーニングデータを用意する
X_train = df_train[['OverallQual', 'YearBuilt', 'TotalBsmtSF', 'GrLivArea']]
y_train = df_train['SalePrice']
# トレーニングデータテストデータで分ける
from sklearn.model_selection import train_test_split
train_X, test_X, train_y, test_y = train_test_split(
X_train, y_train, random_state=42)
モデルの構築
# 線形回帰
# モジュールをインポートする
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso
from sklearn.linear_model import Ridge
# 線形回帰
lr = LinearRegression()
lr.fit(train_X, train_y)
print("線形回帰:{}".format(lr.score(test_X, test_y)))
# ラッソ回帰
lasso = Lasso()
lasso.fit(train_X, train_y)
print("ラッソ回帰:{}".format(lasso.score(test_X, test_y)))
# リッジ回帰
ridge = Ridge()
ridge.fit(train_X, train_y)
print("リッジ回帰:{}".format(ridge.score(test_X, test_y)))
結果は以下のようになった
線形回帰:0.8320945695605152
ラッソ回帰:0.5197737962239536
リッジ回帰:0.8324316647361567
テストデータの前処理
データの読み込み
#テストデータを読み込む
df_test = pd.read_csv('/kaggle/input/house-prices-advanced-regression-techniques/test.csv')
出力
Id MSSubClass MSZoning LotFrontage LotArea Street Alley LotShape LandContour Utilities ... ScreenPorch PoolArea PoolQC Fence MiscFeature MiscVal MoSold YrSold SaleType SaleCondition
0 1461 20 RH 80.0 11622 Pave NaN Reg Lvl AllPub ... 120 0 NaN MnPrv NaN 0 6 2010 WD Normal
1 1462 20 RL 81.0 14267 Pave NaN IR1 Lvl AllPub ... 0 0 NaN NaN Gar2 12500 6 2010 WD Normal
2 1463 60 RL 74.0 13830 Pave NaN IR1 Lvl AllPub ... 0 0 NaN MnPrv NaN 0 3 2010 WD Normal
3 1464 60 RL 78.0 9978 Pave NaN IR1 Lvl AllPub ... 0 0 NaN NaN NaN 0 6 2010 WD Normal
4 1465 120 RL 43.0 5005 Pave NaN IR1 HLS AllPub ... 144 0 NaN NaN NaN 0 1 2010 WD Normal
5 rows × 80 columns
欠損値の有無を確認
# 欠損値の有無を調べる
df_test[['OverallQual', 'YearBuilt', 'TotalBsmtSF', 'GrLivArea']].isnull().sum()
出力
OverallQual 0
YearBuilt 0
TotalBsmtSF 1
GrLivArea 0
dtype: int64
TotalBsmtSF(地下面積)に欠損値あり。
今回は平均値にて欠損を補完する。
# 欠損値を補完する
df_test['TotalBsmtSF'] = df_test['TotalBsmtSF'].fillna(df_test['TotalBsmtSF'].mean())
残りの前処理を実施
# IDを抽出する
df_test_index = df_test['Id']
# 対数変換する
df_test['GrLivArea'] = np.log(df_test['GrLivArea'])
# カテゴリ変数を変換する
df_test = pd.get_dummies(df_test)
# 欠損値に値を入力する
df_test[df_test['TotalBsmtSF'].isnull()]
X_test = df_test[['OverallQual', 'YearBuilt', 'TotalBsmtSF', 'GrLivArea']]
モデルを当てはめる
線形回帰
# 線形回帰
# 予測値
pred_y = lr.predict(X_test)
# データフレームの作成
submission = pd.DataFrame({'Id': df_test_index,
'SalePrice': np.exp(pred_y)})
# CSVファイルに出力
submission.to_csv('submission_lr.csv', index=False)
ラッソ回帰
# ラッソ回帰
# 予測値
pred_y = lasso.predict(X_test)
# データフレームの作成
submission = pd.DataFrame({'Id': df_test_index,
'SalePrice': np.exp(pred_y)})
# CSVファイルに出力
submission.to_csv('submission_lasso.csv', index=False)
リッジ回帰
# リッジ回帰
# 予測値
pred_y = ridge.predict(X_test)
# データフレームの作成
submission = pd.DataFrame({'Id': df_test_index,
'SalePrice': np.exp(pred_y)})
# CSVファイルに出力
submission.to_csv('submission_ridge.csv', index=False)
リッジ回帰にて
結果は0.16450(低い方が良い)
さぁどうやってスコアを向上させようか。
次回は別のチュートリアルに挑戦します。