【问题标题】:Weird ValueError in KNeighborsClassifier scoreKNeighborsClassifier 得分中的奇怪 ValueError
【发布时间】:2015-04-14 23:24:23
【问题描述】:

我想绘制 K 最近邻分类器的学习曲线。我有以下代码:

X_train = #training data
Y_train = #target variables
best_neighbors = #number of neighbors which gave highest score (3)

idx = len(X_train)/5000
scores = pd.DataFrame(np.zeros((idx+1, 2)), index=np.arange(1, len(X_train), 5000), columns=['Train Score', 'CV Score'])

for i in range(1, len(X_train), 5000):
    X_train_set = X_train[:i]
    Y_train_set = Y_train[:i]
    neigh = KNeighborsClassifier(n_neighbors = best_neigbors)
    neigh.fit(X_train_set, Y_train_set)

    train_score = neigh.score(X_train, Y_train)
    cv_score = neigh.score(X_test, Y_test)

    scores['Train Score'][i] = train_score
    scores['CV Score'][i] = cv_score

此代码之前可以完美运行,例如决策树或随机森林,但在这里我得到以下奇怪的错误:

      ValueError                                Traceback (most recent call last)
<ipython-input-6-95e645e75971> in <module>()
     10     neigh.fit(X_train_set, Y_train_set)
     11 
---> 12     train_score = neigh.score(X_train, Y_train)
     13     cv_score = neigh.score(X_test, Y_test)
     14 

//anaconda/lib/python2.7/site-packages/sklearn/base.pyc in score(self, X, y, sample_weight)
    289         """
    290         from .metrics import accuracy_score
--> 291         return accuracy_score(y, self.predict(X), sample_weight=sample_weight)
    292 
    293 

//anaconda/lib/python2.7/site-packages/sklearn/neighbors/classification.pyc in predict(self, X)
    145         X = atleast2d_or_csr(X)
    146 
--> 147         neigh_dist, neigh_ind = self.kneighbors(X)
    148 
    149         classes_ = self.classes_

//anaconda/lib/python2.7/site-packages/sklearn/neighbors/base.pyc in kneighbors(self, X, n_neighbors, return_distance)
    316                                           **self.effective_metric_params_)
    317 
--> 318             neigh_ind = argpartition(dist, n_neighbors - 1, axis=1)
    319             neigh_ind = neigh_ind[:, :n_neighbors]
    320             # argpartition doesn't guarantee sorted order, so we sort again

//anaconda/lib/python2.7/site-packages/numpy/core/fromnumeric.pyc in argpartition(a, kth, axis, kind, order)
    689     except AttributeError:
    690         return _wrapit(a, 'argpartition',kth, axis, kind, order)
--> 691     return argpartition(kth, axis, kind=kind, order=order)
    692 
    693 

ValueError: kth(=2) out of bounds (1)

知道这意味着什么以及如何解决这个问题吗?

编辑: 将 scikit-learn 更新到 0.16 版后,出现以下错误:

ValueError                                Traceback (most recent call last)
<ipython-input-66-21f434a289fc> in <module>()
     10     neigh.fit(X_train_set, Y_train_set)
     11 
---> 12     train_score = neigh.score(X_train, Y_train)
     13     cv_score = neigh.score(X_test, Y_test)
     14 

//anaconda/lib/python2.7/site-packages/sklearn/base.pyc in score(self, X, y, sample_weight)
    293         """
    294         from .metrics import accuracy_score
--> 295         return accuracy_score(y, self.predict(X), sample_weight=sample_weight)
    296 
    297 

//anaconda/lib/python2.7/site-packages/sklearn/neighbors/classification.pyc in predict(self, X)
    136         X = check_array(X, accept_sparse='csr')
    137 
--> 138         neigh_dist, neigh_ind = self.kneighbors(X)
    139 
    140         classes_ = self.classes_

//anaconda/lib/python2.7/site-packages/sklearn/neighbors/base.pyc in kneighbors(self, X, n_neighbors, return_distance)
    337             raise ValueError(
    338                 "Expected n_neighbors <= %d. Got %d" %
--> 339                 (train_size, n_neighbors)
    340             )
    341         n_samples, _ = X.shape

ValueError: Expected n_neighbors <= 1. Got 3

【问题讨论】:

  • 您使用的是哪个版本的 scikit-learn?如果你还没有升级到 0.16,你能升级到 0.16 吗?另外,X_train 和Y_train 的类型是什么?你也能产生完整的回溯吗?
  • 昨天,我更新了我的 Anaconda 安装。我有 scikit-learn 版本 0.15.2。我可以单独更新 scikit-learn 吗? X_train 和 Y_train 都是 2D Numpy 数组。我还编辑了我的问题以包含完整的堆栈跟踪。
  • 您可以使用 conda(anaconda 包管理器)更新 scikit-learn:conda.pydata.org/docs 和 conda update scikit-learn
  • 你在哪里定义了“n_neighbors”,它的类型是什么?
  • 没关系,没有正确阅读。但我认为公平地说,我们的错误变得更好了。

标签: python scikit-learn


【解决方案1】:

您正在尝试仅使用一个数据点来拟合 3 个最近邻分类器。那是行不通的。 顺便说一句,scikit-learn 中有learning curves 和验证曲线的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    相关资源
    最近更新 更多