Изучите классификацию KNN и постройте модель на простом наборе данных, чтобы визуализировать свои результаты!

В предыдущих рассказах я давал объяснение программы для реализации различных моделей регрессии. Также я описал реализацию модели Логистическая регрессия. В этой статье мы увидим алгоритм K-Nearest Neighbours или KNN Classification вместе с простым примером.

Обзор классификации KNN

K-Nearest Neighbours или KNN Classification - это простой и легкий в реализации алгоритм машинного обучения с учителем, который используется в основном для задач классификации.

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

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

Таким образом, мы можем изменять параметр N с различными значениями и выбирать наиболее точное значение для модели методом проб и ошибок, также избегая чрезмерной подгонки и высоких потерь.

Таким образом, мы можем реализовать алгоритм классификации KNN. Давайте теперь перейдем к его реализации на реальном примере в следующем разделе.

Анализ проблемы

Чтобы применить модель классификации KNN на практике, я использую тот же набор данных, что и при построении модели логистической регрессии. В этом случае мы используем набор данных DMV Test, который состоит из трех столбцов. Первые два столбца содержат два письменных теста DMV (DMV_Test_1 и DMV_Test_2), которые являются независимыми переменными и последний столбец состоит из зависимой переменной Результаты, которая указывает, есть ли у водителя права (1) или нет (0).

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

Шаг 1. Импорт библиотек

Как всегда, первый шаг всегда будет включать в себя импорт библиотек NumPy, Pandas и Matplotlib.

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

Шаг 2: Импорт набора данных

На этом этапе мы получим набор данных из моего репозитория GitHub как «DMVWrittenTests.csv». В переменной X будут храниться два «DMV-теста» и переменная Y сохранит окончательный результат как «Результаты» . dataset.head(5) используется для визуализации первых 5 строк данных.

dataset = pd.read_csv('https://raw.githubusercontent.com/mk-gurucharan/Classification/master/DMVWrittenTests.csv')
X = dataset.iloc[:, [0, 1]].values
y = dataset.iloc[:, 2].values
dataset.head(5)
>>
DMV_Test_1   DMV_Test_2   Results
34.623660    78.024693    0
30.286711    43.894998    0
35.847409    72.902198    0
60.182599    86.308552    1
79.032736    75.344376    1

Шаг 3. Разделение набора данных на обучающий набор и тестовый набор.

На этом этапе мы должны разделить набор данных на обучающий набор, на котором будет обучаться модель логистической регрессии, и тестовый набор, на котором обученная модель будет применяться для классификации результатов. Здесь test_size=0.25 означает, что 25% данных будет сохранено как Тестовый набор, а остальные 75 % будет использоваться для обучения как обучающий набор.

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25)

Шаг 4: масштабирование функций

Это дополнительный шаг, который используется для нормализации данных в определенном диапазоне. Это также помогает ускорить вычисления. Поскольку данные сильно различаются, мы используем эту функцию, чтобы ограничить диапазон данных небольшим пределом (-2,2). Например, оценка 62,0730638 нормализована до -0,21231162, а оценка 96,51142588 нормализована до 1,55187648. Таким образом, результаты X_train и X_test нормализуются до меньшего диапазона.

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

Шаг 5: Обучение модели классификации KNN на обучающем наборе

На этом этапе класс KNeighborsClassifier импортируется и назначается переменной «classifier». Функция classifier.fit() оснащена X_train и Y_train, на которых модель будет обучаться.

from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors = 5, metric = 'minkowski', p = 2)
classifier.fit(X_train, y_train)

Шаг 6: Прогнозирование результатов набора тестов

На этом этапе функция classifier.predict() используется для прогнозирования значений для тестового набора, и значения сохраняются в переменной y_pred..

y_pred = classifier.predict(X_test) 
y_pred

Шаг 7: матрица неточностей и точность

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

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

Истинные значения - это количество сделанных правильных прогнозов.

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
from sklearn.metrics import accuracy_score 
print ("Accuracy : ", accuracy_score(y_test, y_pred))
cm
>>Accuracy :  0.92
>>array([[11,  1],
       [ 1, 12]])

Из приведенной выше матрицы путаницы мы делаем вывод, что из 25 данных набора тестов 23 были правильно классифицированы, а 2 классифицированы неправильно, что немного лучше, чем модель логистической регрессии.

Шаг 8: Сравнение реальных значений с прогнозируемыми значениями

На этом этапе создается Pandas DataFrame для сравнения классифицированных значений как исходного набора тестов (y_test), так и прогнозируемых результатов (y_pred ).

df = pd.DataFrame({'Real Values':y_test, 'Predicted Values':y_pred})
df
>> 
Real Values   Predicted Values
0             0
0             1
1             1
0             0
0             0
1             1
1             1
0             0
0             0
1             1
0             0
1             0
1             1
1             1
0             0
0             0
0             0
1             1
1             1
1             1
1             1
0             0
1             1
1             1
0             0

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

Шаг 9: Визуализация результатов

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

from matplotlib.colors import ListedColormap
X_set, y_set = X_test, y_test
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
                     np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
             alpha = 0.75, cmap = ListedColormap(('red', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                c = ListedColormap(('red', 'green'))(i), label = j)
plt.title('KNN Classification')
plt.xlabel('DMV_Test_1')
plt.ylabel('DMV_Test_2')
plt.legend()
plt.show()

На этом графике значение 1 (т. Е. Да) отображается в «красном» цвете, а значение 0 (т. е. нет) отображается в «зеленом» цвете. Модель классификации KNN разделяет два региона. Она не является линейной, как модель логистической регрессии. Таким образом, любые данные с двумя заданными точками данных (DMV_Test_1 и DMV_Test_2) могут быть нанесены на график, и в зависимости от того, в каком регионе они попадают, результат (получение водительских прав) может быть классифицирован как Да или Нет.

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

Заключение -

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

Я также прикрепляю ссылку на свой репозиторий GitHub, где вы можете загрузить эту записную книжку Google Colab и файлы данных для справки.



Вы также можете найти объяснение программы для других моделей классификации ниже:

  • "Логистическая регрессия"
  • Классификация K-ближайших соседей (KNN)
  • Классификация опорных векторов (SVM) (скоро)
  • Наивная байесовская классификация (скоро)
  • Классификация случайных лесов (скоро)

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