一起学习如何用LightGBM做决策(DomainSelection)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Oscar6280868/article/details/81455709

可能很多朋友都听说过LightGBM和GBDT,这里的GB代表的是梯度提升,也许有很多的朋友了解提升算法,在我的理解看来,梯度提升就是将许多弱的分类器联系在一起最终组合成一个强的分类器。LightGBM是微软开源的,网上也有中文的教程,这篇博文主要就是介绍一下如何用lightGBM来做决策,讲述一下具体的流程,希望对大家有所帮助。
首先,我们要知道LightGBM所支持的数据格式其实是和SVM一样的,也是传入的是一组组向量,每一组向量的第一位是标签位,后面所有的都是这组数据的特征。大概长这个样子:
LightGBM数据格式
说到这里,我来说明一下决策树在这个项目中的作用,就是一整个交互系统分成很多类别,最终根据用户的意图来出一个最终的类别,首先我们会进行一些粗分类处理,来判断用户的话语可能会出的结果,至于如何粗分类,我在之前的博文SVM做文本分类详细操作 有介绍到分类的方法,在粗分类之后,我们会淘汰出一些可能出的类别,剩下的类别我们再来进行决策,决策到底出哪一个类,这里的决策过程,我们就用到了LightGBM。
知道了大概的原理之后,很多朋友就会有疑问,给LightGBM训练的数据的这些维度,也就是训练数据的特征是怎么来的?其实这些维度(特征)也是我们人为定义的,我们会把区分度较高的一些特征选择出来作为向量的维度,将这些特征的得分塞到所对应的维度中去,在这里可以给大家看看大概是如何定义向量的特征维度的:
定义特征维度
我截取了一段代码,这是一段配置文件,我们首先看domain,这里定义了用下面这些特征维度的类别,可以看到有weather类(天气类)、remind类(提醒类)、sysprofile类(系统画像类)等等,也就是你想决策的类别都可以配置进来。group_type我们可以暂且先不用管,然后后面就是feature项,feature项就是我们人为所选出的特征维度,这个group中定义的特征项有CONFIDENCE,这个表示query-reply relevance,也就是回复的相关度;QUALITY,表示这个类别是否有reply,返回值为0或者1;SLOTS表示这个query命中的槽位数;KEYWORDS,表示关键词的数量;SHORT_TERM_INTEREST,表示用户的短期兴趣,看最近是否访问服务,初始值为1,按照轮次来进行衰减。LONG_TERM_INTEREST,表示用户的长期兴趣,也可以理解成用户的习惯。INTENT,这个表示决策之前粗分类的得分;DIF_INTENT,表示命中意图分类得分与其他类别最大意图得分的差值。SLU_SCORE,表示Parser命中槽位的加权得分。SLU_RATIO,表示parser命中字数的比例,关于parser的内容,我之前有写过一篇博文语义解析Parser用户手册专门有介绍过;HIT_PATTERN,表示是否命中某种固定模式,输出的值为0或者1。这就是这些特征的解释,当然这些也是我们人为挑选的一些特征,这些特征也是具有这些类别代表性的一些特征,当然选择特征的时候,我们可以选择自己人为有代表性的有区分度的特征来进行决策。说完这些,我们再来看看后面的这个pooling,这个NO_POOLING表示不共享维度,不共享维度表示每个类别都有自己独享的维度,因为有些类别区分度并不高,如果共享维度的话,就很难区分出来,这里说的不共享维度,举个栗子,这里有5个domain和11个feature,那么维度就是5*11=55,在输出的向量中1-11维代表天气的特征,12-22表示提醒类的特征以此类推,其他维度全部填0,所以得到的天气向量只会在1-11维有值后面的44个维度值都为0。除了这些之外,我们为了区分一些难以区分的类别,我们还在向量的末尾添加一些独立的additional feature来区分一些容易混淆的类别。
在我们决策之前,我们需要准备数据呀,要准备好LightGBM能够识别的数据格式,在这里我先来大概演示一下如何获取LightGBM能够识别的格式的数据。首先我们需要大量的语料是吧,语料是从我们智能语音交互系统的中控中获取到的。我这里就举个栗子,不方便放出所有的语料了:
语料栗子
如图所示,第一列表示某一个类别的语料,然后table之后写入这个类别代表的标签,最后一列是userID,其中最重要的是语料和所对应的标签,这个过程可能需要人工标注。然后我们将这个放入我们的中控跑结果,可以从中控的日志中得到如下结果:
结果日志
我们可以看一下中控跑出来的结果日志,中控把相对应的特征值塞入到了对应的维度上,有的朋友就懵逼了,怎么我7条语料跑出了28条日志,这里我解释一下,系统会随机给语料标注几个标签来出一个负类的结果,因为我们后面要用到binary classification,所以标签只有1和0,仔细看看数据,在语料标注错误的标签的时候,后面的第一位就是0,如果语料对应的标签是正确的话,那么后面第一位标签位就是1,表示正类,这样一来我们正负语料就是1:3的比例,方便我们后续的训练。当然这个格式的数据不能直接用于训练的,因为LightGBM不能处理中文数据,我们需要的是从label位开始的数字数据,所以我们需要的是将标签位前面的数据都去掉,去掉之后就是前面贴出来的数据格式的图片。
我这里用的LightGBM是微软开源的,我们可以直接拿上面的数据跑里面的python文件,就拿advanced_example.py为例,我们可以训练出LightGBM模型:
我们可以跑advanced_example.py,但是我们需要修改一下里面的参数,这是我设置的参数,如何调参,我们稍后再说:

params = {
    'boosting_type': 'gbdt',
    'objective': 'binary',
    'metric': 'binary_logloss',
    'num_leaves': 63,
    'num_trees' : 100,
    'learning_rate': 0.1,
    'feature_fraction': 0.8,
    'bagging_fraction': 0.8,
    'bagging_freq': 5,
    'verbose': 0
}

跑完这个LightGBM之后,会同时生成3个文件model.txt、model.json、model.pkl,我们一起来看看model.txt文件,里面是100棵树,还有我们的一些特征权重等等。我们可以用测试语料看看这个模型的准确率和召回率:

./lightgbm config=predict.conf

用的是以上的命令,但是我们需要把我们生成的model.txt文件和我们的测试语料配置进predict.conf中去,执行完predict操作之后,就会生成一个预测结果LightGBM_predict_result.txt ,我们将这个预测的结果和我们的测试语料进行比较,可以得到如下的结果:
预测结果
可以看到正类和负类的准确率和召回率都还是比较高的,可以看出这个LightGBM训练出的决策模型还是比较好的。整个过程就是通过决策树模型的总和和非零的类别特征,得到一个模型得分,这个得分就是num_trees个决策树得分的总和,最后出一个得分最高的类别作为决策的结果输出。
最后我们来说一说调参,调参也是决策过程中很重要的一部分,一般来说,我们用LightGBM官方数据就可以训练出一个优秀的模型,可以在官方给的参数附近进行微调,可以让模型的效果更佳,判断一个模型是否优秀,我们可以通过正负类的准确率和召回率来衡量。下面我来说一下几个常用的参数如何调优:

  1. num_trees:这个表示决策树迭代的次数,在训练过程中,我设置的默认值为100,一般来说,num_trees太小的情况下,迭代次数不足,容易出现欠拟合;num_trees太大的时候,迭代次数过多,容易出现过拟合的状态。在实际的调参的情况下,num_trees需要和学习率learning_rate综合考虑。
  2. learning_rate:学习率,也称作步长,表示每一个弱学习器的权重缩减系数,一般默认为0.1,也可以从一些小的数值开始调,结合num_trees一起来调优。
  3. num_leaves:最大的叶子节点数,通过限制num_leaves,算法会在最大叶子节点数内生成最优的决策树,防止过拟合。

除了上述的这些参数,还有一些参数可以参考LightGBM的官方文档的默认值,在默认值的左右进行参数调优就可以了。以上就是整个运用LightGBM来进行决策的整体流程,希望可以对大家对LightGBM的理解和运用有所帮助,本人能力有限,文中如有纰漏,请各位朋友不吝指教,如有转载,也请标明出处,谢谢。

猜你喜欢

转载自blog.csdn.net/Oscar6280868/article/details/81455709