天津制作網(wǎng)頁東莞seo托管
目錄
模型選擇與調(diào)優(yōu)
1、介紹
模型選擇(Model Selection):
調(diào)優(yōu)(Hyperparameter Tuning):
本章重點
2、交叉驗證
介紹
為什么需要交叉驗證
數(shù)據(jù)處理
3、?超參數(shù)搜索-網(wǎng)格搜索(Grid Search)
介紹
API
🔺Facebook簽到位置預(yù)測K值調(diào)優(yōu)
?🍃作者介紹:準(zhǔn)大三網(wǎng)絡(luò)工程專業(yè)在讀,努力學(xué)習(xí)Java,涉獵深度學(xué)習(xí),積極輸出優(yōu)質(zhì)文章
?分類算法系列①:初識概念
?分類算法系列②:KNN(K-近鄰)算法
🍁您的三連支持,是我創(chuàng)作的最大動力🌹
模型選擇與調(diào)優(yōu)
1、介紹
在機(jī)器學(xué)習(xí)中,模型選擇(Model Selection)和調(diào)優(yōu)(Hyperparameter Tuning)是優(yōu)化模型性能的關(guān)鍵步驟。模型選擇涉及選擇合適的算法或模型架構(gòu),而調(diào)優(yōu)則涉及調(diào)整模型的超參數(shù)以達(dá)到最佳性能。以下是關(guān)于這兩個步驟的詳細(xì)介紹:
模型選擇(Model Selection):
模型選擇是選擇在給定任務(wù)中使用哪種算法或模型的過程。不同的算法適用于不同的問題,因此選擇適當(dāng)?shù)乃惴▽τ谌〉昧己玫男阅苤陵P(guān)重要。模型選擇通常涉及以下步驟:
- 問題定義:明確定義要解決的問題,例如分類、回歸、聚類等。
- 數(shù)據(jù)準(zhǔn)備:對數(shù)據(jù)進(jìn)行預(yù)處理、清洗和特征工程,以確保數(shù)據(jù)適用于所選的算法。
- 候選模型:根據(jù)問題和數(shù)據(jù)類型,選擇幾種合適的模型作為候選,例如決策樹、支持向量機(jī)、神經(jīng)網(wǎng)絡(luò)等。
- 訓(xùn)練和驗證:使用交叉驗證等技術(shù),在訓(xùn)練數(shù)據(jù)上訓(xùn)練候選模型,并在驗證集上評估其性能。
- 性能比較:比較不同模型在驗證集上的性能指標(biāo),如準(zhǔn)確率、精確度、召回率等。
- 選擇最佳模型:根據(jù)性能比較,選擇性能最佳的模型作為最終模型。
調(diào)優(yōu)(Hyperparameter Tuning):
調(diào)優(yōu)是指為機(jī)器學(xué)習(xí)模型選擇最佳的超參數(shù),以優(yōu)化模型的性能。超參數(shù)是在訓(xùn)練過程之外設(shè)置的參數(shù),它們決定了模型的結(jié)構(gòu)和行為,如學(xué)習(xí)率、正則化參數(shù)、樹的深度等。調(diào)優(yōu)的目標(biāo)是找到使模型在驗證集上表現(xiàn)最佳的超參數(shù)組合。調(diào)優(yōu)通常包括以下步驟:
- 選擇超參數(shù)空間:選擇要調(diào)優(yōu)的超參數(shù)和它們的可能取值范圍。
- 搜索方法:選擇超參數(shù)搜索方法,如網(wǎng)格搜索、隨機(jī)搜索、貝葉斯優(yōu)化等。
- 交叉驗證:使用交叉驗證將數(shù)據(jù)分為訓(xùn)練集和驗證集,以評估不同超參數(shù)組合的性能。
- 評價指標(biāo):選擇適當(dāng)?shù)脑u價指標(biāo)來衡量不同超參數(shù)組合的性能。
- 調(diào)優(yōu)過程:根據(jù)選擇的搜索方法,不斷嘗試不同的超參數(shù)組合,并記錄它們的性能。
- 選擇最佳組合:從調(diào)優(yōu)過程中選擇在驗證集上性能最佳的超參數(shù)組合作為最終模型的超參數(shù)。
模型選擇和調(diào)優(yōu)是迭代過程,可能需要多次嘗試不同的模型和超參數(shù)組合,以找到最適合任務(wù)的模型并達(dá)到最佳性能。使用交叉驗證、可視化工具和自動化調(diào)優(yōu)庫(如scikit-learn中的GridSearchCV和RandomizedSearchCV)可以幫助更有效地進(jìn)行模型選擇和調(diào)優(yōu)。
本章重點
本章重點是交叉驗證!結(jié)合的示例是之前的Facebook簽到位置問題,對之前使用KNN算法完成的Facebook簽到位置預(yù)測進(jìn)行調(diào)優(yōu),使其結(jié)果更加準(zhǔn)確。
2、交叉驗證
介紹
交叉驗證(Cross-Validation)是一種用于評估機(jī)器學(xué)習(xí)模型性能的技術(shù),它有助于更準(zhǔn)確地估計模型在未知數(shù)據(jù)上的表現(xiàn)。交叉驗證通過在不同的數(shù)據(jù)子集上進(jìn)行多次訓(xùn)練和驗證,提供了對模型泛化性能的更穩(wěn)定估計。
在傳統(tǒng)的訓(xùn)練-測試集劃分中,數(shù)據(jù)被劃分為訓(xùn)練集和測試集,然后使用訓(xùn)練集訓(xùn)練模型,使用測試集評估模型性能。然而,這種方法可能因為數(shù)據(jù)的劃分方式而導(dǎo)致評估結(jié)果不穩(wěn)定,特別是在數(shù)據(jù)量有限的情況下。交叉驗證通過將數(shù)據(jù)劃分為多個折(folds),多次進(jìn)行訓(xùn)練和測試,從而克服了這些問題。
以下是交叉驗證的常見方法:
- k折交叉驗證(k-Fold Cross-Validation):
- 將數(shù)據(jù)分為k個大小相似的折(folds)。
- 每次將其中一個折作為驗證集,其他k-1個折作為訓(xùn)練集。
- 重復(fù)這個過程k次,每次選擇不同的折作為驗證集,其他折作為訓(xùn)練集。
- 計算k次驗證的平均性能作為最終性能評估。
- 留一交叉驗證(Leave-One-Out Cross-Validation,LOOCV):
- 將每個樣本單獨作為一個折,其他樣本作為訓(xùn)練集。
- 執(zhí)行n次訓(xùn)練和驗證,n為樣本數(shù)量。
- 計算n次驗證的平均性能作為最終性能評估。
- 適用于小樣本數(shù)據(jù)集,但計算開銷較大。
- 隨機(jī)折交叉驗證(Stratified k-Fold Cross-Validation):
- 類似于k折交叉驗證,但在劃分折時會保持各個類別的比例相同。
- 對于不均衡的數(shù)據(jù)集,這種方法可以更好地保持類別分布。
交叉驗證的優(yōu)勢在于它能夠提供更可靠的模型性能估計,因為每個樣本都會被用于訓(xùn)練和驗證,減少了數(shù)據(jù)劃分可能引發(fā)的偶然性影響。交叉驗證還有助于選擇合適的模型和調(diào)整超參數(shù),從而提高模型的泛化性能。在實際應(yīng)用中,k折交叉驗證是最常用的方法之一,但根據(jù)問題的特點和數(shù)據(jù)集的大小,選擇適當(dāng)?shù)慕徊骝炞C方法非常重要。
為什么需要交叉驗證
交叉驗證目的:為了讓被評估的模型更加準(zhǔn)確可信
數(shù)據(jù)處理
一般情況下,數(shù)據(jù)分為訓(xùn)練集和測試集,但是為了讓從訓(xùn)練得到模型結(jié)果更加準(zhǔn)確。
做以下處理:
- 訓(xùn)練集:訓(xùn)練集+驗證集
- 測試集:測試集
?
那么對于之前的Facebook簽到位置預(yù)測問題的k值,如何取得一個合理的值?下面使用超參數(shù)搜索-網(wǎng)格搜索(Grid Search)
3、?超參數(shù)搜索-網(wǎng)格搜索(Grid Search)
?
介紹
超參數(shù)網(wǎng)格搜索(Grid Search)是一種常用的超參數(shù)調(diào)優(yōu)方法,用于尋找最佳的超參數(shù)組合,從而優(yōu)化機(jī)器學(xué)習(xí)模型的性能。它通過在預(yù)定義的超參數(shù)空間中搜索所有可能的組合,然后評估每個組合的性能,最終選擇性能最佳的組合作為最終的超參數(shù)設(shè)置。
以下是超參數(shù)網(wǎng)格搜索的步驟和原理:
- 超參數(shù)空間定義: 首先,為模型選擇要調(diào)優(yōu)的超參數(shù),并為每個超參數(shù)指定可能的取值范圍。例如,對于支持向量機(jī),可以選擇C(正則化參數(shù))和kernel(核函數(shù)類型)作為需要調(diào)優(yōu)的超參數(shù),為它們指定一組候選取值。
- 生成網(wǎng)格: 將每個超參數(shù)的可能取值組合成一個網(wǎng)格,生成所有可能的超參數(shù)組合。這個網(wǎng)格中的每個點都代表一組超參數(shù)設(shè)置。
- 交叉驗證: 對于每個超參數(shù)組合,使用交叉驗證來評估模型在驗證集上的性能。通常使用k折交叉驗證,對于每個超參數(shù)組合,訓(xùn)練模型k次,并計算平均性能指標(biāo)。
- 選擇最佳組合: 根據(jù)交叉驗證的結(jié)果,選擇性能最佳的超參數(shù)組合作為最終的選擇。通常根據(jù)準(zhǔn)確率、F1得分、均方誤差等評價指標(biāo)來衡量性能。
- 應(yīng)用最佳超參數(shù): 使用在步驟4中選擇的最佳超參數(shù)組合來訓(xùn)練模型,然后在獨立的測試集上評估其性能。
超參數(shù)網(wǎng)格搜索的優(yōu)點在于它是一種簡單而有效的方法,可以在有限的計算資源下嘗試多種超參數(shù)組合。然而,網(wǎng)格搜索的缺點是它可能會對計算資源造成較大的負(fù)擔(dān),特別是在超參數(shù)空間較大時。為了提高效率,可以使用隨機(jī)搜索等方法來在超參數(shù)空間中采樣,以更快地找到性能較好的超參數(shù)組合。
API
sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
????????對估計器的指定參數(shù)值進(jìn)行詳盡搜索
????????estimator:估計器對象
????????param_grid:估計器參數(shù)(dict){“n_neighbors”:[1,3,5]}
????????cv:指定幾折交叉驗證
????????fit:輸入訓(xùn)練數(shù)據(jù)
????????score:準(zhǔn)確率
結(jié)果分析:
????????bestscore:在交叉驗證中驗證的最好結(jié)果
????????bestestimator:最好的參數(shù)模型
????????cvresults:每次交叉驗證后的驗證集準(zhǔn)確率結(jié)果和訓(xùn)練集準(zhǔn)確率結(jié)果
🔺Facebook簽到位置預(yù)測K值調(diào)優(yōu)
使用網(wǎng)格搜索估計器,在原來的KNN算法實現(xiàn)Facebook簽到位置預(yù)測的代碼基礎(chǔ)上,新的修改如下代碼:
# 使用網(wǎng)格搜索和交叉驗證找到合適的參數(shù)
knn = KNeighborsClassifier()param = {"n_neighbors": [3, 5, 10]}gc = GridSearchCV(knn, param_grid=param, cv=2)gc.fit(x_train, y_train)print("選擇了某個模型測試集當(dāng)中預(yù)測的準(zhǔn)確率為:", gc.score(x_test, y_test))# 訓(xùn)練驗證集的結(jié)果
print("在交叉驗證當(dāng)中驗證的最好結(jié)果:", gc.best_score_)
print("gc選擇了的模型K值是:", gc.best_estimator_)
print("每次交叉驗證的結(jié)果為:", gc.cv_results_)
代碼解釋:
創(chuàng)建KNN分類器:knn = KNeighborsClassifier()
定義超參數(shù)空間:param = {"n_neighbors": [3, 5, 10]}
創(chuàng)建GridSearchCV實例,傳入KNN分類器實例和定義好的超參數(shù)空間,cv=2表示使用2折交叉驗證:gc = GridSearchCV(knn, param_grid=param, cv=2)
執(zhí)行網(wǎng)格搜索和交叉驗證:gc.fit(x_train, y_train)
評估測試集性能,使用訓(xùn)練好的網(wǎng)格搜索模型在測試集上進(jìn)行預(yù)測并輸出準(zhǔn)確率:print("選擇了某個模型測試集當(dāng)中預(yù)測的準(zhǔn)確率為:", gc.score(x_test, y_test))
打印交叉驗證結(jié)果:
- gc.best_score_:輸出在交叉驗證中獲得的最佳性能指標(biāo)。
- gc.best_estimator_:輸出最佳性能對應(yīng)的模型,包括超參數(shù)設(shè)置。
- gc.cv_results_:輸出每次交叉驗證的結(jié)果,包括參數(shù)設(shè)置和性能指標(biāo)。
回顧k值交叉驗證:
?
KNN調(diào)優(yōu)全部代碼:
# -*- coding: utf-8 -*-
# @Author:︶ㄣ釋然
# @Time: 2023/8/30 23:48
import pandas as pd
from sklearn.model_selection import train_test_split # 將數(shù)據(jù)集分割為訓(xùn)練集和測試集。
from sklearn.neighbors import KNeighborsClassifier # 實現(xiàn)KNN分類器
from sklearn.preprocessing import StandardScaler # 特征標(biāo)準(zhǔn)化
from sklearn.model_selection import GridSearchCV # 網(wǎng)格搜索'''
sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)對估計器的指定參數(shù)值進(jìn)行詳盡搜索estimator:估計器對象param_grid:估計器參數(shù)(dict){“n_neighbors”:[1,3,5]}cv:指定幾折交叉驗證fit:輸入訓(xùn)練數(shù)據(jù)score:準(zhǔn)確率
結(jié)果分析:bestscore:在交叉驗證中驗證的最好結(jié)果_bestestimator:最好的參數(shù)模型cvresults:每次交叉驗證后的驗證集準(zhǔn)確率結(jié)果和訓(xùn)練集準(zhǔn)確率結(jié)果
'''
def knn_GridSearch():"""K近鄰算法預(yù)測入住位置類別:return:"""# 一、處理數(shù)據(jù)以及特征工程# 1、讀取收,縮小數(shù)據(jù)的范圍data = pd.read_csv("./data/FBlocation/train.csv")# 數(shù)據(jù)邏輯篩選操作 df.query()data = data.query("x > 1.0 & x < 1.25 & y > 2.5 & y < 2.75")# 刪除time這一列特征data = data.drop(['time'], axis=1)print(data)# 刪除入住次數(shù)少于三次位置place_count = data.groupby('place_id').count()tf = place_count[place_count.row_id > 3].reset_index()data = data[data['place_id'].isin(tf.place_id)]# 3、取出特征值和目標(biāo)值y = data['place_id']# y = data[['place_id']]x = data.drop(['place_id', 'row_id'], axis=1)# 4、數(shù)據(jù)分割與特征工程?# (1)、數(shù)據(jù)分割x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)# (2)、標(biāo)準(zhǔn)化std = StandardScaler()# 隊訓(xùn)練集進(jìn)行標(biāo)準(zhǔn)化操作x_train = std.fit_transform(x_train)print(x_train)# 進(jìn)行測試集的標(biāo)準(zhǔn)化操作x_test = std.fit_transform(x_test)# 二、算法的輸入訓(xùn)練預(yù)測# K值:算法傳入?yún)?shù)不定的值 理論上:k = 根號(樣本數(shù))# K值:后面會使用參數(shù)調(diào)優(yōu)方法,去輪流試出最好的參數(shù)[1,3,5,10,20,100,200]# 使用網(wǎng)格搜索和交叉驗證找到合適的參數(shù)knn = KNeighborsClassifier()param = {"n_neighbors": [3, 5, 10]}gc = GridSearchCV(knn, param_grid=param, cv=2)gc.fit(x_train, y_train)print("選擇了某個模型測試集當(dāng)中預(yù)測的準(zhǔn)確率為:", gc.score(x_test, y_test))# 訓(xùn)練驗證集的結(jié)果print("在交叉驗證當(dāng)中驗證的最好結(jié)果:", gc.best_score_)print("gc選擇了的模型K值是:", gc.best_estimator_)print("每次交叉驗證的結(jié)果為:", gc.cv_results_)if __name__ == '__main__':knn_GridSearch()
執(zhí)行結(jié)果:
?