Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шолле Ф. - Глубокое обучение на Python (Библиотека программиста) - 2023.pdf
Скачиваний:
6
Добавлен:
07.04.2024
Размер:
11.34 Mб
Скачать

156    Глава 4. Начало работы с нейронными сетями: классификация и регрессия

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

.Метки.в.многоклассовой.классификации.можно.обрабатывать.двумя.способами:

•. кодировать.их.с.применением.метода.кодирования.категорий.(также.

известного.как.прямое.кодирование).и.использовать.функцию.потерь. categorical_crossentropy;

. кодировать.их.как.целые.числа.и.использовать.функцию.потерь.sparse_ categorical_crossentropy.

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

4.3. ПРЕДСКАЗАНИЕ ЦЕН НА ДОМА: ПРИМЕР РЕГРЕССИИ

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

ПРИМЕЧАНИЕ

Не.путайте.регрессию.с.алгоритмом.логистической регрессии..Как.ни.странно,.логи­ стическая.регрессия.не.является.регрессионным.алгоритмом.—.это.алгоритм.клас­ сификации.

4.3.1. Набор данных с ценами на жилье в Бостоне

Мы.попытаемся.предсказать.медианную.цену.на.дома.в.пригороде.Бостона. в.середине.1970-х.годов.по.таким.данным,.как.уровень.преступности.в.районе,. ставка.местного.имущественного.налога.и.т..д..Набор.данных,.который.нам.предстоит.использовать,.имеет.интересное.отличие.от.примеров,.рассматриваемых. выше..Он.содержит.относительно.немного.образцов.данных:.всего.506,.разбитых. на.404.обучающих.и.102.контрольных..И.каждый.признак.во.входных.данных. (например,.уровень.преступности).имеет.свой.масштаб..Например,.некоторые.

4.3. Предсказание цен на дома: пример регрессии    157

признаки.являются.пропорциями.и.имеют.значения.между.0.и.1;.другие.—. между.1.и.12,.третьи.—.между.0.и.100.и.т..д.

Листинг 4.23. Загрузка набора данных для Бостона

from tensorflow.keras.datasets import boston_housing (train_data, train_targets), (test_data, test_targets) = (

boston_housing.load_data())

Посмотрим.на.данные:

>>>train_data.shape (404, 13)

>>>test_data.shape (102, 13)

Как.видите,.у.нас.имеются.404.обучающих.и.102.контрольных.образца,.каждый. с.13.числовыми.признаками,.такими.как.уровень.преступности,.среднее.число. комнат.в.доме,.удаленность.от.центральных.дорог.и.т..д.

Цели.—.медианные.значения.цен.на.дома,.занимаемые.собственниками,.в.ты- сячах.долларов:

>>> train_targets

[ 15.2, 42.3, 50. ... 19.4, 19.4, 29.1]

Цены.в.основной.массе.находятся.в.диапазоне.от.10.000.до.50.000.долларов.США.. Если.вам.покажется,.что.это.недорого,.напомню:.это.цены.середины.1970-х.годов. и.они.не.учитывают.инфляцию.

4.3.2. Подготовка данных

Было.бы.проблематично.передать.в.нейронную.сеть.значения,.имеющие.разные. диапазоны..Она,.конечно,.сможет.автоматически.адаптироваться.к.разнородным. данным,.однако.это.усложнит.обучение..На.практике.к.таким.данным.принято. применять.нормализацию:.для.каждого.признака.во.входных.данных.(столбца. в.матрице.входных.данных).из.каждого.значения.вычитается.среднее.по.этому. признаку,.а.разность.делится.на.стандартное.отклонение..В.результате.признак. центрируется.по.нулевому.значению.и.имеет.стандартное.отклонение,.равное. единице..Такую.нормализацию.легко.выполнить.с.помощью.NumPy.

Листинг 4.24. Нормализация данных

mean = train_data.mean(axis=0) train_data -= mean

std = train_data.std(axis=0) train_data /= std

test_data -= mean test_data /= std

158    Глава 4. Начало работы с нейронными сетями: классификация и регрессия

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

4.3.3. Конструирование модели

Из-за .небольшого .количества.образцов .мы .возьмем .очень .маленькую .сеть. с.двумя.64 мерными.промежуточными.слоями..Вообще,.чем.меньше.обуча­ ющих.данных,.тем.скорее.наступит.переобучение,.а.использование.маленькой. модели.—.один.из.способов.борьбы.с.ним.

Листинг 4.25. Определение модели

def build_model():

model = keras.Sequential([ layers.Dense(64, activation="relu"), layers.Dense(64, activation="relu"), layers.Dense(1)

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

])

model.compile(optimizer="rmsprop", loss="mse", metrics=["mae"]) return model

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

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

Обратите.внимание,.что.модель.компилируется.с.функцией.потерь.mse .—.mean squared error .(среднеквадратичная.ошибка),.вычисляющей.квадрат.разности. между.предсказанными.и.целевыми.значениями..Эта.функция.широко.используется.в.задачах.регрессии.

Мы.также.включили.новый.параметр.в.мониторинг.на.этапе.обучения:.mae .—. mean absolute error.(средняя.абсолютная.ошибка)..Это.абсолютное.значение. разности.между.предсказанными.и.целевыми.значениями..Например,.значение. MAE,.равное.0,5,.в.нашей.задаче.означает,.что.в.среднем.прогнозы.отклоняются. на.500.долларов.США.

Подготовка проверочных данных: данных из блока с номером k

4.3.Предсказание цен на дома: пример регрессии    159

4.3.4.Оценка решения методом

перекрестной проверки по K блокам

Чтобы.оценить.качество.модели.в.ходе.корректировки.ее.параметров.(таких.как. количество.эпох.обучения),.можно.разбить.исходные.данные.на.обучающий. и.проверочный.наборы,.как.это.делалось.в.предыдущих.примерах..Однако,.поскольку.у.нас.имеется.и.без.того.небольшой.набор.данных,.проверочный.набор. получился.бы.слишком.маленьким.(скажем,.около.100.образцов)..Как.следствие,. оценки.при.проверке.могут.сильно.меняться.в.зависимости.от.того,.какие.данные.попадут.в.проверочный.и.обучающий.наборы:.иными.словами,.могут.иметь. слишком.большой.разброс..Это.не.позволит.надежно.оценить.качество.модели.

Лучшей.практикой.в.таких.ситуациях.является.применение.перекрестной проверки по K блокам.(K-fold.cross-validation,.рис..4.8).

Рис. 4.8. Перекрестная проверка по трем блокам

Суть.ее.заключается.в.разделении.доступных.данных.на.K .блоков.(обычно. K.=.4.или.5),.создании.K.идентичных.моделей.и.обучении.каждой.на.K – 1.блоках.с.оценкой.по.оставшимся.блокам..По.полученным.K оценкам.вычисляется. среднее.значение,.которое.принимается.как.оценка.модели..В.коде.такая.проверка.реализуется.достаточно.просто.

Листинг 4.26. Перекрестная проверка по K блокам

k = 4

num_val_samples = len(train_data) // k num_epochs = 100

all_scores = [] for i in range(k):

print(f"Processing fold #{i}")

val_data = train_data[i * num_val_samples: (i + 1) * num_val_samples] val_targets = train_targets[i * num_val_samples: (i + 1) * num_val_samples]

Подготовка обучающих данных: данных из остальных блоков
Конструирование модели Keras (уже скомпилированной)
Подготовка проверочных данных: данных из блока с номером k
Обучение модели (в режиме без вывода
сообщений, verbose = 0)
Оценка модели по проверочным данным
Подготовка обучающих данных: данных из остальных блоков
Конструирование модели Keras (уже скомпилированной)

160    Глава 4. Начало работы с нейронными сетями: классификация и регрессия

partial_train_data = np.concatenate( [train_data[:i * num_val_samples],

train_data[(i + 1) * num_val_samples:]], axis=0)

partial_train_targets = np.concatenate( [train_targets[:i * num_val_samples],

train_targets[(i + 1) * num_val_samples:]], axis=0)

model = build_model() model.fit(partial_train_data, partial_train_targets,

epochs=num_epochs, batch_size=16, verbose=0)

val_mse, val_mae = model.evaluate(val_data, val_targets, verbose=0) all_scores.append(val_mae)

Выполнив.этот.код.с.num_epochs .= .100,.мы.получили.следующие.результаты:

>>> all_scores

[2.112449, 3.0801501, 2.6483836, 2.4275346]

>>> np.mean(all_scores) 2.5671294

Разные.прогоны.действительно.показывают.разные.оценки,.от.2,1.до.3,1..Сред- няя.(2,6).выглядит.более.достоверно,.чем.любая.из.оценок.отдельных.прогонов,.—. в.этом.главная.ценность.перекрестной.проверки.по.K.блокам..В.данном.случае. средняя.ошибка.составила.2600.долларов,.что.довольно.много,.если.вспомнить,. что.цены.колеблются.в.диапазоне.от.10.000.до.50.000.долларов.

Попробуем.увеличить.время.обучения.модели.до.500.эпох..Чтобы.получить.информацию.о.качестве.обучения.модели.в.каждую.эпоху,.изменим.цикл.обучения. и.добавим.сохранение.оценки.проверки.перед.началом.эпохи.

Листинг 4.27. Сохранение оценки проверки перед каждым прогоном

num_epochs = 500 all_mae_histories = [] for i in range(k):

print(f"Processing fold #{i}")

val_data = train_data[i * num_val_samples: (i + 1) * num_val_samples] val_targets = train_targets[i * num_val_samples: (i + 1) * num_val_samples] partial_train_data = np.concatenate(

[train_data[:i * num_val_samples], train_data[(i + 1) * num_val_samples:]],

axis=0)

partial_train_targets = np.concatenate( [train_targets[:i * num_val_samples],

train_targets[(i + 1) * num_val_samples:]], axis=0)

model = build_model()

history = model.fit(partial_train_data, partial_train_targets, validation_data=(val_data, val_targets), epochs=num_epochs, batch_size=16, verbose=0) Обучение модели

mae_history = history.history["val_mae"]

(в режиме без вывода

all_mae_histories.append(mae_history)

сообщений, verbose = 0)

4.3. Предсказание цен на дома: пример регрессии    161

Теперь.можно.вычислить.средние.значения.метрики.mae .для.всех.прогонов.

Листинг 4.28. Создание истории последовательных средних оценок проверки по K блокам

average_mae_history = [

np.mean([x[i] for x in all_mae_histories]) for i in range(num_epochs)]

Построим.график.(рис..4.9).

Листинг 4.29. Формирование графика с оценками проверок

plt.plot(range(1, len(average_mae_history) + 1), average_mae_history) plt.xlabel("Эпохи")

plt.ylabel("Оценка MAE") plt.show()

Рис. 4.9. Оценки MAE по эпохам

Из-за.проблем.с.масштабированием.может.быть.немного.затруднительно.увидеть. общую.тенденцию:.оценка.MAE.для.первых.нескольких.эпох.значительно.выше,. чем.для.последующих..Давайте.опустим.первые.десять.замеров.с.масштабом,. отличным.от.масштаба.остальной.кривой.

Листинг 4.30. Формирование графика с оценками проверок за исключением первых десяти замеров

truncated_mae_history = average_mae_history[10:]

plt.plot(range(1, len(truncated_mae_history) + 1), truncated_mae_history) plt.xlabel("Эпохи")

plt.ylabel("Оценка MAE") plt.show()

162    Глава 4. Начало работы с нейронными сетями: классификация и регрессия

Как.можно.увидеть.на.рис..4.10,.оценка.MAE.перестает.существенно.улучшаться. после.120–140.эпох.(данное.число.включает.десять.эпох,.которые.мы.опустили).. После.этого.наступает.переобучение.

По.окончании.настройки.других.параметров.модели.(помимо.количества.эпох,. хорошо.также.скорректировать.количество.промежуточных.слоев).можно.обучить.окончательную.версию.модели.на.всех.обучающих.данных,.а.затем.оценить. ее.качество.на.контрольных.данных.

Листинг 4.31. Обучение окончательной версии модели

 

 

Получить новую

 

 

 

 

 

 

 

 

скомпилированную

 

Обучить ее на всем

 

 

 

model = build_model()

 

модель

 

объеме обучающих

 

 

 

 

данных

 

 

 

model.fit(train_data, train_targets,

 

 

 

 

 

 

epochs=130, batch_size=16, verbose=0)

 

 

test_mse_score, test_mae_score = model.evaluate(test_data, test_targets)

Рис. 4.10. Оценки MAE по эпохам за исключением первых десяти замеров

Вот.окончательный.результат:

>>> test_mae_score 2.4642276763916016

Средняя.ошибка.опустилась.ниже.2500.долларов..Это.явное.улучшение!.Как. и.в.двух.предыдущих.примерах,.можете.попробовать.изменить.количество.слоев. в.модели.или.количество.нейронов.в.каждом.слое.и.посмотреть,.удастся.ли.вам. уменьшить.ошибку.на.контрольных.данных.