CTR场景数据分析建模 问题汇总2- 预处理及机器学习模型相关
概论
用决策树类 lgb xgboost等
或者用nn的方法
目前比较新颖的是使用deepfm方法
lgb lightbgm
官方文档
https://lightgbm.readthedocs.io/en/latest/Quick-Start.html 英文
https://lightgbm.apachecn.org/#/ 中文
核心参数
https://juejin.im/post/5b76437ae51d45666b5d9b05
核心参数
boosting:也称boost,boosting_type.默认是gbdt。
LGB里面的boosting参数要比xgb多不少,我们有传统的gbdt,也有rf,dart,doss,最后两种不太深入理解,但是试过,还是gbdt的效果比较经典稳定
application:默认为regression。,也称objective, app这里指的是任务目标
如果是二值任务,设置为binary
learning_rate:也称shrinkage_rate,梯度下降的步长。默认设置成0.1,我们一般设置成0.05-0.2之间
num_leaves:也称num_leaf,新版lgb将这个默认值改成31,这代表的是一棵树上的叶子数
我的代码
lgb_model_fa = lgb.LGBMClassifier(boosting_type="gbdt", num_leaves=20, reg_alpha=0, reg_lambda=0.018,
max_depth=3, n_estimators=2000, objective='binary',num_class = 1,
subsample=0.8, colsample_bytree=0.8, subsample_freq=1,min_child_samples = 40, learning_rate=0.018, random_state=2019, metric="auc",n_jobs=-1)
调参
官方:https://lightgbm.apachecn.org/#/docs/7
主要使用网格搜索GridSearch
https://www.imooc.com/article/43784?block_id=tuijian_wz 好文推荐
基本贯彻这个调参思路
不建议把重要参数一股脑进行调整,虽然设置简单了,但是工作量是呈指数增加的
一般分层进行网格搜索,确定了的参数就固定,
按照下列顺序操作:
1、学习率和估计器及其数目
先把学习率先定一个较高的值,这里取 learning_rate = 0.1(目的是快速出结果进行比较),其次确定估计器boosting/boost/boosting_type的类型,不过默认都会选gbdt。
为了确定估计器的数目,也就是boosting迭代的次数,也可以说是残差树的数目,参数名为n_estimators/num_iterations/num_round/num_boost_round
2、max_depth 和 num_leaves
这是提高精确度的最重要的参数。
max_depth :设置树深度,深度越大可能过拟合
num_leaves:因为 LightGBM 使用的是 leaf-wise 的算法,因此在调节树的复杂程度时,使用的是 num_leaves 而不是 max_depth。大致换算关系:num_leaves = 2^(max_depth),但是它的值的设置应该小于 2^(max_depth),否则可能会导致过拟合。
3、min_data_in_leaf 和 min_sum_hessian_in_leaf
说到这里,就该降低过拟合了。
min_data_in_leaf 是一个很重要的参数, 也叫min_child_samples,它的值取决于训练数据的样本个树和num_leaves. 将其设置的较大可以避免生成一个过深的树, 但有可能导致欠拟合。
min_sum_hessian_in_leaf:也叫min_child_weight,使一个结点分裂的最小海森值之和,真拗口(Minimum sum of hessians in one leaf to allow a split. Higher values potentially decrease overfitting)
4、feature_fraction 和 bagging_fraction
feature_fraction参数来进行特征的子抽样。这个参数可以用来防止过拟合及提高训练速度。
bagging_fraction+bagging_freq参数必须同时设置,bagging_fraction相当于subsample样本采样,可以使bagging更快的运行,同时也可以降拟合。bagging_freq默认0,表示bagging的频率,0意味着没有使用bagging,k意味着每k轮迭代进行一次bagging。
5、正则化参数
正则化参数lambda_l1(reg_alpha), lambda_l2(reg_lambda)
6、降低learning_rate
之前使用较高的学习速率是因为可以让收敛更快,但是准确度肯定没有细水长流来的好。最后,我们使用较低的学习速率,以及使用更多的决策树n_estimators来训练数据,看能不能可以进一步的优化分数。
特征选择 feature_importance
https://blog.csdn.net/owenfy/article/details/79995187
本人代码:
importance = lgb_model_pur.feature_importances_
feature_name = lgb_model_pur.n_features_
lgb.plot_importance(lgb_model_pur,max_num_features=None) #max_num_features=None 为所有特征重要性展示
fig = plt.gcf()
fig.set_size_inches(100, 80)
plt.title("Feature importances pur")
plt.show()
max_num_features=None意思就是把所有有重要性的都搞上
但是实战中发现,这个plot_importance并不是那么的可信,经常出现变化,可以定性的去根据它选择优秀特征。
如果importance值很高就是重要,着重考虑;如果值为0,也不要轻易删除,我认为这个importance更多的还是给一个优秀特征的范围。
其他的lgb.plot操作
https://www.cnblogs.com/leixingzhi7/p/9515204.html
特征预处理
离散categories特征:label化
连续特征:标准化、离散化
categories特征:label化
from sklearn.preprocessing import LabelEncoder
lb_seller=LabelEncoder()
lb_product=LabelEncoder()
lb_user=LabelEncoder()
lb_seller.fit(list(data_lxy['seller']))
lb_product.fit(list(data_lxy['Product_id']))
lb_user.fit(list(data_lxy['user_id'])) #将特征转换为标签形式int64
data_lxy['seller'] = lb_seller.transform(data_lxy['seller'])
data_lxy['Product_id'] = lb_product.transform(data_lxy['Product_id'])
data_lxy['user_id'] = lb_user.transform(data_lxy['user_id'])
连续特征离散化
http://www.dataivy.cn/blog/3-10-离散化,对运营数据做逻辑分层/
https://blog.csdn.net/zhangf666/article/details/79203197
1、pd.cut/qcut
https://blog.csdn.net/a787264137/article/details/78573436
cut是范围4等分 qcut是频数4等分
本来打算4等分,然后用0-3的数来代表不同的连续值。
2、kmeans方法
使用聚类法实现离散化。该过程使用了sklearn.cluster的KMeans算法实现。首先通过指定数据框的列名获得要建模的数据列;然后将数据的形状进行转换,否则算法会认为该数据只有1行(通过pands指定列名获得的数据默认都没有列值,例如示例中的data的形状是(100,),因此大多数场景下作为输入变量都需要做形状转换);接着创建KMeans模型并指定要聚类数量为4表并设置初始化随机种子为固定值0(否则每次得到的聚类结果很可能基本都不一样),并使用fit_predict方法直接建模输出结果;最后将新的结果追加到原始数据框中,最终打印输出前5条结果如下:
from sklearn.cluster import KMeans
for i in float_feature:
data_reshape = data_lxy_fa[i].reshape((data_lxy_fa[i].shape[0], 1)) # 转换数据形状
model_kmeans = KMeans(n_clusters=4, random_state=0) # 创建KMeans模型并指定要聚类数量
keames_result = model_kmeans.fit_predict(data_reshape) # 建模聚类
data_lxy_fa[i+'kmeans'] = keames_result.reshape(data_lxy_fa[i].shape[0]) # 新离散化的数据合并到原数据框
del data_lxy_fa[i]
特征选择
特征工程是决定模型效果的上限,模型决定下限。特征工程真的很重要!
https://www.cnblogs.com/hhh5460/p/5186226.html 文章好 建议多看
我对特征都是极其粗的筛选,笨办法
1、画出各个特征的分布
2、观察分布 把90%都是相近分布、10%或者更少是异常分布的特征去掉
deepctr
一个浙大大佬写的包,我想调用deepfm来自动做些特征工程
文档:https://deepctr-doc.readthedocs.io/en/latest/index.html
目前还在调试,fit的时候出错,可能是embedding时出了问题。