0.前言
这个项目磨磨蹭蹭地搞了一个星期了,赶紧搞完放五一咯~
数据特征处理部分请移步至:
【机器学习】金融风控贷款违约预测--数据分析处理-CSDN博客
1.Catboost模型
在本项目中,选择Catboost模型进行预测分类,因为其效果优于XGBoost和LightGBM。
CatBoost是一种基于梯度提升决策树(Gradient Boosting Decision Trees,GBDT),当然,另外的两个模型也属于GBDT,Catboost主要解决的痛点是高效合理地处理类别型特征。除此之外,CatBoost还使用了基于贪心策略的特征交叉方法、避免预测偏移的 Ordered Boosting 方法,以及使用对称二叉树作为基模型。
1.1 高校合理处理类别型特征
对于类别特征,如果类别数目不多,可以使用one-hot编码。否则,很容易造成维度爆炸。比如,如果某一特征是样本所在的城市,全国城市高达几百个,采用one-hot编码就会使得特征变得复杂。Catboost 不提倡使用one-hot编码,它设计了一种基于label统计的方法可以将类别特征转化为数值特征。这里建议去b站看看解释,我这里三言两语的说不清楚。
在CatBoost中,可以通过指定cat_features
参数来将某些特征视为分类特征,另外,类别特征只接受整数型或字符串型。(问就是在这个坑里一蹶不振)
1.2 基于贪心策略的特征交叉方法
第一次分裂:在生成决策树的第一次分裂时,CatBoost不使用任何交叉特征,只根据单个原始特征来进行分裂。
后续分裂:在生成决策树的后续分裂中,CatBoost会使用生成当前决策树所用到的全部原始特征以及之前分裂生成的全部交叉特征。这些特征将与数据集中的全部类别特征进行交叉,以获得更多的特征组合,从而更好地拟合数据集。
1.3 Ordered Boosting 方法
CatBoost先将样本随机打乱,然后每个样本只使用排序在它前面的样本来训练模型。用这样的模型来估计这个样本预测结果的一阶和二阶梯度。然后用这些梯度构建一棵tree的结构,最终tree的每个叶子节点的取值,是使用全体样本进行计算的。
1.4 对称二叉树
XGBoost和LightGBM采用的基模型是普通的二叉树,但是CatBoost采用的是对称的二叉树。这种对称树结构上的约束有一定的正则作用。更为重要的是,它可以让CatBoost模型的推断过程极快。
2.Catboost模型使用
2.1 数据集划分
直接使用sklearn的包进行数据集划分,训练集:验证集 = 8:2
from sklearn.model_selection import train_test_split
feature_list = [col for col in train_data.columns if col != "isDefault"]
for fea in feature_list:
train_data[fea] = train_data[fea].astype('int64')
test_data[fea] = test_data[fea].astype('int64')
X_train, X_validation, y_train, y_validation = train_test_split(train_data.loc[:, feature_list], train_data.loc[:, 'isDefault'], test_size=0.2 , random_state=2000)
2.2 模型建立
使用catboost包建立Catboost模型,超参数介绍:
iteration:树的数量,即迭代次数
cat_features:将哪些特征视为分类特征
eval_metric:评估指标,用于评估模型在训练过程中的性能
logging_level:日志记录级别,模型在训练过程中输出的日志信息的详细程度。在这里,设置为'Verbose'表示输出详细的日志信息。
learning_rate:学习率
depth:每棵树的最大深度,即树的最大层数。
l2_leaf_reg:L2正则化系数,用于控制模型的复杂度,避免过拟合。
loss_function:损失函数
from catboost import CatBoostClassifier
model = CatBoostClassifier(iterations=2500, cat_features=feature_list, eval_metric='AUC', logging_level='Verbose', learning_rate=0.05, depth=6, l2_leaf_reg=5, loss_function='CrossEntropy')
2.3 训练模型
直接使用fit方法对刚才建立好的模型进行训练。
model.fit(X_train.loc[:, feature_list], y_train,
eval_set=(X_validation.loc[:, feature_list], y_validation), plot=False)
下图是一个小demo,训练过程中会打印每一轮的AUC结果,并且保存最好的结果(括号内是最好的结果在哪一轮出现)。
3.测试集预测
由于最后的提交结果为每个测试样本是1的概率,也就是y为1的概率, 所以这里直接使用predict_proba
方法返回的是每个样本属于各个类别的概率。对于二分类问题,每个样本有两个类别(正类和负类),因此 predict_proba
返回的是一个二维数组,每一行代表一个样本,每一列代表一个类别的概率。其中第一列是样本属于负类(0)的概率,第二列是样本属于正类(1)的概率。
preds = model.predict_proba(test_data[feature_list])
preds
最后,取正类的概率存储为submission.csv进行提交。
test_data['isDefault'] = preds[:, 1] # 取正类的概率存储
test_data[['id', 'isDefault']].to_csv('submission.csv', index=False)
提交!!
其实这个结果也不是很好,第一名已经冲到了0.78+了,对于特征处理确实还有需要优化的点,希望后面可以再优化一下下~