数据很重要。比如在异常检测的情况下,必须特别注意要分析的数据,因为有效的异常检测活动是以训练数据中不包含所寻找异常为前提的。此外,根据GIGO(garbage in,garbage out)原则,输入的数据如果是垃圾,输出的也会是无效的信息,换句话说,如果训练数据与正在调查的异常有偏差,则异常检测的结果可能不再具有可靠性。
另外,随着数据量的激增,怎么对原始数据做初步清理也是非常重要的工作,只有做好了预处理,才能消除不相关或者冗余的信息。将恰当处理后的数据以正确的形式提供给模型,才能最大限度利用数据。比如,输入数组如果是分组的形式或者能够线性分离,那么使用分类算法就可以识别出更具代表性的模型。而如果数据处理得不好,比如存在包含空字段的变量,那么就会增加算法的计算量,而且由于维数灾难从而产生不可靠的预测模型。
在另一方面,样本的数量和质量同样重要。相比于使用一般的、公开的数据集,创建蜜罐来收集符合自身环境的样本更有用,因为它更能代表本组织暴露出的风险水平。同样,这还会存在一个问题,就是样本分布不均匀,即大部分样本是良性的,只有少出是恶意的,如果直接将这种数据喂给模型,则训练出的模型的预测会偏向数量较多的样本类别,但实际上,我们更关心的却是数量更少的样本类别。
要选择对训练数据之外的泛化最佳的算法,从而在面对新数据时获得最佳的预测。如果仅仅是不断优化算法对训练数据的预测精度,只会导致过拟合,也就是说当面对新数据时,测试结果会变得更糟。所以正确地进行算法训练很重要,比较简单可行的通常有两种方式:1.将训练数据按照一定的比例拆分成训练集和测试集;2.使用交叉验证,将训练数据划分成一定数量的子集,在这些子集上训练算法并计算所得的平均值。
我们经常会提到一句话“让数据自己说话”,实际上,数据自己是不会说话的。原始数据仅仅是碎片化的信息,为了理解原始数据,我们必须借助模型来区分信号和噪声。对于AI而言,一般采用特征间的数学关系来建立模型,根据分析目的的不同,同样的原始数据可以展现出其代表的不同方面和不同功能。为了将原始数据用于模型,就需要对其进行适当地处理,使其成为模型的特征,这便是我们所说的特征工程。选择特征的数量和质量是至关重要的。
将原始数据转换为特征的最常见的转换包括:
1.数据二值化
原始数据计数大于0时赋值为1,否则赋值为0.这种方式可以获得更有效、更稳健的度量。
2.数据分箱
数据分箱简单说就是将连续变量离散化。一般在建立分类模型时,需要对连续变量离散化,特征离散化后,模型会更稳定,降低了模型过拟合的风险。
3.数据的对数变换
这可以减少原始计数的量级。这可以精确地减少较大值的相关性,同时方法较小值,从而使数据分布更加均匀。除了对数外,还可以使用其他幂函数,他们可以保证数据分布方差的稳定性(如Box-Cox变换)
数据归一化:也称为特征归一化或特征缩放,可以改进算法的性能,减少这些算法受输入值范围的影响。
常见的特征归一化有:
1.最小-最大缩放:可以让数据落在有限范围内:0-1
使用以下公式计算的值来替换原始值xi,实现数据转换:
Min-max-scaling(x) = (xi-min(X))/(max(X)-min(X))
其中,min(X)和max(X)分别表示整个分布的最小值和最大值
2.方差缩放
从每个xi值中减去分布的均值,然后将所得结果除以分布的方差,归一化后,重新计算的数据的分布显示为均值为0,方差为1
缩放公式如下
Standardization(x)=(xi-mean(X))/sigma
原始数据可能存在非数字值的分类变量,怎么处理分类变量呢
很明显,我们需要以数据方式对其进行处理,采用某种形式的类别转换将其变为数值,这个过程我们叫做编码。常见的方法如下
1.序号编码
就是为每个类别赋予一个累进值。比如对于原标签为低、中、高三类,我们可以赋予编码1,2,3.
这种方式的有点在于转换后的值在数字上是有序的,缺点是这种顺序实际上没有意义。
2.独热编码:将一组比特赋予一个变量,每个比特代表一个不同的类别。
3.哑编码:
相比而言,独热编码浪费了一个比特
评估分类器的性能
先来看看混淆矩阵
我们可以计算下面这些指标:
灵敏度=召回率=命中率=TP/(TP+FP):度量正确标记的比率,代表着真阳性(TPR)
误报率(FPR)=FP/(FP+TN):FPR也可以用1-特异度计算
分类准确率=(TP+TN)/(FP+TP+FN+TN):表示观测值中正确分类的百分比
分类错误=(FP+FN)/(TP+FP+TN+FN):表示错误分类率
特异性=TN/(FP+TN):表示正确标记的阴性的比例
精确度=TP/(TP+FP):度量预测的阳性中有多少是真正的阳性
F度量=2x(精确度x召回率)/(精确度+召回率):表示精确度和召回率的加权调合平均值。F的取值范围为0~1,0最差,1最好
最常见的比较分类器性能的方法就是ROC了,它描述的是每个分类器的TPR和FPR之间的关系,如下所示
很明显,最好的分类器对应的曲线应该是x=0,y=1。即最好的分类器能正确地识别所有正例而不会产生误报,这意味着FPR=0,TPR=1
而如果分类器是随机进行预测的话,其曲线就是(0,0),(1,1)对应的对角线上
所以不同分类器的性能比较就是比较其对应曲线偏离最佳分类器曲线的程度
如果要进一步定量比较,则可以引入AUC,其值在0~1
随机分类器的AUC为0.5,所以其他分类的AUC应在0.5到1之间。如果某个分类器的AUC小于0.5,则表示该分类器的性能比随机分类器还要差
此外,还可以用Brier分数来评估各个分类器估计概率的质量,它可度量估计概率与实际值之间差值的平均值
BS的值取值为0~1,BS值越小表示概率估计越准确
算法的目的是通过对训练样本进行泛化地学习以做出正确的预测。所有算法的泛化误差都可以用下式表示:
泛化误差=偏差+方差+噪声
偏差是指算法在进行预测时产生的系统误差,方差是指算法对分析数据变化的灵敏度,噪声表示分析数据的不可去除的成分。一般来说,较低复杂度的分类器会有较高的偏差和较低的方差。通过增加训练数据集的量可以减小方差。