CatBoost道路风险预测学习笔记
下面所学知识经验均来自对kaggle竞赛Predicting Road Accident Riskz中的公开Notebook代码的模仿过程
数据观察(主要用pandas库)
读取数据
- 读取文件——pd.read_csv(“path”)
pd.read_csv
数据分析
注意kaggle比赛中,数据已经备好了,从赛者可专注于模型的建立和学习
一下较为常用的用粗体表示
- df.columns 查看列
df.columns - 数据DataFrame的信息——df.info(),
df.info()输出列名、以及对于列名的数据大小、空值情况、以及对应的数据类型 - df.shape查看数据的形状
df.shape - 数据DataFrame的前五行——df.head(),
df.head()在nb中会自动展示,或者要对比可以print,or display
EDA
探索性数据分析(Exploratory Data Analysis,简称EDA)是数据科学中的关键步骤,旨在熟悉数据集、揭示变量间的关系并指导后续处理。通过读取数据、数据汇总、总览、缺失值和异常值分析,以及特征分析,我们可以深入了解数据的结构和质量。
目标分布
plt.figure()的作用创建画布sns.histplot()的参数和功能是什么?bin箱子的数目,kde是否加一条拟合分布的曲线
关联热力图
筛选出数值列
df.select_dtypes(include=["int64","float64"])df.corr()用来计算各列之间的相关系数的(可以自定义方法用method参数来指定)。这用来做作为sns.heatmap()的输入参数极为方便
参考民间教程
sns.heatmap()
CatBoost Model
介绍(擅长处理类别特征)
CatBoost的全称是Categorical Boosting,它是一种由俄罗斯搜索巨头Yandex开发的梯度提升算法库,特别擅长处理类别型特征。
CatBoost的名称来源于其核心功能,即处理类别型特征(Categorical Features)和梯度提升(Gradient Boosting)。与其他梯度提升算法如XGBoost和LightGBM相比,CatBoost在处理类别型特征方面具有显著优势。
CatBoost的特点
- 类别型特征处理:CatBoost使用独特的编码方法来处理类别型特征,降低过拟合风险。(无需对这些特征(分类特征)进行One-Hot编码)
- 克服梯度偏差:CatBoost采用排序提升的概念,防止目标泄漏和过度拟合。
- 高效实现:支持GPU加速和多GPU训练,提升计算效率。
- 鲁棒性:减少对大量超参数调整的需求,降低过度拟合的机会。
CatBoost的应用
CatBoost在多个领域中表现出色,包括金融风控、推荐系统和生物医学等。例如,在信用卡欺诈检测、商品推荐和基因表达数据分析中,CatBoost能够有效处理类别型特征和缺失值,构建精准的预测模型。
总之,CatBoost作为一种专为类别型特征优化的梯度提升算法,凭借其独特的处理策略和高效的实现,迅速成为业界广受欢迎的GBDT框架。
详细介绍解释参考数据STUDIO, 2022、CatBoost深度解析、官方 CatBoost
分类特征(前面对数值类型的特征进行了关联性的分析)
dtype一般是bool或者object
作者做了一个操作,将bool转化为str,也变成了object对象。关于选择bool值时,
df.select_dtypes(include=)进行优化关于具体转化格式的函数方法,作者使用的是
df.astype()
可参考转化类型
关于from sklearn.model_selection import train_test_split, cross_val_score
train_test_split这个函数十分常用在从训练集分割出验证集时。
模型构建
使用的是catboost库中的,CatBoostRegressor模型,记得安装
1 | conda activate your_env |
模型参数选择
- iterations 迭代次数(定义了训练过程中提升树的数量)
- learning_rate 学习率(控制每一步梯度提升时模型权重更新的幅度,而迭代)
1 | params = { |
- 损失函数(二元分类Logloss;回归RMSE(均方根误差) or MAE(平均绝对误差;多分类采用Multiclass损失;不平衡数据集(QueryCrossentropy)
- GPU加速,加快训练速度
model.fit()模型训练,输入X,以及对应的y标签即可。
模型评估
1 | # Make predictions on validation set |
这段代码实现了交叉验证(Cross-validation)过程,用于评估CatBoost模型的性能。具体解释如下:
- 第一行代码:
cv_scores = cross_val_score(Catboost_model, X, y, cv=5, scoring='neg_mean_squared_error')
- 使用
cross_val_score函数执行5折交叉验证 - 参数
Catboost_model是已经定义好的CatBoost模型 X是特征数据,y是目标变量cv=5表示将数据集分成5个部分进行交叉验证scoring='neg_mean_squared_error'表示使用负均方误差作为评分指标(负值是因为scikit-learn中大多数评分函数追求最大化)
- 第二行代码:
cv_rmse = np.sqrt(-cv_scores)
- 将负均方误差转换为均方根误差(RMSE)
- 首先取负值(因为原始得分是负数),然后开平方
- 得到的
cv_rmse是一个包含5个元素的数组,每个元素对应一折验证的RMSE(均方根误差)
- 第三行代码:
print(f"Cross-validation RMSE: {cv_rmse.mean():.4f} (+/- {cv_rmse.std() * 2:.4f})")
- 输出交叉验证的平均RMSE和标准差
.mean()计算5折RMSE的平均值.std() * 2计算2倍标准差,表示模型性能的置信区间范围:.4f表示保留4位小数 这段代码的主要目的是通过交叉验证来评估模型的泛化能力,避免过拟合问题,并提供模型性能的可靠估计。mean_squared_error()计算两列的均方根误差cross_val_score()
重要性分析
1 | # Feature Importance |
这里直接用catboost_model.get_feature_importance()方法。
sort_values()函数,他是一个排序函数
参考民间教程
1 | # Detailed feature importance plot |
sns.barplot()函数功能,支持df的输入,指定对于xy的列名即可
可视化结果
1 | # Plot actual vs predicted values |
提交结果
1 | # Prepare test data (excluding the id column for prediction) |