Цель этого урока — классифицировать растения ириса по их 4 различным признакам. Набор данных, который мы собираемся использовать, является одним из самых известных наборов данных — бумага Фишера.
Создание наборов данных:
Перед началом классификации важно подготовить набор данных. Учитывая особенности, наша модель будет предсказывать, к какому классу относится растение ирис.
Набор данных состоит из:
150 образцов
Признаки: длина чашелистика, ширина чашелистика, длина лепестка, ширина лепестка.
Ярлыки: сорт (Iris Setosa, Iris Versicolour, Iris Virginica)
Загрузка данных
- Из репозитория UCI ML загрузите файл данных и добавьте в тот же каталог, что и файл python.
- Добавьте имена атрибутов выше в начале CSV-файла.
- Загрузите набор данных, прочитав 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])