我们知道模型的性能随着使用的特征数量的增加而增加。但是,当超过峰值时,模型性能会下降。这就是为什么我们只需要选择能够有效预测的特征。特征选择类似于降维技术,其目标是减少特征的数量,但从根本上说,它们是不同的。不同之处在于特征选择选择要保留或从数据集中删除的特征,而降维创建数据的投影,从而产生全新的输入特征。特征选择的方法有很多种,本文我将介绍Scikit-Learn中的5种方法,因为它们最简单但非常有用,让我们开始吧。1.VarianceThresholdFeatureSelection具有高方差的特征意味着该特征内的值变化很大,低方差意味着特征内的值相似,零方差意味着你有具有相同值的特征.方差选择法首先计算每个特征的方差,然后根据阈值选择方差大于阈值的特征。让我们用一个例子来说明:importpandasapdimportseabornassnsmpg=sns.load_dataset('mpg').select_dtypes('number')mpg.head()对于这个例子,为了简单起见,我只使用数字特征。在使用方差阈值特征选择之前,我们需要转换所有这些数值特征,因为方差受数值尺度的影响。fromsklearn.preprocessingimportStandardScalerscaler=StandardScaler()mpg=pd.DataFrame(scaler.fit_transform(mpg),columns=mpg.columns)mpg.head()所有的特征都在同一个尺度上,让我们尝试只选择我们想要的方差阈值方法所需的功能。假设我的方差仅限于一个方差。fromsklearn.feature_selectionimportVarianceThresholdselector=VarianceThreshold(1)selector.fit(mpg)mpg.columns[selector.get_support()]方差阈值是一种用于无监督学习的特征选择方法。如果我们希望选择特征用于监督学习怎么办?这就是我们接下来要讨论的。2.SelectKBestFeatureFeature单变量特征选择是一种基于单变量统计检验的方法,如:chi2、Pearson等。SelectKBest的前提是将未经验证的统计测试与根据X和y之间的统计结果选择K个数字的特征相结合。mpg=sns.load_dataset('mpg')mpg=mpg.select_dtypes('number').dropna()#DividethefeaturesintoIndependentandDependentVariableX=mpg.drop('mpg',axis=1)y=mpg['mpg']由于单变量特征选择方法旨在监督学习,因此我们将特征分为自变量和因变量。接下来,我们将使用SelectKBest,假设我只需要最重要的两个功能。fromsklearn.feature_selectionimportSelectKBest,mutual_info_regression#Selecttop2featuresbasedonmutualinforegressionselector=SelectKBest(mutual_info_regression,k=2)selector.fit(X,y)X.columns[selector.get_support()]3.RecursiveFeatureElimination(RFE)递归特征消除或RFE是一种特征选择方法利用机器学习模型通过在递归训练后消除最不重要的特征来选择特征。根据Scikit-Learn的说法,RFE是一种通过递归地考虑越来越小的特征集来选择特征的方法。首先在初始特征集上训练估计器,然后通过coef_attribute或feature_importances_attribute得到每个特征的重要性。然后从当前特征中删除最不重要的特征。这个过程在修剪后的数据集上递归重复,直到最终达到需要选择的特征数量。在此示例中,我想将泰坦尼克号数据集用于分类问题,我想在其中预测谁会幸存。#Loadthedatasetandonlyselectingthenumericalfeaturesforexamplepurposesestitanic=sns.load_dataset('titanic')[['survived','pclass','age','parch','sibsp','fare']].dropna()X=titanic.drop('survived',axis=1)y=titanic['survived']我想看看哪些特征最能帮助我预测谁能在泰坦尼克号事件中幸存下来。让我们使用LogisticRegression模型获得最佳特征。fromsklearn.feature_selectionimportRFFromsklearn.linear_modelimportLogisticRegression##SelectingtheBestimportantfeaturesaccordingtoLogisticRegressionrfe_selector=RFE(estimator=LogisticRegression(),n_features_to_select=2,step=1)rfe_selector.fit(X,y)X.columns[rfe_selector.get_support()]默认情况下,渲染为RFE特征个数为所有特征的中位数,步长为1。当然你可以根据自己的经验进行更改。4.SelectFromModel特征选择Scikit-Learn的SelectFromModel用于机器学习模型对所选特征的估计,它是基于重要性属性阈值。默认情况下,阈值是平均值。让我们使用一个示例数据集来更好地理解这个概念。我将使用以前的数据。fromsklearn.feature_selectionimportSelectFromModelsfm_selector=SelectFromModel(estimator=LogisticRegression())sfm_selector.fit(X,y)X.columns[sfm_selector.get_support()]和RFE一样,你可以使用任何机器学习模型来选择特征,只要它可以称为估计特征重要性。您可以使用随机森林或XGBoost进行尝试。5.顺序特征选择(SFS)顺序特征选择是一种基于交叉验证分数和估计量向前或向后寻找最佳特征的贪婪算法。这是Scikit-Learn0.24版中的一项新功能。方法如下:SFS-Forward从零个特征开始进行特征选择,并在单个特征上训练机器学习模型时找到使交叉验证得分最大化的特征。选择第一个特征后,通过向所选特征添加新特征来重复该过程。当我们找到所需数量的功能时,该过程将停止。让我们用一个例子来说明。fromsklearn.feature_selectionimportSequentialFeatureSelectorsfs_selector=SequentialFeatureSelector(estimator=LogisticRegression(),n_features_to_select=3,cv=10,direction='backward')sfs_selector.fit(X,y)X.columns[sfs_selector.get_support()]结论特征的一个重要方面模型,对模型无用的特征,不仅影响模型的训练速度,还会影响模型的效果。
