iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0

整體/集成學習

  • 通過結合多個基本模型的預測結果,獲得更好的整體預測性能。
  • 可以是相同類型的模型,也可以是不同類型的模型。
  • 通過集體決策來消除個別模型的不足,從而達到更準確和穩定的預測結果。
比喻:就像是一個人在做決策時,會諮詢多位專家的意見,
然後根據這些意見做出最終決策,以獲得更可靠和全面的結果。
  • Bagging
    • Random forest
  • Boosting
    • AdaBoost
    • Gradient Boosting
    • XGBoost
  • Stacking

Bagging (Bootstrap Aggregating)

  • 把訓練資料重新採樣產生不同組的訓練資料
  • Bagging 自助重抽總合法

隨機森林 Random forest

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn import datasets

iris = datasets.load_iris()
X = iris.data
y = iris.target

# 將數據分為訓練和測試集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=0)

# 創建Random Forest分類器
rf_classifier = RandomForestClassifier(n_estimators=100, random_state=0)

# 將模型擬合到訓練數據上
rf_classifier.fit(X_train, y_train)

# 使用訓練好的模型進行預測
predicted = rf_classifier.predict(X_test)

# 計算準確度
accuracy = (predicted == y_test).mean()
print('準確度:', accuracy)

Boosting

  • 根據每一筆訓練資料的難或簡單給予不同的權重
  • 用多個弱學習器的預測來構建強學習器

AdaBoost

  • 為每個數據點分配權重,並在每次迭代中調整這些權重

Gradient Boosting

  • 按順序構建一組決策樹,其中每棵樹糾正前一棵樹的錯誤
  • 通過梯度下降最小化損失函數,如均方誤差

XGBoost

  • 利用了二階梯度來對節點進行劃分
  • 利用局部近似算法對分裂節點進行優化
  • 在損失函數中加入了 L1/L2 項,控制模型的複雜度
  • 提供 GPU 平行化運算

XGBOOST 分類器

from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn import datasets

iris = datasets.load_iris()
X = iris.data
y = iris.target

# 將數據分為訓練和測試集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=0)

# 創建XGBoost分類器
xgboostModel = XGBClassifier(n_estimators=100, learning_rate=0.3)
xgboostModel.fit(X_train, y_train)
predicted = xgboostModel.predict(X_test)

# 計算準確度
accuracy = (predicted == y_test).mean()
print('準確度:', accuracy)

XGBOOST 迴歸器

from xgboost import XGBClassifier
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn import datasets

iris = datasets.load_iris()
X = iris.data
Y = iris.target
X_train, X_test, y_train, y_test = train_test_split(
    X, Y, test_size=0.3, random_state=0)

# 建立 XGBRegressor 模型
xgbrModel = xgb.XGBRegressor()
xgbrModel.fit(X_train, y_train)
predicted = xgbrModel.predict(X_train)

#  我們可以直接呼叫 score() 直接計算模型預測的準確率。
# 預測成功的比例
print('訓練集: ', xgbrModel.score(X_train, y_train))
print('測試集: ', xgbrModel.score(X_test, y_test))

'''
- Parameters:

n_estimators: 總共迭代的次數,即決策樹的個數。預設值為100。
max_depth: 樹的最大深度,默認值為6。
booster: gbtree 樹模型(預設) / gbliner 線性模型
learning_rate: 學習速率,預設0.3。
gamma: 懲罰項係數,指定節點分裂所需的最小損失函數下降值。
Attributes:

feature_importances_: 查詢模型特徵的重要程度。
Methods:

fit: 放入X、y進行模型擬合。
predict: 預測並回傳預測類別。
score: 預測成功的比例。
predict_proba: 預測每個類別的機率值。
'''

CatBoost

  • 基於 Gradient Boosting Tree 的梯度提升樹模型框架
  • 對類別特徵的直接支援
  • 允許字串類型的特徵進行模型訓練
  • 優點
    • 自動處理類別型的特徵
    • 自動處理缺失值
    • 可以處理各種數據類型,如音頻、文字、圖像
    • 減少人工調參的需要,並降低了過擬合的機會
import catboost
from catboost import CatBoostRegressor
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.metrics import mean_squared_error

iris = datasets.load_iris()
X = iris.data
y = iris.target


X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=0)

# 創建CatBoost回歸模型
catboost_regressor = CatBoostRegressor(
    iterations=500, learning_rate=0.1, depth=6, random_seed=0, verbose=0)
catboost_regressor.fit(X_train, y_train)
predicted = catboost_regressor.predict(X_test)


mse = mean_squared_error(y_test, predicted)
print('均方誤差 (MSE):', mse)

Stacking

from sklearn.ensemble import RandomForestRegressor  # 隨機森林回歸
from sklearn.linear_model import LinearRegression  # 線性回歸
from sklearn import svm  # 支持向量機
from sklearn.neighbors import KNeighborsRegressor  # K最近鄰回歸
from sklearn.tree import DecisionTreeRegressor  # 決策樹回歸
from sklearn.ensemble import StackingRegressor  # 堆疊回歸
from sklearn.neural_network import MLPRegressor  # 多層感知器
from sklearn.model_selection import train_test_split  
from sklearn import datasets  #

iris = datasets.load_iris()  
X = iris.data  # 特徵資料
Y = iris.target  # 目標資料
X_train, X_test, y_train, y_test = train_test_split(
    X, Y, test_size=0.3, random_state=0)

estimators = [
    ('rf', RandomForestRegressor(random_state=42)),  # 隨機森林回歸器
    ('svr', svm.SVR()),  # 支持向量機回歸器
    ('knn', KNeighborsRegressor()),  # K最近鄰回歸器
    ('dt', DecisionTreeRegressor(random_state=42))  # 決策樹回歸器
]

clf = StackingRegressor(
    estimators=estimators,
    final_estimator=MLPRegressor(activation="relu", alpha=0.1, hidden_layer_sizes=(8, 8),
                                 learning_rate="constant", max_iter=2000, random_state=1000)
)
'''
StackingRegressor是一個將多個回歸模型組合起來的模型。它接受兩個參數:

estimators:一個列表,包含元組形式的弱學習器名稱和對應的回歸模型物件。
final_estimator:最終的預測模型,用於整合弱學習器的預測結果。在這個例子中,最終預測模型是MLPRegressor,具有指定的參數。
estimators列表包含了四個弱學習器,分別是隨機森林回歸器(RandomForestRegressor)、支持向量機回歸器(svm.SVR)、K最近鄰回歸器(KNeighborsRegressor)和決策樹回歸器(DecisionTreeRegressor)。

final_estimator是一個MLPRegressor物件,具有以下參數設定:

activation="relu":激活函數為ReLU。
alpha=0.1:L2正則化的參數。
hidden_layer_sizes=(8, 8):兩個隱藏層,每個隱藏層有8個神經元。
learning_rate="constant":學習率為常數。
max_iter=2000:最大迭代次數為2000次。
random_state=1000:設定隨機種子以確保結果的可重複性。
'''
clf.fit(X_train, y_train)  

print("訓練集 Score: ", clf.score(X_train, y_train))  # 輸出訓練集的評分
print("測試集 Score: ", clf.score(X_test, y_test))  # 輸出測試集的評分

'''
- 參數:

estimators: m 個弱學習器。
final_estimator: 集合所有弱學習器的輸出,訓練一個最終預測模型。預設為LogisticRegression。
屬性:

estimators_: 查看弱學習器組合。
final_estimator: 查看最終整合訓練模型。
方法:

fit: 放入X、y進行模型擬合。
predict: 預測並回傳預測類別。
score: 預測成功的比例。
predict_proba: 預測每個類別的機率值

'''


上一篇
[DAY25] 機器學習 - 決策樹(一)
下一篇
[DAY27] 機器學習 - 決策樹(三)
系列文
關於我從基礎程設轉職到人工智慧入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言