随着深度学习的蓬勃发展,越来越多的小伙伴开始尝试构建深度神经网络并将其应用到工作场景中,以为只需要将数据放入模型并调优模型参数就可以做出模型利用自身机制选择重要的特征,输出更好的数据结果。在实际工作场景中,数据和时间有限,这样的做法其实不可取。一方面,大量的数据输入会导致模型训练周期的增加。另一方面,在当前的细分市场中,并非所有场景都有海量数据。在海量数据中寻找重要特征迫在眉睫。在这篇文章中,我将教大家三种特征选择的方法,任何想在数据科学领域工作的人都应该知道。论文结构如下:DatasetLoadingandPreparationMethod1:GetFeatureImportancefromCoefficients方法2:GetFeatureImportancefromTreeModel方法3:GetFeatureImportancefromPCAscores结论DatasetLoadingandPreparation为了便于展示,我是在此处使用Scikit-Learn中内置的“load_breast_cancer”数据集。以下代码片段演示了如何导入库和加载数据集:']=FalsercParams['axes.spines.top']=False#Loaddatadata=load_breast_cancer()调用以下代码并输出结果。df=pd.concat([pd.DataFrame(data.data,columns=data.feature_names),pd.DataFrame(data.target,columns=['y'])],axis=1)df.head()同上数据中有30个特征变量和1个目标变量。所有值都是数字,没有缺失值。在解决缩放问题之前,还需要进行train、testsplit。fromsklearn.preprocessingimportStandardScalerfromsklearn.model_selectionimporttrain_test_splitX=df.drop('y',axis=1)y=df['y']X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=42)ss=StandardScaler()X_train_scaled=ss.fit_transform(X_train)X_test_scaled=ss.transform(X_test)方法1:从系数获取特征重要性检查特征重要性的最简单方法是检查模型的系数。例如,线性回归和逻辑回归都归结为一个方程,其中一个系数(重要性)被分配给每个输入值。简单地说,如果分配的系数是一个很大的(负或正)数,它会对预测产生一些影响。相反,如果系数为零,则对预测没有影响。逻辑很简单,我们来测试一下,逻辑回归是一个合适的算法。拟合模型后,系数存储在属性coef_中。fromsklearn.linear_modelimportLogisticRegressionmodel=LogisticRegression()model.fit(X_train_scaled,y_train)importances=pd.DataFrame(data={'Attribute':X_train.columns,'Importance':model.coef_[0]})importances=importances.sort_values(by='Importance',ascending=False)#visualizationplt.bar(x=importances['Attribute'],height=importances['Importance'],color='#087E8B')plt.title('Featureimportancesobtainedfromcoefficients',size=20)plt.xticks(rotation='vertical')plt.show()下面是对应的可视化效果:这种方法最大的特点:“简单”和“高效”。系数越大(正向和负向),对预测的影响越大。方法2:从树模型中获取重要性在训练任何树模型后,您可以访问feature_importances属性。这是获得特征重要性的最快方法之一。以下代码演示了如何导入模型并将模型拟合到训练数据上,并获取重要性:fromxgboostimportXGBClassifiermodel=XGBClassifier()model.fit(X_train_scaled,y_train)importances=pd.DataFrame(data={'Attribute':X_train.columns,'Importance':model.feature_importances_})importances=importances.sort_values(by='Importance',ascending=False)#visualizationplt.bar(x=importances['Attribute'],height=importances['Importance'],color='#087E8B')plt.title('Featureimportancesobtainedfromcoefficients',size=20)plt.xticks(rotation='vertical')plt.show()对应的可视化效果如下:方法三:从中获取特征PCA得分重要性主成分分析(PCA)是一种出色的降维技术,也可用于确定特征的重要性。PCA不像前两种技术那样直接揭示最重要的特征。相反,它将返回N个主成分,其中N等于原始特征的数量。fromsklearn.decompositionimportPCApca=PCA().fit(X_train_scaled)#可视化plt.plot(pca.explained_variance_ratio_.cumsum(),lw=3,color='#087E8B')plt.title('Cumulativeexplainedvariancebynumberofprincipalcomponents',size=20)plt.show()但那是什么意思呢?这意味着您可以使用前五个主成分解释源数据集中90%的方差。同样,如果您不知道这意味着什么,请继续阅读。loadings=pd.DataFrame(data=pca.components_.T*np.sqrt(pca.explained_variance_),columns=[f'PC{i}'foriinrange(1,len(X_train.columns)+1)],index=X_train.columns)loadings.head()第一个主要组件至关重要。它只是一个特征,但它解释了数据集中超过60%的方差。从上图可以看出,它与平均半径特征的相关系数接近0.8,属于强正相关。让我们可视化所有输入特征和第一主成分之间的相关性。这是整个代码片段(包括可视化):pc1_loadings=loadings.sort_values(by='PC1',ascending=False)[['PC1']]pc1_loadings=pc1_loadings.reset_index()pc1_loadings.columns=['Attribute','CorrelationWithPC1']plt.bar(x=pc1_loadings['Attribute'],height=pc1_loadings['CorrelationWithPC1'],color='#087E8B')plt.title('PCAloadingscores(firstprincipalcomponent)',size=20)plt.xticks(rotation='vertical')plt.show()这是“破解”PCA的方法,将其用作特征重要性。结论以上总结得出机器学习特征重要性的三种方法,可以根据场景灵活运用。如果你对机器学习感兴趣,可以关注我。
