You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:58:46