Перейти к содержанию

Пример сгенерированного кода

Пример Python-кода, экспортированного featminer для воспроизведения отобранных признаков на датасете Home Credit Default Risk и последующего обучения CatBoost.

import pandas as pd
from catboost import CatBoostClassifier
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import train_test_split


DATASET_PATH = "path/to/dataset.parquet"
OUTPUT_PATH = "path/to/features.parquet"

df = pd.read_parquet(DATASET_PATH)

features = df.groupby("SK_ID_CURR")["TARGET"].max().to_frame("TARGET")
features["credit_active__closed__fraction"] = (
    (df["CREDIT_ACTIVE"] == "Closed")
    .groupby(df["SK_ID_CURR"])
    .mean()
)
features[
    "credit_active__active__credit_type__consumer_credit__fraction_3b00388f"
] = (
    (
        (df["CREDIT_ACTIVE"] == "Active")
        & (df["CREDIT_TYPE"] == "Consumer credit")
    )
    .groupby(df["SK_ID_CURR"])
    .mean()
)
features[
    "credit_active__active__credit_type__credit_card__fraction_6037a9ac"
] = (
    (
        (df["CREDIT_ACTIVE"] == "Active")
        & (df["CREDIT_TYPE"] == "Credit card")
    )
    .groupby(df["SK_ID_CURR"])
    .mean()
)
features["credit_active__active__count"] = (
    (df["CREDIT_ACTIVE"] == "Active")
    .groupby(df["SK_ID_CURR"])
    .sum()
)
features[
    "days_credit_enddate__credit_type__consumer_credit__max_99cfc7c9"
] = (
    df["DAYS_CREDIT_ENDDATE"][df["CREDIT_TYPE"] == "Consumer credit"]
    .groupby(df["SK_ID_CURR"])
    .max()
)
features["days_credit__max"] = (
    df["DAYS_CREDIT"]
    .groupby(df["SK_ID_CURR"])
    .max()
)
features[
    "days_credit_update__credit_type__consumer_credit__max_e0df8a57"
] = (
    df["DAYS_CREDIT_UPDATE"][df["CREDIT_TYPE"] == "Consumer credit"]
    .groupby(df["SK_ID_CURR"])
    .max()
)
features[
    "days_credit_update__credit_type__credit_card__max_2d1a15b2"
] = (
    df["DAYS_CREDIT_UPDATE"][df["CREDIT_TYPE"] == "Credit card"]
    .groupby(df["SK_ID_CURR"])
    .max()
)
features["days_credit_enddate__sum"] = (
    df["DAYS_CREDIT_ENDDATE"]
    .groupby(df["SK_ID_CURR"])
    .sum()
)
features["days_enddate_fact__sum"] = (
    df["DAYS_ENDDATE_FACT"]
    .groupby(df["SK_ID_CURR"])
    .sum()
)
features["amt_credit_sum_debt__sum"] = (
    df["AMT_CREDIT_SUM_DEBT"]
    .groupby(df["SK_ID_CURR"])
    .sum()
)
features[
    "amt_credit_sum_debt__credit_type__credit_card__sum_00e9a147"
] = (
    df["AMT_CREDIT_SUM_DEBT"][df["CREDIT_TYPE"] == "Credit card"]
    .groupby(df["SK_ID_CURR"])
    .sum()
)
features["amt_credit_sum_debt__mean"] = (
    df["AMT_CREDIT_SUM_DEBT"]
    .groupby(df["SK_ID_CURR"])
    .mean()
)
features[
    "amt_credit_sum_debt__credit_type__consumer_credit__mean_24a83e39"
] = (
    df["AMT_CREDIT_SUM_DEBT"][df["CREDIT_TYPE"] == "Consumer credit"]
    .groupby(df["SK_ID_CURR"])
    .mean()
)
features["days_credit__mean"] = (
    df["DAYS_CREDIT"]
    .groupby(df["SK_ID_CURR"])
    .mean()
)
features["days_credit__credit_active__active__mean"] = (
    df["DAYS_CREDIT"][df["CREDIT_ACTIVE"] == "Active"]
    .groupby(df["SK_ID_CURR"])
    .mean()
)
features[
    "days_credit__credit_type__consumer_credit__mean_9e4167de"
] = (
    df["DAYS_CREDIT"][df["CREDIT_TYPE"] == "Consumer credit"]
    .groupby(df["SK_ID_CURR"])
    .mean()
)
features[
    "days_credit__credit_type__credit_card__mean_e03b83de"
] = (
    df["DAYS_CREDIT"][df["CREDIT_TYPE"] == "Credit card"]
    .groupby(df["SK_ID_CURR"])
    .mean()
)
features["days_credit_enddate__min"] = (
    df["DAYS_CREDIT_ENDDATE"]
    .groupby(df["SK_ID_CURR"])
    .min()
)
features[
    "days_credit_enddate__credit_type__credit_card__min_9827bf25"
] = (
    df["DAYS_CREDIT_ENDDATE"][df["CREDIT_TYPE"] == "Credit card"]
    .groupby(df["SK_ID_CURR"])
    .min()
)
features["amt_credit_sum__credit_active__active__min"] = (
    df["AMT_CREDIT_SUM"][df["CREDIT_ACTIVE"] == "Active"]
    .groupby(df["SK_ID_CURR"])
    .min()
)
features[
    "amt_credit_sum_debt__credit_type__credit_card__min_328ec1af"
] = (
    df["AMT_CREDIT_SUM_DEBT"][df["CREDIT_TYPE"] == "Credit card"]
    .groupby(df["SK_ID_CURR"])
    .min()
)
features["days_credit_update__min"] = (
    df["DAYS_CREDIT_UPDATE"]
    .groupby(df["SK_ID_CURR"])
    .min()
)
features["days_credit_update__credit_active__closed__min"] = (
    df["DAYS_CREDIT_UPDATE"][df["CREDIT_ACTIVE"] == "Closed"]
    .groupby(df["SK_ID_CURR"])
    .min()
)
features[
    "days_credit_update__credit_type__consumer_credit__min_d115248d"
] = (
    df["DAYS_CREDIT_UPDATE"][df["CREDIT_TYPE"] == "Consumer credit"]
    .groupby(df["SK_ID_CURR"])
    .min()
)
features["days_credit__std"] = (
    df["DAYS_CREDIT"]
    .groupby(df["SK_ID_CURR"])
    .std()
)

target = features.pop("TARGET")
X_train, X_valid, y_train, y_valid = train_test_split(
    features,
    target,
    test_size=0.2,
    random_state=42,
    stratify=target,
)

model = CatBoostClassifier(
    iterations=500,
    eval_metric="AUC",
    random_seed=42,
    verbose=False,
)
model.fit(
    X_train,
    y_train,
    eval_set=(X_valid, y_valid),
    early_stopping_rounds=50,
)

valid_probability = model.predict_proba(X_valid)[:, 1]
print(f"Validation ROC AUC: {roc_auc_score(y_valid, valid_probability):.6f}")

features.to_parquet(OUTPUT_PATH, index=True)
print(
    f"Saved {len(features)} rows, "
    f"{len(features.columns)} features to {OUTPUT_PATH}"
)