【问题标题】:Measuring accuracy of KNN ClassifierKNN分类器的测量精度
【发布时间】:2020-09-08 21:01:21
【问题描述】:

我已经编写了以下代码来实现KNN

from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors=5)
classifier.fit(x,y)
classifier.score(x,y)
y_predict_classifier=classifier.predict(x_test)

问题是,当我尝试使用准确度分数找出准确度时,它给了我以下错误:

ValueError                                Traceback (most recent call last)
<ipython-input-128-358130e4f0a2> in <module>
----> 1 print("Accuracy:",metrics.accuracy_score(y_test, y_predict_classifier))

~\Anaconda3\lib\site-packages\sklearn\metrics\_classification.py in accuracy_score(y_true, y_pred, normalize, sample_weight)
    183 
    184     # Compute accuracy for each possible representation
--> 185     y_type, y_true, y_pred = _check_targets(y_true, y_pred)
    186     check_consistent_length(y_true, y_pred, sample_weight)
    187     if y_type.startswith('multilabel'):

~\Anaconda3\lib\site-packages\sklearn\metrics\_classification.py in _check_targets(y_true, y_pred)
     78     y_pred : array or indicator matrix
     79     """
---> 80     check_consistent_length(y_true, y_pred)
     81     type_true = type_of_target(y_true)
     82     type_pred = type_of_target(y_pred)

~\Anaconda3\lib\site-packages\sklearn\utils\validation.py in check_consistent_length(*arrays)
    210     if len(uniques) > 1:
    211         raise ValueError("Found input variables with inconsistent numbers of"
--> 212                          " samples: %r" % [int(l) for l in lengths])
    213 
    214 

ValueError: Found input variables with inconsistent numbers of samples: [176701, 1]

我打印了 y 和 y_predict_classifier 的形状,分别得到 (176701,) 和 (1,)。

谁能告诉我如何解决这个错误?

【问题讨论】:

  • 你的 x_test 变量是什么?我们可以看看它是如何分配的吗?
  • 可以和x、y、x_test的形状相关。它们的形状是什么? x 应该是 (m, n) ,y 应该是 (m,) 和 x_test (p, n)。看起来 m 是 176701; p 是 1,n 是多少?

标签: python machine-learning knn


【解决方案1】:

这个怎么样?

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd


url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"

# Assign colum names to the dataset
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']

# Read dataset to pandas dataframe
dataset = pd.read_csv(url, names=names)


dataset.head()


X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 4].values


from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)


from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)

X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)


from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors=5, metric='minkowski')
classifier.fit(X_train, y_train)


y_pred = classifier.predict(X_test)


from sklearn.metrics import classification_report, confusion_matrix
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

结果:

                 precision    recall  f1-score   support

    Iris-setosa       1.00      1.00      1.00        13
Iris-versicolor       1.00      0.89      0.94         9
 Iris-virginica       0.89      1.00      0.94         8

       accuracy                           0.97        30
      macro avg       0.96      0.96      0.96        30
   weighted avg       0.97      0.97      0.97        30

继续...

error = []
# Calculating error for K values between 1 and 40
for i in range(1, 40):
    knn = KNeighborsClassifier(n_neighbors=i)
    knn.fit(X_train, y_train)
    pred_i = knn.predict(X_test)
    error.append(np.mean(pred_i != y_test))

plt.figure(figsize=(12, 6))
plt.plot(range(1, 40), error, color='red', linestyle='dashed', marker='o',
         markerfacecolor='blue', markersize=10)
plt.title('Error Rate K Value')
plt.xlabel('K Value')
plt.ylabel('Mean Error')

【讨论】:

    【解决方案2】:

    您可以直接在KNeighborsClassifier 中使用score() 函数。这样就不需要先预测标签再计算准确率。

    from sklearn.neighbors import KNeighborsClassifier
    knn = KNeighborsClassifier(n_neighbors=k)
    knn = knn.fit(train_data, train_labels)
    score = knn.score(test_data, test_labels)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-14
      • 2013-03-27
      • 1970-01-01
      • 2019-05-26
      • 2015-06-15
      • 1970-01-01
      • 2020-06-22
      • 2018-12-12
      相关资源
      最近更新 更多