如何解释 knn sklearn 的输出以根据兴趣匹配人员
How to interpet the output of knn sklearn for matching people based on interest
我对机器学习还很陌生。我试图根据他们的利率评级(1=低,10=高)将来自 SetA 的人与来自 SetB 的人匹配。我的真实数据集有 40 个特征(后来我想对某些特征设置更高的权重,以及不太常见的兴趣 - 我相信 this 会帮助我吗?)。
示例数据集:
>>> dfA = pd.DataFrame(np.array([[1, 1, 1], [4, 4, 4], [8, 8, 8]]),
columns=['interest1', 'interest2', 'interest3'],
index=['personA1','personA2','personA3'])
>>> dfB = pd.DataFrame(np.array([[4, 4, 3], [2, 2, 1], [1, 2, 2]]),
columns=['interest1', 'interest2', 'interest3'],
index=['personB1','personB2','personB3'])
print(dfA, "\n", dfB)
>>> interest1 interest2 interest3
personA1 1 1 1
personA2 4 4 4
personA3 8 8 8
interest1 interest2 interest3
personB1 4 4 3
personB2 2 2 1
personB3 1 2 2
我正在为此使用 sklearn 的最近邻算法:
knn = NearestNeighbors(n_neighbors = 2).fit(dfA)
distances, indicies = knn.kneighbors(dfB)
>>> print(distances, "\n \n", indicies)
>>>[[1. 4.69041576]
[1.41421356 4.12310563]
[1.41421356 4.12310563]]
[[1 0]
[0 1]
[0 1]]
我不明白输出?我知道一个类似的问题 但是我不知道如何将它应用到这种情况,因为有 2 个不同的数据集。
最终,我想要一个匹配的最终数据框,例如:
SetA SetB
personA1 personB2
personA2 personB1
personA3 personB3
您得到的结果是从 SetA 中的人.
中选择的 SetB 中给定人的最近邻居
换句话说,第一个元素 distances[0]
告诉您 personB1 与其在 SetA 中的两个最近邻居的距离。 indicies[0]
告诉你这两个人的指数。
在这个例子中:
indicies[0] = [1, 0]
表示personB1在SetA1中的最近邻为SetA[1] = personA2和SetA[0] = personA1.
distances[0] = [1. 4.69041576]
告诉我们 personB1 和 personA2 之间的距离是 1,personB1 和 personA1 之间的距离是 4.69041576(如果您手动计算欧氏距离,您可以很容易地检查这一点)。
几点说明:
从您的问题描述来看,您似乎只对 SetB 中的人与 SetA 中的人最近的邻居感兴趣(而不是 2 个最近的邻居)。如果是这样,我建议将 knn 参数中的 n_neighbors=2 更改为 n_neighbors=1。
注意您的索引:在您的数据集中,标签从 1(personA1、personA2、...)开始,但在 knn 中,索引始终从 0 开始。这可能会导致混淆事情变得更加复杂,因为 SetA[0]=personA1,所以要注意它。
我对机器学习还很陌生。我试图根据他们的利率评级(1=低,10=高)将来自 SetA 的人与来自 SetB 的人匹配。我的真实数据集有 40 个特征(后来我想对某些特征设置更高的权重,以及不太常见的兴趣 - 我相信 this 会帮助我吗?)。
示例数据集:
>>> dfA = pd.DataFrame(np.array([[1, 1, 1], [4, 4, 4], [8, 8, 8]]),
columns=['interest1', 'interest2', 'interest3'],
index=['personA1','personA2','personA3'])
>>> dfB = pd.DataFrame(np.array([[4, 4, 3], [2, 2, 1], [1, 2, 2]]),
columns=['interest1', 'interest2', 'interest3'],
index=['personB1','personB2','personB3'])
print(dfA, "\n", dfB)
>>> interest1 interest2 interest3
personA1 1 1 1
personA2 4 4 4
personA3 8 8 8
interest1 interest2 interest3
personB1 4 4 3
personB2 2 2 1
personB3 1 2 2
我正在为此使用 sklearn 的最近邻算法:
knn = NearestNeighbors(n_neighbors = 2).fit(dfA)
distances, indicies = knn.kneighbors(dfB)
>>> print(distances, "\n \n", indicies)
>>>[[1. 4.69041576]
[1.41421356 4.12310563]
[1.41421356 4.12310563]]
[[1 0]
[0 1]
[0 1]]
我不明白输出?我知道一个类似的问题
最终,我想要一个匹配的最终数据框,例如:
SetA SetB
personA1 personB2
personA2 personB1
personA3 personB3
您得到的结果是从 SetA 中的人.
中选择的 SetB 中给定人的最近邻居
换句话说,第一个元素 distances[0]
告诉您 personB1 与其在 SetA 中的两个最近邻居的距离。 indicies[0]
告诉你这两个人的指数。
在这个例子中:
indicies[0] = [1, 0]
表示personB1在SetA1中的最近邻为SetA[1] = personA2和SetA[0] = personA1.
distances[0] = [1. 4.69041576]
告诉我们 personB1 和 personA2 之间的距离是 1,personB1 和 personA1 之间的距离是 4.69041576(如果您手动计算欧氏距离,您可以很容易地检查这一点)。
几点说明:
从您的问题描述来看,您似乎只对 SetB 中的人与 SetA 中的人最近的邻居感兴趣(而不是 2 个最近的邻居)。如果是这样,我建议将 knn 参数中的 n_neighbors=2 更改为 n_neighbors=1。
注意您的索引:在您的数据集中,标签从 1(personA1、personA2、...)开始,但在 knn 中,索引始终从 0 开始。这可能会导致混淆事情变得更加复杂,因为 SetA[0]=personA1,所以要注意它。