JavaRush /Java блог /Random UA /Машинне навчання для Java-розробників, частина 1

Машинне навчання для Java-розробників, частина 1

Стаття з групи Random UA
Налаштуйте алгоритм машинного навчання та розробте свою першу функцію прогнозування за допомогою Java. Автомобілі з автономним керуванням, системи розпізнавання осіб та голосові помічники – всі вони розроблені на базі технологій та фреймворків машинного навчання. І це лише перша хвиля. За наступні 10 років нове покоління продуктів перетворить наш світ, породжуючи нові підходи до розробки програм, продуктів та додатків. Машинне навчання для Java-розробників, частина 1 - 1Як Java-програміст ви хочете зловити цю хвилю прямо зараз, коли технологічні компанії починають серйозно інвестувати у машинне навчання. Те, що ви вивчите сьогодні, ви зможете використати протягом наступних п'яти років. Тільки ось із чого почати? Ця стаття покликана відповісти на це запитання. Ви отримаєте перші враження про принципи машинного навчання, дотримуючись нашої невеликої інструкції з реалізації та підготовки алгоритму машинного навчання. Після вивчення структури алгоритму навчання та можливостей, які ви можете використовувати для тренування, оцінки та вибору функції, що забезпечує найкращу точність прогнозів, ви отримаєте уявлення про використання фреймворку для JVM (Weka) для побудови рішень на базі машинного навчання. Ця стаття фокусується на контрольованому машинному навчанні,

Машинне навчання та штучний інтелект

Машинне навчання еволюціонувало в галузі штучного інтелекту, мета якої — створення машин, здатних наслідувати людський інтелект. Хоча термін «машинне навчання» з'явився в інформатиці, штучний інтелект не є новою галуззю науки. Тест Тьюринга , розроблений математиком Аланом Тьюрингом на початку п'ятдесятих років 20-го століття, є одним із перших тестів, призначених для визначення наявності справжнього інтелекту у обчислювальної машини. Згідно з тестом Тьюринга, обчислювальна машина доводить наявність людського інтелекту тим, що видає себе за людину, і останній не здогадується, що говорить із машиною.
Машинне навчання для Java-розробників, частина 1 - 2
Багато популярних сьогодні підходів у машинному навчанні базуються на ідеях, яким уже десятки років. Але остання декада у обчислювальній техніці (і розподілених обчислювальних платформах) привнесла достатні потужності застосування алгоритмів машинного навчання. Більшість із них вимагають величезної кількості операцій множення матриць та інших математичних обчислень. Двадцять років тому обчислювальні технології, що дозволяють здійснити такі обчислення, просто не існували, а зараз вони вже стали реальністю. Алгоритми машинного навчання дозволяють програмам виконувати процес покращення якості та розширювати свої можливості без участі людини. Програма, розроблена з використанням машинного навчання, здатна самостійно оновлювати чи розширювати власний код.

Контрольоване навчання vs неконтрольоване навчання

Контрольоване та неконтрольоване навчання є двома найбільш популярними підходами до машинного навчання. Для обох варіантів потрібно давати машині безліч записів даних для побудови співвідношень і навчання. Такі зібрані дані зазвичай називають "вектором ознак" . Наприклад, у нас є якийсь житловий будинок. У такому разі вектор ознак може містити такі ознаки, як: загальна площа будинку, кількість кімнат, рік будівництва будинку тощо. При контрольованому навчанніалгоритм машинного навчання готується для відповіді на питання, пов'язані з векторами ознак. Для тренування алгоритму йому «годують» набір векторів ознак і пов'язаних міток. Пов'язану мітку надає людина (вчитель), і вона містить правильну відповідь на задане запитання. Алгоритм навчання аналізує вектори ознак та правильні мітки для пошуку внутрішньої структури та взаємовідносин між ними. Таким чином, машина вчиться правильно відповідати на запитання. Як приклад можна розглянути інтелектуальний додаток для торгівлі нерухомістю. Його можна натренувати за допомогою вектора ознак, що включає розмір, кількість кімнат і рік будівлі для набору будинків. Людина повинна привласнити кожному будинку мітку з правильною ціною будинку, базуючись на цих факторах. Аналізуючи ці дані,
Цікаво читати про Java? Вступайте до групи Java Developer !
Після того, як процес підготовки закінчено, нові вхідні дані вже не маркуються. Машина повинна бути здатна правильно відповідати на питання, навіть для невідомих, не промаркованих ознак векторів. При неконтрольованому навчанні алгоритм будується таким чином щоб передбачати відповіді без маркування людиною (або навіть без питань). Замість визначення маркування чи результату алгоритми неконтрольованого навчання використовують великі масиви даних та обчислювальні потужності для виявлення раніше не відомих взаємин. Наприклад, у маркетингу споживчих продуктів можна використовувати неконтрольоване навчання визначення прихованих взаємозв'язків чи групування клієнтів, що зрештою допоможе удосконалити маркетингову програму чи створити нову. У цій статті ми зосередимося на контрольованому машинному навчанні; Нині цей підхід використовується найчастіше.

Контрольоване машинне навчання

Будь-яке машинне навчання базується на даних. Для проекту з контрольованого машинного навчання, потрібно відзначити маркерами дані таким чином, щоб отримати осмислені відповіді на запитання. Нижче в Таблиці-1 кожен запис інформації про будинок має мітку «ціна будинку». Виявляючи взаємозв'язок між даними записів та ціною будинку, алгоритм у результаті має бути здатним передбачити ринкову ціну для будинків, що не входять до цього списку. (Зверніть увагу, площа будинку вказана у квадратних метрах, а вартість будинку у євро).
Таблиця 1. Список будинків
Ознака Ознака Ознака Мітка
Площа будинку Кількість кімнат Вік будинку Очікувана ціна будинку
90 m2 / 295 ft 2 кімнати 23 роки 249,000 €
101 m2/331 ft 3 кімнати n/a 338,000 €
1330 m2/4363 ft 11 кімнат 12 років 6,500,000 €
На ранніх етапах ви, швидше за все, маркуватимете дані вручну, але врешті-решт ви навчите вашу програму робити це самостійно. Ви, ймовірно, вже бачабо, як працює такий підхід з клієнтами електронної пошти, коли для переміщення листа до папки «Спам» ви відповідаєте на запитання «Чи є цей лист не бажаним?». Коли ви відповідаєте, ви навчаєте програму розпізнавати листи, які ви не бажаєте бачити. Спам-фільтр програми навчається маркувати листи з того ж джерела, або містить такий самий контент і керувати ними відповідно до відповідних правил. Марковані набори даних необхідні лише для підготовки та тестування. Після закінчення цього етапу алгоритм машинного навчання працює з немаркованими даними. Наприклад,

Як машина навчається передбачати

Складність контрольованого машинного навчання -- у пошуку відповідної функції передбачення певного питання. Математично складність полягає в тому, щоб знайти функцію, яка отримує на вхід змінну хі повертає передбачене значення у. Ця функція гіпотез (hθ)є наслідком процесу підготовки. Часто функція гіпотез також називається цільовою функцією чи функцією передбачення.
y = h θ (x)
У більшості випадків хє масивом даних. У нашому прикладі - це двомірний масив з елементів, що визначають будинок, що складається з кількості кімнат та площі будинку. Масив таких значень вектор ознак. Задавши конкретну цільову функцію, ми можемо використовувати її передбачення кожного вектора ознак х. Щоб передбачити ціну будинку, ви повинні викликати цільову функцію, використовуючи вектор ознак {101.0, 3.0}, що складається з площі будинку та кількості кімнат:
// целевая функция h (результат процесса обучения)
Function<Double[], Double> h = ...;

// определяем целевой вектор с площадью дома=101 и количеством комнат=3
Double[] x = new Double[] { 101.0, 3.0 };

// и предсказываем цену дома (метка)
double y = h.apply(x);
У вихідному коді з прикладу-1, значення масиві хпредставляють вектор ознак будинку. Значення у, яке повертається цільовою функцією, - це передбачена ціна будинку. Метою машинного навчання є визначення цільової функції, яка працюватиме максимально точно за невідомих вхідних параметрів. У машинному навчанні цільова функція (hθ)іноді називається моделлю. Ця модель є наслідком процесу навчання.
Машинне навчання для Java-розробників, частина 1 - 3
Базуючись на маркованих тренувальних зразках, алгоритм навчання шукає структури чи шаблони у тренувальних даних. Таким чином, він будує модель, яка в цілому хороша для цих даних. Як правило, процес навчання має дослідницький характер. Здебільшого процес повторюють багаторазово з використанням різних варіантів алгоритмів навчання та конфігурацій. У результаті всі моделі оцінюються на основі метрик продуктивності, серед яких вибирається найкраща. І ця модель використовується для обчислення передбачуваних значень майбутніх не маркованих даних.

Лінійна регресія

Щоб навчити машину «думати», спочатку потрібно вибрати алгоритм навчання, який ви використовуватимете. Наприклад, лінійну регресію. Це – один із найпростіших та найпопулярніших алгоритмів контрольованого машинного навчання. Алгоритм передбачає, що відношення між вхідними ознаками та маркерами результату – лінійно. Загальна функція лінійної регресії, наведена нижче, повертає передбачене значення шляхом підсумовування всіх елементів вектора ознак, помножених на параметр θ (тета) . Цей параметр використовується в процесі навчання для адаптації або підстроювання функції регресії на основі тренувальних даних.
h θ (x) = θ 0 * 1 + θ 1 * x 1 + ... θ n * x n
У функції лінійної регресії параметр тіта та параметри ознак пронумеровані підрядковими індексами. Підрядковий індекс визначає позицію параметра (θ)та параметра ознаки (х)у векторі. Зверніть увагу, що ознака x 0 є постійним елементом зсуву та має значення 1для обчислювальних цілей. В результаті індекс значущих параметрів, таких як площа будинку, починається з x 1 . Так, якщо x 1 присвоєно перше значення вектора ознак (площа будинку), то x 2 прийматиме наступне значення (кількість кімнат) і таке інше. Приклад-2 демонструє Java-реалізацію функції лінійної регресії, що математично позначається як h θ(x). Для простоти обчислення виконуються з використанням типу даних double. У методі apply()передбачено, що перший елемент масиву дорівнюватиме 1.0 і буде встановлений за межами цієї функції. Приклад 2. Лінійна регресія Java
public class LinearRegressionFunction implements Function<Double[], Double> {
 private final double[] thetaVector;

 LinearRegressionFunction(double[] thetaVector) {
 this.thetaVector = Arrays.copyOf(thetaVector, thetaVector.length);
 }

 public Double apply(Double[] featureVector) {
 // с целью упрощения вычислений первый элемент должен быть дорівнює 1.0
 assert featureVector[0] == 1.0;

 // простое последовательное сложение
 double prediction = 0;
 for (int j = 0; j < thetaVector.length; j++) {
 prediction += thetaVector[j] * featureVector[j];
 }
 return prediction;
 }

 public double[] getThetas() {
 return Arrays.copyOf(thetaVector, thetaVector.length);
 }
}
Щоб створити новий екземпляр LinearRegressionFunction, потрібно встановити параметр θ. Цей параметр або вектор використовується для адаптації загальної функції лінійної регресії до тренувальних даних, що лежать в основі. Параметр θ, що використовується у програмі, буде налаштований у процесі навчання, базуючись на прикладах тренувань. Якість навченої цільової функції залежатиме від якості підготовлених для навчання даних. У прикладі нижче ми використовуємо LinearRegressionFunctionдля ілюстрації прогнозування ціни, базуючись на розмірі будинку. Зважаючи на те, що x 0 має бути константою зі значенням 1.0, цільова функція ініціалізується, використовуючи два параметриθ, у своїй є результатом процесу навчання. Після створення нового прикладу, ціна будинку площею 1330 квадратних метрів передбачатиметься як показано нижче:
// тета вектор, используемый в этом примере, является результатом процесса обучения
double[] thetaVector = new double[] { 1.004579, 5.286822 };
LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector);

// создание вектора признаков со значениями x0=1 (для удобства вычислений) и //x1=площадь дома
Double[] featureVector = new Double[] { 1.0, 1330.0 };

// выполняем расчеты
double predictedPrice = targetFunction.apply(featureVector);
На малюнку нижче можна бачити графік цільової функції передбачень (синя лінія). Він отриманий шляхом обчислення цільової функції всім значень площі будинку. Графік також містить пари ціна-площа, що використовуються для навчання.
Машинне навчання для Java-розробників, частина 1 - 4
Зараз графік прогнозів виглядає досить добре. Координати графіка (положення та нахил) визначаються вектором θ { 1.004579, 5.286822 }. Але як визначити, що саме цей θ-вектор найкраще підходить для вашого застосування? Чи буде функція відповідатиме краще, якщо ви зміните перший або може бути другий параметр? Для визначення найбільш відповідного вектора тета вам потрібна функція корисності, яка буде оцінювати наскільки добре цільова функція справляється з цим завданням. ПРОДОВЖЕННЯ СЛІД Переклад з англійської. Автор - Грегор Рот (Gregor Roth), Software Architect, JavaWorld.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ