数值型特征工程总结及实现
二值化处理
在一个歌曲数据集中,一个人听歌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%进行分箱
效果图
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个,那使用对数变换可以使我们的数据分布变的更加的平滑
效果图
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)