简单的XGBoost案例

一、前言

        今天我们来一起学习一个新的算法模型,XGboost算法

     1、XGBoost的特性

        XGBoost(Extreme Gradient Boosting)是一个高效的开源机器学习库,广泛应用于结构化数据的分类和回归问题。它基于梯度提升算法,利用决策树的集成方法来提高模型的性能和准确性。XGBoost 提供了以下几个主要特性:

        高效性:通过并行计算和缓存优化,XGBoost 在训练速度上显著快于传统的梯度提升算法。
        准确性:XGBoost 采用正则化手段来防止过拟合,并且支持自定义损失函数,使得模型在多种场景下表现出色。
        灵活性:支持多种数据类型和目标函数,适用于回归、分类、排序等多种任务。
        可解释性:可以生成特征重要性图,帮助分析模型的决策依据。

     2、XGBoost的使用场景

        金融欺诈检测: 通过分析交易数据,XGBoost 可以帮助识别潜在的欺诈行为,例如信用卡欺诈、保险欺诈等。

        客户流失预测: 在电信、银行等行业,通过客户的行为特征,预测哪些客户可能流失,从而制定相应的留存策略。

        异常检测:用于检测数据中的异常点,如信用卡欺诈、故障检测等。

        销售预测: 根据历史销售数据和市场特征,预测未来的销售趋势,帮助企业制定生产和营销策略。

        医疗健康: 通过患者的医疗记录和特征,预测疾病的发生风险,帮助医生做出更准确的诊断。

        图像分类与目标检测: 虽然 XGBoost 主要用于结构化数据,但在某些情况下,可以与图像特征提取结合使用,进行分类任务。

        推荐系统: 利用用户行为数据,构建推荐模型,提升用户的个性化体验。

      3、本文的案例分析

        本文将从异常检测入手,带大家通过一个简单的案例来了解XGBoost算法,我们创建一千个正常数据和五十个异常数据,通过训练来找出异常的数据。

二、具体代码

        本文的训练流程依旧是:创建数据集—>划分数据集—>创建模型—>训练模型—>预测和评估模型。

        先导入需要用到的库: 

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
import xgboost as xgb
from sklearn.metrics import classification_report
import matplotlib.pyplot as plt

      1、创建数据集:

np.random.seed(42)
# 正常数据
normal_data = np.random.normal(loc=0, scale=1, size=(1000, 2))
normal_labels = np.zeros(1000)

# 异常数据
anomaly_data = np.random.uniform(low=-6, high=6, size=(50, 2))
anomaly_labels = np.ones(50)

# 合并数据
X = np.vstack((normal_data, anomaly_data))
y = np.concatenate((normal_labels, anomaly_labels))

# 创建DataFrame
data = pd.DataFrame(X, columns=['Feature1', 'Feature2'])
data['Label'] = y

      np.random.seed(42): 通过设置随机种子,可以确保每次运行代码时生成的随机数相同,便于调试和复现结果。

        normal_data = np.random.normal(loc=0, scale=1, size=(1000, 2)):从正态分布中生成1000个样本。loc=0:均值为0。 scale=1:标准差为1。 size=(1000, 2):生成1000行,2列的数据,即每个样本有两个特征。

        normal_labels = np.zeros(1000):使用np.zeros(1000)生成1000个0,表示这些样本为正常数据。

        anomaly_data = np.random.uniform(low=-6, high=6, size=(50, 2)):从均匀分布中生成50个样本,范围更广。low=-6和high=6:生成的样本值范围在-6到6之间。 size=(50, 2):生成50行,2列的数据。

        anomaly_labels = np.ones(50):使用np.ones(50)生成50个1,表示这些样本为异常数据。

        np.vstack((normal_data, anomaly_data)):将正常数据和异常数据按垂直方向合并,形成一个新的数组X,包含1050个样本。

        合并标签:np.concatenate((normal_labels, anomaly_labels)):将正常标签和异常标签合并为一个新的标签数组y。

      2、数据集划分

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data[['Feature1', 'Feature2']], data['Label'], test_size=0.2,
                                                    random_state=42)

     3、 创建模型

# 3. 创建DMatrix
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)

# 4. 设置参数
params = {
    'objective': 'binary:logistic',  # 二分类任务
    'max_depth': 3,
    'eta': 0.1,
    'eval_metric': 'logloss'
}

        objective: 定义了学习任务的目标类型。'binary:logistic':表示这是一个二分类任务,模型输出的是每个样本属于正类的概率。

        max_depth: 指定树的最大深度。 3:树的最大深度设置为3,限制了模型的复杂度,有助于防止过拟合。

        eta: 学习率,也称为步长。 0.1:学习率设置为0.1,表示每次迭代更新时会缩小权重的更新量。较小的学习率通常能提升模型的性能,但训练时间会变长。

         eval_metric: 评估指标。 'logloss':用于评估模型的损失,通常在二分类问题中使用。log loss越小,模型的表现越好。

      4、模型训练

# 训练模型
num_boost_round = 100
model = xgb.train(params, dtrain, num_boost_round)

        num_boost_round: 这是XGBoost模型训练的迭代次数,也称为 boosting rounds。 在这个例子中,设置为 100,表示模型将进行100次迭代,每次迭代都会根据之前的模型更新学习到的权重。

        xgb.train(): 这是用于训练XGBoost模型的函数。 第一个参数是 params,包含了模型的设置(如目标函数、最大深度等)。 第二个参数是 dtrain,这是之前创建的训练数据DMatrix,包含特征和标签。 第三个参数是 num_boost_round,表示模型训练的轮数。

      5、模型的评估与预测

# 进行预测
y_pred_probs = model.predict(dtest)
y_pred = (y_pred_probs > 0.5).astype(int)  # 使用0.5作为阈值进行分类

# 评估模型
print(classification_report(y_test, y_pred))

           

        这是模型评估结果的分类报告,包含了每个类别的精确度(precision)、召回率(recall)、F1分数和支持度(support)。下面逐一解释这些指标。

        1. 精确度(Precision) 定义: 正确预测为正类的样本占所有预测为正类的样本的比例。 0.0 类别: 0.98,表示被预测为正常的样本中,有98%是正确的。 1.0 类别: 1.00,表示被预测为异常的样本中,100%是正确的。

        2. 召回率(Recall) 定义: 正确预测为正类的样本占所有实际为正类的样本的比例。 0.0 类别: 1.00,表示所有实际正常的样本都被正确识别。 1.0 类别: 0.77,表示77%的实际异常样本被正确识别。

        3. F1分数(F1-score) 定义: 精确度和召回率的调和平均,综合了这两个指标的性能。 0.0 类别: 0.99,表示对正常样本的检测性能很高。 1.0 类别: 0.87,表示对异常样本的检测性能较好,但相较于正常样本稍低。

        4. 支持度(Support) 定义: 每个类别在测试集中的真实样本数量。 0.0 类别: 197,表示正常样本数量。 1.0 类别: 13,表示异常样本数量。

         5. 整体准确率(Accuracy) 0.99,表示模型的整体预测准确率为99%,即210个样本中有99%被正确分类。

        6. 宏平均(Macro Average) 这些指标的简单平均,适用于类别不平衡的情况。 精确度: 0.99,召回率: 0.88,F1分数: 0.93,表示整体性能良好,但召回率相对较低。

        7. 加权平均(Weighted Average) 考虑了每个类别的样本数量的加权平均。 精确度: 0.99,召回率: 0.99,F1分数: 0.98,表明模型在整体性能上表现优异。       

        到这里,我们的代码就正式结束了,看评估效果很不错。

三、结语

        最后,我们将预测的结果进行可视化,还记得我们20%的测试集嘛,我们将测试数据和真实数据都显示出来,看看效果如何。

# 可视化结果
plt.figure(figsize=(10, 6))

# 真实数据点
plt.scatter(data['Feature1'], data['Feature2'], c=data['Label'], cmap='coolwarm', alpha=0.5, label='真实数据')

# 预测异常数据
predicted_anomalies = data.iloc[X_test.index][y_pred == 1]
plt.scatter(predicted_anomalies['Feature1'], predicted_anomalies['Feature2'], edgecolor='red', facecolor='none', s=100,
            label='预测异常数据')

plt.title('Anomaly Detection')
plt.xlabel('Feature1')
plt.ylabel('Feature2')
plt.axhline(0, color='gray', linewidth=0.5, linestyle='--')
plt.axvline(0, color='gray', linewidth=0.5, linestyle='--')
plt.legend()
plt.show()

        可以看到我们用红色的小球代表异常值,红色的外环岱庙预测的异常值,正好是10个测试值,准确率还是蛮好的。

         最后,大家如果觉得对您有帮助的话麻烦点点赞,如果有错误或者纰漏希望您能在评论区指出,帮助大家能更好地理解和掌握相关知识!

XGBoost是一个强大的梯度提升库,特别是在处理分类和回归问题上非常有效。它提供了许多经典的案例来展示其性能。以下是一些使用XGBoost的例子和用途: 1. **点击率预测**:在推荐系统中,可以利用历史用户行为数据训练模型预测某个用户对特定商品的点击概率,XGBoost可以处理离散和连续特征。 2. **信用评分**:金融机构会用XGBoost来预测贷款申请者的信用风险,基于客户的个人信息、交易历史等数据。 3. **疾病预测**:医疗领域中,可以使用XGBoost结合患者的各种生理指标、病史等数据预测疾病风险。 4. **市场 basket analysis**:用于购物篮分析中的关联规则学习,如发现购买某种商品后可能倾向于购买哪些其他商品。 5. **图像和文本分类**:尽管不是原生支持,但可以将XGBoost与其他深度学习技术结合,如使用XGBoost做特征提取后输入到神经网络中。 要找到XGBoost的具体案例,你可以: - 访问XGBoost的官方文档:https://xgboost.readthedocs.io/ ,里面有详细的教程和示例代码。 - 在GitHub上搜索"XGBoost tutorial"或"XGBoost code examples",能找到很多开源项目和社区贡献的实例。 - 阅读 Kaggle 或 DataCamp 上的数据科学竞赛和课程,这些平台经常包含使用XGBoost解决实际问题的案例。 - 参考相关的数据科学博客或数据分析书籍,它们通常会提供实战应用案例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值