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

我在Python中使用房价数据集编写了如下代码:

from sklearn.datasets import load_bostonfrom sklearn.neighbors import KNeighborsRegressorfrom sklearn.preprocessing import scaleboston = load_boston()y = boston.targetX = 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 ])

据我所知,这个算法应该为每个属性计算权重以构建距离函数。我想知道在哪里可以找到每个属性的计算权重?我很好奇哪个属性与房价的相关性最强。


回答:

实际上,您是通过metric参数来指定权重的。

首先,您的问题描述略有错误。该算法并不寻找距离函数——您提供了一个用于计算距离的度量,以及一个根据这些距离计算权重的函数。您使用的是默认的距离度量,根据文档,这是传统的欧几里得距离。

权重被计算为距离的倒数(也在文档中说明),因此您可以手动找到给定点的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时是以相同的权重进入的,因为您指定了欧几里得度量,即d是以下内容的平方根:

1*(x1_neighbor – x1_test)^2 + 1*(x2_neighbor – x2_test)^2 + …

这是因为闵可夫斯基度量只是对角线上全为1的矩阵。如果您想要不同的权重,您可以指定一个替代的度量。然而,如果您只是想快速粗略地了解各种特征的重要性,一个典型的估计特征i重要性的方法是随机打乱特征i的所有值,看看这对回归器的性能影响有多大。您可以在这里阅读更多相关信息。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注