lightGBM筛选特征及建模(系列文章二)

“新网银行杯”数据科学竞赛记录

之前写过一篇参加这个比赛过程中用xgboost的调参的文章,今天再记录一下用lightGBM作为特征筛选模型以及训练数据的过程

1.数据准备

新网的这个比赛主办方总共提供了三个数据集,命名分别为

  • train_xy.csv:15000条样本数据集,总共157个特征,1个标签变量,1个用户id变量,1个用户对应的产品群组变量
  • train_x.csv:15000条无标签的样本数据集,可以用来做无监督学习
  • test_all.csv:10000条测试数据集

2.筛选特征

评分卡建模常用的筛选重要性特征的方法包括IV值、基于模型筛选,在建模过程中,我也尝试了计算IV值来筛选特征的方法,但是选出来的特征建模效果比用lightGBM筛选的稍差,所以我最后用lightGBM作为筛选特征的依据。

2.1 导入模块
from sklearn.model_selection import StratifiedKFold
import lightgbm as lgb
from sklearn.metrics import roc_auc_score
import operator
import time
2.2 lightGBM参数设置
# 最后用全部数据train
train_all = lgb.Dataset(train[features], train['y'])
# 设置参数
params = {
    'boosting_type': 'gbdt',
    'objective': 'binary',
    'metric': {'auc'},
    'max_depth': 4,
    'min_child_weight': 6,
    'num_leaves': 16,
    'learning_rate': 0.02,
    'feature_fraction': 0.7,
    'bagging_fraction': 0.7,
    'bagging_freq': 5,
    #'lambda_l1':0.25,
    #'lambda_l2':0.5,
    #'scale_pos_weight':1,
}
2.3 训练模型
model = lgb.train(params,train_all,num_boost_round=450,valid_sets=train_all,early_stopping_rounds=100,verbose_eval=100)
2.4 提取模型筛选出来的重要特征
use = df.loc[df['importance']!=0,'feature'].tolist()

最后建模的时候选择了top30、24、18、12的特征都试了一遍

3.lightGBM建模

3.1 导入模块
import numpy as np
import pandas as pd
from pandas import DataFrame
from pandas import Series
import matplotlib
import matplotlib.pyplot as plt
import lightgbm as lgb
import operator
import time
from sklearn.model_selection import StratifiedKFold
from sklearn.metrics import roc_auc_score
3.2 导入数据
train_xy = pd.read_csv(r'C:\Users\Administrator\Desktop\noisy label\train_xy.csv',header=0,sep=",")
test_all = pd.read_csv(r'C:\Users\Administrator\Desktop\noisy label\test_all.csv',header=0,sep=",")
3.3 给测试集填充y变量,然后合并两个数据集
train = train_xy.copy()
test = test_all.copy()
test['y'] = -1

data = pd.concat([train,test],axis = 0)
3.4 将特征分开成连续型和离散型

新网的比赛说明文件中已经明确了x1-x95是数值型变量,x_96-x_157是离散型变量

continuous_features = []
discrete_features = []
for i in range(157):
    feat = "x_" + str(i+1)
    if i <= 94: # 1-95
        continuous_features.append(feat)
    else:
        discrete_features.append(feat)
3.5 缺失值离散化
3.6 填充缺失值

这里只用均值填充了数值型变量,离散型变量用中位数填充或者one-hot编码取得的效果不好,而且评分卡模型中用one-hot编码也很少,所以就没有对离散型变量作处理

3.7 根据筛选出来的重要特征建模

这里只给出了参数设置和模型设定,具体的交叉验证设置那些就没有给出来了

params = {
        'boosting_type': 'gbdt',
        'objective': 'binary',
        'metric': {'auc'},
        'max_depth': 4,
        'min_child_weight': 6,
        'num_leaves': 16,
        'learning_rate': 0.05,# 第一次lgb的学习率为0.02,第二次用0.05,第二次比第一次线下和线上同时提升0.001
        'feature_fraction': 0.7,
        'bagging_fraction': 0.7,
        'bagging_freq': 5,
        'lambda_l1':0.25,  #第一次lgb没有用l1和l2范数,第三次中用l1,线下提升0.0003,线上提升0.001,排名上升到第25;
        #'lambda_l2':0.5     #第四次中用l2,效果下降;第五次中同时用,效果下降
        #'scale_pos_weight':10.0/1.0, #14309.0 / 691.0, #不设置
        #'num_threads':4,
    }
gbm = lgb.train(params,lgb_train,num_boost_round=1000,valid_sets=lgb_eval,early_stopping_rounds=100,verbose_eval=100)
3.8 模型预测和评估
y_pred = gbm.predict(X_test,num_iteration=gbm.best_iteration)
# 评估
tmp_auc = roc_auc_score(y_test,y_pred)
auc_cv.append(tmp_auc)
# test
pred = gbm.predict(test_data, num_iteration = gbm.best_iteration)
pred_cv.append(pred)
print('cv mean score',np.mean(auc_cv))

4.小结

lightGBM和xgboost是两个最常用的集成模型,掌握它在机器学习建模中还是有很大优势的

  • 8
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
LightGBM(轻量级梯度提升机)是一个高效的梯度提升决策树算法,特征工程在LightGBM中起到了至关重要的作用。 特征工程是指对原始数据进行处理和转换,以便更好地适应机器学习算法的需求。在LightGBM中,特征工程可以通过以下几个方面来提升模型的性能: 1. 缺失值处理:LightGBM对缺失值的处理非常友好,不需要对缺失值进行特殊处理,可以直接将缺失值作为一个独立的特征进行建模。但是我们仍然可以根据具体情况对缺失值进行处理,以提高模型的性能。 2. 类别特征处理:LightGBM对类别特征的处理也非常方便。可以通过将类别特征进行编码转换为数值特征,或者使用独热编码等方法将类别特征转换为进制特征。 3. 特征选择:可以使用LightGBM内置的特征重要性评估方法,通过训练模型后获取每个特征重要性得分,再根据得分选择最重要的特征。这样可以去除无关特征和降低模型的复杂度,提高训练和预测的速度。 4. 特征交叉:可以通过将两个或多个特征进行组合,构造出新的交叉特征。这样可以提取出更高阶的特征信息,增强模型的非线性拟合能力。 5. 特征缩放:可以对特征进行缩放,使得各个特征具有相同的尺度。常用的缩放方法包括标准化和归一化,可以提高模型的稳定性和收敛速度。 总之,LightGBM特征工程方面具有很大的灵活性和便捷性,可以根据实际情况进行特征处理、选择和转换,以提高模型的性能和预测效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值