在sklearn的preprocessing包中包含了對數據集中缺失值的處理,主要是應用Imputer類進行處理。python
首先須要說明的是,numpy的數組中可使用np.nan/np.NaN(Not A Number)來代替缺失值,對於數組中是否存在nan可使用np.isnan()來斷定。數組
使用type(np.nan)或者type(np.NaN)能夠發現改值其實屬於float類型,代碼以下:post
1
2
3
4
5
6
7
8
|
>>>
type
(np.NaN)
<
type
'float'
>
>>>
type
(np.nan)
<
type
'float'
>
>>> np.NaN
nan
>>> np.nan
nan
|
所以,若是要進行處理的數據集中包含缺失值通常步驟以下:編碼
一、使用字符串'nan'來代替數據集中的缺失值;spa
二、將該數據集轉換爲浮點型即可以獲得包含np.nan的數據集;code
三、使用sklearn.preprocessing.Imputer類來處理使用np.nan對缺失值進行編碼過的數據集。orm
代碼以下:對象
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中的缺失值。blog
固然也可使用imp對象來對X數組自己進行處理。ci
一般,咱們的數據都保存在文件中,也不必定都是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中的缺失值。