spark的ml中已经封装了许多关于特征的处理方式:
极大方便了我们在做数据预处理时的使用。
但是这明显不够,在机器学习的领域中,还有许许多多的处理方式,这些都没有存在于feature包中。
那要如何去实现?
比较简单的方式:spark ml本质上就是对dataframe的操作,可以在代码中处理df以实现该功能。
但是实际应用中发现,这样的方式并不好用,我们所做的处理,纯粹是对df的转换提取等操作,这个过程无法进行落地,也无法加入pipeline做重复训练。
所以,我采用了另一种方式:基于saprk源代码开发
首先介绍一下本次想要实现的功能:WOE
woe的计算逻辑:
计算的逻辑还是比较清楚的,公式如下:
其中 i为数据离散后的组,good i 和 bad i 对应该组好坏的个数, good all 和bad all 对应好坏的总数。
编写代码:
对于woe转换的功能,有如下参数:
- 输入字段:哪些字段需要做woe转换
- 输出字段:字段做woe转换之后的新列名是什么
- 标签列:label列的列名
- 正类: positiveLabel 确定 1 为 good ,还是 0 为 good
1、自定义一个代码接口
方便transform和transformModel共同使用
trait woeTransformParams extends Params with HasInputCols with HasOutputCols with HasLabelCol{
val positiveLabel: Param[String] = new Param(this,"positiveLabel","positiveLabel you want to choose",ParamValidators.inArray(Array(woeTransform.one,woeTransform.zero)))
def getPositiveLabel = ${positiveLabel}
}
2、编写woeTransform
继承Estimator抽象类,实现copy,transformSchema,fit方法。
- fit方法会生成一个代理df,并通过该代理df生成model。在使用该model进行转换的时候,实际上就是使用代