Захватывающее обновление от Scikit-Learn

Scikit-Learn — это основной пакет машинного обучения для специалистов по данным, использующих среду Python. Пакет предлагает множество полезных API для использования в нашей повседневной работе.

В мае 2022 года Scikit-Learn выпустила новое обновление V.1.1.0, которое предлагает различные интересные обновления функций. Какие обновления? Давайте углубимся в это.

Тем не менее, пожалуйста, обновите Scikit-Learn до последней версии, прежде чем мы начнем.

pip install --upgrade scikit-learn

BisectingKMeans

BisectingKMeans — это новая дополнительная вариация неконтролируемого машинного обучения K-Means в рамках Scikit-Learn. Метод реализует простой разделительный иерархический алгоритм в процессе кластеризации.

В обычном K-Means процесс кластеризации происходит путем одновременного создания K числа центроидов. Полученный кластер будет оцениваться путем расчета как внутрикластерного, так и межкластерного сходства. Центр тяжести скопления аналогичен центру тяжести.

Однако при разделении K-средних пополам мы не создаем K-центроид одновременно. Вместо этого центроид выбирается постепенно на основе предыдущего кластера. Мы будем разбивать кластер каждый раз, пока не будет достигнуто число K.

Есть несколько преимуществ использования Bisecting K-Means, в том числе:

  • Было бы эффективнее с большим количеством кластеров
  • Более дешевые вычислительные затраты
  • Он не создает пустых кластеров
  • Результат кластеризации был хорошо упорядочен и создавал видимую иерархию.

Давайте попробуем простое сравнение между обычным K-Means и Bisecting K-Means. Я бы использовал образец набора данных из пакета seaborn, чтобы смоделировать результат.

import numpy as np
from sklearn.cluster import KMeans
import seaborn as sns
from sklearn.cluster import KMeans, BisectingKMeans
import matplotlib.pyplot as plt
mpg = sns.load_dataset('mpg')
mpg = mpg.dropna().reset_index(drop = True)
X = np.array(mpg[['mpg', 'acceleration']])
km = KMeans(n_clusters=5, random_state=0).fit(X)
bisect_km = BisectingKMeans(n_clusters=5, random_state=0).fit(X)
fig, ax = plt.subplots(1, 2, figsize=(10, 5))
ax[0].scatter(X[:, 0], X[:, 1], s=10, c=km.labels_)
ax[0].scatter(km.cluster_centers_[:, 0], km.cluster_centers_[:, 1], s=20, c="r")
ax[0].set_title("KMeans")
ax[1].scatter(X[:, 0], X[:, 1], s=10, c=bisect_km.labels_)
ax[1].scatter(
    bisect_km.cluster_centers_[:, 0], bisect_km.cluster_centers_[:, 1], s=20, c="r"
)
_ = ax[1].set_title("BisectingKMeans")

Как показано на изображении выше, Bisecting K-Means может эффективно и наглядно создать кластер для данных в самой дальней части.

Квантильное моделирование потерянной функции с помощью HistGradientBoostingRegressor

HistGradientBoostingRegressor в Scikit-Learn — это Gradient Boosting Regressor, представляющий собой ансамблевую древовидную модель с моделью обучения на основе гистограммы.

Модель на основе гистограммы более эффективна, чем обычная модель регрессора с усилением градиента, потому что алгоритмы объединяют непрерывные функции в дискретные ячейки для целей обучения вместо обычных методов разделения.

Согласно документации, модель HistGradientBoostingRegressor подходит для больших наборов данных с более чем 10 000 выборок.

В недавнем обновлении HistGradientBoostingRegressor добавляет новую функцию потери квантилей, которую мы можем использовать. Квантильная функция потерь предсказывает вероятный диапазон, который мы называем интервалом предсказания. Подробнее о моделировании квантильной регрессии вы можете прочитать в этой статье.

С дополнительной функцией потерь квантилей мы теперь могли передать loss="quantile" и использовать новый параметр quantile. Используя приведенный ниже учебник, мы могли отслеживать, где был прогноз регрессии для каждого квантиля.

from sklearn.ensemble import HistGradientBoostingRegressor
import numpy as np
import matplotlib.pyplot as plt
# Simple regression function for X * cos(X)
rng = np.random.RandomState(55)
X_1d = np.linspace(0, 10, num=2000)
X = X_1d.reshape(-1, 1)
y = X_1d * np.cos(X_1d) + rng.normal(scale=X_1d / 3)
quantiles = [0.9, 0.5, 0.1]
parameters = dict(loss="quantile", max_bins=32, max_iter=50)
hist_quantiles = {
    f"quantile={quantile:.2f}": HistGradientBoostingRegressor(
        **parameters, quantile=quantile
    ).fit(X, y)
    for quantile in quantiles
}
fig, ax = plt.subplots()
ax.plot(X_1d, y, "o", alpha=0.5, markersize=1)
for quantile, hist in hist_quantiles.items():
    ax.plot(X_1d, hist.predict(X), label=quantile)
_ = ax.legend(loc="lower left")
plt.title('Sample HistGradientBoostingRegressor with Quantile Loss')

Нечастые категории в OneHotEncoder и получение названия функций во всех Transformers

One-Hot Encoding — это обычный категориальный процесс, применяемый к категориальным признакам для создания числовых признаков. Используя Scikit-Learn OneHotEncoder, мы могли разработать преобразователи на основе наших данных для использования в производственной среде. Если вы никогда не слышали, что такое One-Hot Encoding, вы можете прочитать все это в статье ниже.



В последнем обновлении Scikit-Learn добавляет новый параметр OneHotEncoderдля группировки всех редких значений вместо того, чтобы создавать каждое редкое значение в новых числовых функциях. Давайте попробуем это с образцом набора данных. Я бы использовал примерный набор данных подсказок от Seaborn.

import seaborn as sns
tips = sns.load_dataset('tips')
tips['size'].value_counts()

Как видно из изображения выше, значения категории размера для 1, 5 и 6 были нечастыми по сравнению с другими. В этом случае я хочу их сгруппировать. Мы могли бы сделать это с помощью следующего кода.

from sklearn.preprocessing import OneHotEncoder
#We establish that any values frequency below 6 is considered as rare
enc = OneHotEncoder(min_frequency=6, sparse=False).fit(np.array(tips['size']).reshape(-1, 1))
enc.infrequent_categories_

Нечастые категории - это то, что мы ожидаем. Если мы попытаемся преобразовать категориальные значения в числовые столбцы, мы получим вот что.

encoded = enc.transform(np.array([[1], [2], [3], [4],[5],[6]]))
pd.DataFrame(encoded, columns=enc.get_feature_names_out())

Вся нечастая категория теперь считается одной особенностью. Это помогло бы нам свести к минимуму количество создаваемых функций и избежать проклятия размерности.

Кроме того, все преобразователи из Scikit-Learn теперь позволяли нам получать имена функций. Атрибут get_features_names_out предоставит строковые имена для каждого столбца в выходных данных преобразователей.

enc.get_feature_names_out()

Дополнительный параметр при выборе функции

Scikit-Learn недавно добавил новые параметры n_features_to_select=’auto' к преобразователям SequentialFeatureSelector и передал callable в max_features преобразователей SelectFromModel .

SequentialFeatureSelector — это жадный алгоритм поиска, который выполняет выбор функций вперед или назад для формирования подмножества функций. Этот оценщик будет добавлять или удалять функции в каждой итерации на основе оценки перекрестной проверки оценщика.

С параметром 'auto' конечные функции автоматически завершатся, когда улучшение оценки не превысит параметр tol. Если tolпараметр равенNone, выбирается половина объектов.

В преобразователях SelectFromModel, если мы передаем callable параметру max_features, то максимальное количество разрешенных функций будет использовать вывод max_feaures(X).

MiniBatchNMF

Non-Negative Matrix Factorization или NMF — это алгоритм многомерного анализа для уменьшения размеров и извлечения признаков. Этот метод обычно используется в NLP, движке рекомендаций, распознавании лиц и т. д. Подробнее о NMF можно прочитать здесь.

MiniBatchNMF — это онлайн-способ оптимизации NMF путем разделения данных на мини-пакеты и оптимизации модели NMF путем циклического перебора мини-пакетов. Модель подходит для больших наборов данных, так как процесс будет быстрее, но прогноз будет менее точным. Вы можете обратиться к учебнику здесь.

Заключение

Scikit-Learn недавно обновил пакеты до версии 1.1.0, и следующие основные обновления:

  • Новый алгоритм BisectingKMeans
  • Новые квантильные потери в регрессоре HistGradientBoostingRegressor
  • Редкие категории в OneHotEncoder
  • Получить имена функций от преобразователей
  • Дополнительный параметр при выборе функции
  • Новый алгоритм MiniBatchNMF

Я надеюсь, что это помогает!

Заходите ко мне в Социальные сети, чтобы более подробно поговорить или задать вопросы.

Если вы не подписаны как участник Medium, рассмотрите возможность подписки через моего реферала.