Руководство по машинному обучению и анализу данных от А до Я.

Сообщите нам, если вас интересует разработка программного обеспечения для блокчейн и финтех, или просто скажите Привет в Pharos Production Inc.

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

Канал Pharos Production на YouTube

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

Классификатор радужки.

Краткий.

Мы будем использовать Iris Dataset из Scikit-Learn. Мы собираемся классифицировать каждый новый цветок ириса, определяя его 4 характеристики - измерения: ширину и длину лепестка и ширину и длину чашелистика. В результате нашей целевой классификации мы должны разделить этот цветок на 3 доступные группы - Setosa, Virginica и Versicolour.

Характеристики набора данных.

Здесь вы найдете полные характеристики набора данных. У нас есть 50 элементов в каждом подклассе с 4 атрибутами, определенными как действительные числа, и они указаны в см. И как мы уже говорили выше - 3 целевых класса.

Data Set Characteristics:
    :Number of Instances: 150 (50 in each of three classes)
    :Number of Attributes: 4 numeric, predictive attributes and the class
    :Attribute Information:
        - sepal length in cm
        - sepal width in cm
        - petal length in cm
        - petal width in cm
        - class:
                - Iris-Setosa
                - Iris-Versicolour
                - Iris-Virginica

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

Большой X связан с тем, что здесь используются математические соглашения: X - матрица, y - вектор. Кроме того, мы определяем случайное состояние для генератора псевдослучайных чисел, чтобы быть уверенным, что мы получаем одно и то же состояние при каждом запуске кода.

Keys of iris_dataset: 
dict_keys(['target', 'data', 'feature_names', 'target_names', 'DESCR'])

Target names: ['setosa' 'versicolor' 'virginica']

Feature names: 
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

Shape of data: (150, 4)

First 5 columns of data:
[[ 5.1  3.5  1.4  0.2]
 [ 4.9  3.   1.4  0.2]
 [ 4.7  3.2  1.3  0.2]
 [ 4.6  3.1  1.5  0.2]
 [ 5.   3.6  1.4  0.2]]

Shape of target: (150,)

Target:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]

X_train shape: (112, 4), y_train shape: (112,)
X_test shape: (38, 4), y_test shape: (38,)

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

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

Контролируемая модель.

Теперь давайте обучим простой классификатор. На этот раз мы будем использовать классификатор k-ближайших соседей . Это не лучший вариант, но он должен хорошо работать, когда у вас есть небольшое количество функций и элементов в наборе данных, которые четко отделимы друг от друга. Алгоритм поиска ближайшей точки в обучающей выборке. Затем он присваивает метку обучающей точки новой точке данных. Это может быть среднее значение N ближайших соседей, но пока это только один. Точность составляет 97%, очень хорошо!

k-Ближайшие соседи.

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

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

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

Давайте попробуем это на наборе данных синтетической кузницы из набора MGLearn. Результат - визуализация границ решения для 1, 3 и 9 соседей. Как вы можете видеть, один сосед создает границу, которая точно следует обучающим данным. Чем больше соседей, тем более гладкая граница принятия решений. Более гладкая граница соответствует более простой модели.

Давайте проверим, как точность зависит от количества соседей. Мы будем использовать набор реальных данных о раке груди из SciKit Learn. С одним ближайшим соседом прогноз на обучающей выборке идеален. Чем больше соседей, тем проще модель, а точность обучения падает. Точность теста с одним соседом низкая, что указывает на то, что использование одного ближайшего соседа приводит к слишком сложной модели. С другой стороны, с 10 соседями модель слишком проста, а производительность еще хуже. Наихудшая производительность находится в середине, где используется около шести соседей, и составляет около 88%, что приемлемо.

Регресс.

Существует также регрессионный вариант алгоритма k-NN. Давайте посмотрим, как он будет использовать обучающий набор для прогнозирования. При использовании нескольких ближайших соседей прогноз является средним или средним для соответствующих соседей. Метод оценки для регрессии возвращает оценку R² - коэффициент детерминации и дает оценку от 0 до 1. 1 - идеальный прогноз, а 0 - постоянная модель, которая прогнозирует среднее значение ответов обучающей выборки.

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

Заключение.

Классификатор k-NN имеет два важных параметра - количество соседей и то, как он измеряет расстояние между точками. На практике часто хорошо работает использование небольшого числа, например 3 или 5. По умолчанию используется евклидово расстояние, что тоже хорошо работает. Модель очень проста для понимания и дает разумную производительность без особых настроек для небольших обучающих наборов. На большом обучающем наборе модель может работать медленно. Кроме того, он плохо работает с наборами данных с большим количеством функций (›100) и плохо работает с разреженными наборами данных (большинство функций равны 0).

На этом пока все. Отдельное спасибо автору этой книги. Смело покупайте, это действительно круто. Весь исходный код доступен в репозитории Github.

Спасибо за чтение!