机器学习-Stacking方法的原理及实现
Stacking
簡述
主要的三類集成學習方法為Bagging、Boosting和Stacking。目前,大型的數(shù)據(jù)挖掘比賽(如Kaggle),排名靠前的基本上都是集成機器學習模型或者深度神經(jīng)網(wǎng)絡。
將訓練好的所有基模型對整個訓練集進行預測,第jjj個基模型對第i個訓練樣本的預測值將作為新的訓練集中第iii個樣本的第jjj個特征值,最后基于新的訓練集進行訓練。同理,預測的過程也要先經(jīng)過所有基模型的預測形成新的測試集,最后再對測試集進行預測。
具體原理講解參考這篇博客,簡單來說,集成學習其實都是將基本模型組合形成更優(yōu)秀的模型,Stacking也不例外。stacking是得到各個算法訓練全樣本的結(jié)果再用一個元算法融合這些結(jié)果,它可以選擇使用網(wǎng)格搜索和交叉驗證。
Mlxtend框架
眾所周知,如今傳統(tǒng)機器學習領域的庫基本上被sciket-learn(sklearn)占領,若你沒有使用過sklearn庫,那就不能稱為使用過機器學習算法進行數(shù)據(jù)挖掘。但是,自定義集成學習庫依然沒有什么太過主流的框架,sklearn也只是實現(xiàn)了一些比較主流的集成學習方法如隨機森林(RF)、AdaBoost等。當然,這也是因為bagging和boosting可以直接調(diào)用而stacking需要自己設計。
Mlxtend完美兼容sklearn,可以使用sklearn的模型進行組合生成新模型。它同時集成了stacking分類和回歸模型以及它們的交叉驗證的版本。由于已經(jīng)有很多stacking的分類介紹,本例以回歸為例講講stacking的回歸實現(xiàn)。
Mlxtend安裝
pip install mlxtend
官方文檔
地址
項目實戰(zhàn)
stacking回歸
stacking回歸是一種通過元回歸器(meta-regressor)組合多個回歸模型(lr,svr等)的集成學習技術(shù)。而且,每個基回歸模型(就是上述的多個回歸模型)在訓練時都要使用完整訓練集,集成學習過程中每個基回歸模型的輸出作為元特征成為元回歸器的輸入,元回歸器通過擬合這些元特征來組合多個模型。
使用StackingRegressor
簡單使用stacking模型預測波士頓房價(使用經(jīng)典波士頓房價數(shù)據(jù)集)由于大數(shù)據(jù)集需要精細調(diào)參,這里簡單使用100條數(shù)據(jù)進行回歸測試。
from mlxtend.regressor import StackingRegressor from mlxtend.data import boston_housing_data from sklearn.linear_model import LinearRegression, Ridge, Lasso from sklearn.svm import SVR from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error import numpy as np import matplotlib.pyplot as pltx, y = boston_housing_data() x = x[:100] y = y[:100] # 劃分數(shù)據(jù)集 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2) # 初始化基模型 lr = LinearRegression() svr_lin = SVR(kernel='linear', gamma='auto') svr_rbf = SVR(kernel='rbf', gamma='auto') ridge = Ridge(random_state=2019) models = [lr, svr_lin, svr_rbf, ridge]print('base model') for model in models:model.fit(x_train, y_train)pred = model.predict(x_test)print("loss is {}".format(mean_squared_error(y_test, pred))) sclf = StackingRegressor(regressors=models, meta_regressor=ridge) # 訓練回歸器 sclf.fit(x_train, y_train) pred = sclf.predict(x_test)print('stacking model') print("loss is {}".format(mean_squared_error(y_test, pred))) plt.scatter(np.arange(len(pred)), pred) plt.plot(np.arange(len(y_test)), y_test) plt.show()
可以看到stacking模型的一般預測準確率是高于所有基模型的。
對stacking模型網(wǎng)格搜索調(diào)參
這里仍然使用上一個案例的模型,下面是代碼及結(jié)果。
from mlxtend.regressor import StackingRegressor from mlxtend.data import boston_housing_data from sklearn.linear_model import LinearRegression, Ridge, Lasso from sklearn.svm import SVR from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.metrics import mean_squared_error import numpy as np import matplotlib.pyplot as pltx, y = boston_housing_data() x = x[:100] y = y[:100] # 劃分數(shù)據(jù)集 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2) # 初始化基模型 lr = LinearRegression() svr_lin = SVR(kernel='linear', gamma='auto') svr_rbf = SVR(kernel='rbf', gamma='auto') ridge = Ridge(random_state=2019,) models = [lr, svr_lin, svr_rbf, ridge]params = {'ridge__alpha': [0.1, 1.0, 10.0],} sclf = StackingRegressor(regressors=models, meta_regressor=ridge) # 訓練回歸器 grid = GridSearchCV(estimator=sclf, param_grid=params, cv=5, refit=True) grid.fit(x_train, y_train) print(grid.best_params_, grid.best_score_)使用StackingCVRegressor
mlxtend.regressor中的StackingCVRegressor是一種集成學習元回歸器。StackingCVRegressor擴展了標準Stacking算法(在mlxtend中的實現(xiàn)為StackingRegressor)。在標準Stacking算法中,擬合一級回歸器的時候,我們?nèi)绻褂门c第二級回歸器的輸入的同一個訓練集,這很可能會導致過擬合。 然而,StackingCVRegressor使用了"非折疊預測"的概念:數(shù)據(jù)集被分成k個折疊,并且在k個連續(xù)的循環(huán)中,使用k-1折來擬合第一級回歸器,其實也就是k折交叉驗證的StackingRegressor。在K輪中每一輪中,一級回歸器被應用于在每次迭代中還未用于模型擬合的剩余1個子集。然后將得到的預測疊加起來并作為輸入數(shù)據(jù)提供給二級回歸器。在StackingCVRegressor的訓練完成之后,一級回歸器擬合整個數(shù)據(jù)集以獲得最佳預測。
from mlxtend.regressor import StackingCVRegressor from mlxtend.data import boston_housing_data from sklearn.linear_model import LinearRegression, Ridge, Lasso from sklearn.svm import SVR from sklearn.model_selection import train_test_split, GridSearchCV, cross_val_score from sklearn.metrics import mean_squared_error import numpy as np import matplotlib.pyplot as pltx, y = boston_housing_data() x = x[:100] y = y[:100] # 劃分數(shù)據(jù)集 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2) # 初始化基模型 lr = LinearRegression() svr_lin = SVR(kernel='linear', gamma='auto') ridge = Ridge(random_state=2019,) lasso =Lasso() models = [lr, svr_lin, ridge, lasso]print("base model") for model in models:score = cross_val_score(model, x_train, y_train, cv=5)print(score.mean(), "+/-", score.std()) sclf = StackingCVRegressor(regressors=models, meta_regressor=lasso) # 訓練回歸器 print("stacking model") score = cross_val_score(sclf, x_train, y_train, cv=5) print(score.mean(), "+/-", score.std())sclf.fit(x_train, y_train) pred = sclf.predict(x_test) print("loss is {}".format(mean_squared_error(y_test, pred))))
可以看到,對比第一次使用StackingRegressor模型的損失降低了。(盡管由于調(diào)參問題,評分沒有基回歸器高)
使用StackingCVRegressor網(wǎng)格搜索
代碼及結(jié)果如下。
from mlxtend.regressor import StackingCVRegressor from mlxtend.data import boston_housing_data from sklearn.linear_model import LinearRegression, Ridge, Lasso from sklearn.svm import SVR from sklearn.model_selection import train_test_split, GridSearchCV, cross_val_score from sklearn.metrics import mean_squared_error import numpy as np import matplotlib.pyplot as pltx, y = boston_housing_data() x = x[:100] y = y[:100] # 劃分數(shù)據(jù)集 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2) # 初始化基模型 lr = LinearRegression() svr_lin = SVR(kernel='linear', gamma='auto') ridge = Ridge(random_state=2019,) lasso =Lasso() models = [lr, svr_lin, ridge, lasso]params = {'lasso__alpha': [0.1, 1.0, 10.0],'ridge__alpha': [0.1, 1.0, 10.0]}sclf = StackingCVRegressor(regressors=models, meta_regressor=ridge) grid = GridSearchCV(estimator=sclf, param_grid=params, cv=5, refit=True) grid.fit(x_train, y_train) print(grid.best_score_, grid.best_params_)補充說明
本文主要介紹了框架Mlxtend的使用 ,具體的API函數(shù)見上面提到的官方文檔。Stacking等集成模型可以說是大型數(shù)據(jù)挖掘比賽的利器。本文涉及到的具體代碼見我的Github,歡迎Star或者Fork。
總結(jié)
以上是生活随笔為你收集整理的机器学习-Stacking方法的原理及实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 回溯算法-02遍历所有组合方式问题
- 下一篇: 数据挖掘竞赛-北京PM2.5浓度回归分析