在机器学习项目中,特征选择是一个关键步骤,它可以帮助提高模型的性能,减少过拟合的风险,并提高模型的可解释性。本文将展示如何在机器学习的管道中集成特征选择,并展示如何轻松地检查管道的一部分。
首先,将生成一个二分类的数据集。然后,将数据集分成两个子集:训练集和测试集。在特征选择中常见的一个错误是在完整数据集上搜索区分性特征的子集,而不是仅使用训练集。使用scikit-learn的Pipeline可以避免这种错误。
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
X, y = make_classification(n_features=20, n_informative=3, n_redundant=0, n_classes=2, n_clusters_per_class=2, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
将演示如何构建一个管道,其中第一步是特征选择。当在训练数据上调用fit时,将选择一个特征子集,并将这些选定特征的索引存储起来。然后,特征选择器将减少特征数量,并将这个子集传递给分类器进行训练。
from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.pipeline import make_pipeline
from sklearn.svm import LinearSVC
anova_filter = SelectKBest(f_classif, k=3)
clf = LinearSVC()
anova_svm = make_pipeline(anova_filter, clf)
anova_svm.fit(X_train, y_train)
训练完成后,可以对新的未见样本进行预测。在这种情况下,特征选择器将仅根据训练期间存储的信息选择最具区分性的特征。然后,数据将被传递给分类器进行预测。
from sklearn.metrics import classification_report
y_pred = anova_svm.predict(X_test)
print(classification_report(y_test, y_pred))
分类报告将展示模型的性能指标,包括精确度、召回率、F1分数和支持度。
可以检查管道中的步骤。例如,可能对分类器的参数感兴趣。由于选择了三个特征,期望有三个系数。
print(anova_svm[-1].coef_)
然而,不知道原始数据集中哪些特征被选中。可以通过多种方式进行。这里,将反转这些系数的变换,以获取有关原始空间的信息。
print(anova_svm[-1].inverse_transform(anova_svm[-1].coef_))
可以看到,非零系数的特征是第一步选择的特征。
脚本的总运行时间为:(0分钟0.013秒)
可以下载Jupyter笔记本:,或者下载Python源代码:,或者下载压缩包:。
以下是一些相关的示例: