簡體   English   中英

處理 sklearn.preprocessing 上的缺失(nan)值

[英]Handling missing (nan) values on sklearn.preprocessing

我正在嘗試使用 scikit-learn 預處理在處理數據之前使用缺失(即 nan)值對數據進行標准化。

顯然,一些縮放器(例如 StandardScaler)以我想要的方式處理缺失值 - 我的意思是在保持 nans 的同時標准化現有值 - 而其他(例如 Normalizer)只會引發錯誤。

我環顧四周並沒有找到 - 如何使用具有缺失值的 Normalizer,或以其他方式復制其行為(使用 norm='l1' 和 norm='l2';我需要測試幾個標准化選項) ?

from sklearn.preprocessing import Normalizer, StandardScaler
import numpy as np

data = np.array([0,1,2,np.nan, 3,4])

scaler = StandardScaler(with_mean=True, with_std=True)
scaler.fit_transform(data.reshape(-1,1))

normalizer = Normalizer(norm='l2')
normalizer.fit_transform(data.reshape(-1,1))    

根據文檔,您的請求的問題在於 Normalizer 以這種方式運行:

將樣本單獨標准化為單位范數。

具有至少一個非零分量的每個樣本(即數據矩陣的每一行)獨立於其他樣本進行重新縮放,以便其范數(l1 或 l2)等於 1( 來源此處

這意味着每一行都必須求和到單位范數。 如何處理缺失值? 理想情況下,您似乎不希望它計入總和,並且無論如何都希望行標准化,但是內部函數 check_array 通過拋出錯誤來防止它。

你需要規避這種情況。 最合理的做法是:

  1. 首先創建一個掩碼以記錄數組中缺少哪些元素
  2. 創建一個填充缺失值的響應數組
  3. 僅選擇有效條目后,將 Normalizer 應用於您的數組
  4. 在您的響應數組上記錄基於其原始位置的歸一化值

這里有一些代碼詳細說明了這個過程,基於你的例子:

from sklearn.preprocessing import Normalizer, StandardScaler
import numpy as np

data = np.array([0,1,2,np.nan, 3,4])

# set valid mask
nan_mask = np.isnan(data)
valid_mask = ~nan_mask

normalizer = Normalizer(norm='l2')

# create a result array
result = np.full(data.shape, np.nan)

# assign only valid cases to 
result[valid_mask] = normalizer.fit_transform(data[valid_mask].reshape(-1,1)).reshape(data[valid_mask].shape)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM