我在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的所有值,看看这对回归器的性能影响有多大。您可以在这里阅读更多相关信息。