mooplab2021数据建模大赛(桂林银行杯)

数据集不能下载到本地,所以本文只是做一个数据处理和建模过程的记录。
比赛结果:线下auc:0.859,线上auc:0.8077。

1.数据初步探索结果

训练集中,8375个卡号,但只有8361个客户。

acct:(此表含卡号、客户号和最终的label)

  1. 只要x_cat3取值为482 x_date1、2就缺失;x_cat3只有21值不为482,此时x_date1和x_date2完全一样;
    基于上述情况,考虑只保留x_cat3,取值为482的设为0,其他为1,并且删除x_date1、2
  2. x_date1 x_date2只有21个样本未缺失,这21个样本相同、并且都是日期,所以考虑只保留x_date1
  3. x_date1、x_cat4缺失严重,但未缺失样本的违约率远高于平均值,考虑有值的设为1,缺失的设为0
  4. x_cat7只有4个数缺失,考虑用众数0填补(8361个样本都为0)
  5. x_cat5、6 std为0,直接删除
  6. x_cat2与x_cat1完全一样,删除x_cat2,x_cat1分箱

cust:

  1. x_cat4~8、11完全缺失,直接删除
  2. x_cat3大量缺失,但未缺失样本的违约率高于平均,考虑有值的设为1,缺失的设为0
  3. x_cat1就是客户号,直接删除
  4. x_cat9,10每个样本取值都不一样,疑似为客户的某个编号,且x_cat9与x_cat10完全一样,考虑两个都删除

cards:

  1. x_cat8全部缺失,直接删除
  2. x_cat7缺失率高,但是未缺失样本的违约率高达0.77,考虑有值的设为1,缺失的设为0
  3. x_date1和x_date1.1不同的样本的违约率远高于平均值,所以不能直接把两者之一剔除。
    考虑增加一个新变量,取值为date1.1与date1之间的日期差;然后保留date1(转换为时间戳),删除date1.1
  4. x_cat1、3 std为0,直接删除
  5. x_cat4\5分箱,x_cat4、5取值绝大部分是相同的,取值不同的样本中,违约率高达0.66

tran:

  1. x_num12、13、14直接删
  2. x_num411、1518、22、23填补(回归orKNN) (傅直接删除)
  3. x_cat1、2众数填补,x_num1、2、3、20、21均值填补(只有两个样本缺失,卡号519562和529914)

2.数据预处理

import pandas as pd
import numpy as np
import sklearn
from xgboost import XGBClassifier as xgbc
import os
import datetime,time
from sklearn.ensemble import RandomForestRegressor
import warnings
warnings.filterwarnings('ignore')
import pandas_profiling
from sklearn.preprocessing import MinMaxScaler,StandardScaler
from sklearn.model_selection import train_test_split
files = os.listdir('/data/')
whole_files = []
for file in files:
    if '.csv' in file:
        name = file.rstrip('.csv')
        whole_files.append(name)
        exec_code = '{}=pd.read_csv("/data/{}")'.format(name,file)
        print(exec_code)
        exec(exec_code)
        
for name in whole_files:
    prefix = name.split('_')[0]
    code1 = 'cols=list({}.columns)'.format(name)
    exec(code1)
    for i in range(len(cols)):
        if 'x_' in cols[i]:
            cols[i] = prefix+'_'+cols[i]
    code2 = '{}.columns=new_cols'.format(name)
    code2 = '{}.columns=cols'.format(name)
    exec(code2)
acct_test=pd.read_csv("/data/acct_test.csv")
acct_train=pd.read_csv("/data/acct_train.csv")
cards_test=pd.read_csv("/data/cards_test.csv")
cards_train=pd.read_csv("/data/cards_train.csv")
cust_test=pd.read_csv("/data/cust_test.csv")
cust_train=pd.read_csv("/data/cust_train.csv")
tran_test=pd.read_csv("/data/tran_test.csv")
tran_train=pd.read_csv("/data/tran_train.csv")
whole_train = pd.merge(acct_train,cards_train,how='left',on=['卡号','客户号'])
whole_train = whole_train.merge(cust_train,how='left',on='客户号')
whole_train = whole_train.merge(tran_train,how='left',on='卡号')
train_data = whole_train.copy()

whole_test = pd.merge(acct_test,cards_test,how='left',on=['卡号','客户号'])
whole_test = whole_test.merge(cust_test,how='left',on='客户号')
whole_test = whole_test.merge(tran_test,how='left',on='卡号')
test_data = whole_test.copy()


tran_x_cat1_majority_values = []
tran_x_cat2_majority_values = []
cat1_value_counts = train_data['tran_x_cat1'
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值