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.
, .
, ().
:
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 .