和小白一起学机器学习之特征工程(三)

本文主要跟大家一起学习如下几个内容

  • 特征工程定义
  • 特征工程作用
  • 特征工程几个关键点

一、特征工程定义

特征是指从数据中抽取出对结果预测有用的信息。

特征工程是使用专业知识和技巧处理数据,使得特征能在机器学习算法上发挥更好作用的过程。

我们应用机器学习,其主要工作就是特征工程。

二、特征工程作用

  • 1.更好的特征意味着更强的灵活性

  • 2.更好的特征意味着只需要简单模型

  • 3.更好的特征意味着更好的结果

数据和特征决定了算法能达到的上限,算法和模型的选择只是无限接近这个上限。

如果特征十分清晰、易辨别,可能不需要神经网络这样复杂的算法,只需要常见的机器学习算法就能达到很好的结果。

三、特征工程几个关键点

(一)特征提取

特征提取是将任意数据转换为可用于机器学习的数字特征,也叫特征值化。

(1)字典特征提取

将字典中属于类别的特征,转换为one-hot编码。

1. 什么是one-hot编码?

也称“独热编码”和“一位有效编码”。

官方解释,使用N位状态寄存器来对N个状态进行编码,每个状态都有独立的寄存器位,并且在任意时候,其中只有一位有效。

通俗解释,N个离散型特征可以抽象成N种不同的状态,这N种状态中只有一个状态位值为1,其他状态位都是0。

举个例子,假设我们以学历为例,我们想要研究的类别为小学、中学、大学、硕士、博士五种类别,我们使用one-hot对其编码就会得到:

小学 -> 1 0 0 0 0

中学 -> 0 1 0 0 0

大学 -> 0 0 1 0 0

硕士 -> 0 0 0 1 0

博士 -> 0 0 0 0 1

2. 什么情况使用one-hot编码?

离散型特征的取值之间没有大小的意义,那么就使用one-hot编码。

3. 为什么使用one-hot编码?

将离散型特征使用one-hot编码,会让特征之间的距离计算更加合理。

这是因为one-hot编码是将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。

4. 示例
from sklearn.feature_extraction import DictVectorizer
data = [{"country": "中国", "sport": "乒乓球", "score": 95}, {"country": "中国", "sport": "羽毛球", "score": 92},
{"country": "美国", "sport": "篮球", "score": 94}, {"country": "牙买加", "sport": "长跑", "score": 90}]
transfer = DictVectorizer(sparse=False)
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
print("特征名字:\n", transfer.get_feature_names())

在这里插入图片描述

(2)文本特征提取

对于中文文本,一般采用TF-IDF方法。

1. 主要思想

如果某个词或短语在一篇文章中出现的频率很高,并且在其他类别的文章中很少出现,我们认为这个词或短语具有很好的区分能力,越能够代表该文章,适合用于分类。

2. 作用

用于评估一个词对于一份文章的重要程度。

3. 计算公式

TFIDF = TF * IDF

其中,TF:词频(term frequency),这个词在这篇文章中出现的频率。IDF:逆向文档频率(inverse document frequency),文章的总数除以包含该词语文章的数目,再将得到的商取以10为底的对数。

4.示例
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
data = ["今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天的路上,所以每个人不要放弃今天。",
       "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
       "如果只有一种方式了解某样事物,你就不会真正了解它,了解事物的真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
data_new=[]
for sent in data:
   # jieba分词
   data = jieba.cut(sent)
   data_new.append(" ".join(list(data)))
transfer = TfidfVectorizer()
data_final = transfer.fit_transform(data_new)
print("data_final:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names())

在这里插入图片描述

(二)特征预处理

特征预处理是通过一些转换函数,将特征数据转换成更加适合算法模型的特征数据的过程。

归一化/标准化的实质是一种线性变换,线性变换的重要性质是不改变原始数据的数值排序,这个性质同时也是进行归一化/标准化的前提。

(1)归一化(Normalization)

把原始数据进行变换,映射到统一区间内。输出范围默认在0-1之间。

计算公式:X’ = (X - min(X)) / (max(X) - min(X))

其中max(X)为样本数据的最大值,min(X)为样本数据的最小值。由归一化计算公式可知,归一化使用最大值和最小值求出,非常容易受异常值影响。归一化方法的鲁棒性较差,适合小数据量场景。

(2)标准化(Standardization)

把原始数据进行变换,变换至均值为0,标准差为1的范围内。输出范围是负无穷到正无穷。

计算公式:X’ = (X - μ) / δ

其中μ是样本的均值, σ是样本的标准差。如果出现了少量异常点,对于平均值的影响不大,方差改变也较小,在已有样本足够多的情况下比较稳定,适合嘈杂大数据场景。

1. 为什么进行归一化/标准化?
  • 无量纲化。机器学习任务中需要计算距离的,例如KNN、kmeans、PCA。如果量纲不统一,一个特征值域范围非常大,那么距离计算的结果就主要取决于这个特征,容易导致目标结果不合理。为了消除特征之间的量纲影响,公平学习这些特征,需要把它们归一化/标准化。

  • 模型求解需要。使用梯度下降的方法求解最优化问题时,归一化/标准化后可以加快梯度下降的求解速度,即提升模型的收敛速度。未归一化/标准化形成的等高线偏椭圆,迭代时很有可能走“之”字型路线(垂直长轴),从而导致迭代很多次才能收敛。归一化/标准化后对应的等高线就会变圆,在梯度下降进行求解时能较快的收敛。

2. 归一化和标准化如何选择?

归一化的处理只是和最大值最小值相关,标准化却是和所有数据点的分布相关(均值,方差),所以标准化的统计意义更强,是对数据缩放处理的首选。只是有些特殊场景下,比如需要数据缩放到[0,1]之间(标准化并不保证数据范围),以及在一些数据较为稳定时,会采用到归一化,其他的大部分时候,标准化是首选。

3. 什么情况不用归一化/标准化?

有些算法过程是和距离无关的,比如决策树、随机森林等基于树的模型就不需要进行归一化或标准化。

4. 示例
from sklearn.preprocessing import MinMaxScaler, StandardScaler
import numpy as np
data = np.array([[40928, 8.32], [14488, 7.15], [26052, 1.44], [75136, 13.14], [38344, 1.66]])
# 归一化
transfer = MinMaxScaler()
data_minmax = transfer.fit_transform(data)
print("data_minmax:\n", data_minmax)
# 标准化
transfer = StandardScaler()
data_standard = transfer.fit_transform(data)
print("data_standard:\n", data_standard)

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值