Продолжаем знакомиться с автоматизированным машинным обучением на примере работы с библиотекой PyCaret и рассмотрим с сайта библиотеки учебник по мультиклассовая классификация MCLF101 — уровень для начинающих.
- Модуль классификации PyCaret (pycaret.classification) — это контролируемый модуль машинного обучения, который используется для классификации элементов в бинарные или полиномиальные группы на основе различных методов и алгоритмов.
Модуль классификации PyCaret можно использовать для задач двоичной или многоклассовой классификации. Он имеет более 18 алгоритмов и 14 графиков для анализа производительности моделей. В модуле есть настройка гиперпараметров, объединенные или расширенные методы, такие как наложение.
Для примера будем использовать набор данных Iris из UCI. Это, пожалуй, самая известная база данных, которую можно найти в литературе по распознаванию образов. Набор данных содержит 3 класса по 50 экземпляров в каждом, где каждый класс относится к типу ириса. Ниже приведены краткие описания каждого столбца:
- sepal_length: длина чашелистика
- sepal_width: ширина чашелистика
- petal_length: длина лепестка
- petal_width: ширина лепестка
- species: один из трех классов (Setosa, Versicolor, Virginica), целевая колонка
Загружаем данные из репозитория данных PyCaret с помощью функции get_data()
dataset = get_data('iris')
sepal_length | sepal_width | petal_length | petal_width | species | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa |
1 | 4.9 | 3.0 | 1.4 | 0.2 | Iris-setosa |
2 | 4.7 | 3.2 | 1.3 | 0.2 | Iris-setosa |
3 | 4.6 | 3.1 | 1.5 | 0.2 | Iris-setosa |
4 | 5.0 | 3.6 | 1.4 | 0.2 | Iris-setosa |
Размерность данных
dataset.shape
(150, 5)
data_unseen = dataset.drop(data.index)
data.reset_index(drop=True, inplace=True)
data_unseen.reset_index(drop=True, inplace=True)
print('Unseen Data For Predictions: ' + str(data_unseen.shape))
Data for Modeling: (135, 5) Unseen Data For Predictions: (15, 5)
Настройка среды в PyCaret
Функция setup() инициализирует среду в pycaret и создает конвейер преобразования
для подготовки данных для моделирования и развертывания. setup() необходимо
вызывать перед выполнением любой другой функции в pycaret. Он принимает два
обязательных параметра: dataframe pandas и имя целевого столбца. Все остальные
параметры являются необязательными и используются для настройки конвейера
предварительной обработки При выполнении setup() алгоритм вывода PyCaret автоматически определяет типы
данных для всех функций на основе определенных свойств. Тип данных должен быть
выведен правильно, но это не всегда так. Чтобы учесть это, PyCaret отображает
таблицу, предполагаемые типы данных после выполнения setup().
Если все типы данных идентифицированы правильно, можно нажать Enter,
чтобы продолжить, или выйти, чтобы завершить эксперимент. Обеспечение
правильности типов данных имеет фундаментальное значение в PyCaret, поскольку
он автоматически выполняет несколько задач предварительной обработки, которые
необходимы для любого эксперимента по машинному обучению. Эти задачи выполняются по-разному для каждого типа данных, поэтому очень важно правильно их настроить.
from pycaret.classification import * exp_mclf101 = setup(data = data, target = 'species', session_id=123,fold_shuffle=True)После успешного выполнения установки распечатывается информационная сетка,содержащая несколько важных фрагментов информации. Большая часть информацииотносится к конвейеру предварительной обработки, который создается при выполненииsetup(). Большинство этих функций выходит за рамки данного руководства, однако наэтом этапе следует отметить несколько важных моментов: - **session_id : псевдослучайное число, распространяемое как начальное значение вовсех функциях для последующего воспроизведения. Если session_id не передан,автоматически генерируется случайное число, которое распространяется на всефункции. В этом эксперименте для идентификатора session_id установлено значение123 для последующей воспроизводимости. - **Target Type :** Бинарный или мультиклассовый. Тип цели автоматическиопределяется и отображается. Нет никакой разницы в том, как проводится эксперимент для бинарных или мультиклассовых задач. Все функции идентичны. - **Label Encoded:** Если целевая переменная имеет строковый тип (например, «Да»или «Нет») вместо 1 или 0, она автоматически кодирует метку в 1 и 0 и отображаетсопоставление (0 : Нет, 1 : Да) для справки. В этом эксперименте кодировка меткиприменяется следующим образом: Iris-setosa: 0, Iris-versicolor: 1, Iris-virginica: 2. - **Original Data : ** Отображает исходную форму набора данных. В этом эксперименте (135, 5) означает 135 образцов и 5 признаков, включая целевой столбец. - **Missing Values :** Если в исходных данных отсутствуют значения, это будетотображаться как «Истина». Для этого эксперимента в наборе данных нет пропущенных значений. - **Numeric Features :** Количество признаков, выведенных как числовые. В этомнаборе данных 4 из 5 функций выводятся как числовые. - **Categorical Features :** Количество признаков, определяемых как категориальные.В этом наборе данных нет категориальных признаков. - **Transformed Train Set :** Отображает форму обучающего набора. Обратитевнимание, что исходная форма (135, 5) преобразуется в (94, 4) для обучающей части - **Transformed Test Set :** Отображает форму тестового набора.В наборе для испытаний/выдержки 41 образец. Это разделениеосновано на значении по умолчанию 70/30, которое можно изменить с помощьюпараметра «train_size» в настройках.Сравнение всех моделейСравнение всех моделей для оценки производительности является рекомендуемойотправной точкой для моделирования после завершения настройки (если вы точноне знаете, какая модель вам нужна, что часто бывает не так). Эта функция обучает все модели в библиотеке моделей и оценивает их, используя стратифицированнуюперекрестную проверку для оценки метрик. На выходе выводится сетка оценок,в которой показаны средние значения AUC, Recall, Prce, F1, Kappa и MCC пофолдам (по умолчанию 10), а также время обучения.
best = compare_models()
Model | Accuracy | AUC | Recall | Prec. | F1 | Kappa | MCC | TT (Sec) | |
---|---|---|---|---|---|---|---|---|---|
knn | K Neighbors Classifier | 0.9578 | 0.9963 | 0.9556 | 0.9658 | 0.9553 | 0.9364 | 0.9410 | 0.0140 |
qda | Quadratic Discriminant Analysis | 0.9567 | 0.9963 | 0.9500 | 0.9675 | 0.9547 | 0.9339 | 0.9401 | 0.0120 |
lda | Linear Discriminant Analysis | 0.9567 | 0.9963 | 0.9500 | 0.9675 | 0.9547 | 0.9339 | 0.9401 | 0.0090 |
nb | Naive Bayes | 0.9478 | 0.9943 | 0.9389 | 0.9608 | 0.9455 | 0.9202 | 0.9275 | 0.0110 |
lr | Logistic Regression | 0.9467 | 0.9963 | 0.9389 | 0.9544 | 0.9450 | 0.9187 | 0.9231 | 0.7990 |
gbc | Gradient Boosting Classifier | 0.9367 | 0.9875 | 0.9333 | 0.9499 | 0.9336 | 0.9045 | 0.9121 | 0.1160 |
lightgbm | Light Gradient Boosting Machine | 0.9367 | 0.9963 | 0.9278 | 0.9555 | 0.9322 | 0.9036 | 0.9144 | 0.1840 |
dt | Decision Tree Classifier | 0.9256 | 0.9452 | 0.9167 | 0.9416 | 0.9214 | 0.8869 | 0.8962 | 0.0100 |
et | Extra Trees Classifier | 0.9256 | 0.9934 | 0.9167 | 0.9416 | 0.9214 | 0.8869 | 0.8962 | 0.1230 |
xgboost | Extreme Gradient Boosting | 0.9256 | 0.9730 | 0.9167 | 0.9416 | 0.9214 | 0.8869 | 0.8962 | 0.0440 |
catboost | CatBoost Classifier | 0.9256 | 0.9963 | 0.9167 | 0.9416 | 0.9214 | 0.8869 | 0.8962 | 0.3760 |
rf | Random Forest Classifier | 0.9156 | 0.9893 | 0.9056 | 0.9341 | 0.9111 | 0.8717 | 0.8823 | 0.1430 |
ada | Ada Boost Classifier | 0.9044 | 0.9877 | 0.8944 | 0.9258 | 0.8997 | 0.8551 | 0.8673 | 0.0500 |
ridge | Ridge Classifier | 0.8622 | 0.0000 | 0.8500 | 0.8835 | 0.8582 | 0.7915 | 0.8038 | 0.0120 |
svm | SVM - Linear Kernel | 0.8189 | 0.0000 | 0.8000 | 0.7389 | 0.7630 | 0.7222 | 0.7690 | 0.0100 |
Таким образом обучили и оценили 15 моделей с использованием перекрестной проверки. Напечатанная выше сетка оценок выделяет самые эффективные показатели только для целей сравнения. Сетка по умолчанию сортируется с использованием «Accuracy» (от большего к меньшему), которую можно изменить, передав параметр сортировки. Например, compare_models(sort = 'Recall') отсортирует сетку по полноте, а не по точности. Если вы хотите изменить значение количеств групп со значения по умолчанию, равного 10, на другое значение, вы можете использовать этот параметр. Например, compare_models(fold = 5) будет сравнивать все модели с 5-кратной перекрестной проверкой. Сокращение количества групп улучшит время тренировки. По умолчанию compare_models возвращает наиболее эффективную модель на основе порядка сортировки по умолчанию, но может использоваться для возврата списка лучших N моделей с помощью параметра n_select.
Метрика AUC недоступна для многоклассовой классификации, однако столбец по-прежнему будет отображаться с нулевыми значениями для обеспечения согласованности между сетками отображения двоичной классификации и многоклассовой классификации.
Accuracy | AUC | Recall | Prec. | F1 | Kappa | MCC | |
---|---|---|---|---|---|---|---|
0 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
1 | 0.9000 | 0.9286 | 0.8889 | 0.9250 | 0.8971 | 0.8485 | 0.8616 |
2 | 0.8000 | 0.8571 | 0.7778 | 0.8800 | 0.7750 | 0.6970 | 0.7435 |
3 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
4 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
5 | 0.8889 | 0.9167 | 0.8889 | 0.9167 | 0.8857 | 0.8333 | 0.8492 |
6 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
7 | 0.7778 | 0.8333 | 0.7778 | 0.7778 | 0.7778 | 0.6667 | 0.6667 |
8 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
9 | 0.8889 | 0.9167 | 0.8333 | 0.9167 | 0.8783 | 0.8235 | 0.8407 |
Mean | 0.9256 | 0.9452 | 0.9167 | 0.9416 | 0.9214 | 0.8869 | 0.8962 |
SD | 0.0829 | 0.0610 | 0.0904 | 0.0701 | 0.0876 | 0.1253 | 0.1168 |
Объект обученной модели хранится в переменной 'dt'.
print(dt)
DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='gini', max_depth=None, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, random_state=123, splitter='best')
Классификатор ближайших соседей
knn = create_model('knn')
Accuracy | AUC | Recall | Prec. | F1 | Kappa | MCC | |
---|---|---|---|---|---|---|---|
0 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
1 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
2 | 0.8000 | 1.0000 | 0.7778 | 0.8800 | 0.7750 | 0.6970 | 0.7435 |
3 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
4 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
5 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
6 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
7 | 0.7778 | 0.9630 | 0.7778 | 0.7778 | 0.7778 | 0.6667 | 0.6667 |
8 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
9 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
Mean | 0.9578 | 0.9963 | 0.9556 | 0.9658 | 0.9553 | 0.9364 | 0.9410 |
SD | 0.0846 | 0.0111 | 0.0889 | 0.0722 | 0.0894 | 0.1275 | 0.1192 |
Классификатор логистической регрессии
lr = create_model('lr')
Accuracy | AUC | Recall | Prec. | F1 | Kappa | MCC | |
---|---|---|---|---|---|---|---|
0 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
1 | 0.9000 | 1.0000 | 0.8889 | 0.9250 | 0.8971 | 0.8485 | 0.8616 |
2 | 0.9000 | 1.0000 | 0.8889 | 0.9250 | 0.8971 | 0.8485 | 0.8616 |
3 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
4 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
5 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
6 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
7 | 0.7778 | 0.9630 | 0.7778 | 0.7778 | 0.7778 | 0.6667 | 0.6667 |
8 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
9 | 0.8889 | 1.0000 | 0.8333 | 0.9167 | 0.8783 | 0.8235 | 0.8407 |
Mean | 0.9467 | 0.9963 | 0.9389 | 0.9544 | 0.9450 | 0.9187 | 0.9231 |
SD | 0.0730 | 0.0111 | 0.0803 | 0.0684 | 0.0743 | 0.1105 | 0.1075 |
Обратите внимание, что средняя оценка всех моделей совпадает с оценкой, напечатанной в compare_models(). Это связано с тем, что метрики, напечатанные в таблице результатов compare_models(), представляют собой средние баллы по всем группам CV. Как и в случае с compare_models(), если вы хотите изменить значение параметра fold со значения по умолчанию, равного 10, на другое значение, вы можете использовать параметр fold. Например: create_model('dt', fold = 5) создаст классификатор дерева решений с использованием 5-кратного стратифицированного CV.
Настройка модели
Когда модель создается с помощью функции create_model(), она использует гиперпараметры по умолчанию для обучения модели. Для настройки гиперпараметров используется функция tune_model(). Эта функция автоматически настраивает гиперпараметры модели с помощью случайного поиска по сетке в предварительно определенном пространстве поиска. На выходе распечатывается сетка оценок, в которой показаны AUC, Recall, Prce, F1, Kappa и MCC в кратном порядке для лучшей модели. Чтобы использовать пользовательскую сетку поиска, вы можете передать параметр custom_grid в функцию tune_model .
Классификатор решающих деревьев
Accuracy | AUC | Recall | Prec. | F1 | Kappa | MCC | |
---|---|---|---|---|---|---|---|
0 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
1 | 0.9000 | 0.9571 | 0.8889 | 0.9250 | 0.8971 | 0.8485 | 0.8616 |
2 | 0.9000 | 0.9571 | 0.8889 | 0.9250 | 0.8971 | 0.8485 | 0.8616 |
3 | 0.9000 | 0.9571 | 0.8889 | 0.9250 | 0.8971 | 0.8485 | 0.8616 |
4 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
5 | 0.8889 | 0.9167 | 0.8889 | 0.9167 | 0.8857 | 0.8333 | 0.8492 |
6 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
7 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
8 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
9 | 0.8889 | 0.9484 | 0.8333 | 0.9167 | 0.8783 | 0.8235 | 0.8407 |
Mean | 0.9478 | 0.9737 | 0.9389 | 0.9608 | 0.9455 | 0.9202 | 0.9275 |
SD | 0.0524 | 0.0286 | 0.0631 | 0.0393 | 0.0547 | 0.0801 | 0.0728 |
Объект модели uned хранится в переменной 'tuned_dt'.
print(tuned_dt)
Accuracy | AUC | Recall | Prec. | F1 | Kappa | MCC | |
---|---|---|---|---|---|---|---|
0 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
1 | 0.9000 | 0.9429 | 0.8889 | 0.9250 | 0.8971 | 0.8485 | 0.8616 |
2 | 0.9000 | 1.0000 | 0.8889 | 0.9250 | 0.8971 | 0.8485 | 0.8616 |
3 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
4 | 0.8889 | 1.0000 | 0.8889 | 0.9167 | 0.8857 | 0.8333 | 0.8492 |
5 | 0.8889 | 0.9815 | 0.8889 | 0.9167 | 0.8857 | 0.8333 | 0.8492 |
6 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
7 | 0.8889 | 0.9630 | 0.8889 | 0.9167 | 0.8857 | 0.8333 | 0.8492 |
8 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
9 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
Mean | 0.9467 | 0.9887 | 0.9444 | 0.9600 | 0.9451 | 0.9197 | 0.9271 |
SD | 0.0535 | 0.0193 | 0.0556 | 0.0401 | 0.0550 | 0.0805 | 0.0730 |
Логистическая регрессия
tuned_lr = tune_model(lr)
Accuracy | AUC | Recall | Prec. | F1 | Kappa | MCC | |
---|---|---|---|---|---|---|---|
0 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
1 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
2 | 0.8000 | 0.9786 | 0.7778 | 0.8800 | 0.7750 | 0.6970 | 0.7435 |
3 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
4 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
5 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
6 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
7 | 0.8889 | 0.9444 | 0.8889 | 0.9167 | 0.8857 | 0.8333 | 0.8492 |
8 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
9 | 0.8889 | 0.9722 | 0.8333 | 0.9167 | 0.8783 | 0.8235 | 0.8407 |
Mean | 0.9578 | 0.9895 | 0.9500 | 0.9713 | 0.9539 | 0.9354 | 0.9433 |
SD | 0.0685 | 0.0179 | 0.0803 | 0.0448 | 0.0757 | 0.1044 | 0.0905 |
Функция tune_model() представляет собой случайный поиск по сетке гиперпараметров в заранее определенном пространстве поиска. По умолчанию он настроен на оптимизацию точности, но это можно изменить с помощью параметра оптимизации. Например: tune_model(dt, optimise = 'Recall') будет искать гиперпараметры классификатора дерева решений, которые приводят к максимальному значению Recall. Для целей этого примера мы использовали метрику Accuracy по умолчанию только для простоты.
Tuned K Neighbours в качестве нашей лучшей модели для оставшейся части этого руководства.
Перед завершением модели функцию plot_model() можно использовать для анализа производительности по различным аспектам, таким как AUC, матрица путаницы, граница решения и т. д. Эта функция берет объект обученной модели и возвращает график на основе набора тестов.
Доступно 15 различных графиков, список доступных графиков см. в строке документации plot_model().
Матрица ошибок
plot_model(tuned_knn, plot = 'confusion_matrix')
Отчет о классификации
plot_model(tuned_knn, plot = 'class_report')
Граничный график решения
plot_model(tuned_knn, plot='boundary')
График ошибки прогнозаplot_model(tuned_knn, plot = 'error')
Другой способ анализа производительности моделей — использовать функцию evaluate_model, которая отображает пользовательский интерфейс для всех доступных графиков для данной модели. Он внутренне использует функцию plot_model().
evaluate_model(tuned_knn)
Перед окончательной доработкой модели рекомендуется выполнить последнюю проверку, предсказав тестовый набор и просмотрев метрики оценки. Все показатели оценки, которые мы видели выше, являются результатами перекрестной проверки, основанными только на обучающем наборе (70%). Теперь, используя нашу окончательную обученную модель, хранящуюся в переменной tuningd_knn, мы будем делать прогнозы по тестовой выборке с задержкой , чтобы увидеть, существенно ли они отличаются от результатов CV.
predict_model(tuned_knn);
Model | Accuracy | AUC | Recall | Prec. | F1 | Kappa | MCC | |
---|---|---|---|---|---|---|---|---|
0 | K Neighbors Classifier | 0.9268 | 0.9761 | 0.9333 | 0.9384 | 0.9259 | 0.8879 | 0.8953 |
Точность на тестовом наборе составляет 0,9268 по сравнению с 0.9467 достигнутой по результатам tuning_knn CV. Это не существенная разница. Если существует большая разница между результатами теста и CV, то это, как правило, указывает на переобучение, но также может быть связано с несколькими другими факторами и требует дальнейшего изучения.
Завершение модели для развертывания
т. д. Этот рабочий процесс в конечном итоге приведет вас к наилучшей модели для прогнозирования новых и неизвестных данных. Функция finalize_model() подгоняет модель к полному набору данных. Цель этой функции — обучить модель на полном наборе данных, прежде чем она будет развернута в рабочей среде.
print(final_knn)
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=-1, n_neighbors=33, p=2, weights='uniform')
Функция predict_model() также используется для прогнозирования невидимого набора данных. На этот раз мы передадим параметр data_unseen. data_unseen — это переменная, созданная в самом начале и содержащая 10 % (15 образцов) исходного набора данных, который никогда не подвергался воздействию PyCaret.
unseen_predictions.head()
sepal_length | sepal_width | petal_length | petal_width | species | Label | Score | |
---|---|---|---|---|---|---|---|
0 | 5.4 | 3.9 | 1.7 | 0.4 | Iris-setosa | Iris-setosa | 1.0000 |
1 | 5.4 | 3.4 | 1.7 | 0.2 | Iris-setosa | Iris-setosa | 1.0000 |
2 | 5.1 | 3.3 | 1.7 | 0.5 | Iris-setosa | Iris-setosa | 1.0000 |
3 | 4.8 | 3.1 | 1.6 | 0.2 | Iris-setosa | Iris-setosa | 1.0000 |
4 | 6.9 | 3.1 | 4.9 | 1.5 | Iris-versicolor | Iris-versicolor | 0.5455 |
Комментариев нет:
Отправить комментарий