Классификация относится к контролируемому обучению. Он определяет класс, к которому принадлежат элементы данных, и лучше всего используется, когда выходные данные имеют конечные и дискретные значения. В этой статье я собираюсь сравнить некоторые популярные модели классификации, такие как CART, Perceptron, Logistic Regression, Neural Networks и Random Forest.

Набор данных

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

  • Сезон, в котором проводился анализ
  • Возраст
  • Детские болезни
  • Несчастный случай или серьезная травма
  • Хирургическое вмешательство
  • Высокая температура за последний год
  • Потребление алкоголя
  • Привычка к курению
  • Количество часов сидения в день

Использованный набор данных можно найти здесь.

Перед загрузкой данных нам нужно будет импортировать эти библиотеки:

import pandas as pd
import numpy as np
from sklearn import preprocessing 
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

После этого мы можем прочитать данные, запустив:

path= '<path-to-file>'
data = pd.read_csv(path)

Предварительная обработка

В реальном мире вам придется почти все время предварительно обрабатывать и нормализовать данные. Однако наш набор данных уже нормализован (с использованием Label Encoding). Например, сезоны - зима, весна, лето и осень - представлены как -1, -0,33, 0,33 и 1. Единственная часть, которую необходимо предварительно обработать, - это последний столбец, то есть результат. «N» необходимо преобразовать в 1, а «O» - в 0. Это можно сделать, выполнив следующую команду:

data.Output.replace(('N', 'O'), (1, 0), inplace=True)

Затем нам нужно инициализировать оси X и Y. Столбец «output» будет нашей осью Y, а остальные функции будут составлять ось X. После этого данные будут разделены на обучение и тестирование. Наиболее распространенное соотношение - 70:30. Здесь X_train и Y_train будут содержать 70% набора данных, а X_test и Y_test будут содержать оставшиеся 30%.

Y = data['Output']
X = data.iloc[:,:-1]
X_train, X_test, Y_train, Y_test = train_test_split(X, Y,
test_size=30)

Анализ различных моделей

Импортируйте эти библиотеки:

from sklearn.linear_model import Perceptron
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier

Перцептрон

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

ppn = Perceptron(max_iter=100, eta0=0.5)
ppn.fit(X_train, Y_train)
y_pred = ppn.predict(X_test)
print(accuracy_score(Y_test, y_pred))
accuracy=accuracy_score(Y_test,y_pred)
print('Accuracy: %.2f'%(accuracy*100))

Здесь max_iter относится к максимальному количеству проходов / итераций по обучающим данным, а eta0 относится к константе, на которую умножаются обновления. Точность этой модели составила 83,33%.

Примечание. После применения регуляризации L2 и эластичной сети результат остался прежним, тогда как при регуляризации L1 точность снизилась до 73,33. Вы можете убедиться в этом сами, добавив еще один параметр penalty='l1/l2/elasticnet' в первую строку кода.

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

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

lg_reg = LogisticRegression()
lg_reg.fit(X_train, Y_train)
y_pred = lg_reg.predict(X_test)
accuracy=accuracy_score(Y_test,y_pred)
print('Accuracy: %.2f'%(accuracy*100))

Нам не нужно использовать какие-либо дополнительные параметры для этой модели. Первые 2 строки кода вызовут функцию логистической регрессии и обучат данные. Следующая строка предсказывает вывод X_test. Точность составила 86,67%.

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

КОРЗИНА-Дерево решений

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

classifier = DecisionTreeClassifier()
classifier.fit(X_train, Y_train)
y_pred = classifier.predict(X_test)
classifier = DecisionTreeClassifier(max_leaf_nodes=60)
classifier.fit(X_train, Y_train)
y_pred = classifier.predict(X_test)
accuracy=accuracy_score(Y_test,y_pred)
print('Accuracy: %.2f'%(accuracy*100))

Здесь max_leaf_nodes относится к выращиванию дерева по принципу «лучший в первую очередь». Лучшие узлы определяются как относительное уменьшение примесей. Число 60 может быть любым или оставить None. Точность этой модели составила 76,67%.

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

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

classifier= RandomForestClassifier(n_estimators=100, criterion= 'gini') 
classifier.fit(X_train,Y_train)
y_pred= classifier.predict(X_test)

accuracy=accuracy_score(Y_test,y_pred)
print('Accuracy: %.2f'%(accuracy*100))

n_estimators относится к количеству деревьев в лесу, criterion относится к функции для измерения качества разделения. Это может быть либо индекс Джини, либо энтропия (в данном случае оба дают одинаковую точность). Точность этой модели составила 80%.

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

Для создания нейронной сети мы будем использовать бэкэнд TensorFlow. Для этого нам потребуются следующие библиотеки:

from keras.models import Sequential
from keras.layers import Dense
from keras.utils import to_categorical

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

model= Sequential()
model.add(Dense(9, input_dim=9, activation='relu')) 
model.add(Dense(7,activation='relu'))
model.add(Dense(2,activation='softmax')) 
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
y_test_cat=to_categorical(Y_test)
y_train_cat=to_categorical(Y_train)
model.fit(X_train, y_train_cat,epochs=100,batch_size=10)

Здесь число 9 относится к количеству характеристик набора данных, число 7 относится к количеству нейронов, число 2 относится к возможным выходам набора данных, а epochs относится к количеству раз, когда все обучение векторы используются один раз для обновления весов.

_,accuracy=model.evaluate(X_test,y_test_cat)
print('Accuracy: %.2f'%(accuracy*100))

Точность этой модели составила 86,67%.

Вывод

После обучения и тестирования набора данных с помощью пяти различных моделей классификации было замечено, что линейная регрессия и нейронная сеть имеют самую высокую точность (86,67%), за ней следуют Perceptron (83,33%), Random Forest (80%) и CART Decision Tree (76,67%). )