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

О наборе данных

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

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

Мы немного отформатировали данные и добавили одну или две дополнительные моделируемые функции, такие как цветовая шкала, в учебных целях. Этот набор данных назван fruit_data .txt. Вы можете найти набор данных в моем репозитории GitHub.

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

  1. Имя
  2. Подтип
  3. Измерение
  4. Цвет

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

Импортировать необходимые библиотеки

Импортируйте эти модули ниже, чтобы продолжить работу с кодом.

%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split

Импортировать набор данных

Для тех, кто использует Google Colab, используйте следующий фрагмент кода для импорта файла набора данных.

from google.colab import files
files.upload()

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

fruits = pd.read_table(‘fruit_data.txt’)

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

Вывод:

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

Исследовательский анализ данных

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

lookup_fruit_name = dict(zip(fruits.fruit_label.unique(), fruits.fruit_name.unique()))
lookup_fruit_name

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

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

X = fruits[['height', 'width', 'mass', 'color_score']]
y = fruits['fruit_label']

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

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

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

Эта функция (random_state = 0) случайным образом перемешивает набор данных и разделяет определенный процент входных выборок для использования в качестве обучающего набора, а затем помещает оставшиеся выборки в другую переменную для использования в качестве тестового набора. .

Код участка:

from matplotlib import cm
from pandas.plotting import scatter_matrix
cmap = cm.get_cmap('gnuplot')
scatter = scatter_matrix(X_train, c= y_train, marker = 'x', s=40, hist_kwds={'bins':15}, figsize=(9,9), cmap=cmap)

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

Вывод:

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

  • Каждая точка на диаграмме разброса представляет собой фрукт, окрашенный в соответствии с классом, к которому он принадлежит. И позиционируется с использованием параметров para, назначенных этой диаграмме рассеяния.
  • По диагонали расположена гистограмма, показывающая распределение значений функций для этой функции.
  • Итак, на этом парном графике размеры показаны в следующем порядке: высота, ширина, масса. И цветовую гамму образцов фруктов в нашем обучающем наборе.
  • Таким образом, левый верхний угол гистограммы показывает распределение функции высоты для всех выборок в обучающем наборе.
  • А диаграмма рассеяния справа от него отображает ширину каждого образца по оси x и высоту образца по оси y.

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

Поезд-тестовый сплит

Используйте массу, ширину и высоту плода как характеристики.

X = fruits[['mass', 'width', 'height']]
y = fruits['fruit_label']
  • Заглавная буква X содержит функции нашего набора данных без метки.
  • y в нижнем регистре содержат соответствующие метки для экземпляров в x.

Итак, этот набор функций называется пространством функций.

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

Я поместил результаты функции разделения теста поезда в четыре переменные, которые вы видите слева. И они помечены как x_train, x_test, y_train и y_test.

Объект-классификатор

Когда у нас есть разделение на поезд и тест, нам нужно создать экземпляр объекта классификатора. В данном случае классификатор k-NN.

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors = )
knn.fit(X_train,y_train)

Затем мы обучаем классификатор, передавая дату обучающего набора в X_train и метки в y_train методу подгонки классификаторов.

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

knn.score(X_test,y_test)

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

Он определяет точность как долю тестового набора, правильно спрогнозированного классификатором.

Классификатор тестов

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

Пример №1

fruit_prediction = knn.predict([[20, 4.3, 5.5]])
lookup_fruit_name[fruit_prediction[0]]

Выход:

Пример 2

fruit_prediction = knn.predict([[100, 6.3, 8.5]])
lookup_fruit_name[fruit_prediction[0]]

Выход:

Влияние "k" на точность классификации

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

Это потому, что, когда K = 1, прогноз чувствителен к

  • Шум
  • Выбросы
  • Неверно маркированные данные

и другие варианты отдельных точек данных.

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

Это пример так называемого компромисса смещения и дисперсии.

k_range = range(1,20)
scores = []
for k in k_range:
    knn = KNeighborsClassifier(n_neighbors = k)
    knn.fit(X_train, y_train)
    scores.append(knn.score(X_test, y_test))
plt.figure()
plt.xlabel('k')
plt.ylabel('accuracy')
plt.scatter(k_range, scores)
plt.xticks([0,5,10,15,20]);

Вывод

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

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

Резюме

  1. Мы изучили набор данных, построили график некоторых функций.

2. Затем мы взяли эти функции и узнали, как вычислить разделение тестовых поездов.

3. Использовал это для обучения классификатора и

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

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

Сфера классификации фруктов

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

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

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

Репозиторий Github: https://github.com/zainuleb/Applied-Machine-Learning-with-Python.github.io/tree/master/Section%201