别人的域名解析到了我的网站上天猫注册店铺流程及费用
web/
2025/10/2 22:07:01/
文章来源:
别人的域名解析到了我的网站上,天猫注册店铺流程及费用,网站前后台代码,网站制作与建立1 引言
特征提取和特征选择作为机器学习的重点内容#xff0c;可以将原始数据转换为更能代表预测模型的潜在问题和特征的过程#xff0c;可以通过挑选最相关的特征#xff0c;提取特征和创造特征来实现。要想学习特征选择必然要了解什么是特征提取和特征创造#xff0c;得…1 引言
特征提取和特征选择作为机器学习的重点内容可以将原始数据转换为更能代表预测模型的潜在问题和特征的过程可以通过挑选最相关的特征提取特征和创造特征来实现。要想学习特征选择必然要了解什么是特征提取和特征创造得到数据的特征之后对特征进行精炼这时候就要用到特征选择。本文主要介绍特征选择的三种方法过滤法filter、包装法wrapper和嵌入法embedded。 特征提取Feature Extraction从文字图像声音等其他非结构化数据中提取新信息作为特征。比如说从淘宝宝贝的名称中提取出产品类别产品颜色是否是网红产品等等。 特征创造Feature Creation把现有特征进行组合或互相计算得到新的特征。比如说我们有一列特征是速度一列特征是距离我们就可以通过让两列相处创造新的特征通过距离所花的时间。 特征选择Feature Selection从所有的特征中选择出有意义对模型有帮助的特征以避免必须将所有特征都导入模型去训练的情况。 2 Filter过滤法
过滤法可以理解为在机器学习算法之前的预处理过滤法特征选择的过程完全独立与任何机器学习算法。根据对特征经过统计检验之后得到的分数来筛选掉一些相对来说无用的特征从而优化特征集。 过滤法适用场景在需要遍历特征或升维的算法之前对特征进行过滤。
过滤法的目的在维持算法表现的前提下帮助算法降低计算成本。
2.1 方差过滤
Variance Threshold是通过特征本身方差来筛选特征的类。比如一个特征本身的方差很小就表示样本在这个特征上基本没有差异可能特征中的大多数值都一样甚至整个特征的取值都相同那这个特征对于样本区分没有什么作用。所以无论接下来的特征工程要做什么都要优先消除方差为0的特征。VarianceThreshold有重要参数threshold表示方差的阈值表示舍弃所有方差小于threshold的特征不填默认为0即删除所有的记录都相同的特征。下面代码简单的实现了方差过滤 import pandas as pdfrom sklearn.feature_selection import VarianceThreshold data pd.read_csv(r./train.csv)x data.iloc[:,1:]y data.iloc[:,0]print(x.shape)selector VarianceThreshold()x_var0 selector.fit_transform(x)print(x_var0.shape) 从结果中可以看到原本数据中有784个特征经过阈值为 0 的方差过滤之后剩下708个特征也就是说之前有76个特征的方差都为0。剩下的708个特征还是比较多的并不能满足我们的需求此时我们还需要进一步的特征选择。由于单纯调整阈值比较抽象我们并不知道特定阈值下会留下多少个特征留下特征过多或者过少都对我们的结果不利所以我们可以留下指定数量的特征比如留下一半的特征找到特征方差的中位数再将这个中位数作为 threshold 的值就可以让特征总数减半代码如下 import pandas as pdimport numpy as npfrom sklearn.feature_selection import VarianceThreshold data pd.read_csv(r./train.csv)x data.iloc[:,1:]y data.iloc[:,0]print(x.shape)selector VarianceThreshold(np.median(x.var().values))x_feature_selection selector.fit_transform(x)print(x_feature_selection.shape) 如果特征是二分类特征的取值就是伯努利随机变量这些变量的方差计算公式为Var[X] p (1 - p)其中 X 为特征矩阵p为二分类特征中的一类在这个特征中所占的概率。那么假设 p 0.8即二分类中某种分类占到80%以上的时候删除特征。代码如下 import pandas as pdimport numpy as npfrom sklearn.feature_selection import VarianceThresholddata pd.read_csv(r./train.csv)x data.iloc[:,1:]y data.iloc[:,0]print(x.shape)selector VarianceThreshold(0.8 *(1-0.8))x_feature_selection selector.fit_transform(x)print(x_feature_selection.shape) K-近邻算法KNN是一种比较简单的分类算法其原理是利用每个样本到其他样本点的距离来判断每个样本点的相似度然后对样本进行分类。KNN必须遍历每个特征和样本因而特征越多KNN所需要的计算力也就越大。
随机森林或随机决策森林是用于分类回归和其他任务的集成学习方法其通过在训练时构建多个决策树并输出作为类的模式分类或平均预测回归的类来操作。个别树木。随机决策森林纠正决策树过度拟合其训练集的习惯。随机森林随机的选取特征进行分值本身的运算非常迅速。
实验证明对特征进行方差过滤之后KNN的准确率稍有提升运行时间降低了三分之一。随机森林的准确率略低于KNN但是花费的算力非常少不到KNN计算时间的百分之 1 。另外随机森林的准确率略微上升运行时间并没与什么变化。因此方差过滤并不是适用于所有的算法因为过滤之后模型可能变好也可能变性能下降。我们就需要针对数据集去进行尝试也就是调参选出最优的参数画学习曲线就可以找到比较好的参数点。但是现实中一般不会花费太多时间在方差过滤的调参上而是使用阈值为 0 或者阈值很小的方差进行过滤消除一些明显用不到的特征然后选取其他的特征选择方法继续削减特征数量。
2.2 相关性过滤
一般情况下特征如果和标签的相关性比较大的话这样的特征能够为我们提供大量的信息。如果特征与标签无关只会白白浪费我们的算力还可能给模型带来噪声。在 sklearn 中有三种常用的方法来评判特征和标签之间的相关性卡方、F检验和互信息。
卡方过滤
卡方过滤是专门针对离散型标签即分类问题的相关性过滤。卡方检验类feature_selection.chi2计算每个非负特征和标签之间的卡方统计量并依照卡方统计量由高到低为特征排名。再结合feature_selection.SelectKBest这个可以输入”评分标准“来选出前K个分数最高的特征的类我们可以借此除去最可能独立于标签与我们分类目的无关的特征。下面代码简单实现了卡方过滤 from sklearn.ensemble import RandomForestClassifier as RFCfrom sklearn.model_selection import cross_val_scorefrom sklearn.feature_selection import SelectKBestfrom sklearn.feature_selection import chi2 #留下300个特征X_fschi SelectKBest(chi2, k300).fit_transform(X_fsvar, y)X_fschi.shape#验证模型效果cross_val_score(RFC(n_estimators10,random_state0),X_fschi,y,cv5).mean() K值变化时模型的评分也会跟着变化手动去调整一个一个参数的话效率非常低我们可以使用学习曲线来获得一个最优的超参数K。代码如下 import pandas as pdimport numpy as npfrom sklearn.feature_selection import VarianceThresholdfrom sklearn.ensemble import RandomForestClassifier as RFCfrom sklearn.model_selection import cross_val_scorefrom sklearn.feature_selection import SelectKBestfrom sklearn.feature_selection import chi2import matplotlib.pyplot as pltdata pd.read_csv(r./train.csv)x data.iloc[:,1:]y data.iloc[:,0]# print(x.shape)selector VarianceThreshold(np.median(x.var().values))x_fsvar selector.fit_transform(x)score []for i in range(390,200,-10): x_fschi SelectKBest(chi2,k i).fit_transform(x_fsvar,y) once cross_val_score(RFC(n_estimators10,random_state0),x_fschi,y,cv5).mean() score.append(once)plt.plot(range(390,200,-10),score)plt.show() 从曲线中我们可以看到随着K值不断的在呢个价模型的表现不断上升这说明K越大越好数据中所有的特征都是和标签相关的。但是这个程序运行时间比较长我们可以用另一种更好的方法选择 K 看 p 值选K。
卡方阿金艳的本质是推测数据之间的差异卡方检验返回卡方值和 P 值两个统计量其中卡方值很难界定有效的范围而 p 值我们一般使用 0.01 或 0.05 作为显著性水平即p值判断的边界。
p值0.05 或0.010.05 或 0.01数据差异差异不是自然形成的这些差异是很自然的样本误差相关性两组数据是相关的两组数据是相互独立的原假设拒绝原假设接受备择假设接受原假设
卡方值大p值小于0.05的特征是和标签相关联的特征。调用 SelectKBest可以直接从chi实例化后的模型中获取各个特征所对应的卡方值和 p 值。我们只需要算出来p值大于0.05 的特征有几个这个个数就是我们想要得到的K值。这里得到的 p 值全为 0也就是说对于该数据集方差过滤已经把所有和标签无关的特征都剔除了。 chivalue, pvalues_chi chi2(X_fsvar,y)print(chivalue)print(pvalues_chi) #k取多少我们想要消除所有p值大于设定值比如0.05或0.01的特征k chivalue.shape[0] - (pvalues_chi 0.05).sum() #X_fschi SelectKBest(chi2, k填写具体的k).fit_transform(X_fsvar, y)#cross_val_score(RFC(n_estimators10,random_state0),X_fschi,y,cv5).mean() F检验
F检验又称ANOVA方差齐性检验是用来捕捉每个特征与标签之间的线性关系的过滤方法。它即可以做回归也可以做分类因此包含feature_selection.f_classifF检验分类和feature_selection.f_regressionF检验回归两个类。其中F检验分类用于标签是离散型变量的数据而F检验回归用于标签是连续型变量的数据。
和卡方检验一样这两个类需要和类SelectKBest连用并且我们也可以直接通过输出的统计量来判断我们到底要设置一个什么样的K。需要注意的是F检验在数据服从正态分布时效果会非常稳定因此如果使用F检验过滤我们会先将数据转换成服从正态分布的方式。
F检验的本质是寻找两组数据之间的线性关系其原假设是”数据不存在显著的线性关系“。它返回F值和p值两个统计量。和卡方过滤一样我们希望选取p值小于 0.05 或 0.01 的特征这些特征与标签时显著线性相关的而p值大于0.05或0.01的特征则被我们认为是和标签没有显著线性关系的特征应该被删除。以F检验的分类为例我们继续在数字数据集上来进行特征选择 chivalue, pvalues_chi chi2(X_fsvar,y)chivaluepvalues_chi#k取多少我们想要消除所有p值大于设定值比如0.05或0.01的特征k chivalue.shape[0] - (pvalues_chi 0.05).sum()#X_fschi SelectKBest(chi2, k填写具体的k).fit_transform(X_fsvar, y)#cross_val_score(RFC(n_estimators10,random_state0),X_fschi,y,cv5).mean()from sklearn.feature_selection import f_classifF, pvalues_f f_classif(X_fsvar,y)Fpvalues_fk F.shape[0] - (pvalues_f 0.05).sum()#X_fsF SelectKBest(f_classif, k填写具体的k).fit_transform(X_fsvar, y)#cross_val_score(RFC(n_estimators10,random_state0),X_fsF,y,cv5).mean() 得到的结论和我们用卡方过滤得到的结论一模一样没有任何特征的p值大于0.01所有的特征都是和标签相关,因此不需要进行相关性过滤。
互信息法
互信息法是用来捕捉每个特征与标签之间的任意关系包括线性和非线性关系的过滤方法。和F检验相似它既可以做回归也可以做分类并且包含两个类feature_selection.mutual_info_classif互信息分类和feature_selection.mutual_info_regression互信息回归。这两个类的用法和参数都和F检验一模一样不过互信息法比F检验更加强大F检验只能够找出线性关系而互信息法可以找出任意关系。
互信息法不返回 p 值或 F 值类似的统计量它返回“每个特征与目标之间的互信息量的估计”这个估计量在[0,1]之间取值为0则表示两个变量独立为1则表示两个变量完全相关。以互信息分类为例的代码如下 from sklearn.feature_selection import mutual_info_classif as MICresult MIC(X_fsvar,y)k result.shape[0] - sum(result 0)#X_fsmic SelectKBest(MIC, k填写具体的k).fit_transform(X_fsvar, y)#cross_val_score(RFC(n_estimators10,random_state0),X_fsmic,y,cv5).mean() 最终得到的互信息量都大于 0表明所有特征都和标签相关。
3 Embedded嵌入法
嵌入法是一种算法自己决定使用哪些特征的方法即特征选择和算法训练同时进行。在使用嵌入法时我们先使用某些机器学习的算法和模型进行训练得到各个特征的权值系数根据权值系数从大到小选择特征。这些权值系数往往代表了特征对于模型的某种贡献或某种重要性比如决策树和树的集成模型中的feature_importances_属性可以列出各个特征对树的建立的贡献我们就可以基于这种贡献的评估找出对模型建立最有用的特征。因此相比于过滤法嵌入法的结果会更加精确到模型的效用本身对于提高模型效力有更好的效果。并且由于考虑特征对模型的贡献因此无关的特征需要相关性过滤的特征和无区分度的特征需要方差过滤的特征都会因为缺乏对模型的贡献而被删除掉可谓是过滤法的进化版。 由于嵌入法时算法自身决定哪些特征可以使用很难去界定一个标准来判断特征是否是有效的所以并不会像过滤法那样根据统计知识和指标来对特征进行衡量如p值应当低于显著水平 0.05。针对不同的算法模型的权值系数也会不同所以不同模型的嵌入法使用起来也是不一样的。此外由于嵌入法选取特征时是根据算法来决定的也就是说特征选择的过程伴随着算法的训练过程那么整个过程非常耗时耗力这也是嵌入法的一个缺陷。下面我们会以随机森林和决策树模型来学习一下嵌入法。 feature_selection.SelectFromModel class sklearn.feature_selection.SelectFromModel (estimator, thresholdNone, prefitFalse, norm_order1,max_featuresNone) 参数说明estimator使用的模型评估器只要是带feature_importances或者coef_属性或带有l1 和 l2 惩罚项的模型都可以使用。threshold特征重要性的阈值重要性低于这个阈值的特征都将被删除prefit默认False后的模型直接传递给构造函数。如果为True则必须直接调用fit和transform不能使用fit_transform并且SelectFromModel不能与cross_val_scoreGridSearchCV和克隆估计器的类似实用程序一起使用。norm_orderK可输入非零整数正无穷负无穷默认值为1。载频鼓起的coef_属性高于一维的情况下用于过滤低于阈值的系数的向量的番薯的阶数。max_features在阈值设定下要选择的最大特征数。要禁用阈值并仅根据max_features选择请设置threshold -np.inf
前两个参数 estimator 和 threshold在实际应用过程中比较重要需要我们重点学习。以随机森林为例借助学习曲线帮助我们寻找最佳特征值。 from sklearn.feature_selection import SelectFromModelfrom sklearn.ensemble import RandomForestClassifier as RFCimport numpy as npimport matplotlib.pyplot as plt RFC_ RFC(n_estimators 10,random_state0)print(X_embedded.shape)#模型的维度明显被降低了#画学习曲线来找最佳阈值 RFC_.fit(X,y).feature_importances_threshold np.linspace(0,(RFC_.fit(X,y).feature_importances_).max(),20)score []for i in threshold:X_embedded SelectFromModel(RFC_,thresholdi).fit_transform(X,y)once cross_val_score(RFC_,X_embedded,y,cv5).mean()score.append(once)plt.plot(threshold,score)plt.show()X_embedded SelectFromModel(RFC_,threshold0.00067).fit_transform(X,y)X_embedded.shapeprint(cross_val_score(RFC_,X_embedded,y,cv5).mean()) 通过学习曲线我们可以得到一个最佳的阈值使得模型的分数达到 96%以上。因此嵌入法可以实现特征的选择。
4 Wrapper包装法
包装法也是一个特征选择和算法训练同时进行的方法与嵌入法十分相似它也是依赖于算法自身的选择比如coef_属性或feature_importances_属性来完成特征选择。但不同的是我们往往使用一个目标函数作为黑盒来帮助我们选取特征而不是自己输入某个评估指标或统计量的阈值。包装法在初始特征集上训练评估器并且通过coef_属性或通过feature_importances_属性获得每个特征的重要性。然后从当前的一组特征中修剪最不重要的特征。在修剪的集合上递归地重复该过程直到最终到达所需数量的要选择的特征。区别于过滤法和嵌入法的一次训练解决所有问题包装法要使用特征子集进行多次训练因此它所需要的计算成本是最高的。 图中的算法值得并不是我们最终涌过来导入数据的分类和回归算法即不是随机森林而是专业的数据挖掘算法即我们的目标函数。这些数据挖掘算法的核心功能就是选取最佳特征子集。
最典型的目标函数是递归特征消除法Recursive feature elimination,简写为RFE。它是一种贪婪的优化算法旨在找到性能最佳的特征子集。 它反复创建模型并在每次迭代时保留最佳特征或剔除最差特征下一次迭代时它会使用上一次建模中没有被选中的特征来构建下一个模型直到所有特征都耗尽为止。 然后它根据自己保留或剔除特征的顺序来对特征进行排名最终选出一个最佳子集。包装法的效果是所有特征选择方法中最利于提升模型表现的它可以使用很少的特征达到很优秀的效果。除此之外在特征数目相同时包装法和嵌入法的效果能够匹敌不过它比嵌入法算得更见缓慢所以也不适用于太大型的数据。相比之下包装法是最能保证模型效果的特征选择方法。 feature_selection.RFE class sklearn.feature_selection.RFE (estimator, n_features_to_selectNone, step1, verbose0) 参数说明estimator使用的模型评估器。n_feature_to_select所需特征数step每次迭代中希望移除的特征数
RFE类中有两个比较重要的属性.support_返回所有的特征的是否最后被选中的布尔矩阵以及.ranking_返回特征的按数次迭代中综合重要性的排名。类feature_selection.RFECV会在交叉验证循环中执行RFE以找到最佳数量的特征增加参数cv其他用法都和RFE一模一样。 import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.ensemble import RandomForestClassifier as RFCfrom sklearn.model_selection import cross_val_scorefrom sklearn.feature_selection import RFE data pd.read_csv(r./train.csv)x data.iloc[:,1:]y data.iloc[:,0]# print(x.shape)RFC_ RFC(n_estimators10,random_state0)score []for i in range(1,751,50): x_wrapper RFE(RFC_,n_features_to_selecti,step50).fit_transform(x,y) once cross_val_score(RFC_,x_wrapper,y,cv5).mean() score.append(once)plt.figure(figsize[20,5])plt.plot(range(1,751,50),score)plt.xticks(range(1,751,50))plt.show() 结果可以看到使用包装法之后只需要 50 个特征模型的表现就已经达到了 90% 以上比嵌入法和过滤法得到的特征子集要好很多。
5 总结
本文讲了过滤法、嵌入法和包装法三种特征选择方法。三种方法中过滤法最为简单快速需要的计算时间也最短但是也较为粗略实际应用过程中通常只作为数据的预处理剔除掉部分明显不需要的特征然后使用其他方法进一步特征选择。嵌入式和包装法更为精确更适合具体到算法中去调整。计算量也较大相应的运行时间也比较长。当数据量比较大时优先使用方差过滤和互信息法对数据进行预处理然后在使用其他的特征选择方法。使用逻辑回归时优先使用嵌入法。使用支持向量机时优先使用包装法。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/85849.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!