机器学习算法程序库——Scikit-Learn简介:特征工程

本博客所有内容均整理自《Python数据科学手册》,欢迎讨论交流~

对于机器学习实例,我们很多时候都是直接假设数据集已经是一个干净的 ,即数据集是一个[n_samples, n_features]的特征矩阵。

但是在现实生活和工作中,数据几乎不可能如此干净,因此,我们需要在获取数据之后,对这些数据进行转换,尽力转换成特征矩阵的数值。这个过程一般被称为特征工程

接下来,我们就首先介绍一些特征工程的常见实例,包括表示分类数据的特征和表示文本的特征,然后介绍提高模型复杂度的衍生特征,最后介绍处理缺失数据的填充方法,以及特征管道的思想。

1. 分类特征

在有些数据集中,会存在着非数值类型的数据,一般来说都是分类数据,例如班级学生名单里除了身高、体重、成绩等数值数据,还会有籍贯、性别、民族等非数值数据,这类数据我们没办法像数值数据一样定量分析,于是很多时候我们会选择编码,用1、2、3等数字来分别代表“北京”、“男”、“汉族”等信息。

但是编码有一个天然缺陷,那就是很容易让人误解。因为1—>北京,2—>男,3—>汉族,很容易让人误解成北京<男<汉族,甚至会让人误解成“北京+男=汉族",很明显这些都是大错误特错的。

可能有人会说,只要小心一点,是不会出现这种低级误解的。但是在Scikit-Learn中,所有模块都有一个基本假设,那就是数值特征可以反映代数量,即映射的数值特征可以反映元素关系。于是,上面说的很荒唐的误解在Scikit-Learn中是会真实出现的。

面对这种情况,常用的解决方案是独热编码(One-Hot Encoder)。它可以有效增加额外的列,让0和1出现在对应的列中分别表示每个分类值有或无。比如上面举的例子,独热编码的解决方案即是,增加三个列,分别表示“北京”、“男”和“汉族”。当有人来自北京时,他(她)的那一列数值就是1,否则是0,依此类推。

这种方法也有一个显著的缺陷,那就是如果分类特征有很多很多,那么数据集的维度将急剧增加。然而,由于被编码的数据中有很多很多的0,因此用稀疏矩阵来表示会非常高效。

要实现独热编码,使用Scikit-Learn的DictVectorizer类就可以实现,看下面的例子就可以明白:

data = [
    {'price': 850000, 'rooms': 4, 'neighborhppd': 'Queen Anne'},
    {'price': 700000, 'rooms': 3, 'neighborhppd': 'Fremont'},
    {'price': 650000, 'rooms': 3, 'neighbo
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值