Машинное обучение для Java-разработчиков, часть 2 |
|||||
МЕНЮ Искусственный интеллект Поиск Регистрация на сайте Помощь проекту ТЕМЫ Новости ИИ Искусственный интеллект Разработка ИИГолосовой помощник Городские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Техническое зрение Чат-боты Авторизация |
2018-03-14 16:10 Оценка целевой функции Напомним, целевая функция (J(?)) используется для вычисления ошибки значения или «стоимости» заданной целевой функции. (i) . Ошибка – расстояние между расчетным значением у и настоящим значением y дома из примера i . (J(?)) , тем точнее будут предсказания нашей целевой функции. В листинге-3, приведена простая реализация на Java функции стоимости, принимающей на вход целевую функцию, список тренировочных данных, и метки связанные с ними. Значения предсказаний будут вычисляться в цикле, и ошибка будет вычисляться вычитанием реального значения цены (взятого из метки). Позже квадрат ошибок будет просуммирован и значение ошибки будет рассчитано. Стоимость будет возвращена как значение типа double : Листинг-3
Обучение целевой функции Несмотря на то, что функция стоимости помогает оценить качество целевой функции и тета-параметров, вы все же надо найти самые подходящие параметры тета. Вы можете использовать для этого алгоритм градиентного спуска. Градиентный спуск Градиентный спуск минимизирует функцию стоимости. Это значит, что он используется для поиска параметров тета, которые имеют минимальную стоимость ?0 , ?1 , и ?2 . После каждой итерации, можно создать новую, более соответствующую реализацию LinearRegressionFunction используя новый тета вектор {?0, ?1, ?2}. В листинге-4 приведен Java-код алгоритма градиентного спада. Тета для функции регрессии будут обучены с использованием тренировочных данных, данных маркеров, коэффициента обучения (?) . Результатом будет улучшенная целевая функция, использующая параметры тета. Метод train() будет вызываться снова и снова, и передавать новую целевую функцию и новые параметры тета из предыдущих вычислений. И эти вызовы будут повторяться, пока настроенная целевая функция не достигнет плато минимума: Листинг-4 Чтобы убедиться, что стоимость постоянно уменьшается, можно запускать функцию стоимости J(?) на исполнение после каждого шага обучения. После каждой итерации стоимость должна уменьшаться. Если этого не происходит, это значит, что значение коэффициента обучения слишком большое и алгоритм просто проскочил минимальное значение. В таком случае алгоритм градиентного спада терпит неудачу. Графики ниже демонстрируют целевую функцию, использующую новые, вычисленные, тета-параметры, начинающиеся со стартового тета-вектора {1.0, 1.0} . ? Левая колонка показывает график функции предсказания после 50 повторений; средняя колонка после 200 повторений; и правая колонка после 1000 повторений. Из них видно, что цена уменьшается после каждой итерации, и новая целевая функция соответствует все лучше и лучше. После 500-600 повторений тета-параметры больше существенно не меняются, и цена достигает стабильного «плато». После этого точность целевой функции улучшить таким способом не получится. Добавление признаков и их масштабирование Если вы обнаружили что ваша целевая функция не соответствует проблеме, которую вы пытаетесь решить, её нужно подкорректировать. Распространенный способ корректировки несоответствия — добавление дополнительных признаков в вектор признаков. В примере с ценой дома, можно добавить такие характеристики, как количество комнат или возраст дома. То есть вместо использования вектора с одним значением признака FeaturesScaling представляет промышленный метод для создания функции масштабирования подстраиваемой на тренировочных данных. Внутри экземпляры тренировочных данных используются для вычисления среднего, минимального и максимального значений. Результирующая функция использует вектор признаков и производит новый с отмасштабированными признаками. Масштабирование признаков необходимо как для процесса обучения, так и для процесса предсказания, как показано ниже: С добавлением всё большего и большего количества признаков, становится заметен рост соответствия целевой функции, однако будьте осторожны. Если вы зайдете слишком далеко и добавите слишком много признаков, вы можете в результате поучить целевую функцию, которая сверхсоответствует. Сверхсоответствие и перекрестные проверки Сверхсоответствие возникает тогда, когда целевая функция или модель соответствует тренировочным данным слишком хорошо, настолько, что захватывает шум или случайные отклонения в тренировочных данных. Пример сверхсоответствия приведен на крайнем с права графике ниже:
Инструменты машинного обучения и фреймворк Weka Большинство фреймворков и библиотек предоставляют собой обширную коллекцию алгоритмов машинного обучения. Кроме этого они предоставляют удобный высокоуровневый интерфейс к обучению, проверке и обработке моделей данных. Weka один из популярнейших фреймворков для JVM. Weka — это Java-библиотека для практического применения, которая содержит графические тесты для проверки моделей. В примере ниже библиотека Weka используется для создания набора тренировочных данных, который содержит признаки и метки. Метод Набор данных и Образец объекта может быть сохранен и загружен из файла. Weka использует ARFF (Attribute Relation File Format) который поддерживается графическими тестами Weka. Этот набор данных используется для тренировки целевой функции, известной как классификатор в Weka. Прежде всего вы должны определить целевую функцию. В коде ниже экземпляр классификатора LinearRegression будет создан. Этот классификатор будет обучен с помощью вызова buildClassifier() . Метод buildClassifier() подбирает тета параметры базируясь на тренировочных данных в поисках наилучшей целевой модели. Используя Weka, вам не придется волноваться об установке коэффициента обучения или количества итераций. Так же Weka выполняет масштабирование признаков самостоятельно. После того, как выполнены эти установки, целевая функция может быть использована для предсказания цены дома, как показано ниже: Weka предоставляет класс Evaluation класс для проверки обученного классификатора или модели. В коде ниже, выбранный массив проверочных данных используется, чтобы избежать ошибочных результатов. Результаты измерений (цена ошибки) будут выводиться на консоль. Как правило, результаты оценки используются для сравнения моделей, которые были обучены с использованием разных алгоритмов машинного обучения, или вариаций такого рода: Пример выше использует линейную регрессию, которая предсказывает численные значения, такие, как цена дома, базируясь на входных значениях. Линейная регрессия поддерживает предсказание непрерывных числовых значений. Для предсказания бинарных значений («Да» и «Нет») нужно использовать другие алгоритмы машинного обучения. Например, дерево решений, нейронные сети или логистическую регрессию. Вы можете использовать один из этих алгоритмов, например, для предсказания того, является ли почтовое сообщение спамом, или предсказания погоды, или предсказания хорошо ли будет продаваться дом. Если вы хотите научить ваш алгоритм предсказывать погоду или на сколько быстро будет продан дом вам нужен другой набор данных, например topseller: Этот набор данных будет использован для тренировки нового классификатора topseller . После того как он будет обучен, вызов предсказания должен возвращать индекс класса маркера, который можно использовать для получения предсказанного значения. Заключение Хотя машинное обучение тесно связано с статистикой и использует много математических концепций, инструментарий машинного обучения позволяет начать интеграцию машинного обучения в ваши программы без глубоких знаний математики. Тем не менее, чем лучше вы поймете основополагающие алгоритмы машинного обучения такие как, например, алгоритм линейной регрессии, который мы исследовали в этой статье, тем больше будет возможностей выбрать правильный алгоритм и настроить его на оптимальную производительность. Перевод с английского. Автор — Грегор Рот (Gregor Roth), Software Architect, JavaWorld.
Источник: javarush.ru Комментарии: |
||||