Kaggle系列-IEEE-CIS Fraud Detection第一名復現

賽題背景

想象一下,站在雜貨店的收銀臺,身後排着長隊,收銀員沒有那麼安靜地宣佈您的信用卡被拒絕了。在這一刻,你可能沒有想到決定你命運的數據科學。
非常尷尬有木有?當然你肯定有足夠的資金爲50個最親密的朋友辦一場盛大的納喬派對,然後你又試了一次,但是還是同樣的結果。此時你只能站在另外一邊,讓收銀員爲下一個客戶服務時,你收到了銀行的短信。“如果你真的想花500美元買切達乾酪,請按1。”
雖然現在可能很麻煩(而且常常很尷尬),但這種防欺詐系統實際上每年爲消費者節省數百萬美元。來自ieee計算智能協會(ieee-cis)的研究人員希望在改善客戶體驗的同時,提升這個數字。有了更高準確度的欺詐檢測率,您就可以在沒有麻煩的情況下繼續使用您的芯片。
ieee-cis在各種人工智能和機器學習領域,包括深層神經網絡、模糊系統、演化計算和羣智能等等。今天,他們正與世界領先的支付服務公司Vesta Corporation合作,爲防欺詐行業尋求最佳解決方案,現在邀請您也加入此次挑戰。
在本次競賽中,您將在一個具有挑戰性的大型數據集上對你的機器學習模型進行基準測試。這些數據來自Vesta的真實電子商務交易,並且包含了從設備類型到產品功能的各種特徵。您還可以創建新的特徵來改善結果。
如果成功,您將提高全球數百萬人的欺詐交易警報的有效性,幫助數十萬企業減少欺詐損失並增加收入。當然,你也可以爲你自己減少誤報的麻煩。

致謝:
Vesta公司爲這次競爭提供了數據集。Vesta公司是保證電子商務支付解決方案的先驅。維斯塔公司成立於1995年,開創了電信行業無擔保卡(CNP)支付交易的先河。此後,Vesta在全球範圍內堅定地擴展了數據科學和機器學習能力,鞏固了其在保證電子商務支付方面的領先地位。如今,Vesta每年爲超過180億美元的交易提供擔保。

Magic Feature

https://www.kaggle.com/cdeotte/xgb-fraud-with-magic-0-9600

# frequency encode
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)


# label encode
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[col])
    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 NUNIQUE
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='')

鏈接:https://zhuanlan.zhihu.com/p/85947569

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章