Совместимость с Pandas и многое другое в версии Scikit-Learn ≥1.2.0

Примерно в декабре прошлого года Scikit-Learn выпустила крупное стабильное обновление (v. 1.2.0–1), и, наконец, я могу попробовать некоторые из выделенных новых функций. Теперь он более совместим с Pandas, а некоторые другие функции также помогут нам в задачах регрессии и классификации. Ниже я расскажу о некоторых новых обновлениях с примерами их использования. Давай начнем!

Совместимость с пандами:

Применение некоторой стандартизации данных перед их использованием для обучения модели ML, такой как регрессия или нейронная сеть, является распространенным методом, позволяющим убедиться, что разные функции с различными диапазонами имеют одинаковую важность (если или когда это необходимо) для прогнозов. Scikit-Learn предоставляет различные API предварительной обработки, такие как StandardScaler , MaxAbsScaler и т. д. В более новой версии возможно сохранить формат кадра данных даже после предварительной обработки, как показано ниже:

from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
########################
X, y = load_wine(as_frame=True, return_X_y=True) 
# available from version >=0.23; as_frame
########################
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, 
                                                    random_state=0)
X_train.head(3)

Более новая версия включает возможность сохранить этот формат данных даже после стандартизации:

############
# v1.2.0
############

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler().set_output(transform="pandas") 
## change here

scaler.fit(X_train)
X_test_scaled = scaler.transform(X_test)
X_test_scaled.head(3)

Раньше он изменил бы формат на массив Numpy:

###########
# v 0.24
########### 

scaler.fit(X_train)
X_test_scaled = scaler.transform(X_test)
print (type(X_test_scaled))

>>> <class 'numpy.ndarray'>

Поскольку формат кадра данных остается нетронутым, нам не нужно следить за столбцами, как нам нужно было делать с форматом массива Numpy. Анализ и построение графиков становятся проще:

fig = plt.figure(figsize=(8, 5))
fig.add_subplot(121)
plt.scatter(X_test['proline'], X_test['hue'], 
            c=X_test['alcohol'], alpha=0.8, cmap='bwr')
clb = plt.colorbar()
plt.xlabel('Proline', fontsize=11)
plt.ylabel('Hue', fontsize=11)
fig.add_subplot(122)
plt.scatter(X_test_scaled['proline'], X_test_scaled['hue'], 
            c=X_test_scaled['alcohol'], alpha=0.8, cmap='bwr')
# pretty easy now in the newer version to see the effect

plt.xlabel('Proline (Standardized)', fontsize=11)
plt.ylabel('Hue (Standardized)', fontsize=11)
clb = plt.colorbar()
clb.ax.set_title('Alcohol', fontsize=8)
plt.tight_layout()
plt.show()

Даже когда мы строим конвейер, каждый преобразователь в конвейере можно настроить для возврата кадров данных, как показано ниже:

from sklearn.pipeline import make_pipeline
from sklearn.svm import SVC

clf = make_pipeline(StandardScaler(), SVC())
clf.set_output(transform="pandas") # change here 
svm_fit = clf.fit(X_train, y_train)

print (clf[:-1]) # StandardScaler 
print ('check that set_output format indeed remains even after we build a pipleline: ', '\n')
X_test_transformed = clf[:-1].transform(X_test)

X_test_transformed.head(3)

Получение DataSet быстрее и эффективнее:

OpenML — это открытая платформа для обмена наборами данных, а API набора данных в Sklearn предлагает fetch_openml функцию для извлечения данных; С обновленным Sklearn этот шаг стал более эффективным с точки зрения памяти и времени.

from sklearn.datasets import fetch_openml

start_t = time.time()
X, y = fetch_openml("titanic", version=1, as_frame=True, 
                    return_X_y=True, parser="pandas")
# # parser pandas is the addition in the version 1.2.0

X = X.select_dtypes(["number", "category"]).drop(columns=["body"])
print ('check types: ', type(X), '\n',  X.head(3))
print ('check shapes: ', X.shape)
end_t = time.time()
print ('time taken: ', end_t-start_t)

Использование parser='pandas' значительно улучшает время выполнения и потребление памяти. Можно легко проверить потребление памяти с помощью библиотеки psutil следующим образом:

print(psutil.cpu_percent())

Графики частичной зависимости: категориальные признаки

Графики частичной зависимости существовали и раньше, но только для числовых признаков, теперь они были расширены для категориальных признаков.

Как описано в документации Sklearn:

Графики частичной зависимости показывают зависимость между целями и набором входных признаков, представляющих интерес, с маргинализацией значений всех других входных признаков («дополняющих» признаков). Интуитивно мы можем интерпретировать частичную зависимость как ожидаемую целевую реакцию как функцию интересующих входных характеристик.

Используя «титанический» набор данных, приведенный выше, мы можем легко построить частичную зависимость категориальных признаков:

С помощью приведенного выше блока кода мы можем получить графики частичной зависимости, как показано ниже:

В версии 0.24 мы получили бы ошибку значения для категориальных переменных:

>>> ValueError: could not convert string to float: ‘female’

Непосредственное построение остатков (модели регрессии):

Для анализа производительности модели классификации в API метрик Sklearn в более старых версиях (0.24) существовали процедуры построения графиков, такие как PrecisionRecallDisplay , RocCurveDisplay ; В новом обновлении можно сделать подобное для регрессионных моделей. Давайте посмотрим на пример ниже:

Хотя всегда можно построить построенную линию и остатки с помощью matplotlib или seaborn, после того, как мы остановились на лучшей модели, здорово иметь возможность быстро проверить результаты непосредственно в среде Sklearn.

В новом Sklearn есть еще несколько улучшений/дополнений, но я обнаружил, что эти 4 основных улучшения чаще всего особенно полезны для стандартного анализа данных.

Использованная литература:

[1] Основные особенности выпуска Sklearn: V 1.2.0

[2] Основные моменты релиза Sklearn: Видео

[3]Все сюжеты и коды: Мой GitHub

Если вас интересуют дополнительные фундаментальные концепции машинного обучения и многое другое, вы можете присоединиться к Medium с помощью Моей ссылки. Вы ничего не заплатите, но я получу небольшую комиссию. Ценю вас всех!!