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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

机器学习-集成学习

發布時間:2023/12/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习-集成学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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#%% md# 生成數據 生成12000行的數據,訓練集和測試集按照31劃分#%%from sklearn.datasets import make_hastie_10_2 data,target=make_hastie_10_2() data#%%X_train, X_test, y_train, y_test = train_test_split(data, target,random_state=123) X_train.shape, X_test.shape y_train#%% md# 模型對比 對比六大模型,都是默認參數#%%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-startprint("Accuracy: %0.8f (+/- %0.2f),耗時%0.2f秒。模型名稱[%s]" %(scores.mean(), scores.std(), running_time, label))#%% md對比了六大模型,可以看出,邏輯回歸速度最快,但準確率最低。 而LightGBM,速度快,而且準確率最高,所以,現在處理結構化數據的時候,大部分都是用LightGBM算法。#%% md# 原生XGBoost的使用 1.原生XGBoost的使用#%%import xgboost as xgb #記錄運行時間 import time start_time=time.time() # xgb矩陣賦值 xgb_train=xgb.DMatrix(X_train,y_train) xgb_test = xgb.DMatrix(X_test, label=y_test) ##參數 params = {'booster': 'gbtree','silent': 0, #設置成1則沒有運行信息輸出,最好是設置為0.#'nthread':7,# cpu 線程數 默認最大'eta': 0.007, # 如同學習率'min_child_weight': 3,# 這個參數默認是 1,是每個葉子里面 h 的和至少是多少,對正負樣本不均衡時的 0-1 分類而言#,假設 h 在 0.01 附近,min_child_weight 為 1 意味著葉子節點中最少需要包含 100 個樣本。#這個參數非常影響結果,控制葉子節點中二階導的和的最小值,該參數值越小,越容易 overfitting。'max_depth': 6, # 構建樹的深度,越大越容易過擬合'gamma': 0.1, # 樹的葉子節點上作進一步分區所需的最小損失減少,越大越保守,一般0.1、0.2這樣子。'subsample': 0.7, # 隨機采樣訓練樣本'colsample_bytree': 0.7, # 生成樹時進行的列采樣 'lambda': 2, # 控制模型復雜度的權重值的L2正則化項參數,參數越大,模型越不容易過擬合。#'alpha':0, # L1 正則項參數#'scale_pos_weight':1, #如果取值大于0的話,在類別樣本不平衡的情況下有助于快速收斂。#'objective': 'multi:softmax', #多分類的問題#'num_class':10, # 類別數,多分類與 multisoftmax 并用'seed': 1000, #隨機種子#'eval_metric': 'auc' } plst=list(params.items()) num_rounds=500 # 迭代次數 watchlist=[(xgb_train,'train'),(xgb_test,'val')]#%%#訓練模型并保存 # early_stopping_rounds 當設置的迭代次數較大時,early_stopping_rounds 可在一定的迭代次數內準確率沒有提升就停止訓練 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)......")#%% mdLIghtGBM的使用 1.原生接口#%%import lightgbm as lgb from sklearn.metrics import mean_squared_error # 加載你的數據 # print('Load data...') # df_train = pd.read_csv('../regression/regression.train', header=None, sep='\t') # df_test = pd.read_csv('../regression/regression.test', header=None, sep='\t') # # y_train = df_train[0].values # y_test = df_test[0].values # X_train = df_train.drop(0, axis=1).values # X_test = df_test.drop(0, axis=1).values# 創建成lgb特征的數據集格式 lgb_train = lgb.Dataset(X_train, y_train) # 將數據保存到LightGBM二進制文件將使加載更快 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, # k 意味著每 k 次迭代執行bagging'verbose': 1 # <0 顯示致命的, =0 顯示錯誤 (警告), >0 顯示信息 } print('Start training...') # 訓練 cv and train 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) #如果在訓練期間啟用了早期停止,可以通過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))))#%% md2.scikit-learn接口#%%from sklearn import metrics from lightgbm import LGBMClassifierclf = LGBMClassifier(boosting_type='gbdt', # 提升樹的類型 gbdt,dart,goss,rfnum_leaves=31, #樹的最大葉子數,對比xgboost一般為2^(max_depth)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, # L1正則化系數reg_lambda=0.0, # L2正則化系數random_state=None,n_jobs=-1,silent=True, ) clf.fit(X_train, y_train, eval_metric='auc') #設置驗證集合 verbose=False不打印過程 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))#%%#%%#%%#%%#%%#%%

資料

總結

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

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