Рубрики
Без рубрики

Обзор методов классификации в Python с помощью Scikit-Learn

Автор оригинала: Dan Nelson.

Обзор методов классификации в Python с помощью Scikit-Learn

Вступление

Вы программист на Python, который хочет заняться машинным обучением? Отличное место для начала вашего путешествия-это знакомство с Scikit-Learn.

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

Что такое Scikit-Learn?

Scikit-Learn – это библиотека для Python, которая была впервые разработана Дэвидом Курнапо в 2007 году. Он содержит ряд полезных алгоритмов, которые можно легко реализовать и настроить для целей классификации и других задач машинного обучения.

Scikit-Learn использует SciPy в качестве основы, поэтому этот базовый стек библиотек должен быть установлен до того, как Scikit-Learn может быть использован.

Определение наших терминов

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

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

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

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

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

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

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

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

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

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

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

Различные типы классификаторов

Scikit-Learn обеспечивает легкий доступ к многочисленным различным алгоритмам классификации. К числу таких классификаторов относятся:

  • K-Ближайшие Соседи
  • Машины опорных Векторов
  • Классификаторы дерева решений / Случайные леса
  • Наивный Байес
  • Линейный дискриминантный анализ
  • Логистическая регрессия

Существует много литературы о том, как работают эти различные классификаторы, и краткие объяснения их можно найти на сайте Scikit-Learn .

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

K-Ближайшие Соседи

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

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

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

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

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

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

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

Линейный дискриминантный анализ

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

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

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

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

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

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

Логистическая регрессия выводит предсказания о точках тестовых данных в двоичной шкале, нулевой или единице. Если значение чего-либо равно 0,5 или выше, оно классифицируется как принадлежащее к классу 1, в то время как ниже 0,5, если оно классифицируется как принадлежащее к классу 0.

Каждая из функций также имеет метку только 0 или 1. Логистическая регрессия является линейным классификатором и поэтому используется, когда существует какая-то линейная связь между данными.

Примеры задач классификации

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

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

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

Реализация классификатора

Теперь, когда мы обсудили различные классификаторы, к которым предоставляет доступ Scikit-Learn, давайте посмотрим, как реализовать классификатор.

Первым шагом в реализации классификатора является импорт нужного вам классификатора в Python. Давайте рассмотрим оператор импорта для логистической регрессии:

from sklearn.linear_model import LogisticRegression

Вот инструкции импорта для других классификаторов, рассмотренных в этой статье:

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC

Scikit-Learn также имеет другие классификаторы, и их соответствующие страницы документации покажут, как их импортировать.

После этого необходимо создать экземпляр классификатора. Создание экземпляра – это процесс создания классификатора в вашей программе Python-для создания экземпляра классификатора/объекта.

Обычно это делается просто путем создания переменной и вызова функции, связанной с классификатором:

logreg_clf = LogisticRegression()

Теперь классификатор должен быть обучен. Для этого классификатор должен соответствовать обучающим данным.

Обучающие функции и обучающие метки передаются в классификатор с помощью команды fit :

logreg_clf.fit(features, labels)

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

Это легко сделать, вызвав команду predict в классификаторе и предоставив ему параметры, необходимые для выполнения прогнозов, которые являются функциями в вашем тестовом наборе данных:

logreg_clf.predict(test_features)

Эти шаги: создание экземпляра, подгонка/обучение и прогнозирование-это основной рабочий процесс для классификаторов в Scikit-Learn.

Однако обработка классификаторов-это только одна часть выполнения классификации с помощью Scikit-Learn. Другая половина классификации в Scikit-Learn-это обработка данных.

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

Конвейер машинного обучения

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

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

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

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

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

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

Реализация Классификации Образцов

# Begin by importing all necessary libraries
import pandas as pd
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC

Поскольку набор данных iris настолько распространен, Scikit-Learn фактически уже имеет его, доступный для загрузки с помощью следующей команды:

sklearn.datasets.load_iris

Тем не менее, мы будем загружать CSV файл здесь, так что вы получите представление о том, как загружать и предварительно обрабатывать данные. Вы можете скачать csv-файл здесь .

Просто поместите файл данных в тот же каталог, что и ваш файл Python. Библиотека Pandas имеет простой способ загрузки данных, read_csv() :

data = pd.read_csv('iris.csv')
    
# It is a good idea to check and make sure the data is loaded as expected.
    
print(data.head(5))

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

Поскольку это бесполезно, мы можем удалить его из набора данных с помощью функции drop() :

data.drop('Id', axis=1, inplace=True)

Теперь нам нужно определить объекты и метки. Мы можем легко сделать это с пандами, разрезав таблицу данных и выбрав определенные строки/столбцы с помощью iloc() :

# Pandas ".iloc" expects row_indexer, column_indexer  
X = data.iloc[:,:-1].values
# Now let's tell the dataframe which column we want for the target/labels.  
y = data['Species']

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

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

# Alternate way of selecting columns:
X = data.iloc['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm']

Теперь, когда у нас есть нужные функции и метки, мы можем разделить данные на обучающие и тестовые наборы с помощью удобной функции sklearn train_test_split() :

# Test size specifies how much of the data you want to set aside for the testing set. 
# Random_state parameter is just a random seed we can use.
# You can use it if you'd like to reproduce these specific results.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=27)

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

print(X_train)  
print(y_train)

Теперь мы можем создавать экземпляры моделей. Давайте попробуем использовать два классификатора: классификатор опорных векторов и классификатор K-ближайших соседей:

SVC_model = svm.SVC()
# KNN model requires you to specify n_neighbors,
# the number of points the classifier will look at to determine what class a new point belongs to
KNN_model = KNeighborsClassifier(n_neighbors=5)

Теперь давайте подберем классификаторы:

SVC_model.fit(X_train, y_train)
KNN_model.fit(X_train, y_train)

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

SVC_prediction = SVC_model.predict(X_test)
KNN_prediction = KNN_model.predict(X_test)

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

В Scikit-Learn вы просто передаете предсказания против основных меток истины, которые были сохранены в ваших тестовых метках:

# Accuracy score is the simplest way to evaluate
print(accuracy_score(SVC_prediction, y_test))
print(accuracy_score(KNN_prediction, y_test))
# But Confusion Matrix and Classification Report give more details about performance
print(confusion_matrix(SVC_prediction, y_test))
print(classification_report(KNN_prediction, y_test))

Для справки, вот результат, который мы получили по метрикам:

SVC accuracy: 0.9333333333333333
KNN accuracy: 0.9666666666666667

На первый взгляд кажется, что KNN работает лучше. Вот матрица путаницы для SVC:

[[ 7  0  0]
 [ 0 10  1]
 [ 0  1 11]]

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

Наконец, вот выходные данные для отчета о классификации для KNN:

precision    recall  f1-score   support
    
Iris-setosa       1.00      1.00      1.00         7
Iris-versicolor       0.91      0.91      0.91        11
Iris-virginica       0.92      0.92      0.92        12
    
micro avg       0.93      0.93      0.93        30
macro avg       0.94      0.94      0.94        30
weighted avg       0.93      0.93      0.93        30

Оценка классификатора

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

Точность Классификации

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

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

Логарифмические Потери

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

Значение для предсказаний колеблется от 1 до 0, причем 1 является полностью уверенным, а 0-нет уверенности. Потеря или общее отсутствие уверенности возвращается в виде отрицательного числа с 0, представляющего идеальный классификатор, поэтому меньшие значения лучше.

Площадь Под Кривой ROC (AUC)

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

А 1.0, вся область, попадающая под кривую, представляет собой идеальный классификатор. Это означает, что AUC 0,5 в основном так же хорош, как и случайное угадывание. Кривая ROC рассчитывается с учетом чувствительности (истинная положительная скорость/отзыв) и специфичности (истинная отрицательная скорость). Вы можете прочитать больше об этих расчетах в этой статье ROC curve .

Матрица путаницы

Матрица путаницы-это таблица или диаграмма, представляющая точность модели по отношению к двум или более классам. Предсказания модели будут располагаться на оси X, а результаты/точность-на оси y.

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

Классификационный отчет

Отчет о классификации-это встроенная метрика Scikit-Learn, созданная специально для задач классификации. Использование отчета о классификации может дать вам быстрое представление о том, как работает ваша модель. Напомним, что количество примеров вашей модели, помеченной как класс А (некоторый данный класс), сравнивается с общим количеством примеров класса А, и это представлено в отчете.

Отчет также возвращает прогноз и f1-балл. Точность-это процент примеров, которые ваша модель обозначила как класс А, который на самом деле принадлежал классу А (истинные положительные результаты против ложных положительных результатов), а f1-оценка-это среднее значение точности и отзыва.

Вывод

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

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