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

本文分享了新网银行杯数据科学竞赛的实战经验,重点介绍了使用lightGBM进行特征筛选和模型训练的过程,对比了不同特征数量对模型效果的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

之前写过一篇参加这个比赛过程中用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是两个最常用的集成模型,掌握它在机器学习建模中还是有很大优势的

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值