2019-06-27-4.5 超參數(shù)

4.5 超參數(shù)

  • 超參數(shù)就是指在運(yùn)行機(jī)器學(xué)習(xí)算法之前,需要指定的參數(shù)。
  • 模型參數(shù):算法過程中學(xué)習(xí)的參數(shù)。
  • KNN算法沒有模型參數(shù),k是典型的超參數(shù)。
  • 調(diào)參一般說的就是超參數(shù)</br>

如何尋找到一個(gè)好的超參數(shù)呢?

  • 領(lǐng)域知識(shí)
  • 經(jīng)驗(yàn)數(shù)值
  • 實(shí)驗(yàn)搜索
import numpy as np
from sklearn import datasets

# 加載手寫數(shù)字?jǐn)?shù)據(jù)集
digits = datasets.load_digits()

X = digits.data
y = digits.target

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=666)

from sklearn.neighbors import KNeighborsClassifier

knn_clf = KNeighborsClassifier(n_neighbors=3)
knn_clf.fit(X_train, y_train)
knn_clf.score(X_test, y_test)

尋找最好的k

# 初始設(shè)置為0
best_score = 0.0
best_k = -1
for k in range(1, 11)
    knn_clf = KNeighborsClassifier(n_neighbors=k)
    knn_clf.fit(X_train, y_train)
    score = knn_clf.score(X_test, y_test)
    if score > best_score:
        best_k = k
        best_score = score

print("best_k = ", best_k)
print("best_score = ", best_score)

如果我們運(yùn)行的結(jié)果k值接近我們?cè)O(shè)定的邊界值,例如結(jié)果k=10,這時(shí)候我們需要將設(shè)定的范圍擴(kuò)大,將range變?yōu)?8,20)在重新尋找一下最好的k值。因?yàn)橐话阕詈玫膋取到邊界值時(shí),有可能最好的在邊界外。</br>
除了k之外,k近鄰算法還有一個(gè)超參數(shù)。</br>
看下面的示例圖,按照普通的k近鄰算法,新的樣本點(diǎn)(綠色點(diǎn))計(jì)算與它周圍最近的三個(gè)點(diǎn),發(fā)現(xiàn)藍(lán)色個(gè)數(shù)一共有2個(gè),所以藍(lán)色獲勝。但是其實(shí)樣本點(diǎn)是距離紅色是最近的,所以在這種情況下是不是紅色點(diǎn)的權(quán)重應(yīng)該要比藍(lán)色點(diǎn)的要重一些呢?這就是k近鄰的另外一個(gè)用法,考慮了距離的權(quán)重。

image.png

通常而言,我們考慮的距離權(quán)重是將距離的倒數(shù)作為權(quán)重。距離越近權(quán)重越大。</br>
紅色是1,藍(lán)色是1/3+1/4=7/12 紅色勝
考慮距離權(quán)重還有一個(gè)優(yōu)點(diǎn)。比如之前的普通方法有可能選取的最近的三個(gè)點(diǎn)是三類點(diǎn),出現(xiàn)平票的情況,這時(shí)候會(huì)隨機(jī)選擇一個(gè)點(diǎn)作為預(yù)測(cè)點(diǎn),顯然這樣也是不合理的。所以加入了距離的權(quán)重之后,可以根據(jù)三點(diǎn)之間的距離權(quán)重選擇更為精確的預(yù)測(cè)點(diǎn)。

考慮距離?不考慮距離?

best_method = ""
best_score = 0.0
best_k = -1
# weights有兩個(gè)值,默認(rèn)不使用是uniform
for method in ["uniform", "distance"]:
    for k in range(1, 11):
        knn_clf = KNeighborsClassifier(n_neighbors=k, weights=method)
        knn_clf.fit(X_train, y_train)
        score = knn_clf.score(X_test, y_test)
        if score > best_score:
            best_k = k
            best_score = score
            best_method = method
print("best_method = ", best_method)
print("best_k = ", best_k)
print("best_score = ", best_score)

運(yùn)行結(jié)果如下:


image.png

更多關(guān)于距離的定義

曼哈頓距離
image.png

曼哈頓距離就是點(diǎn)在每個(gè)維度的距離之和。在這個(gè)圖中,紅黃紫色的都是曼哈頓距離,而綠色就是歐拉距離。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容