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时出了问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值