今天这篇文章介绍下数据标准化,也算是模型里一个很重要的内容。
WOE
先来介绍WOE,是信贷评分模型里经常会用到的一种编码转换方式。
WOE即证据权重,如果大家有评分卡开发经验,一般都会知道这种编码形式,这也是在逻辑回归里比较常用的编码方式。
WOE的计算公式是:
WOE=ln[(违约/总违约)/(正常/总正常)]。
(关于woe还有很多内容,后续再跟大家好好分享这个知识点)
在传统的评分卡开发里,经常将logistic回归模型转化为标准评分卡格式,WOE是对原始自变量的一种编码形式,要对一个变量进行WOE编码,需要首先把这个变量进行分组处理(也叫离散化、分箱)。
WOE编码后变量就有了某种标准化的性质,也就是说,自变量内部的各个取值之间都可以直接进行比较(WOE之间的比较),而不同自变量之间的各种取值也可以通过WOE进行直接的比较。
而且逻辑回归经过特定的转换后,每个变量跟Y(这里的Y是log(p/1-p))之间又可以用线性来表达。而且能将异常值顺带处理了,所以在传统的评分卡建模里,经常需要用woe对变量进行处理。
本篇文章,当然不仅只是提到于对变量进行woe的转换,因为在机器学习里,对变量处理经常使用其他方式的处理方式:标准化处理。
为什么要进行标准化处理:
-
使不同的特征变量具有相同的尺度,比如影响评分模型数据里,年龄的范围是0-100岁,收入的范围是0-100万+,这个完全不是同个数量级别的,不能同时进入模型;
-
能够加速权重参数的收敛,浅白点说就是能很快求到最优解,不用绕很多弯。
-
简而言之:对数据标准化的目的是消除特征之间的差异性
大家主要记住上面三条重要结论就行了,如果需要更深入的了解,请看中间剖析更深入的地方,如果不想看,直接跳过。剖析之后也有资源+视频+代码指导大家练习。
------------开始部位,就等着你不看(#.#)-------------
这一部分涉及的内容比较比较羞涩难懂,如果没有兴趣看,就知道跳过,不影响后面的内容。
其实我这里,是把标准化跟归一化混在一起了,其实如果深究起来,他们还真的是不同的概念。
不过为了方便大家的记忆,快速进入模型领域,我暂且把他们都称为数据标准化,只不过归一化只是把值锁定在0到1的区间里而已,下面的文字里,帮大家理清楚两者的区别。
归一化跟标准化的计算方法:
归一化跟标准化
不同:
归一化:缩放仅仅跟最大和最小值的差别有关
标准化:缩放和每个点都有关系,他的值主要是通过方差体现出来的
所以两者是数据的缩放不同,从输出的范围来看,归一化理论上输出值范围不会受到范围的限制,不过其值还是会在特定狭窄的范围内。
相同:
从上图的推导来分析
- 归一化和标准化都是一种线性变换
- 归一化跟标准化都不会改变原始数据的数值排序
什么时候用归一化,什么时候用标准化?
如果对输出结果必须限定在0跟1之间,用归一化
如果数据存在异常值比较少,用归一化
如果存在比较多的异常点,用标准化
-----------------------------到此为止---------------------------
为了帮助大家理解,来点代码实操会更好点:
from sklearn import preprocessing
a = np.array([[21, 3.5, 4.6],
[-150, 6, -6],
[150, 52, 100]], dtype=np.float64)
print(a)
print(preprocessing.scale(a))
在python里运行以上代码,先看下用标准化处理后,数据有什么不同:
可以看到用的preprocessing处理数据后,之前跨度很大的数据都会压缩一定的范围内。
这里你需要用到python去练习这段代码,如果你还没用过python,请用我下面的链接下载。当然你也可以上去官网下载。为了方便广大同学,已经上传到网盘里。
练习前大家需要进行工具的下载使用,推荐anaconda:链接:
https://pan.baidu.com/s/1e5pfZM72K_T4E32hqR6q9A 提取码:gwyx
下面给个简易模型来进行训练,代码如下:
from __future__ import print_function
from sklearn import preprocessing
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets.samples_generator import make_classification
from sklearn.svm import SVC
import matplotlib.pyplot as plt
X,y=make_classification(n_samples=300,n_features=2 , n_redundant=0, n_informative=2,
random_state=22, n_clusters_per_class=1, scale=100)
plt.scatter(X[:, 0], X[:, 1], c=y)
plt.show()
X = preprocessing.scale(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.3)
clf = SVC()
clf.fit(X_train, y_train)
print(clf.score(X_test, y_test))
十年职场生涯,这个长期混迹在风控界和科技界,摸爬滚打的大叔,曾经就职于全国最大的固网运营商平台、国内最大的ERP软件公司和一家老牌的互金公司,如果你想了解他,欢迎关注 “番茄风控大数据”一起学习一起聊!