基于Python的机器学习特征选择技术
我们都可能面临这样的问题:从一组数据中识别相关特征并去除不相关或不太重要的特征,这些特征对我们的目标变量没有太大贡献,以便为我们的模型获得更好的准确性。
特征选择是机器学习的核心概念之一,它极大地影响了模型的性能。用于训练机器学习模型的数据功能会对您可以实现的性能产生巨大影响。不相关或部分相关的功能会对模型性能产生负面影响。特征选择和数据清理应该是模型设计的第一步,也是最重要的一步。
在这篇文章中,您将发现可以在机器学习中使用的特征选择技术。
特征选择的好处
- 减少过度拟合:减少冗余数据意味着根据噪声做出决策的机会减少。
- 提高准确度:减少误导性数据意味着提高建模精度。
- 减少训练时间:数据越少意味着算法训练越快。
特征选择方法:
我将分享易于使用的3种特征选择技术,并提供良好的结果。
- 单变量选择
- 特征重要性
- 热图与相关矩阵
机器学习测试数据集
您可以从这里下载数据集https://www.kaggle.com/iabhishekofficial/mobile-price-classification#train.csv
上述文件中的变量描述
- battery_power:电池一次可存储的总能量,单位为mAh
- blue:是否有蓝牙
- clock_speed:微处理器执行指令的速度
- dual_sim:是否支持双SIM卡
- fc:前置摄像头像素
- four_g:有没有4G
- int_memory:以GB为单位的内存
- m_dep:Mobile Depth in cm
- mobile_wt:手机重量
- n_cores:处理器的核心数
- pc:主摄像头像素
- px_height:像素分辨率高度
- px_width:像素分辨率宽度
- ram:以兆为单位的随机存取存储器
- sc_h:屏幕移动高度,单位为厘米
- sc_w:移动的屏幕宽度,单位为cm
- talk_time:单个电池充电的最长时间
- three_g:有没有3G
- touch_screen:是否有触摸屏
- wifi:有无线网络
- price_range:这是目标变量,其值为0(低成本),1(中等成本),2(高成本)和3(非常高成本)。
1.单变量选择
统计测试可用于选择与输出变量具有最强关系的那些特征。
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类的十大最佳特征
2.特征重要性
通过使用模型的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()
数据中十大最重要的特征
3.相关矩阵与热图
相关性说明了特征如何相互关联或与目标变量相关。
相关可以是正的(特征的一个值的增加会增加目标变量的值)或负的(特征的一个值的增加会减小目标变量的值)
热图可以轻松识别哪些特征与目标变量最相关,我们将使用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的相关性最小。
在本文中,我们主要介绍了如何使用单变量选择技术,特征重要性和相关矩阵从数据中选择相关特征。