Analyse des données et modèle de base
introduction
Cet article est basé sur les données d'un concours publié par Driven Data pour résoudre les problèmes d'approvisionnement en eau en Tanzanie.
Les informations pour le concours ont été obtenues par le ministère tanzanien des ressources en eau à l'aide d'une plate-forme open source appelée Taarifa. La Tanzanie est le plus grand pays d'Afrique de l'Est avec une population d'environ 60 millions d'habitants. La moitié de la population n'a pas accès à l'eau potable et les 2/3 de la population souffrent d'un mauvais assainissement. Dans les maisons pauvres, les familles doivent souvent passer des heures à pied pour obtenir de l'eau des pompes à eau.
Des milliards de dollars d'aide étrangère sont fournis pour s'attaquer au problème de l'eau douce en Tanzanie. Cependant, le gouvernement tanzanien n'a pas été en mesure de résoudre ce problème à ce jour. Une partie importante des pompes à eau est complètement hors service ou ne fonctionne pratiquement pas, et le reste nécessite des réparations majeures. Le ministère tanzanien des ressources en eau était d'accord avec Taarifa et ils ont lancé un concours dans l'espoir d'obtenir des conseils de la communauté sur la façon d'accomplir leurs tâches.
Données
Il y a de nombreuses caractéristiques (caractéristiques) associées aux pompes à eau dans les données, il y a des informations liées aux emplacements géographiques des points avec de l'eau, les organisations qui les ont construits et les gèrent, ainsi que des données sur les régions, les territoires des collectivités locales. Il y a également des informations sur les types et le nombre de paiements.
Points d'approvisionnement en eau sont divisés en réparable , non fonctionnel et utile, mais dans le besoin de réparation . Le but du concours est de construire un modèle prédisant la fonctionnalité des points d'approvisionnement en eau.
Les données contiennent 59 400 lignes et 40 colonnes. L'étiquette cible est contenue dans un fichier séparé.
La métrique utilisée pour cette compétition est le taux de classification , qui calcule le pourcentage de lignes où la classe prédite correspond à la classe réelle dans l'ensemble de test. La valeur maximale est 1 et la valeur minimale est 0. L'objectif est de maximiser le taux de classification .
L'analyse des données
Descriptions des champs dans la table de données:
amount_tsh - charge statique totale (quantité d'eau disponible au point d'alimentation en eau)
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.
, .
, ().
:
balanced accuracy: 0.6703822994494413
classification rate: 0.8198316498316498
.
, -5 0,005 , , .
, — . , , .
balanced accuracy: 0.6549535670689709
classification rate: 0.8108249158249158
.
:
;
;
CatBoost, ;
OOF-;
.
La bonne approche pour préparer les données et choisir les bons outils pour créer un modèle peut donner d'excellents résultats même sans génération de fonctionnalités supplémentaires.
Comme devoir à la maison, je suggère d'ajouter de nouvelles fonctionnalités, de choisir les paramètres de modèle optimaux, d'utiliser d'autres bibliothèques pour amplifier le dégradé et de construire des ensembles à partir des modèles résultants.
Le code de l'article peut être consulté ici .