集成学习概述

发布于:2025-06-07 ⋅ 阅读:(14) ⋅ 点赞:(0)

一.集成学习的核心知识

1.定义:

集成学习:  (Ensemble Learning)是一种机器学习范式,它通过构建并结合多个模型来完成学习任务,获得更好的泛化性能
其中,参与组合的模型又叫弱学习器或者基学习器。

2.核心思想:

通过组合多个弱学习器来构建一个强学习器。

常见方法有两种:bagging思想,boosting思想

①bagging思想:

用下图简单描述一下bagging思想流程

                                    

②boosting思想:

                                         

二.集成学习方法

1.核心方法的对比

  

2.算法的分类与举例

Ⅰbagging

代表算法:随机森林           

随机森林是采用决策树模型作为每一个弱学习器

①训练时:通过"有放回"的自助采样(bootstrap)从训练集中生成多个子集,每个子集"独立"训练一个基学习器(如决策树)。

②预测时:所有基学习器对未知样本进行预测,最终结果通过 投票(分类) 或 平均(回归) 得到

③随机森林实现步骤:
    1.有放回的随机抽样产生训练集
    2.随机挑选n个特征(n小于特征总数)
    3.训练弱学习器
    4.重复1-3,训练n个弱学习器(决策树)
    5.预测结果
        分类问题:多数表决
        回归问题:计算平均值

它的api:
    sklearn.ensemble.RandomForestClassifier

# 导包
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier

# 加载数据
data = pd.read_csv(r"D:\workspace\data\train.csv")
# 3.了解数据
print(data.head())
print(data.columns)
data.info()
#  4.数据预处理
data2 = data.copy()
# 填充缺失值
data2["Age"] = data2["Age"].fillna(data2["Age"].mean())
# 5.特征工程
# 特征选择和标签选择
x = data2[["Pclass", "Sex", "Age"]]
y = data2["Survived"]
print(x.head())
# TODO one-hot编码sex需要通过热编码
x = pd.get_dummies(x, drop_first=True)
print(x.head())
# 6.切割数据
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=88)
# TODO 7.创建随机森林模型
models = RandomForestClassifier(n_estimators=30, max_depth=10, random_state=88)
# 8.模型训练
models.fit(x_train, y_train)
# 9.模型预测
y_predict = models.predict(x_test)

ⅡBoosting
①训练时:基学习器是顺序训练的,每个新模型都试图修正前一个模型的错误(如调整样本权重或拟合残差)。


②预测时:所有基学习器的预测结果进行加权组合(如AdaBoost)或累加(GBDT系列)。
    api:
        sklearn.ensemble.AdaBoostClassifier
        sklearn.ensemble.GradientBoostingClassifier

1.AdaBoost算法

①算法思想:通过逐步提高前一步分类错误的样本的权重来训练一个强分类器

②实现步骤:
    1.初始化数据权重,训练第一个学习器,根据预测结果找一个错误率最小的分裂点,然后重新计算样       本权重,模型权重
    2.根据新的样本权重,训练第二个学习器,根据结果找一个错误率最小的分裂点,然后再次更新样本       权重,模型权重

( :样本权重的变化,影响了错误率的计算,进而影响了模型权重的计算,所以随着训练的展开,模型会越来越关注分类错误的样本)
    3.重复以上过程,依次训练n个弱学习器.最终组合起来进行预测,结果大于0为正类,小于0为负类
        

# 1.导包
import pandas as pd
# TODO 导入标签编码包
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
# TODO 导入Adaboost模型包
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score

# 2.加载数据
data = pd.read_csv("data/wine0501.csv")
# 3.了解数据
print(data.head())
print(data.columns)
print(data["Class label"].value_counts())

# 4.数据预处理
# 由于数据是三分类, 所以需要把三分类数据转换成二分类数据
new_data = data[data["Class label"] != 1].copy()
print(new_data["Class label"].value_counts())
# 修改列名
new_data.rename(columns={'Class label': 'label'}, inplace=True)
# 5.特征选择和标签选择
x = new_data[['Alcohol', 'Hue']]
y = new_data['label']
print(type(y))
# 6.TODO 标签编码器  把s对象[2,3]转为ndarray[0,1]
le = LabelEncoder()
y = le.fit_transform(y)
print(y)
print(type(y))
# 7.训练集和测试集切分
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=24, stratify=y)
# 8.TODO 创建AdaBoost模型
model = AdaBoostClassifier(n_estimators=100, learning_rate=0.1, algorithm='SAMME')
# 9.模型训练
model.fit(x_train, y_train)
# 10.模型预测
y_pre = model.predict(x_test)
print(f"准确率:{accuracy_score(y_test, y_pre)}")
2.GBDT(梯度提升树)

①算法思想:每一个新学习器,都是拟合真实值与之前所有基学习器共同预测的结果之间的残差来提升的

(残差是指真实值-预测值)

模型:

②算法思想有分类和回归:

分类问题:损失函数变为 logloss,此时拟合的目标值就是该损失函数的负梯度值

回归问题:损失函数是平方损失,GBDT拟合的负梯度就是残差。

③实现步骤:
    1.初始化弱学习器,将目标值的均值作为初始的预测值
    2.迭代构建学习器,每一个新学习器拟合的是真实值与上一步模型(n-1个模型)预测结果之间的残         差
    3.达到指定的学习器个数停止
    4.预测时,将所有弱学习器的输出结果组合起来作为强学习器的输出

3.XGBoost

①算法思想:增强版GBDT,在基础上添加一个正则项
1. 模型:
2.损失函数:
        
3.正则项:
        
4.推导过程:

为了简化计算,对损失函数进行泰勒二阶展开,对损失函数求导,令导数为0,会得到w, 然后代入得到最终的打分函数;
通过打分函数来计算分裂增益,计算所有可能的分裂方案的增益,选择增益最大的方案来进行节点分裂。

5.实现步骤:
    1.计算分支节点上每个特征,每个切分点所对应的分裂方案的增益
    2.选择增益最大的方案进行节点分裂
    3.如果达到停止条件,则不再分裂,否则重复上述步骤继续进行分裂
    4.所有节点都不再继续分裂后,完整第k棵树的训练


网站公告

今日签到

点亮在社区的每一天
去签到