有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。所以特征工程的目的是最大限度地从原始数据中提取特征, 以供算法和模型使用。
特征类型
- 普通离散特征
职业, 婚姻状态等, 同常枚举值不超过100个. - id类特征
如淘宝上的活跃卖家, 可能就上千万了. - 连续实值特征
即 continuous real-valed feature.
如 身高,体重.
tf中的特征处理
见参考[3].
诸如 连续值按区间边界分桶
, string枚举值分配整数id
, 还有对稀疏高维特征做 embedding
等.
清洗
特征交叉
figure gif动图, 描述特征交叉
一般用在LR中. LR只有线性的表达能力, 所以做特征交叉可以额外获得一些非线性表达.
如在个性化推荐中, 将用户的年龄离散化成10个档, 用户的性别又是2个档, 彼此交叉后就有了额外的20个特征.
采样
为了让样本均衡, 可以对某些类别的样本做欠采样或过采样处理.
欠采样
undersampling.
以一定的概率采样.
过采样
oversampling.
重复采样.
数据变换
离散化
分布律如图所示.
- 等频划分
划分后, 图中每档的面积相同, 即每档的人数相同. 建议使用maxcompute的percentrank()
函数, - 等宽划分
对横坐标按照固定间距p进行划分, 即第一档为[a,a+p), 第二档为[a+p,a+2p)
正规化
见参考[2]
指定列的正规化
正规化, Normalization, 又叫归一化.
它会改变原有数据的分布, 使之落入一个小的特定区间.
他会将原有数据转化为无量纲的纯数值, 便于不同单位的指标进行比较.
在多指标评价体系中,由于各评价指标的性质不同,通常具有不同的量纲和数量级。当各指标间的水平相差很大时,如果直接用原始指标值进行分析,就会突出数值较高的指标在综合分析中的作用,相对削弱数值水平较低指标的作用。因此,为了保证结果的可靠性,需要对原始指标数据进行标准化处理。
- min-max标准化
KaTeX parse error: Got function '\min' with no arguments as subscript at position 15: x^*=\frac{x-x_\̲m̲i̲n̲}{x_\max-x_\min…
结果落入[0,1]之间.
这种方法有一个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义。 - log函数转换
x ∗ = log 10 x l o g 10 max x^*=\frac{\log_{10} x}{log_{10}\max} x∗=log10maxlog10x - z-score标准化
最常见的标准化方法就是Z标准化,也是SPSS统计软件中最为常用的标准化方法.
x ∗ = x − μ σ x^*=\frac{x-\mu}{\sigma} x∗=σx−μ
其中μ为所有样本数据的均值,σ为所有样本数据的标准差。
向量的正规化
把一个向量转化为单位向量, 即为向量的正规化.
正规化的好处是, 计算 a,b 的cosine similarity, 只算 dot product 就可以了.
a
=
(
x
1
,
x
2
,
.
.
.
,
x
n
)
a=(x_1,x_2, ... , x_n)
a=(x1,x2,...,xn)
a
′
=
(
x
1
∣
a
∣
,
x
2
∣
a
∣
,
x
n
∣
a
∣
)
a'=(\frac {x_1}{|a|} , \frac {x_2}{|a|}, \frac {x_n}{|a|} )
a′=(∣a∣x1,∣a∣x2,∣a∣xn)
原向量为a, 正规化后的单位向量为a’.
python 代码见下:
# 向量的正规化
import numpy as np
def normalize(v):
norm=np.linalg.norm(v)
if norm==0:
return v
return v/norm
对数变换
对数据做平滑处理时可以用到. 待补充.
-
l o g 2 ( 1 + x ) log_2(1+x) log2(1+x)
经过的点有 (0,0),(≈30, ≈5),(≈128, ≈7),(≈255, ≈8),(≈512, ≈9), (≈1023, ≈10),(≈33000,≈15.00) 等
-
y = 1 l o g 2 ( 1 + x ) y=\frac1{log_2(1+x)} y=log2(1+x)1
搜索排序评价指标ndcg会用到.
令定义域x>=1, 经过的点 (1,1),(≈2, ≈0.62),(≈3, ≈0.5),(≈4, ≈0.43),(≈10, ≈0.29) .
-
y = l o g 2 x y=log_2x y=log2x
经过的点有 (1,0),(2,1)等
参考
- 使用sklearn做单机特征工程
- 皮皮blog的 数据标准化/归一化normalization
- tf中的特征处理, tf.feature_column