生活随笔
收集整理的這篇文章主要介紹了
机器学习-集成学习
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
01 集成學習方法概述
- Bagging:從訓練集中進行子抽樣組成每個基模型所需要的自己訓練集,對所有基模型預測的結果進行綜合產生最終的預測結果:
Boosting
- 訓練過程為階梯狀,基模型按次序一一進行訓練(實現上可以做到并行),基模型的訓練集按照某種策略每次都進行一定的轉化。對所有基模型預測的結果進行線性綜合產生最終的預測結果。
Stacking
- 將訓練好的所有基模型對訓練集進行預測,在這里插入代碼片第j個基模型對第i個訓練樣本的預測值將作為新的訓練集中第i個樣本的第j個特征值,最后基于新的訓練集進行訓練。同理,預測的過程也要先經過所有基模型的預測形成新的測試集,最后再對測試集進行預測
Random Forest(隨機森林)
- 用隨機的方式建立一個森林,隨機森林算法由很多決策樹組成,每一棵決策樹之間沒有關聯。建立完森林后,當有新樣本進入時,每棵決策樹都會分別進行判斷,然后基于投票法給出分類結果.
- 優點:
- 在數據集上表現良好,相對于其他算法有較大的優勢
- 易于并行化,在大數據集上有很大的優勢
- 能夠處理高維數據,不用做特征選擇
Random Forest(隨機森林)
是Bagging 的擴展變體,它在以決策樹為基學習器構建Bagging 集成的基礎上,進一步在決策樹的訓練過程中引入了隨機特征選擇,因此可以概括隨機森林包括四個部分:
- 1.隨機選擇樣本(放回抽樣);
- 2.隨機選擇特征;
- 3.構建決策樹;
- 4.隨機森林投票(平均)。
- 隨機選擇樣本和Bagging 相同,采用的是Bootstraping自助采樣法;隨機選擇特征是指在每個節點在分裂過程中都是隨機選擇特征的(區別與每棵樹隨機選擇一批特征)。這種隨機性導致隨機森林的偏差會有稍微的增加(相比于單棵不隨機樹),但是由于隨機森林的“平均”特性,會使得它的方差減小,而且方差的減小補償了偏差的增大,因此總體而言是更好的模型。
02 AdaBoost和GBDT算法
- AdaBoost(AdaptiveBoosting,自適應增強),其自適應在于:前一個基本分類器分錯的樣本會得到加強,加權后的全體樣本再次被用來訓練下一個基本分類器。同時,在每一輪中加入一個新的弱分類器,直到達到某個預定的足夠小的錯誤率或達到預先指定的最大迭代次數。
- 后一個模型的訓練永遠是在前一個模型的基礎上完成!
- 算法思想:初始化訓練樣本的權值分布,每個樣本具有相同的權重
- 訓練弱分類器,如果樣本分類正確,則在構造下一個訓練集中它的權值就會被降低;反之提高,用更新過的樣本集去訓練下一個分類器
- 將所有弱分類組合成強分類器,各個弱分類器的訓練過程結束后,加大分類差錯率小的弱分類器權重,降低分類誤差率大的弱分類器的權重
AdaBoost算法思想
GBDT
- GBDT(GradientBoosting Decision Tree)是一種迭代的決策樹算法,該算法由多棵決策樹組成,GBDT的核心在于累加所有樹的結果作為最終結果,所以GBDT 中的樹都是回歸樹,不是分類樹,它是屬于Boosting 策略。GBDT是被公認的泛化能力較強的算法。
- GBDT算法:
03 XGBoost
- XGBoost是大規模并行boosting tree 的工具,它是目前最快最好的開源boosting tree 工具包,比常見的工具包快10 倍以上。XGBoost和GBDT 兩者都是boosting 方法,除了工程實現、解決問題上的一些差異外,最大的不同就是目標函數的定義。
-
04 LightGBM
- LightGBM由微軟提出,主要用于解決GDBT在海量數據中遇到的問題,以便其可以更好更快地用于工業實踐中,其相對XGBoost具有訓練速度快、內存占用低的特點。
LightGBM與XGBoost相比,主要有以下幾個優勢:
1)更快的訓練速度
2)更低的內存消耗
3)更好的準確率
4)分布式支持,可快速處理海量數據 - LightGBM的主要改進
LightGBM與XGBoost相比,主要有以下幾個改進:
?基于梯度的單邊采樣算法(Gradient-based One-Side Sampling, GOSS);
?互斥特征捆綁算法(Exclusive Feature Bundling, EFB);
?直方圖算法(Histogram );
?基于最大深度的Leaf-wise 的垂直生長算法;
LightGBM= XGBoost+ GOSS + EFB+ Histogram - 基于梯度的單邊采樣算法(Gradient-based One-Side Sampling, GOSS)
主要思想是通過對樣本采樣的方法來減少計算目標函數增益時候的復雜度。GOSS算法保留了梯度大的樣本,并對梯度小的樣本進行隨機抽樣,為了不改變樣本的數據分布,在計算增益時為梯度小的樣本引入一個常數進行平衡
如果一個樣本的梯度很小,說明該樣本的訓練誤差很小,或者說該樣本已經得到了很好的訓練(well-trained)。 - 基于梯度的單邊采樣算法(Gradient-based One-Side Sampling, GOSS)
輸入:訓練數據,迭代步數d,大梯度數據的采樣率a,小梯度數據的采樣率b,損失函數和若學習器的類型(一般為決策樹)
輸出:訓練好的強學習器
(1)根據樣本點的梯度的絕對值對它們進行降序排序;
(2)對排序后的結果選取前a*100%的樣本生成一個大梯度樣本點的子集;
(3)對剩下的樣本集合(1-a)*100%的樣本,隨機的選取b *(1-a)*100%個樣本點,生成一個小梯度樣本點的集合;
(4)將大梯度樣本和采樣的小梯度樣本合并;
(5)將小梯度樣本乘上一個權重系數1?ab\frac{1-a}{b}b1?a?;
(6)使用上述的采樣的樣本,學習一個新的弱學習器;
(7)不斷地重復(1)~(6)步驟直到達到規定的迭代次數或者收斂為止。
- 互斥特征捆綁算法(Exclusive Feature Bundling, EFB)
高維特征往往是稀疏的,而且特征間可能是相互排斥的(如兩個特征不同時取非零值),如果兩個特征并不完全互斥(如只有一部分情況下是不同時取非零值),可以用互斥率表示互斥程度。EFB算法指出如果將一些特征進行融合綁定,則可以降低特征數量。
論文給出特征合并算法,其關鍵在于原始特征能從合并的特征中分離出來。
import warnings
warnings
.filterwarnings
('ignore')
import pandas
as pd
from sklearn
.model_selection
import train_test_split
生成
12000行的數據,訓練集和測試集按照
3:
1劃分
from sklearn
.datasets
import make_hastie_10_2
data
,target
=make_hastie_10_2
()
dataX_train
, X_test
, y_train
, y_test
= train_test_split
(data
, target
,random_state
=123)
X_train
.shape
, X_test
.shape
y_train
對比六大模型,都是默認參數
from sklearn
.linear_model
import LogisticRegression
from sklearn
.ensemble
import RandomForestClassifier
from sklearn
.ensemble
import AdaBoostClassifier
from sklearn
.ensemble
import GradientBoostingClassifier
from xgboost
import XGBClassifier
from lightgbm
import LGBMClassifier
import time
from sklearn
.model_selection
import cross_val_score
clf1
=LogisticRegression
()
clf2
= RandomForestClassifier
()
clf3
= AdaBoostClassifier
()
clf4
= GradientBoostingClassifier
()
clf5
= XGBClassifier
()
clf6
= LGBMClassifier
()
clf1
.fit
(X_train
,y_train
)
print(clf1
.score
(X_test
,y_test
))
for clf
, label
in zip([clf1
, clf2
, clf3
, clf4
, clf5
, clf6
], ['Logistic Regression', 'Random Forest', 'AdaBoost', 'GBDT', 'XGBoost','LightGBM'
]):start
= time
.time
()scores
= cross_val_score
(clf
, X_train
, y_train
, scoring
='accuracy', cv
=5)print(scores
)end
= time
.time
()running_time
= end
-start
print("Accuracy: %0.8f (+/- %0.2f),耗時%0.2f秒。模型名稱[%s]" %(scores
.mean
(), scores
.std
(), running_time
, label
))對比了六大模型,可以看出,邏輯回歸速度最快,但準確率最低。 而LightGBM,速度快,而且準確率最高,所以,現在處理結構化數據的時候,大部分都是用LightGBM算法。
1.原生XGBoost的使用
import xgboost
as xgb
import time
start_time
=time
.time
()
xgb_train
=xgb
.DMatrix
(X_train
,y_train
)
xgb_test
= xgb
.DMatrix
(X_test
, label
=y_test
)
params
= {'booster': 'gbtree','silent': 0, 'eta': 0.007, 'min_child_weight': 3,'max_depth': 6, 'gamma': 0.1, 'subsample': 0.7, 'colsample_bytree': 0.7, 'lambda': 2, 'seed': 1000,
}
plst
=list(params
.items
())
num_rounds
=500
watchlist
=[(xgb_train
,'train'),(xgb_test
,'val')]
model
= xgb
.train
(plst
,xgb_train
,num_rounds
,watchlist
,early_stopping_rounds
=100,
)
print("best best_ntree_limit", model
.best_ntree_limit
)
y_pred
= model
.predict
(xgb_test
, ntree_limit
=model
.best_ntree_limit
)
print('error=%f' %(sum(1for i
in range(len(y_pred
)) if int(y_pred
[i
] > 0.5) != y_test
[i
]) /float(len(y_pred
))))
cost_time
= time
.time
() - start_time
print("xgboost success!", '\n', "cost time:", cost_time
, "(s)......")LIghtGBM的使用
1.原生接口
import lightgbm
as lgb
from sklearn
.metrics
import mean_squared_error
lgb_train
= lgb
.Dataset
(X_train
, y_train
)
lgb_eval
= lgb
.Dataset
(X_test
, y_test
, reference
=lgb_train
)
params
= {'task': 'train','boosting_type': 'gbdt', 'objective': 'regression', 'metric': {'l2', 'auc'}, 'num_leaves': 31, 'learning_rate': 0.05, 'feature_fraction': 0.9, 'bagging_fraction': 0.8, 'bagging_freq': 5, 'verbose': 1
}
print('Start training...')
gbm
= lgb
.train
(params
,lgb_train
,num_boost_round
=500,valid_sets
=lgb_eval
,early_stopping_rounds
=5) print('Save model...')gbm
.save_model
('model.txt') print('Start predicting...')
y_pred
= gbm
.predict
(X_test
, num_iteration
=gbm
.best_iteration
)
print('error=%f' %(sum(1for i
in range(len(y_pred
)) if int(y_pred
[i
] > 0.5) != y_test
[i
]) /float(len(y_pred
))))2.scikit
-learn接口
from sklearn
import metrics
from lightgbm
import LGBMClassifierclf
= LGBMClassifier
(boosting_type
='gbdt', num_leaves
=31, max_depth
=-1, learning_rate
=0.1, n_estimators
=100, subsample_for_bin
=200000,objective
=None,class_weight
=None,min_split_gain
=0.0, min_child_weight
=0.001, min_child_samples
=20,subsample
=1.0, subsample_freq
=0, colsample_bytree
=1.0, reg_alpha
=0.0, reg_lambda
=0.0, random_state
=None,n_jobs
=-1,silent
=True,
)
clf
.fit
(X_train
, y_train
, eval_metric
='auc')
clf
.fit
(X_train
, y_train
)y_true
, y_pred
= y_test
, clf
.predict
(X_test
)
print("Accuracy : %.4g" % metrics
.accuracy_score
(y_true
, y_pred
))
資料
總結
以上是生活随笔為你收集整理的机器学习-集成学习的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。