【金融风控系列】_[2]_欺诈识别

本文围绕IEEE-CIS欺诈检测赛题展开,目标是识别欺诈交易。介绍了训练集和测试集数据情况,含交易和身份数据字段。阐述了关键策略,如构建用户唯一标识、聚合特征等,还涉及特征选择、编码、验证策略及模型训练,最终线上评分为0.959221,旨在学习特征构建。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

【金融风控系列】_[2]_欺诈识别 - 创想鸟

IEEE-CIS 欺诈检测

该赛题来自 KAGGLE,仅用作学习交流

该赛题的主要目标是识别出每笔交易是否是欺诈的。

其中训练集样本约59万(欺诈占3.5%),测试集样本约50万。

数据主要分为2类,交易数据transaction和identity数据。

本文主要是对与参考文献的收集整理


字段表

交易表

Field Description

TransactionDT来自给定参考日期时间的时间增量(不是实际时间戳)TransactionAMT以美元为单位的交易支付金额ProductCD:产品代码,每笔交易的产品
card1 – card6支付卡信息,如卡类型、卡类别、发卡行、国家等addr地址dist距离P_ 和 (R__) emaildomain购买者和收件人的电子邮件域C1-C14计数,如发现有多少地址与支付卡关联等,实D1-D15timedelta,例如上次交易之间的天数等M1-M9匹配,如卡上的姓名和地址等VxxxVesta 设计了丰富的功能,包括排名、计数和其他实体关系


分类特征:

ProductCDcard1 – card6addr1, addr2P_emaildomainR_emaildomainM1 – M9


身份表

该表中的变量是身份信息——与交易相关的网络连接信息(IP、ISP、代理等)和数字签名(UA/浏览器/操作系统/版本等)。

它们由 Vesta 的欺诈保护系统和数字安全合作伙伴收集。

(字段名称被屏蔽,不提供成对字典用于隐私保护和合同协议)


分类特征:

DeviceTypeDeviceInfoid_12 – id_38

参考:

[1] https://zhuanlan.zhihu.com/p/85947569

[2] https://www.kaggle.com/c/ieee-fraud-detection/discussion/111284

[3] https://www.kaggle.com/c/ieee-fraud-detection/discussion/111308

[4] https://www.kaggle.com/c/ieee-fraud-detection/discussion/101203

主要策略

构建用户的唯一标识(十分重要)使用UID构建聚合特征类别特征的编码(主要是用频率编码和label encode)水平方向:模型融合;垂直方向:针对用户的后处理


欺诈行为定义

标记的逻辑是将卡上报告的退款定义为欺诈交易 (isFraud=1),并将其后的用户帐户、电子邮件地址或账单地址直接关联到这些属性的交易也定义为欺诈。如果以上均未在120天内出现,则我们定义该笔定义为合法交易(isFraud=0)。

你可能认为 120 天后,一张卡片就变成了isFraud=0。我们很少在训练数据中看到这一点。(也许欺诈性信用卡会被终止使用)。训练数据集有 73838 个客户(信用卡)有2 个或更多交易。其中,71575 (96.9%) 始终为isFraud=0,2134 (2.9%) 始终为isFraud=1。只有129(0.2%)具有的混合物isFraud=0和isFraud=1。

       

从中,我们可以获得在业务中欺诈的逻辑,一个用户有过欺诈经历,那么他下次欺诈的概率还是非常高的,我们需要关注到这一点。


唯一客户标识

原始数据中未包含唯一UID,因此需要对客户进行唯一标识,识别客户的关键是三列card1,addr1和D1

D1 列是“自客户(信用卡)开始以来的天数”

card1 列是“银行卡的前多少位”

addr1 列是“用户地址代码”

确定了用户的唯一标识之后,我们并不能直接把它当作一个特征直接加入到模型中去,因为通过分析发现,测试集中有68.2%的用户是新用户,并不在训练集中。我们需要间接的使用`UID`,用`UID`构造一些聚合特征。

       


特征选择

前向特征选择(使用单个或一组特征)递归特征消除(使用单个或一组特征)排列重要性对抗验证相关分析时间一致性客户一致性训练/测试分布分析

一个叫做“时间一致性”的有趣技巧是在训练数据集的第一个月使用单个特征(或一小组特征)训练单个模型,并预测isFraud最后一个月的训练数据集。这会评估特征本身是否随时间保持一致。95% 是,但我们发现 5% 的列不符合我们的模型。他们的训练 AUC 约为 0.60,验证 AUC 为 0.40。


验证策略

训练两个月/ 跳过两个月 / 预测两个月训练四个月/ 跳过一个月 / 预测一个月

特征编码

主要使用以下五种特征编码方式

频率编码 :统计该值出现的个数

def encode_FE(df1, df2, cols):    for col in cols:        df = pd.concat([df1[col], df2[col]])        vc = df.value_counts(dropna=True, normalize=True).to_dict()        vc[-1] = -1        nm = col + "FE"        df1[nm] = df1[col].map(vc)        df1[nm] = df1[nm].astype("float32")        df2[nm] = df2[col].map(vc)        df2[nm] = df2[nm].astype("float32")        print(col)

       

标签编码 :将原数据映射称为一组顺序数字,类似ONE-HOT,不过 pd.factorize 映射为[1],[2],[3]。 pd.get_dummies() 映射为 [1,0,0],[0,1,0],[0,0,1]

def encode_LE(col, train=X_train, test=X_test, verbose=True):    df_comb = pd.concat([train[col], test[col]], axis=0)    df_comb, _ = pd.factorize(df_comb)    nm = col    if df_comb.max() > 32000:        train[nm] = df_comb[0: len(train)].astype("float32")        test[nm] = df_comb[len(train):].astype("float32")    else:        train[nm] = df_comb[0: len(train)].astype("float16")        test[nm] = df_comb[len(train):].astype("float16")    del df_comb    gc.collect()    if verbose:        print(col)

       

统计特征:主要使用 pd.groupby对变量进行分组,再使用agg计算分组的统计特征

def encode_AG(main_columns, uids, aggregations=["mean"], df_train=X_train, df_test=X_test, fillna=True, usena=False):    for main_column in main_columns:        for col in uids:            for agg_type in aggregations:                new_column = main_column + "_" + col + "_" + agg_type                temp_df = pd.concat([df_train[[col, main_column]], df_test[[col, main_column]]])                if usena:                    temp_df.loc[temp_df[main_column] == -1, main_column] = np.nan                #求每个uid下,该col的均值或标准差                temp_df = temp_df.groupby([col])[main_column].agg([agg_type]).reset_index().rename(                    columns={agg_type: new_column})                #将uid设成index                temp_df.index = list(temp_df[col])                temp_df = temp_df[new_column].to_dict()                #temp_df是一个映射字典                df_train[new_column] = df_train[col].map(temp_df).astype("float32")                df_test[new_column] = df_test[col].map(temp_df).astype("float32")                if fillna:                    df_train[new_column].fillna(-1, inplace=True)                    df_test[new_column].fillna(-1, inplace=True)                print(new_column)

       

交叉特征:对两列的特征重新组合成为新特征,再进行标签编码

def encode_CB(col1, col2, df1=X_train, df2=X_test):    nm = col1 + '_' + col2    df1[nm] = df1[col1].astype(str) + '_' + df1[col2].astype(str)    df2[nm] = df2[col1].astype(str) + '_' + df2[col2].astype(str)    encode_LE(nm, verbose=False)    print(nm, ', ', end='')

       

唯一值特征:分组后返回目标属性的唯一值个数

def encode_AG2(main_columns, uids, train_df=X_train, test_df=X_test):    for main_column in main_columns:        for col in uids:            comb = pd.concat([train_df[[col] + [main_column]], test_df[[col] + [main_column]]], axis=0)            mp = comb.groupby(col)[main_column].agg(['nunique'])['nunique'].to_dict()            train_df[col + '_' + main_column + '_ct'] = train_df[col].map(mp).astype('float32')            test_df[col + '_' + main_column + '_ct'] = test_df[col].map(mp).astype('float32')            print(col + '_' + main_column + '_ct, ', end='')

   

复现代码

因为数据集命名有空格的问题,请先将文件夹/data104475下数据集手动重命名为 IEEE_CIS_Fraud_Detection.zip

In [2]

# 解压数据集 仅第一次运行时运行!unzip -q -o data/data104475/IEEE_CIS_Fraud_Detection.zip -d /home/aistudio/data

       

unzip:  cannot find or open data/data104475/IEEE_CIS_Fraud_Detection.zip, data/data104475/IEEE_CIS_Fraud_Detection.zip.zip or data/data104475/IEEE_CIS_Fraud_Detection.zip.ZIP.

       In [3]

# 安装依赖包!pip install xgboost

   In [6]

import numpy as np  # linear algebraimport pandas as pd  # data processing, CSV file I/O (e.g. pd.read_csv)import os, gcfrom sklearn.model_selection import GroupKFoldfrom sklearn.metrics import roc_auc_scoreimport xgboost as xgbimport datetime

   In [4]

path_train_transaction = "./data/raw_data/train_transaction.csv"path_train_id = "./data/raw_data/train_identity.csv"path_test_transaction = "./data/raw_data/test_transaction.csv"path_test_id = "./data/raw_data/test_identity.csv"path_sample_submission = './data/raw_data/sample_submission.csv'path_submission = 'sub_xgb_95.csv'

   In [7]

BUILD95 = FalseBUILD96 = True# cols with stringsstr_type = ['ProductCD', 'card4', 'card6', 'P_emaildomain', 'R_emaildomain', 'M1', 'M2', 'M3', 'M4', 'M5',            'M6', 'M7', 'M8', 'M9', 'id_12', 'id_15', 'id_16', 'id_23', 'id_27', 'id_28', 'id_29', 'id_30',            'id_31', 'id_33', 'id_34', 'id_35', 'id_36', 'id_37', 'id_38', 'DeviceType', 'DeviceInfo']# fisrt 53 columnscols = ['TransactionID', 'TransactionDT', 'TransactionAmt',        'ProductCD', 'card1', 'card2', 'card3', 'card4', 'card5', 'card6',        'addr1', 'addr2', 'dist1', 'dist2', 'P_emaildomain', 'R_emaildomain',        'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8', 'C9', 'C10', 'C11',        'C12', 'C13', 'C14', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7', 'D8',        'D9', 'D10', 'D11', 'D12', 'D13', 'D14', 'D15', 'M1', 'M2', 'M3', 'M4',        'M5', 'M6', 'M7', 'M8', 'M9']# V COLUMNS TO LOAD DECIDED BY CORRELATION EDA# https://www.kaggle.com/cdeotte/eda-for-columns-v-and-idv = [1, 3, 4, 6, 8, 11]v += [13, 14, 17, 20, 23, 26, 27, 30]v += [36, 37, 40, 41, 44, 47, 48]v += [54, 56, 59, 62, 65, 67, 68, 70]v += [76, 78, 80, 82, 86, 88, 89, 91]# v += [96, 98, 99, 104] #relates to groups, no NANv += [107, 108, 111, 115, 117, 120, 121, 123]  # maybe group, no NANv += [124, 127, 129, 130, 136]  # relates to groups, no NAN# LOTS OF NAN BELOWv += [138, 139, 142, 147, 156, 162]  # b1v += [165, 160, 166]  # b1v += [178, 176, 173, 182]  # b2v += [187, 203, 205, 207, 215]  # b2v += [169, 171, 175, 180, 185, 188, 198, 210, 209]  # b2v += [218, 223, 224, 226, 228, 229, 235]  # b3v += [240, 258, 257, 253, 252, 260, 261]  # b3v += [264, 266, 267, 274, 277]  # b3v += [220, 221, 234, 238, 250, 271]  # b3v += [294, 284, 285, 286, 291, 297]  # relates to grous, no NANv += [303, 305, 307, 309, 310, 320]  # relates to groups, no NANv += [281, 283, 289, 296, 301, 314]  # relates to groups, no NAN# v += [332, 325, 335, 338] # b4 lots NANcols += ['V' + str(x) for x in v]dtypes = {}for c in cols + ['id_0' + str(x) for x in range(1, 10)] + ['id_' + str(x) for x in range(10, 34)]:    dtypes[c] = 'float32'for c in str_type:    dtypes[c] = 'category'# load data and mergeprint("load data...")X_train = pd.read_csv(path_train_transaction, index_col="TransactionID", dtype=dtypes, usecols=cols + ["isFraud"])train_id = pd.read_csv(path_train_id, index_col="TransactionID", dtype=dtypes)X_train = X_train.merge(train_id, how="left", left_index=True, right_index=True)X_test = pd.read_csv(path_test_transaction, index_col="TransactionID", dtype=dtypes, usecols=cols)test_id = pd.read_csv(path_test_id, index_col="TransactionID", dtype=dtypes)X_test = X_test.merge(test_id, how="left", left_index=True, right_index=True)# targety_train = X_train["isFraud"]del train_id, test_id, X_train["isFraud"]print("X_train shape:{}, X_test shape:{}".format(X_train.shape, X_test.shape))

       

load data...X_train shape:(590540, 213), X_test shape:(506691, 213)

       In [21]

# transform D feature "time delta" as "time point"for i in range(1, 16):    if i in [1, 2, 3, 5, 9]:        continue    X_train["D" + str(i)] = X_train["D" + str(i)] - X_train["TransactionDT"] / np.float32(60 * 60 * 24)    X_test["D" + str(i)] = X_test["D" + str(i)] - X_test["TransactionDT"] / np.float32(60 * 60 * 24)# encoding function# frequency encodedef encode_FE(df1, df2, cols):    for col in cols:        df = pd.concat([df1[col], df2[col]])        vc = df.value_counts(dropna=True, normalize=True).to_dict()        vc[-1] = -1        nm = col + "FE"        df1[nm] = df1[col].map(vc)        df1[nm] = df1[nm].astype("float32")        df2[nm] = df2[col].map(vc)        df2[nm] = df2[nm].astype("float32")        print(col)# label encodedef encode_LE(col, train=X_train, test=X_test, verbose=True):    df_comb = pd.concat([train[col], test[col]], axis=0)    df_comb, _ = pd.factorize(df_comb)    nm = col    if df_comb.max() > 32000:        train[nm] = df_comb[0: len(train)].astype("float32")        test[nm] = df_comb[len(train):].astype("float32")    else:        train[nm] = df_comb[0: len(train)].astype("float16")        test[nm] = df_comb[len(train):].astype("float16")    del df_comb    gc.collect()    if verbose:        print(col)def encode_AG(main_columns, uids, aggregations=["mean"], df_train=X_train, df_test=X_test, fillna=True, usena=False):    for main_column in main_columns:        for col in uids:            for agg_type in aggregations:                new_column = main_column + "_" + col + "_" + agg_type                temp_df = pd.concat([df_train[[col, main_column]], df_test[[col, main_column]]])                if usena:                    temp_df.loc[temp_df[main_column] == -1, main_column] = np.nan                #求每个uid下,该col的均值或标准差                temp_df = temp_df.groupby([col])[main_column].agg([agg_type]).reset_index().rename(                    columns={agg_type: new_column})                #将uid设成index                temp_df.index = list(temp_df[col])                temp_df = temp_df[new_column].to_dict()                #temp_df是一个映射字典                df_train[new_column] = df_train[col].map(temp_df).astype("float32")                df_test[new_column] = df_test[col].map(temp_df).astype("float32")                if fillna:                    df_train[new_column].fillna(-1, inplace=True)                    df_test[new_column].fillna(-1, inplace=True)                print(new_column)# COMBINE FEATURES交叉特征def encode_CB(col1, col2, df1=X_train, df2=X_test):    nm = col1 + '_' + col2    df1[nm] = df1[col1].astype(str) + '_' + df1[col2].astype(str)    df2[nm] = df2[col1].astype(str) + '_' + df2[col2].astype(str)    encode_LE(nm, verbose=False)    print(nm, ', ', end='')# GROUP AGGREGATION NUNIQUEdef encode_AG2(main_columns, uids, train_df=X_train, test_df=X_test):    for main_column in main_columns:        for col in uids:            comb = pd.concat([train_df[[col] + [main_column]], test_df[[col] + [main_column]]], axis=0)            mp = comb.groupby(col)[main_column].agg(['nunique'])['nunique'].to_dict()            train_df[col + '_' + main_column + '_ct'] = train_df[col].map(mp).astype('float32')            test_df[col + '_' + main_column + '_ct'] = test_df[col].map(mp).astype('float32')            print(col + '_' + main_column + '_ct, ', end='')print("encode cols...")# TRANSACTION AMT CENTSX_train['cents'] = (X_train['TransactionAmt'] - np.floor(X_train['TransactionAmt'])).astype('float32')X_test['cents'] = (X_test['TransactionAmt'] - np.floor(X_test['TransactionAmt'])).astype('float32')print('cents, ', end='')

       

encode cols...cents,

       In [19]

# FREQUENCY ENCODE: ADDR1, CARD1, CARD2, CARD3, P_EMAILDOMAINencode_FE(X_train, X_test, ['addr1', 'card1', 'card2', 'card3', 'P_emaildomain'])# COMBINE COLUMNS CARD1+ADDR1, CARD1+ADDR1+P_EMAILDOMAINencode_CB('card1', 'addr1')encode_CB('card1_addr1', 'P_emaildomain')# FREQUENCY ENOCDEencode_FE(X_train, X_test, ['card1_addr1', 'card1_addr1_P_emaildomain'])# GROUP AGGREGATEencode_AG(['TransactionAmt', 'D9', 'D11'], ['card1', 'card1_addr1', 'card1_addr1_P_emaildomain'], ['mean', 'std'],          usena=False)for col in str_type:    encode_LE(col, X_train, X_test)"""Feature Selection - Time ConsistencyWe added 28 new feature above. We have already removed 219 V Columns from correlation analysis done here. So we currently have 242 features now. We will now check each of our 242 for "time consistency". We will build 242 models. Each model will be trained on the first month of the training data and will only use one feature. We will then predict the last month of the training data. We want both training AUC and validation AUC to be above AUC = 0.5. It turns out that 19 features fail this test so we will remove them.  Additionally we will remove 7 D columns that are mostly NAN. More techniques for feature selection are listed here"""cols = list(X_train.columns)cols.remove('TransactionDT')for c in ['D6', 'D7', 'D8', 'D9', 'D12', 'D13', 'D14']:    cols.remove(c)# FAILED TIME CONSISTENCY TESTfor c in ['C3', 'M5', 'id_08', 'id_33']:    cols.remove(c)for c in ['card4', 'id_07', 'id_14', 'id_21', 'id_30', 'id_32', 'id_34']:    cols.remove(c)for c in ['id_' + str(x) for x in range(22, 28)]:    cols.remove(c)print('NOW USING THE FOLLOWING', len(cols), 'FEATURES.')# CHRIS - TRAIN 75% PREDICT 25%idxT = X_train.index[:3 * len(X_train) // 4]idxV = X_train.index[3 * len(X_train) // 4:]print(X_train.info())# X_train = X_train.convert_objects(convert_numeric=True)# X_test = X_test.convert_objects(convert_numeric=True)for col in str_type:    print(col)    X_train[col] = X_train[col].astype(int)    X_test[col] = X_test[col].astype(int)print("after transform:")print(X_train.info())# fillnafor col in cols:    X_train[col].fillna(-1, inplace=True)    X_test[col].fillna(-1, inplace=True)

   In [22]

START_DATE = datetime.datetime.strptime('2017-11-30', '%Y-%m-%d')X_train['DT_M'] = X_train['TransactionDT'].apply(lambda x: (START_DATE + datetime.timedelta(seconds=x)))X_train['DT_M'] = (X_train['DT_M'].dt.year - 2017) * 12 + X_train['DT_M'].dt.monthX_test['DT_M'] = X_test['TransactionDT'].apply(lambda x: (START_DATE + datetime.timedelta(seconds=x)))X_test['DT_M'] = (X_test['DT_M'].dt.year - 2017) * 12 + X_test['DT_M'].dt.monthprint("training...")if BUILD95:    oof = np.zeros(len(X_train))    preds = np.zeros(len(X_test))    skf = GroupKFold(n_splits=6)    for i, (idxT, idxV) in enumerate(skf.split(X_train, y_train, groups=X_train['DT_M'])):        month = X_train.iloc[idxV]['DT_M'].iloc[0]        print('Fold', i, 'withholding month', month)        print(' rows of train =', len(idxT), 'rows of holdout =', len(idxV))        clf = xgb.XGBClassifier(            n_estimators=5000,            max_depth=12,            learning_rate=0.02,            subsample=0.8,            colsample_bytree=0.4,            missing=-1,            eval_metric='auc',            # USE CPU            # nthread=4,            # tree_method='hist'            # USE GPU            tree_method='gpu_hist'        )        h = clf.fit(X_train[cols].iloc[idxT], y_train.iloc[idxT],                    eval_set=[(X_train[cols].iloc[idxV], y_train.iloc[idxV])],                    verbose=100, early_stopping_rounds=200)        oof[idxV] += clf.predict_proba(X_train[cols].iloc[idxV])[:, 1]        preds += clf.predict_proba(X_test[cols])[:, 1] / skf.n_splits        del h, clf        x = gc.collect()    print('#' * 20)    print('XGB95 OOF CV=', roc_auc_score(y_train, oof))if BUILD95:    sample_submission = pd.read_csv(path_sample_submission)    sample_submission.isFraud = preds    sample_submission.to_csv(path_submission, index=False)X_train['day'] = X_train.TransactionDT / (24 * 60 * 60)X_train['uid'] = X_train.card1_addr1.astype(str) + '_' + np.floor(X_train.day - X_train.D1).astype(str)X_test['day'] = X_test.TransactionDT / (24 * 60 * 60)X_test['uid'] = X_test.card1_addr1.astype(str) + '_' + np.floor(X_test.day - X_test.D1).astype(str)# FREQUENCY ENCODE UIDencode_FE(X_train, X_test, ['uid'])# AGGREGATEencode_AG(['TransactionAmt', 'D4', 'D9', 'D10', 'D15'], ['uid'], ['mean', 'std'], fillna=True, usena=True)# AGGREGATEencode_AG(['C' + str(x) for x in range(1, 15) if x != 3], ['uid'], ['mean'], X_train, X_test, fillna=True, usena=True)# AGGREGATEencode_AG(['M' + str(x) for x in range(1, 10)], ['uid'], ['mean'], fillna=True, usena=True)# AGGREGATEencode_AG2(['P_emaildomain', 'dist1', 'DT_M', 'id_02', 'cents'], ['uid'], train_df=X_train, test_df=X_test)# AGGREGATEencode_AG(['C14'], ['uid'], ['std'], X_train, X_test, fillna=True, usena=True)# AGGREGATEencode_AG2(['C13', 'V314'], ['uid'], train_df=X_train, test_df=X_test)# AGGREATEencode_AG2(['V127', 'V136', 'V309', 'V307', 'V320'], ['uid'], train_df=X_train, test_df=X_test)# NEW FEATUREX_train['outsider15'] = (np.abs(X_train.D1 - X_train.D15) > 3).astype('int8')X_test['outsider15'] = (np.abs(X_test.D1 - X_test.D15) > 3).astype('int8')print('outsider15')cols = list(X_train.columns)cols.remove('TransactionDT')for c in ['D6', 'D7', 'D8', 'D9', 'D12', 'D13', 'D14']:    if c in cols:        cols.remove(c)for c in ['oof', 'DT_M', 'day', 'uid']:    if c in cols:        cols.remove(c)# FAILED TIME CONSISTENCY TESTfor c in ['C3', 'M5', 'id_08', 'id_33']:    if c in cols:        cols.remove(c)for c in ['card4', 'id_07', 'id_14', 'id_21', 'id_30', 'id_32', 'id_34']:    if c in cols:        cols.remove(c)for c in ['id_' + str(x) for x in range(22, 28)]:    if c in cols:        cols.remove(c)print('NOW USING THE FOLLOWING', len(cols), 'FEATURES.')print(np.array(cols))if BUILD96:    oof = np.zeros(len(X_train))    preds = np.zeros(len(X_test))    skf = GroupKFold(n_splits=6)    for i, (idxT, idxV) in enumerate(skf.split(X_train, y_train, groups=X_train['DT_M'])):        month = X_train.iloc[idxV]['DT_M'].iloc[0]        print('Fold', i, 'withholding month', month)        print(' rows of train =', len(idxT), 'rows of holdout =', len(idxV))        clf = xgb.XGBClassifier(            n_estimators=5000,            max_depth=12,            learning_rate=0.02,            subsample=0.8,            colsample_bytree=0.4,            missing=-1,            eval_metric='auc',            # USE CPU            # nthread=4,            # tree_method='hist'            # USE GPU            tree_method='gpu_hist'        )        h = clf.fit(X_train[cols].iloc[idxT], y_train.iloc[idxT],                    eval_set=[(X_train[cols].iloc[idxV], y_train.iloc[idxV])],                    verbose=100, early_stopping_rounds=200)        oof[idxV] += clf.predict_proba(X_train[cols].iloc[idxV])[:, 1]        preds += clf.predict_proba(X_test[cols])[:, 1] / skf.n_splits        del h, clf        x = gc.collect()    print('#' * 20)    print('XGB96 OOF CV=', roc_auc_score(y_train, oof))if BUILD96:    sample_submission = pd.read_csv(path_sample_submission)    sample_submission.isFraud = preds    sample_submission.to_csv(path_submission, index=False)

   

总结

本项目主要对IEEE-CIS Fraud Detection相关资料进行了收集汇总,目的是学习特征的构建。

数据的提交结果如下:(提交需要科学上网)

数据集 IEEE-CIS Fraud Detection

线上评分0.959221

以上就是【金融风控系列】_[2]_欺诈识别的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/61782.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月11日 02:48:38
下一篇 2025年11月11日 02:53:15

相关推荐

  • 比特币交易所官网版app 比特币交易平台最新版入口

    比特币交易所app是一款专业、安全、可靠的数字资产交易服务平台,致力于为全球用户提供便捷的比特币、以太坊等主流加密货币的交易服务。它拥有强大的技术团队和严格的资金管理系统,确保用户的资产安全和交易体验。本文将为您提供官方正版的app下载渠道,您只需点击本文中提供的最新版入口链接,即可轻松下载并开始您…

    2025年12月8日
    000
  • 欧交易所app官网下载 欧意交易所app官网获取链接

    欧易OKX是一款全球知名的数字资产服务平台,为用户提供多样化的数字资产交易、投资等服务。凭借其强大的技术支持、丰富的交易对和良好的用户体验,成为了许多数字资产爱好者的选择。本文将为您提供官方app的下载与安装教程 欧易OKX官网: 应用下载指南 首先,您需要获取应用的安装文件。为了方便用户,我们在此…

    2025年12月8日
    000
  • Upbit在Solana上上线MOODENG:一场模因币狂热?

    upbit在solana上上线moodeng引发市场暴涨!这是迷因币的未来,还是又一场加密过山车? Upbit在Solana上上线MOODENG:迷因币热潮升温? 韩国最大的加密货币交易平台Upbit近日正式引入基于Solana链的迷因币MOODENG!这一举动在整个数字资产市场掀起轩然大波。这究竟…

    2025年12月8日
    000
  • 比特币、加密货币、立即购买:解码最新趋势与隐藏瑰宝

    比特币现在是最好的加密货币投资选择吗?探索比特币的飙升、崛起的山寨币和顶级p2e游戏。 比特币、加密货币、立即购买:解读最新趋势与隐藏机遇 比特币最近表现活跃,整个加密货币市场都在热议。现在是买入的最佳时机吗?让我们深入探讨最新的趋势,并揭示这个不断变化的市场中潜在的投资机会。 比特币强势上涨:突破…

    2025年12月8日
    000
  • ustd交易软件 ustd交易app安卓版/ios版地址

    本文推荐了三款主流的USDT交易App并进行了详细对比分析。1. 币安(Binance)功能强大、流动性顶尖,适合经验丰富的交易者;2. 欧易(OKX)界面友好、操作简便,适合初学者和中级用户;3. Gate.io以丰富的山寨币选择著称,适合热衷投资新兴项目的用户。文章建议新手从OKX或Gate.i…

    2025年12月8日
    000
  • 虚拟货币正规交易app最新版2025 虚拟货币交易所安卓版官方入口

    虚拟货币正规交易app是一款为全球数字资产用户设计的专业、安全且功能全面的交易平台。它集成了实时的市场行情、丰富的交易品类、深度的图表工具以及便捷的资产管理服务,致力于为用户提供一个稳定流畅的交易环境。本文将为您提供该app 2025最新版的官方下载渠道,点击本文中提供的下载链接,即可轻松获取并安装…

    2025年12月8日
    000
  • 如何参与IDO?首次去中心化发行实战指南

    去中心化发行(ido)作为一种新兴的项目融资方式,正在吸引着加密世界的目光。与传统的融资模式不同,ido直接在去中心化交易平台(dex)上进行,为普通用户提供了早期接触新项目的机会。对于初次尝试参与ido的用户,了解其运作机制和具体流程至关重要。本文将详细介绍参与ido的实战步骤和需要进行的准备。 …

    2025年12月8日
    000
  • 币安新版本下载 币安binance新版本入口

    币安交易所入口 币安是一家领先的全球性加密货币交易平台,提供广泛的数字资产交易和金融服务。它以其高流动性、强大的交易引擎以及多样化的产品而闻名。 官方下载地址: 关于币安交易所的详细介绍 1. 全面的交易产品与资产支持: 币安平台提供极其广泛的数字资产交易对,覆盖比特币、以太坊以及众多其他主流和新兴…

    2025年12月8日
    000
  • 怎么避免买到貔貅币 如何辨别貔貅币

    貔貅币是一种只允许买入无法卖出的恶意加密货币,为规避此类骗局,需采取以下措施:1.使用Go+ Security或Token Sniffer等工具审查智能合约是否存在黑名单、代理合约或高交易税,并确认合约是否已开源验证;2.通过区块链浏览器分析链上交易数据,观察买卖是否失衡及卖方身份是否单一;3.检查…

    2025年12月8日
    000
  • 币圈被套了该怎样解套

    面对加密资产被套问题,答案是采取理性策略应对,包括原地不动等待反弹、分批补仓拉低均价、果断止损释放资金、调仓换股优化配置、利用持仓创造被动收益。1.原地不动适用于持有基本面良好的主流币且仓位不重;2.分批补仓需采用金字塔式或定投式方法降低持仓成本;3.果断止损用于逻辑已失效或无基本面的资产并提前设定…

    2025年12月8日
    000
  • 以太坊app官方版/官网入口/手机版安装

    本指南旨在帮助用户找到以太坊的官方信息渠道,并介绍几款安全可靠的手机端应用。通过了解这些工具的特点和正确的安装方式,您可以更安全、更便捷地探索以太坊生态系统。 精选以太坊手机应用推荐 手机应用是与以太坊网络和去中心化应用(DApps)交互的主要门户。选择一款安全、可靠的应用至关重要。以下是几款在社区…

    2025年12月8日
    000
  • 比特币交易所app安卓入口 比特币正规交易平台安卓版

    比特币交易所app是一款专为数字货币投资者打造的专业交易平台。它提供了实时的市场行情、安全便捷的交易服务以及丰富的图表分析工具,帮助用户随时随地掌握市场动态,做出明智的投资决策。其简洁的操作界面和严格的风控体系,为用户的数字资产安全保驾护航。本文将为您提供该正规交易平台的官方安卓版下载入口与安装教程…

    2025年12月8日
    000
  • 2025年哪些数字货币潜力大?十大热门币种分析

    2025年十大潜力数字货币包括比特币、以太坊、索拉纳等,它们在技术、生态和市场方面具备显著优势。1. 比特币凭借“数字黄金”属性和机构入场巩固领导地位;2. 以太坊通过PoS升级和Layer 2扩容推动DeFi和NFT发展;3. 索拉纳以高性能和低成本在DeFi与游戏领域崛起;4. BNB依托币安生…

    2025年12月8日 好文分享
    000
  • 比特币正规交易app 比特币交易所app官网 比特币交易平台app下载

    这是一款功能强大的比特币及其他主流数字资产交易平台应用,致力于为全球用户提供一个安全、透明、高效的交易环境。该app集成了实时行情、专业的k线图表、多样化的交易对以及便捷的资产管理功能。其采用银行级别的多重加密和风控体系,全力保障用户的资产安全。本文将为您提供官方app的下载渠道,点击本文中提供的下…

    2025年12月8日
    000
  • 如何下载以太坊官方App?以太坊交易所App使用指南

    以太坊官方应用是连接用户与以太坊生态系统的官方渠道。这款应用旨在为用户提供安全、便捷的方式来管理基于以太坊的数字资产,包括以太币(eth)及各种erc-20、erc-721等标准的代币。它使用户能够轻松与去中心化应用(dapps)进行交互,参与去中心化金融(defi)活动,并及时获取以太坊网络的最新…

    2025年12月8日
    000
  • 欧意交易所app官方下载 欧意交易所app获取网址入口

    欧易(OKX)是一款全球领先的数字资产服务平台,为全球用户提供广泛的数字资产交易服务,包括比特币、以太坊等多种主流加密货币的现货和衍生品交易。它凭借安全可靠的系统、丰富多样的交易产品和流畅的用户体验,赢得了广大投资者的信赖。本文将为您提供官方app的下载与安装指引 欧易(OKX)官网: 第一步:官方…

    2025年12月8日
    000
  • 币安交易所app官方链接 币安binance官方最新地址

    币安交易所简介与官方最新地址 币安(binance)是全球知名的数字货币交易平台。它凭借庞大的交易量和广泛支持的数字资产种类,成为全球加密货币交易领域的重要参与者。平台致力于为用户提供安全、稳定、高效的数字资产交易与服务。自成立以来,币安迅速成长,建立了一个涵盖交易、投资、孵化、慈善等多个领域的强大…

    2025年12月8日
    000
  • 交易所排名 币圈前十交易所有哪些

    在数字资产的世界里,%ignore_a_1%交易所扮演着至关重要的角色,它们是连接普通用户与复杂加密金融市场的核心桥梁。这些平台不仅仅提供简单的买卖服务,其业务范围已经扩展到涵盖衍生品交易、资产质押、流动性挖框、新项目发行乃至去中心化金融应用的入口等多个维度。一个交易所的综合实力,通常通过其交易量、…

    2025年12月8日 好文分享
    000
  • 比安官网地址链接 比安最新官网地址

    比安,即binance,是全球领先的数字货币交易平台之一。该平台成立于2017年,迅速发展成为全球用户量和交易量最大的加密货币交易平台。binance提供包括现货交易、合约交易、期权交易等在内的多种交易服务,支持数百种加密货币的交易对。平台以其高流动性、相对较低的交易费用以及强大的技术架构而受到全球…

    2025年12月8日
    000
  • 币安交易所最新地址 币安如何下载

    要确保币安账户安全,请遵循以下步骤:1.访问币安官方网站,确保URL正确以避免诈骗网站;2.检查币安采取的安全措施,包括双因子身份验证、反网络钓鱼代码和高级加密;3.启用双因子身份验证以增强安全性;4.定期检查登录记录,发现可疑活动立即更改密码并联系支持;5.避免使用公共Wi-Fi登录账户;6.定期…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信