当前位置: 首页 > news >正文

人力资源公司注册条件北京seo服务商找行者seo

人力资源公司注册条件,北京seo服务商找行者seo,建设厅特种作业,做网站建设的好处特征选择是特征工程中的一个子集#xff0c;从所有的特征中#xff0c;选择有意义的#xff0c;对模型有帮助的特征#xff0c;以避免将所有特征中对模型没作用的特征导入模型去训练#xff0c;消耗不必要的计算资源。更正式地说#xff0c;给定n个特征#xff0c;我们搜… 特征选择是特征工程中的一个子集从所有的特征中选择有意义的对模型有帮助的特征以避免将所有特征中对模型没作用的特征导入模型去训练消耗不必要的计算资源。更正式地说给定n个特征我们搜索其中包括k(k特征选择之前一定要理解数据中特征的含义可以先从业务上就能剔除一些不必要的特征然后再进行技术上的特征选择。特征选择方法有很多接下来主要介绍以下几种特征选择方法一、Filter过滤法1、方差过滤通过数据本身的方差来筛选特征。比如有一个特征本身的方差很小就表示样本在这个特征上基本没有差异可能特征中的大多数值都一样甚至整个特征的取值都相同那这个特征对于样本区分是没有作用的。因此首先需要去除样本中方差为0的特征。在sklearn.feature_selection模块中的VarianceThreshold类是用来做方差特征选择的。其中的threshold参数是控制过滤方差的阈值默认是0。我们可以控制这个参数来选择要去掉方差是多少的特征。from sklearn.feature_selection import VarianceThresholdselector VarianceThreshold()X_var selector.fit_transform(X)threshold阈值设置对模型训练的影响阈值很小被过滤的特征比较少阈值较大被过滤的特征很多模型表现不会有太大影响可能变更好代表被过滤掉的特征大部分是噪音也可能变糟糕代表被过滤的特征中很多都是有效特征运行时间可能降低模型的运行时间基于方差很小的特征有多少当方差很小的特征不多时对模型没有太大影响一定能降低模型的运行时间算法在遍历特征时的计算越复杂运行时间下降得越多案例# 选用集成算法随机森林和邻近算法KNN分别在方差过滤前和方差过滤后运行效果和运行时间的对比from sklearn.ensemble import RandomForestClassifier as RFCfrom sklearn.neighbors import KNeighborsClassifier as KNNfrom sklearn.model_selection import cross_val_scorefrom sklearn.feature_selection import VarianceThresholdimport numpy as npX data.iloc[:, 1:]y data.iloc[:,0]# 进行方差过滤时阈值设置为中位数X_var VarianceThreshold(np.median(X.var().values)).fit_transform(X)# KNN方差过滤之前的训练cross_val_score(KNN(),X,y,cv5).mean() # 运行时间比较长# KNN方差过滤之后的训练cross_val_score(KNN(),X_var,y,cv5).mean() # 运行时间比较长对于KNN过滤后的运行效果准确率提升了一点点训练时间减少很多。# 随机森林方差过滤之前的训练cross_val_score(RFC(n_estimators10,random_state0),X,y,cv5).mean()# 随机森林方差过滤之后的训练cross_val_score(RFC(n_estimators10,random_state0),X_var,y,cv5).mean()对于随机森林过滤后的运行效果准确率提升了一点点训练时间差不多。因为随机森林训练速度本身就非常快。案例中使用的方差阈值是特征方差的中位数阈值设置的比较大属于过滤掉的特征比较多的情况。从运行结果来看无论是KNN还是随机森林在过滤掉一半特征之后模型的精确度都有所上升。这说明被过滤掉的特征在当前随机模式(random_state 0)下大部分是噪音。那么可以保留这个去掉了一半特征的数据来为之后的特征选择做准备。如果过滤之后模型的效果反而变差了则可以认为被我们过滤掉的特征中有很多有效特征因此需要放弃过滤使用其他手段来进行特征选择。为什么随机森林运行如此之快? 为什么方差过滤对随机森林没很大的有影响?这是由于两种算法的原理中涉及到的计算量不同。最近邻算法KNN单棵决策树支持向量机SVM神经网络回归算法都需要遍历特征或升维来进行运算所以他们本身的运算量就很大需要的时间就很长因此方差过滤这样的特征选择对他们来说就尤为重要。但对于不需要遍历特征的算法比如随机森林它随机选取特征进行分枝本身运算就非常快速因此特征选 择对它来说效果平平。这其实很容易理解无论过滤法如何降低特征的数量随机森林也只会选取固定数量的特征 来建模;而最近邻算法就不同了特征越少距离计算的维度就越少模型明显会随着特征的减少变得轻量。因此过滤法的主要对象是:需要遍历特征或升维的算法们而过滤法的主要目的是:在维持算法表现的前提下帮 助算法们降低计算成本。为什么过滤法对随机森林无效却对树模型有效?从算法原理上来说传统决策树需要遍历所有特征计算不纯度后进行分枝而随机森林却是随机选择特征进 行计算和分枝因此随机森林的运算更快过滤法对随机森林无用对决策树却有用。在sklearn中决策树和随机森林都是随机选择特征进行分枝(不记得的小伙伴可以去复习第一章:决策树 参数random_state)但决策树在建模过程中随机抽取的特征数目却远远超过随机森林当中每棵树随机抽取 的特征数目(比如说对于这个780维的数据随机森林每棵树只会抽取10~20个特征而决策树可能会抽取 300~400个特征)因此过滤法对随机森林无用却对决策树有用。在sklearn中随机森林中的每棵树都比单独的一棵决策树简单得多高维数据下的随机森林的计算 比决策树快很多。2、 相关性过滤相关性主要是评判特征之间以及特征和标签之间的相关性去除特征之间的相关性主要是因为诸如线性回归之类的模型训练时特征之间相关产生共线性的问题而影响模型效果。去除与标签不相关的特征主要是因为如果特征与标签无关那只会白白浪费我们的计算内存可能还会给模型带来噪声。在sklearn中常用评判特征与标签之间相关性的方法有卡方、F检验、互信息。常用评判特征之间的相关性的方法有pearson相关系数。卡方过滤卡方过滤是专门针对离散型标签(即分类问题)的相关性过滤。在chi2计算每个非负特征和标签之间的卡方统计量并依照卡方统计量由高到低为特征排名。然后再结合SelectBest这个可以输入“评分标准”的类来选出前K个分数最高的特征即去除最可能独立于标签与分类目的无关的特征。当卡方检验检测到某个特征中所有的值都相同会提示我们使用方差先进行方差过滤。所以在做卡方相关性过滤之前要选使用方差过滤筛选一遍。from sklearn.feature_selection import SelectKBestfrom sklearn.feature_selection import chi2from sklearn.model_selection import cross_val_score# X_var是方差过滤掉特征之后的特征矩阵X_chi SelectKBest(chi2, k300).fit_transform(X_var, y)cross_val_score(RFC(n_estimators100, random_state0), X_chi, y, cv5).mean()结果显示模型效果降低了这说明我们在设定k300的时候删除了与模型相关且有效的特征我们的K值设置得太小要么我们需要调整K值要么我们必须放弃相关性过滤。当然如果模型的表现提升则说明我们的相关性过滤是有效的是过滤掉了模型的噪音的这时候我们就保留相关性过滤的结果。参数k的设置可以使用学习曲线进行选择import matplotlib.pyplot as pltscore []for i in range(390, 200, -10):  X_chi  SelectKBest(chi2, ki).fit_transform(X_var, y)  once cross_val_score(RFC(n_estimators100,random_state0), X_chi, y, cv5).mean()  score.append(once)plt.plot(range(390, 200, -10), score)plt.show() 代码运行结果由图可知随着k值的不断增加模型的表现不断上升这说明k越大越好数据中所有的特征都与标签相关但是这种选择k值的代码运行时间非常长。下面一种更好的设置k值的方法根据p值来选择k卡方检验的本质是推测两组数据之间的差异其检验的原假设是”两组数据是相互独立的”。卡方检验返回卡方值和 P值两个统计量其中卡方值很难界定有效的范围而p值我们一般使用0.01或0.05作为显著性水平即p值判断 的边界具体我们可以这样来看:p值0.05或0.010.05或0.01数据差异差异不是自然形成的这些差异是很自然的样本误差相关性两组数据是相关的两组数据是相互独立的原假设拒绝原假设接受备择假设接受原假设从特征工程的角度我们希望选取卡方值很大p值小于0.05的特征即和标签是相关联的特征。而调用 SelectKBest之前我们可以直接从chi2实例化后的模型中获得各个特征所对应的卡方值和P值。chi_val, p_val_chi chi2(X_var,y)# k取多少?我们想要消除所有p值大于设定值比如0.05或0.01的特征:k chi_val.shape[0] - (p_val_chi 0.05).sum()# X_chi SelectKBest(chi2, k填写具体的k).fit_transform(X_var, y) # cross_val_score(RFC(n_estimators10,random_state0),X_chi,y,cv5).mean()从结果看所有特征的p值都是0说明digit_recognizor这个数据集方差验证已经把所有和标签无关的特征都剔除了或者这个数据集本身就不含与标签无关的特征。因此舍弃任何一个特征都会舍弃对模型有用的信息而使模型表现下降因此在我们对计算速度感到满意时我们不需要使用相关性过滤来过滤我 们的数据。如果我们认为运算速度太缓慢那我们可以酌情删除一些特征但前提是必须牺牲模型的表现。F检验F检验又称方差齐性检验是用来捕捉每个特征与标签之间的线性关系的过滤方法。它即可以做回归也可以做分类因此sklearn.feature_selection中包含f_classif(F检验分类)和f_regression(F检验回归)两个类。其中F检验分类用于标签是离散型变量的数据而F检验回归用于标签是连续型变量的数据。这两个类也需要和类SelectKBest连用并且我们也可以直接通过输出的统计量来设置最佳K值。需要注意的是F检验在数据服从正态分布时效果会非常稳定因此如果使用F检验过滤需要先将数据转换成服从正态分布。F检验的本质是寻找两组数据之间的线性关系其原假设是”数据不存在显著的线性关系“。它返回F值和p值两个统 计量。和卡方过滤一样我们希望选取p值小于0.05或0.01的特征这些特征与标签时显著线性相关的而p值大于 0.05或0.01的特征则被我们认为是和标签没有显著线性关系的特征应该被删除。以F检验的分类为例做特征选择from sklearn.feature_selection import f_classifF, p_val f_classif(X_var, y)k F.shape[0] - (p_val 0.05).sum()# X_F SelectKBest(f_classif, k填写具体的k值).fit_transform(X_var, y)# cross_val_score(RFC(n_estimators10,random_state0),X_F,y,cv5).mean()结果和卡方过滤得到的结果一模一样没有任何特征的p值大于0.01 所有的特征都是和标签相关的因此不需要相关性过滤互信息过滤互信息是用来捕捉每个特征与标签之间的任意关系(包括线性和非线性关系)的过滤方法。和F检验相似它既可以做回归也可以做分类也包含mutual_info_classif(互信息分类)和 mutual_info_regression(互信息回归)两个类。用法和参数都与F检验一模一样不过互信息比F检验更加强大F检验只能够找出线性关系而互信息可以找出任意关系。互信息不返回p值或F值类似的统计量它返回“每个特征与目标之间的互信息量的估计”这个估计量在[0,1]之间为0则表示两个变量独立为1则表示两个变量完全相关。以互信息分类为例的代码如下:from sklearn.feature_selection import mutual_info_classif as MICresult MIC(X_var, y)k result.shape[0] - sum(result 0)# X_mic SelectKBest(MIC, k填写具体的k值).fit_transform(X_var, y)# cross_val_score(RFC(n_estimators10, random_state0), X_mic, y, cv5).mean()所有特征的互信息量估计都大于0说明所有特征都与标签相关。无论是F检验还是互信息法大家也都可以使用学习曲线只是使用统计量的方法会更加高效。当统计量判断已经没有特征可以删除时无论用学习曲线如何跑删除特征都只会降低模型的表现。而如果数据量太庞大模型太复杂还是可以牺牲模型表现来提升模型速度。一般情况下先使用方差过滤然后使用互信息来捕捉相关性下面是各个类的总结类描述超参数的选择VarianceThreshold方差过滤可输入方差阈值控制特征选择返回方差大于阈值的新特征矩阵看具体数据究竟是含更多噪声还是更多有效特征一般就使用0或1来筛选也可以画学习曲线或取中位数跑模型来帮助确认SelectKBest用来选取K个统计量结果最佳的特征生成符合统计量要求的新特征矩阵看配合使用的统计量chi2卡方检验专用于分类算法捕捉相关性追求p值小于显著水平的特征f_classifF检验分类只能捕捉线性相关性要求数据服从正态分布追求p值小于显著水平的特征f_regressionF检验回归只能捕捉线性相关性要求数据服从正态分布追求p值小于显著水平的特征mutual_info_classif互信息分类可以捕捉任何相关性不能用于稀疏矩阵追求互信息估计大于0的特征mutual_info_regression互信息回归可以捕捉任何相关性不能用于稀疏矩阵追求互信息估计大于0的特征二、Embedded嵌入法嵌入法是一种让算法自己决定使用那些特征的方法即特征选择和算法训练同时进行。在使用嵌入法时我们先使用某些机器学习的算法和模型进行训练得到各个特征的权值系数根据权值系数从大到小选择特征。这些权值系 数往往代表了特征对于模型的某种贡献或某种重要性比如决策树和树的集成模型中的feature_importances_属 性可以列出各个特征对树的建立的贡献我们就可以基于这种贡献的评估找出对模型建立最有用的特征。因此 相比于过滤法嵌入法的结果会更加精确到模型的效用本身对于提高模型效力有更好的效果。并且由于考虑特征对模型的贡献因此无关的特征(需要相关性过滤的特征)和无区分度的特征(需要方差过滤的特征)都会因为缺乏对模型的贡献而被删除掉可谓是过滤法的进化版。嵌入法整个流程为过滤法中使用的统计量可以使用统计知识和常识来查找范围(如p值应当低于显著性水平0.05)而嵌入法中使用的权值系数却没有这样的范围可找——我们可以说权值系数为0的特征对模型丝毫没有作用但当大量特征都对模型有贡献且贡献不一时我们就很难去界定一个有效的临界值。这种情况下模型权值系数就是我们的超参数 我们或许需要学习曲线或者根据模型本身的某些性质去判断这个超参数的最佳值究竟应该是多少。另外嵌入法引入了算法来挑选特征因此其计算速度也会和应用的算法有很大的关系。如果采用计算量很大计 算缓慢的算法嵌入法本身也会非常耗时耗力。并且在选择完毕之后我们还是需要自己来评估模型。在sklearn.feature_selection模块中SelectFromModel类嵌入法class sklearn.feature_selection.SelectFromModel(estimator, thresholdNone, prefitFalse, norm_order1, max_featuresNone)类的参数说明具体如下表并且一般重点关注前两个参数的设置parameterdescriptionestimator使用的模型评估器只要是带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.infSelectFromModel是一个元变换器可以与任何在拟合后具有coef_feature_importances_属性或参数中可选惩 罚项的评估器一起使用(比如随机森林和树模型就具有属性feature_importances_逻辑回归就带有l1和l2惩罚 项线性支持向量机也支持l2惩罚项)。对于有feature_importances_的模型来说若重要性低于提供的阈值参数则认为这些特征不重要并被移除。feature_importances_的取值范围是[0,1]如果设置阈值很小比如0.001就可以删除那些对标签预测完全没贡 献的特征。如果设置得很接近1可能只有一两个特征能够被留下。使用惩罚项的模型的嵌入法对于使用惩罚项的模型来说正则化惩罚项越大特征在模型中对应的系数就会越小。当正则化惩罚项大到 一定的程度的时候部分特征系数会变成0当正则化惩罚项继续增大到一定程度时所有的特征系数都会趋 于0。但是我们会发现一部分特征系数会更容易先变成0这部分系数就是可以筛掉的。也就是说我们选择 特征系数较大的特征。另外支持向量机和逻辑回归使用参数C来控制返回的特征矩阵的稀疏性参数C越小返回的特征越少。Lasso回归用alpha参数来控制返回的特征矩阵alpha的值越大返回的特征越少。from sklearn.feature_selection import SelectFromModelfrom sklearn.ensemble import RandomForestClassifier as RFCrfc RFC(n_estimators10, random_state0)X_embedded SelectFromModel(rfc, threshold0.005).fit_transform(X,y)这里只取出来有限的特征。0.005这个阈值对于有780个特征的数据来说是非常高的阈值因为平均每个特征只能够分到大约0.001的feature_importances_#同样的我们也可以画学习曲线来找最佳阈值import numpy as npimport matplotlib.pyplot as pltrfc.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()代码运行结果随着阈值越来越高模型的效果逐渐变差被删除的特征越来越多信息损失的就越多我们可以选择一个模型效果维持比较高的最大的阈值threshold来进一步画学习曲线。score2 []for i in np.linspace(0, threshold,20): X_embedded SelectFromModel(rfc, thresholdi).fit_transform(X, y) once cross_val_score(rfc, X_embedded, y, cv5).mean() score2.append(once)plt.figure(figsize(20,5))plt.plot(np.linspace(0, threshold,20), score2)plt.xtickets(np.linspace(0, threshold,20))plt.show()在嵌入法下我们很容易就能够实现特征选择的目标:减少计算量提升模型表现。因此比起要思考很多统计量的过滤法来说嵌入法可能是更有效的一种方法。然而在算法本身很复杂的时候过滤法的计算远远比嵌入法要 快所以大型数据中我们还是会优先考虑过滤法。三、Wrapper包装法包装法也是一个特征选择和算法训练同时进行的方法与嵌入法十分相似它也是依赖于算法自身的选择比如 coef_属性或feature_importances_属性来完成特征选择。但不同的是我们往往使用一个目标函数作为黑盒来帮 助我们选取特征而不是自己输入某个评估指标或统计量的阈值。包装法在初始特征集上训练评估器并且通过 coef_属性或通过feature_importances_属性获得每个特征的重要性。然后从当前的一组特征中修剪最不重要的 特征。在修剪的集合上递归地重复该过程直到最终到达所需数量的要选择的特征。区别于过滤法和嵌入法的一次 训练解决所有问题包装法要使用特征子集进行多次训练因此它所需要的计算成本是最高的。注意在这个图中的“算法”指的不是我们最终用来导入数据的分类或回归算法(即不是随机森林)而是专业的数据挖掘算法即我们的目标函数。这些数据挖掘算法的核心功能就是选取最佳特征子集。最典型的目标函数是递归特征消除法(Recursive feature elimination, 简写为RFE)。它是一种贪婪的优化算法 旨在找到性能最佳的特征子集。它反复创建模型并在每次迭代时保留最佳特征或剔除最差特征下一次迭代时 它会使用上一次建模中没有被选中的特征来构建下一个模型直到所有特征都耗尽为止。然后它根据自己保留或剔除特征的顺序来对特征进行排名最终选出一个最佳子集。包装法的效果是所有特征选择方法中最利于提升模型表现的它可以使用很少的特征达到很优秀的效果。除此之外在特征数目相同时包装法和嵌入法的效果能够匹敌不过它比嵌入法算得更见缓慢所以也不适用于太大型的数据。相比之下包装法是最能保证模型效果的特征选择方法。在sklearn.feature_selection模块中有RFE的实现class sklearn.feature_selection.RFE(estimator, n_features_to_selectNone, step1, verbose0)参数parameterdescriptionestimator使用的模型评估器n_features_to_select想要选择的特征个数step每次迭代中希望移除的特征个数verbose控制输入冗长重要属性attributiondescriptionsupport_返回所有的特征的是否最后被选中的布尔矩阵ranking_返回特征的按数次迭代中综合重要性的排名from sklearn.feature_selection import RFEfrom sklearn.ensemble import RandomForestClassifier as RFCrfc RFC(n_estimators 10,random_state0)selector RFE(rfc, n_features_to_select340, step50).fit(X, y)selector.support_.sum()selector.ranking_X_wrapper selector.transform(X) cross_val_score(rfc,X_wrapper,y,cv5).mean()# 画学习曲线score []select_list range(1,751,50)for i in select_list: 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(select_list,score) plt.xticks(select_list) plt.show()四、总结以上只是介绍特征选择方法一部分每种方法的原理都不同并且都涉及到不同调整方法的超参数。一般来说过滤法更快速但更粗糙。包装法和嵌入法更精确比较适合具体到算法去调整但计算量比较大运行时间长。当数据量很大的时候优先使用方差过滤和互信息法调整再上其他特征选择方法。使用逻辑回归时优先使用嵌入法。使用支持向量机时优先使用包装法。迷茫的时候从过滤法走起看具体数据具体分析。特征选择只是特征工程中的一小步。更高级的方法往往是使用特征创造或特征提取来寻找高级特征。在Kaggle之 类的算法竞赛中很多高分团队都是在高级特征上做文章而这是比调参和特征选择更难的。特征工程非常深奥需要在工作学习中不断积累。
http://www.zqtcl.cn/news/447169/

相关文章:

  • 相城区住房建设局网站做网站开发电脑配置
  • 成都网站建设制作photoshop网页制作视频教程
  • 深圳网站做的好的公司广州外贸营销网站建设公司
  • 网站你懂我意思正能量晚上不用下载直接进入微信公众号免费模板素材网站
  • 网站设计模板之家南宁seo外包平台
  • 免费舆情网站遵义市双控体系建设网站
  • 企业做网站得多少钱wordpress get_posts
  • 轻淘客网站怎么做申请个人网址
  • 新的网站的建设步骤购物网站首页源码
  • 龙岗网站建设费用明细中山 灯饰 骏域网站建设专家
  • 做catalog的免费网站网站开发一般采用什么框架
  • 网站建设海淀区网站特殊字体
  • 电子商务网站建设情况国风网页设计欣赏
  • 海拉尔网站建设+网站设计徐州模板建站定制网站
  • 做网站诱导充值犯法吗折叠分类目录模板wordpress
  • 企业网站建设的平台怎样建网站买东西
  • 免费推广工具有哪些上海优化营商环境
  • 模板网站怎么修改下载的字体如何安装到wordpress
  • 中国建设资格注册中心网站杭州市建设信用网官网
  • 国外网站搭建平台wordpress+行间距插件
  • 做网站买那种服务器wordpress商店插件
  • dw网站开发流程做影视网站怎么
  • 建好的网站在哪里免费的app软件大全
  • 建设银行信用卡境外网站盗刷电子商务专业是学什么的
  • asp.net做电商网站设计徐州做网站费用
  • 网站怎么发布做微商wordpress 主页显示多图
  • 国外做宠物用品的网站安徽网新科技有限公司官网
  • 辣条类网站建设规划书南阳网站推广优化公司
  • 帝国网站做地域标签seo关键词排名查询
  • 西安网站建设xs029免费代理ip最新