Smile Engineering Blog

ジェイエスピーからTipsや技術特集、プロジェクト物語を発信します

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

上記ページより以下のファイルをダウンロードする。

  • train.csv (訓練用データ)
  • test.csv(テストデータ)

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)

f:id:jspnet:20190724102530p:plain

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()

f:id:jspnet:20190724102507p:plain

結果から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]) 

f:id:jspnet:20190724102540p:plain

col = ['GrLivArea','SalePrice']
sns.pairplot(train[col]) 

f:id:jspnet:20190724102551p:plain

col = ['GarageCars','SalePrice']
sns.pairplot(train[col]) 

f:id:jspnet:20190724102601p:plain

col = ['GarageArea','SalePrice']
sns.pairplot(train[col]) 

f:id:jspnet:20190724102612p:plain

col = ['TotalBsmtSF','SalePrice']
sns.pairplot(train[col]) 

f:id:jspnet:20190724103102p:plain

散布図を見るとGrLivArea、TotalBsmtSFは外れ値があるようなのでモデル作成はこのデータは削除して行う。 予測モデルの構築はまた次回。