数值型特征工程总结及实现

二值化处理

在一个歌曲数据集中,一个人听歌1000遍,另一个人听歌10遍,我们不能说第二个人的喜欢程度比第一个人的喜欢程度高100倍,这就是需要二值化的小例子

pandas中实现

# 我们定义听过次数大于5为喜欢,二值化完成
listen_count[2] = (listen_count[2] > 5).astype(int)

分箱(区间量化)

个人感觉分箱就是二值化的升级版,将原始数据离散成了不同的数值

固定宽度分箱

我们数据为[27, 44, 73, 47, 27, 6, 72, 80, 67, 44, 23, 98, 28, 54, 93, 41, 3,
99, 51, 64]
我们想0-9为第一个箱子,10-19为第二个箱子.这就是固定宽度分箱

pandas中实现

# 固定宽度为10
data = np.floor_divide(data.values, 10)

固定量级分箱

固定量级分箱和固定宽度分箱其实差不多
比如我们数据为[296, 8286, 64011, 80, 3, 725, 867, 2215, 7689, 11495, 91897, 44, 28, 7971, 926, 122, 22222]
我们想0-9为第一个箱子,10-99为第二个箱子,这就是固定量级分箱

分位数分箱

固定分箱缺点很明显就行,可能会有很多的空箱子,例如[1,2,3,4,99,98]如果按宽度为10进行分箱,则具有很多空箱子,那分位数分箱就是一个很好的办法.
我们可以根据数据进行自适应箱体定位,也就是说可以数据的0-25%,25%-50%,50%-75%,75%-100%进行分箱

效果图
dCP4nU.png

pandas中实现

# 按照分为数,将数据分为4个的箱子,保证每个箱子的数据都差不多
qcut,bins = pd.qcut(data,4,labels=False,retbins=True)
print(qcut,bins)

# 计算各个分位数的值
data.quantile([0.25,0.5,0.75])

对数变换

如果我们的数据分布情况为0-100的数据点有1000个,而100-10000的数据点只有20个,那使用对数变换可以使我们的数据分布变的更加的平滑

效果图
dCPfXT.png

pandas中实现

# 做对数变化,np.log10(x + 1) ,+1是防止出现np.log10(0)的情况
data = np.log10(data + 1)

特征缩放

有些模型是输入的平滑函数,比如线性回归模型、逻辑回归模型或包含矩阵的模
型,它们会受到输入尺度的影响。相反,那些基于树的模型则根本不在乎输入尺度有多
大。如果模型对输入特征的尺度很敏感,就需要进行特征缩放。

import sklearn.preprocessing as preproc
# min-max缩放
data = preproc.minmax_scale(data)

# 标准化——注意根据标准化的定义,有些结果会是负的
data = preproc.StandardScaler().fit_transform(data)

# L2-归一化
data = preproc.normalize(data, axis=0)

交互特征

两个特征的乘积可以组成一对简单的交互特征

pandas中实现

X2 = preproc.PolynomialFeatures(include_bias=False).fit_transform(X)