天天看點

尋找資料集最佳的缺失值的填補方法(分析思路的整理)

尋找資料集最佳的缺失值的填補方法(分析思路的整理):

第一步,導入需要用到的庫;

第二步,導入完整的資料集并進行探索,以波士頓資料為例

       例如:将特征資料集和标簽資料集分出來

 X_full, y_full = dataset.data, dataset.target

# 找出特征列的的行列的範圍

n_samples = X_full . shape [ 0 ] n_features = X_full . shape [ 1 ]

第三步,為完整資料集放入缺失值

               首先設定一個缺失的比例,計算出缺失的資料的數量

               然後從特征的行列索引範圍内,随機取要選的數量

missing_features = rng.randint(0,n_features,n_missing_samples)

# randint(下限,上限,n)  ,意思是請在下限和上限之間取出n個整數

missing_samples = rng.randint(0,n_samples,n_missing_samples)

                 最後,防止操作錯誤,先複制資料集,然後,将選出的索引值的位置用nan填充

X_missing = X_full.copy()

y_missing = y_full.copy()

X_missing[missing_samples,missing_features] = np.nan

第四步,  使用0和均值填補缺失值

            第一種:使用均值填補缺失值

#使用均值進行填補

from sklearn.impute import SimpleImputer

imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean') # 執行個體化

X_missing_mean = imp_mean.fit_transform(X_missing)               # 訓練fit+導出predict 》》》特殊的接口fit_transform 

           第二種:使用0去填充

# 資料用0進行填充

imp_0 = SimpleImputer(missing_values=np.nan, strategy="constant",fill_value=0)  # constant 是指常數

X_missing_0 = imp_0.fit_transform(X_missing)

第五步,使用随機森林填補缺失值

         首先,将原始的特征列複制一份資料集,找出資料集中,缺失值從小到大排列的特征們的順序

X_missing_reg = X_missing.copy()

# 找出資料集中,缺失值從小到大排列的特征們的順序,有了這些特征的索引

sortindex = np.argsort(X_missing_reg.isnull().sum(axis=0)).values

# np.sort()會傳回從小到大排序的值,會丢掉索引

# np.argsort()會傳回從小到大排序的順序所對應的索引,數組array

尋找資料集最佳的缺失值的填補方法(分析思路的整理)

然後,做循環(整個過程大緻可以分為五步),從缺失值最大的開始。

參考代碼:

for i in sortindex:
    #建構我們的新特征矩陣(沒有被選中去填充的特征+原始的标簽)和新标簽(被選中去填充的标簽)
    df = X_missing_reg   # 目的是為了在進行循環時,缺失的特征值用0的填充,不改變原有的資料集
    fillc = df.iloc[:,i]
    df = pd.concat([df.iloc[:,df.columns != i],pd.DataFrame(y_full)],axis=1)
    #在新特征矩陣中,對含有缺失值的列,進行0的填補;先執行個體化,後接口,一步到位
    df_0 =SimpleImputer(missing_values=np.nan,
                        strategy='constant',fill_value=0).fit_transform(df)
    #找出我們的訓練集和測試集
    Ytrain = fillc[fillc.notnull()]
    Ytest = fillc[fillc.isnull()]
    Xtrain = df_0[Ytrain.index,:]
    Xtest = df_0[Ytest.index,:]
    #用随機森林回歸來填補缺失值
    rfc = RandomForestRegressor(n_estimators=100)
    rfc = rfc.fit(Xtrain, Ytrain)
    Ypredict = rfc.predict(Xtest)
    #将填補好的特征傳回到我們的原始的特征矩陣中,用切片和索引來做
    X_missing_reg.loc[X_missing_reg.iloc[:,i].isnull(),i] = Ypredict
           

第六步, 對填補好的資料進行模組化

              對所有的資料進行模組化,取得mse結果

#對所有資料進行模組化,取得MSE結果
X = [X_full,X_missing_mean,X_missing_0,X_missing_reg]
mse = []
for x in X:
    estimator = RandomForestRegressor(random_state=0, n_estimators=100) # shilihua
    scores = cross_val_score(estimator,x,y_full,scoring='neg_mean_squared_error', 
    cv=5).mean()
    mse.append(scores * -1)
           

第七步,用所畫的結果畫出條形圖

            通過在條形圖上進行對比,觀察四種情況之下的拟合狀況。

繼續閱讀