KNN 模型的准确度分数(IRIS 数据)

Accuracy score for a KNN model (IRIS data)

增加或稳定此基本 KNN 模型的准确度分数不会 显着不同)的一些关键因素是什么IRIS 数据?

尝试

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

iris = datasets.load_iris() 
X, y = iris.data[:, :], iris.target

Xtrain, Xtest, y_train, y_test = train_test_split(X, y)
scaler = preprocessing.StandardScaler().fit(Xtrain)
Xtrain = scaler.transform(Xtrain)
Xtest = scaler.transform(Xtest)

knn = neighbors.KNeighborsClassifier(n_neighbors=4)
knn.fit(Xtrain, y_train)
y_pred = knn.predict(Xtest)

print(accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
print(confusion_matrix(y_test, y_pred))

样本准确度分数

0.9736842105263158
0.9473684210526315
1.0
0.9210526315789473

分类报告

              precision    recall  f1-score   support

           0       1.00      1.00      1.00        12
           1       0.79      1.00      0.88        11
           2       1.00      0.80      0.89        15

    accuracy                           0.92        38
   macro avg       0.93      0.93      0.92        38
weighted avg       0.94      0.92      0.92        38

样本混淆矩阵

[[12  0  0]
 [ 0 11  0]
 [ 0  3 12]]

鸢尾花数据集中只有 3 个 类 可用,Iris-Setosa、Iris-Virginica 和 Iris-Versicolor。

使用此代码。这给了我 97.78% 准确性

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

iris = datasets.load_iris() 
X, y = iris.data[:, :], iris.target
Xtrain, Xtest, y_train, y_test = train_test_split(X, y, stratify = y, random_state = 0, train_size = 0.7)

scaler = preprocessing.StandardScaler().fit(Xtrain)
Xtrain = scaler.transform(Xtrain)
Xtest = scaler.transform(Xtest)

knn = neighbors.KNeighborsClassifier(n_neighbors=3)
knn.fit(Xtrain, y_train)
y_pred = knn.predict(Xtest)

print(accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
print(confusion_matrix(y_test, y_pred))

我建议调整 k-NN 的 k 值。由于 iris 是一个小数据集并且非常平衡,我将执行以下操作:

For every value of `k` in range [2 to 10] (say)
  Perform a n-times k-folds crossvalidation (say n=20 and k=4)
    Store the Accuracy values (or any other metric)

根据平均值和方差绘制分数,select k 的值最好 k-value。交叉验证的主要目标是估计测试误差,并在此基础上 select 最终模型。会有一些差异,但应该小于 0.03 或类似值。这取决于数据集和您采用的折叠数。一个好的过程是,对于 k 的每个值,制作所有 20x4 精度值的箱线图。 Select 下分位数与上分位数相交的 k 的值,或者简单地说,准确度(或其他度量值)没有太大变化。

一旦你 select 基于此的 k 的值,目标是使用此值构建使用整个训练数据集的最终模型。接下来,这可以用来预测新数据。

另一方面,对于更大的数据集。制作一个单独的测试分区(就像您在此处所做的那样),然后仅在训练集上调整 k 值(使用交叉验证,忘记测试集)。在 select 进行适当的 k 训练算法后,仅使用训练集进行训练。接下来,使用测试集报告最终值。永远不要根据测试集做出任何决定。

还有一种方法是训练、验证、测试分区。使用训练集训练,使用 k 的不同值训练模型,然后使用验证分区进行预测并列出分数。 Select 基于此验证分区的最佳分数。接下来使用train或者train+validation set根据validation set使用kselected的值训练最终模型。最后,取出测试集并报告最终得分。再次重申,切勿在其他任何地方使用测试集。

这些是适用于任何机器学习或统计学习方法的通用方法。

执行分区(训练、测试或交叉验证)时需要注意的重要事项,使用 stratified sampling 以便在每个分区中 class 比率保持不变。

详细了解 crossvalidation. In scikitlearn it is easy to do. If using R, you can use the caret

要记住的主要事情是目标是训练一个在新数据上泛化或在新数据上表现良好的函数,而不是在现有数据上表现良好。