整體/集成學習
- 通過結合多個基本模型的預測結果,獲得更好的整體預測性能。
- 可以是相同類型的模型,也可以是不同類型的模型。
- 通過集體決策來消除個別模型的不足,從而達到更準確和穩定的預測結果。
比喻:就像是一個人在做決策時,會諮詢多位專家的意見,
然後根據這些意見做出最終決策,以獲得更可靠和全面的結果。
- Bagging
- 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: 預測每個類別的機率值
'''