Python中的特征选择介绍

299 阅读4分钟

这篇文章有点偏向于高级。我们将讨论Python中用于训练机器学习模型的特征选择。从数据集中找出重要的特征,并剔除那些不能提高模型准确性的不太重要的特征,这一点很重要。

不相关或只有部分相关的特征会损害模型的性能。模型设计的第一个也是最关键的阶段应该是特征选择和数据清理。

特征选择是机器学习中的一个基本概念,对你的模型性能有重大影响。在这篇文章中,你将学习如何在机器学习中采用特征选择策略。

让我们开始吧!

首先,让我们了解什么是特征选择。

什么是特征选择?

你的数据中存在不相关的特征会降低模型的准确性,导致你的模型基于不相关的特征进行训练。特征选择是指自动或手动选择对你感兴趣的预测变量或输出贡献最大的特征的过程。

为什么我们要对我们的模型进行特征选择?

以下是在机器学习模型上进行特征选择的一些好处。

  • 提高模型的准确度。 由于误导性数据的减少,模型的准确性得到了提高。
  • 减少过拟合。随着冗余数据的减少,基于噪音做出结论的机会也就减少了。
  • 减少训练时间。由于数据点较少,算法复杂性降低,算法训练速度加快。

当你对一个模型进行特征选择时,它的准确度就会大幅提高。

进行特征选择的方法

有三种常用的特征选择方法,它们易于执行并产生良好的结果:

  1. 单变量选择
  2. 特征重要性
  3. 相关矩阵与热图

让我们通过一个例子来仔细看看这些方法。

1.单变量选择

可以通过统计检验来确定哪些属性与输出变量的联系最强。scikit-learn库中的SelectKBest类可以和各种统计检验一起使用,以选择一定数量的特征。

在下面的例子中,对非负数特征的chi-squared(chi2)统计测试被用来从移动价格范围预测数据集中选择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("C://Users//Intel//Documents//mobile_price_train.csv")
X = data.iloc[:,0:20]  #independent variable columns
y = data.iloc[:,-1]    #target variable column (price range)

#extracting top 10 best features by applying SelectKBest class
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
featureScores = pd.concat([dfcolumns,dfscores],axis=1)
featureScores.columns = ['Specs','Score']  #naming the dataframe columns
print(featureScores.nlargest(10,'Score'))  #printing 10 best features

输出

Specs          Score
13            ram  931267.519053
11      px_height   17363.569536
0   battery_power   14129.866576
12       px_width    9810.586750
8       mobile_wt      95.972863
6      int_memory      89.839124
15           sc_w      16.480319
16      talk_time      13.236400
4              fc      10.135166
14           sc_h       9.614878

2.特征重要度

模型的特征重要性属性可以用来获得数据集中每个特征的重要性。

特征重要性为你的数据的每个特征分配一个分数;分数越高,该特征对你的输出变量越重要或相关。在下面的例子中,我们将使用Extra Tree分类器来提取数据集的前10个特征,因为特征重要性是基于树的分类器的一个内建类。

import pandas as pd
import numpy as np
data = pd.read_csv("C://Users//Intel//Documents//mobile_price_train.csv")
X = data.iloc[:,0:20]  #independent variable columns
y = data.iloc[:,-1]    #target variable column (price range)
from sklearn.ensemble import ExtraTreesClassifier
import matplotlib.pyplot as plt
model = ExtraTreesClassifier()
model.fit(X,y)
print(model.feature_importances_) 

#plot the graph of feature importances 
feat_importances = pd.Series(model.feature_importances_, index=X.columns)
feat_importances.nlargest(10).plot(kind='barh')
plt.show()

输出

[0.05945479 0.02001093 0.03442302 0.0202319  0.03345326 0.01807593
 0.03747275 0.03450839 0.03801611 0.0335925  0.03590059 0.04702123
 0.04795976 0.38014236 0.03565894 0.03548119 0.03506038 0.01391338
 0.01895962 0.02066298]

3.相关统计与热图

相关性描述了特征和目标变量之间的关系。
相关性可以是:

  • 负的。 一个特征值的增加会降低目标变量的值。

我们将使用Seaborn库绘制相关特征的热图,以发现哪些特征与目标变量联系最紧密。

import pandas as pd
import numpy as np
import seaborn as sns
data = pd.read_csv("C://Users//Intel//Documents//mobile_price_train.csv")
X = data.iloc[:,0:20]  #independent variable columns
y = data.iloc[:,-1]    #targetvariable column (price range)

#obtain the 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_cores是与价格范围相关性最小的特征。

总结

在这篇文章中,我们学习了如何使用单变量选择方法、特征重要性和相关矩阵从数据中选择相关特征。选择最适合你情况的方法,用它来提高你的模型的准确性。