簡體   English   中英

如何在K-最近鄰算法中找出屬性的權重?

[英]How to find out weights of attributes in K-nearest neighbors algorithm?

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

據我了解,該算法應該為每個屬性找到權重以制作距離函數。 我在哪里可以找到每個屬性的計算權重? 我想知道什么屬性與房價的相關性最強。

您實際上是通過 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 + ...

這是因為 Minkowsky 度量只是一個沿對角線有 1 的矩陣。 如果需要不同的權重,可以指定替代指標。 但是,如果您只是想要一種快速而骯臟的方式來說明各種特征的重要性,估計特征i重要性的一種典型方法是隨機排列特征i 的所有值,看看它對回歸器的性能有多大影響. 您可以在此處閱讀更多相關信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM