機器學習:調整kNN的超參數


一、評測標准

  • 模型的測評標准:分類的准確度(accuracy);
  • 預測准確度 = 預測成功的樣本個數/預測數據集樣本總數;

 

二、超參數

  • 超參數:運行機器學習算法前需要指定的參數;
  • kNN算法中的超參數:k、weights、P;
  • 一般超參數之間也相互影響;
  • 調參,就是調超參數;

 1)問題

  # 以kNN算法為例

  1. 平票:如果k個點中,不同類型的樣本數相等,怎么選取?
  2. 如果選取的k個點中,數量多的一類樣本點距離測試樣本較遠,數量少的一類樣本點距離測試樣本較近,此時選取數量較多的類型作為輸出結果,不具說服力;

 2)kNN算法中,除了K值外的另一個超參數:距離的權重(1/距離)

  • k個點中,將不同類的點的權重相加,最大的那一類為目標標簽
  1. scikit-learn庫中的KNeighborsClassifier類中,還有一個weights()函數;
  2. 在__init__()中默認兩個參數值:__init__(n_neighbors = 5, weights = 'uniform');
  3. weights = 'uniform',表示不考慮距離權重這個超參數;
  4. weights= 'distance',表示考慮距離權重這個超參數;

 3)kNN算法的第三個超參數:P,距離參數

  • P是有“明科夫斯基距離”得來的(詳見“四、距離推導”),
  • 只有當kNN算法考慮距離權重超參數(weights)時,才會考慮是否輸入距離參數(P);

 4)調參的方法

  • 調參目的,找到最優的超參數;
  • 機器學習算法應用在不同的領域中,不同領域內有其特有的知識
  1、通過領域知識得到

   # 不同領域內,遇到不同的問題,產參數一般不同;

   # 領域:如自然語言處理、視覺搜索等;

  2、經驗數值

   # 一般機器學習算法庫中,會封裝一些默認的超參數,這些默認的超參數一般都是經驗數值;

   # kNN算法這scikit-learn庫中,k值默認為5,5就是在經驗上比較好的數值;

  3、通過試驗搜索得到
  • 思路:將不同的超參數輸入模型,選取准確度最高的超參數;
  • 試驗搜索也稱為網格搜索:對不同的超參數,使用對個for語句,逐層搜索;
  • 試驗搜索過程:以kNN算法為例;
    # 在Jupyter NoteBook中實現的代碼
    
    import numpy as np
    from sklearn import datasets
    
    digits = datasets.load_digits()
    X = digits.data
    y = digits.target
    
    from ALG.train_test_split import train_test_split
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_train = 0.2)
    
    # 1)按經驗選定超參數k = 5
    from sklearn.neighbors import KNeighborsClassifier
    
    knn_clf = KNeighborsClassifier(n_neighbors = 5)
    knn_clf.fit(X_train, y_train)
    knn_clf.score(X_test, y_test)
    
    # 2)按試驗搜索,獲取最優的超參數K,不考慮weights
    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)
        knn_score = knn_clf.score(X_test, y_test)
        if knn_score > best_score:
            best_score = knn_score
            best_k = k
    
    print("best_k = ", best_k)
    print("best_score = ", best_score)
    
    # 3)按試驗搜索,獲取最優的超參數k、weight
    best_method = ""
    best_score = 0.0
    best_k = -1
    for method in ["uniform", "distance"]:
        for k in range(1, 11):
            knn_clf = KNeighborsClassifier(n_neighbors = k)
            knn_clf.fit(X_train, y_train)
            knn_score = knn_clf.score(X_test, y_test)
            if knn_score > best_score:
                best_score = knn_score
                best_k = k
                best_method = method
    
    print("best_mrthod = ", best_method)
    print("best_k = ", best_k)
    print("best_score = ", best_score)
    
    # 4)試驗搜索,獲取最優產參數k、P(weights必須為distance)
    %%time
    
    best_p = -1
    best_score = 0.0
    best_k = -1
    for k in range(1, 11):
        for p in range(1, 6):
            knn_clf = KNeighborsClassifier(n_neighbors = k, weights = "distance", p = p)
            knn_clf.fit(X_train, y_train)
            knn_score = knn_clf.score(X_test, y_test)
            if knn_score > best_score:
                best_score = knn_score
                best_k = k
                best_p = p
    
    print("best_p = ", best_p)
    print("best_k = ", best_k)
    print("best_score = ", best_score) 

 5)其它

  1. ** 一般不同的超參數決定了不同的分類的准確率,它們之間呈連續變化;如果最終找到的最優的超參數為范圍的邊界值,意味着可能有更優的取值在邊界的外面,所以要拓展搜索范圍重新查詢最優的超參數;
  2. 以上代碼包含了調用scikit-learn庫內的算法:導入模塊、實例化、fit、調參(選取最優超參數)、預測

 

三、模型參數

 # 模型參數:算法過程中學習的參數;

 # kNN算法中沒有模型參數,因為它沒有模型;

 # 線性回歸算法和邏輯回歸算法,包含有大量的模型參數;

 # 什么是模型選擇?

 

四、距離推導

  • 歐拉距離:math.sqrt(np.sum((X1 - X2) ** 2)),向量X1與向量X2的歐拉距離;
  • 曼哈頓距離:np.sum(|X1 - X2|),向量X1與向量X2的曼哈頓距離;
  • 明科夫斯基距離:由歐拉距離和曼哈頓距離推到出;
  • 下圖從上至下:曼哈頓距離、歐拉距離、明科夫斯基距離;

 

  • 在明科夫斯基距離中:
  1. 當P = 1,明科夫斯基距離 == 曼哈頓距離;
  2. 當P = 2,明科夫斯基距離 == 歐拉距離;
  3. 當P >= 3,對應的明科夫斯基距離為其它距離;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM