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

时间:2016-03-05 15:34:19

标签: python algorithm machine-learning scikit-learn

我在python中有这样的代码,数据集为house prices

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 ])

据我所知,this algorithm应该为每个属性找到权重以产生距离函数。 我在哪里可以找到每个属性的计算权重?我想知道哪个属性与房价有最强的相关性。

1 个答案:

答案 0 :(得分:5)

您实际上是通过指标参数指定权重。

首先,您的问题详细信息略有不正确。该算法不会找到距离函数 - 您为其提供计算距离的度量,以及根据这些距离计算权重的函数。您正在使用默认距离指标,根据the docs,这是一个很好的欧几里德距离。

权重计算为距离的倒数(也写在文档中),因此您可以手动查找给定点的k个邻居,并使用build in 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 + ...

这是因为Minkowsky度量只是一个沿对角线的矩阵。如果您需要不同的权重,则可以指定备用度量标准。但是,如果您只想快速而肮脏地说明各种功能的重要性,那么估算功能 i 重要性的典型方法是随机置换功能 i <的所有值/ em>并看看它对回归量的性能造成了多大的伤害。您可以阅读有关here的更多信息。