一.什么是集成学习
集成学习的基本思想是通过结合多个基学习器的预测结果,来提高模型的泛化能力和稳定性。这些基学习器可以是相同类型的算法,也可以是不同类型的算法。
当基学习器之间具有一定的差异性时,它们在面对不同的样本子集或特征子集时,可能会犯不同的错误。通过将这些基学习器集成起来,可以相互补充,减少错误,从而提高整体的预测准确性。
二. 集成学习的作用
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}")