一、缺失值处理
主要有以下几种方法处理缺失值问题:
(1) 如果缺失值在数据集中所占比例非常小,可以删除存在缺失值的行。
(2) 对缺失值进行众数或平均值填充。
(3) 使用机器学习算法对缺失值进行预测,如RandomForest(随机森林)。
(4) 对于标称属性,可以赋一个代表缺失的值。因为缺失本身可能也带有一定的隐含信息。
sklearn
为我们提供了SimpleImputer
模块:
class sklearn.impute.SimpleImputer (missing_values=nan, strategy=’mean’, fill_value=None, verbose=0, copy=True)
数据集为Titanic数据集,对训练集中的年龄分别使用均值,中值,0进行填充:
from sklearn.impute import SimpleImputer
Age = data['Age'].values.reshape(-1,1) #sklearn中特征矩阵必须是二维
imp_mean = SimpleImputer()
imp_median = SimpleImputer(strategy='median')
imp_0 = SimpleImputer(strategy='constant', fill_value=0)
imp_mean = imp_mean.fit_transform(Age) #用均值填充
imp_median = imp_median.fit_transform(Age) #用中值填充
imp_0 = imp_0.fit_transform(Age) #用0值填充
对训练数据中Embarked使用众数进行填充:
Embarked = data['Embarked'].values.reshape(-1,1)
imp_model = SimpleImputer(strategy='most_frequent')
data['Embarked'] = imp_model.fit_transform(Embarked)
二、特征编码
preprocessing.LabelEncoder
:针对标签。
以Titanic数据集中的Embarked(船舱)为例:
from sklearn.preprocessing import LabelEncoder
y = data['Embarked'] #针对标签(非特征矩阵)不用将数据转换成二维
le = LabelEncoder()
le = le.fit(y)
label = le.transform(y)
label[1:20]
查看前20:
array([0, 2, 2, 2, 1, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 1, 2, 2, 0])
一步到位(菜菜ppt截取):
from sklearn.preprocessing import LabelEncoder
data.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])
preprocessing.OneHotEncoder
:独热编码,哑变量的创建
以Titanic的船舱(Embarked)与性别(Sex)为例:
from sklearn.preprocessing import OneHotEncoder
X = data[['Embarked','Sex']]
enc = OneHotEncoder(categories='auto').fit(X)
result = enc.transform(X).toarray()
print(result)
处理结果:
[[0. 0. 1. 0. 1.]
[1. 0. 0. 1. 0.]
[0. 0. 1. 1. 0.]
...
[0. 0. 1. 1. 0.]
[1. 0. 0. 0. 1.]
[0. 1. 0. 0. 1.]]
查看经过处理后的特征矩阵所对应意义:
enc.get_feature_names()
结果:
array(['x0_C', 'x0_Q', 'x0_S', 'x1_female', 'x1_male'], dtype=object)
preprocessing.OrdinalEncoder
:特征专用,与1类似。
三、分箱
preprocessing.KBinsDiscretizer
:
使用Age为例(提前用中位数对其进行填充,否则存在缺失值),并查看其前10行:
from sklearn.preprocessing import KBinsDiscretizer
a = data['Age'].values.reshape(-1,1)
est = KBinsDiscretizer(n_bins=4, encode='ordinal', strategy='uniform' )
est.fit_transform(a)[:10]
结果:
array([[1.],
[1.],
[1.],
[1.],
[1.],
[1.],
[2.],
[0.],
[1.],
[0.]])
使用独热编码进行分箱:
est = KBinsDiscretizer(n_bins=4, encode='onehot', strategy='uniform' )
est.fit_transform(a).toarray()
注意:直接出来结果的类型为scipy.sparse.csr.csr_matrix
,使用toarray()
进行转化。结果:
array([[0., 1., 0., 0.],
[0., 1., 0., 0.],
[0., 1., 0., 0.],
...,
[0., 1., 0., 0.],
[0., 1., 0., 0.],
[0., 1., 0., 0.]])
参考:菜菜机器学习sklearn