一、評測標准
- 模型的測評標准:分類的准確度(accuracy);
- 預測准確度 = 預測成功的樣本個數/預測數據集樣本總數;
二、超參數
- 超參數:運行機器學習算法前需要指定的參數;
- kNN算法中的超參數:k、weights、P;
- 一般超參數之間也相互影響;
- 調參,就是調超參數;
1)問題
# 以kNN算法為例
- 平票:如果k個點中,不同類型的樣本數相等,怎么選取?
- 如果選取的k個點中,數量多的一類樣本點距離測試樣本較遠,數量少的一類樣本點距離測試樣本較近,此時選取數量較多的類型作為輸出結果,不具說服力;
2)kNN算法中,除了K值外的另一個超參數:距離的權重(1/距離)
- k個點中,將不同類的點的權重相加,最大的那一類為目標標簽
- scikit-learn庫中的KNeighborsClassifier類中,還有一個weights()函數;
- 在__init__()中默認兩個參數值:__init__(n_neighbors = 5, weights = 'uniform');
- weights = 'uniform',表示不考慮距離權重這個超參數;
- 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)其它
- ** 一般不同的超參數決定了不同的分類的准確率,它們之間呈連續變化;如果最終找到的最優的超參數為范圍的邊界值,意味着可能有更優的取值在邊界的外面,所以要拓展搜索范圍重新查詢最優的超參數;
- 以上代碼包含了調用scikit-learn庫內的算法:導入模塊、實例化、fit、調參(選取最優超參數)、預測
三、模型參數
# 模型參數:算法過程中學習的參數;
# kNN算法中沒有模型參數,因為它沒有模型;
# 線性回歸算法和邏輯回歸算法,包含有大量的模型參數;
# 什么是模型選擇?
四、距離推導
- 歐拉距離:math.sqrt(np.sum((X1 - X2) ** 2)),向量X1與向量X2的歐拉距離;
- 曼哈頓距離:np.sum(|X1 - X2|),向量X1與向量X2的曼哈頓距離;
- 明科夫斯基距離:由歐拉距離和曼哈頓距離推到出;
- 下圖從上至下:曼哈頓距離、歐拉距離、明科夫斯基距離;
- 在明科夫斯基距離中:
- 當P = 1,明科夫斯基距離 == 曼哈頓距離;
- 當P = 2,明科夫斯基距離 == 歐拉距離;
- 當P >= 3,對應的明科夫斯基距離為其它距離;