Kontes CatBoost dan ML

Analisis Data dan Model Basis





pengantar

Artikel ini didasarkan pada data dari kompetisi yang diterbitkan Data Didorong untuk mengatasi masalah sumber air di Tanzania. 





Informasi kompetisi tersebut diperoleh oleh Kementerian Sumber Daya Air Tanzania menggunakan platform open source bernama Taarifa. Tanzania adalah negara terbesar di Afrika Timur dengan populasi sekitar 60 juta. Separuh penduduk tidak memiliki akses air bersih, dan 2/3 penduduk menderita sanitasi yang buruk. Di rumah-rumah miskin, keluarga seringkali harus berjalan kaki berjam-jam untuk mendapatkan air dari pompa air. 





Miliaran dolar bantuan luar negeri disediakan untuk mengatasi masalah air tawar Tanzania. Namun, hingga saat ini pemerintah Tanzania belum dapat menyelesaikan masalah tersebut. Sebagian besar pompa air benar-benar rusak atau praktis tidak berfungsi, dan sisanya memerlukan perbaikan besar. Kementerian Sumber Daya Air Tanzania setuju dengan Taarifa dan mereka meluncurkan kompetisi dengan harapan mendapatkan petunjuk dari komunitas tentang cara menyelesaikan tugas mereka.





Data

Terdapat banyak karakteristik (fitur) yang terkait dengan pompa air dalam datanya, ada informasi yang berkaitan dengan letak geografis titik-titik dengan air, organisasi yang membangun dan mengelolanya, serta beberapa data tentang wilayah, wilayah pemerintah daerah. Ada juga informasi tentang jenis dan jumlah pembayaran. 





Titik pasokan air dibagi menjadi dapat diservis , tidak berfungsi dan dapat diservis, tetapi perlu diperbaiki . Tujuan dari kompetisi ini adalah untuk membangun model yang memprediksi fungsionalitas titik-titik suplai air.

Data tersebut berisi 59.400 baris dan 40 kolom. Label target terdapat dalam file terpisah.

Metrik yang digunakan untuk kompetisi ini adalah tingkat klasifikasi , yang menghitung persentase baris di mana kelas yang diprediksi cocok dengan kelas yang sebenarnya di set pengujian. Nilai maksimumnya adalah 1 dan minimumnya 0. Tujuannya adalah untuk memaksimalkan tingkat klasifikasi .





Analisis data

Deskripsi bidang dalam tabel data:





  • jumlah_tsh - total head statis (jumlah air yang tersedia ke titik suplai air)





  • date_recorded — 





  • funder — 





  • gps_height — 





  • installer — 





  • longitude — GPS ()





  • latitude — GPS ()





  • wpt_name — ,





  • num_private — 





  • basin — 





  • subvillage — 





  • region — 





  • region_code —  ()





  • district_code — () 





  • lga — 





  • ward —





  • population — 





  • public_meeting — /





  • recorded_by —





  • scheme_management — 





  • scheme_name — 





  • permit — 





  • construction_year — 





  • extraction_type — 





  • extraction_type_group — 





  • extraction_type_class — 





  • management — 





  • management_group — 





  • payment — 





  • payment_type — 





  • water_quality — 





  • quality_group — 





  • quantity — 





  • quantity_group — 





  • source — 





  • source_type — 





  • source_class — 





  • waterpoint_type — 





  • waterpoint_type_group — 





    ,  —  :





    , . :





    • (under-sampling)





    • , (over-sampling)





    •  —  (SMOTE)





    • ,





    .





    , .





    .





    , scheme_name, , .





    / . permit, installer funder.





    .





    , . , (quantity_group).





    , , . . , . , , , .





    ? , quality_group.





    , , . .





    quality_group .





     —  (waterpoint_type_group).





    , other . ? , .





     —  , , , 80- . 





    . , . , 500 .





    Danida —  , , . RWSSP ( ), Dhv . , , , . , , , . , , .





    , , , . , .





     —  . .





    , . , .





     —  .





    , , , , - .





    0 . , amount_tsh (label = 0). amount_tsh. , 500 .





, .





  • installer , . . .





  • , 71 (0,95 ), «other».





  • funder.  — 98.





  • . . , . : scheme_management, quantity_group, water_quality, payment_type, extraction_type, waterpoint_type_group, region_code.





  • latitude longitude region_code.





  • subvillage scheme_name.





  • public_meeting permit .





  • subvillage, public_meeting, scheme_name, permit, , . , , .





  • scheme_management, quantity_group, water_quality, region_code, payment_type, extraction_type, waterpoint_type_group, date_recorded, recorded_by , , .





. , , CatBoost. .





, . .





def fit_model(train_pool, test_pool, **kwargs):
    model = CatBoostClassifier(
        max_ctr_complexity=5,
        task_type='CPU',
        iterations=10000,
        eval_metric='AUC',
        od_type='Iter',
        od_wait=500,
        **kwargs
    )return model.fit(
        train_pool,
        eval_set=test_pool,
        verbose=1000,
        plot=False,
        use_best_model=True)
      
      



AUC, , .





.  — 





def classification_rate(y, y_pred):
    return np.sum(y==y_pred)/len(y)
      
      



,  —  . OOF (Out-of-Fold). ; . , .





def get_oof(n_folds, x_train, y, x_test, cat_features, seeds):    ntrain = x_train.shape[0]
    ntest = x_test.shape[0]  
        
    oof_train = np.zeros((len(seeds), ntrain, 3))
    oof_test = np.zeros((ntest, 3))
    oof_test_skf = np.empty((len(seeds), n_folds, ntest, 3))    test_pool = Pool(data=x_test, cat_features=cat_features) 
    models = {}    for iseed, seed in enumerate(seeds):
        kf = StratifiedKFold(
            n_splits=n_folds,
            shuffle=True,
            random_state=seed)          
        for i, (train_index, test_index) in enumerate(kf.split(x_train, y)):
            print(f'\nSeed {seed}, Fold {i}')
            x_tr = x_train.iloc[train_index, :]
            y_tr = y[train_index]
            x_te = x_train.iloc[test_index, :]
            y_te = y[test_index]
            train_pool = Pool(data=x_tr, label=y_tr, cat_features=cat_features)
            valid_pool = Pool(data=x_te, label=y_te, cat_features=cat_features)model = fit_model(
                train_pool, valid_pool,
                loss_function='MultiClass',
                random_seed=seed
            )
            oof_train[iseed, test_index, :] = model.predict_proba(x_te)
            oof_test_skf[iseed, i, :, :] = model.predict_proba(x_test)
            models[(seed, i)] = modeloof_test[:, :] = oof_test_skf.mean(axis=1).mean(axis=0)
    oof_train = oof_train.mean(axis=0)
    return oof_train, oof_test, models
      
      



,  —  seeds.





Kurva belajar dari salah satu lipatan
 

, .





, ().





:





balanced accuracy: 0.6703822994494413
classification rate: 0.8198316498316498
      
      



.





, -5 0,005 , , .





,  —  . , , .





balanced accuracy: 0.6549535670689709
classification rate: 0.8108249158249158
      
      



.





:





  • ;





  • ;





  • CatBoost, ;





  • OOF-;





  • .





Pendekatan yang tepat untuk menyiapkan data dan memilih alat yang tepat untuk membuat model dapat memberikan hasil yang sangat baik bahkan tanpa pembuatan fitur tambahan.





Sebagai tugas pekerjaan rumah, saya sarankan untuk menambahkan fitur baru, memilih parameter model yang optimal, menggunakan perpustakaan lain untuk meningkatkan gradien, dan membangun ansambel dari model yang dihasilkan.





Kode dari artikel tersebut dapat dilihat di sini .








All Articles