【数据竞赛】“达观杯”文本智能处理挑战赛6——模型优化
文章目錄
- 一、超參數(shù)
- 1、網(wǎng)格搜索
- 2、隨機(jī)搜索
- 3、貝葉斯優(yōu)化
- 二、Stacking
- 1、核心圖解
- (1)構(gòu)建新的訓(xùn)練集
- (2)構(gòu)建新的測試集
- (3)最終的訓(xùn)練與預(yù)測
- 2、示例
- (1)構(gòu)建新的訓(xùn)練集
- (2)構(gòu)建新的測試集
- (3)多模型的處理
- (4)最終的訓(xùn)練與預(yù)測
- 三、實(shí)現(xiàn)
- 1、超參數(shù)調(diào)參
- 2、模型融合
一、超參數(shù)
優(yōu)化可以分為參數(shù)優(yōu)化和超參數(shù)優(yōu)化。其中,可學(xué)習(xí)的參數(shù)通過優(yōu)化算法可以進(jìn)行優(yōu)化;還有一類參數(shù)是用來定義模型結(jié)構(gòu)或優(yōu)化策略的,這類參數(shù)稱為超參數(shù)(hyper-parameter)
超參數(shù)優(yōu)化(Hyperparameter Optimization)主要存在兩方面的困難。
- 超參數(shù)優(yōu)化是一個組合優(yōu)化問題,無法像一般參數(shù)那樣通過梯度下降方法來優(yōu)化,也沒有一種通用有效的優(yōu)化方法。
- 評估一組超參數(shù)配置(Configuration)的時間代價非常高,從而導(dǎo)致一些優(yōu)化方法(比如演化算法(Evolution Algorithm))在超參數(shù)優(yōu)化中難以應(yīng)用。
對于超參數(shù)的設(shè)置,比較簡單的方法有人工搜索、 網(wǎng)格搜索和隨機(jī)搜索。
1、網(wǎng)格搜索
網(wǎng)格搜索(grid search) 是一種通過嘗試所有超參數(shù)的組合來尋址合適一組超參數(shù)配置的方法。
假設(shè)總共有 KKK 個超參數(shù),第 kkk 個超參數(shù)的可以取 mkm_kmk? 個值。那么總共的配置組合數(shù)量為 m1×m2×...×mKm_1 ×m_2 ×...× m_Km1?×m2?×...×mK?。如果超參數(shù)是連續(xù)的,需要根據(jù)超參數(shù)自身的特點(diǎn)進(jìn)行離散化。
實(shí)現(xiàn):sklearn.model_selection.GridSearchCV 官網(wǎng)文檔鏈接
class sklearn.model_selection.GridSearchCV(estimator, param_grid, scoring=None, fit_params=None, n_jobs=None, iid=’warn’, refit=True, cv=’warn’, verbose=0, pre_dispatch=‘2*n_jobs’, error_score=’raise-deprecating’, return_train_score=’warn’)實(shí)際當(dāng)中有用的參數(shù),以clf表示我們的GridSearchCV對象
- clf.best_params_ 返回最好的參數(shù)
- clf.best_score_ 返回最好的測試分?jǐn)?shù),它的值和 clf.cv_results_['mean_test_score'][dt_grid.best_index_] 是相同的。
- clf.best_index_ 返回列表中分?jǐn)?shù)最好的下表
- clf.best_estimator_ 返回最好的模型
- clf.cv_results_ 返回使用交叉驗(yàn)證進(jìn)行搜索的結(jié)果,它本身又是一個字典,里面又有很多內(nèi)容。
2、隨機(jī)搜索
對超參數(shù)進(jìn)行隨機(jī)組合,然后選取一個性能最好的配置,這就是隨機(jī)搜索(Random Search)。隨機(jī)搜索在實(shí)踐中更容易實(shí)現(xiàn),一般會比網(wǎng)格搜索更加有效。
3、貝葉斯優(yōu)化
貝葉斯優(yōu)化(Bayesian optimization)是一種自適應(yīng)的超參數(shù)搜索方法,根據(jù)當(dāng)前已經(jīng)試驗(yàn)的超參數(shù)組合,來預(yù)測下一個可能帶來最大收益的組合。
常用的貝葉斯優(yōu)化方法:時序模型優(yōu)化(Sequential Model-Based Optimization,SMBO)
二、Stacking
概述:將個體機(jī)器學(xué)習(xí)器的結(jié)果結(jié)合在一起,即對學(xué)習(xí)器的結(jié)果再加上一層學(xué)習(xí)器。將訓(xùn)練集學(xué)習(xí)器的學(xué)習(xí)結(jié)果作為輸入,將訓(xùn)練集的輸出作為輸出,重新訓(xùn)練一個學(xué)習(xí)器來得到最終結(jié)果。(也就是常說的兩層)
術(shù)語:
- 弱學(xué)習(xí)器稱為初級學(xué)習(xí)器,將用于結(jié)合的學(xué)習(xí)器稱為次級學(xué)習(xí)器;
- 對于測試集,我們首先用初級學(xué)習(xí)器預(yù)測一次,得到次級學(xué)習(xí)器的輸入樣本,再用次級學(xué)習(xí)器預(yù)測一次,得到最終的預(yù)測結(jié)果。
1、核心圖解
對于每一輪的 5-fold,Model 1都要做滿5次的訓(xùn)練和預(yù)測。
(1)構(gòu)建新的訓(xùn)練集
(2)構(gòu)建新的測試集
(3)最終的訓(xùn)練與預(yù)測
2、示例
(1)構(gòu)建新的訓(xùn)練集
Train Data有890行。(請對應(yīng)圖中的上層部分)
每1次的fold,都會生成 713行 小train, 178行 小test。我們用Model 1來訓(xùn)練 713行的小train,然后預(yù)測 178行 小test。預(yù)測的結(jié)果是長度為 178 的預(yù)測值。
這樣的動作走5次! 長度為178 的預(yù)測值 X 5 = 890 預(yù)測值,剛好和Train data長度吻合。這個890預(yù)測值是Model 1產(chǎn)生的,我們先存著,因?yàn)?#xff0c;一會讓它將是第二層模型的訓(xùn)練來源。
重點(diǎn):這一步產(chǎn)生的預(yù)測值我們可以轉(zhuǎn)成 890 X 1 (890 行,1列),記作 P1 (大寫P)
(2)構(gòu)建新的測試集
Test Data 有 418 行。(請對應(yīng)圖中的下層部分,對對對,綠綠的那些框框)
每1次的fold,713行 小train訓(xùn)練出來的Model 1要去預(yù)測我們?nèi)康腡est Data(全部!因?yàn)門est Data沒有加入5-fold,所以每次都是全部!)。此時,Model 1的預(yù)測結(jié)果是長度為418的預(yù)測值。
這樣的動作走5次!我們可以得到一個 5 X 418 的預(yù)測值矩陣。然后我們根據(jù)行來就平均值,最后得到一個 1 X 418 的平均預(yù)測值。
重點(diǎn):這一步產(chǎn)生的預(yù)測值我們可以轉(zhuǎn)成 418 X 1 (418行,1列),記作 p1 (小寫p)
(3)多模型的處理
走到這里,你的第一層的Model 1完成了它的使命。
第一層還會有其他Model的,比如Model 2,同樣的走一遍, 我們有可以得到 890 X 1 (P2) 和 418 X 1 (p2) 列預(yù)測值。
這樣吧,假設(shè)你第一層有3個模型,這樣你就會得到:
來自5-fold的預(yù)測值矩陣 890 X 3,(P1,P2, P3) 和 來自Test Data預(yù)測值矩陣 418 X 3, (p1, p2, p3)。
(4)最終的訓(xùn)練與預(yù)測
來自5-fold的預(yù)測值矩陣 890 X 3 作為你的Train Data,訓(xùn)練第二層的模型
來自Test Data預(yù)測值矩陣 418 X 3 就是你的Test Data,用訓(xùn)練好的模型來預(yù)測他們吧。
三、實(shí)現(xiàn)
1、超參數(shù)調(diào)參
# -*- coding: utf-8 -*- import pandas as pd import pickle import lightgbm as lgb from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model.logistic import LogisticRegression from sklearn.svm import LinearSVC from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_scorefp = open('./features/data_tfidf_train.pkl', 'rb') x_train,y_train = pickle.load(fp) x_train, x_test, y_train, y_test = train_test_split(x_train[:5000], y_train[:5000], test_size=0.3, random_state=2019)print('Start Training:Logistic Regression...') lr_grid={'C':list((100,120,140))} lr = GridSearchCV(LogisticRegression(),param_grid = lr_grid, cv = 5) lr.fit(x_train, y_train) print('Best param is ', lr.best_params_) print('The best score is ', lr.best_score_)print('Start Training:SVM...') svm_grid={'C':list((1, 5, 10))} svm = GridSearchCV(LinearSVC(),param_grid = svm_grid, cv = 5) svm.fit(x_train, y_train) print('Best param is ', svm.best_params_) print('The best score is ', svm.best_score_)print('Start Training:LightGBM...') lgbm_grid={'num_leaves':list((25, 30, 35)), 'learning_rate':list((0.2, 0.1, 0.005)), 'n_estimators':list((10, 20, 50))} lgbm = GridSearchCV(lgb.sklearn.LGBMClassifier(),param_grid = lgbm_grid, cv = 5) lgbm.fit(x_train, y_train) print('Best param is ', lgbm.best_params_) print('The best score is ', lgbm.best_score_)輸出結(jié)果
結(jié)果后續(xù)補(bǔ)上,運(yùn)行時間太長。。。。
2、模型融合
## 使用多模型實(shí)現(xiàn) from mlxtend.classifier import StackingClassifierlr_model = LogisticRegression() svm_model = LinearSVC() lgbm_model = lgb.sklearn.LGBMClassifier() dt_model = DecisionTreeClassifier()sclf = StackingClassifier(classifiers=[lr_model,svm_model,lgbm_model],meta_classifier=dt_model) sclf.fit(x_train,y_train)for clf,label in zip([lr_model,svm_model,lgbm_model,sclf],['邏輯回歸','SVM','LightGBM','StackingClassifier']):scores = cross_val_score(clf,x_train,y_train,cv = 5,scoring='accuracy')print("Accuracy: %0.2f (+/- %0.2f) [%s]"% (scores.mean(), scores.std(), label))結(jié)果輸出
Accuracy: 0.77 (+/- 0.01) [邏輯回歸] Accuracy: 0.80 (+/- 0.00) [SVM] Accuracy: 0.79 (+/- 0.01) [LightGBM] Accuracy: 0.78 (+/- 0.01) [StackingClassifier]總結(jié)
以上是生活随笔為你收集整理的【数据竞赛】“达观杯”文本智能处理挑战赛6——模型优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 集成学习(ensemble learni
- 下一篇: 集成学习(ensemble learni