scikit-learn K近邻法类库使用小结
1.?scikit-learn 中KNN相關(guān)的類庫概述
在scikit-learn 中,與近鄰法這一大類相關(guān)的類庫都在sklearn.neighbors包之中。KNN分類樹的類是KNeighborsClassifier,KNN回歸樹的類是KNeighborsRegressor。除此之外,還有KNN的擴(kuò)展,即限定半徑最近鄰分類樹的類RadiusNeighborsClassifier和限定半徑最近鄰回歸樹的類RadiusNeighborsRegressor, 以及最近質(zhì)心分類算法NearestCentroid。
在這些算法中,KNN分類和回歸的類參數(shù)完全一樣。限定半徑最近鄰法分類和回歸的類的主要參數(shù)也和KNN基本一樣。
比較特別是的最近質(zhì)心分類算法,由于它是直接選擇最近質(zhì)心來分類,所以僅有兩個參數(shù),距離度量和特征選擇距離閾值,比較簡單,因此后面就不再專門講述最近質(zhì)心分類算法的參數(shù)。
另外幾個在sklearn.neighbors包中但不是做分類回歸預(yù)測的類也值得關(guān)注。kneighbors_graph類返回用KNN時和每個樣本最近的K個訓(xùn)練集樣本的位置。radius_neighbors_graph返回用限定半徑最近鄰法時和每個樣本在限定半徑內(nèi)的訓(xùn)練集樣本的位置。NearestNeighbors是個大雜燴,它即可以返回用KNN時和每個樣本最近的K個訓(xùn)練集樣本的位置,也可以返回用限定半徑最近鄰法時和每個樣本最近的訓(xùn)練集樣本的位置,常常用在聚類模型中。
2. K近鄰法和限定半徑最近鄰法類庫參數(shù)小結(jié)
本節(jié)對K近鄰法和限定半徑最近鄰法類庫參數(shù)做一個總結(jié)。包括KNN分類樹的類KNeighborsClassifier,KNN回歸樹的類KNeighborsRegressor, 限定半徑最近鄰分類樹的類RadiusNeighborsClassifier和限定半徑最近鄰回歸樹的類RadiusNeighborsRegressor。這些類的重要參數(shù)基本相同,因此我們放到一起講。
| 參數(shù) | KNeighborsClassifier | KNeighborsRegressor | RadiusNeighborsClassifier | RadiusNeighborsRegressor |
| KNN中的K值n_neighbors? | K值的選擇與樣本分布有關(guān),一般選擇一個較小的K值,可以通過交叉驗(yàn)證來選擇一個比較優(yōu)的K值,默認(rèn)值是5。如果數(shù)據(jù)是三維一下的,如果數(shù)據(jù)是三維或者三維以下的,可以通過可視化觀察來調(diào)參。 | 不適用于限定半徑最近鄰法 | ||
| 限定半徑最近鄰法中的半radius? | 不適用于KNN | 半徑的選擇與樣本分布有關(guān),可以通過交叉驗(yàn)證來選擇一個較小的半徑,盡量保證每類訓(xùn)練樣本其他類別樣本的距離較遠(yuǎn),默認(rèn)值是1.0。如果數(shù)據(jù)是三維或者三維以下的,可以通過可視化觀察來調(diào)參。 | ||
| 近鄰權(quán)weights? | 主要用于標(biāo)識每個樣本的近鄰樣本的權(quán)重,如果是KNN,就是K個近鄰樣本的權(quán)重,如果是限定半徑最近鄰,就是在距離在半徑以內(nèi)的近鄰樣本的權(quán)重。可以選擇"uniform","distance" 或者自定義權(quán)重。選擇默認(rèn)的"uniform",意味著所有最近鄰樣本權(quán)重都一樣,在做預(yù)測時一視同仁。如果是"distance",則權(quán)重和距離成反比例,即距離預(yù)測目標(biāo)更近的近鄰具有更高的權(quán)重,這樣在預(yù)測類別或者做回歸時,更近的近鄰所占的影響因子會更加大。當(dāng)然,我們也可以自定義權(quán)重,即自定義一個函數(shù),輸入是距離值,輸出是權(quán)重值。這樣我們可以自己控制不同的距離所對應(yīng)的權(quán)重。 一般來說,如果樣本的分布是比較成簇的,即各類樣本都在相對分開的簇中時,我們用默認(rèn)的"uniform"就可以了,如果樣本的分布比較亂,規(guī)律不好尋找,選擇"distance"是一個比較好的選擇。如果用"distance"發(fā)現(xiàn)預(yù)測的效果的還是不好,可以考慮自定義距離權(quán)重來調(diào)優(yōu)這個參數(shù)。 | |||
| KNN和限定半徑最近鄰法使用的算法algorithm? | 算法一共有三種,第一種是蠻力實(shí)現(xiàn),第二種是KD樹實(shí)現(xiàn),第三種是球樹實(shí)現(xiàn)。這三種方法在K近鄰法(KNN)原理小結(jié)中都有講述,如果不熟悉可以去復(fù)習(xí)下。對于這個參數(shù),一共有4種可選輸入,‘brute’對應(yīng)第一種蠻力實(shí)現(xiàn),‘kd_tree’對應(yīng)第二種KD樹實(shí)現(xiàn),‘ball_tree’對應(yīng)第三種的球樹實(shí)現(xiàn), ‘a(chǎn)uto’則會在上面三種算法中做權(quán)衡,選擇一個擬合最好的最優(yōu)算法。需要注意的是,如果輸入樣本特征是稀疏的時候,無論我們選擇哪種算法,最后scikit-learn都會去用蠻力實(shí)現(xiàn)‘brute’。 個人的經(jīng)驗(yàn),如果樣本少特征也少,使用默認(rèn)的?‘a(chǎn)uto’就夠了。 如果數(shù)據(jù)量很大或者特征也很多,用"auto"建樹時間會很長,效率不高,建議選擇KD樹實(shí)現(xiàn)‘kd_tree’,此時如果發(fā)現(xiàn)‘kd_tree’速度比較慢或者已經(jīng)知道樣本分布不是很均勻時,可以嘗試用‘ball_tree’。而如果輸入樣本是稀疏的,無論你選擇哪個算法最后實(shí)際運(yùn)行的都是‘brute’。 | |||
| 停止建子樹的葉子節(jié)點(diǎn)閾值leaf_size | 這個值控制了使用KD樹或者球樹時, 停止建子樹的葉子節(jié)點(diǎn)數(shù)量的閾值。這個值越小,則生成的KD樹或者球樹就越大,層數(shù)越深,建樹時間越長,反之,則生成的KD樹或者球樹會小,層數(shù)較淺,建樹時間較短。默認(rèn)是30. 這個值一般依賴于樣本的數(shù)量,隨著樣本數(shù)量的增加,這個值必須要增加,否則不光建樹預(yù)測的時間長,還容易過擬合。可以通過交叉驗(yàn)證來選擇一個適中的值。 如果使用的算法是蠻力實(shí)現(xiàn),則這個參數(shù)可以忽略。 | |||
| 距離度量metric? | ?K近鄰法和限定半徑最近鄰法類可以使用的距離度量較多,一般來說默認(rèn)的歐式距離(即p=2的閔可夫斯基距離)就可以滿足我們的需求。可以使用的距離度量參數(shù)有: a) 歐式距離?“euclidean”:?∑i=1n(xi?yi)2??????????√∑i=1n(xi?yi)2 b) 曼哈頓距離 “manhattan”:?∑i=1n|xi?yi|∑i=1n|xi?yi| c) 切比雪夫距離“chebyshev”:?max|xi?yi|(i=1,2,...n)max|xi?yi|(i=1,2,...n) d)?閔可夫斯基距離?“minkowski”(默認(rèn)參數(shù)):?∑i=1n(|xi?yi|)p???????????√p∑i=1n(|xi?yi|)pp?p=1為曼哈頓距離, p=2為歐式距離。 e) 帶權(quán)重閔可夫斯基距離?“wminkowski”:?∑i=1n(w?|xi?yi|)p??????????????√p∑i=1n(w?|xi?yi|)pp?其中w為特征權(quán)重 f) 標(biāo)準(zhǔn)化歐式距離?“seuclidean”: 即對于各特征維度做了歸一化以后的歐式距離。此時各樣本特征維度的均值為0,方差為1. g) 馬氏距離“mahalanobis”:(x?y)TS?1(x?y)???????????????√(x?y)TS?1(x?y)?其中,S?1S?1為樣本協(xié)方差矩陣的逆矩陣。當(dāng)樣本分布獨(dú)立時, S為單位矩陣,此時馬氏距離等同于歐式距離 還有一些其他不是實(shí)數(shù)的距離度量,一般在KNN之類的算法用不上,這里也就不列了。 | |||
| 距離度量附屬參數(shù)p | p是使用距離度量參數(shù) metric 附屬參數(shù),只用于閔可夫斯基距離和帶權(quán)重閔可夫斯基距離中p值的選擇,p=1為曼哈頓距離, p=2為歐式距離。默認(rèn)為2 | |||
| 距離度量其他附屬參數(shù)metric_params | ?一般都用不上,主要是用于帶權(quán)重閔可夫斯基距離的權(quán)重,以及其他一些比較復(fù)雜的距離度量的參數(shù)。 | |||
| 并行處理任務(wù)數(shù)n_jobs | 主要用于多核CPU時的并行處理,加快建立KNN樹和預(yù)測搜索的速度。一般用默認(rèn)的-1就可以了,即所有的CPU核都參與計算。 | ??不適用于限定半徑最近鄰法 | ||
| 異常點(diǎn)類別選擇outlier_label | 不適用于KNN | ?主要用于預(yù)測時,如果目標(biāo)點(diǎn)半徑內(nèi)沒有任何訓(xùn)練集的樣本點(diǎn)時,應(yīng)該標(biāo)記的類別,不建議選擇默認(rèn)值 none,因?yàn)檫@樣遇到異常點(diǎn)會報錯。一般設(shè)置為訓(xùn)練集里最多樣本的類別。 | ??不適用于限定半徑最近鄰回歸 | |
?
3. 使用KNeighborsClassifier做分類的實(shí)例
3.1 生成隨機(jī)數(shù)據(jù)
首先,我們生成我們分類的數(shù)據(jù),代碼如下:
import numpy as np import matplotlib.pyplot as plt %matplotlib inline from sklearn.datasets.samples_generator import make_classification # X為樣本特征,Y為樣本類別輸出, 共1000個樣本,每個樣本2個特征,輸出有3個類別,沒有冗余特征,每個類別一個簇 X, Y = make_classification(n_samples=1000, n_features=2, n_redundant=0,n_clusters_per_class=1, n_classes=3) plt.scatter(X[:, 0], X[:, 1], marker='o', c=Y) plt.show()先看看我們生成的數(shù)據(jù)圖如下。由于是隨機(jī)生成,如果你也跑這段代碼,生成的隨機(jī)數(shù)據(jù)分布會不一樣。下面是我某次跑出的原始數(shù)據(jù)圖。
接著我們用KNN來擬合模型,我們選擇K=15,權(quán)重為距離遠(yuǎn)近。代碼如下:
from sklearn import neighbors clf = neighbors.KNeighborsClassifier(n_neighbors = 15 , weights='distance') clf.fit(X, Y)最后,我們可視化一下看看我們預(yù)測的效果如何,代碼如下:
from matplotlib.colors import ListedColormap cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF']) cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])#確認(rèn)訓(xùn)練集的邊界 x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 #生成隨機(jī)數(shù)據(jù)來做測試集,然后作預(yù)測 xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),np.arange(y_min, y_max, 0.02)) Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])# 畫出測試集數(shù)據(jù) Z = Z.reshape(xx.shape) plt.figure() plt.pcolormesh(xx, yy, Z, cmap=cmap_light)# 也畫出所有的訓(xùn)練集數(shù)據(jù) plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=cmap_bold) plt.xlim(xx.min(), xx.max()) plt.ylim(yy.min(), yy.max()) plt.title("3-Class classification (k = 15, weights = 'distance')" )生成的圖如下,可以看到大多數(shù)數(shù)據(jù)擬合不錯,僅有少量的異常點(diǎn)不在范圍內(nèi)。
以上就是使用scikit-learn的KNN相關(guān)類庫的一個總結(jié),希望可以幫到朋友們。
本文轉(zhuǎn)自劉建平Pinard博客園博客,原文鏈接:http://www.cnblogs.com/pinard/p/6065607.html,如需轉(zhuǎn)載請自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的scikit-learn K近邻法类库使用小结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: What every programme
- 下一篇: JAVA BIO 服务器与客户端实现示例