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年以上とか結構古いものも売買の対象になっていることが分かる。

画像1


事前準備をしたうえで、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 の出番だ!! ということで、次回に続く。

この記事が気に入ったらサポートをしてみませんか?