尋找資料集最佳的缺失值的填補方法(分析思路的整理):
第一步,導入需要用到的庫;
第二步,導入完整的資料集并進行探索,以波士頓資料為例
例如:将特征資料集和标簽資料集分出來
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)
第七步,用所畫的結果畫出條形圖
通過在條形圖上進行對比,觀察四種情況之下的拟合狀況。