Предсказание классификации с помощью scikit-learn

машинное обучение искусственный интеллект алгоритм scikit-learn

Эта статья является второй в серии статей scikit-learn, в ней объясняются знания о прогнозировании классификации и приводятся примеры кода для прогнозирования классификации с помощью scikit-learn.настоятельно рекомендуетсяЧитатели читают предыдущую статью, прежде чем читать эту:«Линейный регрессионный анализ с помощью scikit-learn»

Введение в задачи классификации

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

  • Прогнозирование того, заболеет ли кто-то раком
  • Определите, какой буквой или цифрой является содержимое изображения.

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

Мультикласс

Многоклассовые проблемы очень распространены, например, распознавание написанного от руки числа (от 0 до 9) и анализ национальности человека.

Некоторые алгоритмы могут изначально обрабатывать задачи множественной классификации, такие как случайный лес и наивный байесовский классификатор. Другие алгоритмы могут иметь дело только с задачами бинарной классификации, такими как машины опорных векторов (Support Vector Machine) или линейные классификаторы.

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

Наиболее распространенными методами разборки являются следующие два:

  • Пара остальных (One-versus-Rest, сокращенно OvR или One-versus-all, сокращенно OvA)
  • Один против одного (сокращенно OvO)

Рассмотрите наличиеC_{1},C_{2},…,C_{N}Всего имеется N проблем классификации. Первый метод требует N классификаторов, второй метод требуетN * (N-1)/2классификатор.

Возьмите цифровое распознавание в качестве примера. Для первого метода, который требует 10 классификаторов, было подтверждено, является ли конкретным вариантом использования число 0, 1, 2, ..., 9. Затем мы выберем наиболее вероятный прогноз в качестве результата.

Всего для второго метода нам понадобятся следующие 45 классификаторов:

  • 0 vs. 1
  • 0 vs. 2
  • 1 vs. 0
  • 1 vs. 2
  • 9 vs. 7
  • 9 vs. 8

Сравнение этих двух методов демонтажа показано на следующем рисунке:

Изображение выше взято из третьей главы книги Чжоу Чжихуа «Машинное обучение».

Многоуровневая классификация

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

Описание эксперимента

В этой статье мы будем прогнозировать возникновение рака молочной железы на основе набора реальных данных.

Домашнюю страницу данных можно найти здесь:Breast Cancer Wisconsin Original Data Set

Описание данных можно найти здесь:breast-cancer-wisconsin.names

Файлы данных можно получить здесь:breast-cancer-wisconsin.csv

Примечание:sklearn_tutorialЭтот файл данных также включен в исходный код проекта.

Вот первые 20 столбцов данных:

A B C D E F G H I J K
1000025 5 1 1 1 2 1 3 1 1 2
1002945 5 4 4 5 7 10 3 2 1 2
1015425 3 1 1 1 2 2 3 1 1 2
1016277 6 8 8 1 3 4 3 7 1 2
1017023 4 1 1 3 2 1 3 1 1 2
1017122 8 10 10 8 7 10 9 7 1 4
1018099 1 1 1 1 2 10 3 1 1 2
1018561 2 1 2 1 2 1 3 1 1 2
1033078 2 1 1 1 2 1 1 1 5 2
1033078 4 2 1 1 2 1 2 1 1 2
1035283 1 1 1 1 1 1 3 1 1 2
1036172 2 1 1 1 2 1 2 1 1 2
1041801 5 3 3 3 2 3 4 4 1 4
1043999 1 1 1 1 2 3 3 1 1 2
1044572 8 7 5 10 7 9 5 5 4 4
1047630 7 4 6 4 6 1 4 3 1 4
1048672 4 1 1 1 2 1 2 1 1 2
1049815 4 1 1 1 2 1 3 1 1 2
1050670 10 7 7 6 4 10 4 1 2 4
1050718 6 1 1 1 2 1 3 1 1 2
                   

Описание каждого столбца выглядит следующим образом:

Список инструкция Численная величина
A Sample code number Number
B Clump Thickness 1 - 10
C Uniformity of Cell Size 1 - 10
D Uniformity of Cell Shape 1 - 10
E Marginal Adhesion 1 - 10
F Single Epithelial Cell Size 1 - 10
G Bare Nuclei 1 - 10
H Bland Chromatin 1 - 10
I Normal Nucleoli 1 - 10
J Mitoses 1 - 10
K Class 2: доброкачественные, 4: злокачественные

Здесь мы хотим предсказать данные в столбце K. Он имеет два возможных значения:

  • 2 для доброкачественных опухолей
  • 4 для злокачественной опухоли

Так что на самом деле это проблема бинарной классификации: есть только два случая, положительный и отрицательный.

лабораторная среда

Код в этой статье тестируется в следующей среде:

  • Apple OS X 10.13
  • Python 3.6.3
  • scikit-learn 0.19.1
  • matplotlib 2.1.1
  • numpy 1.13.3
  • graphviz 0.8.3

Исходный код и тестовые данные для этой статьи можно найти здесь:sklearn_tutorial

Экспериментальные данные

Данные эксперимента представляют собой файл csv, поэтому, очевидно, мы можем прочитать данные через интерфейс pandas. Данные содержат некоторые пропущенные значения, и нам также нужно иметь дело с этими недопустимыми значениями. Вот код для получения данных:

# lession2_classification.py

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

from sklearn.preprocessing import Imputer

def prepare_data():
    input_data = pd.read_csv("./data/breast-cancer-wisconsin.csv",
        names=['id', 'clump_thickness', 'cell_size', 'cell_shape',
            'marginal_adhesion', 'single_cell_size', 'bare_nuclei',
            'bland_chromatin', 'normal_nucleoli', 'mitoses', 'class'])
    input_data = input_data.apply(pd.to_numeric, errors='coerce')

    imputer = Imputer(strategy="mean")
    X = imputer.fit_transform(input_data)
    return pd.DataFrame(X, columns=input_data.columns)

В этом коде мы передаемread_csvФункция читает CSV-файл, указывая имена столбцов для каждого столбца. После этого проходимto_numericФункция преобразует данные в числовой тип, устанавливая недопустимое значение вNaN. оto_numericПодробное описание функции можно найти в официальной документации:pandas.to_numeric.

После этого используемImputerНедопустимые значения заполнялись средним значением.

После чтения данных нам нужно разделить данные на обучающий набор и тестовый набор. Здесь мы непосредственно используем введенное ранееtrain_test_splitФункция может быть:

# lession2_classification.py

from sklearn.model_selection import train_test_split

def data_split(input_data):
    target = input_data['class'].copy()
    return input_data.drop(['class'], axis=1), target
    
if __name__ == '__main__':
    input_data = prepare_data()

    train_set, test_set = train_test_split(input_data,
        test_size=0.1, random_state=59)
    train_data, train_value = data_split(train_set)
    test_data, test_value = data_split(test_set)

Здесь мы также определяемdata_splitФункции используются для отделения результата, который необходимо предсказать, от других данных. Окончательные данные, которые мы получаем:

  • train_data: данные тренировочного набора
  • train_value: результат тренировочного набора
  • test_data: данные тестового набора
  • test_value: результат набора тестов

Позже мы пройдемtrain_dataиtrain_valueобучить алгоритм, а затем поtest_dataпрогнозировать результат иtest_valueМера результатов, полученных в результате сравнения.

Если вы не понимаете приведенный здесь код, вернитесь и прочитайте предыдущую статью:«Линейный регрессионный анализ с помощью scikit-learn»

показатели эффективности

Когда мы объясняли линейную регрессию в предыдущей статье, мы ввели две меры: среднеквадратичную ошибку и перекрестную проверку.

Для задач классификации существуют следующие методы измерения.

Матрица путаницы и точность

Эта метрика подходит как для бинарных, так и для мультиклассовых задач классификации.

Confusion Matrix — это матрица. Вот пример (данные из Википедии:Confusion matrix):

  Cat Dog Rabbit
Cat 5 2 0
Dog 3 3 2
Rabbit 0 1 11

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

  • Есть 7 (5 + 2) вариантов использования, классифицированных как «кошка», 2 из них неверны, и их истинная классификация — «собака».
  • Существует 8 (3 + 3 + 2) вариантов использования, классифицируемых как «собака», 5 из них ложны, 3 из них — «кошка» и 2 — «кролик».
  • Существует 12 (1+11) вариантов использования, классифицируемых как «Кролик», из которых 1 вариант использования является неправильным, а его реальная классификация — «Собака».

точность- доля правильно классифицированных образцов к общему количеству образцов. Соответственно существуют иЧастота ошибок,Частота ошибок- доля ошибочно классифицированных образцов к общему количеству образцов.

очевидно:

В приведенном выше примере точность результата равна\frac{5+3+11}{5+2+3+3+2+1+11} = \frac{19}{27} = 0.704, частота ошибок\frac{8}{27} = 1-0.704 = 0.296.

Точность и отзыв

Для задач бинарной классификации у нас также есть специальные метрики.

В случае бинарной классификации есть положительные примеры и отрицательные примеры (например: есть ли вероятность рака). Есть два типа предсказаний, правильные и неправильные. Таким образом, есть четыре возможности:

реальные результаты предсказывать обратное прогнозируемый положительный
Контрпример TN (правильный контрпример) FP (ложноположительный результат)
Положительный пример FN (ложный контрпример) ТП (правильный пример)

В разных сценариях наши цели могут быть разными.

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

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

В этом смысл точности и отзыва.

точностьОтносится к: сколько в выбранных положительных примерах действительно положительных примеров. Формула выглядит следующим образом:

отзывать(также называемый отзывом) относится к тому, сколько положительных примеров выбрано. Формула выглядит следующим образом:

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

Значение F1

Точность и полнота — это два значения. Можем ли мы их объединить и использовать объединенные результаты для измерения различных алгоритмов?

Ответ - да, значениеF1 (F_1оценка, также известная как F-оценка, F-мера), формула его расчета выглядит следующим образом:

Classification metricsСодержит API для измерения производительности классификаторов.

Вот функция, определенная в нашем примере кода:

# lession2_classification.py

import pandas as pd

from sklearn.preprocessing import LabelBinarizer
from sklearn.metrics import f1_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score

def measure_predict(y_true, y_predict):
    lb = LabelBinarizer()
    bin_true = pd.Series(lb.fit_transform(y_true)[:,0])
    bin_predict = pd.Series(lb.fit_transform(y_predict)[:,0])

    print("confusion matrix: \n{}\n".format(
        confusion_matrix(bin_true, bin_predict)))
    print("recall_score: {}\n".format(
        recall_score(bin_true, bin_predict)))
    print("precision_score: {}\n".format(
        precision_score(bin_true, bin_predict)))
    print("f1_score : {}\n".format(
        f1_score(bin_true, bin_predict)))

Входные данные для этой функции:

  • y_true: истинный результат
  • y_predict: результат, предсказанный алгоритмом

В этом эксперименте результат алгоритма равен 2 или 4. Итак, мы проходимLabelBinarizerПреобразуйте его в форму 0s и 1s. Потому что только таким образом можно рассчитать скорость запросов и значение F1 (эти два понятия имеют смысл только для задач бинарной классификации).

Логарифмическая регрессия

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

Мы представили линейную регрессию в предыдущей статье, и ее прогнозы являются непрерывными значениями. Результат предсказания задачи бинарной классификации является лишь одним из двух случаев положительных и отрицательных примеров, которые можно записать какy ∈ {0, 1}. Таким образом, для прогнозируемого значения z регрессии мы можем указать:

  • если г
  • если г > 0, у = 1

(Если z=0, мы можем произвольно указать, что y равно 0 или 1.)

Но это правило выражает, что функция является ступенчатой ​​функцией, которая является разрывной. Поэтому мы надеемся найти «суррогатную функцию», которая в какой-то степени аппроксимирует это правило. И следующая функция просто удовлетворяет:

И эта функция является логарифмической функцией вероятности (логистической функцией). Его график выглядит следующим образом:

Когда z велико, y бесконечно близко к 1. Когда z мал, y близок к нулю.

Мы можем взять линейную функцию в эту функцию и получить следующую функцию:

scikit-learn API

Конечно, с scikit-learn нам не нужно самим реализовывать эти сложные алгоритмы. Просто используйте предоставленный им API напрямую:

# lession2_classification.py

from sklearn.linear_model import LogisticRegression

def logistic_reg(train_data, train_value, test_data):
    logReg = LogisticRegression()
    logReg.fit(train_data, train_value)
    return logReg.predict(test_data)

Древо решений

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

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

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

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

Некоторые читатели, естественно, спросят: сумма бонуса выбирается в первую очередь, так почему же я не могу выбрать другие факторы (например, наличие девушки)?

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

Возвращаясь к вопросу о том, может ли у человека быть рак молочной железы в этой статье, данные в столбцах B ~ J — это все места, где нам нужно учитывать генерацию внутренних узлов. Итак, как мы выбираем и сортируем? Наша инстинктивная реакция состоит в том, чтобы ранжировать атрибуты в соответствии с их «важностью» и рассматривать каждый атрибут по очереди, чтобы делать суждения и делать выбор.

Итак, как измерить важность атрибутов?

Энтропия против относительной энтропии (прирост информации)

Английский оригинал слова «энтропия» — Entropy, что означает: хаос, беспорядок, неопределенность.

Вам трудно понять это слово? Говорят, что причина, по которой энтропия называется «энтропией», заключается в том, что«Люди не понимают этого слова, их легко обмануть»

Итак, что такое порядок и что такое беспорядок?

Рассмотрим набор, если все данные в наборе относятся к одной категории, то набор упорядочен. И наоборот, если все данные относятся к разным категориям, они неупорядочены и хаотичны.

Кроме этих двух крайних случаев, рассмотрим еще один случай. Предположим, есть две группы людей. Первая группа состояла из 50% девочек и 50% мальчиков. Вторая группа состояла из 95% женщин и только 5% мужчин. Какой из двух наборов данных более упорядочен?

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

Так как же нам измерить этот порядок и беспорядок?

Великий математик, основоположник теории информацииКлод ШеннонФормула для нас найдена. Долженопределение формулыследующее. Чем больше значение, тем более хаотичны данные (с точки зрения теории информации это означает, что можно хранить больше информации, но эта точка зрения не имеет отношения к обсуждаемой здесь проблеме).

Буква b в формуле обычно принимает значение 2, e или 10. В дальнейшем мы берем 2 равномерно.

Не пугайтесь этой формулы, в которой на самом деле учитываются только две переменные:

  • n — общее количество категорий данных в наборе. Например: Есть только 2 категории пола.
  • p_k— вероятность появления k-х данных. Например: 50% или 95%.

В случае, когда все данные относятся к одной классификации, энтропия рассчитывается следующим образом:

Ent = -1log_{2}1 = 0

Его степень беспорядка равна 0, поэтому можно сказать и наоборот: он упорядочен.

Затем давайте посчитаем энтропию двух только что упомянутых групп людей.

Для первой группы людей:

Ent(D1) = - \sum_{k=1}^{2}p_{k}log_{2}p_{k} = - (0.5* log_{2}0.5 + 0.5* log_{2}0.5) = - log_{2}\frac{1}{2} = 1

Для второй группы людей:

Ent(D2) = - \sum_{k=1}^{2}p_{k}log_{2}p_{k} = - (0.95* log_{2}0.95 + 0.05* log_{2}0.05) = 0.0703 + 0.216 = 0.2863

Видно, что энтропия первой группы больше, т. е. более хаотична и неупорядочена.

Читатели, рассчитайте: в наборе, содержащем 100 данных, при условии, что все данные принадлежат к разным категориям, какова энтропия этого набора данных?

Вернемся к нашему предыдущему вопросу: при построении дерева решений, как мы строим ветви дерева? Другими словами, как мы должны рассматривать порядок ветвления, какие факторы мы должны учитывать в первую очередь, а какие — затем?

Ветви дерева решений получаются из атрибутов данных, таких как: цвет листа, размер, форма, текстура. Для примера в этой статье это данные в столбцах B ~ J.

Ответ лежит в условной энтропии. Энтропия определяет степень хаотичности набора данных, а условная энтропия описывает хаотическое поведение набора при определении определенного свойства.

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

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

Здесь D — множество в целом, а X — атрибутивное условие. Чем меньше это значение, тем более упорядочены данные при определении определенного атрибута.

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

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

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

Алгоритм CART и примесь Джини

Существует более одного алгоритма построения деревьев решений. Упомянутое выше содержание предоставленоID3,C4.5используемый алгоритм. тогда как scikit-learn использует то, что называетсяCART (Дерево классификации и регрессии)алгоритм.

Из-за ограничений по объему подробное описание и сравнение этих алгоритмов продолжаться не будет, заинтересованные читатели могут обратиться кВикипедия: обучение дереву решенийПродолжайте исследовать в качестве отправной точки.

Алгоритм CART строит деревья решений на основе примеси Джини. Примесь Джини описывает противоречивость набора данных, что аналогично понятию, выраженному энтропией, Чем больше значение, тем более противоречивы или неоднородны данные.

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

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

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

Когда мы строим дерево решений, мы учитываем порядок ветвей в соответствии с «чистотой» признаков. Мы должны предпочесть атрибуты с более высокой чистотой (более низким значением примеси Джини) для разделения.

Для набора D метод расчета примеси Джини атрибута а заключается в следующем: разделить набор на v групп с атрибутом а и вычислить примесь Джини каждой группы.D^v. Затем примените следующую формулу:

scikit-learn API

Точно так же и с scikit-learn нам не нужно самим реализовывать вычисление этой формулы, мы можем напрямую вызывать предоставляемый ею API:

# lession2_classification.py

from sklearn.tree import DecisionTreeClassifier

def dicision_tree(train_data, train_value, test_data):
    tree_clf = DecisionTreeClassifier(max_depth=5)
    tree_clf.fit(train_data, train_value)
    write_file(tree_clf)
    return tree_clf.predict(test_data)

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

визуализация

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

# lession2_classification.py

import graphviz

from sklearn.tree import export_graphviz

def write_file(tree_clf):
    dot_data = export_graphviz(tree_clf, out_file=None,
        filled=True, proportion=True, rounded=True)
    graph = graphviz.Source(source=dot_data,
        filename="./decision_tree", format="png")
    graph.render()

Эта функция экспортирует результат в файл solution_tree.png.

Обратите внимание, что для этого требуется предварительная установкаgraphvizпакеты питона иgraphvizПакет системных команд, первый предоставляет интерфейс Python, второй предоставляетdotинструмент командной строки.

Чтобы узнать, как установить эти два пакета, поищите в Интернете самостоятельно, вот как я установил их в системе OS X:

pip3 install graphviz
brew install graphviz

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

export_graphviz(tree_clf, out_file="./dot_data.txt", filled=True, proportion=True, rounded=True)

Получив эти данные, вы можете превратить их в наглядный график с помощью других инструментов, таких как этот веб-сайт:WebGraphviz.

Скопируйте и вставьте все содержимое в текстовый файл dot_data.txt и нажмите кнопку «Создать график!».

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

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

результат прогноза

В примере кода из этой статьи алгоритм логарифмической регрессии дает сбой, и результаты матрицы путаницы следующие:

== logistic regression ==
confusion matrix: 
[[47  0]
 [23  0]]

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

И результат дерева решений неплох:

== decision tree ==
confusion matrix: 
[[44  3]
 [ 2 21]]

recall_score: 0.9130434782608695

precision_score: 0.875

f1_score : 0.8936170212765957

Его результат:

  • Три из 47 контрпримеров были обнаружены неправильно
  • Из 23 положительных примеров пропущено 2 положительных примера.
  • Уровень отзыва составляет 91,3% (\frac{21}{21+2})
  • Точность составляет 87,5% (\frac{21}{21+3})
  • Оценка F1 составляет 0,894.

Ссылки и рекомендуемая литература