• 2022 年首届钉钉杯大学生大数据挑战赛初赛的Baseline


    一、问题背景

    数字支付正在发展,但网络犯罪也在发展。电信诈骗案件持续高发,消费者 受损比例持续走高。报告显示,64%的被调查者曾使用手机号码同时注册多个账 户,包括金融类账户、社交类账户和消费类账户等,其中遭遇过电信诈骗并发生 损失的比例过半。用手机同时注册金融类账户及其他账户,如发生信息泄露,犯 罪分子更易接管金融支付账户盗取资金。随着移动支付产品创新加快,各类移动支付在消费群体中呈现分化趋势,第三方支付的手机应用丰富的场景受到年轻人群偏爱,支付方式变多也导致个人信息也极易被不法分子盗取。根据数据泄露指数,每天有超过 500 万条记录被盗,这一令人担忧的统计数据表明 对于有卡支付和无卡支付类型的支付,欺诈仍然非常普遍。在今天的数字世界,每天有数万亿的银行卡交易发生,检测欺诈行为的发生 是一个严峻挑战。

    二、问题分析

    问题属于二分类问题,数据共有七个特征和一列类标签,
    distance_from_home:银行卡交易地点与家的距离;
    distance_from_last_transaction:与上次交易发生的距离;
    ratio_to_median_purchase_price:近一次交易与以往交易价格中位数的比率;
    repeat_retailer:交易是否发生在同一个商户;
    used_chip:是通过芯片(银行卡)进行的交易;
    used_pin_number:交易时是否使用了 PIN 码;
    online_order:是否是在线交易订单;
    fraud:诈骗行为(分类标签);

    三、代码

    import matplotlib.pyplot as plt
    import seaborn as sns
    from tqdm import tqdm
    import re
    import pandas as pd
    
    from catboost import CatBoostRegressor
    import lightgbm as lgb
    import xgboost as xgb
    import numpy as np
    from sklearn.metrics import roc_auc_score, precision_recall_curve, roc_curve, average_precision_score
    from sklearn.model_selection import StratifiedKFold,KFold
    import seaborn as sns
    import warnings
    warnings.filterwarnings('ignore')
    
    plt.rcParams['font.sans-serif']=['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    
    
    # 读取数据
    train = pd.read_csv('./card_transdata.csv')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    # 查看数据的基本信息
    train.info()
    
    • 1
    • 2

    在这里插入图片描述

    # 标签比例
    train['fraud'].value_counts().plot.pie(explode=[0,0.1],autopct='%1.1f%%')
    
    • 1
    • 2

    在这里插入图片描述

    # 变量之间的相关性
    plt.subplots(figsize=(9,9),dpi=1080,facecolor='w')# 设置画布大小,分辨率,和底色
    sns.heatmap(train.corr(),annot=False, vmax=1, square=True, fmt='.2g')#annot为热力图上显示数据;fmt='.2g'为数据保留两位有效数字,square呈现正方形,vmax最大值为1
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    # 五折交叉验证
    features = [i for i in train.columns if i not in ['fraud']]
    train_x = train
    train_y = train['fraud']
    # 开始训练
    KF = StratifiedKFold(n_splits=5, shuffle=True, random_state=2021)
    
    params = {
        'boosting_type': 'gbdt',
        'objective': 'binary',
        'metric': {'auc'},
        'num_leaves': 32,
        'max_depth': 5,
        'learning_rate': 0.01,
        'feature_fraction': 0.8, # 建树的特征选择比例
        'bagging_fraction': 0.75,  # 建树的样本采样比例
        'bagging_freq': 5, # k 意味着每 k 次迭代执行bagging
        'lambda_l2': 1,  # 越小l2正则程度越高
        "verbose": -1,
    
    }
    
    oof_lgb = np.zeros(len(train_x))
    for fold_, (trn_idx, val_idx) in enumerate(KF.split(train_x.values, train_y.values)):
        print("fold n°{}".format(fold_))
        trn_data = lgb.Dataset(train_x.iloc[trn_idx][features], label=train_y.iloc[trn_idx])
        val_data = lgb.Dataset(train_x.iloc[val_idx][features], label=train_y.iloc[val_idx])
        num_round =2000
        clf = lgb.train(
            params,
            trn_data,
            num_round,
            valid_sets=[trn_data, val_data],
            verbose_eval=500,
    
        )
        oof_lgb[val_idx] = clf.predict(train_x.iloc[val_idx][features], num_iteration=clf.best_iteration)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    在这里插入图片描述

    4. 总结

    这题唯一好的是数据量组,可以得到充分训练,无需进行特征交叉就接近满分!!!!!!!!!!!

  • 相关阅读:
    【mybatis】mybatis的特性和优势
    3DTiles三维管线数据生产工具试用版
    微信小程序备案流程操作详解,值得收藏
    关于自定义程序打包成jar包,并读取配置
    macOS环境使用HomeBrew安装MySQL【日常记录,可供参考】
    认识vue3以及语法运用简介
    ElasticSearch复合查寻
    企业网络“卫生”实用指南
    springboot:整合redis之分布式锁
    8月份的.NET Conf 活动 专注于 .NET MAUI
  • 原文地址:https://blog.csdn.net/A496608119/article/details/126109349