特征工程
特征工程
More data beats clever algorithms, but better data beats more data.
类型特征
特点
- 很多种类的话,数值会变得很稀疏
- 很难填空值
One Hot编码
- 可以被大多数线性算法使用
- 稀疏格式对于内存友好
- 大多数处理方法不能友好的对待缺失值以及新类别
哈希编码
- 例子
-
如果发生碰撞姐,就使用不同编码的值CONCAT在一起
-
可以优雅的处理新变量
Label encoding
- 为每个变量赋予唯一的数字ID
- 对非线性算法很有用
- 不增加维度
Count encoding
- 将类别特征替换为训练集中的计数
- 对线性和非线性算法均有用
- 可能对异常值敏感
- 可以添加对数转换,可以很好地处理计数(主要针对count编码之后特征分布不规则的问题和常规处理不规则分布的连续特征一样的方式)
- 可能会产生冲突:相同的编码,不同的变量
- 用计数没有没有见过的类别 ‘unseen’:N
例子:
Label count encoding
就是对count编码进行排名
- 通过训练集中的技术对变量分类进行排名
- 对线性和非线性算法均有用
- 对异常值不敏感
- 不会对不同的变量使用相同的编码
目标编码
- 按照目标的比率对分类变量进行编码
- 如果是多分类其实也可以编码,例如类别A对应的标签1有100个,标签2有100个,标签3有100个,则可以编码为【1/3,1/3,1/3】)
- 注意避免过拟合!(原始的target encoding直接对全部的训练集数据和标签进行编码,会导致得到的编码结果太过依赖与训练集)
- 堆叠形式:输出平均的目标的单变量模型
- 以交叉验证的方式进行(一般会进行交叉验证,比如划分为10折,每次对9折进行标签编码然后用得到的标签编码模型预测第10折的特征得到结果,其实就是常说的均值编码)
- 添加平滑以避免将变量编码设置为0。
- 添加随机噪声以应对过拟合
- 正确应用时,线性和非线性的最佳编码
Category Embedding
- 使用神经网络根据分类变量创建密集的嵌入。
- 将分类变量映射到欧几里得空间
- 更快的模型训练。
- 更少的内存开销。
- 可以提供比1热编码更好的精度。
- Entity Embeddings of Categorical Variables(回头补充到类别编码的内容里)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jPj07m24-1571304683430)(特征工程.assets/1571281967666.png)]
空值编码
- 空值计数
- NaN值可以保存信息
- 注意避免过度拟合!
- 仅当nan值在训练集测试集中的NaN值是由相同的值引起的,或者当局部验证证明它可以保留信息时才使用(这里涉及到缺失值的缺失原因,比如客户处于某种不好的目的而故意不提供的情况下表示客户的某种不良的潜在行为则可以统一使用)
多项式编码
- 编码分类变量之间的交互
- 没有交互作用的线性算法无法解决XOR问题
- 多项式编码可以解决XOR
- 扩展功能空间:使用FS,哈希和/或VW
扩展编码
- 从单个变量创建多个类别变量
- 一些高基数功能(例如用户代理)在其中包含更多信息:
- is_mobile?
- is_latest_version?
- Operation_system
- Browser_build
合并编码
- 将不同的分类变量映射到同一变量
- 拼写错误,职位描述略有不同,全名或缩写
- 真实数据混乱,自由文本尤其如此
连续特征
连续特征的特征
- 可以更轻松地输入算法
- 可以构成浮点数,计数,数字
- 更容易做缺失值插补
四舍五入
- 舍入数值变量
- 保留数据的最重要特征。
- 有时精度太高只是噪音
- 舍入变量可以视为分类变量
- 可以在四舍五入之前应用对数转换
分箱
- 将数值变量放入bin并使用bin-ID进行编码
- 可以通过分位数,均匀地务实地设置分箱,或使用模型找到最佳分箱
- 可以与超出训练集的范围的变量正常配合
标准化
- 将数字变量缩放到一定范围
- 标准(Z)缩放 standard scaler
- MinMax 标准化
- root scalin(这是啥。。。)
- log 变换(log变换是box cox变换的特例)
缺失值插补
- 估算缺失变量
- 硬编码可以与插补结合使用
- 平均值:非常基础
- 中位数:对异常值更健壮
- 忽略:只是忽略问题
- 使用模型:会引入算法偏差
连续特征的交互
- 编码数值变量之间的相互作用
- 尝试:减法,加法,乘法,除法(还有更骚的,指数。。。)
- 使用:通过统计测试选择特征,或训练模型特征的重要性,用于特征的筛选(这种方法很容易得到噪声,所以噪声特征也要注意筛选掉)
- 忽略:有时候违背直觉的计算反而可以显着改善模型的训练效果!
线性算法的非线性编码
- 硬编码非线性以改善线性算法(hash、各类embedding等)
- 多项式编码
- Leafcoding(随机森林嵌入)(acebook的gbdt+lr这种思路)
- 遗传算法(典型代表gplearn)
- 局部线性嵌入,频谱嵌入,t SNE (降维提取重要特征)
按照行计算统计值
- 在一行数据上创建统计信息
- NaN的数量,这个在拍拍贷的top解决方案上看到过,不过实际效果不稳定
- 0的数量
- 负值数量
- 平均值,最大值,最小值,偏度等。
时间特征
- 时间特征,例如日期,需要更好的局部验证方案(如回测)
- 容易在这里犯错误
- 能够给模型效果带来很多好的提升
投射到一个圆圈
- 将单个要素(例如day_of_week)转换为圆上的两个坐标
- 确保最大和最小之间的距离与最小和最小+1相同。
- 用于day_of_week,day_of_month,hour_of_day等。
趋势编码
简单说就是根据时间序列来计算某段时间的一些统计值,比如对总支出进行编码,例如:在上周支出,在上个月支出,在去年支出。这个也是比较常见的方法。
事件编码
- 硬编码分类功能,例如:date_3_days_before_holidays:1
- 尝试:国定假日,重大体育赛事,周末,每月的第一个星期六等。
- 这些因素可能对消费行为产生重大影响。
空间编码
- 空间变量是对空间中的位置进行编码的变量
- 示例包括:GPS坐标,城市,国家/地区,地址
位置编码
- 克里格(这是啥。。。)
- K-均值聚类
- 原始纬度
- 将城市转换为经度
- 在街道名称中添加邮政编码
相邻编码
- 查找当前位置与重要地点之间的距离
- 小城镇继承了附近大城市的某些文化/背景
- 电话位置可以映射到附近的企业和超市
位置所反应出来的欺诈行为
- 位置事件数据可以指示可疑行为
- 不可能的旅行速度:在不同国家/地区同时进行多项交易
- 花费在与住所或送货地址不同的城镇
- 从未在同一地点消费
数据探索
- 数据探索可以发现数据质量问题,异常值,噪声,要素工程构想,要素清理构想。
- 可以使用:spyder,jupyter notebook,pandas
- 尝试简单的统计信息:最小值,最大值
- 合并目标,以便找到信息之间的相关性。
迭代/调试
- 特征工程是一个迭代过程:使您的管道适合于快速迭代。
- 使用亚线性调试:输出有关过程的中间信息,进行伪记录。
- 使用允许快速实验的工具与方法
- 失败的想法多于行之有效的想法
标签特征
- 可以将标签/目标变量/因变量视为数据的特征,反之亦然。
- 对数转换:y-> log(y + 1)| exp(y_pred)-1
- 平方变换
- Box-Cox变换
- 创建一个分数,把二分类问题转化为回归问题。
- 训练回归器预测测试集中不可用的特征。
自然语言处理
- 可以使用来自分类功能的相同想法。
- 深度学习(自动特征工程)正在逐渐占领这一领域,但是具有精心设计的特征的浅层学习仍然具有竞争力。
- 数据的稀疏性使您进入“维数的诅咒”
- 很多挖掘出好特征的机会: