在机器学习领域,特征选择是一个重要的步骤,它可以帮助从大量特征中筛选出对模型预测能力有显著影响的特征。本示例将展示如何在使用支持向量分类器(SVC)之前,通过单变量特征选择来提高分类分数。以鸢尾花数据集为基础,该数据集包含4个特征,并额外添加了36个非信息性特征。通过实验,发现当选择大约10%的特征时,模型的性能最佳。
首先,需要加载一些数据进行操作。将使用Python的NumPy库来处理数据,并使用scikit-learn库中的iris数据集。
import numpy as np
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
# 添加非信息性特征
rng = np.random.RandomState(0)
X = np.hstack((X, 2 * rng.random((X.shape[0], 36))))
在上述代码中,首先导入了必要的库,并加载了iris数据集。然后,添加了36个随机生成的非信息性特征,以模拟在实际应用中可能遇到的高维数据情况。
接下来,将创建一个处理流程,包括特征选择、特征缩放和支持向量分类器。将使用SelectPercentile进行特征选择,StandardScaler进行特征缩放,以及SVC作为分类器。
from sklearn.feature_selection import SelectPercentile, f_classif
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
clf = Pipeline([
("anova", SelectPercentile(f_classif)),
("scaler", StandardScaler()),
("svc", SVC(gamma="auto")),
])
在这段代码中,定义了一个Pipeline对象,它将按顺序执行特征选择、特征缩放和分类器训练。SelectPercentile使用ANOVA F-value进行特征选择,StandardScaler用于将特征缩放到标准正态分布,而SVC是分类器。
为了评估模型的性能,将使用交叉验证方法,并绘制不同特征百分比下的平均准确率。
import matplotlib.pyplot as plt
from sklearn.model_selection import cross_val_score
score_means = list()
score_stds = list()
percentiles = (1, 3, 6, 10, 15, 20, 30, 40, 60, 80, 100)
for percentile in percentiles:
clf.set_params(anova__percentile=percentile)
this_scores = cross_val_score(clf, X, y)
score_means.append(this_scores.mean())
score_stds.append(this_scores.std())
plt.errorbar(percentiles, score_means, np.array(score_stds))
plt.title("Performance of the SVM-Anova varying the percentile of features selected")
plt.xticks(np.linspace(0, 100, 11, endpoint=True))
plt.xlabel("Percentile")
plt.ylabel("Accuracy Score")
plt.axis("tight")
plt.show()
在这段代码中,首先定义了一个空列表来存储每个百分位数下的平均准确率和标准差。然后,遍历了不同的百分位数,对每个百分位数设置特征选择的参数,并使用交叉验证方法计算准确率。最后,使用matplotlib库绘制了一个图表,展示了不同特征百分比下模型的平均准确率和标准差。