机器学习 scikit-learn8 - 预测贷款用户是否会逾期 - Stacking模型融合【调包】
Stacking模型融合
- 1 簡(jiǎn)介
- 2 模型融合的原理
- 2.1 StackingClassifier 概述
- 2.2 StackingCVClassifier 概述
- 3 代碼使用方法
- 4 核心代碼說(shuō)明
- 5 問(wèn)題
- 參考文章
1 簡(jiǎn)介
在做邏輯回歸的最初就有嘗試做網(wǎng)絡(luò)搜索,找到最佳的特征組合
代碼鏈接: https://github.com/spareribs/kaggleSpareribs/blob/master/Overdue/ml/for beginner/stacking.py
2 模型融合的原理
StackingClassifier 官方文檔: http://rasbt.github.io/mlxtend/user_guide/classifier/StackingClassifier/
StackingCVClassifier 官方文檔: http://rasbt.github.io/mlxtend/user_guide/classifier/StackingCVClassifier/
2.1 StackingClassifier 概述
Stacking 是一種集成學(xué)習(xí)技術(shù),通過(guò)元分類器將多個(gè)分類模型組合在一起。使用完整訓(xùn)練集去訓(xùn)練各個(gè)分類模型;然后,根據(jù)集成中各個(gè)分類模型的輸出元特征,對(duì)該分類器進(jìn)行擬合。元分類器既可以根據(jù)預(yù)測(cè)的類標(biāo)簽進(jìn)行訓(xùn)練,也可以根據(jù)集合的概率進(jìn)行訓(xùn)練,如下圖所示。
2.2 StackingCVClassifier 概述
Stacking 是一種集成學(xué)習(xí)技術(shù),通過(guò)元分類器將多個(gè)分類模型組合在一起。StackingCVClassifier使用交叉驗(yàn)證擴(kuò)展了標(biāo)準(zhǔn)的 StackingClassifier (實(shí)現(xiàn)為StackingClassifier),為二級(jí)分類器準(zhǔn)備輸入數(shù)據(jù)。
在標(biāo)準(zhǔn)的 Stacking 過(guò)程中,第一級(jí)分類器與為第二級(jí)分類器準(zhǔn)備輸入的訓(xùn)練集相匹配,可能導(dǎo)致過(guò)擬合。然而,StackingCVClassifier 使用了交叉驗(yàn)證的概念:將數(shù)據(jù)集分割為k個(gè)折,在k個(gè)連續(xù)的循環(huán)中,k-1折用于匹配第一級(jí)分類器;在每一輪中,第一級(jí)分類器被應(yīng)用到每一次迭代中沒(méi)有用于模型擬合的其余1個(gè)子集。然后將結(jié)果預(yù)測(cè)堆疊起來(lái),作為輸入數(shù)據(jù)提供給二級(jí)分類器。經(jīng)過(guò) StackingCVClassifier 的訓(xùn)練,第一級(jí)分類器適合于整個(gè)數(shù)據(jù)集,如下圖所示。
3 代碼使用方法
4 核心代碼說(shuō)明
sklearn_config.py 指定的模型參數(shù)
clfs = {'lr': LogisticRegression(penalty='l1', C=0.1, tol=0.0001),'svm': LinearSVC(C=0.05, penalty='l2', dual=True),'svm_linear': SVC(kernel='linear', probability=True),'svm_ploy': SVC(kernel='poly', probability=True),'bagging': BaggingClassifier(base_estimator=base_clf, n_estimators=60, max_samples=1.0, max_features=1.0,random_state=1, n_jobs=1, verbose=1),'rf': RandomForestClassifier(n_estimators=40, criterion='gini', max_depth=9),'adaboost': AdaBoostClassifier(base_estimator=base_clf, n_estimators=50, algorithm='SAMME'),'gbdt': GradientBoostingClassifier(),'xgb': xgb.XGBClassifier(learning_rate=0.1, max_depth=3, n_estimators=50),'lgb': lgb.LGBMClassifier(boosting_type='gbdt', learning_rate=0.01, max_depth=5, n_estimators=250, num_leaves=90) }使用 StackingCVClassifier 模型融合
lr_clf = clfs["lr"] # meta_classifier svm_clf = clfs["svm_ploy"] rf_clf = clfs["rf"] xgb_clf = clfs["xgb"] lgb_clf = clfs["lgb"]# 簡(jiǎn)單調(diào)包實(shí)現(xiàn)了~~~ classifiers 定義融合的模型 meta_classifier 定義主要的模型 sclf = StackingCVClassifier(classifiers=[lr_clf, svm_clf, rf_clf, xgb_clf, lgb_clf],meta_classifier=lr_clf, use_probas=True, verbose=3)sclf.fit(x_train, y_train)print("測(cè)試模型 & 模型參數(shù)如下:\n{0}".format(sclf)) print("=" * 20) pre_train = sclf.predict(x_train) print("訓(xùn)練集正確率: {0:.4f}".format(sclf.score(x_train, y_train))) print("訓(xùn)練集f1分?jǐn)?shù): {0:.4f}".format(f1_score(y_train, pre_train))) print("訓(xùn)練集auc分?jǐn)?shù): {0:.4f}".format(roc_auc_score(y_train, pre_train)))輸出結(jié)果
測(cè)試模型 & 模型參數(shù)如下: StackingCVClassifier(classifiers=[LogisticRegression(C=0.1, class_weight=None, dual=False, fit_intercept=True,intercept_scaling=1, max_iter=100, multi_class='warn',n_jobs=None, penalty='l1', random_state=None, solver='warn',tol=0.0001, verbose=0, warm_start=False), SVC(C=1.0, cache_size=....0, reg_lambda=0.0, silent=True,subsample=1.0, subsample_for_bin=200000, subsample_freq=0)],cv=2,meta_classifier=LogisticRegression(C=0.1, class_weight=None, dual=False, fit_intercept=True,intercept_scaling=1, max_iter=100, multi_class='warn',n_jobs=None, penalty='l1', random_state=None, solver='warn',tol=0.0001, verbose=0, warm_start=False),shuffle=True, store_train_meta_features=False, stratify=True,use_clones=True, use_features_in_secondary=False,use_probas=True, verbose=3) ==================== 訓(xùn)練集正確率: 0.8220 訓(xùn)練集f1分?jǐn)?shù): 0.5331 訓(xùn)練集auc分?jǐn)?shù): 0.68335 問(wèn)題
- 問(wèn)題1:https://blog.csdn.net/qq1483661204/article/details/80157365 代碼實(shí)現(xiàn)的方式不是太了解
- 問(wèn)題2:如果使用 train_test_split 拆分整個(gè)數(shù)據(jù)集,會(huì)報(bào)錯(cuò),所以訓(xùn)練集的數(shù)據(jù),沒(méi)有測(cè)試集
- 問(wèn)題3:分?jǐn)?shù)有點(diǎn)高,擔(dān)心又是模型評(píng)分方式的問(wèn)題
參考文章
https://blog.csdn.net/qq1483661204/article/details/80157365
https://mp.weixin.qq.com/s/DG5VbDgOcqlRhbEbiP9_aw
https://blog.csdn.net/LAW_130625/article/details/78573736
總結(jié)
以上是生活随笔為你收集整理的机器学习 scikit-learn8 - 预测贷款用户是否会逾期 - Stacking模型融合【调包】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SETP7 Professional V
- 下一篇: 一个合格的初级程序员所应该具备的能力