欢迎订阅!
您的支持是我持续创作的动力!
在上一篇文章中,我们探讨了如何通过增加特征来提升模型的拟合效果。然而,过多的特征也可能导致过拟合问题。因此,本篇文章将重点介绍如何减少特征数量,避免过拟合现象。我们将详细介绍三种自动化特征选择的方法。
第一种方法是利用单变量统计分析来选择特征。这种方法的核心思想是单独评估每个特征与目标变量之间的相关性,从而筛选出最有价值的特征。在scikit-learn库中,我们常用SelectKBest和SelectPercentile两个工具来进行特征选择。
实战案例
我们继续使用乳腺癌数据集作为示例。
首先,加载数据集:
python
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
接下来,将数据集划分为训练集和测试集:
python
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target)
然后,选择特征选择工具SelectPercentile,并设置百分比为60%:
python
from sklearn.feature_selection import SelectPercentile
tool = SelectPercentile(percentile=60)
应用工具到训练集,并进行特征变换:
python
tool.fit(X_train, y_train)
X_new_train = tool.transform(X_train)
最后,检查特征数量的变化:
python
print(X_train.shape) # (426, 30)
print(X_new_train.shape) # (426, 18)
通过上述操作,我们可以发现原本30个特征减少到了18个。我们还可以查看具体被选中的特征:
python
features = tool.get_support()
import matplotlib.pyplot as plt
plt.matshow(features.reshape(1, -1), cmap='Oranges_r')
第二种方法是基于模型的特征选择。这种方法通过构建一个监督学习模型来评估各个特征的重要性,然后只保留最重要的特征。需要注意的是,用于特征选择的模型不必与最终使用的模型一致。
在scikit-learn中,我们通常使用SelectFromModel类和随机森林模型来进行特征选择。因为随机森林提供了featureimportances属性,可以用来判断特征的重要性。
实战案例
首先,加载SelectFromModel和RandomForestClassifier工具:
python
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier
trans = SelectFromModel(RandomForestClassifier(), threshold='mean')
设定阈值为平均值,并应用到训练集:
python
trans.fit(X_train, y_train)
X_trans_train = trans.transform(X_train)
检查特征数量的变化:
python
print(X_train.shape) # (426, 30)
print(X_trans_train.shape) # (426, 7)
同样地,我们还可以查看具体被选中的特征:
python
feature = trans.get_support()
plt.matshow(feature.reshape(1, -1), cmap='Oranges_r')
第三种方法是递归特征消除(RFE)。该方法从所有特征开始,逐步剔除不重要的特征,直到达到所需的特征数量为止。为了实现这一点,我们需要选择一个能够提供特征重要性的模型,例如随机森林。
实战案例
首先,加载RFE工具和随机森林模型:
python
from sklearn.feature_selection import RFE
rfe = RFE(RandomForestClassifier(), n_features_to_select=10)
指定需要保留的特征数量为10,并应用到训练集:
python
rfe.fit(X_train, y_train)
X_rfe_train = rfe.transform(X_train)
检查特征数量的变化:
python
print(X_rfe_train.shape) # (426, 10)
通过上述步骤,我们可以发现特征数量减少到10个。同样地,我们可以通过可视化来查看具体被选中的特征:
python
fea = rfe.get_support()
plt.matshow(fea.reshape(1, -1), cmap='Oranges_r')
至此,我们介绍了三种自动化特征选择的方法。如果您有任何疑问,欢迎随时联系我,希望您喜欢这篇文章,并给予支持!