Введення в машинне навчання з допомогою scikit-learn (переклад документації)

Дана стаття являє собою переклад введення в машинне навчання, представлене на офіційному сайті scikit-learn.

У цій частині ми поговоримо про термінах машинного навчання, які ми використовуємо для роботи з scikit-learn, і наведемо простий приклад навчання.

Машинне навчання: постановка питання

Загалом, завдання машинного навчання зводиться до отримання набору вибірок даних і, надалі, до спроб передбачити властивості невідомих даних. Якщо кожен набір даних — це не поодиноке число, а наприклад, багатовимірна сутність (multi-dimensional entry або multivariate data), то він повинен мати кілька ознак або фіч.

Машинне обченіе можна розділити на кілька великих категорій:
  • навчання з учителем (або кероване навчання). Тут дані представлені разом з додатковими ознаками, які ми хочемо передбачити. Натисніть тут, щоб перейти до сторінки Scikit-Learn навчання з вчителем). Це може бути будь-яка з наступних завдань:
  1. класифікація: вибірки даних належать двом або більше класів і ми хочемо навчитися на вже розмічених даних передбачати клас нерозміченого вибірки. Прикладом задачі класифікації може стати розпізнавання рукописних чисел, мета якої — присвоїти кожному вхідного набору даних одну з кінцевого числа дискретних категорій. Інший спосіб розуміння класифікації — це розуміння її в якості дискретної (як протилежність безперервної) форми керованого навчання, де у нас є обмежена кількість категорій, наданих для N вибірок; і ми намагаємося їх позначити правильної категорією або класом.
  2. регресійний аналіз: якщо бажаний вихідний результат складається з одного або більше безперервних змінних, тоді ми стикаємося з регресійним аналізом. Прикладом вирішення такого завдання може служити передбачення довжини лосося як результату функції від його віку і ваги.


  • навчання без вчителя (або самонавчання). В цьому випадку навчальна вибірка складається з набору вхідних даних Х без будь-яких відповідних їм значень. Метою подібних завдань може бути визначення груп схожих елементів всередині даних. Це називається кластеризацией або кластерним аналізом. Також завданням може бути встановлення розподілу даних всередині простору входів, зване густотою очікування (density estimation). Або це може бути виділення даних з високо розмірного простору в двовимірне або тривимірне з метою візуалізації даних. Натисніть тут, щоб перейти до сторінки Scikit-Learn навчання без вчителя).

Навчальна вибірка та контрольна вибірка

Машинне навчання являє собою навчання виділенню деяких властивостей вибірки даних і їх застосування до нових даних. Ось чому загальноприйнята практика оцінки алгоритму в Машинному навчанні — це розбиття даних вручну на два набору даних. Перший з них — це навчальна вибірка, на ній вивчаються властивості даних. Другий — контрольна вибірка, на ній тестуються ці властивості.

Завантаження типової вибірки

Scikit-learn встановлюється разом з кількома стандартними вибірками даних, наприклад,iris, digits для класифікації, і boston house prices dataset для регресійного аналізу.

Далі ми запускаємо Python інтерпретатор командного рядка та завантажуємо вибірки iris і digits. Встановимо умовні позначення: $ означає запуск інтерпретатора Python, а >>> позначає запуск командного рядка Python:

$ python
>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> digits = datasets.load_digits()

Набір даних — це об'єкт типу «словник», який містить всі дані і деякі метаданих про них. Ці дані зберігаються з розширенням .data, наприклад, масиви n_samples, n_features. При машинному навчанні з учителем одна або більше залежних змінних зберігаються з розширенням .target. Для отримання більш повної інформації про наборах даних, перейдіть до розділ.

Наприклад, набір даних digits.data дає доступ до фічами, які можна використовувати для класифікації числових вибірок:

>>> print(digits.data) 
[[ 0. 0. 5. ..., 0. 0. 0.]
[ 0. 0. 0. ..., 10. 0. 0.]
[ 0. 0. 0. ..., 16. 9. 0.]
...,
[ 0. 0. 1. ..., 6. 0. 0.]
[ 0. 0. 2. ..., 12. 0. 0.]
[ 0. 0. 10. ..., 12. 1. 0.]]

а digits.target дає можливість визначити числовий вибіркою, якій цифрі відповідає кожне числове подання, чого ми і будемо навчатися:

>>> digits.target
array([0, 1, 2, ..., 8, 9, 8])

Форма масиву даних

Зазвичай, дані представлені у вигляді двовимірного масиву, таку форму мають n_samples, n_features, хоча вихідні дані можуть мати іншу форму. У випадку з числами, кожна вихідна вибірка — це уявлення формою (8, 8), до якого можна отримати доступ, використовуючи:

>>> digits.images[0]
array([[ 0., 0., 5., 13., 9., 1., 0., 0.],
[ 0., 0., 13., 15., 10., 15., 5., 0.],
[ 0., 3., 15., 2., 0., 11., 8., 0.],
[ 0., 4., 12., 0., 0., 8., 8., 0.],
[ 0., 5., 8., 0., 0., 9., 8., 0.],
[ 0., 4., 11., 0., 1., 12., 7., 0.],
[ 0., 2., 14., 5., 10., 12., 0., 0.],
[ 0., 0., 6., 13., 10., 0., 0., 0.]])

Наступний простий приклад з цим набором даних ілюструє, як, виходячи з поставленої мети, можна сформувати дані для використання в scikit-learn.

Навчання і прогнозування

У випадку з цілим набором даних мета навчання — це передбачити, беручи до уваги подання даних, яка зображена цифра. У нас є зразки кожного з десяти можливих класів (числа від 0 до 9), на яких ми навчаємо алгоритм оцінки (estimator), щоб він міг передбачити клас, до якого належить неразмеченный зразок.

У scikit-learn алгоритм оцінки для класифікатора — це Python об'єкт, який виконує методи fit(X, y) і predict(T). Приклад алгоритму оцінки — це клас sklearn.svm.SVC виконує класифікацію методом опорних векторів. Конструктор алгоритму оцінки приймає в якості аргументів параметри моделі, але для скорочення часу, ми будемо розглядати цей алгоритм як чорний ящик:

>>> from sklearn import svm
>>> clf = svm.SVC(gamma=0.001, C=100.)


Вибір параметрів для моделі

У цьому прикладі ми встановили значення gamma вручну. Також можна автоматично визначити відповідні значення параметрів, використовуючи такі інструменти як grid search і cross validation.

Ми назвали примірник нашого алгоритму оцінки clf, так як він є класифікатором. Тепер він повинен бути застосовано до моделі, тобто він повинен навчиться на моделі. Це здійснюється шляхом прогону нашої навчальної вибірки через метод fit. В якості навчальної вибірки ми можемо використовувати всі уявлення наших даних, крім останнього. Ми зробили цю вибірку за допомогою синтаксису Python [:-1], що створило новий масив, що містить всі, крім останньої, сутності з digits.data:

>>> clf.fit(digits.data[:-1], digits.target[:-1]) 
SVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0, degree=3,
gamma=0.001, kernel='rbf', max_iter=-1, probability=False,
random_state=None, shrinking=True, tol=0.001, verbose=False)

Тепер можна передбачити нові значення, зокрема, ми можемо запитати класифікатор, яке число міститься в останньому поданні в наборі даних digits, яке ми не використовували в навчанні класифікатора:
>>> clf.predict(digits.data[-1])
array([8])

Відповідне зображення представлено нижче:

image

Як ви можете бачити, це складне завдання: представлення в поганому дозволі. Ви згодні з класифікатором?

Повне рішення цієї задачі класифікації доступно в якості прикладу, який ви можете запустити і вивчити: визнаючи проектів житлового hand-written digits.

Збереження моделі

У scikit модель можна зберегти, використовуючи вбудований модуль, названий pickle:

>>> from sklearn import svm
>>> from sklearn import datasets
>>> clf = svm.SVC()
>>> iris = datasets.load_iris()
>>> X, y = iris.data, iris.target
>>> clf.fit(X, y) 
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,
kernel='rbf', max_iter=-1, probability=False, random_state=None,
shrinking=True, tol=0.001, verbose=False)

>>> import pickle
>>> s = pickle.dumps(clf)
>>> clf2 = pickle.loads(s)
>>> clf2.predict(X[0])
array([0])
>>> y[0]
0

У приватному разі застосування scikit, може бути корисніше помітити pickle на бібліотеку joblib (joblib.dump & joblib.load), яка більш ефективна для роботи з великим обсягом даних, але вона дозволяє зберігати модель тільки на диску, а не в рядку:

>>> from sklearn.externals import joblib
>>> joblib.dump(clf, 'filename.pkl') 

Потім можна завантажити збережену модель(можливо в інший Python процес) з допомогою:
>>> clf = joblib.load('filename.pkl') 

Зверніть увагу, що joblib.dump повертає список імен файлів. Кожен окремий масив numpy, що міститься в clf об'єкті, сеарилизован як окремий файл у файловій системі. Усі файли повинні знаходитися у одній теці, коли ви завантажуєте модель з допомогою joblib.load.

Зверніть увагу, що у pickle є деякі проблеми з безпекою і супроводом. Для отримання більш детальної інформації про зберігання моделей в scikit-learn зверніться до секції Model persistence.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.