機械学習回帰編 欠損値処理(質的)

import numpy as np
import pandas as pd
import pandas_profiling as pdp
import matplotlib as plt
%matplotlib inline
form mpl_toolkits.mplot3d import Axes3D
import seaborn as sns
import pickle
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import LabelEncoder
import xgboost as xgb
import lightgbm as lgb 
import warnings
warnings.simplefilter("ignore")
with open("imp_data.csv", mode="rb") as f*
     imp_data=pickle.load(f)

欠損値の確認

imp_data.isnull().sum()

欠損値の取り扱い

  • リストワイズ削除:欠損値のある行はすべて削除して、残りのデータで分析する
  • 統計量代入法:平均値や最頻値、中央値などの統計量を代入して補完する
  • 欠損カテゴリー法:欠損そのものをカテゴリーとして扱う(質的変数のみ可能)

リストワイズ削除を行うと、約7万個のデータを捨てることになり、データ資源が無駄になります。また、今回は欠損値が全て質的変数なので、統計量代入法では最頻値を代入することしかできません。そこで今回は、欠損カテゴリー法を使い、欠損を1つのカテゴリーとして考えましょう。例えば故障の有無が不明な車だったら、多くの人は「大丈夫なの?」と思って購入を控えるでしょう。「情報が無い」ということ自体が購入者の動機に影響して、価格にも影響すると考えられます。

欠損値の補充

欠損値を補完するには.fillna()を使います。

第1引数に置き換えたいオブジェクトを入力します。

今回は欠損値を”NA”という情報不明を表すカテゴリー名に置き換えます。

imp_data["vehicleType"].fillna("NA", inplace= True)
imp_data["gearbox"].fillna("NA", inplace=True)
imp_data["model"].fillna("NA", inplace=True)

.isnull.sum()で確認すると、欠損値が無くなっていることが分かります。

imp_data.isnull().sum()

各変数の0が出る

質的変数の数値化

Label Encoderを利用した数値化

出力はデータフレームでなくarray配列である点に注意しましょう。

【補足】関数.get_dummys()との違い

.get_dummys():k個のカテゴリーを持つ変数は、k個のダミー変数に変換される。→変換後の変数の数が増える

LabelEncoder:k個のカテゴリーに順番に数値を割り振る→変換後の変数の数は増えない

from sklearn.preprocessing import Label Encoder

le = LabelEncoder()
X=imp_data["fuelType"]
Y=le.fit_transform(imp_data["fuelType"])

pd.DataFrame({'fuelType':X, 'encode':Y})

fuelType
encode
0benzin2
1diesel4
2diesel4
3benzin2
4diesel4
371523NA0
371524benzin2
371525diesel4
371526diesel4
371527benzin2

以上の処理により、欠損値が無くなり、全てのデータが量的変数に変換されました。

imp_data
priceabtestvehicleTypeyearOfRegistrationgearboxpowerPSmodelkilometermonthOfRegistrationfuelTypebrandnotRepairedDamage
04801019932011815000002380
1183001420112190261250005411
29800182004116311912500084140
3150015200127511815000062382
436001520082691039000074312
371523220010200500262000010330
3715241199132000110110812500032322
3715259200121996210222515000034382
3715263400162002210011815000064380
371527289900720132320148500008222
with open('imp_data.csv', mode='wb') as f:
  pickle.dump(imp_data, f)

コメント

タイトルとURLをコピーしました