特征工程
- 特征抽取
- 数据特征的预处理
- 特征选择
- 为什么需要特征工程
- 样本数据中的特征有可能会存在缺失值i,重复值,异常值等等,那么我们是需要对特征中的相关的噪点数据进行处理的,那么处理的目的就是为了营造出一个更纯净的样本集,让模型基于这组数据可以有更好的预测能力。当然特征工程不单单只是处理上述操作!
- 什么是特征工程
- 特征工程的意义
- 直接影响模型预测的结果
- 如何实现特征工程
- 工具-sklearn
- sklearn介绍
- 是python语言中的机器学习工具,包含了很多知名的机器学习算法的实现,起文档完善,容易上手
- 功能
- 分类模型
- 回归模型
- 聚类模型
- 特征工程
特征抽取
- 目的:将字符串转换成数字
- 演示后的结论:
- 特征抽取对文本等数据进行特征值化。特征值化是为了让机器更好的理解数据。
- 字典特征抽取
- API :from sklearn.feature_extraction import DictVectorizer
- one-hot
-
from sklearn.feature_extraction.text import CountVectorizer import pandas as pd if __name__ == '__main__': df = pd.DataFrame([ ['green','M',20,'class1'] ,['red','L',21,'class2'] ,['blue','XL',30,'class3']]) df.columns = ['color','size','weight','class label'] # color size weight class label # 0 green M 20 class1 # 1 red L 21 class2 # 2 blue XL 30 class3 print(df) # blue green red # 0 0 1 0 # 1 0 0 1 # 2 1 0 0 print(pd.get_dummies(df['color']))#one-hot编码 # 中文文本特征抽取 vector = CountVectorizer() res = vector.fit_transform(['人生苦短,我用pytthon','人生漫长,不用python']) # (0, 2) 1 # (0, 3) 1 # (1, 1) 1 # (1, 0) 1 print(res)#sparse矩阵 # ['不用python', '人生漫长', '人生苦短', '我用pytthon'] print(vector.get_feature_names()) # [[0 0 1 1] # [1 1 0 0]] print(res.toarray())#将sparse矩阵转换成数组 enRes = vector.fit_transform(['life is is short,i love python','life is too long,i hate pyhton']) # 注意:单字母不统计,应为单个字母代表不了实际含义,然后每个数字表示的是单词出现的次数 # ['hate', 'is', 'life', 'long', 'love', 'pyhton', 'python', 'short', 'too'] print(vector.get_feature_names()) # [[0 2 1 0 1 0 1 1 0] # [1 1 1 1 0 1 0 0 1]] print(enRes.toarray())
特征预处理:对数值型的数据进行处理
- 无量纲化
- 将不同规格的数据转换成同一规格,或不同分布的数据转换到某个特定分布
- 含义:特征抽取后我们就可以获取对应的数值型的样本数据啦,然后就可以进行数据处理了
- 概念:通过特定的统计方法(数学方法),将数据转换成算法要求的数据
- 方式:
- 归一化
- 归一化的实现:通过对原始数据进行交换把数据映射到(默认为[0,1])之间
- 公式:X'=(x-min)/(max-min) X''=X'*(mx-mi) + mi
- 注:作用于每一列,max为一列的最大值,min为一列的最小值,那么X‘’为最终结果,mx,mi分别为指定的区间值,默认mx为1,mi为0
-
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)#X需要归一化的特征 print("归一化结果") # [[1. 0. 0. 0. ] # [0. 1. 1. 1. ] # [0.43333333 0.33333333 0.6 1. ]] print(data)
- 标准化
- 当数据按照、均值中心化后,再按标准差缩放,数据就会服从均值为0、方差为1的正态分布(即标准正态分布),而这个过程,就叫做数标准化
- 公式“X' = (x-mean)/ δ
- 注:作用于每一列,mean为平均值,δ为标准差
-
# 标准化 from sklearn.preprocessing import StandardScaler ss = StandardScaler() data = [[90,2,10,40],[60,5,15,45],[73,3,13,45]] data = ss.fit_transform(data) # 打印标准化结果 # [[ 1.27540458 -1.06904497 -1.29777137 -1.41421356] # [-1.16685951 1.33630621 1.13554995 0.70710678] # [-0.10854507 -0.26726124 0.16222142 0.70710678]] print(data)
- 归一化
- 归一化和标准化总结
- 对于归一化来说,如果出现了异常值则会响应特征的最大最小值,那么最终结果会受到比较大的影响
- 对于标准化来说,如果出现异常点,由于具有异地那个的数据量,少量的异常点对于平均值的影响并不大,从而标准差改变的比较少。
- StandardScaler和MinMaxScaler选哪个
- 看情况。大多数机器学习算法中,会选择standarScaler来将进行特征缩放,因为MinMaxScaler对异常值非常敏感。在PCA,聚类,逻辑回归,支持向量机,神经网络这些算法中,StandardScaler往往是最好的选择。MinMaxScaler在不涉及距离度量、梯度、协方差计算以机数据需要被压缩到特定区间是使用广泛,比如数字图像处理中量化像素强度时,都会使用MinMaxScaler将数据压缩于[0,1]区间之中
- 建议先试试StandardScaler,效果不好换MinMaxScaler
特征选择
- 原因
- 冗余:部分特征的相关度高,容易消耗计算机的性能
- 噪点:部分特征对预测结果有偏执影响
- 实现
- 人为对不相关的特征将进行主观舍弃
- 在已有特征和对应预测结果的基础上,使用相关的工具过滤掉一些无用或权重较低的特征。(Filter、Embedded、PCA)
- Filter(过滤式)
- 方差过滤:通过特征本身的方差来筛选特征的类。比如一个特征本身的方差很小,就表示样本在这个特征上基本没有差异,可能特征中的大多数值都一样,那这个特征对于样本区分没有作用。所以要优先消除方差为0或者方差极低的特征。
- API:from sklearn.feature_selection import VarianceThreshold
-
from sklearn.feature_selection import VarianceThreshold #threshold为方差的值,删除所有方差低于阈值的特征,默认值为0表示保留所有方差为非0的特征 v = VarianceThreshold(threshold=3) # v2 = v.fit_transform([[0,2,4,3],[0,3,7,3],[0,9,6,3]]) # 输出结果 # [[2] # [3] # [9]] print(v2)
-
如果方差过滤后剩余特征还有很多,且模型的效果没有显著提升,则方差也可以帮助我们将特征选择【一部到位】。留下一半的特征,那可以设定一个让特征总数减半的方差阈值,只要找到特征方差的中位数,再将这个中位数作为threshold参数的值输入就好了。
-
import numpy as np # 造一个特征矩阵 feature = np.random.randint(0,100,size=(5,10)) print(feature) # 计算特征方程的中位数 med = np.median(feature.var(axis=0)) # 将中位数设置为过滤阈值 v = VarianceThreshold(threshold=med) # 特征过滤 V2 = v.fit_transform(feature) print(V2)
- Embedded(嵌入式)
- PCA降维(主成分分析)
- 是一种分析,简化数据集的技术。
- 降维的纬度值就是特征的种类
- 作用:可以削减回归分析或者聚类分析中特征的数量
-
from sklearn.decomposition import PCA # 将数据分解为较低维度的空间 # n_components可以为小数(保留特征的百分比),整数(减少到特征数量) pca = PCA(n_components=2) r = pca.fit_transform([[0,2,4,3],[0,3,7,3],[0,9,6,3]]) # [[-2.88362421 -1.25443227] # [-1.45140588 1.56492061] # [ 4.33503009 -0.31048834]] print(r)
- PCA降维(主成分分析)
-
- Filter(过滤式)