3.特征工程
- 特征抽取
- 数据特征的预处理
- 特征选择
- 为什么需要特征工程
- 样本数据中的特征可能存在缺失值、重复值、异常值等等,那么我们是需要对特征中的相关早点数据进行处理的,那么处理的目的就是为了营造出一个更加纯净的样本集,让模型基于这组数据可以有更好的预测能力。当然特征工程不是蛋蛋知识处理上述操作!
- 什么是特征工程
- 特征工程是将原始数据转换成更好的代表预测模型的潜在问题的特征的过程,提高对位置数据预测的准确性。
- 特征工程的意义
- 直接影响模型的预测结果
- 如何是实现特征工程
- 工具:sklearn
- sklearn介绍:
- 是python语言中的机器学习工具,包括了很多知名的机器学习算法的实现,其文档完善,容易上手。
- 功能:
- 分类模型
- 回归模型
- 聚类模型
- 特征工程
3.1 特征抽取
- 目的:
- 我们所采集到样本中的特征数据往往很多时候为字符串或者其他类型的数据,我们知道电脑只能识别二进制数值型的数据,如果把字符串给电脑,电脑是看不懂的。机器学习的数据如果不是数值型的数据,它是识别不了的。
- 效果演示:
- 将字符串转化成数字
from sklearn.feature_extraction.text import CountVectorizer
vector = CountVectorizer()
res = vector.fit_transform(['lift is short,i love python','lift is too long,i hate python'])
print(res.toarray())
- 结论:
- 特征抽取对文本等数据进行特征值化。特征值化是为了让机器更好的理解数据。
- 字典特征抽取:
- 作用:对自带你数据进行特征值化
- API:from sklearn.feature_extractiion import DictVectorizer
from sklearn.feature_extraction import DictVectorizer
alist = [
{'city':'BeiJing','temp':33},
{'city':'GZ','temp':42},
{'city':'SH','temp':40}
]
d = DictVectorizer()
#返回的是一个sparse矩阵
feature = d.fit_transform(alist)
print(feature)
d = DictVectorizer(sparse=False)
#返回的是一个二维列表
feature = d.fit_transform(alist)
print(feature)
- 什么是sparse矩阵,如何理解?
- 在DictVectorizer类的构造方法种设定sparse=False则返回的就不是sparse矩阵,而是一个数组。
- get_feature_names():返回类别名称
- sparse矩阵就是一个变相的数组或者列表,目的是为了节省内存。
- 在DictVectorizer类的构造方法种设定sparse=False则返回的就不是sparse矩阵,而是一个数组。
- One-Hot编码:
- 个人理解:构造二维矩阵,每列对应一个值,行数对应数值个数,每个列对应的值存在多少个,则该值有多少个1 ,其余的用0填充。
3.2文本特征抽取
- 作用:对文本数据进行特征值化
- API:from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import CountVectorizer
vector = CountVectorizer()
res = vector.fit_transform(['left is short,i love python','left is too long,i hate python'])
print(res)#sparse矩阵
print(vector.get_feature_names())
print(res.toarray())#将sparse矩阵转化成数组
#单字母不统计,因为单个字母代表不了实际含义,然后每个数字表示的是单词出现的次数
- 中文文本特征抽取
- 对有标点符号的中文文本进行特征抽取
from sklearn.feature_extraction.text import CountVectorizer
vector = CountVectorizer()
res = vector.fit_transform(['人生苦短 我用python','人生漫长,我不用python'])
print(res)#sparse矩阵
print(vector.get_feature_names())
print(res.toarray())#将sparse矩阵转化成数组
- 对有标点企业有空格分隔的中文文本进行特征处理
- 目前CountVectorizer只可以对有标点和用分隔符对应的文本进行特征抽取,显然这是部满足我们的日常需求的,因为在自然语言种,我们需要将一段中文文本种相关的词语、成语、形容词等都要进行抽取的
- jieba分词
- 对中文文章进行分词处理
- jieba分词的基本使用
import jieba
jb = jieba.cut('我是一个好人')
content = list(jb)
print(content)
ct = ' '.join(content)
print(ct) #返回空格区分的词语
- 使用jieba分词之后生成的列表再通过CountVectorizer进行特征值抽取
3.3 特征值预处理
- 无量钢化:
- 在机器学习算法实践中,我们往往有着将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布的需求,这种需求统称为将数据“无量钢化”。譬如梯度和矩阵为核心的算法中:逻辑回归、支持向量机、神经网络,无量钢化可以加快求解速度,而在距离类模型-K-Means聚类中无量钢化可以帮助我们提升模型精度,避免某一个取值范围特别大的特征对距离计算造成影响。(树类算法除外,树类算法可以把任意数据都处理的很好)
- 那么预处理就是用来实现无量钢化的方式。
- 含义:特征抽取后我们就可以获取对应的数值型样本数据,然后就可以进行数据处理了。
- 概念:通过特定的统计方法,将数据转换成算法要求的数据。
- 方式:
- 归一化
- 标准化
- 如果认为每个特征具有同等大小的权重,则必须要对其进行归一化处理
- 可以使用KNN的算法特征影响进行说明
- 实现:
- 通过对原始数据映射到0~1之间
- 通过对原始数据映射到0~1之间
- 归一化之后的数据服从正太分布
- API:from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import MinMaxScaler
mm = MinMaxScaler(feature_range=(0,1))#每个特征的缩放范围
data = [[90,2,10,40],[60,5,15,45],[73,3,13,45]]
data = mm.fit_transform(data)
print(data)
归一化对于最大最小值敏感,如果数据中的异常值比较多则有一定的局限性
- 标准化处理
- 公示:x’ = (x-每列均值)/每列的标准差
from sklearn.preprocssing import StandardScaler
ss = StandardScaler()
data = [[90,2,10,40],[60,5,15,45],[73,3,13,45]]
ss.fit_transform(data)
- 建议先使用标准化试试,如果效果不好再换成归一化尝试
3.4特征选择
特征选择:从特征中选择出有意义对模型有帮助的特征作为机器学习最终的输入数据!
- 注意:
- 再做特征选择之前,有三件非常重要的事情:跟数据提供者联系,跟数据提供者沟通,跟数据提供者开会
- 一定要抓住给你数据的人,尤其是理解业务数据含义的人,跟他们聊上一段时间。技术能让模型起飞,前提是你和从业人员一样理解数据。所以特征选择的第一步,其实是根据我们的目标,用业务常识来选择特征。
- 特征选择的原因:
- 冗余:部分特征的相关度高,容易消耗计算机性能
- 噪点:不跟特征对预测结果有偏执影响
- 特征选择的实现:
- 人为对不相关的特征进行主观舍弃
- 在已有的特征和对应预测结果的基础上,使用相关的工具过滤掉一些无用或者权重较低的特征
- 工具:
- filter(过滤式)
- Embedded(嵌入式):决策树模型会自己选择出对其重要的特征。
- PCA降维
- 工具:
- Filter(方差过滤):
- 原理:这是通过特征本身的方差来筛选特征的类。比如一个特征的本身方差很小,就表示样本在这个特征上基本没有差异,可能特征中的大多数值都一样,甚至整个特征的取值都相同,那这个特征对于样本分区没有什么作用。所以无论接下来的特征工程要做什么,都要优先消除方差为0胡总和方差极低的特征。
- API sklearn.feature_selection import VarianceThreshold
from sklearn.feature_selection import VarianceThreshold
v = VarianceThreshold(threshold=3)#threshold方差的值,删除所有低于3的特征,默认值为0表示保留所有方差意义非0的特征
- 方差过滤对模型的影响
- 节省时间、提高准确率
- 注意:
- 方差过滤主要服务的对象是:需要遍历特征的算法模型,而过滤法的主要目的是:再维持算法表现的前提下,帮助算法降低计算成本
- PCA降维(主要成分分析):
- 降维的维度值就是特征的种类
- 用低维度去表示高纬度的物体时一定会造成一些信息差异。
- 目的:特征数量成败上千的时候,考虑数据的优化,使用数据维度压缩,在损失少量信息的前提下尽可能降低源数据的维度。
- 作用:可以削减回归分析或者聚类分析中特征的数量
- 大致原理:
- 将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。(后续需要自己去了解底层原理:具体怎么计算,各类场景优化等等–2022年9月15日)