一、预处理
在数据预处理过程主要考虑两个方面,如下:
- 选择数据处理工具:关系型数据库或者Python;
- 查看数据的元数据以及数据特征:一是查看元数据,包括字段解释、数据来源等一切可以描述数据的信息;另外是抽取一部分数据,通过人工查看的方式,对数据本身做一个比较直观的了解,并且初步发现一些问题,为之后的数据处理做准备。
注意:建模、做特征前要将字段解释、数据来源了解得滚瓜烂熟。
再用data.describe() 抽取一部分数据通过人工查看,进一步分析。
二、清洗异常样本数据
2.1 格式内容错误数据清洗
一般情况下,数据是由用户/访客产生的,也就有很大的可能性存在格式和内容上不一致的情况,所以在进行模型构建之前需要先进行数据的格式内容清洗操作。格式内容问题主要有以下几类:
- 时间、日期、数值、半全角等显示格式不一致:直接将数据转换为一类格式即可,该问题一般出现在多个数据源整合的情况下。
- 内容中有不该存在的字符:最典型的就是在头部、中间、尾部的空格等问题,这种情况下,需要以半自动校验加半人工方式来找出问题,并去除不需要的字符。
- 内容与该字段应有的内容不符:比如姓名写成了性别、身份证号写成手机号等问题。
2.2 逻辑错误清洗
主要是通过简单的逻辑推理发现数据中的问题数据,防止分析结果走偏,主要包含以下几个步骤:
- 数据去重。
- 去除/替换不合理的值。
- 去除/重构不可靠的字段值(修改矛盾的内容)
2.3 去除不需要的数据
一般情况下,我们会尽可能多的收集数据,但是不是所有的字段数据都是可以应用到模型构建过程的,也不是说将所有的字段属性都放到构建模型中,最终模型的效果就一定会好,实际上来讲,字段属性越多,模型的构建就会越慢,所以有时候可以考虑将不要的字段进行删除操作。在进行该过程的时候,要注意备份原始数据。
2.4 关联性验证
如果数据有多个来源 (打通平台),那么有必要进行关联性验证,该过程常应用到多数据源合并的过程中,通过验证数据之间的关联性来选择比较正确的特征属性。
- 比如:汽车的线下购买信息和电话客服问卷信息,两者之间可以通过姓名和手机号进行关联操作,匹配两者之间的车辆信息是否是同一辆,如果不是,那么就需要进行数据调整。
三、数据不均衡
PS:工作中可能遇到的最大的问题是数据不均衡。 怎么去解决的? 上采样、下采样、SMOTE算法。 解决的效果如何? 有一点点改进,但不是很大。
事实上确实如此,很多时候即使用了上述算法对采样的数据进行改进,但是结果反而可能更差。在业界中,对数据不均衡问题的处理确实是一件比较头疼的问题。最好的处理方法还是:尽可能去获得更多的那些类别比较少的数据。
3.1 数据不平衡
3.2 对多数类别样本删除
3.2.1 解决方案一 —设置损失函数的权重
设置损失函数的权重,使得少数类别数据判断错误的损失大于多数类别数据判断错误的损失,即当我们的少数类别数据预测错误的时候,会产生一个比较大的损失值,从而导致模型参数往让少数类别数据预测准确的方向偏。可以通过scikit-learn中的class_weight参数来设置权重。
3.2.2 解决方案二—下采样/欠采样
下采样/欠采样(under sampling):从多数类中随机抽取样本从而减少多数类别样本数据,使数据达到平衡的方式。
集成下采样/欠采样:采用普通的下采样方式会导致信息丢失,所以一般采用集成学习和下采样结合的方式来解决这个问题;主要有两种方式:
1、EasyEnsemble 采用不放回的数据抽取方式抽取多数类别样本数据,然后将抽取出来的数据和少数类别数据组合训练一个模型;多次进行这样的操作,从而构建多个模型,然后使用多个模型共同决策/预测。
2、BalanceCascade 利用Boosting这种增量思想来训练模型;先通过下采样产生训练集,然后使用Adaboost算法训练一个分类器;然后使用该分类器多对所有的大众样本数据进行预测,并将预测正确的样本从大众样本数据中删除;重复迭代上述两个操作,直到大众样本数据量等于小众样本数据量。
3.2.2.1 比赛技巧
如果参加一个比赛,我们会在模型训练的时候将数据分成训练集和开发集。模型提交后,比赛方会提供测试集对结果进行预测。 一般来说我们训练集上的模型评分会在86 ~ 88%左右,开发集上的评分为82 ~ 84%,但是到了实际的测试集上,模型评分可能只有72%左右。 技巧: 1、一般来说测试集的数据是不带标签的,但是测试集依然有特征X。 2、我们都不考虑训练集和测试集的目标Y,人为创建一列目标值Z,将训练集中的Z都设为0,将测试集的目标Z都设为1。 3、寻找测试集的X和Z之间的映射。 4、根据这个X和Z之间的映射,使用训练集中的X预测Z,结果肯定是组0,1向量。 5、将预测值为1的数据提出来,作为我的开发集(用来验证我们模型的数据集合),剩下预测为0的数据作为训练集。在这个基础上对我的训练数据进行调优。
这是一个在不做任何特征的情况下对模型调优的一个技巧,一般可以将模型在真实环境中的评分提高一点点。大概72%提高到74%左右。
为什么?实际上我们做训练的目的是为了找一找比赛中人家提供给我们的训练数据和真实数据,哪些长得比较像。将更像真实测试数据的样本放到开发集中作为调参的标准,从而能够提高最终的评分。虽然没有什么科学依据,但是确实比较有效,不登大雅之堂。
3.2.3 解决方案三—ENN
Edited Nearest Neighbor(ENN): 对于多数类别样本数据而言,如果这个样本的大部分k近邻样本都和自身类别不一样,那我们就将其删除,然后使用删除后的数据训练模型。
3.2.4 解决方案四—RENN
Repeated Edited Nearest Neighbor(RENN): 对于多数类别样本数据而言,如果这个样本的大部分k近邻样本都和自身类别不一样,那我们就将其删除;重复性的进行上述的删除操作,直到数据集无法再被删除后,使用此时的数据集据训练模型。
3.2.5 解决方案五—Tomek Link Removal
Tomek Link Removal: 如果两个不同类别的样本,它们的最近邻都是对方,也就是A的最近邻是B,B的最近邻也是A,那么A、B就是Tomek Link。将所有Tomek Link中多数类别的样本删除。然后使用删除后的样本来训练模型。
3.3 对少数类别样本增加
3.3.1 解决方案一—过采样/上采样
- 过采样/上采样(Over Sampling):和欠采样采用同样的原理,通过抽样来增加少数样本的数目,从而达到数据平衡的目的。一种简单的方式就是通过有放回抽样,不断的从少数类别样本数据中抽取样本,然后使用抽取样本+原始数据组成训练数据集来训练模型;不过该方式比较容易导致过拟合一般抽样样本不要超过50%。
- 过采样/上采样(Over Sampling):因为在上采样过程中,是进行随机有放回的抽样,所以最终模型中,数据其实是相当于存在一定的重复数据,为了防止这个重复数据导致的问题,我们可以加入一定的随机性,也就是说:在抽取数据后,对数据的各个维度可以进行随机的小范围变动,eg: (1,2,3) --> (1.01, 1.99, 3);通过该方式可以相对比较容易的降低上采样导致的过拟合问题。
3.3.2 解决方案二—数据合成 (SMOTE)
- 采用数据合成的方式生成更多的样本,该方式在小数据集场景下具有比较成功的案例。常见算法是SMOTE算法,该算法利用小众样本在特征空间的相似性来生成新样本。
- 比如:给少数样本编号,1~100;将1、2样本连起来,取他们的中点(期望),作为一个新的样本。以此类推,最后可以新生成50个样本。用这种算法一次可以提高50%的样本量。
3.3.3 解决方案三—一分类/异常检测
对于正负样本极不平衡的情况下,其实可以换一种思路/角度来看待这个问题:可以将其看成一分类(One Class Learning)或者异常检测(Novelty Detection)问题,在这类算法应用中主要就是对于其中一个类别进行建模,然后对所有不属于这个类别特征的数据就认为是异常数据,经典算法包括:One Class SVM、IsolationForest等。
|