一. 引言
本篇博客首发于掘金 https://juejin.cn/post/7441027173430018067。
PS:转载自己的文章也算原创吧。
在机器学习领域,CatBoost 是一款强大的梯度提升框架,特别适合处理带有类别特征的数据。本篇博客以脱敏后的保险数据集为例,展示如何利用 CatBoost 完成分类和回归任务,并以可视化的方式解析特征重要性与结果。
我们将完成以下任务:
- 回归任务:预测保险索赔金额。
- 分类任务:判断保险案件是否需要调查。
- 可视化分析:利用散点图与分割线展示结果。
二. CatBoost 模型简介
CatBoost 是由俄罗斯搜索巨头 Yandex 于 2017 年开源的机器学习库,其名称来源于 “Category” 和 “Boosting” 的组合,旨在高效处理类别特征的梯度提升算法。与其他模型(如 XGBoost 和 LightGBM)相比,CatBoost 具有以下优势:
- 支持类别特征:无需对类别特征进行独热编码,直接处理类别数据,避免数据膨胀。
- 对缺失值的鲁棒性:无需特殊预处理即可直接处理缺失值。
- 防止过拟合:内置多种正则化手段,减少梯度偏差和预测偏移,提高模型的准确性和泛化能力。
- 对称树结构:采用对称决策树(Oblivious Trees),在每个层级使用相同的特征和分割点,提升训练和预测效率。
三. 实战项目环境与数据准备
本项目使用了脱敏后的保险数据集,包含以下特征:
- 类别特征:险种代码、出险原因、医疗责任类别等。
- 数值特征:基本保额、索赔金额等。
- 标签:是否需要调查(分类任务)。
所有数据均已脱敏,支持迁移至其他表格数据集。
因为不好分享,所以后续第七节补充了一个基于sklearn "California Housing"数据集的流程代码与说明。
四. 回归任务:预测保险索赔金额
数据预处理
在回归任务中,我们根据特征预测索赔金额。以下是数据清洗与预处理的关键步骤:
- 过滤无效数据:移除缺失或非法值的记录。
- 特征转换:将类别特征转为字符串类型。
- 分割数据集:按 80% 和 20% 的比例划分训练集与测试集。
4.1 模型训练与评估
我们使用 CatBoost 进行回归建模,模型参数包括:
- 学习率:0.02
- 深度:8
- 迭代次数:10,000(支持提前停止)
以下是模型的关键代码:
from catboost import CatBoostRegressor
# 初始化 CatBoost 回归模型
cat_regressor = CatBoostRegressor(
iterations=10000,
learning_rate=0.02,
depth=8,
eval_metric='RMSE',
early_stopping_rounds=1500,
random_seed=42
)
# 训练模型
cat_regressor.fit(
X_train, y_train,
cat_features=categorical_features_indices,
eval_set=(X_test, y_test),
verbose=100
)
4.2 特征重要性分析
特征重要性是衡量特征对模型预测贡献程度的指标,可以帮助我们更好地理解模型。
# 获取特征重要性
feature_importances = cat_regressor.get_feature_importance()
feature_names = X_train.columns
# 可视化特征重要性
import matplotlib.pyplot as plt
importance_df = pd.DataFrame({
'Feature': feature_names,
'Importance': feature_importances
}).sort_values(by='Importance', ascending=True)
plt.figure(figsize=(10, 6))
plt.barh(importance_df['Feature'], importance_df['Importance'], color='salmon')
plt.xlabel('特征重要性')
plt.ylabel('特征名称')
plt.title('CatBoost 特征重要性分析')
plt.show()
结果展示:
4.3 模型评估
我们可以均方误差 (MSE)