草庐IT

融360蒋宏:自动化特征工程和自动建模在风控场景的应用

DataFunTalk 2023-03-28 原文


01 背景和问题

目前,模型开发的流程越来越规范化,通常可以分为业务分析、样本准备、特征工程、模型构建、模型评估及监控这几个步骤。其中,特征工程和模型构建在建模的整个流程中依然非常耗时,并且非常依赖于模型开发者对业务的理解及数据处理的能力。

在目前实际业务场景下,面临的最大的一个问题是,如何快速地构建起一个质量相对不错的模型,以适应业务的快速发展。传统的风控建模周期较长,通常要20天左右的时间才能达到上线的要求。其中,特征工程的耗时在整个建模过程中会占到大约60%的时间,且这个过程的挑战就是人工提取特征的复杂性和高时间耗费性。自动化特征工程能够对必要而繁琐的工作进行自动化处理,从而优化机器学习模型的构建和部署,这样模型的开发者就可以更多地关注其他重要步骤。另一方面,模型开发过程的耗时在整个建模过程中会占到大约30%的时间。这个过程的难点并不在于给出一个模型,而是在于同时比较多种模型甚至多种模型组合后,选出效果最佳的模型做主决策模型,其余的模型可以作为备用模型或者比较对象。这个过程如果用人工去实现,也会消耗非常多的时间,并且效果不一定最优。

基于这样的背景,融360推出的自动化特征工程和自动建模的方案,把建模过程中耗时最长的特征工程部分和模型开发部分抽象出了一套自动化工具。不仅集成了自动特征工程,还对建模过程中变量的筛选、建模调优、部署上线和模型监控进行了模块化的封装。该工具有如下优点:

① 大幅提升建模效率和标准化程度;

② 节约人力成本和时间成本;

③ 快速达到业务方要求;

④ 有利于尝试更多的模型方案和模型快速更新迭代。

通过自动化特征工程和自动建模方案后,模型从开发到上线的时间大幅减少,可以缩短至5天左右,不仅简化了开发流程,提升了开发效率,准确率方面也保持较高水准。

--

02 自动化特征工程

首先,我们先来看一下手动特征工程是如何完成特征工程这个过程的。人工构建特征工程主要依赖领域知识来构建特征,一次只能产生一个特征,这是一个繁琐,费时又易出错的过程。此外,每次进行特征工程的代码是针对特定业务和特定场景的。当我们面对新的需求、新的数据源时,我们需要重构特征,重新进行开发,耗时长效率低。

因此,特征工程若要能够实现自动化和标准化,其数据在结构上必须要具有一定的相似性和共通性。根据美国数据库营销研究所Arthur Hughes的研究,客户数据库中有三个神奇的要素,这三个要素构成了数据分析最好的指标:

① 最近一次消费(Recency);

② 消费频率(Frequency);

③ 消费金额(Monetary)。

在众多的客户关系管理(CRM)的分析模式中,RFM模型是被广泛提到的。RFM模型是衡量客户价值和客户创利能力的重要工具和手段。该模型通过一个客户的近期购买行为、购买的总体频率以及花了多少钱三项指标来描述该客户的价值状况。

在融360的业务场景下,更多的数据是交易级别的数据。那么,根据RFM模型构建出来的特征通常包含基本的统计变量,趋势型的变量等。例如,通话的时间段可以分为白天或者夜晚,通话类型可以分为主叫、被叫或者未接,交易金额总和、次数等等,这些都属于统计型变量。而类似于近3个月比近6个月的通话次数减少了多少,这是趋势型变量。

不仅是结构化数据,在关系网络中也可以通过RFM模型构建特征。如下图所示是一个简单的关系网络。应用RFM模型,可以构建出例如某用户有多少1度联系人,1度联系人中是否有过借贷行为,平均借款金额,以及其中有多少人有逾期记录等特征。

综合以上分析过程,可以将自动化特征工程的过程抽象成如下图所示的框架。首先,根据不同的数据类型,采取不同的处理方式。如果是分类变量,可以切分成不同的数据模块,用统计型或者标识型的方法去处理,完成第一层的聚合运算,生成基本的统计特征。那么在第二层中,会对基本的统计特征采取比值计算和趋势计算的一些方法,衍生出新的变量。

回顾特征工程的整体过程,有了自动化特征生成工具之后,模型开发者关注的重点不再是构建能够通过简单运算得到基本的统计特征,而是能够有更多的时间关注数据本身。而需要人工处理的部分仅是从原始数据到把数据标准化的过程,后续的特征自动组合、计算,以及评估到输出都实现了自动化的过程。

下图所示是某项目中,自动化特征工具和人工构建特征在同一数据集上的比较。可以看到,自动化特征相对人工特征效果明显提升且耗时更短。当然,开发自动化特征工具的目标并不是为了替代人工,而是希望自动化特征工具能够快速并且准确地提供一版基础特征,从而把人力更多地投入到对原始数据的理解以及对业务分析中,或者构建出更多衍生的特征。

--

03 自动建模

尽管不同的数据样本和不同的模型选择,得到的结果会有较大差异。但各项指标综合来看,目前不管是国内外的数据竞赛,或者是回归到公司业务本身,xgboost和lightGBM依然是适用性最好,表现最优的算法之一。而在信贷场景下,LR因其较好的解释性,也被广泛使用。因此,自动化建模工具整合了常用的算法,针对建模过程中通用性较高的部分进行了模块化的封装。这样极大地提升了开发效率,并且可以将更多的时间用于尝试不同的模型。

1.自动特征选择部分:

首先,自动通过EDA(Exploratory Data Analysis)对特征进行初步筛选,例如筛选掉缺失率较高,方差恒定不变,在时间维度上不够稳定等特征。其次,自动综合多种常用算法和规则,进一步筛选出有效的特征。例如:

① IV值筛选;

② 树模型输出重要性;

③ 共线性筛选。

最后,选择出综合排序TopN,以及各个类别中排名靠前的特征。可以把几千维度的特征降低到几百个维度的范围内,并且在减少特征的同时,保留特征的多样性。

2.建模部分

逻辑回归模型(LR)
LR在信贷场景下,通常用于构建评分卡模型。首先回顾一下逻辑回归实现评分卡的理论基础。

一个事件发生的几率(odds),是指该事件发生与不发生的概率的比值。若一个用户违约的概率是p,则其正常的概率为1-p。可以得到:

此时,客户违约的概率p可以表示为:

而评分卡的表达式为:

其中,A和B为常数。通过给定 (1)某特定Odds时的Score值(2)该特定Odds值翻倍时Score增加值,带入评分卡表达式即可求得A、B。

而根据逻辑回归的原理可推导出该事件的对数几率如下:

因此,构建评分卡的问题转化为利用逻辑回归模型求概率的问题,最后根据概率转化成评分卡的分数。

构建评分卡模型中最关键的步骤是WOE分箱,分箱的好坏直接影响最后模型的效果。传统的处理方式是,人工根据特征的业务含义,对特征进行一些粗分箱。抽象成自动化工具后,统一对特征进行等频分箱后做WOE变换,并且进行单调性检测。同时,也保留了人工操作的接口,可以自由调整分箱的边界,达到更优的效果。

  • XGBOOST

xgboost是目前应用最广泛的算法之一。不仅在多种竞赛场合取得非常好的成绩,在工业界也有广泛应用。在自动化建模的过程中,为了能让xgboost发挥出更好的效果,需要针对入模变量做额外的预处理。连续变量虽然可以直接入模,但为了减少过拟合,依然对连续变量进行了分箱处理。而分类变量则不能直接入模,可以通过决策树进行分箱的操作,或者通过各种编码方式对变量进行转换,例如标记编码,one-hot编码等等。

除了对入模的特征实现预处理,自动化建模工具还集成了更全面的调参方法,包括:设置多组经验参数、GridSearch、RandomSearch等,这个过程也是人工调参中耗时较长且重复性较高的步骤之一。

--

04 自动化模型评估与监控

在完成模型开发后,最重要的一个环节就是模型评估与模型的监控。在各种数据竞赛中,评估一个模型的好坏,通常会用AUC、KS等指标。但在实际场景中,模型上线后需要关注的不仅仅是这些模型的评估指标。更加需要关注的是模型整体的排序性和稳定性。在不同的业务场景下,对模型的要求也不一样。例如,在欺诈检测的场景下,会希望模型在低分段有更好的区分度。反之,如果要做授信额度策略,则会期望模型在高分段有更好的区分度。

自动化模型评估在实现全面、细致、快速地评估模型效果方面,主要涵盖了以下三个方面:

① 跨维度:变量维度、模型分维度;

② 跨样本:Train、Test、OOT、Early Performance等;

③ 跨模型:当前线上模型、不同版本新模型。

跨维度层面,包括对特征的监控以及特征对模型结果的影响。除了关注模型的基本监控指标AUC、KS、PSI、Ranking等,在变量维度,还会关注变量随着时间的变化,排序性是否下降,PSI是否升高,以及特征是否对模型结果产生了负面影响等因素。

跨样本层面,由于在模型开发的过程中,经常会使用比较成熟的表现期的样本,例如MOB6进行建模,但在评估模型的时候,可以用MOB1的样本进行跨期测试,用来判断模型的早期效果。

跨模型层面,不同的模型有不同参数,会针对不同的模型进行比较。看当前线上的模型和新版本模型之前的效果差异。

最后,根据以上三个维度的评估,会进行加权求和,输出模型最终的综合评分以及模型相关内容的文档,包括模型表现的汇总、特征分箱的结果、变量的PSI、变量与逾期率的关系等内容。

--

05 模型部署上线及线上监控

相较于传统的写python脚本完成从训练、预测到输出结果的模型上线方式,目前更常用的方法是输出模型文件,线上的部署环境支持读取和调用模型文件。但融360开发了针对模型部署的平台,省略了开发模型部署的脚本。模型自动输出配置文件,只需将配置文件放如新模型的文件夹中,就可以轻松完成上线部署,实现自动评分。并且配置文件具有简洁和良好的可读性等优点。

模型上线后的线上监控也是非常重要的环节之一。如果模型的监控仅依赖于各个模型的owner,那么会产生非常多的问题,例如不能及时发现AUC、PSI等模型指标的变化,缺失对特征变化的监控,模型何时需要重新训练,更新迭代等等。针对这些问题,融360开发了自动化模型监控工具,实现标准输入,标准输出。新模型配置监控不再需要重写代码,只需配置文件即可。

模型的每日监控会与模型上线时候的指标做对比。一方面,整体监控KS、AUC、PSI、排序性等指标是否发生变化,另一方面,关注每个变量在训练时的分箱与上线后的分箱的差异,看特征的分布是否发生了偏移,实现自动预警。

当监控发生报警时,会提醒模型开发者哪些地方出现了问题,从而能够及时响应。例如,当变量发生偏移的时候,考虑是否是数据源发生了波动,业务客群是否发生变化,是否需要与产品团队、策略团队进行对接等问题。

最后,模型的监控以三种形式输出:监控周报、定时预警以及模型效果可视化。


今天的分享就到这里,谢谢大家。
本文首发于微信公众号“DataFunTalk”。

有关融360蒋宏:自动化特征工程和自动建模在风控场景的应用的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  3. ruby-on-rails - 建模收藏夹 - 2

    我希望将Favorite模型添加到我的User和Link模型。业务逻辑用户可以有多个链接(即可以添加多个链接)用户可以收藏多个链接(他们自己的或其他用户的)一个链接可以被多个用户收藏,但只有一个所有者我对如何为这种关联建模以及在模型就位后如何创建用户收藏夹感到困惑?classUser 最佳答案 下面的数据模型怎么样:classUser:destroyhas_many:favorite_links,:through=>:favorites,:source=>:linkendclassLink:destroyhas_many:favor

  4. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  5. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  6. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  7. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  8. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  9. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  10. ruby-on-rails - 如何在 Gem 中获取 Rails 应用程序的根目录 - 2

    是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在

随机推荐