Python sklearn學習之缺失值插補

Python sklearn學習之缺失值插補


scikit-learn要求數據沒有缺失值,如果出現了缺失值,則需要對數據集進行插補——從已有數據推斷出缺失的數據。

在插補過程中,若只使用缺失特徵維度中非缺失值來插補該特徵維度下的缺失值的插補算法,則稱之爲單變量算法;若使用整個可用特徵維度來估計缺失的值的插補算法則稱之爲多變量算法。

1 單變量插補

sklearn提供了單變量插補的工具類SimpleImputer ,其提供了計算缺失值的基本策略。缺失值可以用提供的常數值計算,也可以使用缺失值所在的行/列中的統計數據(平均值、中位數或者衆數)來計算。這個類也支持不同的缺失值編碼。

1.1 SimpleImputer類

在版本0.20之前,請使用Imputer 類,版本0.22(包含0.22)之後的,則使用SimpleImputer

  • 類定義
def __init__(self, missing_values=np.nan, strategy="mean",
                 fill_value=None, verbose=0, copy=True, add_indicator=False):
  • 參數說明:
    • missing_values :指定何種佔位符表示缺失值,可選 numberstringnp.nan(default)None
    • strategy :插補策略,字符串,默認"mean"
      • "mean" :使用每列的平均值替換缺失值,只能與數字數據一起使用
      • "median":則使用每列的中位數替換缺失值,只能與數字數據一起使用
      • "most_frequent" :則使用每列中最常用的值替換缺失值,可以與字符串或數字數據一起使用
      • "constant" :則用 fill_value 替換缺失值。可以與字符串或數字數據一起使用
    • fill_value :字符串或數值,默認"None",當strategy ==“constant”時,fill_value用於替換所有出現的missing_values。如果保留默認值,則在輸入數字數據時fill_value將爲0,對於字符串或對象數據類型則爲“missing_value”。
    • verbose :整數,默認爲0,可選的參數,控制imputer的詳細程度
    • copy :略
    • add_indicator :可選,布爾值類型,默認爲False。如果爲True,則 MissingIndicator 變換將堆疊到imputer的變換的輸出上。這允許預測估計器儘管插補而解釋缺失。如果某個要素在擬合/訓練時沒有缺失值,即使在變換/測試時缺少值,該要素也不會出現在缺失的指示符上。
  • 屬性說明
    • statistics_ :每一個樣本的插補值
    • indicator_ :指示用於爲缺失值添加二進制指標
  • 源碼分析
imp = SimpleImputer(missing_values=np.nan, strategy='mean')
imp.fit([[1, 2], [np.nan, 3], [7, 6]])
X = [[np.nan, 2], [6, np.nan], [7, 6]]
print(imp.transform(X))
[[4.         2.        ]
 [6.         3.66666667]
 [7.         6.        ]]

SimpleImputer 類在fit過程中將會保存狀態。

當使用 'most_frequent''constant' 策略時,SimpleImputer 類還支持以 string values 或 pandas categoricals 表示的分類數據(categorical data)

df = pd.DataFrame([["a", "x"], [np.nan, "y"], ["a", np.nan], ["b", "y"]], dtype="category")
imp = SimpleImputer(strategy="most_frequent")
print(imp.fit_transform(df))
out:
[['a' 'x']
 ['a' 'y']
 ['a' 'y']
 ['b' 'y']]

2 多變量插補

2.1 IterativeImputer類

IterativeImputer類的功能是,將每個缺失值的特徵建模爲其他特徵的函數,並使用該估計值進行估算。

它以循環迭代方式實現:在每個步驟中,將特徵目標列指定爲輸出y,將其他列視爲輸入X。使用一個迴歸器來在已知(未缺失)y的樣本上對(X,y)進行擬合。然後使用這個迴歸器來預測缺失的y值。這是以迭代的方式對每個特徵進行的,然後重複max_iter輪。最後一輪的計算結果被返回。

  • 類定義
def __init__(self, estimator=None, missing_values=np.nan, sample_posterior=False, max_iter=10, tol=1e-3, n_nearest_features=None, initial_strategy="mean", imputation_order='ascending', min_value=None, max_value=None, verbose=0, random_state=None, add_indicator=False):
  • 參數說明
    • estimator :estimator對象,默認= BayesianRidge()。循環法插補的每一步使用的估算器。如果sample_posterior爲True,則估算器必須支持 return_std其predict方法。
    • missing_values :指定何種佔位符表示缺失值,可選 numberstringnp.nan(default)None
    • sample_posterior :布爾值,默認爲False,是否從每個插補的擬合估計的(高斯)預測後驗進行採樣。如果設置爲True,Estimator 必須支持return_stdpredict 方法。True如果IterativeImputer用於多個插補,則設置爲 。
    • **max_iter **:輸入爲int型數據,默認值是10。在返回最後一輪計算的估算值之前要執行的最大插補輪次數。
    • tol :容忍停止條件
    • n_nearest_features :用於估計每個要素列的缺失值的其他要素數。使用每個特徵對之間的絕對相關係數(在初始插補之後)測量特徵之間的接近度。爲了確保在整個插補過程中覆蓋特徵,鄰居特徵不一定是最接近的,而是以與每個插補目標特徵的相關性成比例的概率繪製。當功能數量巨大時,可以提供顯着的加速。如果None,將使用所有功能。
    • initial_strategy :使用哪種策略初始化缺失值。與 **SimpleImputer **中的strategy參數相同
    • imputation_order :排序規則
      • ascending :從缺失值最少的功能到最多
      • descending :從具有最多缺失值的功能到最少
      • roman :左到右
      • arabic :右到左
      • random :隨機順序
    • min_value :最小可能的估算值。默認值None將最小值設置爲負無窮大。
    • max_value :最大可能的估算值。默認值None將最大值設置爲正無窮大。
    • verbose :詳細程度標誌控制在評估函數時發出的調試消息。越高越詳細。可以是0,1或2。
    • random_state :僞隨機數生成器的種子使用。如果 n_nearest_features不是Noneimputation_order則隨機選擇估計器特徵, if random和後驗if的採樣sample_posterior爲True。
    • add_indicator :如果爲True,則MissingIndicator變換將堆疊到imputer的變換的輸出上。這允許預測估計器儘管插補而解釋缺失。如果某個要素在擬合/訓練時沒有缺失值,即使在變換/測試時缺少值,該要素也不會出現在缺失的指示符上。
  • 實例
imp = IterativeImputer(max_iter=10, random_state=0)
imp.fit([[1, 2], [3, 6], [4, 8], [np.nan, 3], [7, np.nan]])
X_test = [[np.nan, 2], [6, np.nan], [np.nan, 6]]
np.round(imp.transform(X_test))

# [['a' 'x']
#  ['a' 'y']
#  ['a' 'y']
#  ['b' 'y']]

3 標記缺失值

MissingIndicator 轉換器用於將數據集轉換爲相應的二進制矩陣,以指示數據集中缺失值的存在。這個變換與歸算結合起來是有用的。當使用插補時,保存關於哪些值丟失的信息可以提供有用的信息。

X = [[-1, 2], [6, -1], [7, 6]]
indicator = MissingIndicator(missing_values=-1)
mask_missing_values_only = indicator.fit_transform(X)
# out
# array([[ True,  True, False],
#        [False,  True,  True],
#       [False,  True, False]])
def __init__(self, missing_values=np.nan, features="missing-only",
                 sparse="auto", error_on_new=True):
  • 參數說明
    • missing_values :指定何種佔位符表示缺失值,可選 numberstringnp.nan(default)None
    • features :植入掩模是否應代表全部或部分特徵。
      • “missing-only” (default):在fit時返回包含缺失值的特徵的輸入掩碼
      • “all”:回所有特徵,無論它們是否包含缺失的值
    • sparse :返回的標記矩陣是否是稀疏
      • auto:則imputer mask將與輸入類型相同
      • True:則imputer mask將是稀疏
      • False:則imputer mask將是一個numpy數組
    • error_on_new :布爾值,如果爲True(默認值),當變換中不含有缺少缺少值的要素時,transform將引發錯誤。這僅適用於features="missing-only"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章