Evan 2018-10-28
我们都可能面临这样的问题:从一组数据中识别相关特征并去除不相关或不太重要的特征,这些特征对我们的目标变量没有太大贡献,以便为我们的模型获得更好的准确性。
特征选择是机器学习的核心概念之一,它极大地影响了模型的性能。用于训练机器学习模型的数据功能会对您可以实现的性能产生巨大影响。不相关或部分相关的功能会对模型性能产生负面影响。特征选择和数据清理应该是模型设计的第一步,也是最重要的一步。
在这篇文章中,您将发现可以在机器学习中使用的特征选择技术。
我将分享易于使用的3种特征选择技术,并提供良好的结果。
您可以从这里下载数据集https://www.kaggle.com/iabhishekofficial/mobile-price-classification#train.csv
上述文件中的变量描述
统计测试可用于选择与输出变量具有最强关系的那些特征。
scikit-learn库提供SelectKBest类,可以与一组不同的统计测试一起使用,以选择特定数量的特征。
以下示例使用非负特征的卡方(chi²)统计检验从Mobile 价格范围预测数据集中选择10个最佳特征。
import pandas as pd import numpy as np from sklearn.feature_selection import SelectKBest from sklearn.feature_selection import chi2 data = pd.read_csv("D://Blogs//train.csv") X = data.iloc[:,0:20] #independent columns y = data.iloc[:,-1] #target column i.e price range #apply SelectKBest class to extract top 10 best features bestfeatures = SelectKBest(score_func=chi2, k=10) fit = bestfeatures.fit(X,y) dfscores = pd.DataFrame(fit.scores_) dfcolumns = pd.DataFrame(X.columns) #concat two dataframes for better visualization featureScores = pd.concat([dfcolumns,dfscores],axis=1) featureScores.columns = ['Specs','Score'] #naming the dataframe columns print(featureScores.nlargest(10,'Score')) #print 10 best features
使用SelectKBest类的十大最佳特征
通过使用模型的feature importance属性,可以获得数据集的每个特征的特征重要性。
功能重要性为您提供数据每个功能的分数,分数越高,输出变量的特征就越重要或越相关。
在基于树的分类器附带的内置类中具有重要性,我们将使用额外树分类器来提取数据集的前10个特征。 Python代码如下:
import pandas as pd import numpy as np data = pd.read_csv("D://Blogs//train.csv") X = data.iloc[:,0:20] #independent columns y = data.iloc[:,-1] #target column i.e price range from sklearn.ensemble import ExtraTreesClassifier import matplotlib.pyplot as plt model = ExtraTreesClassifier() model.fit(X,y) #use inbuilt class feature_importances of tree based classifiers print(model.feature_importances_) #plot graph of feature importances for better visualization feat_importances = pd.Series(model.feature_importances_, index=X.columns) feat_importances.nlargest(10).plot(kind='barh') plt.show()
数据中十大最重要的特征
相关性说明了特征如何相互关联或与目标变量相关。
相关可以是正的(特征的一个值的增加会增加目标变量的值)或负的(特征的一个值的增加会减小目标变量的值)
热图可以轻松识别哪些特征与目标变量最相关,我们将使用seaborn库绘制相关特征的热图。
import pandas as pd import numpy as np import seaborn as sns data = pd.read_csv("D://Blogs//train.csv") X = data.iloc[:,0:20] #independent columns y = data.iloc[:,-1] #target column i.e price range #get correlations of each features in dataset corrmat = data.corr() top_corr_features = corrmat.index plt.figure(figsize=(20,20)) #plot heat map g=sns.heatmap(data[top_corr_features].corr(),annot=True,cmap="RdYlGn")
我们来看看价格区间与其他特征的相关性如何,ram与价格区间高度相关,其次是电池电量、像素高度和宽度,而m_dep、clock_speed和n_core与price_range的相关性最小。
在本文中,我们主要介绍了如何使用单变量选择技术,特征重要性和相关矩阵从数据中选择相关特征。