如何提取kNN测试准确率并绘制其与chi2选特征数的关系图
解决Matplotlib绘制kNN准确率随Chi2特征数量变化曲线的问题
我来帮你搞定这个问题!其实核心思路就是循环尝试不同的特征数量k,每次记录对应的kNN模型准确率,之后就能轻松画出变化曲线,还能找出最高准确率和对应的特征数量。下面是完整的实现步骤和代码:
第一步:补全所需库与数据集准备
首先把需要的库都导入,这里我用make_classification生成一个示例数据集,你可以替换成自己的真实数据集:
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import make_classification from sklearn.feature_selection import SelectKBest, chi2 from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score # 生成示例分类数据集(替换成你的数据集即可) X, y = make_classification(n_samples=1000, n_features=30, n_informative=15, random_state=42) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
第二步:循环收集不同特征数量下的准确率
我们需要定义一个特征数量的范围(比如从1到25,你可以根据自己的总特征数调整),然后逐个尝试每个k值,记录对应的准确率:
# 初始化存储特征数量和对应准确率的列表 feature_counts = [] accuracies = [] # 定义要尝试的特征数量范围(这里取1到25,可根据实际调整) k_values = range(1, 26) for k in k_values: # 用Chi2选择k个最优特征 selector = SelectKBest(chi2, k=k) X_train_selected = selector.fit_transform(X_train, y_train) X_test_selected = selector.transform(X_test) # 训练kNN模型 knn = KNeighborsClassifier(n_neighbors=5) # 可根据需求调整k值 knn.fit(X_train_selected, y_train) # 预测并计算准确率 y_pred = knn.predict(X_test_selected) acc = accuracy_score(y_test, y_pred) # 记录当前特征数量和准确率 feature_counts.append(k) accuracies.append(acc)
第三步:绘制准确率变化曲线
现在我们有了feature_counts(x轴)和accuracies(y轴)的数据,直接用Matplotlib画图即可:
plt.figure(figsize=(10, 6)) plt.plot(feature_counts, accuracies, marker='o', color='b', linestyle='-', linewidth=2) plt.xlabel('Number of Selected Features (Chi2)') plt.ylabel('kNN Test Accuracy') plt.title('kNN Accuracy vs. Number of Chi2 Selected Features') plt.grid(True, alpha=0.3) plt.show()
第四步:找出最高准确率及对应特征数量
用numpy的工具就能快速定位最大值和对应的特征数:
# 找到最高准确率 max_acc = max(accuracies) # 找到对应的特征数量 best_k = feature_counts[np.argmax(accuracies)] print(f"最高测试准确率: {max_acc:.4f}") print(f"对应的特征数量: {best_k}")
关键小提示
- 如果你用的是真实数据集,Chi2特征选择要求特征是非负的,所以如果你的数据有负值,记得先做
MinMaxScaler把特征缩到[0,1]区间,否则会报错。 - kNN模型的
n_neighbors参数你也可以根据自己的需求调整,比如尝试不同的邻居数,看看结果变化。
内容的提问来源于stack exchange,提问作者user9238790
相关产品推荐
相关产品推荐

