.
Если вы частенько работает в
sklearn, то вам точно понравятся нововведения, которые появились👇.
sklearn - библиотека методов и алгоритмов машинного обучения на Python. Для обучения моделей или использования некоторых методов (например, снижения размерности) данные необходимо подготовить:- отфильтровать выбросы
- преобразовать шкалу
- преобразовать распределение
- сгенерировать новые признаки
- дискретизировать и тд.
.
Некоторые наиболее известные:
- StandardScaler - стандартизация
- PolynomialFeatures - создание полиномиальных комбинаций
.
Для таких задач в библиотеке есть широкий выбор средств для создания
Pipeline, например: - make_pipeline
- ColumnTransformer
.
Мы же любим когда данные лежат в пандах 🐼 - там всё удобно и человекочитаемо😍 Но когда начинаются игры с обработкой данных и подготовкой их к обучению моделей, то всё скатывается до массивов
numpy, вот как это выглядело раньше:X, y = load_iris(as_frame=True, return_X_y=True)
sepal_cols = ["sepal length (cm)", "sepal width (cm)"]
petal_cols = ["petal length (cm)", "petal width (cm)"]
preprocessor = ColumnTransformer(
[
("scaler", StandardScaler(), sepal_cols),
("kbin", KBinsDiscretizer(encode="ordinal"), petal_cols),
("Poly", PolynomialFeatures(degree=2, include_bias=False), sepal_cols)
],
)
pipe = make_pipeline(preprocessor)
X_out = preprocessor.fit_transform(X)
print(type(X_out))
display(X_out[:5, :])
# результат будет на 1 рисунке в комментах
.
Массивы
numpy нетакие юзерфрендли, ладно когда мы не создаем новых фич, можно использовать наименования их исходных данных, но когда мы используем полиномиальные фичи, получаются колонки с названиями x0, x1^2 и тд - крайне неудобно.В одном из последних проектов приходилось страдать от этого😭
.
Но смотрите, что произошло после релиза 1.2. Разработчики подарили нам магию, немного изменим код:
X, y = load_iris(as_frame=True, return_X_y=True)
sepal_cols = ["sepal length (cm)", "sepal width (cm)"]
petal_cols = ["petal length (cm)", "petal width (cm)"]
preprocessor = ColumnTransformer(
[
("scaler", StandardScaler(), sepal_cols),
("kbin", KBinsDiscretizer(encode="ordinal"), petal_cols),
("Poly", PolynomialFeatures(degree=2, include_bias=False), sepal_cols)
],
verbose_feature_names_out=False,
).set_output(transform="pandas")
pipe = make_pipeline(preprocessor)
X_out = preprocessor.fit_transform(X)
X_out.sample(n=5, random_state=0)
Новинки:
-
verbose_feature_names_out=False - добавление префикса к названиям колонок, к какому трансформеру они относятся-
set_output(transform="pandas") - истинная магия 🧙♂️, да-да, теперь выход пайплайна будет DataFrame c человекочитаемыми признаками - 2 рисунок в комментах.
Это лучшее нововведение в библиотеках анализа данных с которыми я работаю за последние несколько лет😉.
.
А для тех, кто много работает с моделями появилась классная фича - PartialDependenceDisplay - очень полезная, тк всем хочется узнать, как влияет одна отдельная фича на прогнозы модели
.
А какие вы можете вспомнить изменения, которые упростили вам анализ данных🤔
Еще больше узнать по кнопке👇