真实中,往往会发现机器学习中最有趣的挑战往往会包含一些特征工程的内容。
特征生成
特征生成就是从各种角度和侧面来刻画事物。通过对问题的理解,构造一些特征希望机器学习算法可以采纳。
特征与特征间的运算
- 补集
- 笛卡儿积
- 交集
- 加、减、乘、除运算
特征选择
从给定的特征集合中选出相关特征子集。特征选择过程要确保不丢失重要特征,去除冗余特征。包含两个环节:子集搜索、子集评价。
理由:
- 缓解维度灾难问题
- 去除不相关特征往往会降低学习任务的难度
常见的特征选择方法大致可以分为三类:Filter、Wrapper、Embedding。
筛选器(Filter)
基于统计方法找出冗余或无关特征,独立于后续的任何机器学习算法。筛选器一个很大的缺点是扔掉了独立使用时没有 用处的特征,而一些特征看起来跟目标变量完全独立,但是当它们组合在一起就有效果了。
相关性
皮尔逊相关系数(Pearson correlation coefficient):
scipy.stats.pearsonr(),给定两个数据序列 ,会返回相关系数值和p值所组成的元组。皮尔逊相关系数(皮尔逊r值)测量两个序列的线性关系,取值在-1到1之间,-1代表负相关、1代表正相关、0代表不相关。r值:
上式中m_x是向量x的均值,m_y是向量y的均值。
In [1]: from scipy.stats import pearsonr
In [2]: pearsonr([1,2,3], [1,2,3.1])
Out[2]: (0.9996222851612184, 0.017498096813278487)
p值是该序列产生于一个不相关系统的概率,p值越高,我们越不能信任这个相关系数。(https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.pearsonr.html#scipy.stats.pearsonr)
基于相关性的特征选择方法的一个最大的缺点就是它只能检测出线性关系。
其他
- 特征的方差
- 假设检验:卡方检验、F检验、t检验
互信息
互信息通过计算两个特征所共有的信息,与相关性不同,它依赖的并不是数据序列,而是数据的分布。
归一化互信息量
import numpy as np
from scipy.stats import entropy
def mutual_info(x, y, bins=10):
counts_xy, bins_x, bins_y = np.histogram2d(x, y, bins=(bins, bins))
counts_x, bins = np.histogram(x, bins=bins)
counts_y, bins = np.histogram(y, bins=bins)
counts_xy += 1
counts_x += 1
counts_y += 1
P_xy = counts_xy / np.sum(counts_xy, dtype=float)
P_x = counts_x / np.sum(counts_x, dtype=float)
P_y = counts_y / np.sum(counts_y, dtype=float)
I_xy = np.sum(P_xy * np.log2(P_xy / (P_x.reshape(-1, 1) * P_y)))
return I_xy / (entropy(counts_x) + entropy(counts_y))
优点: 与相关性不同,它并不只关注线性关系。
缺点:计算每对特征之间的归一互信息量,计算量以平方级增长
封装器(Wrapper)
让模型选择特征,选择一个目标函数来一步步筛选特征,即直接把最终要使用的学习器的性能作为特征子集的评价准则。效果通常比过滤式特征选择更好,但是计算开销大得多。
sklearn.feature_selection
嵌入法(Embedded)
嵌入式特征选择是将特征选择过程与学习器训练过程融为一体,两者在同一优化过程中完成,即在学习器训练过程中自动进行了特征选择。
- 决策树模型:深植于其内核的特征选择机制
- L1正则化:把效用不大的特征的重要性降低为0
L1范数和L2范数都有助于降低过拟合风险,但前者还会代来一个额外的好处:它比厚泽更易获得“稀疏”(sparse)解,即它求得的w会有更少的非零向量。
特征抽取
试图将原始特征空间转换成一个低维特征空间。有时当我们删掉冗余特征和无关特征后,经常会发现还有过多的特征。线性模型代表:PCA、LDA;非线性:KerelPCA、MDS。
主成分分析(PCA)
线性模型,无监督方法
性质:
- 保留方差最大的
- 最终的重构误差(从变换都特征回到原始特征)是最小的
算法步骤:
- 从数据中减去它的均值
- 计算协方差矩阵
- 计算协方差矩阵的特征向量和特征值
- 将特征值从大到小排序
- 保留最上面的N个特征向量
- 将数据转换到上述N个特征向量构建的新空间中
from numpy import *
def pca(dataMat, topNfeat=9999999):
meanVals = mean(dataMat, axis=0)
meanRemoved = dataMat - meanVals #remove mean
covMat = cov(meanRemoved, rowvar=0)
eigVals,eigVects = linalg.eig(mat(covMat))
eigValInd = argsort(eigVals) #sort, sort goes smallest to largest
eigValInd = eigValInd[:-(topNfeat+1):-1] #cut off unwanted dimensions
redEigVects = eigVects[:,eigValInd] #reorganize eig vects largest to smallest
lowDDataMat = meanRemoved * redEigVects#transform data into new dimensions
reconMat = (lowDDataMat * redEigVects.T) + meanVals
return lowDDataMat, reconMat
在PCA中,数据从原来的坐标系转换到了新的坐标系,新坐标系是由数据本身决定的。第一个新坐标系轴选择的是原始数据中方差最大的方向,第二个新坐标轴的选择和第一个坐标轴正交且具有最大方差的方向。该过程一直重复,重复次数为原始数据中特征的数目。我们会发现,大部分方差都包含在最前面几个新坐标轴中,因此我们可以忽略余下的坐标轴,即对数据进行了降维处理。
sklearn.decomposition.PCA
在实际的应用中,我们无法精确知道所需要的主成分数目,必须通过实验中取不同的值来确定。有效的主成分数目取决于数据集和具体应用。
线性判别分析(Linear Discriminant Analysis, LDA)
线性模型,有监督方法
试图让不同类别样本之间的距离最大,同时让相同类别样本之间的距离最小。
sklearn.lda.LDA
多维标度法(MDS)
MDS在降维时试图尽可能保留样本间的相对距离。MDS是一个揭示数据相似性的有用工具。
sklearn.manifold.MDS
小结:
在进行特征降维时,可以使用特征选择法删减特征;也可以用特征抽取法揭示数据里的真实低维结构。
《Building Machine Learning Systems with Python》 11 P171
《Machine Learning in Action》 13 P243
《机器学习》 11
http://www.flickering.cn/ads/2014/08/转化率预估-4特征选择%ef%bc%8d简介/