Сколько минут считается машинное обучение python
Перейти к содержимому

Сколько минут считается машинное обучение python

  • автор:

Все модели машинного обучения за 5 минут

Все модели машинного обучения разделяются на обучение с учителем (supervised) и без учителя (unsupervised). В первую категорию входят регрессионная и классификационная модели. Рассмотрим значения этих терминов и входящие в эти категории модели.

Обучение с учителем

Представляет собой изучение функции, которая преобразует входные данные в выходные на основе примеров пар ввода-вывода.

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

Пример обучения с учителем

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

Регрессия

В регрессионных моделях вывод является непрерывным. Ниже приведены некоторые из наиболее распространенных типов регрессионных моделей.

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

Пример линейной регрессии

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

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

Изображение из Kaggle

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

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

Случайный лес — это техника ансамбля методов, основанная на деревьях решений. Случайные леса включают создание нескольких деревьев решений с использованием первоначальных наборов данных и случайный выбор поднабора переменных на каждом этапе. Затем модель выбирает моду (значение, которое встречается чаще других) из всех прогнозов каждого дерева решений. Какой в этом смысл? Модель “победы большинства” снижает риск ошибки отдельного дерева.

Например, у нас есть одно дерево решений (третье), которое предсказывает 0. Однако если полагаться на моду всех 4 деревьев, прогнозируемое значение будет равно 1. В этом заключается преимущество случайных лесов.

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

Визуальное представление нейронной сети

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

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

В классификационных моделях вывод является дискретным. Ниже приведены некоторые из наиболее распространенных типов классификационных моделей.

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

Логистическая регрессия аналогична линейной регрессии, но используется для моделирования вероятности ограниченного числа результатов, обычно двух. Логистическое уравнение создается таким образом, что выходные значения могут находиться только между 0 и 1:

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

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

Предположим, что существует два класса данных. Метод опорных векторов находит гиперплоскость или границу между двумя классами данных, которая максимизирует разницу между двумя классами. Есть множество плоскостей, которые могут разделить два класса, но только одна из них максимизирует разницу или расстояние между классами.

Наивный Байес

Наивный Байес — еще один популярный классификатор, используемый в науке о данных. Его идея лежит в основе теоремы Байеса:

Несмотря на ряд нереалистичных предположений, сделанных в отношении наивного Байеса (отсюда и название “наивный”), он не только доказал свою эффективность в большинстве случаев, но и относительно прост в построении.

Обучение без учителя

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

Кластеризация

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

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

Понижение размерности

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

Популярный метод понижения размерности называется методом главных компонент (PCA). Он представляет собой проецирование многомерных данных (например, 3 измерения) в меньшее пространство (например, 2 измерения). Это приводит к уменьшению размерности данных (2 измерения вместо 3) при сохранении всех исходных переменных в модели.

  • Машинное обучение. С чего начать? Часть 1
  • Я хочу изучать AI и машинное обучение. С чего мне начать?
  • Максимальная производительность Pandas Python

Введение в машинное обучение в Python: Полное руководство с примерами

Введение в машинное обучение в Python: Полное руководство с примерами

Вы хотите сделать машинное обучение с помощью Python, но у вас возникли вопросы с чего начать? В этом уроке вы сделаете свой первый проект по машинному обучению с помощью Python. В уроке мы разберем шаг за шагом как:

  1. Скачать и установить Python SciPy и какие самые полезные пакеты для машинного обучения в Python.
  2. Загрузить датасет, поймем его структуру с помощью статистических методов и визуализируем данные
  3. Создадим 6 моделей машинного обучения, выберем лучшую и убедимся что точность модели является приемлемой

Если вы новичок в машинном обучении и хотите начать использовать Python, этот урок был разработан для вас.

Как начать использовать машинное обучение в Python?

Лучший способ научиться машинному обучению — проектировать и завершать небольшие проекты.

Python может быть пугающим при начале работы

Python является популярным и мощным интерпретируемым языком. В отличие от R, Python является и полным языком и платформой, которые можно использовать как для исследований, численных расчетов, так и для разработки производственных систем.

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

Лучший способ начать использовать Python для машинного обучения — это разобрать готовый проект по машинному обучению и затем его сделать самому с нуля:

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

Новичкам нужен небольшой сквозной проект

Книги и курсы порой часто расстраивают. Они дают вам много теоретических конструкций и фрагментов, но вы никогда не увидите, как все они сочетаются друг с другом.

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

  • Постановка задачи
  • Подготовка данных
  • Оценка качества алгоритмов
  • Оптимизация результата
  • Презентация результата.

Лучший способ по-настоящему примириться с новой платформой или инструментом – это работать над проектом машинного обучения и покрыть эти ключевые этапы.

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

«Hello World!» машинного обучения

Отличным примером небольшого проекта чтобы начать является задача классификация цветов (на примере цветов ириса).

Это хороший проект, потому что он легко интерпретируется.

  • Атрибуты данных являются числовыми, так что вы должны разобраться, как загрузить и обрабатывать данные
  • Это проблема классификации, позволяющая практиковаться с, возможно, более простым типом контролируемого алгоритма обучения
  • Задача является многоклассовой классификацией и может потребовать некоторой специализированной обработки
  • Выборка имеет только 4 атрибута и 150 строк, что означает, что она достаточно мала, легко будет обработана в операционном памяти локальном компьютера (и легко визуализировать на экране)
  • Все числовые атрибуты находятся в одном и том же масштабе и одинаковой шкале, не требуя специальной нормализации или масштабирования для начала работы

Давайте начнем проект «hello world» машинного обучения в Python.

Машинное обучение в Python (начало проекта)

Вот краткий обзор того, что мы собираемся охватить:

  • Установка платформы Python и SciPy
  • Загрузка датасета
  • Анализ датасета
  • Визуализация данных
  • Оценка алгоритмов машинного обучения
  • Прогнозирование данных

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

Если у вас есть какие-либо вопросы, пожалуйста, задавайте их в чат.

1. Загрузка, установка и запуск Python и SciPy

Раздел для тех, у кого ее не установлен Python и SciPy. Мы не будем подробно останавливаться на том как устанавливать Python, есть много пошаговых руководств в интернете как это сделать или рекомендуем посетить раздел «Введение в Python».

1.1 Установка библиотек SciPy

Есть 5 ключевых библиотек, которые необходимо установить. Ниже приведен список библиотек Python SciPy, необходимых для этого руководства:

На сайте SciPy есть отличная инструкция по установке вышеуказанных библиотек на ключевых платформах: Windows, Linux, OS X mac. Если у вас есть какие-либо сомнения или вопросы, обратитесь к этому руководству, через него прошли миллионы людей.

Существует множество способов установить библиотеки. В качестве совета мы рекомендуем выбрать один метод и быть последовательным в установке каждой библиотеки. Если вы пользуетесь Windows или вы не уверены как это сделать, мы рекомендую установить бесплатную версию Anaconda, которая включает в себя все, что вам нужно (windows, macOS, Linux).

1.2 Запуск Python и проверка версий

Рекомендуется убедиться, что среда Python была успешно установлена и работает в штатном состоянии. Сценарий ниже поможет вам проверить вашу среду. Он импортирует каждую библиотеку, требуемую в этом учебнике, и печатает версию.

Откройте командную строку и запустите Python:

python

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

Введите или скопируйте и вставьте следующий скрипт в интерпретатор:

# Проерка версий библиотек # Версия Python import sys print('Python: <>'.format(sys.version)) # Загрузка scipy import scipy print('scipy: <>'.format(scipy.__version__)) # Загрузка numpy import numpy print('numpy: <>'.format(numpy.__version__)) # Загрузка matplotlib import matplotlib print('matplotlib: <>'.format(matplotlib.__version__)) # Загрузка pandas import pandas print('pandas: <>'.format(pandas.__version__)) # Загрукзка scikit-learn import sklearn print('sklearn: <>'.format(sklearn.__version__))

Вот пример вывода:

Python: 3.7.0 (default, Jun 28 2018, 08:04:48) [MSC v.1912 64 bit (AMD64)] scipy: 1.1.0 numpy: 1.15.1 matplotlib: 2.2.3 pandas: 0.23.4 sklearn: 0.19.2

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

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

2. Загрузите данные

Мы будем использовать датасет цветов ирисов Фишера. Этот датасет известен тем, что он используется практически всеми в качестве «hello world» примера в машинном обучении и статистике.

Набор данных содержит 150 наблюдений за цветами ириса. В датасете есть четыре колонки измерений цветов в сантиметрах. Пятая колонна является видом наблюдаемого цветка.

Все наблюдаемые цветы принадлежат к одному из трех видов. Узнать больше об этом датасете можно в Википедия.

На этом этапе мы загрузим данные из URL-адреса в CSV файл.

2.1 Импорт библиотек

Во-первых, давайте импортировать все модули, функции и объекты, которые мы планируем использовать в этом уроке.

# Загрузка библиотек from pandas import read_csv from pandas.plotting import scatter_matrix from matplotlib import pyplot from sklearn.model_selection import train_test_split from sklearn.model_selection import cross_val_score from sklearn.model_selection import StratifiedKFold from sklearn.metrics import classification_report from sklearn.metrics import confusion_matrix from sklearn.metrics import accuracy_score from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.naive_bayes import GaussianNB from sklearn.svm import SVC

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

2.2 Загрузка датасета

Мы можем загрузить данные непосредственно из репозитория машинного обучения UCI.

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

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

# Загрузка датасета url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/iris.csv" names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class'] dataset = read_csv(url, names=names)

Датасет должен загрузиться без происшествий.

Если у вас есть проблемы с сетью, вы можете скачать файл iris.csv в рабочую директорию и загрузить его с помощью того же метода, изменив URL на локальное имя файла.

3. Анализ датасета

Теперь пришло время взглянуть на данные более детально. На этом этапе мы погрузимся в анализ данные несколькими способами:

  • Размерность датасета
  • Просмотр среза данных
  • Статистическая сводка атрибутов
  • Разбивка данных по атрибуту класса.

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

3.1 Размерность датасета

Мы можем получить быстрое представление о том, сколько экземпляров (строк) и сколько атрибутов (столбцов) содержится в датасете с помощью метода shape.

# shape print(dataset.shape)

Вы должны увидеть 150 экземпляров и 5 атрибутов:

(150, 5)

3.2 Просмотр среза данных

Исследовании данных, стоит сразу в них заглянуть, для этого есть метод head()

# Срез данных head print(dataset.head(20))

Это должно вывести первые 20 строк датасета.

 sepal-length sepal-width petal-length petal-width class 0 5.1 3.5 1.4 0.2 Iris-setosa 1 4.9 3.0 1.4 0.2 Iris-setosa 2 4.7 3.2 1.3 0.2 Iris-setosa 3 4.6 3.1 1.5 0.2 Iris-setosa 4 5.0 3.6 1.4 0.2 Iris-setosa 5 5.4 3.9 1.7 0.4 Iris-setosa 6 4.6 3.4 1.4 0.3 Iris-setosa 7 5.0 3.4 1.5 0.2 Iris-setosa 8 4.4 2.9 1.4 0.2 Iris-setosa 9 4.9 3.1 1.5 0.1 Iris-setosa 10 5.4 3.7 1.5 0.2 Iris-setosa 11 4.8 3.4 1.6 0.2 Iris-setosa 12 4.8 3.0 1.4 0.1 Iris-setosa 13 4.3 3.0 1.1 0.1 Iris-setosa 14 5.8 4.0 1.2 0.2 Iris-setosa 15 5.7 4.4 1.5 0.4 Iris-setosa 16 5.4 3.9 1.3 0.4 Iris-setosa 17 5.1 3.5 1.4 0.3 Iris-setosa 18 5.7 3.8 1.7 0.3 Iris-setosa 19 5.1 3.8 1.5 0.3 Iris-setosa

3.3 Статистическая сводка

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

# Стастические сводка методом describe print(dataset.describe()) 

Мы видим, что все численные значения имеют одинаковую шкалу (сантиметры) и аналогичные диапазоны от 0 до 8 сантиметров.

 sepal-length sepal-width petal-length petal-width count 150.000000 150.000000 150.000000 150.000000 mean 5.843333 3.054000 3.758667 1.198667 std 0.828066 0.433594 1.764420 0.763161 min 4.300000 2.000000 1.000000 0.100000 25% 5.100000 2.800000 1.600000 0.300000 50% 5.800000 3.000000 4.350000 1.300000 75% 6.400000 3.300000 5.100000 1.800000 max 7.900000 4.400000 6.900000 2.500000

3.4 Распределение классов

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

# Распределение по атрибуту class print(dataset.groupby('class').size())

Мы видим, что каждый класс имеет одинаковое количество экземпляров (50 или 33% от датасета).

class Iris-setosa 50 Iris-versicolor 50 Iris-virginica 50 dtype: int64

3.5 Резюме загрузки датасета

На будущее мы можем объединить все предыдущие элементы вместе в один скрипт..

# Загрузка библиотек from pandas import read_csv # Загрузка датасета url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/iris.csv" names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class'] dataset = read_csv(url, names=names) # shape print(dataset.shape) # Срез данных head print(dataset.head(20)) # Стастические сводка методом describe print(dataset.describe()) # Распределение по атрибуту class print(dataset.groupby('class').size())

4. Визуализация данных

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

Мы рассмотрим два типа графиков:

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

4.1 Одномерные графики

Начнем с некоторых одномерных графиков, то есть графики каждой отдельной переменной. Учитывая, что входные переменные являются числовыми, мы можем создавать диаграмма размаха (или «ящик с усами», по-английски «box and whiskers diagram») каждого из них.

# Диаграмма размаха dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False) pyplot.show()

Это дает нам более четкое представление о распределении атрибутов на входе.

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

# Гистограмма распределения атрибутов датасета dataset.hist() pyplot.show()

Из графиков видно, что две из входных переменных имеют около гауссово (нормальное) распределение. Это полезно отметить, поскольку мы можем использовать алгоритмы, которые могут использовать это предположение.

4.2 Многомерные графики

Теперь мы можем посмотреть на взаимодействия между переменными.

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

#Матрица диаграмм рассеяния scatter_matrix(dataset) pyplot.show()

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

4.3 Резюме визуализации данных

Для справки мы можем связать все предыдущие элементы вместе в один скрипт. Полный пример приведен ниже.

# Загрузка библиотек from pandas import read_csv # Загрузка датасета url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/iris.csv" names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class'] dataset = read_csv(url, names=names) # Диаграмма размаха dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False) pyplot.show() # Гистограмма распределения атрибутов датасета dataset.hist() pyplot.show() #Матрица диаграмм рассеяния scatter_matrix(dataset) pyplot.show()

5. Оценка алгоритмов

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

Вот что мы собираемся охватить в этом шаге:

  • Отделим обучающая выборка от контрольной (тестовой) выборке.
  • Настройка 10-кратной кросс-валидации
  • Построим несколько различных моделей для прогнозирования класса цветка из измерений цветов
  • Выберем лучшую модель.

5.1 Создание контрольной выборки

Мы должны знать, что модель, которую мы создали, хороша.

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

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

Разделим загруженный датасет на два:

  • 80% данных мы будем использовать для обучения, оценки и выбора лучшей среди наших моделей
  • 20% данных, что мы будем использовать в качестве контрольного теста качества полученных моделей
# Разделение датасета на обучающую и контрольную выборки array = dataset.values # Выбор первых 4-х столбцов X = array[:,0:4] # Выбор 5-го столбца y = array[:,4] # Разделение X и y на обучающую и контрольную выборки X_train, X_validation, Y_train, Y_validation = train_test_split(X, y, test_size=0.20, random_state=1)

Теперь у вас есть обучающиеся данные в X_train и Y_train для подготовки моделей и контрольная выборка X_validation и Y_validation, которые мы можем использовать позже.

Обратите внимание, что мы использовали срез в Python для выбора столбцов в массиве NumPy.

5.2 Тестирование проверки

Для оценки точности модели мы будем использовать стратифицированную 10-кратную кросс-валидацию.

Это разделит наш датасет на 10 частей, обучающийся на 9 частях и 1 тестовой проверке и будет повторять обучение на всех комбинаций из выборок train-test.

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

Для получения дополнительной информации о том как работает метод k-fold кросс-валидации можно посмотреть по ссылке.

Мы устанавливаем случайное затравку через random_state аргумент на фиксированное число, чтобы гарантировать, что каждый алгоритм оценивается на тех же выборках обучающихся данных. Конкретные случайные затравки не имеет значения.

Мы используем метрику «acccuracy» для оценки моделей.

Это соотношение числа правильно предсказанных экземпляров, разделенных на общее количество экземпляров в наборе данных, умноженном на 100, чтобы дать процент (например, точность 95%). Мы будем использовать оценочную переменную, когда мы будем запускать сборку и оценивать каждую модель.

5.3 Строим модели машинного обучения

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

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

Давайте протестируем 6 различных алгоритмов:

  • Логистическая регрессия или логит-модель (LR)
  • Линейный дискриминантный анализ (LDA)
  • Метод k-ближайших соседей (KNN)
  • Классификация и регрессия с помощью деревьев (CART)
  • Наивный байесовский классификатор (NB)
  • Метод опорных векторов (SVM)

Здесь приведена смесь простых линейных (LR и LDA), нелинейных (KNN, CART, NB и SVM) алгоритмов.

Давайте построим и оценим наши модели:

# Загружаем алгоритмы модели models = [] models.append(('LR', LogisticRegression(solver='liblinear', multi_class='ovr'))) models.append(('LDA', LinearDiscriminantAnalysis())) models.append(('KNN', KNeighborsClassifier())) models.append(('CART', DecisionTreeClassifier())) models.append(('NB', GaussianNB())) models.append(('SVM', SVC(gamma='auto'))) # оцениваем модель на каждой итерации results = [] names = [] for name, model in models: kfold = StratifiedKFold(n_splits=10, random_state=1, shuffle=True) cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring='accuracy') results.append(cv_results) names.append(name) print('%s: %f (%f)' % (name, cv_results.mean(), cv_results.std()))

5.4 Выбираем модель

Теперь у нас есть 6 моделей и оценки точности каждой из них. Мы должны сравнить модели друг с другом и выбрать наиболее точные.

Запустив приведенный выше пример, мы получим следующие необработанные результаты:

LR: 0.955909 (0.044337) LDA: 0.975641 (0.037246) KNN: 0.950524 (0.040563) CART: 0.951166 (0.052812) NB: 0.951166 (0.052812) SVM: 0.983333 (0.033333)

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

Как интерпретировать полученные значения качества моделей?

В этом случае, мы видим, что это выглядит как метод опорных векторов (SVM) имеет самый большой расчет точности около 0,98 или 98%.

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

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

# Сравниванием алгоритмы pyplot.boxplot(results, labels=names) pyplot.title('Algorithm Comparison') pyplot.show()

Мы видим, что ящики и усы участков в верхней части диапазона достигают 100% точности, а некоторые находятся в районе 85% точности.

5.5 Резюме оценки алгоритмов

Для справки мы можем связать все предыдущие элементы вместе в один скрипт. Полный пример приведен ниже.

# Загрузка библиотек from pandas import read_csv from pandas.plotting import scatter_matrix from matplotlib import pyplot from sklearn.model_selection import train_test_split from sklearn.model_selection import cross_val_score from sklearn.model_selection import StratifiedKFold from sklearn.metrics import classification_report from sklearn.metrics import confusion_matrix from sklearn.metrics import accuracy_score from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.naive_bayes import GaussianNB from sklearn.svm import SVC # Загрузка датасета url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/iris.csv" names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class'] dataset = read_csv(url, names=names) # Разделение датасета на обучающую и контрольную выборки array = dataset.values # Выбор первых 4-х столбцов X = array[:,0:4] # Выбор 5-го столбца y = array[:,4] # Разделение X и y на обучающую и контрольную выборки X_train, X_validation, Y_train, Y_validation = train_test_split(X, y, test_size=0.20, random_state=1) # Загружаем алгоритмы моделей models = [] models.append(('LR', LogisticRegression(solver='liblinear', multi_class='ovr'))) models.append(('LDA', LinearDiscriminantAnalysis())) models.append(('KNN', KNeighborsClassifier())) models.append(('CART', DecisionTreeClassifier())) models.append(('NB', GaussianNB())) models.append(('SVM', SVC(gamma='auto'))) # оцениваем модель на каждой итерации results = [] names = [] for name, model in models: kfold = StratifiedKFold(n_splits=10, random_state=1, shuffle=True) cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring='accuracy') results.append(cv_results) names.append(name) print('%s: %f (%f)' % (name, cv_results.mean(), cv_results.std())) # Сравниванием алгоритмы pyplot.boxplot(results, labels=names) pyplot.title('Algorithm Comparison') pyplot.show()

6. Прогнозирование данных

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

Теперь мы хотим получить представление о точности модели на нашей контрольной выборке данных.

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

6.1 Создаем прогноз

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

# Создаем прогноз на контрольной выборке model = SVC(gamma='auto') model.fit(X_train, Y_train) predictions = model.predict(X_validation)

6.2 Оцениваем прогноз

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

# Оцениваем прогноз print(accuracy_score(Y_validation, predictions)) print(confusion_matrix(Y_validation, predictions)) print(classification_report(Y_validation, predictions))

Мы видим, что точность 0,966 или около 96% на контрольной выборке.

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

Наконец, отчет о классификации предусматривает разбивку каждого класса по точности (precision), полнота (recall), f1-оценка, показывающим отличные результаты (при этом контрольная выборка была небольшая, всего 30 значений).

0.9666666666666667 [[11 0 0] [ 0 12 1] [ 0 0 6]] precision recall f1-score support Iris-setosa 1.00 1.00 1.00 11 Iris-versicolor 1.00 0.92 0.96 13 Iris-virginica 0.86 1.00 0.92 6 avg / total 0.97 0.97 0.97 30 

6.3 Резюме прогнозирование данных

Для справки мы можем связать все предыдущие элементы вместе в один скрипт. Полный пример приведен ниже.

# Загрузка библиотек from pandas import read_csv from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report from sklearn.metrics import confusion_matrix from sklearn.metrics import accuracy_score # Загрузка датасета url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/iris.csv" names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class'] dataset = read_csv(url, names=names) # Разделение датасета на обучающую и контрольную выборки array = dataset.values # Выбор первых 4-х столбцов X = array[:,0:4] # Выбор 5-го столбца y = array[:,4] # Разделение X и y на обучающую и контрольную выборки X_train, X_validation, Y_train, Y_validation = train_test_split(X, y, test_size=0.20, random_state=1) # Создаем прогноз на контрольной выборке model = SVC(gamma='auto') model.fit(X_train, Y_train) predictions = model.predict(X_validation) # Оцениваем прогноз print(accuracy_score(Y_validation, predictions)) print(confusion_matrix(Y_validation, predictions)) print(classification_report(Y_validation, predictions))

Машинное обучение в Python это не сложно

Проработайте примеры из урока, это не займет дольше 10-15 минут.

Вам не обязательно сразу все понимать. Ваша цель состоит в том, чтобы запустить ряд скриптов описанных в уроке и получить конечный результат. Вам не нужно понимать все при первом проходе. Записывайте свои вопросы параллельно с тем как пишите код. Рекомендуем использовать справку («FunctionName») в Python чтобы разобраться глубже во всех функциях, которые вы используете.

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

Вам не нужно быть программистом Python. Синтаксис языка Python может быть интуитивно понятным, даже если вы новичок в нем. Как и на других языках, сосредоточьтесь на вызовах функций (например,function()) и назначениях (например, a = «b»). Если вы являетесь разработчиком, вы итак уже знаете, как подобрать основы языка очень быстро.

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

Итого

Вы сделали свой первый мини-проект по машинному обучению в Python.

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

Какие могут быть следующие шаги по изучению машинного обучения?

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

Делаем проект по машинному обучению на Python. Часть 1

Когда читаешь книгу или слушаешь учебный курс про анализ данных, нередко возникает чувство, что перед тобой какие-то отдельные части картины, которые никак не складываются воедино. Вас может пугать перспектива сделать следующий шаг и целиком решить какую-то задачу с помощью машинного обучения, но с помощью этой серии статей вы обретёте уверенность в способности решить любую задачу в сфере data science.

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

Последовательно пройдём через этапы:

  1. Очистка и форматирование данных.
  2. Разведочный анализ данных.
  3. Конструирование и выбор признаков.
  4. Сравнение метрик нескольких моделей машинного обучения.
  5. Гиперпараметрическая настройка лучшей модели.
  6. Оценка лучшей модели на тестовом наборе данных.
  7. Интерпретирование результатов работы модели.
  8. Выводы и работа с документами.

Описание задачи

Прежде чем писать код, необходимо разобраться в решаемой задаче и доступных данных. В этом проекте мы будем работать с выложенными в общий доступ данными об энергоэффективности зданий в Нью-Йорке.

Наша цель: использовать имеющиеся данные для построения модели, которая прогнозирует количество баллов Energy Star Score для конкретного здания, и интерпретировать результаты для поиска факторов, влияющих на итоговый балл.

Данные уже включают в себя присвоенные баллы Energy Star Score, поэтому наша задача представляет собой машинное обучение с управляемой регрессией:

  • Управляемая (Supervised): нам известны признаки и цель, и наша задача — обучить модель, которая сможет сопоставить первое со вторым.
  • Регрессия (Regression): балл Energy Star Score — это непрерывная переменная.

Очистка данных

Далеко не каждый набор данных представляет собой идеально подобранное множество наблюдений, без аномалий и пропущенных значений (намек на датасеты mtcars и iris). В реальных данных мало порядка, так что прежде чем приступить к анализу, их нужно очистить и привести к приемлемому формату. Очистка данных — неприятная, но обязательная процедура при решении большинства задач по анализу данных.

Сначала можно загрузить данные в виде кадра данных (dataframe) Pandas и изучить их:

import pandas as pd import numpy as np # Read in data into a dataframe data = pd.read_csv('data/Energy_and_Water_Data_Disclosure_for_Local_Law_84_2017__Data_for_Calendar_Year_2016_.csv') # Display top of dataframe data.head()

Так выглядят реальные данные.

Это фрагмент таблицы из 60 колонок. Даже здесь видно несколько проблем: нам нужно прогнозировать Energy Star Score , но мы не знаем, что означают все эти колонки. Хотя это не обязательно является проблемой, потому что зачастую можно создать точную модель, вообще ничего не зная о переменных. Но нам важна интерпретируемость, поэтому нужно выяснить значение как минимум нескольких колонок.

Когда мы получили эти данные, то не стали спрашивать о значениях, а посмотрели на название файла:

и решили поискать по запросу «Local Law 84». Мы нашли эту страницу, на которой говорилось, что речь идёт о действующем в Нью-Йорке законе, согласно которому владельцы всех зданий определённого размера должны отчитываться о потреблении энергии. Дальнейший поиск помог найти все значения колонок. Так что не пренебрегайте именами файлов, они могут быть хорошей отправной точкой. К тому же это напоминание, чтобы вы не торопились и не упустили что-нибудь важное!

Мы не будем изучать все колонки, но точно разберёмся с Energy Star Score, которая описывается так:

Ранжирование по перцентили от 1 до 100, которая рассчитывается на основе самостоятельно заполняемых владельцами зданий отчётов об энергопотреблении за год. Energy Star Score — это относительный показатель, используемый для сравнения энергоэффективности зданий.

Первая проблема решилась, но осталась вторая — отсутствующие значения, помеченные как «Not Available». Это строковое значение в Python, которое означает, что даже строки с числами будут храниться как типы данных object , потому что если в колонке есть какая-нибудь строковая, Pandas конвертирует её в колонку, полностью состоящую из строковых. Типы данных колонок можно узнать с помощью метода dataframe.info() :

# See the column data types and non-missing values data.info()

Наверняка некоторые колонки, которые явно содержат числа (например, ft²), сохранены как объекты. Мы не можем применять числовой анализ к строковым значениям, так что конвертируем их в числовые типы данных (особенно float )!

Этот код сначала заменяет все «Not Available» на not a number ( np.nan ), которые можно интерпретировать как числа, а затем конвертирует содержимое определённых колонок в тип float :

# Replace all occurrences of Not Available with numpy not a number data = data.replace() # Iterate through the columns for col in list(data.columns): # Select columns that should be numeric if ('ft²' in col or 'kBtu' in col or 'Metric Tons CO2e' in col or 'kWh' in col or 'therms' in col or 'gal' in col or 'Score' in col): # Convert the data type to float data[col] = data[col].astype(float)

Когда значения в соответствующих колонках у нас станут числами, можно начинать исследовать данные.

Отсутствующие и аномальные данные

Наряду с некорректными типами данных одна из самых частых проблем — отсутствующие значения. Они могут отсутствовать по разным причинам, и перед обучением модели эти значения нужно либо заполнить, либо удалить. Сначала давайте выясним, сколько у нас не хватает значений в каждой колонке (код здесь).

Для создания таблицы использована функция из ветки на StackOverflow.

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

Также на этом этапе лучше удалить аномальные значения. Они могут возникать из-за опечаток при вводе данных или из-за ошибок в единицах измерений, либо это могут быть корректные, но экстремальные значения. В данном случае мы удалим «лишние» значения, руководствуясь определением экстремальных аномалий:

  • Ниже первого квартиля − 3 ∗ интерквартильный размах.
  • Выше третьего квартиля + 3 ∗ интерквартильный размах.

Разведочный анализ данных

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

Коротко говоря, РАД — это попытка выяснить, что нам могут сказать данные. Обычно анализ начинается с поверхностного обзора, затем мы находим интересные фрагменты и анализируем их подробнее. Выводы могут быть интересными сами по себе, или они могут способствовать выбору модели, помогая решить, какие признаки мы будем использовать.

Однопеременные графики

Наша цель — прогнозировать значение Energy Star Score (в наших данных переименовано в score ), так что имеет смысл начать с исследования распределения этой переменной. Гистограмма — простой, но эффективный способ визуализации распределения одиночной переменной, и её можно легко построить с помощью matplotlib .

import matplotlib.pyplot as plt # Histogram of the Energy Star Score plt.style.use('fivethirtyeight') plt.hist(data['score'].dropna(), bins = 100, edgecolor = 'k'); plt.xlabel('Score'); plt.ylabel('Number of Buildings'); plt.title('Energy Star Score Distribution');

Выглядит подозрительно! Балл Energy Star Score является процентилем, значит следует ожидать единообразного распределения, когда каждый балл присваивается одному и тому же количеству зданий. Однако высший и низший результаты получило непропорционально большое количество зданий (для Energy Star Score чем больше, тем лучше).

Если мы снова посмотрим на определение этого балла, то увидим, что он рассчитывается на основе «самостоятельно заполняемых владельцами зданий отчётов», что может объяснить избыток очень больших значений. Просить владельцев зданий сообщать о своём энергопотреблении, это как просить студентов сообщать о своих оценках на экзаменах. Так что это, пожалуй, не самый объективный критерий оценки энергоэффективности недвижимости.

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

Поиск взаимосвязей

Главная часть РАД — поиск взаимосвязей между признаками и нашей целью. Коррелирующие с ней переменные полезны для использования в модели, потому что их можно применять для прогнозирования. Один из способов изучения влияния категориальной переменной (которая принимает только ограниченный набор значений) на цель — это построить график плотности с помощью библиотеки Seaborn.

График плотности можно считать сглаженной гистограммой, потому что он показывает распределение одиночной переменной. Можно раскрасить отдельные классы на графике, чтобы посмотреть, как категориальная переменная меняет распределение. Этот код строит график плотности Energy Star Score, раскрашенный в зависимости от типа здания (для списка зданий с более чем 100 измерениями):

# Create a list of buildings with more than 100 measurements types = data.dropna(subset=['score']) types = types['Largest Property Use Type'].value_counts() types = list(types[types.values > 100].index) # Plot of distribution of scores for building categories figsize(12, 10) # Plot each building for b_type in types: # Select the building type subset = data[data['Largest Property Use Type'] == b_type] # Density plot of Energy Star Scores sns.kdeplot(subset['score'].dropna(), label = b_type, shade = False, alpha = 0.8); # label the plot plt.xlabel('Energy Star Score', size = 20); plt.ylabel('Density', size = 20); plt.title('Density Plot of Energy Star Scores by Building Type', size = 28);

Как видите, тип здания сильно влияет на количество баллов. Офисные здания обычно имеют более высокий балл, а отели более низкий. Значит нужно включить тип здания в модель, потому что этот признак влияет на нашу цель. В качестве категориальной переменной мы должны выполнить one-hot кодирование типа здания.

Аналогичный график можно использовать для оценки Energy Star Score по районам города:

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

Чтобы посчитать взаимосвязи между переменными, можно использовать коэффициент корреляции Пирсона. Это мера интенсивности и направления линейной зависимости между двумя переменными. Значение +1 означает идеально линейную положительную зависимость, а -1 означает идеально линейную отрицательную зависимость. Вот несколько примеров значений коэффициента корреляции Пирсона:

Хотя этот коэффициент не может отражать нелинейные зависимости, с него можно начать оценку взаимосвязей переменных. В Pandas можно легко вычислить корреляции между любыми колонками в кадре данных (dataframe):

# Find all correlations with the score and sort correlations_data = data.corr()['score'].sort_values()

Самые отрицательные корреляции с целью:

и самые положительные:

Есть несколько сильных отрицательных корреляций между признаками и целью, причём наибольшие из них относятся к разным категориям EUI (способы расчёта этих показателей слегка различаются). EUI (Energy Use Intensity, интенсивность использования энергии) — это количество энергии, потреблённой зданием, делённое на квадратный фут площади. Эта удельная величина используется для оценки энергоэффективности, и чем она меньше, тем лучше. Логика подсказывает, что эти корреляции оправданны: если EUI увеличивается, то Energy Star Score должен снижаться.

Двухпеременные графики

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

Этот график позволяет визуализировать коэффициент корреляции -0,7. По мере уменьшения EUI увеличивается Energy Star Score, эта взаимосвязь наблюдается у зданий разных типов.

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

# Extract the columns to plot plot_data = features[['score', 'Site EUI (kBtu/ft²)', 'Weather Normalized Source EUI (kBtu/ft²)', 'log_Total GHG Emissions (Metric Tons CO2e)']] # Replace the inf with nan plot_data = plot_data.replace() # Rename columns plot_data = plot_data.rename(columns = ) # Drop na values plot_data = plot_data.dropna() # Function to calculate correlation coefficient between two columns def corr_func(x, y, **kwargs): r = np.corrcoef(x, y)[0][1] ax = plt.gca() ax.annotate("r = ".format(r), xy=(.2, .8), xycoords=ax.transAxes, size = 20) # Create the pairgrid object grid = sns.PairGrid(data = plot_data, size = 3) # Upper is a scatter plot grid.map_upper(plt.scatter, color = 'red', alpha = 0.6) # Diagonal is a histogram grid.map_diag(plt.hist, color = 'red', edgecolor = 'black') # Bottom is correlation and density plot grid.map_lower(corr_func); grid.map_lower(sns.kdeplot, cmap = plt.cm.Reds) # Title for entire plot plt.suptitle('Pairs Plot of Energy Data', size = 36, y = 1.02); 

Чтобы увидеть взаимосвязи переменных, поищем пересечения рядов и колонок. Допустим, нужно посмотреть корреляцию Weather Norm EUI и score , тогда мы ищем ряд Weather Norm EUI и колонку score , на пересечении которых стоит коэффициент корреляции -0,67. Эти графики не только классно выглядят, но и помогают выбрать переменные для модели.

Конструирование и выбор признаков

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

  • Конструирование признаков: процесс извлечения или создания новых признаков из сырых данных. Чтобы использовать переменные в модели, возможно, их придётся преобразовывать, скажем, брать натуральный логарифм, или извлекать квадратный корень, или применять one-hot кодирование категориальных переменных. Конструирование признаков можно рассматривать как создание дополнительных признаков из сырых данных.
  • Выбор признаков: процесс выбора из данных самых релевантных признаков, в ходе которого мы удаляем часть признаков, чтобы помочь модели лучше обобщать новые данные ради получения более интерпретируемой модели. Выбор признаков можно рассматривать как удаление «лишнего», чтобы осталось только самое важное.

Мы сделаем следующее:

  • Применим к категориальным переменным (квартал и тип собственности) one-hot кодирование.
  • Добавим взятие натурального логарифма от всех числовых переменных.

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

Этот код выбирает числовые признаки, вычисляет их логарифмы, выбирает два категориальных признака, применяет к ним one-hot кодирование и объединяет оба множества в одно. Судя по описанию, предстоит куча работы, но в Pandas всё получается довольно просто!

# Copy the original data features = data.copy() # Select the numeric columns numeric_subset = data.select_dtypes('number') # Create columns with log of numeric columns for col in numeric_subset.columns: # Skip the Energy Star Score column if col == 'score': next else: numeric_subset['log_' + col] = np.log(numeric_subset[col]) # Select the categorical columns categorical_subset = data[['Borough', 'Largest Property Use Type']] # One hot encode categorical_subset = pd.get_dummies(categorical_subset) # Join the two dataframes using concat # Make sure to use axis = 1 to perform a column bind features = pd.concat([numeric_subset, categorical_subset], axis = 1)

Теперь у нас есть больше 11 000 наблюдений (зданий) со 110 колонками (признаками). Не все признаки будут полезны для прогнозирования Energy Star Score, поэтому займёмся выбором признаков и удалим часть переменных.

Выбор признаков

Многие из имеющихся 110 признаков избыточны, потому что сильно коррелируют друг с другом. К примеру, вот график EUI и Weather Normalized Site EUI, у которых коэффициент корреляции равен 0,997.

Признаки, которые сильно коррелируют друг с другом, называются коллинеарными. Удаление одной переменной в таких парах признаков часто помогает модели обобщать и быть более интерпретируемой. Обратите внимание, что речь идёт о корреляции одних признаков с другими, а не о корреляции с целью, что только помогло бы нашей модели!

Существует ряд методов вычисления коллинеарности признаков, и один из самых популярных — фактор увеличения дисперсии (variance inflation factor). Мы для поиска и удаления коллинеарных признаков воспользуемся коэффициентом В-корреляции (thebcorrelation coefficient). Отбросим одну пару признаков, если коэффициент корреляции между ними больше 0,6. Код приведён в блокноте (и в ответе на Stack Overflow).

Это значение выглядит произвольным, но на самом деле я пробовал разные пороги, и приведённый выше позволил создать наилучшую модель. Машинное обучение эмпирично, и часто приходится экспериментировать, чтобы найти лучшее решение. После выбора у нас осталось 64 признака и одна цель.

# Remove any columns with all na values features = features.dropna(axis=1, how = 'all') print(features.shape) (11319, 65)

Выбираем базовый уровень

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

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

В качестве метрики возьмём среднюю абсолютную ошибку (mae) в прогнозах. Для регрессий есть много других метрик, но мне нравится совет выбирать какую-то одну метрику и с её помощью оценивать модели. А среднюю абсолютную ошибку легко вычислить и интерпретировать.

Прежде чем вычислять базовый уровень, нужно разбить данные на обучающий и тестовый наборы:

  1. Обучающий набор признаков — то, что мы предоставляем нашей модели вместе с ответами в ходе обучения. Модель должна выучить соответствие признаков цели.
  2. Тестовый набор признаков используется для оценки обученной модели. Когда она обрабатывает тестовый набор, то не видит правильных ответов и должна прогнозировать, опираясь только на доступные признаки. Мы знаем ответы для тестовых данных и можем сравнить с ними результаты прогнозирования.
# Split into 70% training and 30% testing set X, X_test, y, y_test = train_test_split(features, targets, test_size = 0.3, random_state = 42)

Теперь вычислим показатель для исходного базового уровня:

# Function to calculate mean absolute error def mae(y_true, y_pred): return np.mean(abs(y_true - y_pred)) baseline_guess = np.median(y) print('The baseline guess is a score of %0.2f' % baseline_guess) print("Baseline Performance on the test set: MAE = %0.4f" % mae(y_test, baseline_guess))

The baseline guess is a score of 66.00
Baseline Performance on the test set: MAE = 24.5164

Средняя абсолютная ошибка на тестовом наборе составила около 25 пунктов. Поскольку мы оцениваем в диапазоне от 1 до 100, то ошибка составляет 25 % — довольно низкий барьер для модели!

Заключение

Вы этой статье мы прошли через три первых этапа решения задачи с помощью машинного обучения. После постановки задачи мы:

  1. Очистили и отформатировали сырые данные.
  2. Провели разведочный анализ для изучения имеющихся данных.
  3. Выработали набор признаков, которые будем использовать для наших моделей.

В следующей статье мы научимся с помощью Scikit-Learn оценивать модели машинного обучения, выбирать лучшую модель и выполнять её гиперпараметрическую настройку.

  • Блог компании NIX
  • Машинное обучение

Модель алгоритма и её выбор

Пусть дана обучающая выборка [math](X, Y)[/math] , где [math] X [/math] — множество признаков, описывающих объекты, а [math] Y [/math] — конечное множество меток.

Пусть задана функция [math] g: X \times \Theta \rightarrow Y [/math] , где [math] \Theta [/math] — множество дополнительных параметров (весов) функции.

Описанная выше функция [math] g [/math] для фиксированного значения весов [math] \theta \in \Theta [/math] называется решающим правилом.

Модель — совокупность всех решающих правил, которые получаются путем присваивания весам всех возможных допустимых значений.

Модель определяется множеством допустимых весов [math] \Theta [/math] и структурой решающего правила [math] g(x,\theta) [/math] .

Понятие гиперпараметров модели

Гиперпараметры модели — параметры, значения которых задается до начала обучения модели и не изменяется в процессе обучения. У модели может не быть гиперпараметров.

Параметры модели — параметры, которые изменяются и оптимизируются в процессе обучения модели и итоговые значения этих параметров являются результатом обучения модели.

Примерами гиперпараметров могут служить количество слоев нейронной сети, а также количество нейронов на каждом слое. Примерами параметров могут служить веса ребер нейронной сети.

Для нахождения оптимальных гиперпараметров модели могут применяться различные алгоритмы настройки гиперпараметров [на 28.01.19 не создан] .

Пример

В качестве примера модели приведем линейную регрессию.

Линейная регрессия задается следующей формулой:

[math] g(x, \theta) = \theta_0 + \theta_1x_1 + . + \theta_kx_k = \theta_0 + \sum_^k \theta_ix_i = \theta_0 + x^T\theta[/math] , где [math] x^T = (x_1, x_2, . x_k) [/math] — вектор признаков,

[math] \theta = (\theta_1, \theta_2, . \theta_k)[/math] — веса модели, настраиваемые в процессе обучения.

Гиперпараметром модели является число слагаемых в функции [math] g(x, \theta) [/math] .

Более подробный пример линейной регрессии можно посмотреть в статье переобучение.

Задача выбора модели

Пусть [math] A [/math] — модель алгоритма, характеризующаяся гиперпараметрами [math] \lambda = \<\lambda_1, . \lambda_m\>, \lambda_1 \in \Lambda_1, . \lambda_m \in \Lambda_m [/math] . Тогда с ней связано пространство гиперпараметров [math] \Lambda = \Lambda_1 \times . \times \Lambda_m [/math] .

За [math] A_<\lambda>[/math] обозначим алгоритм, то есть модель алгоритма, для которой задан вектор гиперпараметров [math] \lambda \in \Lambda [/math] .

Для выбора наилучшего алгоритма необходимо зафиксировать меру качества работы алгоритма. Назовем эту меру [math] Q(A_<\lambda>, D) [/math] .

Задачу выбора наилучшего алгоритма можно разбить на две подзадачи: подзадачу выбора лучшего алгоритма из портфолио и подзадачу настройки гиперпараметров.

Подзадача выбора лучшего алгоритма из портфолио
Подзадача оптимизации гиперпараметров

Подзадача оптимизации гиперпараметров заключается в подборе таких [math] \lambda^* \in \Lambda [/math] , при которых заданная модель алгоритма [math] A [/math] будет наиболее эффективна.

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

Методы выбора модели

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

Кросс-валидация

Основная статья: Кросс-валидация

Основная идея алгоритма кросс-валидации — разбить обучающую выборку на обучающую и тестовую. Таким образом, будет возможным эмулировать наличие тестовой выборки, не участвующей в обучении, но для которой известны правильные ответы.

Достоинства и недостатки кросс-валидации:

  1. Ошибка в процедуре кросс-валидации является достаточно точной оценкой ошибки на генеральной совокупности;
  2. Проведение кросс-валидации требует значительного времени на многократное повторное обучение алгоритмов и применимо лишь для «быстрых» алгоритмов машинного обучения;
  3. Кросс-валидация плохо применима в задачах кластерного анализа и прогнозирования временных рядов.
Мета-обучение

Основная статья: Мета-обучение

Целью мета-обучения является решение задачи выбора алгоритма из портфолио алгоритмов для решения поставленной задачи без непосредственного применения каждого из них. Решение этой задачи в рамках мета-обучения сводится к задаче обучения с учителем. Для этого используется заранее отобранное множество наборов данных [math] D [/math] . Для каждого набора данных [math] d \in D [/math] вычисляется вектор мета-признаков, которые описывают свойства этого набора данных. Ими могут быть: число категориальных или численных признаков объектов в [math] d [/math] , число возможных меток, размер [math] d [/math] и многие другие [1] . Каждый алгоритм запускается на всех наборах данных из [math] D [/math] . После этого вычисляется эмпирический риск, на основе которого формируются метки классов. Затем мета-классификатор обучается на полученных результатах. В качестве описания набора данных выступает вектор мета-признаков, а в качестве метки — алгоритм, оказавшийся самым эффективным с точки зрения заранее выбранной меры качества.

Достоинства и недостатки мета-обучения:

  1. Алгоритм, обучающийся большое время, запускается меньшее количество раз, что сокращает время работы;
  2. Точность алгоритма может быть ниже, чем при кросс-валидации.
Теория Вапника-Червоненкинса

Идея данной теории заключается в следующем: чем более «гибкой» является модель, тем хуже ее обобщающая способность. Данная идея базируется на том, что «гибкое» решающее правило способно настраиваться на малейшие шумы, содержащиеся в обучающей выборке.

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

По аналогии емкость обобщается на другие задачи машинного обучения.

Очевидно, что чем больше емкость, тем более «гибкой» является модель и, соответственно, тем хуже. Значит нужно добиваться минимально возможного количества ошибок на обучении при минимальной возможной емкости.

Существует формула Вапника, связывающая ошибку на обучении [math] P_(\theta) [/math] , емкость [math] h(\theta) [/math] и ошибку на генеральной совокупности [math] P_(\theta) [/math] :

[math] P_(\theta) \lt = P_(\theta) + \sqrt<\frac)> + 1) — \log<(\frac<\eta>)>>> [/math] , где [math] d [/math] — размерность пространства признаков.

Неравенство верно с вероятностью [math] 1 — \eta [/math] [math] \forall \theta \in \Theta [/math] .

Алгоритм выбора модели согласно теории Вапника-Червоненкиса: последовательно анализируя модели с увеличивающейся емкостью, необходимо выбирать модель с наименьшей верхней оценкой тестовой ошибки.

Достоинства теории Вапника-Червоненкиса:

  1. Серьезное теоретическое обоснование, связь с ошибкой на генеральной совокупности;
  2. Теория продолжает развиваться и в наши дни.

Недостатки теории Вапника-Червоненкиса:

  1. Оценки ошибки на генеральной совокупности сильно завышены;
  2. Для большинства моделей емкость не поддается оценке;
  3. Многие модели с бесконечной емкостью показывают хорошие результаты на практике.

Существующие системы автоматического выбора модели

Автоматизированный выбор модели в библиотеке auto-WEKA для Java

Библиотека используется для одновременного поиска оптимальной модели и оптимальных гиперпараметров модели для задач классификации и регрессии (начиная с версии 2.0).

Библиотека позволяет автоматически выбирать из 27 базовых алгоритмов, 10 мета-алгоритмов и 2 ансамблевых алгоритмов лучший, одновременно настраивая его гиперпараметры при помощи алгоритма SMAC. Решение достигается полным перебором: оптимизация гиперпараметров запускается на всех алгоритмах по очереди. Недостатком такого подхода является слишком большое время выбора модели.

Автоматизированный выбор модели в библиотеке Tree-base Pipeline Optimization Tool (TPOT) для Python.

Библиотека используется для одновременного поиска оптимальной модели и оптимальных гиперпараметров модели для задачи классификации.

Выбор модели осуществляется на основе конвейера, организованного в древовидной структуре. Каждая вершина дерева — один из четырех операторов конвейера (preprocessing, decomposition, feature selection, modeling). Каждый конвейер начинается с одной или нескольких копий входного набора данных, которые являются листьями дерева и которые подаются в операторы в соответствии со структурой конвейера. Данные модифицируются оператором в вершине и поступают на вход следующей вершины. В библиотеке используются генетические алгоритмы для нахождения лучших конвейеров.

После создания конвеера, оценивается его производительность и случайным образом изменяются части конвеера для поиска наибольшей эффективности. Время работы TPOT может варьироваться в зависимости от размера входных данных. При начальных настройках в 100 поколений с размером популяции 100, за время работы оценивается 10000 конфигураций конвеера. По времени это сравнимо с поиском по сетке для 10000 комбинаций гиперпараметров. Это 10000 конфигураций модели со скользящим контролем по 10 блокам, что означает, что около 100000 моделей создается и оценивается на обучающих данных в одном поиске по сетке. Поэтому, для некоторых наборов данных требуется всего несколько минут, чтобы найти высокопроизводительную модель для работы, а некоторым может потребоваться несколько дней.

После поиска конвейера его также можно экспортировать в файл Python.

Автоматизированный выбор модели в библиотеке auto-sklearn для Python

Библиотека используется для одновременного поиска оптимальной модели и оптимальных гиперпараметров модели для задачи классификации.

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

На рисунке 5 показаны общие компоненты Auto-sklearn. Он состоит из 15 алгоритмов классификации, 14 методов предварительной обработки и 4 методов предварительной обработки данных. Мы параметризовали каждый из них, что привело к пространству, состоящему из 110 гиперпараметров. Большинство из них являются условными гиперпараметрами, которые активны, только если выбран соответствующий компонент. Отметим, что SMAC может обрабатывать эту обусловленность изначально.

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

См. также

  • Настройка гиперпараметров [на 28.01.19 не создан]
  • Переобучение
  • Мета-обучение
  • Линейная регрессия

Примечания

Источники информации

  • machinelearning.ru — Задачи выбора модели
  • Wikipedia — Hyperparameter
  • What is the Difference Between a Parameter and a Hyperparameter?
  • Применение обучения с подкреплением для одновременного выбора модели алгоритма классификации и ее структурных параметров
  • Fast Automated Selection of Learning Algorithm And its Hyperparameters by Reinforcement Learning
  • Shalamov V., Efimova V., Muravyov S., and Filchenkov A. «Reinforcement-based Method for Simultaneous Clustering Algorithm Selection and its Hyperparameters Optimization.» Procedia Computer Science 136 (2018): 144-153.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *