我有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
)。
我错过了什么?
答案 0 :(得分:1)
根据kneighbours
文档从sklearn
返回的indices数组为您提供了总体矩阵中最近点的" 指数"不是班级标签。距离从最近到最远排序,索引告诉您哪个距离对应于训练集中的哪个实例。因此[[ 2323819.25162006, 2323841.23289028, 2323852.69883011]], [[2, 0, 1]]
告诉您第3个(索引2)实例距离最近,距离为2323819.25162006
。这可能有点令人困惑,因为您在训练数据和k=3
中只有3分。这里要记住的是,索引引用原始训练样本数组中的索引而不是从同一函数返回的距离数组。
我认为你的主要问题是人口矩阵包含3个类的3个例子(每个类1个)。当您设置kneighbours=3
时,您认为分类器正在尝试做什么?找到测试点的3个最近邻居,但只有三个例子,它们都有不同的类。
用户指南可以这样说
分类是根据每个点的最近邻居的简单多数投票来计算的
在你的情况下最近的3分。同样只有三个点,它们都有不同的类,所以多数投票永远不能正常运作。