Классификация относится к контролируемому обучению. Он определяет класс, к которому принадлежат элементы данных, и лучше всего используется, когда выходные данные имеют конечные и дискретные значения. В этой статье я собираюсь сравнить некоторые популярные модели классификации, такие как 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%). )