我在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应该为每个属性找到权重以产生距离函数。 我在哪里可以找到每个属性的计算权重?我想知道哪个属性与房价有最强的相关性。
答案 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的更多信息。