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

Создание наборов данных:

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

Набор данных состоит из:

150 образцов

Признаки: длина чашелистика, ширина чашелистика, длина лепестка, ширина лепестка.

Ярлыки: сорт (Iris Setosa, Iris Versicolour, Iris Virginica)

Загрузка данных

  1. Из репозитория UCI ML загрузите файл данных и добавьте в тот же каталог, что и файл python.
  2. Добавьте имена атрибутов выше в начале CSV-файла.
  3. Загрузите набор данных, прочитав CSV-файл с помощью pandas.

import pandas as pd
data = pd.read_csv("iris.data", sep=",")

Определение функций и ярлыков

За исключением атрибута class, все атрибуты являются функциями.

#features
x = np.array(data.drop(["class"], 1))
#label
y = np.array(data["class"])

Разделение тестовых и обучающих данных:

Часть набора данных будет использоваться для тестирования, а другая — в качестве обучающих данных. Таким образом, мы сможем протестировать нашу модель на примерах, с которыми она раньше не сталкивалась.

Совет: настройте и попробуйте разные размеры тестов, чтобы получить максимальную точность.

x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(x, y, test_size = 0.1)

KNN — K ближайших соседей:

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

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

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

Совет: настройте и попробуйте разные размеры соседей, чтобы получить максимальную точность.

model = KNeighborsClassifier(n_neighbors=7)
model.fit(x_train, y_train)
#calculate accuracy for the test data
acc = model.score(x_test, y_test)

Распечатка результатов:

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

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

Для этого прогона результат точности составляет ок. 93%. 🌈✨

print("Accuracy: ", acc)
predicted = model.predict(x_test)

for x in range(len(predicted)):
    print("Prediction: ", predicted[x], "Actual: ", y_test[x])

Полный код:

import pandas as pd
import sklearn
from sklearn.neighbors import KNeighborsClassifier
import numpy as np

data = pd.read_csv("iris.data", sep=",")

#all attributes
x = np.array(data.drop(["class"], 1))
#all labels trying to predict
y = np.array(data["class"])

x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(x, y, test_size = 0.1)
model = KNeighborsClassifier(n_neighbors=7)
model.fit(x_train, y_train)
acc = model.score(x_test, y_test)
print("Accuracy: ", acc)
predicted = model.predict(x_test)

for x in range(len(predicted)):
    print("Prediction: ", predicted[x], "Actual: ", y_test[x])