天天看點

使用scikit-learn填充缺失值

歡迎關注”生信修煉手冊”!

在真實世界中的資料,難免會有缺失值的情況出現,可能是收集資料時沒有收集到對應的資訊,也可能是整理的時候誤删除導緻。對于包含缺失值的資料,有兩大類處理思路

1. 删除包含缺失值的行和列,這樣會導緻特征和樣本的減少,在樣本和特征的個數很多,且包含缺失值的樣本和特征較少的情況下,這種簡單粗暴的操作還可以接受

2. 對缺失值進行填充,填充時就需要考慮填充的邏輯了,本質是按照不同的填充邏輯來估算缺失值對應的真實資料

在scikit-learn中,通過子子產品impute進行填充,提功了以下幾種填充方式

1. 單變量填充

這種方式隻利用某一個特征的值來進行填充,比如特征A中包含了缺失值,此時可以将該缺失值填充為一個固定的常數,也可以利用所有特征A的非缺失值,來統計出均值,中位數等,填充對應的缺失值,由于在填充時,隻需要考慮該特征對應的值,是以稱之為單變量填充,代碼如下

>>> from sklearn.impute import SimpleImputer
>>> imp = SimpleImputer(missing_values=np.nan, strategy='mean')
>>> X = np.array([[np.nan, 2], [6, np.nan], [7, 6]])
>>> X
array([[nan, 2.],
       [ 6., nan],
       [ 7., 6.]])
>>> imp.fit_transform(X)
array([[6.5, 2. ],
       [6. , 4. ],
       [7. , 6. ]])
           

除了均值以外,還支援中位數,衆數,指定的常數進行填充,代碼如下

>>> imp = SimpleImputer(missing_values=np.nan, strategy='mean')
>>> imp = SimpleImputer(missing_values=np.nan, strategy='median')
>>> imp = SimpleImputer(missing_values=np.nan, strategy='most_frequent')
>>> imp = SimpleImputer(missing_values=np.nan, strategy='constant', fill_value=3)
           

2. 多變量填充

這種方式在填充時會考慮多個特征之間的關系,比如針對特征A中的缺失值,會同時考慮特征A和其他特征的關系,将其他特征作為自變量,特征A作為因變量,然後模組化,來預測特征A中缺失值對應的預測值,通過控制疊代次數,将最後一次疊代的預測值作為填充值。

代碼如下

>>> from sklearn.experimental import enable_iterative_imputer
>>> from sklearn.impute import IterativeImputer
>>> imp = IterativeImputer(max_iter=10, random_state=0)
>>> X = np.array([[np.nan, 2], [6, np.nan], [np.nan, 6]])
>>> X
array([[nan, 2.],
       [ 6., nan],
       [nan, 6.]])
>>> imp.fit_transform(X)
array([[6., 2.],
       [6., 4.],
       [6., 6.]])
           

這種方式非常靈活,在拟合的時候可以選擇多種模型,以決策樹回歸模型為例,代碼如下

>>> from sklearn.tree import DecisionTreeRegressor
>>> imp = IterativeImputer(DecisionTreeRegressor(), max_iter=10, random_state=0)
           

3. KNN填充

K近鄰填充,首先根據歐幾裡得距離計算與缺失值樣本距離最近的K個樣本,計算的時候隻考慮非缺失值對應的次元,然後用這K個樣本對應次元的均值來填充缺失值,代碼如下

>>> from sklearn.impute import KNNImputer
>>> X = np.array([[1, 2, np.nan], [3, 4, 3], [np.nan, 6, 5], [8, 8, 7]])
>>> X
array([[ 1., 2., nan],
       [ 3., 4., 3.],
       [nan, 6., 5.],
       [ 8., 8., 7.]])
>>> imputer = KNNImputer(n_neighbors=2, weights="uniform")
>>> imputer.fit_transform(X)
array([[1. , 2. , 4. ],
       [3. , 4. , 3. ],
       [5.5, 6. , 5. ],
       [8. , 8. , 7. ]])
           

對于第一列第三行的nan,首先計算該樣本距離最近的兩個樣本,分别為第二行和第四行的樣本,然後取3和8的均值,即5.5進行填充;接下來填充第一行第三列的難,計算最近的兩個樣本,分别是第2行和第3行,是以用3和5的均值,4進行填充。

在實際分析中,缺失值填充的算法還有很多,但是在scikit-learn中,主要就是內建了這3種填充方法。

·end·

—如果喜歡,快分享給你的朋友們吧—

原創不易,歡迎收藏,點贊,轉發!生信知識浩瀚如海,在生信學習的道路上,讓我們一起并肩作戰!

本公衆号深耕耘生信領域多年,具有豐富的資料分析經驗,緻力于提供真正有價值的資料分析服務,擅長個性化分析,歡迎有需要的老師和同學前來咨詢。

  更多精彩

  • KEGG資料庫,除了pathway你還知道哪些
  • 全網最完整的circos中文教程
  • DNA甲基化資料分析專題
  • 突變檢測資料分析專題
  • mRNA資料分析專題
  • lncRNA資料分析專題
  • circRNA資料分析專題
  • miRNA資料分析專題
  • 單細胞轉錄組資料分析專題
  • chip_seq資料分析專題
  • Hi-C資料分析專題
  • HLA資料分析專題
  • TCGA惡性良性腫瘤資料分析專題
  • 基因組組裝資料分析專題
  • CNV資料分析專題
  • GWAS資料分析專題
  • 2018年推文合集
  • 2019年推文合集

  寫在最後

轉發本文至朋友圈,背景私信截圖即可加入生信交流群,和小夥伴一起學習交流。

掃描下方二維碼,關注我們,解鎖更多精彩内容!

使用scikit-learn填充缺失值

一個隻分享幹貨的

生信公衆号

繼續閱讀