Python案例分析:使用LightGBM算法、随机森林、五折交叉验证进行分类预测

该文详细阐述了数据预处理的步骤,包括数据导入、数据清洗(如处理缺失值、异常值),特征工程(如创建新特征),以及通过SMOTE进行上采样以解决不平衡数据问题。接着,文章展示了如何使用LightGBM和RandomForest进行建模和预测,最后提到了5折交叉验证优化模型性能。

1、数据导入

import pandas as pd
import numpy as np
import warnings
from imblearn import under_sampling, over_sampling
from imblearn.over_sampling import SMOTE
warnings.filterwarnings('ignore')
pd.options.display.max_columns = None #显示所有列
pd.set_option('display.float_format', lambda x: '%.2f' % x) #取消科学计数法

train_data = pd.read_csv('Training.csv')
test_data = pd.read_csv('Test.csv')

2、数据清洗

#合并数据
total_data = pd.concat([train_data, test_data])

#替换.和?
total_data = total_data.replace('.', np.nan)
total_data = total_data.replace('?', np.nan)

print(total_data[['area']].info())

在这里插入图片描述

根据数据字典可以知道几点:
1)、area是一个字符串,区域代码第1码为大分类, 第1+2码为中分类, 依此类推。所以理论上应该是3位的,我们需要将异常数据转为空值,并且分别提取出前三位;
2)、黄色部分的字段是有相关性的,比如ck-saveall = ck-savetime ×ck-saveavg,所以可以通过计算填充;
3)、ck这个字段和后面带ck字样的字段都有关系,理论上应该后面字段中只要有一个值>0,ck就是1;
4)、其它字段应该也有内在联系,但是因为对银行业不了解,所以也不敢动。
5)、不建议用均值替换缺失值,因为我后续用的是LightGBM算法,所以可以不填充;如果使用RandomForest,则建议把缺失值填充为-1

total_data['area'].where(total_data['area'].str.len()>=3, inplace=True)
print(total_data[['area']].info())

在这里插入图片描述

# 将一些object变量转为数值变量
total_data.rename(columns={
   
   'depsaveavg':'dep-saveavg', 'depdrawavg': 'dep-drawavg'}, inplace=True)
num_features = list(set(total_data.columns) - set(['ID', 'area', 'ck', 'comp', 'VV']))
for col in num_features:
    total_data[col] = pd.to_numeric(total_data[col])
total_data.info()

在这里插入图片描述

def cap(x, quantile=[0.05, 0.95]):
    """盖帽法处理异常值
    Args:
    x:pd.Series列,连续变量
    quantile:指定盖帽法的上下分位数范围
    """ 
    # 生成分位数
    Q05, Q95=x.quantile(quantile).values.tolist()
    # 替换异常值为指定的分位数
    if Q05 > x.min():
        x = x.copy()
        x.loc[x<Q05] = Q05
    if Q95 < x.max():
        x = x.copy()
        x.loc[x>Q95] = Q95
    return(x)

columns = total_data.columns.tolist()
#对训练集进行盖帽法
total_data_1 = total_data[num_features]
total_data_2 = total_data_1.apply(cap)
new_total_data = pd.concat([total_data[['ID', 'area', 'ck', 'comp', 'VV']], total_data_2], axis=1)
total_data = new_total_data[columns]
total_data.head()

在这里插入图片描述

#根据规则,把'ck'和'dep'相关字段的数据补充
for way in ['ck-save', 'ck-draw', 'dep-save', 'dep-draw']:
    total_data['new_{}all'.format(way)] = total_data['{}time'.format(way)] * total_data['{}avg'.format(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rubyw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值