Автостопом по машинному обучению на Python

алгоритмы машинного обучения

Машинное обучение на подъеме, этот термин медленно забрался на территорию так называемых модных слов (buzzword). Это в значительной степени связано с тем, что многие до конца не осознают, что же на самом деле означает этот термин. Благодаря анализу Google Trends (статистике по поисковым запросам), мы можем изучить график и понять, как рос интерес к термину «машинное обучение» в течение последних 5 лет:

Цель

Но эта статья не о популярности машинного обученияЗдесь кратко описаны восемь главных алгоритмов машинного обучения и их использование на практике. Обратите внимание, что все модели реализованы на Python и у вас должно быть хотя бы минимальное знание этого языка программирования. Подробное объяснение каждого раздела содержится в прикрепленных англоязычных видео. Сразу оговоримся, что полным новичкам этот текст покажется сложным, он скорее подходит для продолжающих и продвинутых разработчиков, но главы материала можно использовать как план для построения обучения: что стоит знать, в чем стоит разобраться в первую очередь.

Классификация

Не стесняйтесь пропускать алгоритм, если чего-то не понимаете. Используйте это руководство так, как пожелаете. Вот список:

  1. Линейная регрессия.
  2. Логистическая регрессия.
  3. Деревья решений.
  4. Метод опорных векторов.
  5. Метод k-ближайших соседей.
  6. Алгоритм случайный лес.
  7. Метод k-средних.
  8. Метод главных компонент.

Наводим порядок

Вы явно расстроитесь, если при попытке запустить чужой код вдруг окажется, что для корректной работы у вас нет трех необходимых пакетов, да еще и код был запущен в старой версии языка. Поэтому, чтобы сохранить драгоценное время, сразу используйте Python 3.6.2 и импортируйте нужные библиотеки из вставки кода ниже. Данные брались из датасетов Diabetes и Iris из UCI Machine Learning Repository. В конце концов, если вы хотите все это пропустить и сразу посмотреть код, то вот вам ссылка на GitHub-репозиторий.

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
%matplotlib inline

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

Возможно, это самый популярный алгоритм машинного обучения на данный момент и в то же время самый недооцененный. Многие специалисты по анализу данных забывают, что из двух алгоритмов с одинаковой производительностью лучше выбирать тот, что проще. Линейная регрессия — это алгоритм контролируемого машинного обучения, который прогнозирует результат, основанный на непрерывных функциях. Линейная регрессия универсальна в том смысле, что она имеет возможность запускаться с одной входной переменной (простая линейная регрессия) или с зависимостью от нескольких переменных (множественная регрессия). Суть этого алгоритма заключается в назначении оптимальных весов для переменных, чтобы создать линию (ax + b), которая будет использоваться для прогнозирования вывода. Посмотрите видео с более наглядным объяснением.

Теперь, когда вы поняли суть линейной регрессии, давайте пойдем дальше и реализуем ее на Python.

Начало работы

from sklearn import linear_model
df = pd.read_csv('linear_regression_df.csv')
df.columns = ['X', 'Y']
df.head()

Визуализация

sns.set_context("notebook", font_scale=1.1)
sns.set_style("ticks")
sns.lmplot('X','Y', data=df)
plt.ylabel('Response')
plt.xlabel('Explanatory')

Реализация

linear = linear_model.LinearRegression()
trainX = np.asarray(df.X[20:len(df.X)]).reshape(-1, 1)
trainY = np.asarray(df.Y[20:len(df.Y)]).reshape(-1, 1)
testX = np.asarray(df.X[:20]).reshape(-1, 1)
testY = np.asarray(df.Y[:20]).reshape(-1, 1)
linear.fit(trainX, trainY)
linear.score(trainX, trainY)
print('Coefficient: \n', linear.coef_)
print('Intercept: \n', linear.intercept_)
print('R² Value: \n', linear.score(trainX, trainY))
predicted = linear.predict(testX)

Логистическая регрессия

Логистическая регрессия – алгоритм контролируемой классификации. Она позволяет предсказывать значения непрерывной зависимой переменной на интервале от 0 до 1. Когда начинаешь изучать логистическую регрессию, складывается впечатление, что это своего рода узкоспециализированная вещь, и поэтому не уделяешь ей должного внимания. И лишь позже понимаешь, что очень ошибался. Некоторые из основных аспектов логистической регрессии лежат в основе других важных алгоритмов машинного обучения, например, для повышения точности прогноза нейросетевой модели. Имейте это в виду и смотрите видео ниже.

Теперь попробуем реализовать этот алгоритм на Python.

Начало работы

from sklearn.linear_model import LogisticRegression
df = pd.read_csv('logistic regression df.csv')
df.columns = ['X', 'Y']
df.head()

Визуализация

sns.set_context("notebook", font_scale=1.1)
sns.set_style("ticks")
sns.regplot('X','Y', data=df, logistic=True)
plt.ylabel('Probability')
plt.xlabel('Explanatory')

Реализация

logistic = LogisticRegression()
X = (np.asarray(df.X)).reshape(-1, 1)
Y = (np.asarray(df.Y)).ravel()
logistic.fit(X, Y)
logistic.score(X, Y)
print('Coefficient: \n', logistic.coef_)
print('Intercept: \n', logistic.intercept_)
print('R² Value: \n', logistic.score(X, Y))

Деревья решений

Метод деревьев решений (decision trees) – это один из наиболее популярных методов решения задач классификации и прогнозирования. Опыт показывает, что чаще всего данный алгоритм используется именно для классификации. На входе модель принимает набор атрибутов, характеризующих некую сущность, а затем спускается по дереву, тестируя их в зависимости от того, какие значения может принимать целевая функция. Таким образом, классификация каждого нового случая происходит при движении вниз до листа, который и укажет нам значение целевой функции в каждом конкретном случае. Деревья принятия решений становятся все более популярными и могут служить очень сильным инструментом для аналитики данных, особенно в сочетании с простыми методами композиции, такими как случайный лес, бустинг и бэггинг. И снова просмотрите видео ниже, чтобы более подробно изучить базовую функциональность деревьев решений.

А теперь по традиции перейдем к практике и реализуем данный алгоритм на Python.

Начало работы

from sklearn import tree
df = pd.read_csv('iris_df.csv')
df.columns = ['X1', 'X2', 'X3', 'X4', 'Y']
df.head()

Реализация

from sklearn.cross_validation import train_test_split
decision = tree.DecisionTreeClassifier(criterion='gini')
X = df.values[:, 0:4]
Y = df.values[:, 4]
trainX, testX, trainY, testY = train_test_split( X, Y, test_size = 0.3)
decision.fit(trainX, trainY)
print('Accuracy: \n', decision.score(testX, testY))

Визуализация

from sklearn.externals.six import StringIO
from IPython.display import Image
import pydotplus as pydot
dot_data = StringIO()
tree.export_graphviz(decision, out_file=dot_data)
graph = pydot.graph_from_dot_data(dot_data.getvalue())
Image(graph.create png())

Метод опорных векторов

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

Этот вектор установлен по умолчанию и часто визуализируется как линейный, однако это не всегда так. Вектор также может принимать нелинейный вид, если тип ядра изменен от типа (по умолчанию) «гауссовского» или линейного. Несколькими предложениями данный алгоритм не опишешь, поэтому просмотрите учебное видео ниже.

И по традиции реализация на Python.

Начало работы

from sklearn import svm
df = pd.read_csv('iris_df.csv')
df.columns = ['X4', 'X3', 'X1', 'X2', 'Y']
df = df.drop(['X4', 'X3'], 1)
df.head()

Реализация

from sklearn.cross_validation import train_test_split
support = svm.SVC()
X = df.values[:, 0:2]
Y = df.values[:, 2]
trainX, testX, trainY, testY = train_test_split( X, Y, test_size = 0.3)
support.fit(trainX, trainY)
print('Accuracy: \n', support.score(testX, testY))
pred = support.predict(testX)

Визуализация

sns.set_context("notebook", font_scale=1.1)
sns.set_style("ticks")
sns.lmplot('X1','X2', scatter=True, fit_reg=False, data=df, hue='Y')
plt.ylabel('X2')
plt.xlabel('X1')

Метод k-ближайших соседей

K-Nearest Neighbors, или KNN, представляет собой контролируемый алгоритм обучения, который используется преимущественно для решения задач классификации. Данный алгоритм наблюдает за разными центрами (центроидами) и сравнивает расстояние между ними, используя для этого различные функции (обычно евклидово расстояние). Затем определяется, к какому классу принадлежит большинство ближайших объектов обучающей выборки – к этому классу относится и неизвестный объект. Посмотрите видео для того, чтобы увидеть что происходит за кулисами данного алгоритма.

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

Начало работы

from sklearn.neighbors import KNeighborsClassifier
df = pd.read_csv('iris_df.csv')
df.columns = ['X1', 'X2', 'X3', 'X4', 'Y']
df = df.drop(['X4', 'X3'], 1)
df.head()

Визуализация

sns.set_context("notebook", font_scale=1.1)
sns.set_style("ticks")
sns.lmplot('X1','X2', scatter=True, fit_reg=False, data=df, hue='Y')
plt.ylabel('X2')
plt.xlabel('X1')

Реализация

from sklearn.cross_validation import train_test_split
neighbors = KNeighborsClassifier(n_neighbors=5)
X = df.values[:, 0:2]
Y = df.values[:, 2]
trainX, testX, trainY, testY = train_test_split( X, Y, test_size = 0.3)
neighbors.fit(trainX, trainY)
print('Accuracy: \n', neighbors.score(testX, testY))
pred = neighbors.predict(testX)

Случайный лес

Случайный лес — популярный алгоритм контролируемого обучения, заключающийся в использовании комитета (ансамбля) решающих деревьев. «Ансамбль» означает, что он берет кучу «слабых учеников» и объединяет их, чтобы сформировать один сильный предиктор. «Слабые ученики» — это все случайные реализации деревьев решений, которые объединяются для формирования сильного предсказателя — случайного леса. Все не объяснить. Смотрите видео ниже.

Теперь мы знаем, что такое случайный лес, пришло время реализации кода на Python.

Начало работы

from sklearn.ensemble import RandomForestClassifier
df = pd.read_csv('iris_df.csv')
df.columns = ['X1', 'X2', 'X3', 'X4', 'Y']
df.head()

Реализация

from sklearn.cross_validation import train_test_split
forest = RandomForestClassifier()
X = df.values[:, 0:4]
Y = df.values[:, 4]
trainX, testX, trainY, testY = train_test_split( X, Y, test_size = 0.3)
forest.fit(trainX, trainY)
print('Accuracy: \n', forest.score(testX, testY))
pred = forest.predict(testX)

Метод k-средних

Метод k-средних — это популярный алгоритм неконтролируемой классификации обучения, обычно используемый для решения проблемы кластеризации. K обозначает количество введенных пользователем кластеров. Алгоритм начинается со случайно выбранных точек, а затем оптимизирует кластеры при помощи функций (евклидово расстояние и т. д), чтобы найти наилучшую группировку точек данных. В итоге специалистам по большим данным необходимо выбрать правильное значение K. Вы уже знаете, что для полноты картины нужно посмотреть видео.

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

Начало работы

from sklearn.cluster import KMeans
df = pd.read_csv('iris_df.csv')
df.columns = ['X1', 'X2', 'X3', 'X4', 'Y']
df = df.drop(['X4', 'X3'], 1)
df.head()

Реализация

from sklearn.cross_validation import train_test_split
kmeans = KMeans(n_clusters=3)
X = df.values[:, 0:2]
kmeans.fit(X)
df['Pred'] = kmeans.predict(X)
df.head()

Визуализация

sns.set_context("notebook", font_scale=1.1)
sns.set_style("ticks")
sns.lmplot('X1','X2', scatter=True, fit_reg=False, data=df, hue = 'Pred')

Метод главных компонент

PCA (Principal Component Analysis) — алгоритм сокращения размерности, который может быть очень полезен для аналитиков. Главное — это то, что данный алгоритм может значительно уменьшить размерность данных при работе с сотнями или даже тысячами различных функций. Данный алгоритм не контролируется, но пользователь должен анализировать результаты и следить за тем, чтобы сохранялось 95% или около этой цифры первоначального набора данных. Не забудьте про видео, ведь оно расскажет намного больше об этом интересном алгоритме.

Реализация на Python.

Начало работы

from sklearn import decomposition
df = pd.read_csv('iris_df.csv')
df.columns = ['X1', 'X2', 'X3', 'X4', 'Y']
df.head()

Реализация

from sklearn import decomposition
pca = decomposition.PCA()
fa = decomposition.FactorAnalysis()
X = df.values[:, 0:4]
Y = df.values[:, 4]
train, test = train_test_split(X,test_size = 0.3)
train_reduced = pca.fit_transform(train)
test_reduced = pca.transform(test)
pca.n_components_

Подводим итоги

В данном учебном пособии, мы, не углубляясь, прошлись по всем важным на сегодняшний день алгоритмам машинного обучения. Во время вашего путешествия к мастерству в машинном обучении эта статья поможет вам систематизировать знания в голове.

Перевод статьи «The Hitchhiker’s Guide to Machine Learning in Python»