【问题标题】:ValueError: Expected n_neighbors <= 1. Got 5 -Scikit K Nearest ClassifierValueError: Expected n_neighbors <= 1. Got 5 -Scikit K Nearest Classifier
【发布时间】:2015-07-12 00:27:03
【问题描述】:

我正在使用 SCIkit KNN 和 levenstein 距离来处理一些字符串,很像本页底部的示例:http://scikit-learn.org/stable/faq.html。不同之处在于我的数据被分成训练集并在数据框中。

此处列出了拆分:

train_feature, test_feature, train_class, test_class = train_test_split(features, classes,
                                                    test_size=TEST_SET_SIZE, train_size=TRAINING_SET_SIZE,
                                                    random_state=42)

我有以下几点:

>>> model = KNeighborsClassifier(metric='pyfunc',func=machine_learning.custom_distance)
>>> model.fit(train_feature['id'], train_class.as_matrix(['gender']))
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='pyfunc',
       metric_params={'func': <function custom_distance at 0x7fd0236267b8>},
       n_neighbors=5, p=2, weights='uniform')

其中 train_features 有一列([24000 行 x 1 列]),id 和 train_class(名称:性别,dtype:对象)是“性别”的系列,即“M”或“F”。 id 对应于其他地方的字典中的一个键。

自定义距离函数为:

def custom_distance(x,y):
i, j = int(x[0]), int(y[0])
return damerau_levenshtein_distance(lookup_dict[i],lookup_dict[j])

当我尝试获取模型的准确性时:

 accuracy = model.score(test_feature, test_class)

我收到此错误:

 ValueError: Expected n_neighbors <= 1. Got 5

老实说,我真的很困惑。我检查了每个数据集的长度,它们都很好。为什么它会告诉我我只有一个数据点可以绘制?任何帮助将不胜感激。

【问题讨论】:

  • 对你最后一点的轻微重构:错误告诉你有 5 个邻居,但问题是它期待一个
  • 也许可以尝试从一个模仿您当前设置的简单示例来复制问题并找出问题所在。除了 scikit 的内置函数之外,也许还可以尝试其他方法来生成训练/测试集和对模型的准确性进行评分
  • 我在使用示例和 NearestNeighbor 时收到了同样的错误。

标签: python numpy pandas machine-learning scikit-learn


【解决方案1】:

分类器认为您的数据集只有一个条目。可能它将id 的向量解释为行向量而不是列向量。

试试

model.fit(train_feature.as_matrix(['id']), train_class.as_matrix(['gender']))

看看有没有帮助。

【讨论】:

  • 我得到了这个:ValueError:发现样本数量不一致的数组:[1 245386] 但是我检查了每个训练集的长度,它们都与它们对应的类集相同
  • 另外,当我尝试直接放入 hte 数据集并查看函数内部发生了什么时,我遇到了和这个人一样的问题 stackoverflow.com/questions/23420605/…
  • @user2757902:检查数组的长度和形状是否匹配。我怀疑一个是行向量,另一个是列向量。当您将它们用作fit 的输入时,两者都应该是列向量(形状(N,1))。
  • 我用一些简单的数组尝试了这个并遇到了同样的问题。下面是代码:pastie.org/private/9afcezwmgkla1xkywh9qzq 以及与输入数组相比的距离函数参数截图:i.imgur.com/eXy4vaA.png
  • @user2757902:当我将 custom_distance 函数替换为没有额外依赖项的函数时,您在 paste 上发布的代码对我有用。 (我之前声称有问题,Y 数组实际上必须是一维数组,但你已经用ravel() 修复了它)
【解决方案2】:

我想通了。我需要将模型设置为蛮力和距离度量:

model = KNeighborsClassifier(metric=machine_learning.custom_distance,algorithm='brute',n_neighbors=50)

【讨论】:

    【解决方案3】:

    我遇到了同样的错误。我有一个巨大的数据库,我可以在其中获取训练和测试数据,但出于代码测试目的,我使用了一个非常小的数据库(约为原始数据库的 0.5%)。 在训练过程中,我测试了许多不同的邻居,f.e

    for neighbor in range(5,19): ...
    

    针对n_neigbors=19 引发了ValueError 异常。仅当我使用小型数据库时才引发此错误。原因是它没有实际的数据输入来创建 19 种不同的测量。当我使用完整的数据库进行测试时,没有引发此类异常。

    设置algorithm='brute' 不会解决问题,尽管它可能会起作用。您应该做的是检查您的观察的长度,包括训练和测试,并相应地为 n_neighbors 的值设置一个上限。

    【讨论】:

      【解决方案4】:

      只需设置 n_neighbors 值

      knn = KNeighborsClassifier(n_neighbors=1)
      

      【讨论】:

        猜你喜欢
        • 2017-12-23
        • 2020-10-10
        • 1970-01-01
        • 2020-11-19
        • 2018-12-29
        • 2020-10-26
        • 1970-01-01
        • 2022-07-22
        • 2021-05-05
        相关资源
        最近更新 更多