人工智能学习8(集成学习之xgboost)

news2024/11/30 14:28:54

编译工具:PyCharm

文章目录

      • 编译工具:PyCharm
  • 集成学习
  • XGBoost(Extreme Gradient Boosting)极端梯度提升树
    • 1.最优模型的构建方法
    • XGBoost目标函数
    • 案例1:泰坦尼克号
    • 案例2:对奥拓集团差评进行正确分类。
      • 数据准备:
      • 1.第一种基础的训练方式(不全,作对比)
      • 2.第二种优化后的训练方式
        • 2.1数据处理部分
        • 2.2模型训练及调优

集成学习

解决欠拟合问题:弱弱组合变强,boosting
解决过拟合问题:互相遏制变壮,Bagging

集成学习(Ensemble learning)通过构建并结合多个学习器来完成学习任务。
同质

同质(homogeneous)集成:集成中只包含同种类型的“个体学习器”相应的学习算法称为“基学习算法”(base learning algorithm)
个体学习器亦称“基学习器”(base learner)
异质(heterogeneous)集成:个体学习器由不同的学习算法生成不存在“基学习算法”
Bagging方法(并行)
boosting方法(串行)基本思想:基分类器层层叠加,每一层在训练的时候对前一层基分类器分错的样本给予更高的权重。

XGBoost(Extreme Gradient Boosting)极端梯度提升树

1.最优模型的构建方法

构建最优模型的一般方法:最小化训练数据的损失函数

(1.1)经验风险最小化,训练得到的模型复杂度哈皮,但是当训练数据集较小的时候,模型容易出现问题。
在这里插入图片描述

为进度模型复杂度,采用(2.1)结构风险最小化,它对训练数据以及未知数据都有较好的预测。
J(f)是模型的复杂度
在这里插入图片描述

应用:
决策树的生成:经验风险最小化
剪枝:结构风险最小化
XGBoost的决策树生成:结构风险最小化

XGBoost目标函数

正则化损失函数:
在这里插入图片描述

CART树
在这里插入图片描述

树的复杂度
在这里插入图片描述

目标函数:
目标函数推导过程
在这里插入图片描述

分裂节点计算
分开前-分开后,结果>0,可以进行分裂,<0不进行
γ:减去一个加入新叶子节点引入的复杂度代价。
在这里插入图片描述

案例1:泰坦尼克号

数据集:https://hbiostat.org/data/repo/titanic.txt

# xgboost
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split        # 进行数据集划分
from sklearn.feature_extraction import DictVectorizer
import matplotlib.pyplot as plt
from xgboost import XGBClassifier

# 读取数据
# titan = pd.read_csv("https://hbiostat.org/data/repo/titanic.txt")
titan = pd.read_csv("./data/titanic.csv")
# print(titan.describe())

# 获取样本和目标值
# 这里取pclass社会等级、age年龄、sex性别作为特征值
# 取survived存活为目标值
x = titan[["pclass","age","sex"]]
y = titan["survived"]

# 缺失值处理:对age为空的用平均值替换
x['age'].fillna(value=titan["age"].mean(),inplace=True)
# print(x.head())

# 数据集划分
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=22,test_size=0.2)
# 特征抽取(字典特征提取)
x_train = x_train.to_dict(orient="records")
x_test = x_test.to_dict(orient="records")
tranfer = DictVectorizer()
x_train = tranfer.fit_transform(x_train)
x_test = tranfer.fit_transform(x_test)

# xgboost 初步模型训练
# 实例化
xg = XGBClassifier()
# 训练
xg.fit(x_train,y_train)
# 初步模型评估
print("xg初步模型训练评估: ",xg.score(x_test, y_test))

# xgboost 调优模型训练
depth_range = range(5)
score = []
for i in depth_range:
    xg=XGBClassifier(eta=1,gamma=0,max_depth=i)
    xg.fit(x_train,y_train)
    s = xg.score(x_test,y_test)
    print("第",i+1,"次训练评估: ",s)
    score.append(s)
# 对调优结果可视化
# plt.plot(depth_range,score)
# plt.show()

在这里插入图片描述

案例2:对奥拓集团差评进行正确分类。

数据准备:

数据集:https://download.csdn.net/download/weixin_42320758/15728128?utm_source=bbsseo

使用pycharm下载包的时候,容易下载不成功,建议使用清华大学提供的网站进行下载
-i https://pypi.tuna.tsinghua.edu.cn/simple 包名称
在命令行进行下载也可以使用:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple
在这里插入图片描述
在这里插入图片描述

1.第一种基础的训练方式(不全,作对比)

数据分割使用:train_test_split
模型训练选择:RF进行模型训练


import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 欠采样方法从大量数据中抽取数据
from imblearn.under_sampling import RandomUnderSampler
# 将标签转化为数字
from sklearn.preprocessing import LabelEncoder
# 数据分割
from sklearn.model_selection import train_test_split
# RF模型训练
from sklearn.ensemble import RandomForestClassifier
# log_loss模型评估
from sklearn.metrics import log_loss
# one-hot处理数据
from sklearn.preprocessing import OneHotEncoder

# 获取数据
data = pd.read_csv("./data/otto_train.csv")
# 数据标签可视化,查看数据的分布情况
sns.countplot(data.target)
plt.show()

x = data.drop(["id","target"], axis=1)
y = data["target"]
# 数据已结果脱敏处理(保护一些隐私等信息的安全)
# 截取部分数据进行训练(防止数据量过大)
# 使用欠采样的方法获取数据,注意:不能直接按照前n行的方式进行截取
rus = RandomUnderSampler(random_state=0)
x_resampled,y_resampled = rus.fit_resample(x,y)
sns.countplot(y_resampled)
plt.show()

# 将标签转数字
le = LabelEncoder()
y_resampled = le.fit_transform(y_resampled)
print(y_resampled)


# 数据分割
x_train,x_test,y_train,y_test = train_test_split(x_resampled,y_resampled,test_size=0.2)
print(x_train.shape,y_train.shape)
print(x_test.shape,y_test.shape)

# 模型训练1
# 基于RF模型训练
rf = RandomForestClassifier(oob_score=True)
rf.fit(x_train,y_train)
y_pre = rf.predict(x_test)
print("基于RF模型训练的评估结果score:",rf.score(x_test, y_test))
# log_loss模型评估
# log_loss(y_test,y_pre,eps=1e-15,normalize=True)       # 这样子写会报错,log_loss中要求输出用one-hot表示
# one-hot处理
one_hot=OneHotEncoder(sparse=False)
y_test1=one_hot.fit_transform(y_test.reshape(-1,1))
y_pre1 = one_hot.fit_transform(y_pre.reshape(-1,1))
print("log_loss评估结果:",log_loss(y_test1, y_pre1, eps=1e-15, normalize=True))


原始数据标签可视化,,查看数据的分布情况
在这里插入图片描述
数据量过大,用欠采样的方法抽取部分数据后,标签可视化:
在这里插入图片描述
输出结果:
在这里插入图片描述

2.第二种优化后的训练方式

数据分割处理:StratifiedShuffleSplit

2.1数据处理部分
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 欠采样方法从大量数据中抽取数据
from imblearn.under_sampling import RandomUnderSampler
# 将标签转化为数字
from sklearn.preprocessing import LabelEncoder
# 数据分割
from sklearn.model_selection import StratifiedShuffleSplit
# 数据标准化
from sklearn.preprocessing import StandardScaler
# 数据pca降维
from sklearn.decomposition import PCA


# 获取数据
data = pd.read_csv("./data/otto_train.csv")
# 数据标签可视化,查看数据的分布情况
# sns.countplot(data.target)
# plt.show()

x = data.drop(["id","target"], axis=1)
y = data["target"]
# 数据已结果脱敏处理(保护一些隐私等信息的安全)
# 截取部分数据进行训练(防止数据量过大)
# 使用欠采样的方法获取数据,注意:不能直接按照前n行的方式进行截取
rus = RandomUnderSampler(random_state=0)
x_resampled,y_resampled = rus.fit_resample(x,y)
# sns.countplot(y_resampled)
# plt.show()

# 将标签转数字
le = LabelEncoder()
y_resampled = le.fit_transform(y_resampled)
print("标签转为数值后: ",y_resampled)


# 数据分割
x_train = []
x_val = []
y_train = []
y_val=[]
sss = StratifiedShuffleSplit(n_splits=1,test_size=0.2,random_state=0)
for train_index,test_index in sss.split(x_resampled.values,y_resampled):
    # print(len(train_index))
    # print(len(test_index))
    x_train = x_resampled.values[train_index]   # 训练集的数据
    x_val = x_resampled.values[test_index]  # 测试集的数据
    y_train = y_resampled[train_index]      # 训练集的标签
    y_val = y_resampled[test_index]     # 测试集的标签

print("训练集和测试集的大小:",x_train.shape,x_val.shape)
# 分割后的数据可视化
# sns.countplot(y_val)
# plt.show()


# 数据标准化
scaler = StandardScaler()
scaler.fit(x_train)
x_train_scaled = scaler.transform(x_train)
x_val_scaled = scaler.transform(x_val)


# 数据pca降维
pca = PCA(n_components=0.9)
x_train_pca = pca.fit_transform(x_train_scaled)
x_val_pca = pca.transform(x_val_scaled)
print("pca降维后: ",x_train_pca.shape,x_val_pca.shape)
# 可视化数据降维信息变化程度
plt.plot(np.cumsum(pca.explained_variance_ratio_))
# plt.xlabel("元素数量")
# plt.ylabel("可表达信息的百分占比")
plt.show()

在这里插入图片描述

在这里插入图片描述

2.2模型训练及调优

在这里插入图片描述

这一段运行起来需要些时间

# 模型训练
# 基本模型训练
xgb = XGBClassifier()
xgb.fit(x_train_pca,y_train)
# 输出预测值(一定是输出带有百分比的预测值)
y_pre_proba = xgb.predict_proba(x_val_pca)
# log-loss评估
print("基础训练的log_loss评估值: ",log_loss(y_val, y_pre_proba, eps=1e-15, normalize=True))

# 模型调优
scores_ne = []
n_estimators = [100,200,300,400,500,550,600,700]
for nes in n_estimators:
    print("n_estimators: ",nes)
    xgb=XGBClassifier(max_depth=3,learning_rate=0.1,n_estimators=nes,objective="multi:softprob",
                      n_jobs=-1,nthread=4,min_child_weight=1,subsample=1,colsample_bytree=1,seed=42)
    xgb.fit(x_train_pca,y_train)
    y_pre = xgb.predict_proba(x_val_pca)
    score = log_loss(y_val,y_pre)
    scores_ne.append(score)
    print("每次测试的log_loss评估值为:{}".format(score))
# 图形化logloss
plt.plot(n_estimators,scores_ne,"o-")
plt.xlabel("n_estimators")
plt.ylabel("log_loss")
plt.show()
print("最优的e_estimators的值是: {}".format(n_estimators[np.argmin(scores_ne)]))

# 最优max_depth的调试
scores_md = []
max_depths = [1,3,5,6,9]
for md in max_depths:
    print("max_depth: ",md)
    xgb=XGBClassifier(max_depth=md,learning_rate=0.1,n_estimators=n_estimators[np.argmin(scores_ne)],objective="multi:softprob",
                      n_jobs=-1,nthread=4,min_child_weight=1,subsample=1,colsample_bytree=1,seed=42)
    xgb.fit(x_train_pca,y_train)
    y_pre = xgb.predict_proba(x_val_pca)
    score = log_loss(y_val,y_pre)
    scores_md.append(score)
    print("每次测试的log_loss评估值为:{}".format(score))
# 图形化logloss
plt.plot(max_depths,scores_md,"o-")
plt.xlabel("max_depths")
plt.ylabel("log_loss")
plt.show()
print("最优的max_depth的值是: {}".format(max_depths[np.argmin(scores_md)]))

# (省略)调优min_child_weights,subsamples,consample_bytrees,etas
# 调优后这几个参数为min_child_weight=3,subsample=0.7,consample_bytree=0.7
# 找到最优参数后
xgb = XGBClassifier(max_depth=3,learning_rate=0.1,n_estimators=600,objective="multi:softprob",nthread=4,min_child_weight=3,subsample=0.7,colsample_bytree=0.7,seed=42)
xgb.fit(x_train_pca,y_train)
# y_pre = xgb.predict_proba(x_val_scaled)
y_pre = xgb.predict_proba(x_val_pca)
print("测试数据的log_loss值为: {}".format(log_loss(y_val,y_pre,eps=1e-15,normalize=True)))

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

由于有好几个参数min_child_weights,subsamples,consample_bytrees没有跑,没找出最优的值,所以最后的log_loss的值还是有些大的。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1290588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机图像保存到电脑内存的技术背景代码分析注册SDK回调函数BufferEvent声明可以存储相机图像的内存序列和名称在图像回调函数中将图像保存在内存序…

CSS新手入门笔记整理:CSS盒模型

在“CSS盒子模型”理论中&#xff0c;页面中的所有元素都可以看成一个盒子&#xff0c;并且占据着一定的页面空间。 一个页面由很多这样的盒子组成&#xff0c;这些盒子之间会互相影响&#xff0c;因此掌握盒子模型需要从两个方面来理解&#xff1a; 一是理解单独一个盒子的内…

持续集成交付CICD:Sonarqube自动更新项目质量配置

目录 一、实验 1.Sonarqube手动自定义质量规则并指定项目 2.Sonarqube自动更新项目质量配置 一、实验 1.Sonarqube手动自定义质量规则并指定项目 &#xff08;1&#xff09;自定义质量规则 ①新配置 ②更多激活规则③根据需求激活相应规则④已新增配置 ⑤ 查看 &#x…

自适应局部降噪滤波器的python实现-------冈萨雷斯数字图像处理

自适应局部降噪滤波器 自适应局部降噪滤波器是一种信号处理技术&#xff0c;用于降低图像或信号中的噪声水平&#xff0c;同时保留图像或信号的细节。其原理基于局部区域内信号的统计特性和噪声的特征&#xff0c;通过动态调整滤波器的参数来适应不同区域的信号和噪声属性。 自…

多平台展示预约的服装小程序效果如何

线下实体服装店非常多&#xff0c;主要以同城生意为主&#xff0c;但随着电商经济增长&#xff0c;传统线下自然流量变少&#xff0c;商家们会选择线上入驻平台开店获得更多线上用户&#xff0c;包括自建私域小程序等。 而除了直接卖货外&#xff0c;线上展示预约在服装行业也…

html通过CDN引入使用Vue和ElementUI

html通过CDN引入使用Vue和ElementUI 近期遇到个需求&#xff0c;就是需要在.net MVC的项目中&#xff0c;对已有的项目的首页进行优化&#xff0c;也就是写原生html和js。但是咱是一个写前端的&#xff0c;写html还可以&#xff0c;.net的话&#xff0c;开发也不方便&#xff0…

【开源】基于JAVA的APK检测管理系统

项目编号&#xff1a; S 038 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S038&#xff0c;文末获取源码。} 项目编号&#xff1a;S038&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 开放平台模块2.3 软…

Apache Flink(七):Apache Flink快速入门 - DataStream BATCH模式

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 下面使用Java代码使用DataStream…

784. 字母大小写全排列 dfs + 回溯算法 + 图解 + 笔记

784. 字母大小写全排列 - 力扣&#xff08;LeetCode&#xff09; 给定一个字符串 s &#xff0c;通过将字符串 s 中的每个字母转变大小写&#xff0c;我们可以获得一个新的字符串。 返回 所有可能得到的字符串集合 。以 任意顺序 返回输出 示例 1&#xff1a; 输入&#xf…

Meta开源最大多模态视频数据集—Ego-Exo4D

社交、科技巨头Meta联合15所大学的研究机构&#xff0c;经过两年多的努力发布了首个多模态视频训练数据集和基础套件Ego-Exo4D&#xff0c;用于训练和研究AI大模型。 据悉&#xff0c;该数据集收集了来自13个城市839名参与者的视频,总时长超过1400小时,包含舞蹈、足球、篮球、…

TCP实现一对一聊天

一&#xff0c;创建类 二&#xff0c;类 1.ChatSocketServer类 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Sca…

Windows 下 PyTorch 入门深度学习环境安装与配置 GPU 版

1.确定自己的硬件信息&#xff0c;确定电脑有英伟达 (NVIDIA)显卡 在任务栏上右键打开任务管理器 2.下载安装 Anaconda &#xff08;建议安装迅雷下载&#xff0c;同时浏览器添加扩展 “迅雷Chrome支持”&#xff09; https://www.anaconda.com/ https://repo.anaconda.com/arc…

挑选数据可视化工具:图表类型、交互功能与数据安全

作为一名数据分析师&#xff0c;我经常需要使用各种数据可视化工具来将数据以直观、清晰的方式呈现出来&#xff0c;以便更好地理解和分析。在市面上的众多可视化工具中&#xff0c;我根据实际需求和项目特点进行选择。本文将从以下几个角度对市面上的数据可视化工具进行对比&a…

bert其他内容个人记录

Pre-training a seq2seq model BERT只是一个预训练Encoder&#xff0c;有没有办法预训练Seq2Seq模型的Decoder&#xff1f; 在一个transformer的模型中&#xff0c;将输入的序列损坏&#xff0c;然后Decoder输出句子被破坏前的结果&#xff0c;训练这个模型实际上是预训练一个…

2023_Spark_实验二十七:Linux中Crontab(定时任务)命令详解及使用教程

Crontab介绍&#xff1a; Linux crontab是用来crontab命令常见于Unix和类Unix的操作系统之中&#xff0c;用于设置周期性被执行的指令。该命令从标准输入设备读取指令&#xff0c;并将其存放于“crontab”文件中&#xff0c;以供之后读取和执行。该词来源于希腊语 chronos(χρ…

MySQL生僻字修改编码utf8mb4

1、查看你编码 SHOW VARIABLES WHERE Variable_name LIKE character_set_% OR Variable_name LIKE collation%;&#xff08;如果不是下图则继续&#xff09; 2、修改默认参数 /etc/my.cnf [mysqld] datadir/usr/local/mysql/data basedir/usr/local/mysql socket/usr/local/my…

Python内置类属性__str__的使用教程

概要 在Python中&#xff0c;每个类都有一些内置的特殊属性和方法&#xff0c;用于实现一些特殊的功能。其中一个特殊属性是__str__&#xff0c;它允许我们定义一个类的对象在打印时的输出格式。在本文中&#xff0c;我们将详细介绍__str__属性的使用教程&#xff0c;帮助读者…

MySQL:update set的坑

目录 一、问题描述 二、为何会出现这样的问题&#xff1f; 三、正确的方案 一、问题描述 我在修改mysql数据表时&#xff0c;看到下面的现象。 我表中原始数据如下&#xff1a; 执行了下面的修改&#xff0c;显示执行成功。 update user_function_record_entity set open_…

华为数通---配置ARP安全综合功能案例

简介 ARP&#xff08;Address Resolution Protocol&#xff09;安全是针对ARP攻击的一种安全特性&#xff0c;它通过一系列对ARP表项学习和ARP报文处理的限制、检查等措施来保证网络设备的安全性。ARP安全特性不仅能够防范针对ARP协议的攻击&#xff0c;还可以防范网段扫描攻击…

微信小程序 长按录音+录制视频

<view class"bigCircle" bindtouchstart"start" bindtouchend"stop"><view class"smallCircle {{startVedio?onVedio:}}"><text>{{startVedio?正在录音:长按录音}}</text></view> </view> <…