Как легко построить границу принятия решения для любого алгоритма классификации

Определение границы принятия решения

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

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

Создайте фиктивный набор данных

Мы создадим фиктивный набор данных с scikit-learn из 200 строк, 2 информативных независимых переменных и 1 цель из двух классов.

from sklearn.datasets import make_classification 
X, y = make_classification(n_samples=200, n_features=2, n_informative=2, n_redundant=0, n_classes=2, random_state=1)

Создайте границу принятия решения для каждого классификатора

Мы сравним 6 алгоритмов классификации, таких как:

Будем работать с библиотекой Mlxtend. Для простоты мы решили оставить параметры по умолчанию для каждого алгоритма.

from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.naive_bayes import GaussianNB 
from sklearn.neural_network import MLPClassifier
# Initializing Classifiers
clf1 = LogisticRegression()
clf2 = DecisionTreeClassifier()
clf3 = RandomForestClassifier()
clf4 = SVC(gamma='auto')
clf5 = GaussianNB()
clf6 = MLPClassifier()
import matplotlib.pyplot as plt
from mlxtend.plotting import plot_decision_regions
import matplotlib.gridspec as gridspec
%matplotlib inline
gs = gridspec.GridSpec(3, 2)
fig = plt.figure(figsize=(14,10))
labels = ['Logistic Regression', 'Decision Tree', 'Random Forest', 'SVM', 'Naive Bayes', 'Neural Network']
for clf, lab, grd in zip([clf1, clf2, clf3, clf4, clf5, clf6],
                         labels,
                         [(0,0), (0,1), (1,0), (1,1), (2,0), (2,1)]):
clf.fit(X, y)
    ax = plt.subplot(gs[grd[0], grd[1]])
    fig = plot_decision_regions(X=X, y=y, clf=clf, legend=2)
    plt.title(lab)
plt.show()

Обсуждение

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



Первоначально опубликовано на https://predictivehacks.com.