pandas中如何處理缺失值

大多機器學習算法不能處理缺失的特徵,因此先創建一些函數來處理特徵缺失的問題。當在一些.csv文件中缺少某些值的時候,一般有三種方法解決:

1 去掉對應的整個屬性

2 去掉缺失值所在的數據

3 將缺失值進行賦值

在pandas中,用 DataFrame 的 dropna() ,drop() ,和 fillna() 方法,可以方便地實現:

#去掉缺失值所在數據
data.dropna(subset=["years","salary","..."])

#去掉整個屬性

data.drop("one",axis=1)

#替換缺失值
median = data["years"].median()
housing["year"].fillna(median)

 

Scikit-Learn 提供了一個方便的類來處理缺失值: Imputer 。

下面是其使用方法:首先,需要創建一個 Imputer 實例,指定用某屬性的中位數來替換該屬性所有的缺失值:

from sklearn.preprocessing import Imputer
imputer = Imputer(strategy="median")  
#其中的strategy是選擇替換缺失值的方式,midian表示用中位數替換

#然後就可以將整個數據集放入imputer中
imputer.fit(data)

 

imputer 計算出了每個屬性的中位數,並將結果保存在了實例變量 statistics_ 中,可以通過imputer.statistics_查看

imputer.statistics_
array([ -118.51 , 34.26 , 29. , 2119. , 433. , 1164. , 408. , 3.5414])
>>> data.median().values
array([ -118.51 , 34.26 , 29. , 2119. , 433. , 1164. , 408. , 3.5414])

通過fit後的imputer()對數據集進行轉換,將缺失值替換爲中位數

X = imputer.transform(data)

結果是一個包含轉換後特徵的普通的 Numpy 數組。如果你想將其放回到Pandas DataFrame 中,也很簡單

data_= pd.DataFrame(X, columns=data.columns)

可能會比較糾結的就是Scikit-Learn 設計方面,爲什麼又要 fit() 又要transfrom()

Scikit-Learn 設計的 API 設計的非常好。它的主要設計原則是:

一致性:所有對象的接口一致且簡單


            估計器(estimator):任何可以基於數據集對一些參數進行估計的對象都被稱爲估計器(比如, imputer 就是個估計器)。估計本身是通過 fit() 方法,只需要一個數據集作爲參數(對於監督學習算法,需要兩個數據集;第二個數據集包含標籤)。任何其它用來指導估計過程的參數都被當做超參數(比如 imputer 的 strategy ),並且超參數要被設置成實例變量(通常通過構造器參數設置)。

            轉換器(transformer)。一些估計器(比如 imputer )也可以轉換數據集,這些估計器被稱爲轉換器。API也是相當簡單:轉換是通過 transform() 方法,被轉換的數據集作爲參數。返回的是經過轉換的數據集。轉換過程依賴學習到的參數,比如 imputer 的例子。所有的轉換都有一個便捷的方法 fit_transform() ,等同於調用 fit() 再 transform() (但有
時 fit_transform() 經過優化,運行的更快)。

            預測器(predictor)。最後,一些估計器可以根據給出的數據集做預測,這些估計器稱爲預測器。例如,上一章的 LinearRegression 模型就是一個預測器:它根據一個國家的人均 GDP 預測生活滿意度。預測器有一個 predict() 方法,可以用新實例的數據集做出相應的預測。預測器還有一個 score() 方法,可以根據測試集(和相應的標籤,如果是監督學習算法的話)對預測進行衡器。可檢驗。所有估計器的超參數都可以通過實例的public變量直接訪問(比如, imputer.strategy ),並且所有估計器學習到的參數也可以通過在實例變量名後加下劃線來訪問(比如, imputer.statistics_ )。類不可擴散。數據集被表示成 NumPy 數組或 SciPy 稀疏矩陣,而不是自制的類。超參數只是普通的 Python 字符串或數字。可組合。儘可能使用現存的模塊。例如,用任意的轉換器序列加上一個估計器,就可以做成一個流水線,後面會看到例子。合理的默認值。Scikit-Learn 給大多數參數提供了合理的默認值,很容易就能創建一個系統。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章