加载svr模型_机器学习XGBoost实战,网格搜索自动调参,对比随机森林,线性回归,SVR【完整代码(含注释)+数据集见原文链接】...
建議:閱讀2020.8.7的文章,完全了解GDBT和XGBT的原理。
機器學習- XGBoost,GDBT【過程:決策樹,集成學習,隨機森林,GDBT,XGBT,LightGBM】
本次實踐內容:
| 數據集 | boston房價數據集 |
| 使用模型 | xgboost ,random forest,SVR,linear |
| 實踐重點 | 使用XGBT完整過程,使用網格搜索貪心定參過程, |
| 模型重點 | XGBT的參數含義及常用值, 如何自動尋找超參數?GirdSearchCv的參數設置。 Random forest參數含義 |
實驗結果對比:
見證了XGBT的 優越性 以及 網格搜索的優越性
① 隨機初始化參數的XGBT? &網格搜索尋找到比較好參數取值的XGBT:尋找到XGBT中最好的樹,將其參數設置為XGBT的參數:
②設好參數的XGBT,線性回歸,隨機森林,SVR,設好參的隨機森林:
????看Mean值,Mean為RMSE的均值,越小越好
下面為代碼部分:導包
import pandas as pdimport xgboost as xgbimport numpy as npfrom sklearn.metrics import mean_squared_errorfrom sklearn.model_selection import train_test_splitimport matplotlib.pyplot as plt加載數據集【數據集和代碼在一個文件夾內,直接使用即可】:
def loading_boston_housing_data(csv_path,x): return pd.read_csv(csv_path,header = x) path = "boston_house_prices.csv"boston = loading_boston_housing_data(path,1)拆分y,即label預測值
# 拆分特征和標簽y = boston.pop('MEDV')轉換格式—— dmatrix,該格式在xgboost中運行速度更快!
data_matrix = xgb.DMatrix(boston,y)XGBT建模
# 隨機選取默認參數進行初始化建模xg_reg = xgb.XGBRegressor( objective='reg:linear',# 這是一個回歸預測房價問題 colsample_bytree= 0.3 , # 每次用多少特征,可以控制過擬合 learning_rate=0.1,# 學習率,之前解釋過了,給后面添加的樹就有學習的空間 max_depth=5, # 樹的最大深度 5 n_estimators=10, # 構建10棵樹 alpha = 10 # L1正則化)xg_reg.fit(x_train,y_train)pred = xg_reg.predict(x_test)mean_squared_error(pred,y_test)XGBoost--參數分析
xgboost的params參數
(參數很多 ,但實際用到的不多)
1)不需要調優的參數
①booster【默認:gbtree】:
? 作用:決定基分類器的類型。
? 可選:gbtree:樹?
? ? ? ? ? ?gblinear :線性
②objective:
? ?作用:定義需要被最小化的損失函數
? ?可選:
????reg:linear?:線性回歸
????reg:logistic:邏輯回歸
????binary:logistic :二分類的邏輯回歸,返回的是概率(非類別)
? ? multi:softmax :使用softmax的多分類器,返回的是類別(非概率),同時你需要多設置一個參數:num_class(類別數目)
????multi:softprob:和multi.softmax參數一樣,但是返回的是每個實例屬于各個類別的概率。
③silent【默認:0】:
?????設為1(不打印執行信息)?
???? 設為0(打印信息)
④nthread:控制線程線程數目
(需要用cv搜索調整的標注為紅色)
2)可以優化的參數
?①max_depth【默認6】:
????作用:決定樹的最大深度,用來避免過擬合的,max_depth越大,模型會學到更具體的樣本,深度越深越容易過擬合
? ? 常用值:3~10
?②n_estimators:
? ????作用:決定樹的數量
? ???即使BT算法中有較多的 決定樹時仍能保持穩健,但是樹的數量多了還是可能發生過擬合!
?③eta/learning_rate【默認0.3】:
????作用:決定每一個決定樹對于最終結果的影響,控制著更新權重的更新幅度。較小的eta使得模型對不同的樹更加穩健。(等同于GDBT中的學習率)
????范圍:0~1
????常用值:0.01~0.2
?④subsample【默認1】:
????作用:每次迭代用多少數據集,控制每棵樹,隨機采樣的比例。
????減小subsample,算法用的數據集越少,可以避免過擬合,但如果設置太小,數據用的少了就會欠擬合!
????常用值:0.5~1
?⑤min_child_weight【默認1】:
????作用:決定最小葉子節點樣本權重和,用于避免過擬合。
????值較大時候可以避免學習到局部的特殊樣本, 過大時候會導致欠擬合,較小容易過擬合。
? ? ?(類似于GDBT中的min_chilf_leaf,不過GDBT中是最小樣本總數)!
?⑥colsample_bytree【默認1】:
????作用:用來每次每棵樹用多少個特征,即隨機采樣的列數占比(一列是一個特征)。可以控制過擬合。
????常用值:0.5~1
?⑦gamma【默認0】:
????作用:在節點分裂時,只有分裂后損失函數值下降了,才會分裂這個節點,那下降多少才會分裂呢?有gamma決定,當損失函數值下降到≥gamma值,ok,分裂節點。
? ? ?該值越大,算法越保守。
? ? ?如果設置gamma為0,表示只要損失函數減少節點就分裂
?⑧alpha【默認0】:
????作用:控制權重的L1正則化項參數。
????設置的越大,模型越不容易過擬合。
?⑨lambda【默認1】
????作用:控制權重的L2正則化項參數。
????設置的越大,模型越不容易過擬合。
可以畫出樹模型? :
可以查看特征的重要程度:
xg_reg = xgb.train(params=params, dtrain=data_matrix, num_boost_round=10)import matplotlib.pyplot as plt# graphviz配置指導:https://blog.csdn.net/c_daofeng/article/details/81077594# 第一次配置完成之后,因為環境需要重啟,可能會報錯,下面兩行是手動設置環境變量Pathimport osos.environ["PATH"] += os.pathsep + 'D:/graphviz/bin'xgb.plot_tree(xg_reg,num_trees=0)plt.rcParams['figure.figsize'] = [100,80]plt.show()# 打印特征權重# 如果特征權重中有一個特別重要,說明有過擬合的風險或者穿越現象。# 可以通過去掉該特征來驗證模型效果xgb.plot_importance(xg_reg)plt.rcParams['figure.figsize'] = [3, 3]plt.show()網格搜索:
步驟:
設置一些初始值,構建baseline模型(baseline:就是一個最簡單的拿來對比性能的模型)回歸到機器學習的流程中,我們強調了,無論你建立了幾個成熟的模型,如random forest,gdbt等。這些被稱作benchmark【其他標準模型】,如果你使用一些baseline【非模型的方法/或者選擇一個很差的模型】如使用平均值或中位數來得到預測結果,就可以用來比較你的模型性能。
保持learning rate和其他booster相關的參數不變,調節estimators(樹的棵樹)的參數。
調節booster相關的參數。其中影響最大的max_depth(深度) 和min_child_weight(樹的最小權重)開始。逐步調節所有可能有影響的booster參數
縮小learning rate,得到最佳的learning rate值
得到一組效果還不錯的參數組合(初次之外,你還可以調整gamma等所有文中標紅的參數!)
(按照步驟走,后面還有幾次網格搜索,代碼見原文鏈接)
# 按照步驟2:調節一下estimators,將樹的棵樹進行網格搜索,from sklearn.model_selection import GridSearchCV# 此處你可以設置為 'n_estimators':[1,2,3,...]的你想測的值,#當然也可以像我一樣直接用 range設置步長 生成列表cv_params = {'n_estimators': range(0,200,10)}# 按照步驟1:建了一個隨機初始化的baseLine模型(同前)params = {'learning_rate': 0.05, 'n_estimators': 500, 'max_depth': 5, 'min_child_weight': 1, 'seed': 0, 'subsample': 0.8, 'colsample_bytree': 0.8, 'gamma': 0, 'reg_alpha': 10, 'reg_lambda': 1}# 此處用兩個*:**params,原因:傳入的是字典叫:關鍵字參數# 就一個* :*params 的情況:如果函數接收的是元組叫做 :其余的位置參數,model = xgb.XGBRegressor(**params)optimized_GBM = GridSearchCV(estimator=model, param_grid=cv_params, scoring='r2', cv=5, verbose=1, n_jobs=-1)optimized_GBM.fit(x_train, y_train)# 輸出最好搭配print("Best: %f using %s" % (optimized_GBM.best_score_,optimized_GBM.best_params_))print("--------------------------------------------")means = optimized_GBM.cv_results_['mean_test_score']params = optimized_GBM.cv_results_['params']for mean,param in zip(means,params): print("%f with: %r" % (mean,param))自動調參神器之一? :
GridSearchCV網格搜索
(ps:只適用于小數據集,貪心算法太過貪心,走遍所有找到最佳)
????這是一種貪心算法,被發明的意義就在于不要你自己手動調參,把參數輸進去就能依據你選擇的評價標準,來找到你所給參數可選范圍內的最佳參數和優化結果
CV網格搜索--參數分析
導入:
from sklearn.model_selection import GridSearchCV
參數:
①estimator :選擇使用的分類器
②param_grid:需要優化的參數的取值,值為字典:
如? cv_params = {'n_estimators': list(range(100))},
設置時:param_grid=cv_params
③scoring?【默認None】:用來評價模型的標準。????
????此時你是去調節參數來找到比較好的參數,因此需要使用score函數,根據所選模型選擇不同的score函數。
????分類問題中常用的:precision,recall,f1
????回歸問題中常用:neg_mean_squared_error,r2
④cv【默認3】:交叉驗證的fold數量,默認為3,可自行設定
⑤verbose : 日志冗長度,
????0:不輸出訓練過程,
??? 1:偶爾輸出,
????>1:對每一個子模型都輸出
⑥n_jobs :并行數,
????當設置為-1時候表示cpu所有的core進行工作(可查看cpu占用率)
可以查看的:
grid_scores_:
????給出不同參數情況下的評價結果。
best_params_:
????描述了已取得最佳結果的參數的組合
best_score_:
????成員提供優化過程期間觀察到的最好的評分
具有鍵作為列標題和值作為列的dict,可以導入到DataFrame中。
注意,“params”鍵用于存儲所有參數候選項的參數設置列表。
尋找最好的樹的參數——?xgb.cv:
good_params = {'learning_rate': 0.15, 'n_estimators': 190, 'max_depth': 4, 'min_child_weight': 2, 'seed': 0, 'subsample': 0.8, 'colsample_bytree': 0.8, 'gamma': 0, 'reg_alpha': 0, 'reg_lambda': 1}good_cv_results = xgb.cv(dtrain=data_matrix, params=good_params, nfold=3, num_boost_round=50,early_stopping_rounds=10,metrics="rmse", as_pandas=True, seed=123)good_cv_results.head()# 將model的參數設置為該最好的參數model.set_params(n_estimators=good_cv_results.shape[0])model.fit(x_train, y_train, eval_metric='rmse')xgd_pred = model.predict(x_test)xgd_pred = xgd_pred.reshape(len(xgd_pred),1)from sklearn.model_selection import cross_val_scorexgb_scores = cross_val_score(model,xgd_pred,y_test,scoring='neg_mean_squared_error',cv=3)# xgb_rmse_scores = np.sqrt(-xgb_scores)# print(xgb_rmse_scores)print('XGboost:')display_scores(xgb_scores)得到結果:
xgb.cv(交叉驗證,找最好的樹)-參數分析
????尋找完參數后,我們通過XGBT所帶的cv來找到最好的樹!找到之后,我們可以得到該樹的參數來設置我們的xgboost模型,然后進行預測得到好處。
xgb.cv中的參數分析:
①dtrain:
????訓練時用的數據
②params:
????網格搜索之后獲得的最佳參數組合,是一個字典。
③nfold:
????交叉驗證折數
④num_boost_round:
????迭代次數,相當于樹的數量,也就是生成多少基分類器。
⑤early_stopping_rounds:
????早期停止次數,假設為100,驗證機誤差迭代到一定程度在100之內不能再繼續降低,就停止迭代
⑥metrics:評價指標
⑦as_pandas:????
????請設置為True,表格展示,若設置為False,報錯。
⑧seed:隨機數種子
其余幾種模型的對比(可以理解作為baseline):
【此處只講隨機森林和隨機森林的網格搜索,其余見原文代碼】
# 隨機森林from sklearn.ensemble import RandomForestRegressorfore_reg = RandomForestRegressor()fore_reg.fit(x_train,y_train)fore_pred = fore_reg.predict(x_test)fore_pred = fore_pred.reshape(len(fore_pred),1)fore_scores = cross_val_score(fore_reg,fore_pred,y_test,scoring='neg_mean_squared_error',cv=3)print('隨機森林:')display_scores(fore_scores)隨機森林的網格搜索:
# Ok 我們看到上面的mean值對比# 這里面的參數都是采用的默認值,我們選取這里面表現好一點的隨機森林# 我們對隨機森林也進行網格搜索!param_grid =[{'n_estimators':range(1,50,5),'max_features':range(1,10,2)}, {'bootstrap':[False],'n_estimators':range(1,50,5),'max_features':range(1,10,2)}]forest_reg = RandomForestRegressor()forest_gird_search = GridSearchCV(forest_reg,param_grid,scoring = 'neg_mean_squared_error',cv=3)forest_gird_search.fit(x_train,y_train)# 查看最好參數forest_gird_search.best_params_# 依照最好參數構建新的隨機森林模型best_fore_reg = RandomForestRegressor(bootstrap=False,max_features=.5,n_estimators=36)best_fore_reg.fit(x_train,y_train)best_fore_pred = best_fore_reg.predict(x_test)best_fore_pred = best_fore_pred.reshape(len(best_fore_pred),1)best_fore_scores = cross_val_score(best_fore_reg,best_fore_pred,y_test,scoring='neg_mean_squared_error',cv=3)print('網格搜索后的隨機森林:')display_scores(best_fore_scores)Random forest-參數分析
主要也就是調節一下幾個參數 :
①n_enstimators:森林里樹的個數
②max_features【默認auto】:
????? ? 每一棵決策樹的隨機選擇的特征數目
????????有三種選擇:
1)“auto/None ”:選擇所有特征
2)“sqrt/log2”:使用總特征數的平方根個
3).x:如.2表示選擇特征總數的20%
③max_depth:樹的最深深度
④bootstrap【默認True】:抽取樣本時候是否有放回,若為True,即為又放回的抽取,False:無放回的抽取。
通過開始時候展示的結果對比,就知道XGBoost的強大性。
????????至此,XGBoost的原理和實踐完成,就掌握除了基本算法之外的一個機器學習很好用的算法,原理和實踐缺一不可,不了解原理就無法調參,無法知道整個過程。因此推薦先了解原理。
謝謝閱讀,完整代碼附上!
(提取碼:cvzi)
存到jupyter默認路徑即可運行
總結
以上是生活随笔為你收集整理的加载svr模型_机器学习XGBoost实战,网格搜索自动调参,对比随机森林,线性回归,SVR【完整代码(含注释)+数据集见原文链接】...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 众辰变频器参数设定_电工知识:变频器使用
- 下一篇: 树莓派4烧录系统后黑屏_树莓派4B初次使