1. 程式人生 > >關於使用Sklearn進行資料預處理 —— 缺失值(Missing Value)處理

關於使用Sklearn進行資料預處理 —— 缺失值(Missing Value)處理

關於缺失值(missing value)的處理

在sklearn的preprocessing包中包含了對資料集中缺失值的處理,主要是應用Imputer類進行處理。

首先需要說明的是,numpy的陣列中可以使用np.nan/np.NaN(Not A Number)來代替缺失值,對於陣列中是否存在nan可以使用np.isnan()來判定。

使用type(np.nan)或者type(np.NaN)可以發現改值其實屬於float型別,程式碼如下:

1

2

3

4

5

6

7

8

>>> type

(np.NaN)

<type 'float'>

>>> type(np.nan)

<type 'float'>

>>> np.NaN

nan

>>> np.nan

nan

因此,如果要進行處理的資料集中包含缺失值一般步驟如下:

1、使用字串'nan'來代替資料集中的缺失值;

2、將該資料集轉換為浮點型便可以得到包含np.nan的資料集;

3、使用sklearn.preprocessing.Imputer類來處理使用np.nan對缺失值進行編碼過的資料集。

程式碼如下:

1

2

3

4

5

6

7

8

9

10

>>> from sklearn.preprocessing import Imputer

>>> imp = Imputer(missing_values='NaN', strategy='mean', axis=0)

>>> X=np.array([[1, 2], [np.nan, 3], [7, 6]])

>>> Y=[[np.nan,

2], [6, np.nan], [7, 6]]

>>> imp.fit(X)

Imputer(axis=0, copy=True, missing_values='NaN', strategy='mean', verbose=0)

>>> imp.transform(Y)

array([[ 4.        2.        ],

[ 6.        3.66666667],

[ 7.        6.        ]])

上述程式碼使用陣列X去“訓練”一個Imputer類,然後用該類的物件去處理陣列Y中的缺失值,缺失值的處理方式是使用X中的均值(axis=0表示按列進行)代替Y中的缺失值。

當然也可以使用imp物件來對X陣列本身進行處理。

通常,我們的資料都儲存在檔案中,也不一定都是Numpy陣列生成的,因此缺失值可能不一定是使用nan來編碼的,對於這種情況可以參考以下程式碼:

1

2

3

4

5

6

7

8

9

10

11

12

>>> line='1,?'

>>> line=line.replace(',?',',nan')

>>> line

'1,nan'

>>> Z=line.split(',')

>>> Z

['1', 'nan']

>>> Z=np.array(Z,dtype=float)

>>> Z

array([  1.,  nan])

>>> imp.transform(Z)

array([[ 1.        3.66666667]])

上述程式碼line模擬從檔案中讀取出來的一行資料,使用nan來代替原始資料中的缺失值編碼,將其轉換為浮點型,然後使用X中的均值填補Z中的缺失值。