在机器学习中,构建一个有效的学习管道是至关重要的。一个管道通常包括数据预处理、特征选择、模型训练等多个步骤。本文将展示如何创建一个包含特征选择的机器学习管道,并使用支持向量机作为分类器。首先,需要生成一个用于二分类的数据集,然后将其分为训练集和测试集。
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)
在特征选择过程中,一个常见的错误是在完整数据集上搜索一组有区分度的特征子集,而不是仅使用训练集。使用scikit-learn的Pipeline可以避免这种错误。将构建一个管道,其中第一步是特征选择。在训练数据上调用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)
在Jupyter环境中,可以重新运行此单元格以显示HTML表示,或者在GitHub上无法渲染HTML表示时,尝试使用nbviewer.org加载此页面。完成训练后,可以对新的未见样本进行预测。在这种情况下,特征选择器将仅根据训练期间存储的信息选择最具区分性的特征。然后,数据将传递给分类器进行预测。
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.015秒。