2

任何人都可以告訴我我的代碼有什麼問題嗎? 爲什麼我可以使用LinearRegression預測虹膜數據集的概率,但是,KNeighborsClassifier會給我0或1,而它應該給我一個像LinearRegression一樣的結果?KNeighborsClassifier的概率預測方法只返回0和1

from sklearn.datasets import load_iris 
from sklearn import metrics 

iris = load_iris() 
X = iris.data 
y = iris.target 

for train_index, test_index in skf: 
    X_train, X_test = X_total[train_index], X_total[test_index] 
    y_train, y_test = y_total[train_index], y_total[test_index] 

from sklearn.linear_model import LogisticRegression 
ln = LogisticRegression() 
ln.fit(X_train,y_train) 

ln.predict_proba(X_test)[:,1] 

陣列([0.18075722,0.08906078,0.14693156,0.10467766, 0.14823032, 0.70361962,0.65733216,0.77864636,0.67203114,0.68655163, 0.25219798,0.3863194,0.30735105,0.13963637,0.28017798])

from sklearn.neighbors import KNeighborsClassifier 
knn = KNeighborsClassifier(n_neighbors=5, algorithm='ball_tree', metric='euclidean') 
knn.fit(X_train, y_train) 

knn.predict_proba(X_test)[0:10,1] 

陣列([0,0.1,0.1,0.1,0.1,1。,1.,1.,1.,1。])

+0

迴歸!=分類。並非所有的分類器都支持概率的概念! – sascha

回答

2

由於KNN的概率概念非常有限。它的估計只是最近鄰居中的一小部分票數。將鄰居數量增加到15或100或靠近決策邊界的查詢點,您將看到更多不同的結果。目前你的觀點總是隻有5個相同標籤的鄰居(因此概率爲0或1)。

+0

但是我的準確性下降了,因爲我會遠離最佳的K.我們如何進來,用相同的K,我們可以得到更彎曲的ROC,而在這裏(scikit)ROC非常敏銳? –

+0

KNN是一種啓發式算法,它有很多參數。這很可能是你的結果會有所不同。您也可以查看使用的指標和算法的默認值。甚至ROC曲線評估也可能不同!還有涉及到的隨機性(在KNN中)! – sascha