Pythonで機械学習(kaggle入門その2)
はじめに
前回の「Titanic: Machine Learning from Disaster」に続いて、 もう一つのチュートリアル「House Prices: Advanced Regression Techniques」をやっていきます。
【概要】
アイオワ州エイムスの住宅について、住宅価格を予想するもの。 訓練用データの79項目の説明変数(敷地の広さ、キッチン・寝室数等)にて学習し、 テストデータの1459件に対して、住宅価格を予想する。
【環境】
環境は前回と同じ以下で実施。
開発言語
- Python3.7
ライブラリ
- jupyter
- pandas
- matplotlib
- seaborn
- scikit-learn
- numpy
ツール
- jupyter notebook
【課題データの取得】
House Prices: Advanced Regression Techniques | Kaggle
上記ページより以下のファイルをダウンロードする。
【Pythonで機械学習・予測】
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.preprocessing import LabelEncoder
入力データの読み込み
train = pd.read_csv('../input/train.csv') # 訓練用データの読み込み test = pd.read_csv('../input/test.csv') # テストデータ読み込み
訓練用データの項目、型、欠損値確認
train.info() # 訓練データの項目等を確認
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1460 entries, 0 to 1459
Data columns (total 81 columns):
Id 1460 non-null int64
MSSubClass 1460 non-null int64
MSZoning 1460 non-null object
LotFrontage 1201 non-null float64
LotArea 1460 non-null int64
Street 1460 non-null object
Alley 91 non-null object
LotShape 1460 non-null object
LandContour 1460 non-null object
Utilities 1460 non-null object
LotConfig 1460 non-null object
LandSlope 1460 non-null object
Neighborhood 1460 non-null object
Condition1 1460 non-null object
Condition2 1460 non-null object
BldgType 1460 non-null object
HouseStyle 1460 non-null object
OverallQual 1460 non-null int64
OverallCond 1460 non-null int64
YearBuilt 1460 non-null int64
YearRemodAdd 1460 non-null int64
RoofStyle 1460 non-null object
RoofMatl 1460 non-null object
Exterior1st 1460 non-null object
Exterior2nd 1460 non-null object
MasVnrType 1452 non-null object
MasVnrArea 1452 non-null float64
ExterQual 1460 non-null object
ExterCond 1460 non-null object
Foundation 1460 non-null object
BsmtQual 1423 non-null object
BsmtCond 1423 non-null object
BsmtExposure 1422 non-null object
BsmtFinType1 1423 non-null object
BsmtFinSF1 1460 non-null int64
BsmtFinType2 1422 non-null object
BsmtFinSF2 1460 non-null int64
BsmtUnfSF 1460 non-null int64
TotalBsmtSF 1460 non-null int64
Heating 1460 non-null object
HeatingQC 1460 non-null object
CentralAir 1460 non-null object
Electrical 1459 non-null object
1stFlrSF 1460 non-null int64
2ndFlrSF 1460 non-null int64
LowQualFinSF 1460 non-null int64
GrLivArea 1460 non-null int64
BsmtFullBath 1460 non-null int64
BsmtHalfBath 1460 non-null int64
FullBath 1460 non-null int64
HalfBath 1460 non-null int64
BedroomAbvGr 1460 non-null int64
KitchenAbvGr 1460 non-null int64
KitchenQual 1460 non-null object
TotRmsAbvGrd 1460 non-null int64
Functional 1460 non-null object
Fireplaces 1460 non-null int64
FireplaceQu 770 non-null object
GarageType 1379 non-null object
GarageYrBlt 1379 non-null float64
GarageFinish 1379 non-null object
GarageCars 1460 non-null int64
GarageArea 1460 non-null int64
GarageQual 1379 non-null object
GarageCond 1379 non-null object
PavedDrive 1460 non-null object
WoodDeckSF 1460 non-null int64
OpenPorchSF 1460 non-null int64
EnclosedPorch 1460 non-null int64
3SsnPorch 1460 non-null int64
ScreenPorch 1460 non-null int64
PoolArea 1460 non-null int64
PoolQC 7 non-null object
Fence 281 non-null object
MiscFeature 54 non-null object
MiscVal 1460 non-null int64
MoSold 1460 non-null int64
YrSold 1460 non-null int64
SaleType 1460 non-null object
SaleCondition 1460 non-null object
SalePrice 1460 non-null int64
dtypes: float64(3), int64(35), object(43)
memory usage: 924.0+ KB
3.欠損値の補完
今回はObject型は’NA’、数値型で0で補完。
# 欠損値補完 for column in train.columns: if train[column].dtypes == 'object': train[column] = train[column].fillna('NA') if train[column].dtypes in ('int32','int64','float64'): train[column] = train[column].fillna(0)
4.特徴量の分布
まずは、目的変数SalePriceの分布をヒストグラムで確認。
# SalePriceのヒストグラム train["SalePrice"].hist(bins=20)
10,000$~20,000$のデータの割合が多く また、50,000$以上の豪邸も存在しているようだ。
相関係数を算出し、住宅価格と相関がありそうなものを確認。 相関係数を算出対象とするには数値に変換する必要がある。
# カテゴリデータを数値に変換 for column in train.columns: if train[column].dtypes == 'object': label_encoder = LabelEncoder() label_encoder.fit(train[column]) train[column] = label_encoder.transform(train[column])
# 相関係数の算出
train.corr()
結果からSalePriceと相関が高いのは以下の変数 ・OverallQual: Overall material and finish quality ・GrLivArea: Above grade (ground) living area square feet ・GarageCars: Size of garage in car capacity ・GarageArea: Size of garage in square feet ・TotalBsmtSF: Total square feet of basement area
相関が高い変数を散布図で見てみる。
col = ['OverallQual','SalePrice'] sns.pairplot(train[col])
col = ['GrLivArea','SalePrice'] sns.pairplot(train[col])
col = ['GarageCars','SalePrice'] sns.pairplot(train[col])
col = ['GarageArea','SalePrice'] sns.pairplot(train[col])
col = ['TotalBsmtSF','SalePrice'] sns.pairplot(train[col])
散布図を見るとGrLivArea、TotalBsmtSFは外れ値があるようなのでモデル作成はこのデータは削除して行う。 予測モデルの構築はまた次回。