Kaggle~住宅価格予測~

# はじめに
タイタニック号の次のステップでkaggleの入門編である住宅価格予測に挑戦してみた。
タイタニックはかなりの記事があったが住宅価格は少なかったので投稿しようと思う。
初心者なのでスコアは低い結果となったのでアドバイス等いただけると幸いです。

こちらの記事を参考にデータ前処理を実施した。
[「データ前処理」- Kaggle人気チュートリアル](https://qiita.com/hkthirano/items/12e046b3e02961d8460d)

# モデルの構築
今回は、回帰分析なので線形回帰、Lasso回帰、Ridge回帰にてトライしてみる。

```python

# トレーニングデータを用意する
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)
```

__モデルの構築__

```python
# 線形回帰
# モジュールをインポートする
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__


## テストデータの前処理
データの読み込み

```python
#テストデータを読み込む
df_test = pd.read_csv('/kaggle/input/house-prices-advanced-regression-techniques/test.csv')
```
出力

```python

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
```


__欠損値の有無を確認__

```python
# 欠損値の有無を調べる
df_test[['OverallQual', 'YearBuilt', 'TotalBsmtSF', 'GrLivArea']].isnull().sum()
```

出力

```python
OverallQual    0
YearBuilt      0
TotalBsmtSF    1
GrLivArea      0
dtype: int64
```

TotalBsmtSF(地下面積)に欠損値あり。
今回は平均値にて欠損を補完する。

```python
# 欠損値を補完する
df_test['TotalBsmtSF'] = df_test['TotalBsmtSF'].fillna(df_test['TotalBsmtSF'].mean())
```

__残りの前処理を実施__

```python
# 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']]
```

## モデルを当てはめる

__線形回帰__

```python
# 線形回帰
# 予測値
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)
```

__ラッソ回帰__

```python
# ラッソ回帰
# 予測値
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)
```

__リッジ回帰__

```python
# リッジ回帰
# 予測値
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(低い方が良い)

さぁどうやってスコアを向上させようか。

次回は別のチュートリアルに挑戦します。