【问题标题】:Nearest Neighbor's kneighbors method return different output for different sample sizesNearest Neighbors k 邻居方法针对不同的样本大小返回不同的输出
【发布时间】:2020-08-22 00:07:16
【问题描述】:

我用Scikit-learn 构建了一个最近邻模型。在拟合模型后使用 kneighbors 方法获取集群时,集群似乎很好。

    model = NearestNeighbors(n_jobs=-1, n_neighbors=5).fit(np.array(df))
    distance, indices = model.kneighbors(np.array(df))  ## one of the distances is always 0, as expected. And clusters are acceptable.

但是当我保存模型然后读取训练数据时,输出是不可接受的。

     model = pickle.load(f)
     distance, indices = model.kneighbors(np.array(df))  ## same dataset, average/bad results. None of distances are 0.

而且,最大的问题是,索引和距离会根据 df 大小而变化。

      model = pickle.load(f)
      df_1 = df[df["id"] == "1"] # Trying for just one user
      distance, indices = model.kneighbors(np.array(df_1))  ## one row, same output for every user.
      df_2 = df[df["id"] == "2"]
      distance, indices = model.kneighbors(np.array(df_2)) ## same output

      df = df[df["id"] == "2" | df["id"] == "1"]
      distance, indices = model.kneighbors(np.array(df)) ## different output for both

训练/测试数据集如下所示

feature1 | feature2 | feature3
   0          1          1
   1          1          1
   0          0          0

如果模型在使用不同的数据集后无法使用,为什么还要训练和保存模型?这是模型的预期行为还是我错过了什么?

【问题讨论】:

  • NearestNeighbors 只是评估 df 中样本之间的距离,因此您应该得到相同的结果。您能否添加一个示例 df 和您的保存/加载代码以获得 Minimal reproductible example

标签: python machine-learning scikit-learn data-science nearest-neighbor


【解决方案1】:

嗯,这是我犯的一个可怕的错误,我想分享问题和解决方案。非常简单,但可能很难看到。

我阅读了数千次文档,然后注意到他们使用 np.array 而不是 DataFrame。好吧,我使用 Dataframe 进行预测,并使用随机列。因此,它无法正常工作。

如果你有这样的问题,小心 numpy 索引!

【讨论】:

    猜你喜欢
    • 2021-12-16
    • 1970-01-01
    • 2021-06-12
    • 2012-03-20
    • 2019-04-07
    • 2016-03-11
    • 2016-07-09
    • 1970-01-01
    • 2013-04-05
    相关资源
    最近更新 更多