Подробное руководство по машинному обучению для начинающих

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

Ваш самый первый проект машинного обучения

Если вы не знаете, какой проект следует выбрать в первую очередь в машинном обучении, инженеры по машинному обучению очень часто рекомендуют набор данных Iris в качестве вашего самого первого проекта в машинном обучении. , и фактически он получил название «Hello World» - проект машинного обучения. Прежде чем мы продолжим обсуждение того, что такое набор данных Iris, сначала мы должны понять два типа машинного обучения: обучение с учителем и обучение без учителя.

  1. Контролируемое обучение

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

2. Обучение без учителя

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

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

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

Набор данных цветов ириса

Набор данных Iris можно проследить еще в 1936 году, когда Рональд Фишер, британский статистик, евгеник и биолог, представил его в своей статье Использование множественных измерений в таксономических задачах в качестве примера линейного дискриминантного анализа. Этот набор данных пытается классифицировать 3 типа цветов ириса, а именно Iris Sentosa, Iris Virginica и Iris Versicolor, где он содержит 50 образцов для каждого типа. Кроме того, эти данные содержат 4 характеристики (обычно представленные в виде количества столбцов в наборе данных) цветов, которые представляют собой длину и ширину чашелистиков и лепестков, а также метку для каждой информации. Эти данные можно скачать на сайте Kaggle здесь.

Начиная

Как упоминалось в предыдущей статье, почти каждый проект машинного обучения работает на Python, что можно сделать либо на Jupyter Notebook, либо на Google Colab, что также обсуждалось там при установке. После того, как Jupyter Notebook или Google Colab были установлены и открыты, создайте свою первую записную книжку, щелкнув новые и Python 3 для Jupyter Notebook, как показано на рисунке ниже, или щелкните файл, а затем новую записную книжку для Google Colab.

который покажет здесь ваш блокнот, как показано на рисунке ниже:

В первую ячейку вам нужно импортировать следующие библиотеки:

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

Это означает, что в следующий раз, когда вы захотите использовать их библиотеки, вы можете просто использовать их аббревиатуру. Например, чтобы использовать pandas, вы можете просто ввести pd, и эти аббревиатуры могут быть установлены как угодно. Numpy полезен для построения матриц, в то время как pandas предназначен для очистки или исследования данных, seaborn и matplotlib.pyplot имеют аналогичную функцию, которая заключается в построении графиков, однако seaborn позволяет нам создавать более сложные графики, которые будут показаны позже.

После импорта этих библиотек вам нужно будет импортировать набор данных Iris в записную книжку, используя следующую функцию pandas:

data = pd.read_csv('../First Project/Iris.csv')

Как мы видим выше, мы создаем новую переменную с именем data, а также используем библиотеку pandas в форме pd для чтения набора данных iris, который находится в форме csv. Убедитесь, что «Первый проект» заменен на имя папки, в которой хранятся ваши данные Iris. Итак, в следующий раз, когда мы захотим взаимодействовать с нашим набором данных Iris, мы всегда можем использовать переменную данных.

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

data.head()

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

В pandas также есть много других методов исследования данных, таких как:

data.info()

Чтобы показать типы данных, количество заполненных ячеек, количество столбцов и память, как показано ниже:

Вычислить всю описательную статистику, такую ​​как количество, максимальное, минимальное, среднее, среднее значение и стандартное отклонение, можно мгновенно, выполнив следующую команду:

data.describe()

Что покажет вывод:

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

data['Species'].value_counts()

Что покажет вывод:

И, наконец, мы можем удалить весь столбец, используя следующую функцию перетаскивания ниже:

data = data.drop('Id', axis=1)

Здесь мы удаляем столбец Id, в котором новый набор данных будет отображаться как:

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

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

plotting = sns.pairplot(data, hue='Species')

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

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

Еще одна особенность морского графика - график скрипки, который похож на прямоугольный график, но с визуализацией дополнительной плотности, где более толстая часть показывает более частую, чем более тонкая часть. Мы можем построить каждый атрибут индивидуально для сюжета «Скрипка». Также обратите внимание, что для построения нескольких графиков в одной ячейке необходимо вставить команду matplotlib, plt.show () в конце каждой переменной графика, в противном случае ячейка будет отображать только последний график, назначенный из нее.

g = sns.violinplot(y='Species', x='SepalLengthCm', data=data)
plt.show()
g = sns.violinplot(y='Species', x='SepalWidthCm', data=data)
plt.show()
g = sns.violinplot(y='Species', x='PetalLengthCm', data=data)
plt.show()
g = sns.violinplot(y='Species', x='PetalWidthCm', data=data)

Который будет строить:

Этикетка и функция

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

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

X = data.drop(['Species'], axis=1)

С другой стороны, поскольку метка состоит только из столбца видов, более эффективно назначить Y только столбец видов вместо того, чтобы отбрасывать все столбцы характеристик, как показано ниже:

y = data['Species']

Разделение данных

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

Следовательно, нам нужно использовать библиотеку Scikit-learn для разделения данных:

from sklearn.model_selection import train_test_split

и убедитесь, что вы установили Scikit-learn, используя:

pip install scikit-learn

Затем разделите данные меток и функций на данные обучения и тестирования с помощью следующей функции:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=5)

Размер теста указывает процент всех данных, которые мы будем использовать в качестве тестовых данных. Например, поскольку мы выбрали 0,4 в этом проекте, следовательно, из 150 данных 40% из них или 60 из них будут назначены как данные тестирования меток и данные тестирования функций. В то время как остальные 90 данных обрабатываются как данные поезда.

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

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

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

  1. K-ближайший сосед (KNN)
  2. Наивный байесовский классификатор
  3. Логистическая регрессия
  4. Случайный лес
  5. Машина опорных векторов (SVM)

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

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

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

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

Мы можем попробовать каждое значение k, используя для функции от 1 до 26, и построить каждую точность, используя простой линейный график matplotlib. Кроме того, чтобы использовать алгоритм KNN, нам не нужно кодировать формулу с нуля, поскольку мы можем импортировать алгоритм KNN и расчет точности из библиотеки sklearn здесь:

from sklearn import metrics
from sklearn.neighbors import KNeighborsClassifier

Следовательно, мы можем выполнить алгоритм KNN и вычислить точность из функции метрик следующим образом:

k_range = list(range(1,26))
scores = []
for k in k_range:
    knn = KNeighborsClassifier(n_neighbors=k)
    knn.fit(X_train, y_train)
    y_pred = knn.predict(X_test)
    scores.append(metrics.accuracy_score(y_test, y_pred))

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

plt.plot(k_range, scores)
plt.xlabel('Value of k for KNN')
plt.ylabel('Accuracy Score')
plt.title('Accuracy Scores for Values of k of k-Nearest-Neighbors')
plt.show()

Это даст результат точности:

Что составляет около 0,983 или 98,3% правильной точности для k = 2, 3 и 5 до 26. Чтобы избежать переобучения, давайте выберем не слишком маленькое значение k и вместо этого возьмем 12.

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

logreg = LogisticRegression()
logreg.fit(X_train, y_train)
y_pred = logreg.predict(X_test)
print(metrics.accuracy_score(y_test, y_pred))

Это дает результат 0,966 или 96,6%, что не показывает большой разницы по сравнению с KNN, однако, чтобы убедиться, что мы используем лучший алгоритм, разумнее выбрать KNN в качестве нашего алгоритма для классификации набора данных.

Поскольку мы вполне уверены в нашей точности 98,3% от KNN, мы должны опробовать наш алгоритм, назначив случайную длину и ширину лепестка и чашелистика, чтобы увидеть, какой тип цветка выйдет, используя следующий код:

knn = KNeighborsClassifier(n_neighbors=12)
knn.fit(X, y)
knn.predict([[6, 3, 4, 2]])

В этом коде мы экспериментируем с назначением длины чашелистника 6 см, ширины чашелистика 3 см, длины лепестка 4 см и ширины лепестка 2 см, которые наш алгоритм сообщает нам, что цветок может быть:

Ирис разноцветный

Однако, если мы назначаем длину чашелистника 10 см, ширину чашелистника 9 см, длину лепестка 5 см и ширину лепестка 4 см, алгоритм предсказывает, что это может быть:

Ирис Вирджиния

Заверните

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

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