Эта статья является частью серии «Наука о данных с помощью Python». Другие истории из этой серии вы можете найти ниже:



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

Сегодня мы рассмотрим, как выполнять классификационный анализ с помощью Python.

Алгоритмы классификации

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

  • Логистическая регрессия. Логистическая регрессия — это простой, но мощный алгоритм классификации, который широко используется в науке о данных. Он используется для моделирования вероятности бинарного результата (например, да или нет) на основе одной или нескольких переменных-предикторов. Алгоритм создает логистическую кривую, которая отображает вероятность результата на входные переменные.
  • K-ближайших соседей (KNN): KNN – это алгоритм непараметрической классификации, который работает путем поиска k ближайших соседей для данного наблюдения в пространстве признаков. Затем класс нового наблюдения определяется большинством голосов его k-ближайших соседей.
  • Деревья решений. Деревья решений — это популярный алгоритм классификации, который рекурсивно разбивает пространство признаков на все более мелкие области. На каждом этапе алгоритм выбирает признак, который обеспечивает наибольшую информационную выгоду (т. е. больше всего снижает энтропию или нечистоту набора данных) и создает разделение на основе его значения. Процесс продолжается до тех пор, пока не будет выполнен критерий остановки.
  • Случайные леса. Случайные леса — это расширение деревьев решений, которые работают путем построения ансамбля множества деревьев и усреднения их прогнозов. Отдельные деревья строятся с использованием случайного подмножества признаков и случайного подмножества данных. Это помогает уменьшить переобучение и повысить эффективность обобщения модели.
  • Машины опорных векторов (SVM): SVM — это мощный алгоритм классификации, который работает, находя гиперплоскость, которая разделяет два класса в пространстве признаков с наибольшим запасом. Гиперплоскость выбирается так, чтобы максимально увеличить расстояние между ближайшими точками каждого класса.

Это лишь некоторые из многих алгоритмов классификации, доступных в науке о данных. Но это самые известные и важные.

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

Давайте сосредоточимся на логистической регрессии, самом простом алгоритме классификации.

Модель логистической регрессии — это тип обобщенной линейной модели, в которой используется логистическая функция (также известная как сигмовидная функция) для моделирования вероятности результата. Логистическая функция имеет S-образную кривую, которая колеблется от 0 до 1, и ее можно записать как:

где p(x) — вероятность исхода при заданных входных переменных x, z — линейная комбинация входных переменных и их коэффициентов, а exp() — экспоненциальная функция.

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

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

Построение моделей классификации в Python

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

Я предполагаю, что вы уже установили scikit Learn. В противном случае вы можете легко сделать это, используя pip install scikit-learn

После установки Scikit-learn вы можете импортировать необходимые модули и загрузить свои данные:

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

data = pd.read_csv('path/to/your/data.csv')

# split the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(data.drop('target', axis=1), data['target'], test_size=0.2, random_state=42)

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

Далее мы создаем экземпляр классификатора LogisticRegression и подгоняем его к обучающим данным:

lr = LogisticRegression()

# train the model using the training data
lr.fit(X_train, y_train)

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

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

y_pred = lr.predict(X_test)

y_pred может выглядеть следующим образом:

array([1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1])

Мы получаем только 0 и 1, потому что наша целевая переменная может принимать только эти значения.

Каждое значение в массиве соответствует прогнозируемому целевому значению для одного наблюдения в наборе тестов. Например, первое значение в массиве (1) соответствует прогнозируемому целевому значению для первого наблюдения в наборе тестов, второе значение в массиве (0) соответствует прогнозируемому целевому значению для второго наблюдения и так далее. .

Наконец, мы можем оценить производительность модели, используя различные показатели, такие как точность, достоверность, полнота и оценка F1:

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)

print("Accuracy:", accuracy)
print("Precision:", precision)
print("Recall:", recall)
print("F1 score:", f1)

Тонкая настройка классификации

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

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

Один из способов тонкой настройки модели классификации — выполнить поиск в сетке по ряду гиперпараметров и оценить производительность модели на проверочном наборе. Scikit-learn предоставляет удобный класс GridSearchCV для этой цели. Вот пример того, как использовать GridSearchCV для настройки гиперпараметров классификатора LogisticRegression:

from sklearn.model_selection import GridSearchCV

# define the hyperparameters to tune
hyperparameters = {'C': [0.1, 1, 10], 'penalty': ['l1', 'l2']}

# create an instance of the LogisticRegression classifier
lr = LogisticRegression()

# perform a grid search over the hyperparameters
grid_search = GridSearchCV(lr, hyperparameters, cv=5)
grid_search.fit(X_train, y_train)

# print the best hyperparameters
print("Best hyperparameters:", grid_search.best_params_)

В этом примере мы определяем сетку гиперпараметров для настройки (C и penalty) и создаем экземпляр классификатора LogisticRegression. Затем мы используем GridSearchCV для выполнения поиска в сетке по гиперпараметрам, используя стратегию 5-кратной перекрестной проверки (cv=5). Наконец, мы печатаем лучшие гиперпараметры, найденные поиском по сетке.

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

Scikit-learn предоставляет несколько методов выбора функций, таких как SelectKBest, SelectPercentile и RFE (рекурсивное исключение функций). Вот пример того, как использовать SelectKBest для выбора k лучших объектов в наборе данных:

from sklearn.feature_selection import SelectKBest, f_classif

# select the top k features using the f_classif score
selector = SelectKBest(f_classif, k=10)
selector.fit(X_train, y_train)

# transform the training and testing sets
X_train_new = selector.transform(X_train)
X_test_new = selector.transform(X_test)

Методы ансамбля:

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

Scikit-learn предоставляет несколько ансамблевых методов, таких как RandomForestClassifier, AdaBoostClassifier и GradientBoostingClassifier. Вот пример использования RandomForestClassifier для построения ансамбля деревьев решений:

from sklearn.ensemble import RandomForestClassifier

# create an instance of the RandomForestClassifier with 100 trees
rf = RandomForestClassifier(n_estimators=100)

rf.fit(X_train, y_train)

y_pred = rf.predict(X_test)

print("Accuracy:", accuracy_score(y_test, y_pred))

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

Scikit-learn не предоставляет встроенной реализации стекирования моделей, но его относительно легко реализовать с помощью класса StackingClassifier из библиотеки mlxtend. Вот пример того, как использовать StackingClassifier для построения составного ансамбля классификаторов логистической регрессии и дерева решений:

from sklearn.ensemble import StackingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from mlxtend.classifier import StackingClassifier

# create instances of the base classifiers
lr = LogisticRegression()
dt = DecisionTreeClassifier()

# create an instance of the StackingClassifier with logistic regression as meta-classifier
sc = StackingClassifier(classifiers=[lr, dt], meta_classifier=lr)

sc.fit(X_train, y_train)

y_pred = sc.predict(X_test)

print("Accuracy:", accuracy_score(y_test, y_pred))

Заключительное примечание

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

В следующей статье мы увидим конкретный случай применения. Не стесняйтесь следовать за мной, если вы не хотите пропустить это!

Чтобы ознакомиться с другими историями этой истории, нажмите ниже!



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

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

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