CatBoost- und ML-Wettbewerbe

Datenanalyse und Basismodell





EinfĂŒhrung

Dieser Artikel basiert auf Daten eines Wettbewerbs , den Driven Data veröffentlicht hat, um Probleme mit Wasserquellen in Tansania anzugehen. 





Die Informationen fĂŒr den Wettbewerb wurden vom tansanischen Ministerium fĂŒr Wasserressourcen ĂŒber eine Open-Source-Plattform namens Taarifa eingeholt. Tansania ist mit rund 60 Millionen Einwohnern das grĂ¶ĂŸte Land in Ostafrika. Die HĂ€lfte der Bevölkerung hat keinen Zugang zu sauberem Wasser, und 2/3 der Bevölkerung leidet unter schlechten sanitĂ€ren Einrichtungen. In armen HĂ€usern mĂŒssen Familien oft Stunden zu Fuß verbringen, um Wasser aus Wasserpumpen zu holen. 





Milliarden von Dollar an Auslandshilfe werden bereitgestellt, um das SĂŒĂŸwasserproblem in Tansania anzugehen. Die tansanische Regierung konnte dieses Problem jedoch bis heute nicht lösen. Ein erheblicher Teil der Wasserpumpen ist völlig außer Betrieb oder funktioniert praktisch nicht, und der Rest erfordert grĂ¶ĂŸere Reparaturen. Das tansanische Ministerium fĂŒr Wasserressourcen stimmte Taarifa zu und sie starteten einen Wettbewerb in der Hoffnung, Hinweise der Gemeinde zu erhalten, wie sie ihre Aufgaben erfĂŒllen können.





Daten

Es gibt viele Merkmale (Merkmale), die mit Wasserpumpen in den Daten verbunden sind, es gibt Informationen zu den geografischen Standorten von Wasserpunkten, den Organisationen, die sie aufgebaut und verwaltet haben, sowie einige Daten zu den Regionen und Gebietskörperschaften. Es gibt auch Informationen ĂŒber die Art und Anzahl der Zahlungen. 





Die Wasserversorgungspunkte sind in wartungsfĂ€hige , nicht funktionsfĂ€hige und wartungsbedĂŒrftige, aber reparaturbedĂŒrftige unterteilt . Ziel des Wettbewerbs ist es, ein Modell zu erstellen, das die FunktionalitĂ€t von Wasserversorgungspunkten vorhersagt.

Die Daten enthalten 59.400 Zeilen und 40 Spalten. Das Zieletikett ist in einer separaten Datei enthalten.

Die fĂŒr diesen Wettbewerb verwendete Metrik ist die Klassifizierungsrate , die den Prozentsatz der Zeilen berechnet, in denen die vorhergesagte Klasse mit der tatsĂ€chlichen Klasse im Testsatz ĂŒbereinstimmt. Der Maximalwert ist 1 und der Minimalwert ist 0. Das Ziel ist es, die Klassifizierungsrate zu maximieren .





Datenanalyse

Beschreibungen der Felder in der Datentabelle:





  • menge_tsh - statische Gesamthöhe (Wassermenge, die dem Wasserversorgungspunkt zur VerfĂŒgung steht)





  • 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.





Lernkurve einer der Falten
 

, .





, ().





:





balanced accuracy: 0.6703822994494413
classification rate: 0.8198316498316498
      
      



.





, -5 0,005 , , .





,  —  . , , .





balanced accuracy: 0.6549535670689709
classification rate: 0.8108249158249158
      
      



.





:





  • ;





  • ;





  • CatBoost, ;





  • OOF-;





  • .





Der richtige Ansatz zur Datenaufbereitung und Auswahl der richtigen Tools zum Erstellen eines Modells kann auch ohne zusÀtzliche Feature-Generierung hervorragende Ergebnisse liefern.





Als Hausaufgabe schlage ich vor, neue Funktionen hinzuzufĂŒgen, die optimalen Modellparameter auszuwĂ€hlen, andere Bibliotheken zu verwenden, um den Gradienten zu erhöhen, und Ensembles aus den resultierenden Modellen zu erstellen.





Der Code aus dem Artikel kann hier eingesehen werden .








All Articles