kaggle:住宅価格の予測(Feature Engineering 3/3 )
前回までの勉強で、以下の特徴量を予測に使うことになった。
機械学習に用いる特徴量
数値データ:
LotArea: Lot size in square feet (対数)
TotalBsmtSF: Total square feet of basement area (対数)
GrLivArea: Above grade (ground) living area square feet(対数)
YearBuilt: Original construction date
YrSold : Year Sold 売買契約成立時の築年数を計算してみることにした
カテゴリー変数:
MSZoning: Identifies the general zoning classification of the sale.
LandContour
Neighborhood: Physical locations within Ames city limits
LotShape: General shape of property (IR2 / IR3 をまとめる)
LotConfig: Lot configuration (FR2 / FR3 まとめる)
BldgType: Type of dwelling 住居のタイプ (1Fam or not)
OverallQual: Rates the overall material and finish of the house
OverallCond: Rates the overall condition of the house
2つまとめて、3カテゴリに分類
SaleType: Type of sale (WD / New / Others と分ける)
まず、LotArea / TotalBsmtSF / GrLivArea を対数に変換した column を作る。
df_train2['LotAreaLog']=np.log(df_train2['LotArea'])
df_train2['TotalBsmtSFLog']=np.log(df_train2['TotalBsmtSF'])
df_train2['GrLivAreaLog']=np.log(df_train2['GrLivArea'])
一部のカテゴリー変数を、強制的に変更。まあ、こんな感じでそれぞれ調整していく。
p = df_train2.columns.get_loc('LotConfig')
for i in range(len(df_train)):
tmpstr = df_train2.iloc[i,p]
if tmpstr=='FR3':
df_train2.iloc[i,p]='FR2'
購入時の築年数を計算すし、10年単位で丸める
df_train2['HouseYears'] = round( (df_train2['YrSold'] - df_train2['YearBuilt']) / 10,0)
ちなみに、築年数(10年単位)をヒストグラムにすると、こうなった。
築10年以内のものが一番多いが、80年以上とか結構古いものも売買の対象になっていることが分かる。
事前準備をしたうえで、get_dummies を使って、カテゴリー変数を要素ごとの 0/1 のダミー変数に変換。
そして、対数化するまえの LotArea などを取り除く。
df_train3 = pd.get_dummies(data=df_train2, drop_first=True, columns=['MSZoning','LandContour','Neighborhood', 'LotConfig','LotShape','SaleType', 'BldgType','Overall', 'HouseYears' ])
df_train3.columns
Index(['LotArea', 'TotalBsmtSF', 'GrLivArea', 'YearBuilt', 'OverallQual',
'OverallCond', 'YrSold', 'LotAreaLog', 'TotalBsmtSFLog', 'GrLivAreaLog',
'MSZoning_FV', 'MSZoning_RH', 'MSZoning_RL', 'MSZoning_RM',
'LandContour_HLS', 'LandContour_Low', 'LandContour_Lvl',
'Neighborhood_Blueste', 'Neighborhood_BrDale', 'Neighborhood_BrkSide',
'Neighborhood_ClearCr', 'Neighborhood_CollgCr', 'Neighborhood_Crawfor',
'Neighborhood_Edwards', 'Neighborhood_Gilbert', 'Neighborhood_IDOTRR',
'Neighborhood_MeadowV', 'Neighborhood_Mitchel', 'Neighborhood_NAmes',
'Neighborhood_NPkVill', 'Neighborhood_NWAmes', 'Neighborhood_NoRidge',
'Neighborhood_NridgHt', 'Neighborhood_OldTown', 'Neighborhood_SWISU',
'Neighborhood_Sawyer', 'Neighborhood_SawyerW', 'Neighborhood_Somerst',
'Neighborhood_StoneBr', 'Neighborhood_Timber', 'Neighborhood_Veenker',
'LotConfig_CulDSac', 'LotConfig_FR2', 'LotConfig_Inside',
'LotShape_IR2', 'LotShape_Reg', 'SaleType_WD', 'SaleType_other',
'BldgType_Other', 'Overall_B', 'Overall_C', 'HouseYears_1.0',
'HouseYears_2.0', 'HouseYears_3.0', 'HouseYears_4.0', 'HouseYears_5.0',
'HouseYears_6.0', 'HouseYears_7.0', 'HouseYears_8.0', 'HouseYears_9.0',
'HouseYears_10.0', 'HouseYears_11.0', 'HouseYears_12.0',
'HouseYears_13.0', 'HouseYears_14.0'],
dtype='object')
df_train3 = df_train3.drop(['LotArea', 'TotalBsmtSF', 'GrLivArea', 'OverallQual', 'OverallCond', 'YrSold', 'YearBuilt'], axis=1)
これを、そのまま scikit-learn の機械学習に突っ込んだら、エラーが。
地下室がない住宅の場合、TotalBsmtSF = 0 ですが、対数を採ると、TotalBsmtSFLog = -inf (負の無限大)になってしまってます。
なので、-inf になっているものは、 強制的に TotalBsmtSFLog =0 と変更。
つまり、TotalBsmtSF 地下室の面積は 1 squarefeet と見なす、ということになる。
予測したい SalePrice も対数化しておく。
Y = np.log(df_train['SalePrice'])
さあ、やっと scikit learn の出番だ!! ということで、次回に続く。
この記事が気に入ったらサポートをしてみませんか?