Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
【金融风控系列】_[2]_欺诈识别_创想鸟

【金融风控系列】_[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)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
中国独享!三星心系天下系列新品发布会官宣10月11日见:万元折叠机皇来了
上一篇 2025年11月11日 02:49:54
钉钉公告无法查看如何解决
下一篇 2025年11月11日 02:51:56

相关推荐

  • 从制造到“质造”,格创东智助力TCL摘得中国质量奖

    从制造到“质造”,格创东智助力TCL摘得中国质量奖从制造到“质造”,格创东智助力TCL摘得中国质量奖从制造到“质造”,格创东智助力TCL摘得中国质量奖从制造到“质造”,格创东智助力TCL摘得中国质量奖

    9月16日,tcl科技凭借“极致、领先、协同”的质量管理模式,成功斩获第五届中国质量奖,成为本届广东省及大湾区唯一获此殊荣的企业。这一奖项不仅彰显了tcl在质量管理体系上的卓越成就,也凸显了其智能制造与数字化转型背后的中坚力量——格创东智,在工业质量数智化领域所发挥的关键作用。 作为TCL战略孵化的…

    2026年9月25日 • 用户投稿
    900
  • qq浏览器如何彻底卸载干净 QQ浏览器彻底卸载与残留清理方法

    qq浏览器如何彻底卸载干净 QQ浏览器彻底卸载与残留清理方法qq浏览器如何彻底卸载干净 QQ浏览器彻底卸载与残留清理方法qq浏览器如何彻底卸载干净 QQ浏览器彻底卸载与残留清理方法qq浏览器如何彻底卸载干净 QQ浏览器彻底卸载与残留清理方法

    1、通过系统设置卸载QQ浏览器主程序;2、使用腾讯柠檬等清理工具扫描并清除残留文件;3、手动检查Android/data/com.tencent.mtt/等路径删除遗留数据。 如果您在卸载QQ浏览器后发现仍有文件或数据残留,可能是因为标准卸载流程未能清除所有相关项。以下是几种彻底移除QQ浏览器及其残…

    2026年9月25日 • 用户投稿
    900
  • DeepSeek是否有开源版本 官方提供的开源模型及使用限制说明

    DeepSeek是否有开源版本 官方提供的开源模型及使用限制说明DeepSeek是否有开源版本 官方提供的开源模型及使用限制说明DeepSeek是否有开源版本 官方提供的开源模型及使用限制说明DeepSeek是否有开源版本 官方提供的开源模型及使用限制说明

    对于关注大模型技术的用户而言,了解DeepSeek是否提供开源模型及其相关信息是重要的。DeepSeek确实提供了部分模型作为开源版本,供社区学习和使用。本文旨在详细介绍DeepSeek官方提供的开源模型系列,说明获取这些模型的途径,并重点阐述使用这些开源模型时需要注意的官方限制与许可说明,帮助用户…

    2026年9月25日 • 用户投稿
    000
  • 利用AWS Pinpoint高效发送注册验证码(OTP)教程

    利用AWS Pinpoint高效发送注册验证码(OTP)教程利用AWS Pinpoint高效发送注册验证码(OTP)教程利用AWS Pinpoint高效发送注册验证码(OTP)教程利用AWS Pinpoint高效发送注册验证码(OTP)教程

    本文旨在指导开发者如何高效利用AWS Pinpoint服务发送用户注册验证码(OTP),解决传统AWS SNS在处理动态、未预注册手机号时的局限性。我们将深入探讨Pinpoint作为首选方案的优势,提供具体实现步骤和代码示例,并分享最佳实践,确保OTP消息的可靠、快速送达。 理解注册验证码(OTP)…

    2026年9月25日 • 用户投稿
    000
  • 2025拍照最强的手机排名:最佳夜景拍照手机

    2025拍照最强的手机排名:最佳夜景拍照手机2025拍照最强的手机排名:最佳夜景拍照手机2025拍照最强的手机排名:最佳夜景拍照手机2025拍照最强的手机排名:最佳夜景拍照手机

    随着用户对智能手机摄影性能的要求日益提高,长焦拍摄能力逐渐成为继主摄像头之后影响购机决策的重要因素。尤其是在演唱会、旅行记录、夜间远摄等使用场景中,出色的长焦表现能够显著提升成像清晰度与画面质感。当前市场上,多款旗舰机型在长焦技术方面实现了突破性进展,其中vivo x300 pro、三星galaxy…

    2026年9月25日 • 用户投稿
    000
  • Win10系统下战网无法安装怎么办?

    Win10系统下战网无法安装怎么办?Win10系统下战网无法安装怎么办?Win10系统下战网无法安装怎么办?Win10系统下战网无法安装怎么办?

    战网无法安装怎么处理?当大家遇到战网客户端无法安装的情况时,应该怎么办呢?毕竟组队开黑的小伙伴还在等你。其实,这种现象通常是因为权限问题或是注册表中有之前的残留数据造成的。经过多次尝试,小编终于找到了一个有效的解决方案,接下来就为大家详细讲解具体的操作步骤。 1,按下Ctrl+Alt+Delete组…

    2026年9月25日 • 用户投稿
    000
  • 如何在搜狗浏览器中调整字体大小?自定义字体的操作

    如何在搜狗浏览器中调整字体大小?自定义字体的操作如何在搜狗浏览器中调整字体大小?自定义字体的操作如何在搜狗浏览器中调整字体大小?自定义字体的操作如何在搜狗浏览器中调整字体大小?自定义字体的操作

    如果您在使用搜狗浏览器时觉得网页文字过小或过大,影响阅读体验,可以通过内置的字体设置功能进行调整。以下是几种不同的方法来修改搜狗浏览器中的字体大小。 一、通过设置菜单调整字体大小 此方法通过浏览器的系统设置入口直接修改默认字体大小,适用于所有网页的全局调整。 1、打开搜狗浏览器应用,点击屏幕右下角的…

    2026年9月25日 • 用户投稿
    900
  • 如何提高debian readdir的并发处理能力

    如何提高debian readdir的并发处理能力如何提高debian readdir的并发处理能力如何提高debian readdir的并发处理能力如何提高debian readdir的并发处理能力

    提升 Debian 系统 readdir 并发处理能力,需要综合考虑文件系统、内核参数、应用程序优化和并行处理技术等多个方面。以下是一些实用建议: 一、选择高效的文件系统 Debian 默认的 ext4/ext3 文件系统性能良好,但对于高并发场景,可以考虑以下选择: XFS: 尤其适用于存储大量文…

    2026年9月25日 • 用户投稿
    100
  • 疑似华为阔比例大折叠曝光:采用7.6-7.7英寸14:10屏幕

    疑似华为阔比例大折叠曝光:采用7.6-7.7英寸14:10屏幕疑似华为阔比例大折叠曝光:采用7.6-7.7英寸14:10屏幕疑似华为阔比例大折叠曝光:采用7.6-7.7英寸14:10屏幕疑似华为阔比例大折叠曝光:采用7.6-7.7英寸14:10屏幕

    9月28日,有数码博主爆料称,疑似华为下一代阔比例大折叠屏手机mate x7正在测试中。该机采用展开后尺寸为7.6-7.7英寸,并采用14:10的比例。该博主称,新机将硬刚苹果折叠屏手机。 华为Mate X6 据CNMO了解,华为Mate X7有望在今年11月份与Mate 80系列一同亮相。在核心性…

    2026年9月25日 • 用户投稿
    100
  • x浏览器怎么开启或关闭多线程下载_x浏览器下载管理器多线程设置

    x浏览器怎么开启或关闭多线程下载_x浏览器下载管理器多线程设置x浏览器怎么开启或关闭多线程下载_x浏览器下载管理器多线程设置x浏览器怎么开启或关闭多线程下载_x浏览器下载管理器多线程设置x浏览器怎么开启或关闭多线程下载_x浏览器下载管理器多线程设置

    答案:可通过调整x浏览器多线程设置提升下载速度。依次进入设置→下载管理器→多线程下载,选择合适线程数以平衡速度与稳定性,关闭则设为1或关闭选项。 如果您在使用x浏览器下载文件时发现速度较慢或希望提升下载效率,可以通过调整多线程下载设置来优化下载性能。多线程下载能够将文件分割成多个部分并行下载,从而加…

    2026年9月25日 • 用户投稿
    000
  • 如何自定义debian readdir的输出格式

    如何自定义debian readdir的输出格式如何自定义debian readdir的输出格式如何自定义debian readdir的输出格式如何自定义debian readdir的输出格式

    本文介绍几种在Debian系统中自定义readdir输出格式的方法,readdir是用于读取目录内容的系统调用。 方法一:使用opendir和readdir函数 以下C程序演示如何使用opendir和readdir函数读取目录并自定义输出: #include #include #include #i…

    2026年9月25日 • 用户投稿
    400
  • 【新手入门】使用ERNIE-4.5-0.3B-Paddle从原始文本构建知识图谱

    1. 概述 本文将探讨如何使用ernie-4.5-0.3b-paddle模型从原始文本构建知识图谱。通过结合大语言模型(llm)和检索增强生成(rag)技术实现文本生成,帮助我们从非结构化数据中高效提取实体和关系信息。 2. 什么是知识图谱? 2.1 基本概念 知识图谱是一种语义网络,它表示和连接现…

    2026年9月25日
    000
  • 解决Android Studio Gradle构建问题的网络仓库配置指南

    解决Android Studio Gradle构建问题的网络仓库配置指南解决Android Studio Gradle构建问题的网络仓库配置指南解决Android Studio Gradle构建问题的网络仓库配置指南解决Android Studio Gradle构建问题的网络仓库配置指南

    本文旨在解决Android Studio项目中因网络限制导致的Gradle构建失败问题,特别是“插件未找到”等错误。核心解决方案是通过配置替代的Maven仓库(如阿里云镜像)来绕过网络障碍,确保Gradle能够成功解析和下载所需的插件与依赖,从而恢复项目的正常构建。 1. 问题背景与常见症状 在an…

    2026年9月25日 • 用户投稿
    000
  • AI Overviews适合初学者使用吗 功能易用性与学习曲线评估

    AI Overviews适合初学者使用吗 功能易用性与学习曲线评估AI Overviews适合初学者使用吗 功能易用性与学习曲线评估AI Overviews适合初学者使用吗 功能易用性与学习曲线评估AI Overviews适合初学者使用吗 功能易用性与学习曲线评估

    AI Overviews作为一项新兴功能,许多初学者对其适用性感到好奇。本文旨在评估AI Overviews对于初学者而言是否友好,将从功能易用性和学习曲线两个方面进行深入探讨。文章会详细解析其操作流程,帮助用户理解并掌握如何有效地使用这项功能,从而解决标题中关于其适合初学者使用的问题。 ☞☞☞AI…

    2026年9月25日 • 用户投稿
    200
  • MAC怎么快速切换不同的音频输出设备_Mac菜单栏音量图标切换声音输出

    MAC怎么快速切换不同的音频输出设备_Mac菜单栏音量图标切换声音输出MAC怎么快速切换不同的音频输出设备_Mac菜单栏音量图标切换声音输出MAC怎么快速切换不同的音频输出设备_Mac菜单栏音量图标切换声音输出MAC怎么快速切换不同的音频输出设备_Mac菜单栏音量图标切换声音输出

    通过菜单栏音量图标可快速切换音频输出设备,点击音量图标并选择目标设备即可生效;2. 使用快捷键与自动化工具如Keyboard Maestro或快捷指令创建AppleScript脚本,一键切换指定设备;3. 进入系统设置→声音→输出,手动选择设备,适用于初次配置或排查问题。 如果您在Mac上连接了多个…

    2026年9月25日 • 用户投稿
    100
  • 谷歌浏览器开发者工具网络面板数据延迟如何修复

    谷歌浏览器开发者工具网络面板数据延迟如何修复谷歌浏览器开发者工具网络面板数据延迟如何修复谷歌浏览器开发者工具网络面板数据延迟如何修复谷歌浏览器开发者工具网络面板数据延迟如何修复

    延迟通常由网络环境、浏览器状态或页面性能导致。先通过Waterfall分析DNS、TCP等阶段耗时,确认是否真实延迟;更换网络或设备对比速度;清除缓存、禁用缓存或使用无痕模式排除干扰;检查代理设置并切换为公共DNS;最后结合Performance面板排查脚本阻塞与资源瓶颈。 Chrome开发者工具网…

    2026年9月25日 • 用户投稿
    800
  • sublime怎么对选中的行进行字母排序 _sublime选中行排序方法

    sublime怎么对选中的行进行字母排序 _sublime选中行排序方法sublime怎么对选中的行进行字母排序 _sublime选中行排序方法sublime怎么对选中的行进行字母排序 _sublime选中行排序方法sublime怎么对选中的行进行字母排序 _sublime选中行排序方法

    使用快捷键Ctrl + F9(Win/Linux)或Cmd + F9(Mac)可对选中行按首字符字典序升序排列,需确保整行或每行部分内容被选中,若需降序或更复杂排序建议安装Sort Lines等插件。 在 Sublime Text 中对选中的行进行字母排序非常简单,不需要安装额外插件,内置功能即可完…

    2026年9月25日 • 用户投稿
    000
  • Debian回收机制是否完善

    Debian回收机制是否完善Debian回收机制是否完善Debian回收机制是否完善Debian回收机制是否完善

    Debian 6 (Squeeze) 作为长期支持版本,其文件管理机制与现代操作系统略有不同。它没有内置的回收站功能,但这并不意味着缺乏文件恢复能力。Debian 6 提供多种替代方案来保护和恢复误删文件。 文件恢复方法: 隐藏的垃圾文件夹: Debian 6 使用隐藏的 .local/share/…

    2026年9月25日 • 用户投稿
    000
  • 为什么有些硬件参数在官方宣传中总是模糊不清?

    为什么有些硬件参数在官方宣传中总是模糊不清?为什么有些硬件参数在官方宣传中总是模糊不清?为什么有些硬件参数在官方宣传中总是模糊不清?为什么有些硬件参数在官方宣传中总是模糊不清?

    厂商模糊硬件参数主要出于制造差异、竞争策略和营销灵活性。半导体生产存在体质差异,通过“binning”分级后需用“最高可达”等表述覆盖全合格品,避免售后风险;同时防止竞争对手轻易获取技术细节,保持领先优势;还能为后续优化留空间,适应市场变化。此外,复杂参数不易被大众理解,模糊化有助于简化宣传。面对此…

    2026年9月25日 • 用户投稿
    200
  • Gemini是否能导出成思维导图 AI生成内容结构化展示方式详解

    Gemini是否能导出成思维导图 AI生成内容结构化展示方式详解Gemini是否能导出成思维导图 AI生成内容结构化展示方式详解Gemini是否能导出成思维导图 AI生成内容结构化展示方式详解Gemini是否能导出成思维导图 AI生成内容结构化展示方式详解

    针对“gemini是否能导出成思维导图 ai生成内容结构化展示方式详解”这一问题,本文将详细阐述如何利用gemini生成有助于构建思维导图的结构化内容,并介绍如何配合外部工具完成思维导图的制作。您将了解到gemini作为一款大型语言模型,其主要输出形式是文本。它并不具备直接生成或导出图形化思维导图文…

    2026年9月25日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信