You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

鸢尾花数据集KNN模型不同K值下分类指标一致问题求助

问题分析与解决思路

嘿,这个情况其实挺常见的,咱们来一步步拆解原因和解决办法:

核心原因:鸢尾花数据集的特性 + 固定划分的测试集

鸢尾花(Iris)数据集是分类任务的经典基准数据集,它的三类样本(山鸢尾、变色鸢尾、维吉尼亚鸢尾)特征区分度极高,尤其是前两个特征(花萼长度、花萼宽度)的类别边界非常清晰。再加上你用了random_state=42固定了训练集/测试集的划分,这个特定划分下的测试集样本刚好能被不同K值的KNN模型完美分类,所以才会出现所有指标都是1.0的情况。

你代码里的小细节问题

另外,注意到你在classification_report里写了labels=iris.target,这是个小错误:

  • iris.target是整数形式的标签(比如[0,1,2]),如果你的y_test是字符串形式的花名(比如['setosa', 'versicolor', 'virginica']),这里的labels参数会出现匹配问题。正确写法应该是labels=iris.target_names,或者直接省略这个参数(sklearn会自动识别样本标签)。

如何验证不同K值的差异?

想要看到不同K值的结果变化,可以试试以下操作:

  • 改变随机划分种子:把random_state=42换成其他数值(比如random_state=10),或者直接去掉这个参数让划分随机化。这样测试集里可能会出现一些更难分类的样本,不同K值的结果就会产生差异。
  • 增大测试集比例:比如把test_size=0.30改成test_size=0.5,测试样本数量越多,越容易出现分类错误,就能直观看到不同K值的准确率变化。
  • 手动添加噪声:给数据集的特征加入一点随机噪声,模拟更贴近真实场景的数据,这样K值对分类结果的影响就会显现出来。

修正后的示例代码

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score

# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target

# 调整random_state或test_size来观察差异
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=10)

# 遍历不同K值对比结果
for k in [2,3,5]:
    print(f"\n=== K={k} 的分类结果 ===")
    clf = KNeighborsClassifier(n_neighbors=k)
    clf.fit(X_train, y_train)
    y_pred = clf.predict(X_test)
    
    print("混淆矩阵:")
    print(confusion_matrix(y_test, y_pred))
    print(f"准确率:{accuracy_score(y_test, y_pred):.2f}")
    print("分类报告:")
    print(classification_report(y_test, y_pred, target_names=iris.target_names))

运行这段代码,你应该就能看到不同K值下的指标差异啦~

内容的提问来源于stack exchange,提问作者Amanda Wang

火山引擎 最新活动