class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights=’uniform’, algorithm=’auto’, leaf_size=30,
p=2, metric=’minkowski’,metric_params=None, n_jobs=None, **kwargs)
Source code:https://github.com/scikit-learn/scikit-learn/blob/1495f6924/sklearn/neighbors/classification.py#L23
1,KNeighborsClassifier參數介紹
n_neighbors: int,默認值為5
表示k-nn算法中選取離測試數據最近的k個點,
weight: str or callable,默認值為uniform
表示k近鄰點都分類結果的影響,一般的情況下是選取k近鄰點中類別數目最多的作為分類結果,這種情況下默認k個點的權重相等,但在很多情況下,
k近鄰點權重並不相等,可能近的點權重大,對分類結果影響大。
默認值為uniform,還可以是distance和自定義函數
- 'uniform':表示所有點的權重相等
- 'distance':表示權重是距離的倒數,意味着k個點中距離近的點對分類結果的影響大於距離遠的點
- [callable]:用戶自定義函數,接受一個距離數組,返回一個同維度的權重數
algorithm:{'ball_tree','kd_tree','brute','auto'}
計算找出k近鄰點的算法
- 'ball_tree':使用BallTree維數大於20時建議使用
- 'kd_tree':使用KDTree,原理是數據結構的二叉樹,以中值為划分,每個節點是一個超矩形,在維數小於20是效率高
- 'brute':暴力算法,線性掃描
- 'auto':自動選取最合適的算法
note:在稀疏的輸入數據上擬合,將使用'brute'覆蓋此參數
leaf_size:int,默認值為30
用於構造BallTree和KDTree
leaf_size參數設置會影響樹構造的樹構造和詢問的速度,同樣也會影響樹存儲需要的內存,這個值的設定取決於問題本身
p:int,默認值為2
- 1:使用曼哈頓距離進行度量
- 2:使用歐式距離進行度量
metric : string or callable, 默認使用'minkowski'(閔可夫斯基距離),度量函數
其中p是一個變參數,也就是上一個介紹的參數p
當p=1時,就是曼哈頓距離
當p=2時,就是歐氏距離
當p→∞時,就是切比學夫距離
metric_params : dict, 默認為None
度量函數的其他關鍵參數,一般不用設置
n_jobs : int or None, 默認None
用於搜索k近鄰點並行任務數量,-1表示任務數量設置為CPU的核心數,即CPU的所有core都並行工作,不會影響fit(擬合)函數
注意:關於如何選擇algorithm 和 leaf_size參數,請查看Nearest Neighborsi的在線文檔。
警告:根據Nearest Neighbors算法,如果找到兩個鄰居,例如鄰居k+1和k,他們有着一樣的距離但是不一樣的標簽,最后的結果會根據訓練數據的順序來決定。
https://en.wikipedia.org/wiki/K-nearest_neighbor_algorithm
fit (self, X, y) |
使用X作為訓練集作為便簽集,來擬合模型 |
get_params (self[, deep]) |
獲得估計器的參數 |
kneighbors (self[, X, n_neighbors, …]) |
查找X數組X數組中所有點的K鄰居點 |
kneighbors_graph (self[, X, n_neighbors, mode]) |
計算X中每個點的K鄰居權重圖 |
predict (self, X) |
預測X數據集中每個點對應的標簽 |
predict_proba (self, X) |
返回X數據集中對應每個標簽的概率估計值 |
score (self, X, y[, sample_weight]) |
返回給定數據集和標簽的平均准確率 |
set_params(**params) | 設置估計器的參數 |
__init__(self, n_neighbors=5, weights=’uniform’, algorithm=’auto’, leaf_size=30, p=2, metric=’minkowski’, metric_params=None, n_jobs=None, **kwargs)
fit
(self, X, y)
使用X作為訓練集,y作為標簽集,擬合模型
參數
X:{類似數組,稀疏矩陣,BallTree,KDTree}
訓練集:如果是數組或者矩陣,形狀為[n_samples, n_features],如果參數metric='precomputed',形狀為[n_samples, n_samples]
y:{類似數組,稀疏矩陣}
標簽集:形狀為[n_samples]或者[n_samples, n_outputs]
get_params
(self, deep=True)
獲取估計器的參數
參數
deep:boolean,可選
如果為True,返回估計器的參數,以及包含子估計器
返回值
Returns:mapping of string to any
返回Map變量,內容為[參數值:值, 參數值:值, ...]
kneighbors(X=None,n_neighbors=None,return_distance=True)
查詢X數組中的K鄰居點,返回每個點的下標和查詢點和鄰居點之間的距離
參數:
X:類型數組,形狀為 (n_query, n_features),如果參數metric == ‘precomputed’形狀為(n_query, n_indexed)
在沒有提供查詢點的情況下,則返回有下標點的鄰居們,這種情況下,沒有考慮查詢點的鄰居們
n_neighbors:int
返回的鄰居點的個數(默認使用改造器是設定的n_neighbors值)
return_distance:boolean,可選。 默認為True
如果為False,距離值就不會返回
返回值:
Returns:
dist:數組
當return_distance=True是,返回到每個近鄰點的距離
ind:數組
返回近鄰點的下標
例子
在下面例子中,我們從給定數據集中構建一個NeighborsClassifier類,並詢問哪個點最接近[1, 1, 1]
from sklearn.neighbors import NearestNeighbors samples = [[0., 0., 0.], [0., .5, 0.], [1., 1., .5]] neigh = NearestNeighbors(n_neighbors=1) neigh.fit(samples) print(neigh.get_params()) print(neigh.kneighbors([[1., 1., 1.]]))
{'algorithm': 'auto', 'leaf_size': 30, 'metric': 'minkowski', 'metric_params': None, 'n_jobs': None, 'n_neighbors': 1, 'p': 2, 'radius': 1.0}
(array([[0.5]]), array([[2]], dtype=int64))
因為n_neighbors=1,所有只返回一個點的數據[[0.5]]意味着近鄰點與查詢點的距離為0.5,而[[2]]意味着這個近鄰點的下標,同樣你也可以查詢多個點
X = [[0., 1., 0.], [1., 0., 1.]] print(neigh.kneighbors(X, return_distance=False))
[[1],[2]]
[[1],[2]]表示,第一個查詢點的近鄰點下標為1,同樣第二個查詢點的近鄰點下標為2
kneighbors
(self, X=None, n_neighbors=None, return_distance=True)
計算X數組中每個點的k鄰居權重圖
參數:
X:類似數組,形狀為 (n_query, n_features),如果參數metric == ‘precomputed’,形狀為 (n_query, n_indexed)
一個或者多個查詢點,如果沒有提供,則返回每個有下標的鄰居們
n_neighbors : int
每個查詢的鄰居數量(默認使用擬合時設置的n_neighbors)
mode : {‘connectivity’, ‘distance’}, 可選返回矩陣類型:'connectivity',返回0和1組成的矩陣,'distance',返回點與點之間的歐幾里得距離
返回值:
A:CSR格式的稀疏矩陣,形狀為[n_samples, n_samples_fit]
n_samples是擬合過程中樣例的數量,A[i, j]是i到j的權重
from sklearn.neighbors import NearestNeighbors X = [[0], [3], [1]] neigh = NearestNeighbors(radius=1.5) neigh.fit(X) A = neigh.radius_neighbors_graph(X) print(A.toarray())
[[1. 0. 1.]
[0. 1. 0.]
[1. 0. 1.]]
預測提供的數據對應的類別標簽
參數:
X:類似數組,形狀為(n_query, n_features),如果參數metric == 'precomputed',形狀為(n_query, n_indexed)
待測試數據
返回值:
y:形狀為[n_samples]或者為[n_samples, n_outputs]
每個待測試樣例的類別標簽
預測X中每個測試樣例對應每個類別的概率估計值
參數:
X:類似數組,形狀為(n_query, n_features),如果參數metric == 'precomputed',形狀為(n_query, n_indexed)
帶測試樣例
返回值:
p:形狀為[n_samples, n_classes],或者n_outputs列表
輸出每個樣例對於每個類別的概率估計值,類別按照字典順序排序
from sklearn.neighbors import KNeighborsClassifier X = [[0], [1], [2], [3]] y = [0, 0, 1, 1] neigh = KNeighborsClassifier(n_neighbors=3) neigh.fit(X, y) print(neigh.predict([[1.1]])) print(neigh.predict_proba([[1.1]]))
[0]
[[0.66666667 0.33333333]]
解釋:[0]表示預測[1.1]屬於類型0,而[[0.66666667 0.33333333]]表示[1,1]屬於類型0的概率為0.66666667,屬於類型1的概率為0.33333333
score
(self, X, y, sample_weight=None)
返回給定測試集和標簽的平均准確度。在多標簽分類中,返回各個子集的准確度
參數:
X:類似數組,形狀為 (n_samples, n_features)
測試數據
y:類似數組,形狀為(n_samples)或者(n_samples, n_outputs)X對應的正確標簽
sample_weight : 類似數組,形狀為[n_samples], 可選
樣例的權重
返回值:
score : float
self.predict(X)關於y的平均准確率
from sklearn.neighbors import KNeighborsClassifier X = [[0], [1], [2], [3]] y = [0, 0, 1, 1] neigh = KNeighborsClassifier(n_neighbors=3) neigh.fit(X, y) print(neigh.predict([[1.1], [2.1], [3.1]])) print(neigh.score([[1.1], [2.1], [3.1]], [0, 1, 0]))
[0 1 1]
0.6666666666666666
可以看出3個測試數據,預測類別有2個正確,1個錯誤,所有准確率為0.6666666666666666
設置估計器的參數
這個方法不僅對於單個估計器,而且對於嵌套對象(類如管道)都有效,而嵌套對象有着<component>__<parameter>形式的參數,所以可以更新嵌套對象的每個參數
返回值:
self