机器学习06 集成学习
集成学习Ensemble Learning是一种机器学习范式,通过构建并结合多个模型来完成学习任务,获得更好的泛化性能.
核心思想:多个模型的集体智慧比单个模型更准确(三个臭皮匠,顶个诸葛亮)
相较于其他基础学习方式如线性回归可能会构建一个多元多项式函数,而集成学习则会组合一堆1次函数,相较于多元多项式的超级个体,集成学习的弱者联盟在能力上相当,但不容易过拟合
可以看做是中西电影的区别吧,超英vs集体英雄,美队vs流浪地球(个人观点)
集成学习的两大核心思想:bagging和boosting
bagging:找一堆小弟来一起干,最后小弟投票选举,或者平均求值
算法思想:有放回的随机抽样产生不同的训练集,从而训练不同的学习器,通过平权投票、多数表决的方式决定预测结果
多个模型独立训练,投票决定结果(稳)
boosting:小弟轮着干,后面的小弟重点关注前一个小弟的不足
算法思想:每一个训练器重点关注前一个训练器不足的地方进行训练,每一个训练器重点关注前一个训练器不足的地方进行训练
模型逐步改进,加权组合结果(准)
bagging与boosting对比
bagging算法之一 (代表)随机森林算法
随机森林是基于 Bagging 思想实现的一种集成学习算法,采用决策树模型作为每一个弱学习器。
训练:
- 有放回的产生训练样本
- 随机挑选n个特征
- 训练模型
预测:平权投票,多数表决输出预测结果
数多了就是森林了,每棵树都不一样
注:随机抽样训练集是为了训练出来的树不一样,有放回的随机抽样是为了树有交集,减少差异,既有交集又有差异数据,更容易发挥投票表决效果
随机森林算法api
随机森林案例之泰坦尼克号案例(幸存者)上传资源平台说有了不让传,自己随便找点数据得了
机器学习数据库,不好用找deepseek再问问
Find Open Datasets and Machine Learning Projects | Kaggle
# 1.导包
# 导入pandas库用于数据处理
import pandas as pd
# 导入train_test_split用于分割数据集
from sklearn.model_selection import train_test_split
# 导入RandomForestClassifier用于创建随机森林分类器
from sklearn.ensemble import RandomForestClassifier
# 导入accuracy_score用于评估模型准确率
from sklearn.metrics import accuracy_score# 2.加载数据
# 从CSV文件中读取数据
data = pd.read_csv("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.特征工程
# 特性选择和标签选择
# 选择Pclass、Sex和Age作为特征,Survived作为标签
x = data2[["Pclass", "Sex", "Age"]]
y = data2["Survived"]
# TODO 注意Sex需要 通过热编码:把字符串转换成数字, drop_first作用是删除第一个多余特征
# 对类别特征进行独热编码,避免字符串特征对模型的影响
x = pd.get_dummies(x, drop_first=True)# 6.切割数据
# 将数据集分割为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=88)# TODO 7.创建随机森林模型
# 初始化随机森林分类器,设置基本的超参数
model = RandomForestClassifier(n_estimators=10, max_depth=10,bootstrap=True,class_weight="balanced")# 8.模型训练
# 使用训练数据拟合模型
model.fit(X_train, y_train)# 9.模型预测
# 使用拟合好的模型对测试数据进行预测
y_pre = model.predict(X_test)
# 打印预测结果和准确率
print(f"打印预测结果{y_pre}")
print(f"打印准确率{accuracy_score(y_test, y_pre)}")
bossting算法之三 Adaboost算法 GBDT算法 XGBoost算法
Adaptive Boosting(自适应提升)基于 Boosting思想实现的一种集成学习算法核心思想是通过逐步提高那些被前一步分类错误的样本的权重来训练一个强分类器。
注: 分类器越准确权重越大,样本难度越难权重越大
核心代码:实例化单决策树,实例化Adaboost由500颗树构成,数据和训练,打分部分一样
mytree= DecisionTreeClassifier(criterion='entropy', max depth=1, random state=0)
myada = AdaBoostClassifier(base estimator=mytree,n estimators=500, learning, rate=0.1, random state=0)
GBDT算法思想:
通过迭代拟合残差(即真实观测值与当前模型预测值的差异),逐步提升模型精度。每一轮新模型的目标是拟合前一轮的残差,最终将所有弱学习器的预测结果叠加,形成强学习器。
XGBoost算法思想:重点
实现步骤
- 1.计算分支节点上每个特征,每个切分点所对应的分裂方案的增益
- 2.选择增益最大的方案进行节点分裂
- 3.如果达到停止条件,则不再分裂,否则重复上述步骤继续进行分裂
- 4.所有节点都不再继续分裂后,完整第k棵树的训练