成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python中用XGBoost和scikit-learn進行隨機梯度增強

開發 后端
在本文中,您將發現隨機梯度增強以及如何使用XGBoost和Python中的scikit-learn來調整采樣參數。

[[399020]]

 集成決策樹的一種簡單技術涉及在訓練數據集的子樣本上訓練樹。可以采用訓練數據中行的子集來訓練稱為袋裝的單個樹。在計算每個分割點時,如果還使用了訓練數據的行的子集,則這稱為隨機森林。這些技術也可以在稱為隨機梯度增強的技術中用于梯度樹增強模型。

在本文中,您將發現隨機梯度增強以及如何使用XGBoost和Python中的scikit-learn來調整采樣參數。閱讀這篇文章后,您將知道:

  •  在數據子樣本上訓練樹的原理以及如何將其用于梯度增強。
  •  如何使用scikit-learn調整XGBoost中基于行的子采樣。
  •  如何在XGBoost中按樹和拆分點調整基于列的子采樣。

隨機梯度提升

梯度增強是一個貪婪的過程。將新的決策樹添加到模型中,以更正現有模型的殘差。使用貪婪搜索過程創建每個決策樹,以選擇最能最小化目標函數的分割點。這可能會導致樹一次又一次使用相同的屬性,甚至使用相同的分割點。

套袋是一種創建決策樹集合的技術,每個決策樹都來自訓練數據中不同的隨機行子集。效果是,由于樣本的隨機性允許創建略有不同的樹木,因此從樹的集合中獲得了更好的性能,從而為集合的預測增加了方差。隨機森林通過在選擇分割點時對要素(列)進行二次采樣,從而進一步擴大了這一步驟,從而進一步增加了樹木的整體差異。這些相同的技術可以用于梯度提升中決策樹的構建中,這種變化稱為隨機梯度提升。通常使用訓練數據的激進子樣本,例如40%到80%。

教程概述

在本教程中,我們將研究不同的二次采樣技術在梯度增強中的作用。我們將調整Python的XGBoost庫所支持的三種不同的隨機梯度增強方式,特別是:

  •  創建每棵樹時,對數據集中的行進行二次采樣。
  •  創建每棵樹時對數據集中的列進行二次采樣。
  •  創建每個樹時,數據集中每個拆分的列的子采樣。

問題描述:Otto數據集

在本教程中,我們將使用“奧托集團產品分類挑戰”數據集。該數據集可從Kaggle免費獲得(您需要注冊到Kaggle才能下載此數據集)。您可以從“數據”頁面下載訓練數據集train.csv.zip并將解壓縮后的train.csv文件放入您的工作目錄中。該數據集描述了61,000多種產品的93個混淆細節,這些產品分為10個產品類別(例如,時尚,電子產品等)。輸入屬性是某種不同事件的計數。目標是對新產品做出預測,將其作為10個類別中每一個類別的概率數組,并使用多類對數損失(也稱為交叉熵)對模型進行評估。該競賽已于2015年5月完成,并且由于示例數量不多,問題難度大,幾乎不需要數據準備(除了將字符串類變量編碼為整數)的事實,該數據集對于XGBoost還是一個很大的挑戰。

在XGBoost中調整行二次采樣

行二次抽樣涉及選擇訓練數據集的隨機樣本而不進行替換。可以在subsample參數的XGBoost類的scikit-learn包裝器中指定行子采樣。默認值為1.0,該值不進行二次采樣。我們可以使用scikit-learn中內置的網格搜索功能來評估從0.1到1.0的不同子樣本值對Otto數據集的影響。 

  1. [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 1.0] 

子樣本有9個變體,每個模型將使用10倍交叉驗證進行評估,這意味著需要訓練和測試9×10或90個模型。

下面提供了完整的代碼清單。 

  1. # XGBoost on Otto dataset, tune subsample  
  2. from pandas import read_csv  
  3. from xgboost import XGBClassifier  
  4. from sklearn.model_selection import GridSearchCV  
  5. from sklearn.model_selection import StratifiedKFold  
  6. from sklearn.preprocessing import LabelEncoder  
  7. import matplotlib  
  8. matplotlib.use('Agg')  
  9. from matplotlib import pyplot  
  10. # load data  
  11. data = read_csv('train.csv')  
  12. datadataset = data.values  
  13. # split data into X and y  
  14. X = dataset[:,0:94]  
  15. y = dataset[:,94]  
  16. # encode string class values as integers  
  17. label_encoded_y = LabelEncoder().fit_transform(y)  
  18. # grid search  
  19. model = XGBClassifier()  
  20. subsample = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 1.0]  
  21. param_grid = dict(subsamplesubsample=subsample)  
  22. kfold = StratifiedKFold(n_splits=10shuffle=Truerandom_state=7 
  23. grid_search = GridSearchCV(model, param_grid, scoring="neg_log_loss"n_jobs=-1, cv=kfold 
  24. grid_result = grid_search.fit(X, label_encoded_y)  
  25. # summarize results  
  26. print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))  
  27. means = grid_result.cv_results_['mean_test_score']  
  28. stds = grid_result.cv_results_['std_test_score']  
  29. params = grid_result.cv_results_['params']  
  30. for mean, stdev, param in zip(means, stds, params):  
  31.  print("%f (%f) with: %r" % (mean, stdev, param))  
  32. # plot  
  33. pyplot.errorbar(subsample, means, yerr=stds 
  34. pyplot.title("XGBoost subsample vs Log Loss")  
  35. pyplot.xlabel('subsample')  
  36. pyplot.ylabel('Log Loss')  
  37. pyplot.savefig('subsample.png') 

運行此示例將打印最佳配置以及每個測試配置的日志丟失。

注意:由于算法或評估程序的隨機性,或者數值精度的差異,您的結果可能會有所不同。考慮運行該示例幾次并比較平均結果。

我們可以看到,獲得的最佳結果是0.3,或者使用30%的訓練數據集樣本訓練樹。 

  1. Best: -0.000647 using {'subsample': 0.3}  
  2. -0.001156 (0.000286) with: {'subsample': 0.1}  
  3. -0.000765 (0.000430) with: {'subsample': 0.2}  
  4. -0.000647 (0.000471) with: {'subsample': 0.3}  
  5. -0.000659 (0.000635) with: {'subsample': 0.4}  
  6. -0.000717 (0.000849) with: {'subsample': 0.5}  
  7. -0.000773 (0.000998) with: {'subsample': 0.6}  
  8. -0.000877 (0.001179) with: {'subsample': 0.7}  
  9. -0.001007 (0.001371) with: {'subsample': 0.8}  
  10. -0.001239 (0.001730) with: {'subsample': 1.0} 

我們可以繪制這些均值和標準偏差對數損失值,以更好地了解性能如何隨子樣本值變化。

我們可以看到確實有30%的人具有最佳的平均表現,但是我們也可以看到,隨著比率的增加,表現的差異會明顯增加。有趣的是,所有子樣本值的平均性能都優于不進行子抽樣的平均性能(子樣本= 1.0)。

在XGBoost中按樹調整列二次采樣

我們還可以在增強模型中創建每個決策樹之前,創建要使用的特征(或列)的隨機樣本。在scikit-learn的XGBoost包裝器中,這由colsample_bytree參數控制。默認值為1.0,表示在每個決策樹中使用所有列。我們可以在0.1到1.0之間評估colsample_bytree的值,以0.1為增量。 

  1. [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 1.0] 

完整實例如下: 

  1. # XGBoost on Otto dataset, tune colsample_bytree  
  2. from pandas import read_csv  
  3. from xgboost import XGBClassifier  
  4. from sklearn.model_selection import GridSearchCV  
  5. from sklearn.model_selection import StratifiedKFold  
  6. from sklearn.preprocessing import LabelEncoder  
  7. import matplotlib  
  8. matplotlib.use('Agg')  
  9. from matplotlib import pyplot  
  10. # load data  
  11. data = read_csv('train.csv')  
  12. datadataset = data.values  
  13. # split data into X and y  
  14. X = dataset[:,0:94]  
  15. y = dataset[:,94]  
  16. # encode string class values as integers  
  17. label_encoded_y = LabelEncoder().fit_transform(y)  
  18. # grid search  
  19. model = XGBClassifier()  
  20. colsample_bytree = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 1.0]  
  21. param_grid = dict(colsample_bytreecolsample_bytree=colsample_bytree)  
  22. kfold = StratifiedKFold(n_splits=10shuffle=Truerandom_state=7 
  23. grid_search = GridSearchCV(model, param_grid, scoring="neg_log_loss"n_jobs=-1, cv=kfold 
  24. grid_result = grid_search.fit(X, label_encoded_y)  
  25. # summarize results  
  26. print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))  
  27. means = grid_result.cv_results_['mean_test_score']  
  28. stds = grid_result.cv_results_['std_test_score']  
  29. params = grid_result.cv_results_['params']  
  30. for mean, stdev, param in zip(means, stds, params):  
  31.  print("%f (%f) with: %r" % (mean, stdev, param))  
  32. # plot  
  33. pyplot.errorbar(colsample_bytree, means, yerr=stds 
  34. pyplot.title("XGBoost colsample_bytree vs Log Loss")  
  35. pyplot.xlabel('colsample_bytree')  
  36. pyplot.ylabel('Log Loss')  
  37. pyplot.savefig('colsample_bytree.png') 

運行此示例將打印最佳配置以及每個測試配置的日志丟失。

注意:由于算法或評估程序的隨機性,或數值精度的差異,您的結果可能會有所不同。

我們可以看到,模型的最佳性能是colsample_bytree = 1.0。這表明該問題進行二次采樣不會增加價值。 

  1. Best: -0.001239 using {'colsample_bytree': 1.0}  
  2. -0.298955 (0.002177) with: {'colsample_bytree': 0.1}  
  3. -0.092441 (0.000798) with: {'colsample_bytree': 0.2}  
  4. -0.029993 (0.000459) with: {'colsample_bytree': 0.3}  
  5. -0.010435 (0.000669) with: {'colsample_bytree': 0.4}  
  6. -0.004176 (0.000916) with: {'colsample_bytree': 0.5}  
  7. -0.002614 (0.001062) with: {'colsample_bytree': 0.6}  
  8. -0.001694 (0.001221) with: {'colsample_bytree': 0.7}  
  9. -0.001306 (0.001435) with: {'colsample_bytree': 0.8}  
  10. -0.001239 (0.001730) with: {'colsample_bytree': 1.0} 

繪制結果,我們可以看到模型平穩段的性能(至少在此比例下),值為0.5到1.0。

通過拆分在XGBoost中調整列二次采樣

不必為每個樹對列進行一次子采樣,我們可以在決策樹的每個拆分中對它們進行子采樣。原則上,這是隨機森林中使用的方法。我們可以在scikit-learn的XGBoost包裝器類的colsample_bylevel參數中設置每個拆分所使用的列樣本的大小。和以前一樣,我們將比率從10%更改為默認值100%。

下面提供了完整的代碼清單。 

  1. # XGBoost on Otto dataset, tune colsample_bylevel  
  2. from pandas import read_csv  
  3. from xgboost import XGBClassifier  
  4. from sklearn.model_selection import GridSearchCV  
  5. from sklearn.model_selection import StratifiedKFold  
  6. from sklearn.preprocessing import LabelEncoder  
  7. import matplotlib  
  8. matplotlib.use('Agg')  
  9. from matplotlib import pyplot  
  10. # load data  
  11. data = read_csv('train.csv')  
  12. datadataset = data.values  
  13. # split data into X and y  
  14. X = dataset[:,0:94]  
  15. y = dataset[:,94]  
  16. # encode string class values as integers  
  17. label_encoded_y = LabelEncoder().fit_transform(y)  
  18. # grid search  
  19. model = XGBClassifier()  
  20. colsample_bylevel = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 1.0]  
  21. param_grid = dict(colsample_bylevelcolsample_bylevel=colsample_bylevel)  
  22. kfold = StratifiedKFold(n_splits=10shuffle=Truerandom_state=7 
  23. grid_search = GridSearchCV(model, param_grid, scoring="neg_log_loss"n_jobs=-1, cv=kfold 
  24. grid_result = grid_search.fit(X, label_encoded_y)  
  25. # summarize results  
  26. print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))  
  27. means = grid_result.cv_results_['mean_test_score']  
  28. stds = grid_result.cv_results_['std_test_score']  
  29. params = grid_result.cv_results_['params']  
  30. for mean, stdev, param in zip(means, stds, params):  
  31.  print("%f (%f) with: %r" % (mean, stdev, param))  
  32. # plot  
  33. pyplot.errorbar(colsample_bylevel, means, yerr=stds 
  34. pyplot.title("XGBoost colsample_bylevel vs Log Loss")  
  35. pyplot.xlabel('colsample_bylevel')  
  36. pyplot.ylabel('Log Loss')  
  37. pyplot.savefig('colsample_bylevel.png') 

運行此示例將打印最佳配置以及每個測試配置的日志丟失。

注意:由于算法或評估程序的隨機性,或者數值精度的差異,您的結果可能會有所不同。考慮運行該示例幾次并比較平均結果。

我們可以看到,通過將colsample_bylevel設置為70%可獲得最佳結果,導致(倒置)對數損失為-0.001062,這比將每棵樹的列采樣設置為100%時看到的-0.001239好。

如果每棵樹的結果建議使用100%的列,則建議不要放棄列二次采樣,而應嘗試按拆分的列二次采樣。 

  1. Best: -0.001062 using {'colsample_bylevel': 0.7}  
  2. -0.159455 (0.007028) with: {'colsample_bylevel': 0.1}  
  3. -0.034391 (0.003533) with: {'colsample_bylevel': 0.2}  
  4. -0.007619 (0.000451) with: {'colsample_bylevel': 0.3}  
  5. -0.002982 (0.000726) with: {'colsample_bylevel': 0.4}  
  6. -0.001410 (0.000946) with: {'colsample_bylevel': 0.5}  
  7. -0.001182 (0.001144) with: {'colsample_bylevel': 0.6}  
  8. -0.001062 (0.001221) with: {'colsample_bylevel': 0.7}  
  9. -0.001071 (0.001427) with: {'colsample_bylevel': 0.8}  
  10. -0.001239 (0.001730) with: {'colsample_bylevel': 1.0} 

我們可以繪制每個colsample_bylevel變化的性能。結果表明,在此比例下的值為0.3后,方差相對較低,并且性能似乎處于平穩狀態。 

 

責任編輯:龐桂玉 來源: Python中文社區 (ID:python-china)
相關推薦

2015-07-22 16:16:47

PythonScikit-Lear機器學習

2018-09-06 08:00:00

深度學習TensorFlowPython

2023-02-13 15:00:13

機器學習scikit-leaPyTorch

2023-05-26 12:45:22

predict?方法數據

2018-10-15 09:10:09

Python編程語言數據科學

2017-07-20 10:23:20

pythonscikit-lear垃圾郵件過濾

2018-04-06 05:10:04

K-NN數據集算法

2024-02-01 09:43:32

模型人工智能

2023-11-13 18:05:53

處理數據搭建模型

2017-01-05 10:07:33

大數據TheanoCaffe

2018-05-15 08:27:20

Scikit-lear機器學習Python

2017-11-03 12:57:06

機器學習文本數據Python

2017-04-21 09:59:11

開源機器學習框架

2022-04-15 10:11:03

機器學習scikit-lea

2016-12-20 16:07:13

Python數據預處理

2016-12-18 15:03:57

Python Scikit Lea數據

2023-03-27 07:34:28

XGBoostInluxDB時間序列

2021-04-16 20:46:21

PythonXGBoost 特征

2021-04-07 10:02:00

XGBoostPython代碼

2023-08-11 10:58:04

深度學習自然語言檢索增強
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品在线一区二区三区 | 97精品超碰一区二区三区 | 欧美日韩在线成人 | 麻豆久久 | 日韩不卡在线 | 精品国产网| 久久草在线视频 | 天天色综网 | 欧美三级视频在线观看 | 欧美性视频在线播放 | 国产免费黄网 | 国产精品久久久久久久久婷婷 | 99热精品在线观看 | av天天澡天天爽天天av | 国产精品影视在线观看 | www.久久久 | 亚洲人成网亚洲欧洲无码 | 成人午夜精品一区二区三区 | 久久国产精品一区二区三区 | 日韩精品一区在线 | 99久久精品国产一区二区三区 | 欧美成人h版在线观看 | www.日本精品 | 91av免费观看 | 中文亚洲字幕 | 免费午夜视频 | 欧美1区| 免费特级黄毛片 | 久久久成人网 | 99这里只有精品视频 | 久久久免费观看视频 | 欧美精品乱码久久久久久按摩 | 欧美五月婷婷 | 亚洲成人免费观看 | 偷拍自拍第一页 | 久热精品在线播放 | 中文字幕一区二区三区在线观看 | 久久久国产精品 | 狠狠操你 | 高清国产午夜精品久久久久久 | 中文字幕在线精品 |