如何在K最近邻算法中找出属性权重?

4

我有一段Python代码,其中使用了一个房价数据集:

from sklearn.datasets import load_boston
from sklearn.neighbors import KNeighborsRegressor
from sklearn.preprocessing import scale

boston = load_boston()
y = boston.target
X = scale(boston.data)
knn = KNeighborsRegressor(n_neighbors=5, weights='distance', metric='minkowski', p=1)
knn.fit(X, y)

现在我可以预测目标属性,本例中为价格:

knn.predict([-0.41771335,  0.28482986, -1.2879095 , ..., -1.45900038,
     0.44105193, -1.0755623 ])

据我所知,这个算法应该会为每个属性找到一个权重来构建距离函数。 那么我在哪里可以找到每个属性的权重?我想知道哪个属性与房价具有最强的相关性。

为什么不直接通过计算特征与目标之间的相关性或互信息来确定特征的重要性呢? - Tomer Levinboim
我刚开始学习机器学习,不知道如何做。我认为这个算法会解决这个问题。 - Timrael
2
只需在每个特征和标签之间简单地计算np.correlate()。 - Tomer Levinboim
1个回答

8

您可以通过度量参数来指定权重。

首先,您的问题细节略有误。该算法不会“找到”一个距离函数 - 您提供了一个用于计算距离的度量标准,并提供一个用于根据这些距离计算权重的函数。您正在使用默认的距离度量方法,根据文档所述,它就是传统的欧几里得距离。

权重根据距离的倒数计算(也在文档中写明),因此您可以手动找到给定点的k个最近邻居,并使用内置的kneighbors方法计算它们的权重来找到邻居:

test = [[np.random.uniform(-1, 1) for _ in xrange(len(X[0]))]]

neighbors, distances = knn.kneighbors(test)
for d in distances:
    weight = 1.0/d
    print weight

问题在于所有特征的权重相等,因为您指定了欧几里得距离度量方式,即d是以下平方根:
1*(x1_neighbor - x1_test)^2 + 1*(x2_neighbor - x2_test)^2 + ...
这是因为闵可夫斯基距离度量方式只是一个对角线上有一的矩阵。如果您想要不同的权重,可以指定另一种度量方式。然而,如果您只想快速简单地告诉各种特征的重要性,一种典型的估计特征i的重要性的方法是随机排列特征i的所有值,并观察它对回归器性能的影响。更多信息请查看此处

这个算法根据原始点和目标点之间的距离给予权重,而不是根据点的属性给予权重,对吗? - Timrael
1
是的,代码片段打印出测试点邻居的权重(如果不清楚,对不起)。默认情况下,在查找距离时特征被平等加权(因为闵可夫斯基度量在对角线上只有1)。 我喜欢排列测试,因为它直观且适用于任何回归器/分类器(如果用噪声替换一个特征会严重损害回归器,则该特征很重要)。我看到评论者建议查看相关性,我认为这也是一个好方法(现在想不出反例,这并不意味着不存在)。 - bjarkemoensted

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接