数据处理
刘建平博客 https://www.cnblogs.com/pinard/ 强烈推荐
尽量不错过一个可能有用的特征,但是也不滥用太多的特征。
1.1 筛选-合适的特征数据
1) 过滤
按照特征的指标,如发散性/相关性,对各个特征评分,设定阈值,选择合适特征。
eg. 方差,相关系数,卡方检验,互信息
2) 包装
根据目标函数,预测效果评分,每次选择部分特征,或者排除部分特征。
eg. 递归消除特征法(RFE), 使用机器学习模型进行多轮训练,每轮训练后,消除若干权值系数的对应特征,再基于新的特征集进行下一轮训练。
3) 嵌入
类似过滤法,但是通过机器学习训练来确定特征的优劣,先用算法训练,得到各个特征的权值系数,根据权值系数从大到小来选择特征。
eg. L1/L2正则化, 基学习器LR,选择特征系数较大的特征。正则化惩罚项越大,模型系数越小, 一部分特征系数会先变成0,筛掉。或使用决策树/GBDT
1.2 寻找-高级数据特征
寻找高级特征是模型优化的必要步骤之一。第一次建模时,可以先不寻找高级特征,得到基准模型后,再寻找高级特征进行优化。聚类的时候高级特征尽量少一点,分类回归的时候高级特征适度的多一点。
常用的方法有:
特征加和:假设希望根据每日销售额得到一周销售额的特征。可以将最近7天的销售额相加。
特征之差:假设已有每周销售额及每月销售额,可以求一周前一月内的销售额。
特征乘积:假设已有商品价格和商品销量,可以得到销售额。
特征除商:假设已有每个用户的销售额和购买的商品件数,可得到该用户平均每件商品的销售额。
1) 缺失值处理(sklearn的preprocessing.Imputer)
连续值:平均值/中位数
离散值:高频率类别值
2) 特殊的特征处理
很多,如时间->差值(连续)/分段(离散)/权重,地理位置->经纬(连续)/城市区(离散)
3) 离散特征的连续化处理
one-hot;
特征嵌入embedding,类似降维 tf.nn.embedding_lookup
4) 离散特征的离散化处理
one-hot, dummy coding
5) 连续特征的离散化处理
根据阈值分组;
GBDT转化为one-hot码,GradientBoostingClassifier
3.1归一化
z-score: (x-mean)/std,均值0,方差1,最常见
max-min: (x-min)(b-a)/(max-min)+a ->[a,b],离差标准化
L1/L2范数:x->/||x->||2,x-> 每个样本特征向量, ||x->||2对应的的L2范数
3.2异常样本清洗
1)聚类
KMeans聚类将训练样本分成若干个簇,如果某一个簇里的样本数很少,且簇质心和其他所有的簇都很远,那么这个簇的样本极有可能异常。
2)异常点检测
使用iForest或者one class SVM,异常点检测的机器学习算法来过滤异常点。
3.3数据不平衡
1)权重
class weight: 给类加权重,sample weight: 给样本加权重,某类样本少则权重高
2)采样
样本多下采样,样本少上采样,改变了训练集分布,可能导致泛化能力差。
SMOTE算法,人工合成来生成少类别的样本。随机找出几个该类别的样本,再找出最靠近这些样本的若干个该类别样本,组成一个候选合成集合,然后在这个集合中不停的选择距离较近的两个样本,在这两个样本之间,比如中点,构造一个新的该类别样本。imbalance-learn的SMOTEENN