Це фрагмент книги Python з нуля, яка допоможе вам навчитися програмуванню з нуля. Ви можете знайти його на Allegro, Empik та в інтернет-книгарнях.
Іншим важливим застосуванням даних є машинне навчання. Це область штучного інтелекту, присвячена алгоритмам, які розвиваються завдяки наданим даним. Нам буде легше зрозуміти, що це, коли ми побачимо кілька прикладів.
Приклади використання штучного інтелекту
Штучний інтелект часто асоціюється з іграми, тобто грою проти так званого "комп’ютера". Для створення таких алгоритмів справді часто використовується машинне навчання. Часто на початку записується певна кількість ігор між людьми. Алгоритм навчається поводитися якомога подібніше. Потім можна симулювати ігри між різними алгоритмами та навчати їх на основі перемог чи поразок. Навчені таким чином алгоритми можуть стати набагато успішнішими за людей. Вже в 1997 році штучний інтелект переміг шахового гросмейстера Гаррі Каспарова. У 2016 році комп’ютер переміг чемпіона світу з Ґо. Навіть у DOTA 2 алгоритми перевершили чемпіонів світу.
Дуже корисним застосуванням машинного навчання є розпізнавання зображень. Якщо відкрити програму Google Assistant на телефоні з ОС Android, увімкнути режим камери і направити об’єктив на друкований текст, програма розпізнає написаний текст. Раніше я часто використовував цю функцію за кордоном для перекладу меню в закладах харчування. Алгоритми вчаться розпізнавати текст завдяки численим прикладам. Розпізнавання зображень використовується в багатьох інших сферах. Наприклад, існують алгоритми, навчені розпізнавати пухлини на основі зображень знімків УЗД або КТ. Деякі здатні розпізнати такі зміни на більш ранніх стадіях та зі статистично більшою точністю, ніж лікарі. Зрештою, вони вчилися на більшій кількості прикладів, аналізують кожен піксель і ніколи не втомлюються. Тому у все більшій кількості лікарень по всьому світу їх використовують для допомоги лікарям.
Компанії часто використовують машинне навчання для прогнозування майбутніх результатів продажів. Перш за все для навчання використовуються дані про саму компанію. Однак деякі фірми використовують також дані про економічну ситуацію на території, на якій вони працюють, прогнози інших компаній та багато іншого.
Приклад проєкту
У нашому проєкті ми навчимо алгоритм розпізнавати написані від руки цифри. Таке розпізнавання може бути корисним у поштовому відділенні, щоб зчитувати поштові індекси, вписані у клітинки. Ми використаємо дуже популярний алгоритм, який називається нейронна мережа. На неї можна дивитися як на чорну скриньку, в яку ми кладемо приклади разом з інформацією про очікувану відповідь, а потім даємо команду вивчити ці приклади. Після цього мережа повинна добре відповідати на запитання про надані приклади, але, якщо вона добре узагальнить отримані дані, вона також повинна добре класифікувати [^401_1] приклади, яких вона раніше не бачила.
Ми будемо виконувати реалізацію цього алгоритму з пакету sklearn (його потрібно встановити). Що стосується фотографій текстів, ми використаємо набір, який входить у цей же пакет.
from sklearn import datasets
digits = datasets.load_digits()
Цей набір чисел містить 1797 записів. Це небагато, тому що сучасні алгоритми навчаються на значно більших наборах. Крім того, ці знімки мають не дуже високу роздільну здатність. Тож це буде певним викликом.
Перші цифри з нашого набору.
Перш ніж почати навчання, нам потрібно трохи трансформувати зображення. Зараз кожне зображення подане у вигляді списку в списку [^401_2]. Ми ж запишемо кожне зображення просто як список, який представляє усі пікселі по черзі.
Після того, як ми навчимо нашу мережу, ми захочемо перевірити, як вона справляється з розпізнаванням чисел, яких вона раніше не бачила. Тому нам потрібно відкласти частину цифр для тестування. Дані, які використовуються для навчання, називаються тренувальними і матимуть закінчення _train. Ті ж, що використовуються для перевірки, називаються випробувальними і матимуть кінцівку _test. Змінна X представляє приклади, тобто в нашому випадку зображення, а y — відповіді. Щоб розділити наші дані на тренувальний та випробувальний набори, ми можемо використати функцію train_test_split. Відкладемо у випробувальний набір даних 30 % (тобто 0.3) прикладів.
Нарешті настав час створити нашу нейронну мережу та навчити її тренувальним прикладам. Ми будемо використовувати класичну нейронну мережу під назвою багатошаровий перцептрон (англ. Multi-Layer Perceptron, MLP). Для навчання використовується функція fit. Навчання може бути досить тривалим. Для великих мереж і наборів даних воно може зайняти навіть багато годин (з чим я зіштовхнувся під час написання дипломної роботи). Однак у нас невелика мережа і невеликий набір даних, тож все має пройти дуже швидко.
from sklearn.neural_network import MLPClassifier
clf = MLPClassifier(hidden_layer_sizes=(100,100))clf.fit(X_train, y_train)
clf — це скорочення від "класифікатор", тобто алгоритм, який розподіляє елементи за категоріями (у нашому випадку категорії — це різні цифри).
Почнімо з перевірки, чи справді наша мережа засвоїла тренувальний набір. Попросімо її розпізнати приклади з тренувального набору. Порівнявши результати з тренувальним набором, отримуємо 100 % точності.
# y_train_pred i y_train to tablice z numpy# порівняння також повертає таблицюy_train_pred = clf.predict(X_train)print((y_train_pred == y_train).mean())# 1.0
Однак справжньою перевіркою буде кількість правильних відповідей щодо набору, якого машина не знала. Побачимо, як вона упорається з випробувальним набором даних.
Вона помилилася лише в 1.2% випадків. Це справді хороший результат, враховуючи якість знімків і невелику кількість тренувальних даних. У мене є великі сумніви, що людина впоралася б краще. Нижче я додаю кілька випадкових символів разом із відповідями, наданими нашим алгоритмом.
Завершення
Машинне навчання — це, звичайно, масштабна тема. Однак варто ознайомитися з її можливостями та методами, адже воно стає все важливішим та може мати величезний вплив на наше майбутнє.
[^401_1]: Класифікувати — приписати до категорії, тобто в нашому випадку — розпізнати цифру.
[^401_2]: Двовимірне зображення можна уявити собі як величезну таблицю, де кожне значення визначає інтенсивність кольору в певному місці. Це дуже поширений формат опису зображень.
Marcin Moskala is a highly experienced developer and Kotlin instructor as the founder of Kt. Academy, an official JetBrains partner specializing in Kotlin training, Google Developers Expert, known for his significant contributions to the Kotlin community. Moskala is the author of several widely recognized books, including "Effective Kotlin," "Kotlin Coroutines," "Functional Kotlin," "Advanced Kotlin," "Kotlin Essentials," and "Android Development with Kotlin."
Beyond his literary achievements, Moskala is the author of the largest Medium publication dedicated to Kotlin. As a respected speaker, he has been invited to share his insights at numerous programming conferences, including events such as Droidcon and the prestigious Kotlin Conf, the premier conference dedicated to the Kotlin programming language.
Roman has experience in different fields: from running his own catering company to working as a professional lawyer for over 13 years. Recently working on becoming a DevOps engineer.