一.什么是集成學習
集成學習的基本思想是通過結合多個基學習器的預測結果,來提高模型的泛化能力和穩定性。這些基學習器可以是相同類型的算法,也可以是不同類型的算法。
當基學習器之間具有一定的差異性時,它們在面對不同的樣本子集或特征子集時,可能會犯不同的錯誤。通過將這些基學習器集成起來,可以相互補充,減少錯誤,從而提高整體的預測準確性。
二.?集成學習的作用
1.增加準確度:多個模型通常比單個模型預測更準確。
2.減少過擬合:通過模型多樣性降低對訓練數據特定模式的依賴。
3.對噪聲數據和異常數據有更高的容忍度。
三.主要的集成學習方法
1.Bagging
原理:通過自助采樣獲得多個訓練集,分別訓練模型,然后取平均值(回歸時)或投票(分類時)。
代表算法:隨機森林算法。
bagging是一種并行式的集成學習方法,不同訓練集訓練模型之間沒有聯系
隨機森林:決策樹 + Bagging
隨機森林api(使用前要記得 from sklearn.ensemble import RandomForestClassifier):
RandomForestClassifier(n_estimators = 40, #隨機森林中決策樹的數量,一般在50-100之間criterion = 'gini', #分割特征的方法max_depth = None,bootstrap = None,random_state = 42 #隨機數種子
)
Bagging分類器:
BaggingClassifier(estimator = DecisionTreeClassifier(), #集成算法使用決策樹n_estimators = 60, #多少個決策樹max_samples = 0.8, #每次采樣80%的樣本max_features = 0.8, #每次采樣80%的特征random_state = 42 #隨機數種子
)
2.Boosting
原理:在每一輪迭代中,根據當前的樣本權重分布,訓練一個弱學習器。這個弱學習器會嘗試對訓練數據進行擬合,但它的性能可能相對較弱。然后,根據弱學習器的預測結果,調整樣本的權重。具體來說,對于被錯誤分類的樣本,增加其權重;對于被正確分類的樣本,降低其權重。這樣,在下一輪迭代中,弱學習器會更加關注那些之前被錯誤分類的樣本。這個過程不斷重復,直到達到預設的迭代次數或者滿足其他停止條件。
代表算法:AdaBoost
Boosting是一種串行集成學習方法,將多個弱學習器集合成一個強學習器。
逐步改進:每個新模型都專注于糾正前一個模型的錯誤。
加權訓練:錯誤分類的樣本在后續訓練中獲得更高權重。
線性組合:將所有弱學習器的預測結果加權組合。
AdaBoost api(使用前要記得 from sklearn.ensemble import AdaBoostClassifier):
AdaBoostClassifier(estimator = DecisionTreeClassifier(),n_estimators = 60,learning_rate = 0.8,random_state = 42)
四.總結
Bagging:從原始訓練數據集中有放回地隨機抽樣,生成多個子數據集,然后分別在這些子數據集上訓練不同的基學習器,最后將這些基學習器的預測結果進行組合(分類任務通常采用投票法,回歸任務通常采用平均法)來得到最終的預測結果。
Boosting:在訓練過程中,根據前一個基學習器的預測結果來調整樣本的權重,使得被錯誤分類的樣本在后續的訓練中得到更多的關注,然后依次訓練多個基學習器,每個基學習器都在上一輪調整后的樣本權重基礎上進行訓練,最后將這些基學習器按照一定的權重組合起來進行預測。
五.小練習
1.
?
import matplotlib.pyplot as plt
from IPython.core.pylabtools import figsize
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
import numpy as np
import pandas as pdiris = load_iris()x = iris.data
y = iris.targetx_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 42)
R_forest = RandomForestClassifier(n_estimators = 100,criterion = 'gini',max_depth = 3,random_state = 42
)
R_forest.fit(x_train, y_train)
y_predict = R_forest.predict(x_test)
print('準確率:', accuracy_score(y_predict, y_test))print('分類')
print(classification_report(y_test, y_predict, target_names=iris.target_names))cm = confusion_matrix(y_test, y_predict)
cm_df = pd.DataFrame(cm,index = [f"預測{cls}" for cls in iris.target_names],columns = [f"實際{cls}" for cls in iris.target_names]
)
print(cm_df)plt.figure((figsize(10, 6)))
plt.barh(iris.feature_names, R_forest.feature_importances_)
plt.title('importance')
plt.xlabel('feature_importances')
plt.ylabel('feature_names')
plt.tight_layout()
plt.show()
2.
?
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report, roc_auc_scoredata = pd.read_csv('creditcard.csv')scaler = StandardScaler()
data['Amount'] = scaler.fit_transform(data['Amount'].values.reshape(-1, 1))# 刪除Time列
df = data.drop('Time', axis=1)x = data.drop('Class', axis=1)
y = data['Class']
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=42, stratify=y)# 4. 訓練模型
model = RandomForestClassifier(n_estimators=100,class_weight='balanced',random_state=42)
model.fit(x_train, y_train)y_predict = model.predict(x_test)
y_prob = model.predict_proba(x_test)[:, 1]print("分類報告:")
print(classification_report(y_test, y_predict, digits=4))
print(f"AUC-ROC: {roc_auc_score(y_test, y_prob):.4f}")