背景
现在比较流行的ctr预估是gbdt+lr的方法:
- gbdt进行连续特征的离散化,省去了
人为分桶
的过程,既提高了效率,又提高了准确率 - lr,进行最终的特征训练,进行ctr预估
本文将阐述如何使用python的sklearn提取高维特征
实战
import numpy as np
from sklearn.preprocessing import OneHotEncoder
from sklearn.ensemble import GradientBoostingRegressor
x = np.array(
[[0.3333333333333333, 0.0], [0.3333333333333333, 0.0], [0.3333333333333333, 1.0], [0.3333333333333333, 0.0],
[0.3333333333333333, 0.0], [0.3333333333333333, 0.0], [0.3333333333333333, 0.0], [0.3333333333333333, 0.0],
[0.3333333333333333, 0.0], [0.3333333333333333, 0.0], [0.6666666666666666, 0.0], [0.0, 0.0],
[0.3333333333333333, 0.0], [0.6666666666666666, 0.0], [0.0, 0.0], [0.3333333333333333, 0.0], [0.0, 1.0],
[0.0, 0.0], [0.3333333333333333, 0.0], [0.6666666666666666, 0.0], [0.0, 0.6666666666666666], [0.0, 0.0],
[0.3333333333333333, 0.0], [0.3333333333333333, 0.0], [0.3333333333333333, 0.0], [0.3333333333333333, 0.0],
[0.3333333333333333, 0.0], [0.0, 0.0], [0.0, 0.0], [0.6666666666666666, 0.0], [0.6666666666666666, 0.0],
[0.3333333333333333, 0.3333333333333333], [0.0, 0.0], [0.0, 0.0], [0.3333333333333333, 0.0],
[0.3333333333333333, 0.0], [1.0, 0.0], [0.3333333333333333, 0.0], [0.3333333333333333, 0.3333333333333333],
[0.3333333333333333, 0.0], [0.3333333333333333, 0.0], [0.0, 0.3333333333333333], [0.0, 0.0],
[0.3333333333333333, 0.0], [0.3333333333333333, 0.0], [0.3333333333333333, 0.0], [0.3333333333333333, 0.0],
[0.3333333333333333, 0.0], [0.3333333333333333, 0.0], [0.0, 0.0], [0.6666666666666666, 0.0],
[0.3333333333333333, 0.0], [0.3333333333333333, 0.0], [1.0, 0.0], [1.0, 0.0], [1.0, 0.0], [0.0, 0.0],
[0.3333333333333333, 0.0], [0.3333333333333333, 0.0], [1.0, 0.0], [0.0, 1.0], [0.3333333333333333, 0.0],
[0.0, 0.0], [0.6666666666666666, 0.0], [0.3333333333333333, 0.0], [0.3333333333333333, 0.0],
[0.3333333333333333, 0.6666666666666666], [0.3333333333333333, 0.0], [0.6666666666666666, 0.0],
[0.3333333333333333, 0.3333333333333333], [0.3333333333333333, 0.0], [0.0, 0.0], [0.3333333333333333, 0.0],
[0.3333333333333333, 0.0], [1.0, 0.0], [0.0, 0.0], [0.3333333333333333, 0.0], [0.0, 0.0],
[0.6666666666666666, 0.0], [0.0, 0.0], [0.6666666666666666, 0.0], [0.3333333333333333, 0.0], [1.0, 0.0],
[0.0, 0.0], [0.6666666666666666, 0.3333333333333333], [0.3333333333333333, 0.3333333333333333],
[0.3333333333333333, 0.0], [0.3333333333333333, 0.0], [0.3333333333333333, 0.0], [0.0, 0.0],
[0.3333333333333333, 0.3333333333333333], [0.3333333333333333, 0.0], [1.0, 0.0], [0.3333333333333333, 0.0],
[0.0, 0.0], [0.0, 0.0], [0.0, 0.6666666666666666], [0.0, 0.0], [0.0, 0.0], [0.6666666666666666, 0.0]])
y = np.array(
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1])
gbr = GradientBoostingRegressor()
gbr.fit(x, y)
enc = OneHotEncoder()
# 输出每一棵树的结果
print(gbr.apply(x))
enc.fit(gbr.apply(x))
new_feature_train = enc.transform(gbr.apply(x))
# 将转化后的新特征转化为np数组形式
new_feature_train = new_feature_train.toarray()
print(new_feature_train)
最后得到了对于逻辑回归友好的0 1特征。
评价
python的sklearn能实现你的特征编码,但是在上亿数据面前,使用python库的效率较低,而且内存问题难以解决,所以需要考虑使用其他的方式方法进行训练,比如xgboost、spark等