<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          百行代碼入手數(shù)據(jù)挖掘競賽~

          共 4544字,需瀏覽 10分鐘

           ·

          2021-12-13 19:13

          本實踐以科大訊飛xDatawhale聯(lián)合舉辦的數(shù)據(jù)挖掘賽為例,給出了百行代碼Baseline,幫助學(xué)習(xí)者更好地結(jié)合賽事實踐。同時,在如何提分上進行了詳細解讀,以便于大家進階學(xué)習(xí)。

          數(shù)據(jù)及背景

          給定實際業(yè)務(wù)中借款人信息,邀請大家建立風(fēng)險識別模型,預(yù)測可能拖欠的借款人。

          實踐&數(shù)據(jù)下載地址:https://challenge.xfyun.cn/topic/info?type=car-loan&ch=dw-sq-1

          實踐代碼

          Baseline采用LightGBM模型,進行了必要的注釋和代碼實現(xiàn),分數(shù)為0.58左右。

          ##?導(dǎo)入第三方包
          import?pandas?as?pd
          import?numpy?as?np
          import?lightgbm?as?lgb

          from?sklearn.model_selection?import?KFold
          from?sklearn.metrics?import?f1_score,?roc_auc_score

          import?warnings
          warnings.filterwarnings('ignore')


          ##?讀取數(shù)據(jù)集,具體下載方式可見操作手冊
          train?=?pd.read_csv('train.csv')
          test?=?pd.read_csv('test.csv')
          sample_submit?=?pd.read_csv('sample_submit.csv')


          ##?訓(xùn)練數(shù)據(jù)及測試數(shù)據(jù)準備
          all_cols?=?[f?for?f?in?train.columns?if?f?not?in?['customer_id','loan_default']]

          x_train?=?train[all_cols]
          x_test?=?test[all_cols]
          y_train?=?train['loan_default']


          ##?作為baseline部分僅使用經(jīng)典的LightGBM作為訓(xùn)練模型,我們還能嘗試XGBoost、CatBoost和NN(神經(jīng)網(wǎng)絡(luò))
          def?cv_model(clf,?train_x,?train_y,?test_x,?clf_name='lgb'):
          ????folds?=?5
          ????seed?=?2021
          ????kf?=?KFold(n_splits=folds,?shuffle=True,?random_state=seed)

          ????train?=?np.zeros(train_x.shape[0])
          ????test?=?np.zeros(test_x.shape[0])

          ????cv_scores?=?[]

          ????for?i,?(train_index,?valid_index)?in?enumerate(kf.split(train_x,?train_y)):
          ????????print('************************************?{}?************************************'.format(str(i+1)))
          ????????trn_x,?trn_y,?val_x,?val_y?=?train_x.iloc[train_index],?train_y[train_index],?train_x.iloc[valid_index],?train_y[valid_index]

          ????????train_matrix?=?clf.Dataset(trn_x,?label=trn_y)
          ????????valid_matrix?=?clf.Dataset(val_x,?label=val_y)

          ????????params?=?{
          ????????????'boosting_type':?'gbdt',
          ????????????'objective':?'binary',
          ????????????'metric':?'auc',
          ????????????'min_child_weight':?5,
          ????????????'num_leaves':?2?**?7,
          ????????????'lambda_l2':?10,
          ????????????'feature_fraction':?0.9,
          ????????????'bagging_fraction':?0.9,
          ????????????'bagging_freq':?4,
          ????????????'learning_rate':?0.01,
          ????????????'seed':?2021,
          ????????????'nthread':?28,
          ????????????'n_jobs':-1,
          ????????????'silent':?True,
          ????????????'verbose':?-1,
          ????????}

          ????????model?=?clf.train(params,?train_matrix,?50000,?valid_sets=[train_matrix,?valid_matrix],?verbose_eval=500,early_stopping_rounds=200)
          ????????val_pred?=?model.predict(val_x,?num_iteration=model.best_iteration)
          ????????test_pred?=?model.predict(test_x,?num_iteration=model.best_iteration)

          ????????train[valid_index]?=?val_pred
          ????????test?+=?test_pred?/?kf.n_splits
          ????????cv_scores.append(roc_auc_score(val_y,?val_pred))
          ????????
          ????????print(cv_scores)
          ???????
          ????print("%s_scotrainre_list:"?%?clf_name,?cv_scores)
          ????print("%s_score_mean:"?%?clf_name,?np.mean(cv_scores))
          ????print("%s_score_std:"?%?clf_name,?np.std(cv_scores))
          ????return?train,?test

          lgb_train,?lgb_test?=?cv_model(lgb,?x_train,?y_train,?x_test)


          ##?預(yù)測結(jié)果
          sample_submit['loan_default']?=?lgb_test
          sample_submit['loan_default']?=?sample_submit['loan_default'].apply(lambda?x:1?if?x>0.25?else?0).values
          sample_submit.to_csv('baseline_result.csv',?index=False)

          上分策略

          上述Baseline是一個較為簡單的Baseline,試跑排名第8。如果想常掛榜首,需要考慮持續(xù)優(yōu)化,這里給出幾種方法:

          1.?加入特征工程

          本代碼實踐僅使用了賽題原始的特征,并沒有進行過多的特征工程,這里還是很值得優(yōu)化,并且相信會有很多提升點。特征工程對比賽結(jié)果的影響非常大,這里給出常見的幾種特征工程操作的介紹:特征交互、特征編碼和特征選擇。

          特征交互

          交互特征的構(gòu)造非常簡單,使用起來卻代價不菲。如果線性模型中包含有交互特征時,那它的訓(xùn)練時間和評分時間就會從 O(n) 增加到 O(n2),其中 n 是單一特征的數(shù)量。

          • 特征和特征之間組合

          • 征和特征之間衍生

          特征編碼

          • one-hot編碼

          • label-encode編碼

          特征選擇

          特征選擇技術(shù)可以精簡掉無用的特征,以降低最終模型的復(fù)雜性,它的最終目的是得到一個簡約模型,在不降低預(yù)測準確率或?qū)︻A(yù)測準確率影響不大的情況下提高計算速度。

          特征選擇不是為了減少訓(xùn)練時間(實際上,一些技術(shù)會增加總體訓(xùn)練時間),而是為了減少模型評分時間

          2.?進行參數(shù)優(yōu)化

          對于模型的參數(shù)部分baseline部分并沒有進行過多的優(yōu)化和實驗,當(dāng)然這也是個比較大的優(yōu)化的,下面給出幾種調(diào)參的參考方法。

          貪心調(diào)參

          先使用當(dāng)前對模型影響最大的參數(shù)進行調(diào)優(yōu),達到當(dāng)前參數(shù)下的模型最優(yōu)化,再使用對模型影響次之的參數(shù)進行調(diào)優(yōu),如此下去,直到所有的參數(shù)調(diào)整完畢。

          網(wǎng)格調(diào)參

          sklearn 提供GridSearchCV用于進行網(wǎng)格搜索,只需要把模型的參數(shù)輸進去,就能給出最優(yōu)化的結(jié)果和參數(shù)。相比起貪心調(diào)參,網(wǎng)格搜索的結(jié)果會更優(yōu),但是網(wǎng)格搜索只適合于小數(shù)據(jù)集,一旦數(shù)據(jù)的量級上去了,很難得出結(jié)果。

          貝葉斯調(diào)參

          給定優(yōu)化的目標函數(shù)(廣義的函數(shù),只需指定輸入和輸出即可,無需知道內(nèi)部結(jié)構(gòu)以及數(shù)學(xué)性質(zhì)),通過不斷地添加樣本點來更新目標函數(shù)的后驗分布(高斯過程,直到后驗分布基本貼合于真實分布)。簡單的說,就是考慮了上一次參數(shù)的信息,從而更好的調(diào)整當(dāng)前的參數(shù)。

          3.?嘗試新的模型

          作為Baseline部分僅使用經(jīng)典的LightGBM作為訓(xùn)練模型,我們還能嘗試XGBoost、CatBoost和NN(神經(jīng)網(wǎng)絡(luò)),這里推薦兩篇Datawhale成員吳忠強的文章做參考。

          上分利器

          • XGBoost模型
          • https://blog.csdn.net/wuzhongqiang/article/details/104854890

          • LightGBM模型
          • https://blog.csdn.net/wuzhongqiang/article/details/105350579
            事實上

          4.?進行模型融合

          模型融合是一種能在各種的機器學(xué)習(xí)任務(wù)上提高準確率的強有力技術(shù),可謂是機器學(xué)習(xí)比賽大殺器,現(xiàn)在介紹基礎(chǔ)上分和進階上分兩種方式。

          基礎(chǔ)上分

          簡單平均和加權(quán)平均是常用的兩種比賽中模型融合的方式。其優(yōu)點是快速、簡單。

          • 平均:(簡單實用)
            • 簡單平均法
            • 加權(quán)平均法
          • 投票:
            • 簡單投票法
            • 加權(quán)投票法
          • 綜合:
            • 排序融合
            • log融合

          進階上分

          stacking在眾多比賽中大殺四方,但是跑過代碼的小伙伴想必能感受到速度之慢,同時stacking多層提升幅度并不能抵消其帶來的時間和內(nèi)存消耗,實際環(huán)境中應(yīng)用還是有一定的難度。

          此外,在有答辯環(huán)節(jié)的比賽中,主辦方也會一定程度上考慮模型的復(fù)雜程度,所以說并不是模型融合的層數(shù)越多越好的。

          • stacking:

            • 構(gòu)建多層模型,并利用預(yù)測結(jié)果再擬合預(yù)測。
          • blending:

            • 選取部分數(shù)據(jù)預(yù)測訓(xùn)練得到預(yù)測結(jié)果作為新特征,帶入剩下的數(shù)據(jù)中預(yù)測。
          • boosting/bagging

          當(dāng)然在比賽中將加權(quán)平均、stacking、blending等混用也是一種策略,可能會收獲意想不到的效果哦!



          整理不易,三連
          瀏覽 67
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美A黄 欧美A色 | 国产精品一级毛片无码视频 | 日韩AV毛片| 精品成人人妻AV一区二区 | 欧美高清一区 |