Как визуализировать зависимость признака от таргета на графике
Что проверяют
Умеете ли вы выбрать график под типы признака и таргета, а не рисовать scatter по привычке. Следом обычно спрашивают, что делать, когда точек миллион или таргет бинарный.
Как отвечать
Выбор определяется парой типов:
- числовой признак и числовой таргет:
sns.scatterplotс прозрачностьюalpha, а на больших данныхhexbinилиsns.histplot(x=..., y=...), чтобы точки не слились в пятно. Форму зависимости показываетsns.regplot(..., lowess=True); - категориальный признак и числовой таргет:
sns.boxplotилиsns.violinplot, категории отсортированы по медиане, редкие объединены в «прочее»; - числовой признак и бинарный таргет: разбить признак на квантили через
pd.qcutи нарисовать долю единиц в каждом бине, это читается лучше любого scatter из нулей и единиц. Второй вариант: распределения признака по классам,sns.kdeplot(data=df, x="age", hue="target", common_norm=False); - категориальный признак и бинарный таргет: столбцы с долей положительного класса по категориям и подписью числа объектов.
Универсальный приём: df.groupby(pd.qcut(df["x"], 10))["y"].agg(["mean", "count"]) и график среднего с доверительным интервалом. Сразу видно, монотонна ли зависимость, где насыщение и есть ли порог, а значит, нужна ли признаку трансформация или хватит линейной модели.
После обучения зависимость смотрят глазами модели: PartialDependenceDisplay.from_estimator из scikit-learn или SHAP dependence plot. Это разные вещи: сырой график показывает данные, PDP показывает, что выучила модель.
Где спотыкаются
Рисуют среднее таргета по категориям без числа объектов. Категория из трёх строк с долей 100% выглядит сильнейшим сигналом, хотя это шум.
Сравнивают распределения классов без нормировки. При дисбалансе 1 к 20 плотность малого класса почти не видна, отсюда common_norm=False или отдельные оси.
Делают выводы о причинности. Сильная зависимость на графике может оказаться утечкой таргета: признак, посчитанный после события, выглядит идеальным, а в проде его ещё нет.