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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习-Stacking方法的原理及实现

發布時間:2024/4/11 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习-Stacking方法的原理及实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Stacking

簡述

主要的三類集成學習方法為Bagging、Boosting和Stacking。目前,大型的數據挖掘比賽(如Kaggle),排名靠前的基本上都是集成機器學習模型或者深度神經網絡。

將訓練好的所有基模型對整個訓練集進行預測,第jjj個基模型對第i個訓練樣本的預測值將作為新的訓練集中第iii個樣本的第jjj個特征值,最后基于新的訓練集進行訓練。同理,預測的過程也要先經過所有基模型的預測形成新的測試集,最后再對測試集進行預測。

具體原理講解參考這篇博客,簡單來說,集成學習其實都是將基本模型組合形成更優秀的模型,Stacking也不例外。stacking是得到各個算法訓練全樣本的結果再用一個元算法融合這些結果,它可以選擇使用網格搜索和交叉驗證。

Mlxtend框架

眾所周知,如今傳統機器學習領域的庫基本上被sciket-learn(sklearn)占領,若你沒有使用過sklearn庫,那就不能稱為使用過機器學習算法進行數據挖掘。但是,自定義集成學習庫依然沒有什么太過主流的框架,sklearn也只是實現了一些比較主流的集成學習方法如隨機森林(RF)、AdaBoost等。當然,這也是因為bagging和boosting可以直接調用而stacking需要自己設計。

Mlxtend完美兼容sklearn,可以使用sklearn的模型進行組合生成新模型。它同時集成了stacking分類和回歸模型以及它們的交叉驗證的版本。由于已經有很多stacking的分類介紹,本例以回歸為例講講stacking的回歸實現。

Mlxtend安裝

pip install mlxtend

官方文檔

地址

項目實戰

stacking回歸

stacking回歸是一種通過元回歸器(meta-regressor)組合多個回歸模型(lr,svr等)的集成學習技術。而且,每個基回歸模型(就是上述的多個回歸模型)在訓練時都要使用完整訓練集,集成學習過程中每個基回歸模型的輸出作為元特征成為元回歸器的輸入,元回歸器通過擬合這些元特征來組合多個模型。

使用StackingRegressor

簡單使用stacking模型預測波士頓房價(使用經典波士頓房價數據集)由于大數據集需要精細調參,這里簡單使用100條數據進行回歸測試。

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] # 劃分數據集 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模型網格搜索調參

這里仍然使用上一個案例的模型,下面是代碼及結果。

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] # 劃分數據集 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中的實現為StackingRegressor)。在標準Stacking算法中,擬合一級回歸器的時候,我們如果使用與第二級回歸器的輸入的同一個訓練集,這很可能會導致過擬合。 然而,StackingCVRegressor使用了"非折疊預測"的概念:數據集被分成k個折疊,并且在k個連續的循環中,使用k-1折來擬合第一級回歸器,其實也就是k折交叉驗證的StackingRegressor。在K輪中每一輪中,一級回歸器被應用于在每次迭代中還未用于模型擬合的剩余1個子集。然后將得到的預測疊加起來并作為輸入數據提供給二級回歸器。在StackingCVRegressor的訓練完成之后,一級回歸器擬合整個數據集以獲得最佳預測。

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] # 劃分數據集 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模型的損失降低了。(盡管由于調參問題,評分沒有基回歸器高)

使用StackingCVRegressor網格搜索

代碼及結果如下。

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] # 劃分數據集 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函數見上面提到的官方文檔。Stacking等集成模型可以說是大型數據挖掘比賽的利器。本文涉及到的具體代碼見我的Github,歡迎Star或者Fork。

總結

以上是生活随笔為你收集整理的机器学习-Stacking方法的原理及实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。