数据的特征工程
1 什么是数据的特征工程
特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性。
特征工程的意义:将直接影响模型的预测结果。
2 数据的来源与类型
2.1 数据的来源
企业日益积累的大量数据,各大机构的实验数据等等。总之数据无处不在,大都是可用的。
2.2 数据的类型
按照机器学习的数据分类分成:
标称型:目标变量的结果只在有限目标集中取值,如真与假(标称型目标变量主要用于分类)
数值型:目标变量则可以从无限的数值集合中取值,如0.100,42.001等 (数值型目标变量主要用于回归分析)
按照数据的本身分布特性:
离散型:其数值只能用自然数或整数单位计算的则为离散变量.例如,班级人数、进球个数、是否是某个类别等等
连续型:是指在指定区间内可以是任意一个数值,例如,票房数据、花瓣大小分布数据
总结:离散型是区间内不可分,连续型是区间内可分
3 数据特征的抽取
现实世界中多数特征都不是连续变量,比如分类、文字、图像等,为了对非连续变量做特征表述,需要对这些特征做数学化表述,就是特征提取。
特征抽取针对非连续型数据,文本等进行特征值化,是为了计算机更好的去理解数据。
sklearn.feature_extraction提供了特征提取的很多方法
3.1 分类(字典)特征变量抽取
类:sklearn.feature_extraction.DictVectorizer
语法:DictVectorizer(sparse=True,…) 将映射列表转换为Numpy数组或scipy.sparse矩阵。sparse 是否转换为scipy.sparse矩阵表示,默认开启
DictVectorizer.fit_transform(X,y) | 应用并转化映射列表X,y为目标类型。X:字典或者包含字典的迭代器 返回值:返回sparse矩阵 |
DictVectorizer.inverse_transform(X,[, dict_type]) | 将Numpy数组或scipy.sparse矩阵转换为映射列表X:array数组或者sparse矩阵 返回值:转换之前数据格式 |
DictVectorizer.get_feature_names() | 返回类别名称 |
DictVectorizer.transform(X) | 按照原先的标准转换 |
sparse矩阵:节约内存,方便读取处理
使用流程:①实例化类DictVectorizer
②调用fit_transform方法输入数据并转换
举例 | 结果 |
| sparse矩阵:(0,1) 1.0 第一个行的第1个位置的值为1.0 |
| 修改parse,转换为ndarray矩阵 |
|
3.2 one-hot编码
如上图所示的句为one-hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。one-hot编码是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值。然后,每个整数值被表示为二进制向量,除了整数的索引之外,它都是零值,它被标记为1。
one-hot适用于处理离散型数据:在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算。而我们使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。将离散型特征使用one-hot编码,确实会让特征之间的距离计算更加合理。比如,有一个离散型特征,代表工作类型,该离散型特征,共有三个取值,不使用one-hot编码,其表示分别是x_1 = (1), x_2 = (2), x_3 = (3)。两个工作之间的距离是,(x_1, x_2) = 1, d(x_2, x_3) = 1, d(x_1, x_3) = 2。那么x_1和x_3工作之间就越不相似吗。显然这样的表示,计算出来的特征的距离是不合理。那如果使用one-hot编码,则得到x_1 = (1, 0, 0), x_2 = (0, 1, 0), x_3 = (0, 0, 1),那么两个工作之间的距离就都是sqrt(2).即每两个工作之间的距离是一样的,显得更合理。
one-hot有自己的意义,但是在机器学习中的意义就是为了把类别型的特征转换成one-hot编码格式利于进行分析
3.3 文本特征抽取
文本特征抽取就是对文本数据进行特征值化,应用于很多方面,比如说文档分类、垃圾邮件分类和新闻分类。那么文本分类是通过词是否存在、以及词的概率(重要性)来表示。
类:sklearn.feature_extraction.text.CountVectorizer
CountVectorizer语法:CountVectorizer(max_df=1.0,min_df=1,…) 返回词频矩阵
常用方法:
CountVectorizer.fit_transform(X,y) | X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵 |
CountVectorizer.inverse_transform(X) | X:array数组或者sparse矩阵 返回值:转换之前数据格式 |
CountVectorizer.get_feature_names() | 返回值:单词列表 |
流程:①实例化类CountVectorizer
②调用fit_transform方法输入数据并转换
注意返回格式,利用toarray()进行sparse矩阵转换array数组或修改sparse属性为false
由结果可知,①统计文章中所有的词,重复的值看做一次; ②对于每篇文章,在词的列表中进行统计每个词出现的次数 ③单个字母不统计 |
3.4 中文特征值化
中文的话要先进行分词才能详细的进行特征值化处理
中文特征值流程:
①准备句子,利用jieba.cut进行分词
①实例化类CountVectorizer
②将分词结果变成字符串当作fit_transform的输入值
单个字不统计 |
3.5 TF-IDF
TF(term frequency词的频率):统计每篇文章词出现的次数
IDF(inverse document frequency逆文档频率):log(总文档数量/该词出现的文档次数)
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高, 并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
类:sklearn.feature_extraction.text.TfidfVectorizer
TfidfVectorizer语法:TfidfVectorizer(stop_words=None,…) 返回词的权重矩阵
常用方法:
TfidfVectorizer.fit_transform(X,y) | X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵 |
TfidfVectorizer.inverse_transform(X) | X:array数组或者sparse矩阵 返回值:转换之前数据格式 |
TfidfVectorizer.get_feature_names() | 返回值:单词列表 |
|
4 数值型数据的特征预处理
通过特定的统计方法(数学方法)将数据转换成算法要求的数据
类:sklearn. preprocessing
4.1 单个特征
4.1.1 归一化
特点:通过对原始数据进行变换把数据映射到(默认为[0,1])之间。
归一化首先在特征(维度)非常多的时候,可以防止某一维或某几维对数据影响过大,也是为了把不同来源的数据统一到一个参考区间下,这样比较起来才有意义,其次可以程序可以运行更快。 例如:一个人的身高和体重两个特征,假如体重50kg,身高175cm,由于两个单位不一样,数值大小不一样。如果比较两个人的体型差距时,那么身高的影响结果会比较大,k-临近算法会有这个距离公式。
注意:在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。
类: sklearn.preprocessing.MinMaxScaler
语法:MinMaxScalar(feature_range=(0,1)…) 每个特征缩放到给定范围(默认[0,1])
MinMaxScalar.fit_transform(X) | X:numpy array格式的数据[n_samples,n_features] 返回值:转换后的形状相同的array |
流程:①实例化MinMaxScalar
②通过fit_transform转换
4.1.2 标准化
特点:常用的方法是z-score标准化,通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
它们可以通过现有的样本进行估计,在已有的样本足够多的情况下比较稳定,适合嘈杂的数据场景
类:scikit-learn.preprocessing.StandardScaler
StandardScaler语法:StandardScaler(…) 处理之后每列来说所有数据都聚集在均值0附近标准差为1
常用方法:
StandardScaler.fit_transform(X,y) | X:numpy array格式的数据[n_samples,n_features] 返回值:转换后的形状相同的array |
StandardScaler.mean_ | 原始数据中每列特征的平均值 |
StandardScaler.std_ | 原始数据每列特征的方差 |
流程:①实例化StandardScaler
②通过fit_transform转换
归一化与标准化对比:
归一化:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变;
标准化:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。
4.1.3 缺失值
缺失值:由于各种原因,数据集包含缺少的值,通常编码为空白,NaN或其他占位符。
缺失值的处理方法:①删除:如果每列或者行数据缺失值达到一定的比例,建议放弃整行或者整列
②插补:可以通过缺失值每行或者每列的平均值、中位数来填充
有缺失值的数据集与scikit的分类器不兼容,它们假设数组中的所有值都是数字,并且都具有和保持含义。使用不完整数据集的基本策略是丢弃包含缺失值的整个行和/或列。然而,这是以丢失可能是有价值的数据(即使不完整)的代价。更好的策略是估算缺失值,即从已知部分的数据中推断它们。
类: sklearn.preprocessing.Imputer
语法:Imputer(missing_values='NaN', strategy='mean', axis=0) 完成缺失值插补
missing_values:integer or "NaN", optional (default="NaN")丢失值的占位符,对于编码为np.nan的缺失值,使用字符串值“NaN”
strategy:string, optional (default="mean")插补策略,如果是“平均值”,则使用沿轴的平均值替换缺失值;如果为“中位数”,则使用沿轴的中位数替换缺失值;如果“most_frequent”,则使用沿轴最频繁的值替换缺失
axis: integer, optional (default=0)插补的轴,如果axis = 0,则沿列排列,如果axis = 1,则沿行排列
Imputer.fit_transform(X,y) | X:numpy array格式的数据[n_samples,n_features] 返回值:转换后的形状相同的array |
流程:①初始化Imputer,指定”缺失值”,指定填补策略,指定行或列。缺失值也可以是别的指定要替换的值
②调用fit_transform
numpy的数组中可以使用np.nan/np.NaN来代替缺失值,属于float类型 ;如果是文件中的一些缺失值,可以替换成nan,通过np.array转化成float型的数组即可 |
4.2 多个特征
4.2.1 降维
PCA(Principal component analysis),主成分分析。特点是保存数据集中对方差影响最大的那些特征,PCA极其容易受到数据中特征范围影响,所以在运用PCA前一定要做特征标准化,这样才能保证每维度特征的重要性等同。
本质:PCA是一种分析、简化数据集的技术。
目的:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
作用:可以削减回归分析或者聚类分析中特征的数量
类:sklearn.decomposition.PCA
语法:PCA(n_components=None) 将数据分解为较低维数空间。
相关参数
n_components: int, float, None or string:这个参数可以帮我们指定希望PCA降维后的特征维度数目。最常用的做法是直接指定降维到的维度数目,此时n_components是一个大于1的整数。我们也可以用默认值,即不输入n_components,此时n_components=min(样本数,特征数)
whiten: bool, optional (default False)判断是否进行白化。所谓白化,就是对降维后的数据的每个特征进行归一化。对于PCA降维本身来说一般不需要白化,如果你PCA降维后有后续的数据处理动作,可以考虑白化,默认值是False,即不进行白化
vd_solver:选择一个合适的SVD算法来降维,一般来说,使用默认值就够了。
常用方法
PCA.fit_transform(X) | X:numpy array格式的数据[n_samples,n_features] 返回值:转换后指定维度的array |
|
5 数据的特征选择
特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征, 特征在选择前和选择后可以改变值、也不改变值,但是选择后的特征维数肯 定比选择前小,毕竟我们只选择了其中的一部分特征。
特征选择方法:Filter(过滤式):VarianceThreshold;Embedded(嵌入式):正则化、决策树;Wrapper(包裹式)。
其中过滤式的特征选择后,数据本身不变,而数据的维度减少。而嵌入式的特征选择方法也会改变数据的值,维度也改变。Embedded方式是一种自动学习的特征选择方法。
类:sklearn.feature_selection.VarianceThreshold
VarianceThreshold语法:VarianceThreshold(threshold = 0.0) 删除所有低方差特征
常用方法:
Variance.fit_transform(X,y) | X:numpy array格式的数据[n_samples,n_features] 返回值:训练集差异低于threshold的特征将被删除。 默认值是保留所有非零方差特征,即删除所有样本 中具有相同值的特征。 |
流程:①初始化VarianceThreshold,指定阀值方差
②调用fit_transform
|
五 fit_transform(),fit(),transform()
特征工程的步骤:①实例化 (实例化的是一个转换器类(Transformer))
②调用fit_transform(对于文档建立分类词频矩阵,不能同时调用)
fit_transform():输入数据直接转换
fit():输入数据但是不做事情,计算平均值方差等等
transform():进行数据的转换
注意:fit_transform或fit后,如果还有数据需要转换,直接调用transform就可以,不要再调用fit或者fit_transform了,因为再次调用fit标准就改了。