车险预测项目梳理

Porto Seguro's Safe Driver Prediction: Machine Learning Case Study | by  Madanchowdary | Medium

 

项目背景

简述

利用历史数据来构建预测模型,以预测驾驶员未来可能发生保险索赔的概率。

目标

通过分析驾驶员的个人信息、驾驶历史、车辆特征等因素,预测驾驶员发生保险索赔的概率和可能的索赔成本。

收益

评估指标

简介

Normalized Gini Coefficient 标准化基尼系数

维基百科:https://en.wikipedia.org/wiki/Gini_coefficient

基尼系数(英语:Gini coefficient),是20世纪初意大利学者科拉多·基尼根据洛伦兹曲线所定义的判断年收入分配公平程度的指标,是比例数值,在0和1之间。

当评估车险预测模型的性能时,使用标准化基尼系数作为指标。在计算标准化基尼系数之前,我们需要了解以下几个概念:

  1. Gini系数:Gini系数衡量了模型预测结果的准确性和排序能力。它的取值范围从0到0.5,其中0表示随机猜测,0.5表示完美预测。

  2. 标准化Gini系数:Normalized Gini Coefficient Formula 范围是0到1

  3. 预测排序:在评分过程中,模型对所有观察值进行排序,将预测值从大到小排列。

  4. 累积比例:评分算法计算累积正类观察值的比例,即正类观察值在排序后的前缀中的比例。

  5. 标准化Gini系数 = 2* AUC-ROC - 1

img

好处

常用的二分类任务指标还包括:

代码

项目节奏

项目准备阶段(约1-2周)

数据探索和预处理阶段(约2-3周)

数据挖掘和特征工程(约1-2周)

模型选择和开发阶段(约2-4周)

模型评估和优化阶段(约2-4周)

部署和上线阶段(约1-2周)

复盘总结(约1周)

项目难点&挑战

数据字段信息脱敏,无法从domain expertise推导特征重要性

通过元数据分析框架来对特征的属性进行拆解和分析归纳,尤其在无法从领域专业知识推导特征重要性的情况下。

  1. 变量类型:分析特征的变量类型,如数值型、类别型、文本型等。不同类型的特征可能需要采用不同的处理方式和建模方法。

  2. 数据类型:分析特征的数据类型,如整数、浮点数、日期等。不同数据类型的特征可能需要进行不同的数据转换和预处理。

  3. 缺失值占比:分析特征中缺失值的比例,了解每个特征缺失值的情况。可以根据缺失值的程度决定是否需要进行填充或删除处理。

  4. Cardinality(基数):分析特征的基数,即不同取值的数量。基数较高的特征可能对模型的预测能力有较大影响,而基数较低的特征可能对模型的预测能力有限。

元数据框架搭建的收益:

  1. 提供特征属性信息:元数据分析框架可以提供特征的基本属性信息,包括变量类型、数据类型、缺失值占比、基数等。这些信息可以帮助数据科学家和分析师更好地理解和处理数据,为后续的特征工程和建模提供指导。

  2. 指导特征选择和构建:通过分析特征的元数据,可以识别出具有高基数或高缺失值占比的特征,或者发现特征之间的相关性。这些信息可以用于指导特征选择的过程,帮助选择最具预测能力和稳定性的特征,提高模型的性能和鲁棒性。

  3. 发现数据质量问题:元数据分析框架可以帮助发现数据中的异常情况和数据质量问题,如异常值、数据偏斜、数据类型错误等。通过及时发现和处理这些问题,可以提高模型的准确性和稳定性。

  4. 支持数据治理和合规性:元数据分析框架有助于数据治理和合规性的实施。通过对数据属性的分析和记录,可以更好地管理数据的来源、变化和用途,确保数据的质量和可追溯性,同时满足数据隐私和安全的合规要求。

  5. 提高团队协作效率:元数据分析框架可以作为团队共享和沟通的工具,帮助数据科学家、分析师和开发人员更好地理解和利用数据。团队成员可以根据元数据信息进行更加有效的数据探索、特征工程和模型开发,减少沟通和理解上的误差。

数据类别极度不平衡,正负样本数量差异极大(26:1)

不平衡数据方案梳理、可行性验证以及效果比对

  1. 过采样(Oversampling):

    • 随机复制少数类样本,增加其数量。

    • RandomOverSampler

    • SMOTE

    • ADASYN

  2. 欠采样(Undersampling):

    • 随机删除多数类样本,减少其数量。

    • RandomUnderSampler

    • TomekLinks

    • EditedNearestNeighbours

    • RepeatedEditedNearestNeighbours

    • AllKNN

    • ClusterCentroids

  3. 类别权重调整(Class Weighting):

    • 给予少数类样本更高的权重,平衡其影响。

    • 在模型训练中调整样本类别权重。

  4. 阈值移动(Threshold Moving):

    • 调整分类阈值,使得更容易预测少数类样本。

    • 降低分类器的阈值,使得更多样本被预测为少数类。

  5. 数据合成(Data Augmentation):

    • 对少数类样本进行扩增,生成更多的样本。

    • 可以使用图像处理技术、文本生成技术等方法进行数据合成。

  6. 集成方法(Ensemble Methods):

    • 使用多个分类器组合的方式进行预测。

    • 可以使用Bagging、Boosting等集成学习算法。

  7. 异常检测(Anomaly Detection):

    • 检测和移除多数类中的异常样本。

    • 异常检测算法可以帮助减少多数类样本的影响。

  8. 基于代价敏感学习(Cost-Sensitive Learning):

    • 考虑错误分类的代价,使得模型更关注少数类样本。

    • 调整模型损失函数或代价矩阵,使得少数类的错误分类代价更高。

结论:

  1. 分别尝试随机重采样和基于模型的合成方法,并完成方案效果比对,由于数据维度、数据量级过大,使用SMOTE、ADASYN等合成方法耗时过长,TomekLinks、ENN等基于近邻的欠采样方法计算效率也过低,从而

    1. 短期:

      1. 选择从多数类别中随机删除一些样本,以减少数据量。这样可以减少计算和内存开销,并且可以更快地完成数据处理和模型训练。

      2. 杂交方法:先随机过采样再随机欠采样,降低模型过拟合的可能性

        img

      (1)undersampling rate=(1r)minority sizermajority sizewhere r=desired proportion rate
    2. 长期:使用并行计算技术,如多线程或分布式计算、数据分块处理(Chunking),将数据处理和合成方法应用于多个计算资源上,从而提高处理速度。通过充分利用计算资源的并行性,可以减少耗时。

  2. 尝试使用对imbalanced data更鲁棒的算法模型,例如XGBoost,并完成关键参数的优化迭代

    1. scale_pos_weight: 用于设置正例(少数类别)与负例(多数类别)的权重比例。通常情况下,scale_pos_weight的取值可以设置为负例样本数目除以正例样本数目的比值,以便平衡类别权重。较高的scale_pos_weight将增加少数类别的重要性。

    2. subsample: 子样本采样比例参数,用于控制每轮迭代中随机选择的样本比例。较小的subsample值可以增加少数类别样本的比例,从而在训练中更多地关注少数类别。默认值为1,表示使用全部样本。

    3. max_delta_step: 调整样本权重的参数,用于限制每棵树权重的调整幅度。较小的max_delta_step值可以降低权重调整的速度,有助于处理不平衡数据集。

    4. objective: XGBoost支持多种目标函数,可以根据具体问题选择适当的目标函数来处理不平衡数据。例如,使用logistic目标函数(binary:logistic)或排名目标函数(rank:pairwise)。

 

缺失值、异常值在风控项目中的处理方案

在风控项目中,特别是车险预测项目中,缺失值和异常值的处理需要考虑不同的角度和策略。传统的处理方法可能不适用于这种特定情况,因为缺失值和异常值可能包含有价值的信息,能够反映用户的异常风险存在。以下我们尝试的优化方案:

处理缺失值

  1. 特征衍生:对于含有缺失值的特征,可以通过衍生新的特征来捕捉缺失值的信息。例如,可以创建一个二进制指示变量来表示该特征是否存在缺失值,以此作为一个重要的特征进行建模。

  2. 缺失值填充:而不是简单地删除缺失值,可以采用合适的填充策略来填补缺失值。填充方法可以根据特征的类型和分布进行选择

    1. 单变量填充

      简单快速,不需要考虑其他特征的影响,但可能会引入偏差,因为仅依赖于单个特征的信息。

      1. 对于数值型特征,可以使用均值、中位数或其他统计量来填充缺失值。这些统计量可以基于整个特征的数据分布或特定分组(如相似样本)的数据分布进行计算。

      2. 对于分类型特征,可以使用众数或其他频率较高的值来填充缺失值。

    2. 多变量填充

      考虑了其他特征之间的关系,能够更准确地填补缺失值。然而,该方法可能更加复杂和计算密集,需要对参考特征的选择和建模方法进行谨慎考虑。

      1. 回归模型填充:(使用随机森林regressor对高度相关变量进行填充,进行缺失值预测,模型分数前后对比有大概5%的提升)

        • 使用线性回归、岭回归、随机森林等回归模型来建立特征之间的关系,并预测缺失值。

        • 可以根据特征的相关性、特征重要性等选择参考特征,利用已有的特征值进行建模和预测。

      2. KNN(K-最近邻)填充:(尝试了,太慢,数据量太大,不适合基于近邻的填充方法)

        • 基于特征之间的相似性,使用KNN算法来找到与缺失样本最相似的样本,并将其特征值用于填充缺失值。

        • 需要定义相似性度量指标(如欧氏距离、余弦相似度等)和K值(最近邻的数量)。

    3. 未来优化动作:

      1. 矩阵分解填充:

        1. 利用矩阵分解技术(如奇异值分解、主成分分析等)将数据集拆解为低秩矩阵的乘积,利用已有的特征值进行预测并填充缺失值。

        2. 可以通过优化算法(如梯度下降)来求解矩阵分解的参数。

      2. 多重插补(Multiple Imputation):

        1. 基于随机模拟的方法,通过生成多个完整的数据集来填补缺失值,并进行多次分析和预测。

        2. 可以使用方法如马尔可夫链蒙特卡洛(MCMC)和期望最大化(EM)来进行多重插补。

      3. 结合领域知识的填充:

        1. 基于领域专家的知识和经验,利用特征之间的逻辑关系、业务规则等进行缺失值的估计和填充。

        2. 这种方法常用于特定领域的数据处理,需要对数据和领域有较深的理解。

处理异常值

  1. 基于统计方法的异常值检测:使用统计学方法如Z-Score或箱线图方法来检测车险数据中数值型变量的异常值,例如:车辆保险金额超出均值加减几倍标准差的观测值可能被视为异常。

  2. 基于业务规则的异常值检测:根据车险领域的专业知识和业务规则定义异常值,例如:对于车辆保险索赔金额,如果超过预设的阈值或超出车辆类型的合理范围,可以将其视为异常。

  3. 基于机器学习的异常值检测:利用机器学习算法学习车险数据的正常模式,并识别偏离正常模式的异常观测值。例如:使用孤立森林或单类支持向量机等算法来检测车险数据中的异常保险索赔案例。

基数过高的特征编码如何编码?存在数据泄露问题,如何优化?

基数较高的特征可以考虑使用目标编码(Target Encoding),也称为类别均值编码(Mean Encoding)。目标编码是一种编码方法,通过使用目标变量的统计信息来代替原始的类别值。

  1. 保留了类别信息:目标编码利用了目标变量的统计信息,通过计算每个类别对应的目标变量的均值(或其他统计量),将其作为编码值。这样可以在一定程度上保留了类别的信息,有助于模型学习到类别与目标之间的关系。

  2. 解决了高基数带来的维度灾难:对于高基数的特征,直接使用原始的类别值可能导致维度爆炸,增加模型的复杂度和计算成本。目标编码将高基数特征转换为低维度的编码值,有效减少了特征空间的大小,简化了模型的训练和预测过程。

  3. 捕捉了类别与目标的关联性:通过使用目标变量的统计信息,目标编码能够更好地捕捉不同类别对目标的影响。特别是在分类问题中,目标编码可以提供每个类别对应的目标变量的平均值,反映了不同类别的潜在风险或者概率分布,有助于模型学习到类别之间的差异。

  4. 适用于多种模型:目标编码是一种通用的编码方法,适用于多种机器学习模型,特别是基于树的模型如决策树、随机森林和梯度提升树。这是因为目标编码生成的编码值是连续的,能够与树模型中的分裂点进行比较和划分。

存在数据泄露问题,如何优化?

目标编码(Target Encoding)在应用过程中可能存在数据泄露问题,即使用了目标变量的信息来编码特征,可能会将训练数据中的目标变量信息泄露到了验证集或测试集中。这会导致模型在验证集或测试集上表现良好,但在实际应用中性能下降。

我们通过交叉验证、添加噪声、滞后编码、特征组合和稳定性选择等方法,减少目标编码中的数据泄露问题,提高模型的泛化能力和性能。

核心代码

  1. 添加噪声函数:在add_noise函数中,对传入的series进行乘法操作,乘以一个随机生成的噪声值。这个噪声值是通过np.random.randn(len(series))生成的服从标准正态分布的随机数。通过乘法操作,噪声值会在一定程度上扰动原始的特征值,使得编码过程中的计算结果具有一定的随机性,从而减少数据泄露的风险。

  2. 目标编码平滑化:在target_encode函数中,通过平滑化操作来减少对目标变量的依赖性,从而进一步降低数据泄露的可能性。具体来说,通过计算每个类别的样本数量(count)和目标变量的均值(mean),然后应用平滑化公式:smoothing = 1 / (1 + np.exp(-(averages["count"] - min_samples_leaf) / smoothing)),得到平滑化系数。这个平滑化系数会在后续的编码计算中起到调节的作用,使得编码结果对目标变量的依赖程度适度平滑。

  3. 添加噪声到编码结果:在对训练集和测试集进行目标编码后,通过调用add_noise函数,将噪声添加到编码结果中。这样做的目的是增加编码结果的随机性,进一步减少对目标变量的依赖性,降低数据泄露的风险。

综上,通过添加噪声和平滑化操作,该代码在目标编码过程中优化了数据泄露问题。添加的噪声使得编码结果具有一定的随机性,减少了对目标变量的直接依赖性,而平滑化操作则通过调节编码结果的依赖程度,进一步降低了数据泄露的可能性。这样可以提高模型的泛化能力和性能,减少过拟合的风险。

数据清洗+特征工程+模型预测pipeline管道实现方案设计

  1. 元数据框架:构建元数据分析框架,对特征进行分类归纳和拆解,为后续的数据质检、数据清洗、特征选择和构建提供有效帮助,提高团队协作效率

  2. 数据清洗:风控视角梳理缺失值、异常值对于用户风险的影响,针对性给出基于模型的缺失值填充方案(MICE/单变量填充)和异常值检测方案,为后续特征构造提供指导性建议

  3. 编码:通过目标编码结合添加噪声和平滑化操作,解决高基数特征使用传统独热编码造成的维度爆炸和信息泄露的问题

  4. 离散化:根据连续特征分布特点设计有监督特征离散化方案,增加模型的迭代速度,计算结果方便存储,易扩展,增加稳定性

  5. 转换:在对原始特征进行处理和转换,提取更有价值的信息,包括特征缩放、标准化、归一化等,以改善模型性能和提高预测能力。

  6. 增强:使用多项式特征构造方法进行特征交互和合并,结合domain expertise完成特征构造,以捕捉数据中的隐藏模式和关联性,提供更具预测能力和解释性的特征表示,从而增强模型的表达能力和预测准确度。

  7. 筛选:通过SHAP、树型模型等方法计算特征重要度、对60+特征进行评估和筛选,选择对目标变量预测有重要影响、相关性强且具有解释性的特征,以提高模型效果和降低过拟合的风险。

  8. 建模:使用XGBoost进行建模预测,集成前置特征工程、参数调节、交叉验证和模型评估指标计算等环节,最终10折交叉验证平均score线下最优达到:0.286

未来动作

  1. 数据质量改进:优化数据采集和清洗过程,减少数据缺失和异常,提高数据质量。改进数据收集方法,加强数据验证和清洗流程,减少数据质量问题对模型的影响。

  2. 特征扩展和更新:引入更多相关特征、衍生特征和外部数据,提高模型的表达能力和预测准确度。 整合车辆行驶数据、天气数据等外部数据,构建更丰富的特征集。

  3. 特征选择和筛选:通过移除所有计算特征(calc features)来简化模型输入,减少冗余和噪声特征的影响。 示例:使用特征选择方法(如LightGBM)来识别和保留对目标变量有最强相关性的特征。

  4. 模型集成和优化:尝试不同的模型集成方法,如集成多个模型、堆叠模型等,以提高预测性能和稳定性。训练和集成多个模型,如XGBoost、LightGBM和神经网络(NN),通过加权平均或投票机制获得最终预测结果。

  5. 实时预测和决策:建立实时预测和决策系统,及时更新模型预测结果,支持实时风险评估和决策制定。开发实时监测系统,定期更新预测模型,提供实时车险风险评估和个性化保险方案。

  6. 模型解释和可解释性提升:通过解释性技术和方法,提高模型的可解释性,增加业务用户对预测结果的理解和信任。 应用SHAP值、特征重要性等技术,解释模型的预测过程和关键影响因素。