Рубрики
Без рубрики

Как строить и обучать K-ближайших соседей и K-означает кластеризацию ML моделей в Python

Автор оригинала: Nick McCullum.

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

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

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

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

  • К-ближайшие соседи
  • K-означает кластеризацию

Этот учебник научит вам, как кодировать K-ближайшие соседи и K-означает алгоритмы кластеризации в Python.

K-Ближайшие соседи алгоритм является одним из самых популярных моделей машинного обучения в мире для решения задач классификации.

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

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

Набор данных вам понадобится в этом руководстве

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

Теперь, когда вы загрузили набор данных, вы захотите переместить файл в каталог, в котором вы будете работать. После этого открыть Jupyter ноутбук И мы можем начать писать код Python!

Библиотеки вам понадобится в этом руководстве

Чтобы написать k ближайшего соседей алгоритм, мы воспользуемся многими библиотеками Python с открытым исходным кодом, включая Numpy , Пандас и Scikit – Учите Отказ

Начните свой скрипт Python, написав следующие операторы импорта:

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sns

%matplotlib inline

Импорт данных, установленных в наш сценарий Python

Наш следующий шаг – импортировать Classified_data.csv Файл в наш сценарий Python. Библиотека Pandas позволяет легко Импортировать данные в DataFrame Pandas Отказ

Поскольку набор данных хранится в CSV Файл, мы будем использовать read_csv Способ сделать это:

raw_data = pd.read_csv('classified_data.csv')

Печать этого DataFrame внутри вашего ноутбука Jupyter даст вам ощущение того, что выглядит данные:

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

raw_data = pd.read_csv('classified_data.csv', index_col = 0)

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

print(raw_data.columns)

Это возвращает:

Index(['WTT', 'PTI', 'EQW', 'SBI', 'LQE', 'QWG', 'FDJ', 'PJF', 'HQE', 'NXJ',

       'TARGET CLASS'],

      dtype='object')

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

Стандартизация набора данных

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

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

К счастью, Scikit - Учите Включает в себя некоторые отличные функциональности для этого с очень маленькой головной болью.

Начать, нам нужно будет импортировать Стандартный планшет класс от Scikit - Учите Отказ Добавьте следующую команду в свой скрипт Python, чтобы сделать это:

from sklearn.preprocessing import StandardScaler

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

Во-первых, давайте создадим экземпляр Стандартный планшет класс по имени Скажер С следующим утверждением:

scaler = StandardScaler()

Теперь мы можем тренировать этот экземпляр на наш набор данных, используя подходит Метод:

scaler.fit(raw_data.drop('TARGET CLASS', axis=1))

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

scaled_features = scaler.transform(raw_data.drop('TARGET CLASS', axis=1))

Это на самом деле создает Numpy Array Из всех функций в наборе данных, и мы хотим, чтобы это было Pandas DataFrame вместо.

К счастью, это простое исправление. Мы просто обернув Scaleded_features Переменная в pd.dataframe Способ и назначить этот файл dataframe для новой переменной под названием Scaleded_data С соответствующим аргументом указать имена столбцов:

scaled_data = pd.DataFrame(scaled_features, columns = raw_data.drop('TARGET CLASS', axis=1).columns)

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

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

Мы будем использовать rain_test_split Функция от Scikit - Учите В сочетании со списком распаковки для создания данных обучения и тестовых данных из нашего классифицированного набора данных.

Во-первых, вам нужно импортировать rain_test_split от model_validation модуль Scikit - Учите С следующим утверждением:

from sklearn.model_selection import train_test_split

Далее нам нужно указать х и y Значения, которые будут переданы в это rain_test_split функция.

х Значения будут Scaleded_data DataFrame, который мы создали ранее. y Значения будут Целевой класс колонка нашего оригинала Raw_data Dataframe.

Вы можете создавать эти переменные со следующими утверждениями:

x = scaled_data

y = raw_data['TARGET CLASS']

Далее вам нужно будет запустить rain_test_split функция с использованием этих двух аргументов и разумного test_size Отказ Мы будем использовать test_size 30%, что дает следующие параметры для функции:

x_training_data, x_test_data, y_training_data, y_test_data = train_test_split(x, y, test_size = 0.3)

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

Обучение K ближайших соседей модели

Давайте начнем, импортируя Кнагбербассификатор от Scikit - Учите :

from sklearn.neighbors import KNeighborsClassifier

Далее давайте создадим экземпляр Кнагбербассификатор класс и назначить его переменной имени модель

Этот класс требует параметра, названного n_neighbors , который равен К Значение k ближайшего соседей алгоритма, которое вы строите. Начать, давайте указывать n_neighbors :

model = KNeighborsClassifier(n_neighbors = 1)

Теперь мы можем обучить наших k ближайших соседей модели, используя подходит Метод и наши X_TRINGE_DATA и Y_TRINGE_DATA Переменные:

model.fit(x_training_data, y_training_data)

Теперь давайте сделаем некоторые прогнозы с нашими недавно обученными k ближайшими соседями алгоритма!

Делать прогнозы с нашими k ближайшими соседями алгоритмом

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

Более конкретно, вот как вы можете принимать прогнозы и назначить их переменной под названием прогнозы :

predictions = model.predict(x_test_data)

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

Измерение точности нашей модели

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

Давайте импортируем две из этих функций ( Classion_Report и confuson_matrix ) в наш отчет сейчас:

from sklearn.metrics import classification_report

from sklearn.metrics import confusion_matrix

Давайте работать через каждый из этих односторонних, начиная с ClassFication_Report Отказ Вы можете генерировать отчет со следующим утверждением:

print(classification_report(y_test_data, predictions))

Это генерирует:

             precision    recall  f1-score   support

           0       0.94      0.85      0.89       150

           1       0.86      0.95      0.90       150

    accuracy                           0.90       300

   macro avg       0.90      0.90      0.90       300

weighted avg       0.90      0.90      0.90       300

Точно так же вы можете генерировать матрицу путаницы со следующим утверждением:

print(confusion_matrix(y_test_data, predictions))

Это генерирует:

[[141  12]

 [ 18 129]]

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

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

Выбор оптимального значения K с использованием метода локтя

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

Способ локтя включает в себя итерацию с помощью различных значений K и выбирая значение с наименьшим количеством ошибок при применении к нашим тестовым данным.

Начать, давайте создадим пустую Список называется error_rates Отказ Мы будем петь по другому К Значения и добавление их скорости ошибок в этот список.

error_rates = []

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

  • Создает новый экземпляр Кнагбербассификатор класс от Scikit-Surve
  • Поезда новой модели, используя наши учебные данные
  • Делает прогнозы на наших тестовых данных
  • Рассчитывает среднюю разницу для каждого неверного прогнозирования (тем ниже, тем точнее наша модель)

Вот код для этого для К Значения между 1 и 100 :

for i in np.arange(1, 101):

    new_model = KNeighborsClassifier(n_neighbors = i)

    new_model.fit(x_training_data, y_training_data)

    new_predictions = new_model.predict(x_test_data)

    error_rates.append(np.mean(new_predictions != y_test_data))

Давайте визуализируем, как наша частота ошибок меняется с разными К Значения с использованием быстрого визуализации MATPLOTLIB:

plt.plot(error_rates)

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

Полный код для этого учебника

Вы можете просмотреть полный код для этого руководства в Этот репозиторий Github Отказ Это также вставлено ниже для вашей ссылки:

#Common imports

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sns

%matplotlib inline

#Import the data set

raw_data = pd.read_csv('classified_data.csv', index_col = 0)

#Import standardization functions from scikit-learn

from sklearn.preprocessing import StandardScaler

#Standardize the data set

scaler = StandardScaler()

scaler.fit(raw_data.drop('TARGET CLASS', axis=1))

scaled_features = scaler.transform(raw_data.drop('TARGET CLASS', axis=1))

scaled_data = pd.DataFrame(scaled_features, columns = raw_data.drop('TARGET CLASS', axis=1).columns)

#Split the data set into training data and test data

from sklearn.model_selection import train_test_split

x = scaled_data

y = raw_data['TARGET CLASS']

x_training_data, x_test_data, y_training_data, y_test_data = train_test_split(x, y, test_size = 0.3)

#Train the model and make predictions

from sklearn.neighbors import KNeighborsClassifier

model = KNeighborsClassifier(n_neighbors = 1)

model.fit(x_training_data, y_training_data)

predictions = model.predict(x_test_data)

#Performance measurement

from sklearn.metrics import classification_report

from sklearn.metrics import confusion_matrix

print(classification_report(y_test_data, predictions))

print(confusion_matrix(y_test_data, predictions))

#Selecting an optimal K value

error_rates = []

for i in np.arange(1, 101):

    new_model = KNeighborsClassifier(n_neighbors = i)

    new_model.fit(x_training_data, y_training_data)

    new_predictions = new_model.predict(x_test_data)

    error_rates.append(np.mean(new_predictions != y_test_data))

plt.figure(figsize=(16,12))

plt.plot(error_rates)

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

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

В этом разделе вы узнаете, как создать свой первый K означает алгоритм кластеризации в Python.

Набор данных, которые мы будем использовать в этом руководстве

В этом руководстве мы будем использовать набор данных, создаваемых с помощью Scikit - Учите Отказ

Давайте импортируем Scikit - Учите ‘s make_blobs Функция для создания этих искусственных данных. Откройте Jupyter ноутбук и запустите свой скрипт Python со следующим утверждением:

from sklearn.datasets import make_blobs

Теперь давайте будем использовать make_blobs Функция для создания некоторых искусственных данных!

Более конкретно, вот как вы можете создать набор данных с 200 Образцы, которые имеют 2 Особенности и 4 кластерные центры. Стандартное отклонение в каждом кластере будет установлено на 1.8 Отказ

raw_data = make_blobs(n_samples = 200, n_features = 2, centers = 4, cluster_std = 1.8)

Если вы распечатаете это Raw_data объект, вы заметите, что это на самом деле Python Tupple Отказ Первый элемент этого кортежа – Numpy Array с 200 наблюдениями. Каждое наблюдение содержит 2 функции (так же, как мы указываем с нашими make_blobs Функция!).

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

Импорт мы будем использовать в этом руководстве

В этом руководстве использовано несколько популярных библиотек Python Phython Phypon Python, в том числе Пандас , Numpy и Матплотлиб Отказ Давайте продолжим наш сценарий Python, добавив следующий импорт:

import pandas as pd

import numpy as np

import seaborn

import matplotlib.pyplot as plt

%matplotlib inline

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

Давайте перейдем к визуализации наших данных рядом.

Визуализация наших данных

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

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

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

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

Чтобы исправить это, нам нужно ссылаться на второй элемент нашего Raw_data Tupple, который представляет собой Numpy Array, который содержит кластер, к которому принадлежит каждое наблюдение.

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

plt.scatter(raw_data[0][:,0], raw_data[0][:,1], c=raw_data[1])

Теперь мы можем видеть, что наш набор данных имеет четыре уникальных кластера. Давайте перейдем к созданию нашего K означает кластерную модель в Python!

Строительство и обучение Наши k означает модель кластеризации

Первый шаг к созданию наших k означает алгоритм кластеризации, импортирующий его из Scikit - Учите Отказ Для этого добавьте следующую команду в свой скрипт Python:

from sklearn.cluster import KMeans

Далее, давайте создадим экземпляр этого Kmeans Класс с параметром n_clusters = 4 и назначить его переменной Модель :

model = KMeans(n_clusters=4)

Теперь давайте тренируем нашу модель, вызывая подходит Метод на нем и прохождение в первом элементе нашего Raw_data кортеж:

model.fit(raw_data[0])

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

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

А именно, нам не нужно было разделить данные, установленные в учебные данные и тестовые данные. Это важное значение – и на самом деле, вам никогда не нужно сделать поезд/тест Split на наборе данных, набор данных при построении моделей инсусперсированных машин.

Изготовление прогнозов с нашими k означает кластеризацию

Практикующие машины обучения обычно используют K означает кластерические алгоритмы для создания двух типов прогнозов:

  • Какой кластер каждой точкой данных принадлежит
  • Где центр каждого кластера

Теперь легко генерировать эти прогнозы, когда наша модель была обучена.

Сначала давайте прогнозируем, какой кластер каждая точка данных принадлежит. Для этого доступа к MABLES_ атрибут из нашего Модель Объект с использованием точечного оператора, как это:

model.labels_

Это генерирует множество массива с прогнозами для каждой точки данных, которая выглядит так:

array([3, 2, 7, 0, 5, 1, 7, 7, 6, 1, 2, 4, 6, 7, 6, 4, 4, 3, 3, 6, 0, 0,

       6, 4, 5, 6, 0, 2, 6, 5, 4, 3, 4, 2, 6, 6, 6, 5, 6, 2, 1, 1, 3, 4,

       3, 5, 7, 1, 7, 5, 3, 6, 0, 3, 5, 5, 7, 1, 3, 1, 5, 7, 7, 0, 5, 7,

       3, 4, 0, 5, 6, 5, 1, 4, 6, 4, 5, 6, 7, 2, 2, 0, 4, 1, 1, 1, 6, 3,

       3, 7, 3, 6, 7, 7, 0, 3, 4, 3, 4, 0, 3, 5, 0, 3, 6, 4, 3, 3, 4, 6,

       1, 3, 0, 5, 4, 2, 7, 0, 2, 6, 4, 2, 1, 4, 7, 0, 3, 2, 6, 7, 5, 7,

       5, 4, 1, 7, 2, 4, 7, 7, 4, 6, 6, 3, 7, 6, 4, 5, 5, 5, 7, 0, 1, 1,

       0, 0, 2, 5, 0, 3, 2, 5, 1, 5, 6, 5, 1, 3, 5, 1, 2, 0, 4, 5, 6, 3,

       4, 4, 5, 6, 4, 4, 2, 1, 7, 4, 6, 6, 0, 6, 3, 5, 0, 5, 2, 4, 6, 0,

       1, 0], dtype=int32)

Чтобы увидеть, где находится центр каждого кластера, доступа к cluster_centers_ Атрибут, используя точечный оператор, как это:

model.cluster_centers_

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

array([[ -8.06473328,  -0.42044783],

       [  0.15944397,  -9.4873621 ],

       [  1.49194628,   0.21216413],

       [-10.97238157,  -2.49017206],

       [  3.54673215,  -9.7433692 ],

       [ -3.41262049,   7.80784834],

       [  2.53980034,  -2.96376999],

       [ -0.4195847 ,   6.92561289]])

Мы оцениваем точность этих предсказаний в следующем разделе.

Визуализация точности нашей модели

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

f, (ax1, ax2) = plt.subplots(1, 2, sharey=True,figsize=(10,6))

ax1.set_title('Our Model')

ax1.scatter(raw_data[0][:,0], raw_data[0][:,1],c=model.labels_)

ax2.set_title('Original Data')

ax2.scatter(raw_data[0][:,0], raw_data[0][:,1],c=raw_data[1])

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

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

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

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

Полный код для этого учебника

Вы можете просмотреть полный код для этого руководства в Этот репозиторий Github Отказ Это также вставлено ниже для вашей ссылки:

#Create artificial data set

from sklearn.datasets import make_blobs

raw_data = make_blobs(n_samples = 200, n_features = 2, centers = 4, cluster_std = 1.8)

#Data imports

import pandas as pd

import numpy as np

#Visualization imports

import seaborn

import matplotlib.pyplot as plt

%matplotlib inline

#Visualize the data

plt.scatter(raw_data[0][:,0], raw_data[0][:,1])

plt.scatter(raw_data[0][:,0], raw_data[0][:,1], c=raw_data[1])

#Build and train the model

from sklearn.cluster import KMeans

model = KMeans(n_clusters=4)

model.fit(raw_data[0])

#See the predictions

model.labels_

model.cluster_centers_

#PLot the predictions against the original data set

f, (ax1, ax2) = plt.subplots(1, 2, sharey=True,figsize=(10,6))

ax1.set_title('Our Model')

ax1.scatter(raw_data[0][:,0], raw_data[0][:,1],c=model.labels_)

ax2.set_title('Original Data')

ax2.scatter(raw_data[0][:,0], raw_data[0][:,1],c=raw_data[1])

Последние мысли

Этот учебник научил вас, как построить K-ближайшие соседи и K-означает модели учебных машин кластеризации в Python.

Если вы заинтересованы в обучении больше о машинном обучении, моей книге Прагматическое машинное обучение научит вам практические методы обучения машин, построенные 9 реальных проектов. Книга запускает 3 августа. Вы можете предварительно заказывать его на скидку 50%, используя ссылку ниже:

Вот краткое резюме того, что вы узнали о моделях K-ближайших соседей в Python:

  • Насколько классифицированные данные являются общим инструментом, используемым для обучения студентов, как решить свои первые K ближайшие проблемы соседа
  • Почему важно стандартизировать ваши данные, установленные при строительстве K ближайших соседних моделей
  • Как разделить данные, установленные в учебные данные и данные тестирования, используя rain_test_split функция
  • Как тренировать свои первые k ближайших соседей и сделайте прогнозы с ним
  • Как измерить производительность модели ближайших соседей
  • Как использовать метод локтя, чтобы выбрать оптимальное значение K в модели ближайших соседей K в k

Точно так же вот краткое резюме того, что вы узнали о K-означает моделями кластеризации в Python:

  • Как создавать искусственные данные в Scikit - Учите используя make_blobs функция
  • Как строить и тренировать k означает модель кластеризации
  • То, что методы обучения машины не требуют, чтобы вы разделили данные в обучающие данные и тестовые данные
  • Как строить и обучать k означает модель кластеризации, используя Scikit-Surve
  • Как визуализирует производительность k означает алгоритм кластеризации, когда вы заранее знаете кластеры