lightGBM 参数及使用

今天先检查了昨天的提交,历史提交过程是这样的:
1. 手动补齐了train的缺失成-1,然后test直接保持NA预测,得到了一个很离谱的分数,local却是正常的
2. 手动补齐了train的缺失成-1,然后test也补齐-1,和上次分数一样
3. 今天上午我不管train和test的NAN,分数恢复正常
1和2为什么会分数一样?这要弄清楚xgb是如何对缺失值进行处理的?也许后面也会成为我的一个上分点!因为默认的缺失值处理方式并不一定是最好的!还有种极小可能是我手误传错了,传成上次的了!
还有一种更扯的猜测,两个文件名一样,分数没更新?这个概率极低,因为有这么多选手,如果有这BUG,早就闹起来了。
所以这种筛选特征的方式被否定了,我局部用相关系数筛效果不好,我全局估计也不会好在哪里去?倒是RFE值得尝试!
下午主要就是对lightGBM进行研究,感觉非常不错的一个包,对其参数和用法进行了了解,大体上类似于xgb,对一些用法进行一下回顾。
1. lightGBM安装,在linux环境下,lightGBM可以很便捷地使用pip进行安装,升级以前的package,可以pip install -U package_name,不升级到最新会出现一些不必要的提示,无法正确设置verbose参数
2. lgb与xgb一样,先要进行转换,生成dtrain,dtrain = lgb.Dataset(x_train, label=y_train)
3. 昨天涉及到的参数有
params['max_bin'] = 255 #最新版本这个参数似乎已经放到lgb.Dataset中了
params['learning_rate'] = 0.0021 #学习率
params['boosting_type'] = 'gbdt' #使用gbdt的boosting方式
params['objective'] = 'regression' #回归
params['metric'] = 'l2_root' #RMSE做评价指标
params['sub_feature'] = 0.75 #随机抽75%features进行训练
params['bagging_fraction'] = 1 #随机抽多少样本进行训练
params['bagging_freq'] = 0 #这个是每多少次迭代使用一次bagging_fraction
params['num_leaves'] = 512 #最大叶子数,lgb是一种leaf-wise的建树方式,去掉了max_depth
params['min_data'] = 500 #node上最小的样本数
params['min_hessian'] = 0.05 #这个hessian感觉和损失函数的减少相关,越小能创造更复杂的树
params['verbose'] = -1 #print log等级 -1只打fetal
params['feature_fraction_seed'] = 2 #feature抽样的随机种子
params['bagging_seed'] = 3 #样本抽样的随机种子
4. lgb的CV和xgb也非常类似
cv_result_lgb = lgb.cv(params,dtrain,num_boost_round=10000,folds=cv,early_stopping_rounds=50,verbose_eval=50,show_stdv=True)
但是lgb的CV只有test评价指标输出,没有training的,我搜索了一下也没发现有什么办法可以输出training,其实training也没什么参考价值,我只是想通过观察traning和test rmse的差距,看看是否有什么规律,是否可以表征过拟合等等
5. lgb的预测是predict,返回一个array
6. lgb要获得feature_importance,需要自己去对应构造,model.feature_name得到所有特征名,model.feature_importance得到所有特征的变量重要程度,可以轻松组合成一个df,然后按重要程度排序,重要程度默认仍然是一个feature被用来分裂的次数
7. 我实践的感觉上来看,lgb感觉要学习率更低,生成更复杂的树,迭代更多轮才能取得不错的效果
8. 发现了更多的描述性统计量,而且某些指标还是内置于pandas中的,比如偏度skew,那下一步我可以利用更多的描述性统计量来构建新特征。有些统计指标并没有, 比如峰度kurt,需要用apply,比如df.groupby('uid').apply(pd.DataFrame.kurt)[column]

加油!永不放弃,加快编码速度!多尝试!即便老司机也会去尝试各种各样的想法!



留言

熱門文章