本文共 3625 字,大约阅读时间需要 12 分钟。
真实中,往往会发现机器学习中最有趣的挑战往往会包含一些特征工程的内容。
特征生成就是从各种角度和侧面来刻画事物。通过对问题的理解,构造一些特征希望机器学习算法可以采纳。
特征与特征间的运算
从给定的特征集合中选出相关特征子集。特征选择过程要确保不丢失重要特征,去除冗余特征。包含两个环节:子集搜索、子集评价。
理由:
常见的特征选择方法大致可以分为三类:Filter、Wrapper、Embedding。
基于统计方法找出冗余或无关特征,独立于后续的任何机器学习算法。筛选器一个很大的缺点是扔掉了独立使用时没有 用处的特征,而一些特征看起来跟目标变量完全独立,但是当它们组合在一起就有效果了。
皮尔逊相关系数(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 pearsonrIn [2]: pearsonr([1,2,3], [1,2,3.1])Out[2]: (0.9996222851612184, 0.017498096813278487)
p值是该序列产生于一个不相关系统的概率,p值越高,我们越不能信任这个相关系数。()
基于相关性的特征选择方法的一个最大的缺点就是它只能检测出线性关系。
其他
互信息通过计算两个特征所共有的信息,与相关性不同,它依赖的并不是数据序列,而是数据的分布。
归一化互信息量
import numpy as npfrom scipy.stats import entropydef 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))
优点: 与相关性不同,它并不只关注线性关系。
缺点:计算每对特征之间的归一互信息量,计算量以平方级增长
让模型选择特征,选择一个目标函数来一步步筛选特征,即直接把最终要使用的学习器的性能作为特征子集的评价准则。效果通常比过滤式特征选择更好,但是计算开销大得多。
sklearn.feature_selection
嵌入式特征选择是将特征选择过程与学习器训练过程融为一体,两者在同一优化过程中完成,即在学习器训练过程中自动进行了特征选择。
L1范数和L2范数都有助于降低过拟合风险,但前者还会代来一个额外的好处:它比厚泽更易获得“稀疏”(sparse)解,即它求得的w会有更少的非零向量。
试图将原始特征空间转换成一个低维特征空间。有时当我们删掉冗余特征和无关特征后,经常会发现还有过多的特征。线性模型代表:PCA、LDA;非线性:KerelPCA、MDS。
线性模型,无监督方法
性质:
算法步骤:
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
在实际的应用中,我们无法精确知道所需要的主成分数目,必须通过实验中取不同的值来确定。有效的主成分数目取决于数据集和具体应用。
线性模型,有监督方法
试图让不同类别样本之间的距离最大,同时让相同类别样本之间的距离最小。
sklearn.lda.LDA
MDS在降维时试图尽可能保留样本间的相对距离。MDS是一个揭示数据相似性的有用工具。
sklearn.manifold.MDS
小结:
在进行特征降维时,可以使用特征选择法删减特征;也可以用特征抽取法揭示数据里的真实低维结构。
《Building Machine Learning Systems with Python》 11 P171
《Machine Learning in Action》 13 P243
《机器学习》 11
转化率预估-4特征选择%ef%bc%8d简介/