sklearn 数据预处理

一、缺失值处理

主要有以下几种方法处理缺失值问题:
(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)

二、特征编码

  1. 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])
  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)
  1. 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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值