Machine Learning

نشت اصلاح‌شده: انتخاب feature روی کل دیتاست

اگه featureهای همبسته با هدف رو قبل از cross-validation انتخاب کنی، روی نویز خالص هم AUCهای خیره‌کننده می‌سازی — اول نمایش عددی، بعد اصلاح با pipeline.

کاربرد

اینکه بفهمی چرا یه امتیاز CV برابر 0.9 می‌تونه روی داده‌های عریض (ژنومیک، مالی) یه artefactِ کامل باشه.

پیش‌نیازها

scikit-learn, numpy

Python
import numpy as np
from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import make_pipeline

rng = np.random.default_rng(0)
X_bruit = rng.normal(size=(200, 5000))    # bruit pur, AUCUN signal
y_bruit = rng.integers(0, 2, 200)

# INCORRECT : sélection sur TOUT le dataset, puis CV
X_sel = SelectKBest(f_classif, k=20).fit_transform(X_bruit, y_bruit)
auc_triche = cross_val_score(LogisticRegression(), X_sel, y_bruit,
                             cv=5, scoring="roc_auc").mean()

# CORRECT : la sélection vit dans le pipeline, refittée par fold
pipe = make_pipeline(SelectKBest(f_classif, k=20), LogisticRegression())
auc_vraie = cross_val_score(pipe, X_bruit, y_bruit,
                            cv=5, scoring="roc_auc").mean()

print(f"AUC avec fuite : {auc_triche:.3f}   <- signal fantôme")
print(f"AUC corrigée   : {auc_vraie:.3f}   <- ~0.5, comme attendu")

نتیجه

AUC avec fuite : 0.852   <- signal fantôme
AUC corrigée   : 0.497   <- ~0.5, comme attendu
>>> X_bruit.shape, float(y_bruit.mean())
((200, 5000), 0.515)
Fuite de donnéesFeature selectionAnti-patternDémonstration

اسنیپت‌های مرتبط

بازگشت به آزمایشگاه داده