Поиск правильной модели для правильных данных.

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

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

Это одна из самых простых моделей. Он используется для регрессии, что означает, что он может дать реальное число в качестве прогноза.

Как следует из названия, эта модель предполагает, что данные линейно коррелируют с меткой. Например, если у нас есть только одна функция и мы наносим ее на график, точки примерно образуют линию:

Чтобы использовать линейную регрессию, вы можете импортировать ее из sklearn:

from sklearn.linear_model import LinearRegreassion

Есть еще две линейные модели, которые вам следует знать: Lasso и Ridge.

Иногда у нас слишком много функций, и мы подозреваем, что многие из них бесполезны для предсказания метки. Итак, что мы хотим сделать, так это сохранить значения большинства весов близкими к нулю. Модели Lasso и Ridge делают именно это. Разница только в методе, который они используют.

Гребневая регрессия сохранит большинство весов со значением, близким к 0 (но отличным от нуля). Лассо, с другой стороны, удерживает большинство весов точно равными нулю.

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

Это классификатор, используемый в основном для двоичных данных (то есть данных, метка которых относится к одной из двух категорий). Когда меток больше двух, модель будет использовать схему «один против остальных».

Это означает, что для каждой этикетки у нас будет своя модель. Модель i проверит, какова вероятность того, что точка данных имеет метку i. Тогда последняя метка, возвращаемая моделью, является наиболее вероятной.

Одна важная особенность этой модели заключается в том, что она предполагает, что все функции независимы друг от друга. Таким образом, вы должны проверить, верно ли это предположение (или, по крайней мере, разумно верно). Это можно сделать, проверив, что корреляция Пирсона близка к 0.

Чтобы проверить корреляцию Пирсона, вы можете использовать метод из библиотеки Numpy:

numpy.corrcoef(X)

Здесь X — это матрица, в которой каждая строка представляет функцию.

Машина опорных векторов

Модель SVM используется (в основном) для целей классификации. Это одна из самых мощных моделей. Самое замечательное в этом то, что он может дать действительно хорошие результаты в тех случаях, когда другие модели будут работать плохо:

  • Когда у нас есть большое количество функций
  • Когда функции разрежены (большинство из них нулевые)

Но как это возможно? Модель SVM использует так называемый «трюк ядра». Это означает, что он использует предопределенную функцию (называемую ядром) для преобразования заданных функций в более полезные функции. Наиболее распространенные ядра:

  • полиномиальный: получить функции и повысить их до определенной степени. Например, если у нас есть [x1, x2] и мы хотим создать полином степени 2, новые признаки будут [x1^2, x2^2, x1, x2, x1*x2].
  • Функция радиального базиса, которая используется чаще всего.
  • Сигмовидная функция.

Как это реализовано в sklearn?

from sklearn.svm import SVC
model = SVC(kernel = "rbf")

Здесь параметр ядра представляет собой строку и указывает тип используемого ядра. Это может быть один из "rbf”, "poly", "sigmoid", "linear".

SVM для регрессии

Хотя SVM обычно применяется для классификации, его также можно использовать для регрессии. В sklearn это реализовано моделью SVR:

from sklearn.svm import SVR
model = SVR(kernel = "rbf")

Возможные значения для kernel такие же, как и в классификации.

Древо решений

Это простая классификационная модель. Как следует из названия, он использует двоичное дерево для принятия решения о том, какую метку следует присвоить определенной точке данных.

Самое замечательное в этой модели то, что она почти не требует подготовки данных. Кроме того, эта модель может быть легко понята людьми.

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

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

деревья решений реализованы в sklearn:

from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier()

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

from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators = 200)

Здесь n_estimators — это количество моделей, которые мы используем в ансамбле.

Нейронная сеть

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

Кроме того, данные, подаваемые в НС, обычно должны быть предварительно обработаны, чтобы сделать их более «подходящими» для нейронных сетей (путем стандартизации функций, кодирования категориальных переменных и т. д.).

Это не означает, что нейронные сети никогда не следует использовать. Они хороши во многих ситуациях:

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

Хотя нейронные сети являются частью библиотеки sklearn, эта реализация не дает вам достаточного контроля над параметрами вашей модели.

Поэтому лучше использовать какие-то специализированные библиотеки, такие как Tensorflow и Keras.

Заключение

Спасибо, что дочитали до конца! Если вы заинтересованы в понимании этих моделей машинного обучения, обязательно ознакомьтесь с этими ссылками:

Больше контента на plainenglish.io