特征处理
特征处理 之数值型
1 幅度调整/ / 归一化
2 统计值 max, min, mean, std
3 离散化
4 Hash 分桶
5 每个类别下对应的变量统计值 histogram( 分布状况 )
6 试试 数值型 => 类别型
1.归一化及标准化
参考:https://blog.youkuaiyun.com/pipisorry/article/details/52247379
数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。其中最典型的就是数据的归一化处理,即将数据统一映射到[0,1]区间上。
归一化后有三个好处
1. 提升模型的收敛速度
如下图,x1的取值为0-2000,而x2的取值为1-5,假如只有这两个特征,对其进行优化时,会得到一个窄长的椭圆形,导致在梯度下降时,梯度的方向为垂直等高线的方向而走之字形路线,这样会使迭代很慢,相比之下,右图的迭代就会很快(理解:也就是步长走多走少方向总是对的,不会走偏)
2.提升模型的精度
归一化的另一好处是提高精度,这在涉及到一些距离计算的算法时效果显著,比如算法要计算欧氏距离,上图中x2的取值范围比较小,涉及到距离计算时其对结果的影响远比x1带来的小,所以这就会造成精度的损失。所以归一化很有必要,他可以让各个特征对结果做出的贡献相同。
在多指标评价体系中,由于各评价指标的性质不同,通常具有不同的量纲和数量级。当各指标间的水平相差很大时,如果直接用原始指标值进行分析,就会突出数值较高的指标在综合分析中的作用,相对削弱数值水平较低指标的作用。因此,为了保证结果的可靠性,需要对原始指标数据进行标准化处理。
在数据分析之前,我们通常需要先将数据标准化(normalization),利用标准化后的数据进行数据分析。数据标准化也就是统计数据的指数化。数据标准化处理主要包括数据同趋化处理和无量纲化处理两个方面。数据同趋化处理主要解决不同性质数据问题,对不同性质指标直接加总不能正确反映不同作用力的综合结果,须先考虑改变逆指标数据性质,使所有指标对测评方案的作用力同趋化,再加总才能得出正确结果。数据无量纲化处理主要解决数据的可比性。经过上述标准化处理,原始数据均转换为无量纲化指标测评值,即各指标值都处于同一个数量级别上,可以进行综合测评分析。
从经验上说,归一化是让不同维度之间的特征在数值上有一定比较性,可以大大提高分类器的准确性。
3. 深度学习中数据归一化可以防止模型梯度爆炸。
python代码:
2.统计值:
describe mean等
3.数据离散化
参考:https://blog.youkuaiyun.com/shenxiaoming77/article/details/72600527
Q:CTR预估,发现CTR预估一般都是用LR,而且特征都是离散的。为什么一定要用离散特征呢?这样做的好处在哪里?
A:
在工业界,很少直接将连续值作为逻辑回归模型的特征输入,而是将连续特征离散化为一系列0、1特征交给逻辑回归模型,这样做的优势有以下几点:
0、 离散特征的增加和减少都很容易,易于模型的快速迭代。(离散特征的增加和减少,模型也不需要调整,重新训练是必须的,相比贝叶斯推断方法或者树模型方法迭代快)
1、稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
2、离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;离散化后年龄300岁也只对应于一个权重,如果训练数据中没有出现特征"年龄-300岁",那么在LR模型中,其权重对应于0,所以,即使测试数据中出现特征"年龄-300岁",也不会对预测结果产生影响。特征离散化的过程,比如特征A,如果当做连续特征使用,在LR模型中,A会对应一个权重w,如果离散化,那么A就拓展为特征A-1,A-2,A-3...,每个特征对应于一个权重,如果训练样本中没有出现特征A-4,那么训练的模型对于A-4就没有权重,如果测试样本中出现特征A-4,该特征A-4也不会起作用。相当于无效。但是,如果使用连续特征,在LR模型中,y = w*a,a是特征,w是a对应的权重,比如a代表年龄,那么a的取值范围是[0..100],如果测试样本中,出现了一个测试用例,a的取值是300,显然a是异常值,但是w*a还是有值,而且值还非常大,所以,异常值会对最后结果产生非常大的影响。
3、逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;在LR模型中,特征A作为连续特征对应的权重是Wa。A是线性特征,因为y = Wa*A,y对于A的导数就是Wa,如果离散化后,A按区间离散化为A_1,A_2,A_3。那么y = w_1*A_1+w_2*A_2+w_3*A_3.那么y对于A的函数就相当于分段的线性函数,y对于A的导数也随A的取值变动,所以,相当于引入了非线性。
4、 离散化后可以进行特征交叉,加入特征A 离散化为M个值,特征B离散为N个值,那么交叉之后会有M*N个变量,进一步引入非线性,提升表达能力;
5、特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;按区间离散化,划分区间是非常关键的。
6、特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。(当使用连续特征时,一个特征对应于一个权重,那么,如果这个特征权重较大,模型就会很依赖于这个特征,这个特征的一个微小变化可能会导致最终结果产生很大的变化,这样子的模型很危险,当遇到新样本的时候很可能因为对这个特征过分敏感而得到错误的分类结果,也就是泛化能力差,容易过拟合。而使用离散特征的时候,一个特征变成了多个,权重也变为多个,那么之前连续特征对模型的影响力就被分散弱化了,从而降低了过拟合的风险。)

one hot代码:pd.get_dummies()
4.hash分桶
每个bucket代表不同的主题 例如体育 人名等 把john,likes这些词往不同的桶里装
Histogram 映射(比赛里有人很喜欢用)
工业界的处理可能会非常粗暴 比如说男-21岁用作一列 男-48一列。
时间处理
时间型特征可以作为连续值也可以作为离散值。时间反应了用户行为,比如说用户在某个网页停留了多久。
特征处理之文本型:
丢进去了4句话 总共9个词 所以得到4*9的矩阵
刚才的词袋是针对一个一个单词的 上面这张图做的是n个词的。比如说把滑动窗口设置为2 (bigram_vectorizer)
词的重要度:
word2vector
词语映射到向量,还能保证词语之间的关系。比如说 词语北京到中国的距离和东京到日本的距离差不多。
统计特征:
这样组合特征 特征太多了,因为用户id很多 可以先对用户聚类
特征选择:
特征选择是删除没用的特征,降维是浓缩特征。
特征选择方式:
比如线性回归的w比较小,说明特征比较弱。先删除弱特征,然后查看准确率变化。如果变化不大说明可以删。
交叉验证代码: