在数据科学领域,特征选择是一个重要的步骤,它可以帮助识别出对模型预测能力影响最大的特征。已经了解了缺失值比率和低方差过滤技术,本文将介绍另一种特征选择技术——反向特征消除(Backward Feature Elimination)。
假设目标是根据给定的特征预测健身水平。假设数据集中没有缺失值,所有变量的方差都很高,且独立变量之间的关系很低。在这种情况下,可以使用反向特征消除技术来从数据集中选择重要特征。
反向特征消除的第一步是使用所有变量训练模型。不会将ID变量纳入模型训练,因为ID对每个观测值来说都是唯一的。因此,首先使用其他三个独立变量和目标变量(Fitness_Level)来训练模型。
接下来,将计算模型的性能。假设使用所有三个独立变量得到的准确率为92%。然后,将逐个移除变量,并在剩余变量上训练模型。例如,如果移除了Calories_Burnt变量,并在剩余的两个变量(Gender和Plays_Sport)上训练模型,得到的准确率可能会降低到90%。
将继续这个过程,逐个移除每个变量,并在剩余变量上训练模型。这里移除了Gender变量,得到的准确率为91.6%。最后,移除了Plays_Sport变量,并在剩余数据上训练模型,得到的准确率降低到88%。通过这个过程,可以识别出对模型性能影响最小的变量。
回顾一下,使用所有变量时的准确率为92%,而移除每个变量后的准确率如下:移除Calories-Burnt后准确率为90%,移除Gender后准确率为91.6%,移除Plays_Sport后准确率进一步降低到88%。从这些数据中,可以看出Gender变量对模型性能的影响最小,因此可以被移除。
将重复这些步骤,直到不能再移除更多的变量。通过这个过程,可以很好地理解反向特征消除的工作原理。这是一种简单但非常有效的技术。
接下来,将看到如何在Python中实现反向特征消除。首先,需要导入Pandas库。
import pandas as pd
然后,读取数据集并使用data.head()函数打印前五个观测值。
data = pd.read_csv('backward_feature_elimination.csv')
data.head()
有目标变量和其他独立变量。让看看数据的形状。
data.shape
检查数据中是否有缺失值。
data.isnull().sum()
如果没有缺失值,那么可以定义目标变量和独立变量。
X = data.drop(['ID', 'count'], axis=1)
y = data['count']
X.shape, y.shape
接下来,需要安装“mlxtend”库,该库包含了反向特征消除和前向特征选择技术的预写代码。
!pip install mlxtend
现在,从mlxtend导入SequentialFeatureSelector,并从sklearn导入LinearRegression。
from mlxtend.feature_selection import SequentialFeatureSelector as sfs
from sklearn.linear_model import LinearRegression
将训练模型,并定义特征选择器模型。
lreg = LinearRegression()
sfs1 = sfs(lreg, k_features=4, forward=False, verbose=1, scoring='neg_mean_squared_error')
这里解释一下不同的参数:第一个参数是模型名称,传入了lreg,即线性回归模型。然后定义要选取的特征数量,这里传入了“k_features = 4”,所以模型会训练直到只剩下四个特征。“forward = False”表示正在训练反向特征消除而不是前向特征选择方法。“verbose = 1”将允许在每次迭代时打印模型摘要。最后,由于这是一个回归模型,评分将基于均方误差指标,因此“scoring = ‘neg_mean_squared_error'”。
将拟合模型。
sfs1 = sfs1.fit(X, y)
可以看到,模型训练直到只剩下四个特征。将打印出被选中的特征。
feat_names = list(sfs1.k_feature_names_)
print(feat_names)
new_data = data[feat_names]
new_data['count'] = data['count']
new_data.head()
new_data.shape, data.shape