日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

scikit-learn K近邻法类库使用小结

發(fā)布時間:2025/4/16 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 scikit-learn K近邻法类库使用小结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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ù)KNeighborsClassifierKNeighborsRegressorRadiusNeighborsClassifierRadiusNeighborsRegressor

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。