0
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Kaggle~住宅価格予測~

Last updated at Posted at 2020-06-26

はじめに

タイタニック号の次のステップで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(低い方が良い)

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

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

0
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?