Press "Enter" to skip to content

风控贷后管理中的非结构化数据应用

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

 

 

分享嘉宾:王书林 数禾科技

 

编辑整理:岳欣 宜信

 

出品平台:DataFunTalk

 

导读: 在贷后管理工作中,除了风控场景常用的各种结构化数据(用户个人属性,用户行为,外部数据等),还有大量语音和文本的非结构化数据,如何在贷后模型和策略中灵活运用这些数据,将会是贷后管理能力的一个重要体现。所以,本期分享的内容是在贷后管理的场景下,对于非结构化数据:语音和文本数据的一些数据挖掘和应用实战经验。将分别介绍: ① 语音特征提取;② 文本特征提取的传统方法和深度学习方法。

 

01

 

语音特征提取

 

1. 传统方法

 

对于语音的描述性特征提取,可以通过人工归纳的方法来提取听觉上的一些特征在信号序列上的体现,也可以通过第三方开源的语音特征提取包来提取一些常见的语音特征如短时过零率特征,能量熵等。这一部分有如下两个实例。

 

 

① 实例一

 

如上图左例,是需要对催收语音文件打上一些无效沟通标签,用于失联打标,催收策略,或者与催收人员记录的催记码进行质检比对。由于提供的语音文件没有真实的标签,所以我们只能采用人工归纳的方法去提取一些能明显表示客户是失联状态,或者是没有说话的无效沟通状态的特征。

 

具体做法是:

 

将催收坐席的语音和客户回答的语音两个声道分开后进行对比,如果客户的声道没有任何振幅,即为无效沟通。

 

但某些客户的手机支持AI自动接听功能,如何判定此类无效沟通呢?

 

我们经过一些验证,发现AI语音助手的声音都会远远大于催收坐席,在数据上面的表现是两条语音信号的振幅,客户方明显远大于催收坐席方。

 

于是可以制定一条规则:

 

如果客户方的信号振幅远高于坐席方,即可把它判定为无效沟通,或者是先打标为AI语音助手接听;然后通过各类子标签综合评价。

 

在实际操作中,我们归纳了很多条规则来用于是否无效沟通的判断,它的精准率(precision)非常高,几乎达到了100%,但召回率(recall)不是很高,但是也能召回大部分无效沟通数据。我们的业务方通过将这些无效沟通的标签与催收人员记录的催记码进行对比,发现有很多承诺还款的催记码或者其他催记标识,实际上是无效沟通。于是可以进行一些有效的质检,也可以用来作为贷后的失联打标放到策略规则里面。

 

② 实例二

 

使用第三方开源的特征提取包来进行语音特征的提取,把它向量化之后放到传统的机器学习模型里面进行训练。

 

我们的应用场景是构建PTP(promise to pay)客户实际还款预测模型,它的定义是客户承诺将在今明两天完成还款。在催收过程中,如果客户的沟通交互中有显着的这个意思,催收人员会给他打上PTP的催记码。我们的实验样本是1万条催记码为PTP的客户,其中70%用作训练,30%用作测试;然后我们用第三方开源的语音特征提取包pyaudioanalysis来提取特征,如短时过零率、能量熵等特征,包括梅尔倒谱系数。

 

梅尔倒谱系数是一个非常有名的语音特征,它是从梅尔频谱上面转化提取出来的一些系数。

 

通过提取的这些特征,我们构建了一个XGB模型,它在测试集上的AUC是0.58,KS在0.1以上;虽然AUC不是特别高,但它可以作为一个评分特征加入到它下一层模型的特征中,同时它的KS达到0.1以上;所以说这个效果也是不错,可以帮助我们识别假的PTP客户并对他进行针对性的催收动作。

 

因为我们平时的策略当中,对于PTP客户的催收力度可能会降低,或者几天无催收。有了这个模型之后,再结合一些其他的策略规则,我们就可以帮助判断PTP客户中的高风险人群。

 

以上就是我们用一些传统方法来提取的特征,它具备一些可解释性,比较容易被业务方接受,而且操作起来也比较的简单,比较好落地,应用于规则或上模型都非常便捷,但是效果可能不是非常拔尖。

 

2. 深度学习方法

 

 

接下来我们讲的一个方法是用深度学习的手段进行语音特征的提取和建模。

 

首先介绍前面提到的梅尔频谱图,它是一个非常常见的对语音信号进行处理的手段,我们可以把一条时域上的信号表示为一个很长的向量,它的每一个数据点表示它每一帧的振幅,那一条一分钟左右的语音可能要分几千万个点,这个维度显然太大,对于我们机器学习的方法来说,是无法直接进行处理建模,所以需要把它进行一个转换。

 

转换语音信号,大家的第一个反应肯定是傅里叶变换,它可以把语音信号从时域上面转化到频域上面,维度就会从时间变成频率,它可以把各个高频低频的语音轨道区分开,但是这样我们的催收语音就会失去时域上的信息,那怎幺办呢?

 

我们对它进行一个叫做短时傅里叶变换的操作,虽然我们还是用傅里叶变换进行时域和频域的转换,但是我们对一整条语音信号进行加窗,每一个窗口转换一次,保留时序上的信息。由于进行加窗操作,比如原本的几千万维,我们把零点一毫秒或者一毫秒的语音信号作为一帧,然后多少帧作为一个窗口,就会大大缩减时序上的维度;同时,每一个窗口内的信息又通过傅立傅里叶变换,转换到频域维度上,最后会得到一个从维度很高的一维数据,变成一个维度可以接受的二维数据,一个维度是时间,一个维度是频率。然后我们对这个二维数据进行一些后续处理,比如把赫兹频率变成一个跟人耳感知有线性关系的梅尔频率。

 

因为在听觉上的感受, 线性的增加赫兹频率并不能让人耳感知到有线性的声音频率的升高。 比如听一段频率很高的语音,再增加1000赫兹,人耳听到的感受会跟没加差不多,也就是说赫兹这个单位,对于人耳的感受来说不是特别的友好。

 

我们通过一些方法把它转换成梅尔频率,它跟人耳的感觉是会有一个线性关系,然后还可以把数据里面的振幅,就是时域和频域两个维度交叉的每一个数据点的值,如果这个数值较大,比较不好处理,我们可以把它转换成分贝。 因为原始数据中振幅的取值范围往往是零到好几万,值域比较宽,处理起来会比较困难,把它转换成分贝之后,它的值可以变小一点。

 

经过如上处理后,我们得到了一条可以加进神经网络进行训练的二维数据,也就是一个时域和频域上的语音数据,它包含了几乎所有原始语音信号的信息,而且维度较低。然后我们使用的网络结构是一个叫CRNN的结构,顾名思义就是卷积层CNN加上一个循环神经网络层RNN,最后再接一个全连接层进行预测。

 

卷积层其实有很多的操作空间,因为平时图像里面常用的卷积层都是二维卷积层,是因为图像的两个维度上的含义是一样,既具有空间不变性。但是对于语音信号,它的两个维度是时域和频域,含义是不一样的,所以我们可以把卷积层从二维变成一维,只在时域上进行卷积。

 

另外,我们还可以进行一些操作,比如对于一条数据的不同片段使用不同的卷积核:

 

将数据切成几段,然后每一段卷积成一个数字,比如把数据切成100段,然后每一段卷积核的宽度跟这一段数据的宽度一样,把这段数据卷积成一个数字,但每个卷积核里面的系数都是不一样的,这样我们可以学习到不同段落的特征。

 

使用卷积来提取关键信息时,我们实际操作中使用的是三层的二维卷积,因为时间比较有限,没有做更多的尝试,刚才提到的方法可能是我们以后希望在别的场景中尝试的一些方法。

 

卷积提取到一些语音信号时域上的关键信息后,我们可以把它输入到LSTM或者其他的形式的RNN中,对它进行时序序列信息的embedding,我们实际操作中使用的是两层LSTM,也可以尝试别的方法,如transformer;最后把得到的embedding向量,进行全连接层的预测,是否催收成功。

 

这个场景中,如上图,我们使用的是入催1~3天的AI催收语音数据,因为 AI催收的问题相对固定,所以客户的回答可能也就比较模式化一些;目标是用入催1~3天的AI催收语音数据来预测客户4~15天内是否会还款。

 

实际建模的效果,验证集上的AUC是0.57,测试集上的AUC是0.56,虽然效果不是特别好,但也有一定的区分度。大家可能会有疑问,这个效果并不是特别好,甚至没有之前用第三方开源包做出来的模型的效果好。

 

主要有以下两点原因:

 

一是这个场景与上面的场景非常不一样,上面场景的数据范围只是promise to pay的数据,而且它预测的是接下来两天是否实际还款,而这个场景用的是入催1~3天的数据去预测后续4~15天,一个比较长的窗口用户是否还款,而用户在比较长的窗口里面是否还款,肯定会受到这个窗口内发生的数据变化的影响,所以说这个场景对于数据的充分性要求是比较高的,我们最好能把这个用户在还款前一刻的数据都用上,但我们并不知道用户会在哪一天还款,所以只能牺牲大量的数据,只用入催1~3天的数据来进行这个训练;

 

二是我们网络结构挖掘的还不够深,正如前面所说,还有很多种网络结构可以尝试,虽然都是叫CRNN,但卷积层和循环层都可以有不同的结构,都可以用不同的算子来进行不同的搭配,甚至最后一层的全连接层也可以替换成平时常用的传统分类器,如XGB,因为经验告诉我们,全连接层的分类效果在结构化数据上是不如XGB这种比较强的ensemble模型,所以我们也可以选择在LSTM这一层,或者在RNN这一层得到embedding向量后,跟一个集成学习的分类器,比如XGB或者lightGBM进行预测,这样效果可能会有一些变化,也不一定是提升的,可以经过更多次的尝试得到更好的效果,这就有待大家在各自的场景进行一些更加丰富的尝试。

 

02

 

文本特征提取

 

1. 传统方法

 

 

① 关键字提取

 

文本特征提取的传统的方法,有最简单的关键字提取,比如在做高危联系人打标时,客户的通讯录里有一个联系人叫做赌场二哥,那这个客户可能很喜欢赌博,我们就会把赌博或者赌场、赌这个关键字提取出来,然后击中这个字的,可以把它打标为高危,不击中的可以打标为中风险或者低风险,这种方法就是所谓的关键字提取法。

 

我们先对AI催收语音进行语音转文本的操作,这是AI催收厂商提供的,我们可以直接拿来使用,如果大家尝试的场景里没有厂商直接支持的语音转文本功能,可以在市面上找一些第三方的提供商,比如科大讯飞的语音转文本,有了语音转文本后的数据,我们可以对客户回应的语义,就是催收的过程当中客户回复的字眼进行分析。

 

我们的实验样本是3万条AI催收语音的文本,并对文本进行一些关键字的提取,比如把表示肯定的词,如好、可以、没问题等这些词提取出来,形成一个肯定词袋;把表示否定的词,如不行、有问题、不等这些词提取出来,形成一个否定词袋;把一些无意义的词,如嗯、啊等这些没有意义的语气词提取出来,形成一个语气词词袋。

 

然后对催收语音的文本进行词袋的撞库或者是否击中:肯定词是否击中、否定词是否击中、无意义的词或者情绪词是否击中等,可以打出来很多标签,比如非本人接听,非本人接听的标签可能就是我不是谁谁谁,或者击中的词是我是他亲戚,我是他朋友这种词,如果击中朋友或者类似我不是这种词,大概率是非本人;比如无有效响应,用户回应的词可能全是语气词或者无意义的词,如啊、哦这些词;比如无诚意还款,当客服问到是否可以在最近几天还款这种问题时,用户的回答都是一些否定,反过来,回答是肯定的话,可以标记为承诺还款。

 

总之,通过这些关键字的提取,我们可以把催收语音对应的文本打标成很多个标签,实战中是打标成了十个标签,可以覆盖85%的数据,剩下的15%无法判断标签,经过业务方人工检验这十个标签,发现准确率也是较高的。最后我们把标签经过one-hot处理后,作为特征加入我们已有的贷后模型中,对已有的贷后模型的AUC提升1~2个百分点,是非常显着的提升。

 

常见的传统文本分析方法还有词袋法和TF-IDF法,这两个方法的思路都是将文本向量化。

 

② 词袋法(BoW)

 

词袋法非常好理解,就是把一条文本拆分成多个词,比如有一个1万条文本的样本,我们把每一条文本都用一些分词方法,如结巴分词,拆分成多个词后,这1万条文本中总共出现了20万个词,然后把这20万个词一字排开,每一条文本都在这20万个词里标上是否包含这个词,就得到了一个20万×1万的矩阵,相当于我们把这个文本数据向量化成了一个矩阵,这个矩阵可以直接用贝叶斯分类器对它进行预测。

 

如果大家平时有研究过一些基础的机器学习算法,比如这个朴素贝叶斯分类器,那一定会接触到一个实战任务叫垃圾邮件分类,它用到的方法与我们这个场景用到的是一模一样的,就是把文本先分词,分词之后用词袋法向量化,再进行朴素贝叶斯分类。那我们就可以通过这种方式对催收语音文本进行后续是否会还款的打标,实际模型的区分度也还可以,验证集的AUC是0.58,测试集的AUC是0.562,这个模型可以作为子模型加入其他上游的贷后模型中,也可以直接作为一个评分放到规则里。

 

③ TF -IDF

 

TF-IDF方法,它跟词袋法比较不一样,它同样也需要对文本进行分词,分词后一字排开,但它向量化后的值不再是简单的是否包含,它会计算一个系数,这个系数等于tf值和idf值的乘积,tf值是这个词在本条样本中出现的次数,比如一条样本的内容是我叫XXX,我喜欢做风控,样本中我字出现了两次,样本总共可以分为十个词,那我字出现的频率就是20%;idf是逆向文件频率,比如要判定在样本中有多少条文本包含风控这个词,1万条文本中有4000条包含风控这个词,那它的文件频率值是4000除以1万,但idf值要把这个算出来的值取倒数后再取十为底的对数,所以叫逆向文本频率。

 

TF-IDF 值计算就是把这两个值乘起来,就会得到每一条样本里面每一个词对应的一个系数,这个系数代表了这个样本中这个词条的重要性,因为如果某一个样本中某一个词出现了很多次,但这个词在其他的样本中都没怎幺出现过,那意味着这个词对这条样本是非常重要的,是包含重要信息的一个词,而tf与idf的乘积,就是跟某一个词在本条样本当中出现的频率成正比,跟这个词在所有的样本中出现的频率成反比。

 

用 TF-IDF 的方法对词进行向量化后,后面也可以接一些分类器,比如常用的XGB分类器或者逻辑回归,但是在操作的时候需要注意一点,因为样本分出来的词种类有很多,需要对它进行一个筛选,我们可以尝试多种筛选的方式,比如筛选tf-idf值总和的前100条或者前200条。

 

还有一点就是在做传统的词向量化过程中,还需要注意到词组的存在,比如我和喜欢可以构成一个叫我喜欢的词组,有些时候词组也是会有信息的,这时我们就需要用到一个叫n-gram的方法,把词组也作为一个词放在我们的词袋里,或者放在tf-idf待预测的这个向量的列维度里。

 

所以传统的文本分析方法可以归纳为词袋法或者tf-idf,然后结合n-gram的方法把文本进行向量化,再用传统的机器学习进行预测。

 

如果大家想实际操作一下,可以在python的sklearn包里面找到一个叫feature extraction的子包,里面有个叫text的模块,包含有两个方法,一个是对应词袋法的countVectorizer,还有一个是对应tf-idf方法的Tfidfvectorizer,可以任意组合,比如用countVectorizer或Tfidfvectorizer接LR或者XGB都可以试一试。我们这次实战使用的是词袋法加朴素贝叶斯,它是有一定区分度的。

 

2. 深度学习方法

 

 

深度学习的方法,其实业界有非常多的成熟的NLP处理方法,但是对于问答的处理,可能各家有各家的不同的做法,数禾的一个小伙伴想出来一种对于问答类的文本信息,进行处理的非常有意思的方法,他通过构造一个关联矩阵,对于问和答进行关联,然后把关联矩阵分别与问题向量和答案向量进行点乘,再相加就可以把问和答的信息全部融合在一个数字里面。

 

我们整体介绍一下模型的构建过程,首先是要对文本进行embedding向量化,但这个embedding跟前面讲到的tf-idf和词袋法的embedding不一样,这里就是对这个词进行一个编码操作,比如我是1,你是2,他是3,喜欢是4,市面上有一些现成的预训练词编码器,当然也可以用自己的一些编码器,可以把一些意思相近的词编码在一起,这样子出来的模型可能效果会稍微好一点。

 

这个场景实战中,我们用的是自己做的一个编码器,就是用ASCII码的排序进行编码,没有对近义词进行组合,对于问题和客户的回答分别进行embedding之后,得到两个向量,这两个向量都可以判断出某几个值是属于第一个问题,某几个值是属于第二个问题。

 

如图右侧所示,比如客服的提问,经过向量化之后有九个词,前三个词是问题一,中间两个词是问题二,后面四个词是问题三;而客户的回答是五个词,第一个词是针对问题一的回答,中间两个词是针对问题二的回答,后面两个词是针对问题三的回答。

 

如何进行问与答的矩阵关联呢?

 

如图右侧所示,可以看到客服关联矩阵总共有三个问题,行数就是3,客服的提问分布了多少个词向量,横向的列数就是多少个列,可以看到前三个词是属于第一个问题,在(1,1),(1,2),(1,3)的位置上记为1,因为第四、第五个词对应的是问题二,在(2,4),(2,5)的位置上记为1,同理可以标记问题三的位置,这样就构造了问题的关联矩阵;同样的方法可以构造出客户回答的关联矩阵,然后再把客服问题的关联矩阵与客服提问的向量进行点乘得到一个三维向量,同样把客户回答的关联矩阵与客户回答的向量也做点乘,得到一个三维向量,把这两个三维向量相加就得到一个包含着问题一的问答信息,问题二的问答信息和问题三的问答信息的三维向量。

 

拿到这个向量之后,我们就可以进行训练,模型一般来说就是在NLP领域非常有名的transformer,transformer是一个基于自注意力网络或者算子。关于transformer,大家可以去读一读论文attention is all you need,里面讲的非常详细,同时,transformer是NLP领域里大名鼎鼎的预训练模型Bert的基石。

 

对这个分好的向量进行transformer的预测后,可以再接一个DNN,如前面对语音的处理一样,使用全连接层进行分类,也可以向量化后跟一些其他的分类器。

 

在这个场景中,我们使用的数据与前面语音的一样,也是入催1~3天的AI催收文本,但不一样的是从语音变成了文本,然后来预测4~15天的用户是否还款。由于使用了语义信息,所以模型的AUC比前面的语音模型高一点,同时,模型也可以从网络结构的调整进行优化,或者通过增加样本量来提高模型效果。对于这个场景的优化,可以把预测窗口缩短,或者每次用前N天的语音文本来预测N+1天是否催收成功,是否还款。

 

以上就是传统的文本提取方法和深度学习的文本提取方法,在实际的贷后操作中,可以把这两种方法构建的模型进行融合,做model stacking,得到一个更加优化的效果,也可以通过权重设置,选择偏向文本多一点,或者偏向语音多一点,或者让机器学习的模型自己去训练。只要掌握了将非结构化数据结构化,也就是向量化,后续的操作,风险策略人员都会有自己处理方法和想法。

 

今天的分享就到这里,谢谢大家。

 

在文末分享、点赞、在看,给个3连击呗~

 

分享嘉宾:

 

 

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注