1. 程式人生 > >skiti-learn KNN演算法庫

skiti-learn KNN演算法庫

skiti-learn中KNN分類樹的類是KNighborsClassifier,KNN迴歸樹的類是KNighborsRegressor.除此之外,限定半徑的最鄰近分類樹RadiusNighborsClassifier,限定半徑的最鄰近迴歸樹RadiusNighborsRegressor,最近質心分類演算法NearestCentroid.
這些演算法類中,KNN的分類和迴歸引數完全一樣,限定半徑的分類和迴歸和KNN也基本一樣,最近質心分類演算法,直接選擇最近的質心來分類,只有兩個引數,距離度量和特徵選擇距離閾值。
在sklearn.neighbors包中也包含一些不做分類迴歸的類。kneighbors_graph類返回用KNN時和每個樣本最近的K個訓練集樣本的位置。radius_neighbors_graph返回用限定半徑最近鄰法時和每個樣本在限定半徑內的訓練集樣本的位置。NearestNeighbors是個大雜燴,它即可以返回用KNN時和每個樣本最近的K個訓練集樣本的位置,也可以返回用限定半徑最近鄰法時和每個樣本最近的訓練集樣本的位置。

  • KNN和限定半徑最鄰近引數選擇
    1).KNN中的K值 n_neighbors
    KNeighborsClassifier and KNeighborsRegressor:
    K 值的選擇與樣本分佈相關,一般選擇一個較小的K值,然後用交叉驗證來選擇一個比較優的K值,預設為5。如果是三維或者三維以下的可以用視覺化調參。
    不適應於限定半徑的最鄰近法
    2).限定半徑最鄰近法中的半徑radius:
    RadiusNeighborsClassifier andRadiusNeighborsRegressor:
    radius的選擇與樣本分佈有關,可以通過交叉驗證集選擇一個較小的半徑,儘量保證每個訓練樣本與其他樣本距離較遠,預設值為1.0。如果三維或三維以下,可用視覺化調參。
    不適用於KNN
    3).鄰近權weights
    主要用於標識每個樣本鄰近樣本的權重,如果是KNN,則表示K個鄰近樣本的權重。如果是限定半徑鄰近,則表示距離在半徑以內鄰近樣本的權重。引數可以選擇’uniform’,‘distance’或者自定義權重。預設的‘uniform’,指權重一樣,預測時一視同仁。’diatance’,權重與距離成反比,距離預測目標更近的樣本具有更高的權重。自定義權重,可以設定一個函式,輸入是距離,輸出為權重,這樣可以控制不同距離所對應的權重。
    一般使用預設的‘uniform’就可,如果樣本分佈較亂,可以選擇’distance‘選擇一個好的,如果效果還不好,可以考慮自定義權重。
    4).KNN和限定半徑最鄰近法使用的演算法algorithm
    演算法一共三種:蠻力實現,KD樹實現,球樹實現。有四種可選的輸入,‘brute’對應第一種蠻力實現,‘kd_tree’對應KD樹實現,’ball_tree’對應第三種球樹實現,‘auto’在三種演算法中做權衡。如果輸入樣本特徵是稀疏的時候,無論選擇哪種特徵skiti-learn都會選擇蠻力實現。
    如果樣本少特徵也少,使用預設的 ‘auto’就夠了。 如果資料量很大或者特徵也很多,用"auto"建樹時間會很長,效率不高,建議選擇KD樹實現‘kd_tree’,此時如果發現‘kd_tree’速度比較慢或者已經知道樣本分佈不是很均勻時,可以嘗試用‘ball_tree’。而如果輸入樣本是稀疏的,無論你選擇哪個演算法最後實際執行的都是‘brute’。
    5).停止建子樹的葉子節點閾值leaf_size
    控制KD樹或者球樹建子樹葉子節點的數量,值越小,樹越大,層越深,建樹時間越長,預設為30,這個值依賴於樣本的數量,樣本增加這個值必須增加,可以用交叉驗證選擇一個合適的值,如果演算法為蠻力實現,可以忽略這個引數。
    6).距離度量metric
    常用的距離度量引數有:歐氏距離’euclidean’,曼哈頓距離’manhattan’,切比雪夫距離‘chebyshev’,閔可夫斯基距離 “minkowski”(預設引數),帶權重閔可夫斯基距離 “wminkowski”,標準化歐式距離 “seuclidean”(對於各特徵歸一化的歐式距離,特徵維度的均值為0,方差為1),馬氏距離“mahalanobis”。
    預設的歐式距離(即p=2的閔可夫斯基距離)就可以滿足我們的需求
    7).距離度量附屬引數p
    p是使用距離度量引數metric附屬引數,只用於閔可夫斯基距離和帶權重閔可夫斯基距離中p值的選擇,p=1為曼哈頓距離, p=2為歐式距離。預設為2。
    8).距離度量其他附屬引數metric_params
    一般都用不上,主要是用於帶權重閔可夫斯基距離的權重,以及其他一些比較複雜的距離度量的引數。
    9).並行處理任務數n_jobs
    主要用於多核CPU時的並行處理,加快建立KNN樹和預測搜尋的速度。一般用預設的-1就可以了,即所有的CPU核都參與計算。不適用於限定半徑最鄰近法
    10).異常點類別選擇outlier_label
    不適用於KNN和限定半徑最近鄰迴歸。主要用於預測時,如果目標點半徑內沒有任何訓練集的樣本點時,應該標記的類別,不建議選擇預設值 none,因為這樣遇到異常點會報錯。一般設定為訓練集裡最多樣本的類別。