Xiamen InternationalBankデジタルイノベーションファイナンシャルカップモデリングコンペティション

2020 Xiamen International Bank Digital Innovation Financial Cup Modeling Contest Baseline Sharing

スコア:0.34

コンテストの住所:https://www.dcjingsai.com/v2/cmptDetail.html?id = 439&= 76f6724e6fa9455a9b5ef44402c08653&ssoLoginpToken =&sso_global_session = e44c4d57-cd19-4ada-a1d3-a5250%VRD0%1205

競技の背景

デジタルファイナンスの時代において、銀行業界におけるビッグデータや人工知能技術の開発は日々変化しており、業界の機関はデジタル変革の開発を加速させています。Xiamen International Bankは、独自のテクノロジーを備えた中小規模の大手銀行として、長年にわたってデジタル金融テクノロジーの力を一貫して使用し、「デジタルエンパワーメント」の概念を実践し、スマートリスクコントロール、スマートマーケティング、スマートオペレーション、スマート管理を推進し​​、人工知能を使用し続けてきました。インテリジェントな顧客サービスモデルとビッグデータ分析テクノロジーを備えた金融インテリジェントマーケティングサービスシステムを確立して、マーケティングプロセスのインテリジェンスと精度のレベルを向上させ、より親密で利用可能な金融サービスを顧客に提供します。

Xiamen InternationalBankとXiamenUniversityのDataMining Research Centerは、あらゆる分野のエリートと機械学習や人工知能などの最新の技術的問題を調査するための業界交換プラットフォームを構築するために、DataCastleと共同で「2020Second XiamenInternationalBank」を開催します。 Shuchuang FinancialCup「モデリングコンペティション」。このコンペティションは「ファイナンス+テクノロジー」をコンセプトに、ファイナンシャルマーケティングの実シーンに焦点を当て、総額31万元のボーナスを獲得しました。

仕事

科学技術の発展に伴い、銀行は、日常のビジネス処理やチャネルトランザクションなどの顧客のニーズを満たすために、さまざまなオンラインおよびオフラインの顧客連絡先を次々と作成してきました。多数の顧客に直面している銀行は、顧客のニーズに対するより包括的で正確な洞察を必要としています。実際の事業展開では、顧客の喪失を発見し、顧客の資金の変化を予測し、銀行資金の損失を減らすために、事前に/タイムリーに顧客にマーケティングを行う必要があります。このコンペティションは、実際のビジネスシナリオにおける顧客の行動と資産情報をモデリングオブジェクトとして提供します。一方で、各競技者の実際のデータマイニング機能を示すことを望んでいます。他方、競技者は、準決勝でモデリング結果を組み合わせて、対応するものを提案する必要があります。マーケティングソリューションは、データ分析の価値を完全に反映しています。

ラベルの説明

ラベル-1ダウン

ラベル0安定性を維持する

ラベル1プロモーション

公式説明

顧客の貢献は主に顧客のオウム値に関連しています

評価機能KAPPA

カッパ係数は、整合性テストに使用される指標であり、分類の効果を測定するためにも使用できます。分類の問題の場合、いわゆる一貫性とは、モデルの予測結果が実際の分類結果と一致しているかどうかです。カッパ係数の計算は混同行列に基づいており、値は-1から1の間で、通常は0より大きくなります。

混同行列に基づくカッパ係数の計算式は次のとおりです:

[外部リンクの画像転送に失敗しました。ソースサイトにリーチ防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-kP1yqr6Y-1604027964570)(https://www.zhihu.com/equation?tex=kappa+%3D+%5Cfrac %7Bp_o-p_e%7D%7B1-p_e%7D +)]

その中で:

[外部リンクの画像転送に失敗しました。ソースサイトにリーチ防止チェーンメカ​​ニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-EZJSQjE6-1604027964572)(https://www.zhihu.com/equation?tex=p_o+%3D+%5Cfrac+ %7B%E5%AF%B9%E8%A7%92%E7%BA%BF%E5%85%83%E7%B4%A0%E4%B9%8B%E5%92%8C%7D%7B%E6 %95%B4%E4%B8%AA%E7%9F%A9%E9%98%B5%E5%85%83%E7%B4%A0%E4%B9%8B%E5%92%8C%7D)] 、実際にはaccです。

[外部リンクの画像転送に失敗しました。元のサイトにリーチ防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-Oddrpc4s-1604027964573)(https://www.zhihu.com/equation?tex=p_e+%3D+%5Cfrac %7B%5Csum_%7Bi%7D%7B%E7%AC%ACi%E8%A1%8C%E5%85%83%E7%B4%A0%E4%B9%8B%E5%92%8C +%2A +%E7 %AC%ACi%E5%88%97%E5%85%83%E7%B4%A0%E4%B9%8B%E5%92%8C%7D%7D%7B%28%5Csum%7B%E7%9F %A9%E9%98%B5%E6%89%80%E6%9C%89%E5%85%83%E7%B4%A0%7D%29%5E2%7D +)]、つまり、対応する「実際の数と予測された数の積の合計を「サンプルの総数の2乗」で割ったもの。

詳細については、次のURLを参照してください。

https://zhuanlan.zhihu.com/p/67844308

データ紹介

コンテストのウェブサイト、タスク、データを参照してください

プログラム

データを観察したところ、各四半期の最終月にB6、B7、およびB8があることがわかりました。テストセットの場合、彼の先月のcust_noには、顧客の将来の傾向を予測するために、ほとんどのcust_noが含まれています。予測は前四半期の状況に基づいており、機能をマージすると次の3つのcust_noが失われ、最初の2か月をマージすると同じものが失われます:['0xb2d0afb2'、 '0xb2d2ed87'、 '0xb2d2d9d2']。ここでは、最初にラベルを0に設定します。NANを含む列を失いました。

     #没找到这三个cust_no。摸奖。
    low=pd.DataFrame()
    low['cust_no']=['0xb2d0afb2', '0xb2d2ed87', '0xb2d2d9d2']
    low['label']=[0,0,0]

基本特性

現在、機能はなく、I3、I8、およびI12用の単純なエンコーダーのみです。次に、グループトレーニング(顧客レベル)にI3を使用すると、残りはフルスタッドになります。

 le = LabelEncoder()
    train_B7['I3'] = le.fit_transform(train_B7['I3'].astype(str))
    test_B7['I3'] = le.transform(test_B7['I3'].astype(str))
    le = LabelEncoder()
    train_B7['I8'] = le.fit_transform(train_B7['I8'].astype(str))
    test_B7['I8'] = le.transform(test_B7['I8'].astype(str))
    le = LabelEncoder()
    train_B7['I12'] = le.fit_transform(train_B7['I12'].astype(str))
    test_B7['I12'] = le.transform(test_B7['I12'].astype(str))

    predictionsB4 = pd.DataFrame()


    predictionsB7 = pd.DataFrame()
    scoresB7 = list()

    for eve_id in tqdm(test_B7.I3.unique()):
        prediction,score= run_lgb_id(train_B7, test_B7, target='label', eve_id=eve_id)
        predictionsB7=predictionsB7.append(prediction)
        scoresB7.append(score)

使用したデータ

トレーニングセットでは、9月と12月のデータのみが使用され、テストセットでも3月のデータが使用されます。

    # 1.读取文件:
    train_label_3=pd.read_csv(r'E:\For_test2-10\data\厦门_data\train_label\y_Q3_3.csv')
    train_label_4 = pd.read_csv(r'E:\For_test2-10\data\厦门_data\train_label\y_Q4_3.csv')

    train_3 = pd.DataFrame()


    train_4 = pd.DataFrame()



    id3_data = pd.read_csv(r'E:\For_test2-10\data\厦门_data\train_feature\cust_avli_Q3.csv')
    id4_data = pd.read_csv(r'E:\For_test2-10\data\厦门_data\train_feature\cust_avli_Q4.csv')

    #合并有效客户的label
    train_label_3 = pd.merge(left=id3_data, right=train_label_3, how='inner', on='cust_no')
    train_label_4 = pd.merge(left=id4_data, right=train_label_4, how='inner', on='cust_no')
    #合并个人信息
    inf3_data = pd.read_csv(r'E:\For_test2-10\data\厦门_data\train_feature\cust_info_q3.csv')
    inf4_data = pd.read_csv(r'E:\For_test2-10\data\厦门_data\train_feature\cust_info_q4.csv')
    train_label_3 = pd.merge(left=inf3_data, right=train_label_3, how='inner', on='cust_no')
    train_label_4 = pd.merge(left=inf4_data, right=train_label_4, how='inner', on='cust_no')



    #第3季度信息提取
    for i in range(9,10):
        aum_3=pd.read_csv(r'E:\For_test2-10\data\厦门_data\train_feature\aum_m'+str(i)+'.csv')


        be_3 = pd.read_csv(r'E:\For_test2-10\data\厦门_data\train_feature\behavior_m' + str(i) + '.csv')


        cun_3 = pd.read_csv(r'E:\For_test2-10\data\厦门_data\train_feature\cunkuan_m' + str(i) + '.csv')

        fre_3=pd.merge(left=aum_3,right=be_3,how='inner', on='cust_no')
        fre_3=pd.merge(left=fre_3,right=cun_3,how='inner', on='cust_no')
        train_3=train_3.append(fre_3)

    train_fe3=pd.merge(left=fre_3,right=train_label_3,how='inner', on='cust_no')

    train_fe3.to_csv(r'E:\For_test2-10\data\厦门_data\train_feature\train3_fe_B7.csv',index=None)

    #第4季度信息提取
    for i in range(12,13):
        aum_4=pd.read_csv(r'E:\For_test2-10\data\厦门_data\train_feature\aum_m'+str(i)+'.csv')


        be_4 = pd.read_csv(r'E:\For_test2-10\data\厦门_data\train_feature\behavior_m' + str(i) + '.csv')


        cun_4 = pd.read_csv(r'E:\For_test2-10\data\厦门_data\train_feature\cunkuan_m' + str(i) + '.csv')

        fre_4=pd.merge(left=aum_4,right=be_4,how='inner', on='cust_no')
        fre_4=pd.merge(left=fre_4,right=cun_4,how='inner', on='cust_no')
        train_3=train_3.append(fre_4)

    train_fe4=pd.merge(left=fre_4,right=train_label_4,how='inner', on='cust_no')

    train_fe4.to_csv(r'E:\For_test2-10\data\厦门_data\train_feature\train4_fe_B7.csv',index=None)

    train_B7=[train_fe3,train_fe4]
    train_B7=pd.concat(train_B7)

    test = pd.DataFrame()
    idtest_data = pd.read_csv(r'E:\For_test2-10\data\厦门_data\test_feature\cust_avli_Q1.csv')
    inftest_data = pd.read_csv(r'E:\For_test2-10\data\厦门_data\test_feature\cust_info_q1.csv')
    test_inf = pd.merge(left=inftest_data, right=idtest_data, how='inner', on='cust_no')
    # 第3季度信息提取
    for i in range(3, 4):
        aum = pd.read_csv(r'E:\For_test2-10\data\厦门_data\test_feature\aum_m' + str(i) + '.csv')

        be = pd.read_csv(r'E:\For_test2-10\data\厦门_data\test_feature\behavior_m' + str(i) + '.csv')

        cun = pd.read_csv(r'E:\For_test2-10\data\厦门_data\test_feature\cunkuan_m' + str(i) + '.csv')

        fre = pd.merge(left=aum, right=be, how='inner', on='cust_no')
        fre = pd.merge(left=fre, right=cun, how='inner', on='cust_no')
        test = test.append(fre)

    test_fe = pd.merge(left=test, right=test_inf, how='inner', on='cust_no')
    test_fe.to_csv(r'E:\For_test2-10\data\厦门_data\train_feature\test_fe_B7.csv', index=None)

    test_B7=test_fe.dropna(axis=1, how='any')
    train_B7=train_B7.dropna(axis=1, how='any')

モデル

LGBモデルを使用して、5回の相互検証

def run_lgb_id(df_train, df_test, target, eve_id):
    feature_names = list(
        filter(lambda x: x not in ['label','cust_no'], df_train.columns))


    # 提取 eve_ID 对应的数据集
    df_train = df_train[df_train.I3 == eve_id]
    df_test = df_test[df_test.I3 == eve_id]



    model = lgb.LGBMRegressor(num_leaves=32,
                              max_depth=6,
                              learning_rate=0.08,
                              n_estimators=10000,
                              subsample=0.9,
                              feature_fraction=0.8,
                              reg_alpha=0.5,
                              reg_lambda=0.8,
                              random_state=2020)
    oof = []
    prediction = df_test[['cust_no']]
    prediction[target] = 0

    kfold = KFold(n_splits=5, random_state=2020)
    for fold_id, (trn_idx, val_idx) in enumerate(kfold.split(df_train, df_train[target])):
        X_train = df_train.iloc[trn_idx][feature_names]
        Y_train = df_train.iloc[trn_idx][target]
        X_val = df_train.iloc[val_idx][feature_names]
        Y_val = df_train.iloc[val_idx][target]

        lgb_model = model.fit(X_train,
                              Y_train,
                              eval_names=['train', 'valid'],
                              eval_set=[(X_train, Y_train), (X_val, Y_val)],
                              verbose=0,
                              eval_metric='mse',
                              early_stopping_rounds=20,
                             )

        pred_val = lgb_model.predict(X_val, num_iteration=lgb_model.best_iteration_)
        df_oof = df_train.iloc[val_idx][[target, 'cust_no']].copy()
        df_oof['pred'] = pred_val
        oof.append(df_oof)

        pred_test = lgb_model.predict(df_test[feature_names], num_iteration=lgb_model.best_iteration_)

        prediction[target] += pred_test / kfold.n_splits


        del lgb_model, pred_val, pred_test, X_train, Y_train, X_val, Y_val
        gc.collect()

    df_oof = pd.concat(oof)
    score = mean_squared_error(df_oof[target], df_oof['pred'])
    print('MSE:', score)

    return prediction,score
  

最後に、MSEはオフライン評価指標として使用されます

大物はそれを変更することができます

機能をマージするときにcust_noマージを削除することが可能です笑

オンライン:約0.34

コードは主にHengmenが共有するベースラインから借用しています

初めてベースラインを共有するとき

皆さん、ありがとうございました

おすすめ

転載: blog.csdn.net/wusiyang001025/article/details/109381815