我正在嘗試從頭開始創建 KNN 函式,然后將其與 scikit-learn 進行比較KNeighborsClassifier。我正在使用 iris 資料集進行測驗。
根據我學到的知識,我必須單獨獲取每個資料點,然后計算它與其余訓練資料之間的距離。
最后一步是將它與最接近它的資料的目標值相關聯。出于某種原因,當我這樣做時,我的錯誤率為 4%。為什么會這樣?
from sklearn import *
import numpy as np
iris = datasets.load_iris()
X = iris.data
Y = iris.target
def PPV(data, target):
target_res = []
true = 0
for i in range(len(target)):
data_copy = data
target_copy = target
training_data = np.delete(data_copy, i, 0)
training_target = np.delete(target_copy, i, 0)
target_res.append(training_target[np.argmin(metrics.pairwise.euclidean_distances([data[i]], training_data))])
# print(f"{i} has target prediction {training_target[np.argmin(metrics.pairwise.euclidean_distances([data[i]], training_data))]}")
for i in range(len(target)):
if target[i] == target_res[i]:
true = true 1
print(f"The predicted PPV target values are: {target_res}")
print(f"PPV precision: {true*100/len(target)}%")
PPV(X, Y)
上面代碼的輸出是:
The predicted PPV target values are: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
PPV precision: 96.0%
KNeighbors precision: 100.0% = 1
除非我遺漏了什么,否則我應該能夠得到與KNeighborsClassifierK=1 演算法相同的結果,因為它們共享相同的原理。
uj5u.com熱心網友回復:
從訓練集中洗掉觀測值后,您正嘗試使用 1-最近鄰分類器對觀測值進行分類。因為觀察不再在訓練集中,所以不能保證每個觀察都會被正確分類。評分準確率可能低于 100%。
如果你正在做這樣的事情:
from sklearn.neighbors import KNeighborsClassifier
from sklearn import datasets
from sklearn import metrics
iris = datasets.load_iris()
X = iris.data
y = iris.target
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X, y)
knn_results = knn.predict(X) # we are predicting our own training data here
metrics.accuracy_score(y, knn_results) # 1.0
您將獲得 100% 的準確率,因為您使用 1-NN 對訓練集中的觀察結果進行分類。1-NN 分類器每次都會找到完美匹配的點。
如果您更改n_neighbors引數或使用新的測驗資料,則此示例中的準確度可能不再是 100%。
此外,您在代碼中使用的評分指標似乎是準確度,而不是精確度。https://en.wikipedia.org/wiki/Confusion_matrix
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/352625.html
