日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【数据竞赛】“达观杯”文本智能处理挑战赛6——模型优化

發(fā)布時間:2025/3/19 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据竞赛】“达观杯”文本智能处理挑战赛6——模型优化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 一、超參數(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)練集

  • 先將訓(xùn)練集 D(TrainingData)D(Training Data)DTrainingData 拆成 kkk 個大小相似但互不相交的子集 D1,D2,…,DkD_1,D_2,…,D_kD1?,D2?,,Dk?
  • Dj′=D?DjD_j'= D - D_jDj?=D?Dj?,在 Dj′D_j'Dj? 上訓(xùn)練一個弱學(xué)習(xí)器 LjL_jLj? 。將 DjD_jDj? 作為測試集,獲得 LjL_jLj?DjD_jDj? 上的輸出 Dj′′D_j''Dj?
  • 步驟2可以得到 kkk 個弱學(xué)習(xí)器以及 kkk 個相應(yīng)的輸出 Dj′′D_j''Dj? ,這個 kkk 個輸出加上原本的類標(biāo)構(gòu)成新的訓(xùn)練集 DnD_nDn?
  • DnD_nDn? 訓(xùn)練次學(xué)習(xí)器 LLLLLL 即為最后的學(xué)習(xí)器。
  • (2)構(gòu)建新的測試集

  • 對于每個訓(xùn)練好的一個弱學(xué)習(xí)器 LjL_jLj?,在測試集(Test Data,圖中所示綠色部分,不要與上面的“測試集”混淆。注意:此處是測試集的全部)進(jìn)行預(yù)測,將 kkk 次的預(yù)測結(jié)果取平均作為新的預(yù)測集。
  • (3)最終的訓(xùn)練與預(yù)測

  • 訓(xùn)練集為構(gòu)建新的訓(xùn)練集步驟得到的訓(xùn)練集,測試集為構(gòu)建新的測試集得到的測試集
  • 訓(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。