【问题标题】:kNN prediction different from distance value predictionkNN预测不同于距离值预测
【发布时间】:2017-11-01 10:16:58
【问题描述】:

我对 sklearn 有疑问,不知道我做错了什么。

我想将网站分为 3 个类别:“金融”、“IT”、“医疗保健”

我对每个网站都有几个指标(基本上是一个关键字列表),我最终使用了一个 knn 分类器:

# fit the classifier
 >>> y = array(['financial_services', 'health_care', 'information_technology'], dtype=object)
 >>> X.shape = (3L, 571L)
neigh = KNeighborsClassifier(n_neighbors=3)
neigh.fit(X, y)

# predict the result for some website (predict is a matrix with my features)
print(neigh.predict(predict))
 >>> ['financial_services'] # predict the first category

print(neigh.kneighbors(predict)) # get the "distances" to each category
 >>> (array([[ 2323819.25162006,  2323841.23289028,  2323852.69883011]]), array([[2, 0, 1]], dtype=int64)) # we can see that this website is closer to the category #2, which is IT 

我尝试预测其他网站的类别,但我总是使用neigh.predict 得到相同的预测,例如“金融服务”,而使用距离得到不同的值(使用neigh.predict)。

我错过了什么?

【问题讨论】:

    标签: python python-2.7 scikit-learn


    【解决方案1】:

    根据sklearn 文档从kneighbours 返回的索引数组为您提供“总体矩阵中最近点的索引”,而不是类标签。距离从最近到最远排序,索引告诉您哪个距离对应于训练集中的哪个实例。所以[[ 2323819.25162006, 2323841.23289028, 2323852.69883011]], [[2, 0, 1]] 告诉你第三个(索引 2)实例是最近的,距离为2323819.25162006。这可能有点令人困惑,因为您在训练数据和k=3 中正好有 3 个点。这里要记住的是,索引是指原始训练样本数组中的索引,而不是从同一函数返回的距离数组。

    我认为您的主要问题是人口矩阵正好包含 3 个类别的 3 个示例(每个类别 1 个)。当您设置kneighbours=3 时,您认为分类器试图做什么?找到一个测试点的 3 个最近邻,但只有 3 个示例,并且它们都有不同的类。

    用户指南有这样的说法

    分类是根据每个点最近邻居的简单多数票计算得出的

    在您的情况下,最接近的 3 个点。同样只有三个点,它们都有不同的类别,所以多数票永远无法正常运作。

    【讨论】:

    • 我知道 `kneighbours 返回的第二个数组 ("[[2, 0, 1]]") 是“人口矩阵中最近点的索引”。 (所以医生说)。所以我认为这个数组的第一个数字(在本例中为 2)对应于距离数组中的第一个数字,这意味着预测点更接近点号 2?
    • 不,我认为距离数组中的第一个数字是到人口矩阵中第一个元素的距离,不过我不太确定。然而,主要问题是只有三个邻居,每个邻居都有不同的类别,因此无论距离如何,大多数邻居都无法正常工作
    • 我认为距离被考虑到“加权”投票。我会在文档中深入挖掘。
    • 好吧,我的错,我对 kNN 的理解有误。所以我的预测提交给最近的 3 个训练点之间的多数投票:因为他们每个人都在不同的班级,第一个总是获胜。话虽如此,kneighbors 确实给出了我要预测的点和训练点之间的距离,这正是我所追求的。如果你能纠正你的答案,我很乐意给你加分以感谢你的帮助。
    • 我不确切知道实现如何决定哪个类获胜,它总是第一个还是随机的。我不确定您希望我在回答中更改哪一部分?我没有看到任何事实错误。你的意思是population matrix
    猜你喜欢
    • 2016-10-15
    • 2018-10-14
    • 1970-01-01
    • 2021-10-06
    • 2020-09-22
    • 2022-01-15
    • 1970-01-01
    • 2019-10-15
    • 2017-04-13
    相关资源
    最近更新 更多