Автор|ГОСТ БЛОГ Компилировать|ВКонтакте Источник | Аналитика Видья
вводить
В проекте машинного обучения вам нужно выполнить ряд шагов, пока вы не достигнете своей цели, и один из шагов, который вы должны выполнить, — это оптимизация гиперпараметров выбранной вами модели. Эта задача всегда выполняется после процесса выбора модели (выбор лучшей модели, которая превосходит другие модели).
Что такое оптимизация гиперпараметров?
Прежде чем определять оптимизацию гиперпараметров, необходимо понять, что такое гиперпараметры. Короче говоря, гиперпараметры — это различные значения параметров, используемые для управления процессом обучения и оказывающие значительное влияние на производительность модели машинного обучения.
Примером гиперпараметра в алгоритме случайного леса является количество оценок (n_estimators), максимальная глубина (max_depth) и руководства. Эти параметры являются настраиваемыми и могут напрямую влиять на качество обученной модели.
Оптимизация гиперпараметров заключается в поиске правильной комбинации значений гиперпараметров для достижения максимальной производительности данных за разумное время. Он играет решающую роль в точности прогнозирования алгоритмов машинного обучения. Поэтому оптимизация гиперпараметров считается самой сложной частью построения модели машинного обучения.
Большинство алгоритмов машинного обучения имеют значения гиперпараметров по умолчанию. Значения по умолчанию не всегда хорошо работают в разных типах проектов машинного обучения, поэтому вам необходимо оптимизировать их для правильной комбинации для лучшей производительности.
Хорошие гиперпараметры могут заставить алгоритм сиять.
Существует несколько общих стратегий оптимизации гиперпараметров:
(а) Поиск по сетке
Это широко используемый традиционный метод, который определяет оптимальное значение для данной модели путем настройки гиперпараметров. Поиск по сетке работает путем перебора всех возможных комбинаций параметров в модели, что означает, что выполнение всего поиска займет много времени, что может быть очень затратным в вычислительном отношении.
Примечание. Вы можете узнать, как реализовать поиск по сетке здесь:GitHub.com/Дэвис/hype…
б) случайный поиск
Этот подход работает иначе, когда для поиска наилучшего решения для построенной модели используются случайные комбинации значений гиперпараметров. Недостатком случайного поиска является то, что он иногда пропускает важные точки (значения) в пространстве поиска.
Примечание. Вы можете узнать больше о реализации случайного поиска здесь:GitHub.com/Дэвис/hype…
Методы оптимизации гиперпараметров
В этой серии статей я познакомлю вас с различными передовыми методами/методами оптимизации гиперпараметров, которые помогут вам получить наилучшие параметры для данной модели. Мы рассмотрим следующие техники.
- Hyperopt
- Scikit Optimize
- Optuna
В этой статье я сосредоточусь на реализации Hyperopt.
Что такое Гиперопт
Hyperopt — это мощная библиотека Python для оптимизации гиперпараметров, разработанная jamesbergstra. Hyperopt использует форму байесовской оптимизации для настройки параметров, что позволяет получить наилучшие параметры для данной модели. Он может оптимизировать модели с сотнями параметров в больших масштабах.
Особенности Гиперопта
Hyperopt содержит 4 важные функции, которые вам нужно знать, чтобы запустить первую оптимизацию.
(а) Пространство поиска
hyperopt имеет разные функции для указания диапазона входных параметров, это случайные пространства поиска. Выберите наиболее распространенный вариант поиска:
- hp.choice(label, options)- Это можно использовать для категориальных аргументов, он возвращает один из вариантов, который должен быть списком или кортежем. Пример: hp.choice("критерий", ["джини","энтропия",])
- hp.randint(label, upper)- Доступно для целочисленных аргументов, возвращает случайное целое число в диапазоне (0, вверху). Пример: hp.randint("max_features", 50)
- hp.uniform(label, low, high)- Возвращает значение между низким и высоким. Пример: hp.uniform("max_leaf_nodes", 1, 10)
Другие варианты, которые вы можете использовать, включают:
- hp.normal(label, mu, sigma)- Это возвращает фактическое значение, которое соответствует нормальному распределению со средним значением мю и сигмой стандартного отклонения.
- hp.qnormal(label, mu, sigma, q)- возвращает значение типа round(normal(mu, sigma) / q) * q
- hp.lognormal(label, mu, sigma)-возврат опыта (нормальный (мю, сигма))
- hp.qlognormal(label, mu, sigma, q)- возвращает значение типа round(exp(normal(mu, sigma)) / q) * q
Вы можете узнать больше о параметрах области поиска здесь:GitHub.com/hyper opt/ и…
Примечание. Каждое оптимизируемое случайное выражение имеет метку (например, n_estimators) в качестве первого аргумента. Эти теги используются для возврата выбранных параметров вызывающей стороне во время оптимизации.
(б) Целевая функция
Это функция минимизации, которая получает на вход значения гиперпараметров из пространства поиска и возвращает потерю. Это означает, что во время оптимизации мы обучаем модель и прогнозируем целевые функции, используя выбранные значения гиперпараметров, затем оцениваем ошибку прогноза и возвращаем ее оптимизатору. Оптимизатор сам решит, какие значения проверять и повторять снова. Вы узнаете, как создать целевую функцию на практическом примере.
(в) фмин
Функция fmin — это функция оптимизации, которая перебирает различные наборы алгоритмов и их гиперпараметров, а затем минимизирует целевую функцию. fmin имеет 5 входов:
-
Минимизированная целевая функция
-
определенное пространство поиска
-
Используемые алгоритмы поиска: случайный поиск, TPE (оценка Tree-Parzen) и адаптивный TPE.
Примечание: hyperopt.rand.suggest и hyperopt.tpe.suggest обеспечивают логику для последовательного поиска в пространстве гиперпараметров.
-
Максимальное количество оценок
-
объект испытаний (необязательно)
пример:
from hyperopt import fmin, tpe, hp,Trials
trials = Trials()
best = fmin(fn=lambda x: x ** 2,
space= hp.uniform('x', -10, 10),
algo=tpe.suggest,
max_evals=50,
trials = trials)
print(best)
(г) Испытуемые
Объект Trials используется для хранения всех гиперпараметров, потерь и другой информации, что означает, что вы можете получить к ним доступ после запуска оптимизации. Кроме того, пробные версии могут помочь вам сохранить и загрузить важную информацию, прежде чем продолжить процесс оптимизации. (Вы узнаете больше на практическом примере).
from hyperopt import Trials
trials = Trials()
После понимания важных особенностей Hyperopt, далее будет представлено, как использовать Hyperopt.
-
Инициализируйте пространство для поиска.
-
Определите целевую функцию.
-
Выберите алгоритм поиска для использования.
-
Запустите функцию гипероптимизации.
-
Проанализируйте выходные данные оценки, хранящиеся в тестовом объекте.
Гиперпот на практике
Теперь, когда вы понимаете важные особенности Hyperopt, в этом практическом примере мы будем использовать набор данных о ценах на мобильные устройства, и задача состоит в том, чтобы создать модель, которая предсказывает, равна ли цена мобильного устройства 0 (низкая стоимость) или 1 (средняя стоимость). ) или 2 (высокая стоимость) или 3 (очень высокая стоимость).
Установить Гиперопт
Вы можете установить гиперопт из PyPI.
pip install hyperopt
Затем импортируйте важные пакеты
# 导入包
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from hyperopt import tpe, hp, fmin, STATUS_OK,Trials
from hyperopt.pyll.base import scope
import warnings
warnings.filterwarnings("ignore")
набор данных
Давайте загрузим набор данных из каталога данных. для получения дополнительной информации об этом наборе данных:WOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ...
# 加载数据
data = pd.read_csv("data/mobile_price_data.csv")
Проверьте первые пять строк набора данных.
# 读取数据
data.head()
Как видите, в нашем наборе данных у нас есть разные числовые признаки.
Давайте посмотрим на форму набора данных.
# 显示形状
data.shape
(2000, 21)
В этом наборе данных у нас есть 2000 строк и 21 столбец. Теперь давайте разберемся со списком функций в этом наборе данных.
#显示列表
list(data.columns)
[‘battery_power’, ‘blue’, ‘clock_speed’, ‘dual_sim’, ‘fc’, ‘four_g’, ‘int_memory’, ‘m_dep’, ‘mobile_wt’, ‘n_cores’, ‘pc’, ‘px_height’, ‘px_width’, ‘ram’, ‘sc_h’, ‘sc_w’, ‘talk_time’, ‘three_g’, ‘touch_screen’, ‘wifi’, ‘price_range’]
Вы можете найти значение имени каждого столбца здесь:WOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ...
Разложите набор данных на целевые функции и независимые функции
Это проблема классификации, и мы будем отделять целевые функции и независимые функции от набора данных. Наша цель – ценовой диапазон.
# 将数据拆分为特征和目标
X = data.drop("price_range", axis=1).values
y = data.price_range.values
Предварительно обработанный набор данных
Затем независимые функции нормализуются с помощью метода StandardScaler в scikit-learn.
# 标准化特征变量
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
Определить пространство параметров для оптимизации
Мы будем использовать три гиперпараметра алгоритма случайного леса, а именно n_estimators, max_depth и критерии.
space = {
"n_estimators": hp.choice("n_estimators", [100, 200, 300, 400,500,600]),
"max_depth": hp.quniform("max_depth", 1, 15,1),
"criterion": hp.choice("criterion", ["gini", "entropy"]),
}
Задаем разные значения в выбранных выше гиперпараметрах. Затем определите целевую функцию.
Определите функцию минимизации (целевую функцию)
Наша функция минимизации называется настройкой гиперпараметров, а алгоритм классификации, оптимизирующий ее гиперпараметры, — случайным лесом. Я использую перекрестную проверку, чтобы избежать переобучения, тогда функция вернет значение потери и ее состояние.
# 定义目标函数
def hyperparameter_tuning(params):
clf = RandomForestClassifier(**params,n_jobs=-1)
acc = cross_val_score(clf, X_scaled, y,scoring="accuracy").mean()
return {"loss": -acc, "status": STATUS_OK}
Примечание. Помните, что hyperopt минимизирует функцию, поэтому я добавил знак минус к acc:
Точная настройка модели
Наконец, сначала создается пробный объект, модель настраивается, а оптимальные потери распечатываются со значениями гиперпараметров.
# 初始化Trial 对象
trials = Trials()
best = fmin(
fn=hyperparameter_tuning,
space = space,
algo=tpe.suggest,
max_evals=100,
trials=trials
)
print("Best: {}".format(best))
100%|█████████████████████████████████████████████████████████| 100/100 [10:30<00:00, 6.30s/trial, best loss: -0.8915] Best: {‘criterion’: 1, ‘max_depth’: 11.0, ‘n_estimators’: 2}.
После оптимизации гиперпараметров потеря составляет -0,8915, при использовании n_estimators=300, max_depth=11, критерии = «энтропия» в классификаторе случайного леса, точность производительности модели составляет 89,15%.
Анализ результатов с использованием объекта Trials
Объект испытаний помогает нам проверить все возвращаемые значения, вычисленные в ходе эксперимента.
(1) испытания.результаты
Это показывает список словарей, возвращенных «объективом» во время поиска.
trials.results
[{‘loss’: -0.8790000000000001, ‘status’: ‘ok’}, {‘loss’: -0.877, ‘status’: ‘ok’}, {‘loss’: -0.768, ‘status’: ‘ok’}, {‘loss’: -0.8205, ‘status’: ‘ok’}, {‘loss’: -0.8720000000000001, ‘status’: ‘ok’}, {‘loss’: -0.883, ‘status’: ‘ok’}, {‘loss’: -0.8554999999999999, ‘status’: ‘ok’}, {‘loss’: -0.8789999999999999, ‘status’: ‘ok’}, {‘loss’: -0.595, ‘status’: ‘ok’},…….]
(2) испытания.потери()
Это показывает список потерь
trials.losses()
[-0.8790000000000001, -0.877, -0.768, -0.8205, -0.8720000000000001, -0.883, -0.8554999999999999, -0.8789999999999999, -0.595, -0.8765000000000001, -0.877, ………]
(3) испытания.статусы()
Это отобразит список строк состояния.
trials.statuses()
[‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ……….]
ПРИМЕЧАНИЕ. Этот тестовый объект можно сохранить, передать во встроенные процедуры построения графиков или проанализировать с помощью собственного пользовательского кода.
конец
Поздравляем, вы завершили эту статью
Вы можете скачать наборы данных и записные книжки, использованные в этой статье, здесь:GitHub.com/Дэвис/hype…
Оригинальная ссылка:Woohoo.Со слов аналитиков vi.com/blog/2020/0…
Добро пожаловать на сайт блога Panchuang AI:panchuang.net/
sklearn машинное обучение китайские официальные документы:sklearn123.com/
Добро пожаловать на станцию сводки ресурсов блога Panchuang:docs.panchuang.net/