在構(gòu)建模型時(shí),調(diào)參是極為重要的一個(gè)步驟,因?yàn)橹挥羞x擇最佳的參數(shù)才能構(gòu)建一個(gè)最優(yōu)的模型。但是應(yīng)該如何確定參數(shù)的值呢?所以這里記錄一下選擇參數(shù)的方法,以便后期復(fù)習(xí)以及分享。
專注于為中小企業(yè)提供網(wǎng)站建設(shè)、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)盤錦免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000+企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。(除了貝葉斯優(yōu)化等方法)其它簡(jiǎn)單的驗(yàn)證有兩種方法:
1、通過經(jīng)常使用某個(gè)模型的經(jīng)驗(yàn)和高超的數(shù)學(xué)知識(shí)。
2、通過交叉驗(yàn)證的方法,逐個(gè)來驗(yàn)證。
很顯然我是屬于后者所以我需要在這里記錄一下
sklearn 的 cross_val_score:
我使用是cross_val_score方法,在sklearn中可以使用這個(gè)方法。交叉驗(yàn)證的原理不好表述下面隨手畫了一個(gè)圖:
(我都沒見過這么丑的圖)簡(jiǎn)單說下,比如上面,我們將數(shù)據(jù)集分為10折,做一次交叉驗(yàn)證,實(shí)際上它是計(jì)算了十次,將每一折都當(dāng)做一次測(cè)試集,其余九折當(dāng)做訓(xùn)練集,這樣循環(huán)十次。通過傳入的模型,訓(xùn)練十次,最后將十次結(jié)果求平均值。將每個(gè)數(shù)據(jù)集都算一次
交叉驗(yàn)證優(yōu)點(diǎn):
1:交叉驗(yàn)證用于評(píng)估模型的預(yù)測(cè)性能,尤其是訓(xùn)練好的模型在新數(shù)據(jù)上的表現(xiàn),可以在一定程度上減小過擬合。
2:還可以從有限的數(shù)據(jù)中獲取盡可能多的有效信息。
我們?nèi)绾卫盟鼇磉x擇參數(shù)呢?
我們可以給它加上循環(huán),通過循環(huán)不斷的改變參數(shù),再利用交叉驗(yàn)證來評(píng)估不同參數(shù)模型的能力。最終選擇能力最優(yōu)的模型。
下面通過一個(gè)簡(jiǎn)單的實(shí)例來說明:(iris鳶尾花)
from sklearn import datasets #自帶數(shù)據(jù)集 from sklearn.model_selection import train_test_split,cross_val_score #劃分?jǐn)?shù)據(jù) 交叉驗(yàn)證 from sklearn.neighbors import KNeighborsClassifier #一個(gè)簡(jiǎn)單的模型,只有K一個(gè)參數(shù),類似K-means import matplotlib.pyplot as plt iris = datasets.load_iris() #加載sklearn自帶的數(shù)據(jù)集 X = iris.data #這是數(shù)據(jù) y = iris.target #這是每個(gè)數(shù)據(jù)所對(duì)應(yīng)的標(biāo)簽 train_X,test_X,train_y,test_y = train_test_split(X,y,test_size=1/3,random_state=3) #這里劃分?jǐn)?shù)據(jù)以1/3的來劃分 訓(xùn)練集訓(xùn)練結(jié)果 測(cè)試集測(cè)試結(jié)果 k_range = range(1,31) cv_scores = [] #用來放每個(gè)模型的結(jié)果值 for n in k_range: knn = KNeighborsClassifier(n) #knn模型,這里一個(gè)超參數(shù)可以做預(yù)測(cè),當(dāng)多個(gè)超參數(shù)時(shí)需要使用另一種方法GridSearchCV scores = cross_val_score(knn,train_X,train_y,cv=10,scoring='accuracy') #cv:選擇每次測(cè)試折數(shù) accuracy:評(píng)價(jià)指標(biāo)是準(zhǔn)確度,可以省略使用默認(rèn)值,具體使用參考下面。 cv_scores.append(scores.mean()) plt.plot(k_range,cv_scores) plt.xlabel('K') plt.ylabel('Accuracy') #通過圖像選擇最好的參數(shù) plt.show() best_knn = KNeighborsClassifier(n_neighbors=3) # 選擇最優(yōu)的K=3傳入模型 best_knn.fit(train_X,train_y) #訓(xùn)練模型 print(best_knn.score(test_X,test_y)) #看看評(píng)分