具有不同虹膜模型K值的KNN模型的统计指标?

Posted

技术标签:

【中文标题】具有不同虹膜模型K值的KNN模型的统计指标?【英文标题】:statistical metrics for KNN model with different K value of iris model? 【发布时间】:2020-05-24 18:34:59 【问题描述】:

我写了一些 python 代码来拟合著名的鸢尾花数据集和 KNN 模型,我尝试了不同的 k 值,如 k=2、k=3、k=5,根据我的理解,这些不同的 k 值,混淆矩阵,准确率分数和分类报告值应该不同,但是,无论我给什么k值,统计指标输出都是一样的,而且“精度”,“召回”和“f1-score”都是1.00,如在快照codes and output。我在这里错过了什么吗?谢谢!

from sklearn.model_selection import train_test_split

# first split the dataset into its attributes and labels
X = data.iloc[:, :-1].values  
y = data.iloc[:, 4].values 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, 
random_state=42)

from sklearn.neighbors import KNeighborsClassifier

# Instantiate learning model (k = 5)
clf = KNeighborsClassifier(n_neighbors=5)
# Fitting the model
clf.fit(X_train, y_train)
# Predicting the Test set results
y_pred = clf.predict(X_test)
print(y_pred)

from sklearn.metrics import classification_report, confusion_matrix, accuracy_score 

print(confusion_matrix(y_test, y_pred))
print(accuracy_score(y_test, y_pred))
print("classification report:---------------------------\n")
print(classification_report(y_test, y_pred, labels=iris.target))

【问题讨论】:

您从哪里加载数据?外部 CSV 或sklearn's 内置虹膜数据集。 【参考方案1】:

您很可能在加载数据集并将其拆分为Xy 时出错。签出此更正。它给出了正确的结果。但是,iris 数据集非常简单,没有太多 multicollinearity 或 heteroscedasticity。这意味着knn 对它们进行完美分类不会有太多麻烦,并且通过更改knn 参数,您不会看到输出指标有太大差异。要观察剧烈的变化,你应该选择难度更高的数据。

from sklearn.model_selection import train_test_split
from sklearn import datasets

iris = datasets.load_iris()

# import some data to play with
X = iris.data[:, :2]  # we only take the first two features.
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, 
random_state=42)

from sklearn.neighbors import KNeighborsClassifier

# Instantiate learning model (k = 5)
clf = KNeighborsClassifier(n_neighbors=10)
# Fitting the model
clf.fit(X_train, y_train)
# Predicting the Test set results
y_pred = clf.predict(X_test)
print(y_pred)

from sklearn.metrics import classification_report, confusion_matrix, accuracy_score 

print(confusion_matrix(y_test, y_pred))
print(accuracy_score(y_test, y_pred))
print("classification report:---------------------------\n")
print(classification_report(y_test, y_pred, labels=iris.target))

这表明

[1 0 2 1 1 0 1 2 1 1 2 0 0 0 0 2 1 1 1 2 0 1 0 2 2 1 1 2 0 0 0 0 2 0 0 1 2
 0 0 0 1 2 2 0 0]
[[19  0  0]
 [ 0  8  5]
 [ 0  6  7]]
0.7555555555555555
classification report:---------------------------
...

当您调整 knn 参数时,准确度会发生变化。

【讨论】:

谢谢,尝试只取前两个特征并给X你修改,然后得到:k=2,accuracy_score=0.833; k=3,accuracy_score=0.833; k=5,accuracy_score=0.8267。你说的对!【参考方案2】:

我认为您的输出是正确的:无论您为 k 选择的值如何,您的测试集都得到了完美的分类。 iris 数据集比较简单。杂色和弗吉尼亚物种之间只有真正的重叠,然后只有少数标本(可能是 5-6 个左右)。查看this website 了解一些显示此内容的图表。由于您只测试了 30% 的数据,因此这几个样本很可能不在您的测试集中。如果您对整个数据集运行预测,您应该会看到基于 k 的一些变化。

尝试更改这些行以查看它:

y_pred = clf.predict(X)
print(confusion_matrix(y, y_pred))

【讨论】:

谢谢,输入整个数据集后,得到:k=2, accuracy_score=0.973;k=3, accuracy_score=0.96; k=5,accuracy_score=0.9667;你说的对!

以上是关于具有不同虹膜模型K值的KNN模型的统计指标?的主要内容,如果未能解决你的问题,请参考以下文章

KNN中K值大小选择对模型的影响

kNN(k-NearestNeighbor)算法

2020-05-20 第十一章 kNN模型的应用

R语言plotly可视化:使用plotly可视化对比不同参数设置下的同一机器学习模型算法的拟合曲线(训练两个参数不同的KNN模型进行对比comparing different kNN models

如何根据层级创建具有不同指标的维度模型

组合两个查询集,具有不同值的公共字段