Вступление
Классификация - это обширная область статистики и машинного обучения. Как правило, классификацию можно разделить на две области:
-
Бинарная классификация , в которой мы хотим сгруппировать результат в одну из двух групп.
-
Классификация по нескольким классам , где мы хотим сгруппировать результат в одну из нескольких (более двух) групп.
В этом посте основное внимание будет уделено использованию различных алгоритмов классификации в обеих этих областях, меньше внимания будет уделяться теории, лежащей в основе них.
Мы можем использовать библиотеки в Python, такие как scikit-learn для моделей машинного обучения и Pandas для импорта данных в виде фреймов данных.
Их можно легко установить и импортировать в Python с помощью pip
:
$ python3 -m pip install sklearn
$ python3 -m pip install pandas
import sklearn as sk
import pandas as pd
Бинарная классификация
Для двоичной классификации нас интересует классификация данных в одну из двух двоичных групп - они обычно представлены в наших данных как 0 и 1.
Мы рассмотрим данные по ишемической болезни сердца (ИБС) в Южной Африке. Цель состоит в том, чтобы использовать различные переменные, такие как употребление табака , семейный анамнез , уровень холестерина ЛПН , употребление алкоголя , ожирение и многое другое.
Полное описание этого набора данных доступно в разделе «Данные» на веб-сайте Elements of Statistical Learning.
Приведенный ниже код считывает данные во фрейм данных Pandas, а затем
разделяет фрейм данных на y
вектор ответа и X
матрицу независимых
переменных:
import pandas as pd
import os
os.chdir('/Users/stevenhurwitt/Documents/Blog/Classification')
heart = pd.read_csv('SAHeart.csv', sep=',', header=0)
heart.head()
y = heart.iloc[:,9]
X = heart.iloc[:,:9]
При запуске этого кода просто не забудьте изменить путь к файловой системе в строке 4 в соответствии с вашими настройками.
sbp табак ldl ожирение фамхист наберите \"А ожирение алкоголь возраст chd
0 160 12.00 5,73 23.11 1 49 25.30 97,20 52 1 1 144 0,01 4,41 28,61 0 55 28,87 2,06 63 1 2 118 0,08 3,48 32,28 1 52 29,14 3,81 46 0 3 170 7,50 6,41 38,03 1 51 31,99 24,26 58 1 4 134 13,60 3,50 27,78 1 60 25,99 57,34 49 1
Логистическая регрессия
Логистическая регрессия - это тип обобщенной линейной модели (GLM), которая использует логистическую функцию для моделирования двоичной переменной на основе любых независимых переменных.
Чтобы соответствовать бинарной логистической регрессии с помощью
sklearn
, мы используем модуль
LogisticRegression
multi_class
установленным на «ovr» и подходящим для X
и y
.
Затем мы можем использовать predict
для прогнозирования вероятностей
новых данных, а также score
для получения средней точности прогноза:
import sklearn as sk
from sklearn.linear_model import LogisticRegression
import pandas as pd
import os
os.chdir('/Users/stevenhurwitt/Documents/Blog/Classification')
heart = pd.read_csv('SAHeart.csv', sep=',',header=0)
heart.head()
y = heart.iloc[:,9]
X = heart.iloc[:,:9]
LR = LogisticRegression(random_state=0, solver='lbfgs', multi_class='ovr').fit(X, y)
LR.predict(X.iloc[460:,:])
round(LR.score(X,y), 4)
array([1, 1])
Машины опорных векторов
Машины опорных векторов (SVM) представляют собой более гибкий тип алгоритмов классификации - они могут выполнять линейную классификацию, но могут использовать другие нелинейные базисные функции . В следующем примере используется линейный классификатор для соответствия гиперплоскости, разделяющей данные на два класса:
import sklearn as sk
from sklearn import svm
import pandas as pd
import os
os.chdir('/Users/stevenhurwitt/Documents/Blog/Classification')
heart = pd.read_csv('SAHeart.csv', sep=',',header=0)
y = heart.iloc[:,9]
X = heart.iloc[:,:9]
SVM = svm.LinearSVC()
SVM.fit(X, y)
SVM.predict(X.iloc[460:,:])
round(SVM.score(X,y), 4)
array([0, 1])
Случайные леса
-
это метод ансамблевого обучения, который подбирает несколько деревьев решений по подмножествам данных и усредняет результаты. Мы снова можем подогнать их с помощью
sklearn
и использовать их для прогнозирования результатов, а также для получения средней точности прогноза:import sklearn as sk from sklearn.ensemble import RandomForestClassifier
RF = RandomForestClassifier(n_estimators=100, max_depth=2, random_state=0) RF.fit(X, y) RF.predict(X.iloc[460:,:]) round(RF.score(X,y), 4)
0.7338
Нейронные сети
Нейронные сети - это алгоритм машинного обучения, который включает подгонку множества скрытых слоев, используемых для представления нейронов, связанных с функциями синаптической активации. По сути, они используют очень упрощенную модель мозга для моделирования и прогнозирования данных.
Мы используем sklearn
для обеспечения согласованности в этой
должности, однако библиотеки , такие как
Tensorflow и Keras
более подходит для установки и настройки нейронных сетей, из которых
Есть несколько сортов , используемых для различных целей:
import sklearn as sk
from sklearn.neural_network import MLPClassifier
NN = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)
NN.fit(X, y)
NN.predict(X.iloc[460:,:])
round(NN.score(X,y), 4)
0.6537
Мультиклассовая классификация
Хотя сама по себе двоичная классификация невероятно полезна, бывают случаи, когда нам нужно моделировать и прогнозировать данные, которые имеют более двух классов. Многие из тех же алгоритмов можно использовать с небольшими изменениями.
Кроме того, данные обычно разделяют на обучающие и тестовые наборы. Это означает, что мы используем определенную часть данных для соответствия модели (обучающий набор) и сохраняем оставшуюся часть для оценки точности прогноза подобранной модели (тестового набора).
Официального правила, которому нужно следовать при выборе пропорции разделения, не существует, хотя в большинстве случаев вы хотите, чтобы около 70% было выделено для обучающего набора и около 30% - для набора тестов.
Чтобы изучить как мультиклассовые классификации, так и данные обучения / тестирования, мы рассмотрим другой набор данных с веб-сайта Elements of Statistical Learning . Эти данные используются для определения того, какой из одиннадцати гласных звуков был произнесен:
import pandas as pd
vowel_train = pd.read_csv('vowel.train.csv', sep=',', header=0)
vowel_test = pd.read_csv('vowel.test.csv', sep=',', header=0)
vowel_train.head()
y_tr = vowel_train.iloc[:,0]
X_tr = vowel_train.iloc[:,1:]
y_test = vowel_test.iloc[:,0]
X_test = vowel_test.iloc[:,1:]
y х.1 х.2 х.3 х.4 х.5 x.6 x.7 x.8 х.9 х.10
0 1 -3,639 0,418 -0,670 1,779 -0,168 1,627 -0,388 0,529 -0,874 -0,814 1 2 -3,327 0,496 -0,694 1,365 -0,265 1,933 -0,363 0,510 -0,621 -0,488 2 3 -2,120 0,894 -1,576 0,147 -0,707 1,559 -0,579 0,676 -0,809 -0,049 3 4 -2,287 1,809 -1,498 1.012 -1,053 1.060 -0,567 0,235 -0,091 -0,795 4 5 -2,598 1,938 -0,846 1.062 -1,633 0,764 0,394 -0,150 0,277 -0,396
Теперь мы подбираем модели и тестируем их, как это обычно делается в статистике / машинном обучении: обучая их на обучающем наборе и оценивая их на тестовом наборе.
Кроме того, поскольку это мультиклассовая классификация, некоторые аргументы должны быть изменены в каждом алгоритме:
import pandas as pd
import sklearn as sk
from sklearn.linear_model import LogisticRegression
from sklearn import svm
from sklearn.ensemble import RandomForestClassifier
from sklearn.neural_network import MLPClassifier
vowel_train = pd.read_csv('vowel.train.csv', sep=',',header=0)
vowel_test = pd.read_csv('vowel.test.csv', sep=',',header=0)
y_tr = vowel_train.iloc[:,0]
X_tr = vowel_train.iloc[:,1:]
y_test = vowel_test.iloc[:,0]
X_test = vowel_test.iloc[:,1:]
LR = LogisticRegression(random_state=0, solver='lbfgs', multi_class='multinomial').fit(X_tr, y_tr)
LR.predict(X_test)
round(LR.score(X_test,y_test), 4)
SVM = svm.SVC(decision_function_shape="ovo").fit(X_tr, y_tr)
SVM.predict(X_test)
round(SVM.score(X_test, y_test), 4)
RF = RandomForestClassifier(n_estimators=1000, max_depth=10, random_state=0).fit(X_tr, y_tr)
RF.predict(X_test)
round(RF.score(X_test, y_test), 4)
NN = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(150, 10), random_state=1).fit(X_tr, y_tr)
NN.predict(X_test)
round(NN.score(X_test, y_test), 4)
0.5455
Хотя реализация этих моделей была довольно наивной (на практике существует множество параметров, которые можно и нужно варьировать для каждой модели), мы все же можем сравнить точность прогнозов по моделям. Это скажет нам, какой из них наиболее точен для этого конкретного набора данных для обучения и тестирования:
Модель Прогнозная точность Логистическая регрессия 46,1% Машина опорных векторов 64,07% Случайный лес 57,58% Нейронная сеть 54,55%
Это показывает нам, что для данных гласных наиболее точной была SVM, использующая радиальную базисную функцию по умолчанию.
Заключение
Подводя итог этому посту, мы начали с изучения простейшей формы классификации: бинарной. Это помогло нам смоделировать данные, в которых наш ответ мог принимать одно из двух состояний.
Затем мы перешли к мультиклассовой классификации, когда переменная ответа может принимать любое количество состояний.
Мы также увидели, как подбирать и оценивать модели с обучающими и тестовыми наборами. Кроме того, мы могли бы изучить дополнительные способы уточнения подбора моделей среди различных алгоритмов.