Вводный урок по машинному обучению для начинающих!

машинное обучение

Оригинальная ссылка:woohoo.py изображение search.com/2019/01/14/…

автор:Adrian Rosebrock

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

В этом руководстве будут использоваться следующие две библиотеки для реализации алгоритмов машинного обучения:

  • scikit-learn
  • Keras

Дополнительно вы узнаете:

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

Алгоритмы машинного обучения, используемые в этой статье, включают:

  1. KNN
  2. Наивный Байес
  3. логистическая регрессия
  4. SVM
  5. Древо решений
  6. случайный лес
  7. Персептрон
  8. Многоуровневая прямая сеть
  9. CNNs

Установите необходимые библиотеки машинного обучения Python.

Прежде чем приступить к этому руководству, вам необходимо убедиться, что установлены следующие библиотеки Python:

  • Numpy: Численная обработка для Python.
  • PIL: простая библиотека обработки изображений
  • scikit-learn: содержит различные алгоритмы машинного обучения (обратите внимание, что необходимо использовать версию 0.2+, поэтому необходимо добавить приведенную ниже команду установки--upgrade )
  • Керас и TensorFlow: для глубокого обучения. В этом руководстве можно использовать только версию TensorFlow для ЦП.
  • OpenCV: В этом руководстве не используется OpenCV, ноimutilsбиблиотека зависит от него;
  • imutils: Авторская библиотека обработки изображений/компьютерного зрения

Команда установки выглядит следующим образом: рекомендуется использовать виртуальную среду (например, использовать anaconda для создания новой среды):

$ pip install numpy
$ pip install pillow
$ pip install --upgrade scikit-learn
$ pip install tensorflow # or tensorflow-gpu
$ pip install keras
$ pip install opencv-contrib-python
$ pip install --upgrade imutils

набор данных

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

Первый набор данных — Iris (Ирис)набор данных. Статус этого набора данных эквивалентен «Hello, World!», когда вы впервые начали изучать язык программирования.

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

  • Iris Setosa
  • Iris Versicolor
  • Iris Virginica

Соответствует последнему столбцу на рисункеClass label, а затем есть еще четыре свойства, а именно:

  • Длина чашелистика -- длина чашелистика
  • Ширина чашелистика -- ширина чашелистика
  • Длина лепестка -- длина лепестка
  • Ширина лепестка -- ширина лепестка

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

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

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

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

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

  • Coast: 360
  • Forest: 328
  • Highway: 260

Этот набор данных из трех сцен взят из набора данных из восьми сцен Оливой и Торральбой в статье 2001 года.Modeling the shape of the scene: a holistic representation of the spatial envelope

Шаги по внедрению машинного обучения с помощью Python

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

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

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

Итак, начните прямо сейчас! Первый шагОцените наши вопросы, Спроси себя:

  • Какой это тип набора данных? Числовой, категориальный или имиджевый?
  • Какова конечная цель модели?
  • Как определить и измерить «точность»?
  • Основываясь на моих текущих знаниях в области машинного обучения, какие алгоритмы хорошо работают для таких задач?

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

Следовательно, тогдаПодготовить данные, то есть предварительная обработка данных и проектирование признаков.

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

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

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

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

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

  1. Линейная модель(например, логистическая регрессия, линейный SVM)
  2. нелинейная модель(например, RBF SVM, классификатор градиентного спуска)
  3. Деревья и ансамблевые модели(например, деревья решений и случайные леса)
  4. Нейронные сети(например, многослойные перцептроны, сверточные нейронные сети)

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

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

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

Например, вы найдете:

  • Для наборов данных со многими функциями хорошо работает алгоритм случайного леса;
  • Алгоритм логистической регрессии может очень хорошо обрабатывать многомерные разреженные данные;
  • Для данных изображения CNN работают очень хорошо.

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

Начать!

Затем начните вводить код для реализации алгоритма машинного обучения и протестируйте его на двух вышеуказанных наборах данных. Каталог файлов кода этого руководства выглядит следующим образом, включая четыре файла кода и один3scenesпапка, которая представляет собой набор данных из трех сцен, иIrisнабор данных напрямуюscikit-learnБиблиотеку можно загрузить.

├── 3scenes
│   ├── coast [360 entries]
│   ├── forest [328 entries]
│   └── highway [260 entries]
├── classify_iris.py
├── classify_images.py
├── nn_iris.py
└── basic_cnn.py

На файлы кода и набора данных можно ответить в фоновом режиме официальной учетной записи, то есть в интерфейсе разговора официальной учетной записи 『py_ml"Получать!

Во-первых, осознатьclassify_iris.py, этот код использует алгоритмы машинного обучения дляIrisНаборы данных классифицируются.

Сначала импортируйте необходимые библиотеки:

from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.datasets import load_iris
import argparse

# 设置参数
ap = argparse.ArgumentParser()
ap.add_argument("-m", "--model", type=str, default="knn", help="type of python machine learning model to use")
args = vars(ap.parse_args())

# 定义一个保存模型的字典,根据 key 来选择加载哪个模型
models = {
    "knn": KNeighborsClassifier(n_neighbors=1),
    "naive_bayes": GaussianNB(),
    "logit": LogisticRegression(solver="lbfgs", multi_class="auto"),
    "svm": SVC(kernel="rbf", gamma="auto"),
    "decision_tree": DecisionTreeClassifier(),
    "random_forest": RandomForestClassifier(n_estimators=100),
    "mlp": MLPClassifier()
}

можно увидеть вsklearnБиблиотека объединяет код нескольких алгоритмов машинного обучения, которые мы реализуем, в том числе:

  • KNN
  • Наивный Байес
  • логистическая регрессия
  • SVM
  • Древо решений
  • случайный лес
  • Персептрон

мы звоним напрямуюsklearnВы можете реализовать соответствующий алгоритм, используя соответствующую функцию вknnАлгоритм, звонок напрямуюsklearn.neighborsсерединаKNeighborsClassifier()Вот и все, просто задайте параметрыn_neighbors, количество ближайших соседей.

Здесь непосредственно используйтеmodelsсловарь для проведения инициализации разных моделей, а далее по параметрам--modelдля вызова соответствующей модели, такой как ввод командыpython classify_irs.py --model knnэто позвонитьknnАлгоритмическая модель.

Затем идет раздел загрузки данных:

print("[INFO] loading data...")
dataset = load_iris()
(trainX, testX, trainY, testY) = train_test_split(dataset.data,
	dataset.target, random_state=3, test_size=0.25)

звоните прямо сюдаsklearn.datasetsсерединаload_iris()загрузите данные, затем используйтеtrain_test_splitЧтобы разделить обучающий набор и набор данных, вот 75% данных в качестве обучающего набора и 25% в качестве тестового набора.

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

# 训练模型
print("[INFO] using '{}' model".format(args["model"]))
model = models[args["model"]]
model.fit(trainX, trainY)

# 预测并输出一份分类结果报告
print("[INFO] evaluating")
predictions = model.predict(testX)
print(classification_report(testY, predictions, target_names=dataset.target_names))

Код полной версии выглядит следующим образом:

from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.datasets import load_iris
import argparse

# 设置参数
ap = argparse.ArgumentParser()
ap.add_argument("-m", "--model", type=str, default="knn", help="type of python machine learning model to use")
args = vars(ap.parse_args())

# 定义一个保存模型的字典,根据 key 来选择加载哪个模型
models = {
    "knn": KNeighborsClassifier(n_neighbors=1),
    "naive_bayes": GaussianNB(),
    "logit": LogisticRegression(solver="lbfgs", multi_class="auto"),
    "svm": SVC(kernel="rbf", gamma="auto"),
    "decision_tree": DecisionTreeClassifier(),
    "random_forest": RandomForestClassifier(n_estimators=100),
    "mlp": MLPClassifier()
}

# 载入 Iris 数据集,然后进行训练集和测试集的划分,75%数据作为训练集,其余25%作为测试集
print("[INFO] loading data...")
dataset = load_iris()
(trainX, testX, trainY, testY) = train_test_split(dataset.data, dataset.target, random_state=3, test_size=0.25)

# 训练模型
print("[INFO] using '{}' model".format(args["model"]))
model = models[args["model"]]
model.fit(trainX, trainY)

# 预测并输出一份分类结果报告
print("[INFO] evaluating")
predictions = model.predict(testX)
print(classification_report(testY, predictions, target_names=dataset.target_names))

Затем идет код предсказания классификации с использованием набора данных изображений из трех сценариев.classify_images.pyclassify_iris.pyКод на самом деле относительно похож, сначала импортируйте библиотечную часть, добавьте следующие строки кода:

from sklearn.preprocessing import LabelEncoder
from PIL import Image
from imutils import paths
import numpy as np
import os

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

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

def extract_color_stats(image):
    '''
    将图片分成 RGB 三通道,然后分别计算每个通道的均值和标准差,然后返回
    :param image:
    :return:
    '''
    (R, G, B) = image.split()
    features = [np.mean(R), np.mean(G), np.mean(B), np.std(R), np.std(G), np.std(B)]

    return features

Затем также определитеmodelsСловарь, код тот же, здесь его выкладывать не буду, а дальше код части загрузки изображения такой:

# 加载数据并提取特征
print("[INFO] extracting image features...")
imagePaths = paths.list_images(args['dataset'])
data = []
labels = []

# 循环遍历所有的图片数据
for imagePath in imagePaths:
    # 加载图片,然后计算图片的颜色通道统计信息
    image = Image.open(imagePath)
    features = extract_color_stats(image)
    data.append(features)

    # 保存图片的标签信息
    label = imagePath.split(os.path.sep)[-2]
    labels.append(label)

# 对标签进行编码,从字符串变为整数类型
le = LabelEncoder()
labels = le.fit_transform(labels)

# 进行训练集和测试集的划分,75%数据作为训练集,其余25%作为测试集
(trainX, testX, trainY, testY) = train_test_split(data, labels, test_size=0.25)

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

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

Полная версия выглядит следующим образом:

from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from PIL import Image
from imutils import paths
import numpy as np
import argparse
import os


def extract_color_stats(image):
    '''
    将图片分成 RGB 三通道,然后分别计算每个通道的均值和标准差,然后返回
    :param image:
    :return:
    '''
    (R, G, B) = image.split()
    features = [np.mean(R), np.mean(G), np.mean(B), np.std(R), np.std(G), np.std(B)]

    return features


# 设置参数
ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", type=str, default="3scenes",
                help="path to directory containing the '3scenes' dataset")
ap.add_argument("-m", "--model", type=str, default="knn",
                help="type of python machine learning model to use")
args = vars(ap.parse_args())

# 定义一个保存模型的字典,根据 key 来选择加载哪个模型
models = {
    "knn": KNeighborsClassifier(n_neighbors=1),
    "naive_bayes": GaussianNB(),
    "logit": LogisticRegression(solver="lbfgs", multi_class="auto"),
    "svm": SVC(kernel="rbf", gamma="auto"),
    "decision_tree": DecisionTreeClassifier(),
    "random_forest": RandomForestClassifier(n_estimators=100),
    "mlp": MLPClassifier()
}
# 加载数据并提取特征
print("[INFO] extracting image features...")
imagePaths = paths.list_images(args['dataset'])
data = []
labels = []

# 循环遍历所有的图片数据
for imagePath in imagePaths:
    # 加载图片,然后计算图片的颜色通道统计信息
    image = Image.open(imagePath)
    features = extract_color_stats(image)
    data.append(features)

    # 保存图片的标签信息
    label = imagePath.split(os.path.sep)[-2]
    labels.append(label)

# 对标签进行编码,从字符串变为整数类型
le = LabelEncoder()
labels = le.fit_transform(labels)

# 进行训练集和测试集的划分,75%数据作为训练集,其余25%作为测试集
(trainX, testX, trainY, testY) = train_test_split(data, labels, random_state=3, test_size=0.25)
# print('trainX numbers={}, testX numbers={}'.format(len(trainX), len(testX)))

# 训练模型
print("[INFO] using '{}' model".format(args["model"]))
model = models[args["model"]]
model.fit(trainX, trainY)

# 预测并输出分类结果报告
print("[INFO] evaluating...")
predictions = model.predict(testX)
print(classification_report(testY, predictions, target_names=le.classes_))

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

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

KNN

Здесь мы сначала запускаемclassify_irs, который вызывает модель по умолчаниюknn, посмотри наKNNсуществуетIrisРезультаты экспериментов с набором данных следующие:

Среди них он в основном дает уровень точности, уровень отзыва, F1 и количество наборов тестов этой категории для каждой категории, то есть соответствующиеprecision, recall, f1-score, support. По последней строке и первому столбцу можно увидетьKNNполучить95%точность.

Затем есть экспериментальные результаты для набора данных изображений с тремя сценариями:

здесьKNNполучить72%точность.

(ps: На самом деле при запуске этого алгоритма разное время будет иметь разные результаты.Первоначальный автор дает 75%.Основная причина в том, что код не устанавливает параметры при разделении обучающей выборки и тестовой выборки.random_state, что приводит к разным изображениям тренировочного набора и тестового набора для каждого прогона, поэтому результаты прогона тоже будут разными! )

Наивный Байес

Далее идет алгоритм наивного Байеса, тестирующий два набора данных по отдельности, и результаты следующие:

Точно так же наивный байесовскийIrisТам98%точность, но только на наборах данных изображений63%точность.

Итак, можем ли мы объяснитьKNNАлгоритм лучше Наивного Байеса?

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

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

логистическая регрессия

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

Точно так же логистическая регрессия вIrisТам98%точность, но только на наборах данных изображений77%Степень точности (по сравнению с исходной авторской степенью точности логистической регрессии составляет 69%)

Метод опорных векторов SVM

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

Аналогично, SVMIrisТам98%точность, но только на наборах данных изображений76%Уровень точности (по сравнению с уровнем точности оригинального автора составляет 83%, в основном из-за категории открытияcoastСуществует большая разница)

Древо решений

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

Аналогично, дерево решенийIrisТам98%точность, но только на наборах данных изображений71%Показатель точности (по сравнению с исходным авторским показателем точности дерева решений составляет 74%)

случайный лес

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

Точно так же случайные лесаIrisТам96%точность, но только на наборах данных изображений77%Показатель точности (по сравнению с исходным авторским показателем точности дерева решений составляет 84%)

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

Многослойный персептрон

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

Точно так же многослойный персептронIrisТам98%точность, но только на наборах данных изображений79%Показатель точности (по сравнению с исходным авторским показателем точности дерева решений составляет 81%).

Глубокое обучение и глубокие нейронные сети

Нейронные сети

Наконец, алгоритм, реализующий глубокое обучение, которыйnn_iris.pyиbasic_cnn.pyэти два кода.

(Обратите внимание здесьTensorFlowиKerasПроблема версии, я используюTF=1.2иKeras=2.1.5)

прежде всегоnn_iris.pyРеализация также первой импортирует библиотеку и обработку данных:

from keras.models import Sequential
from keras.layers.core import Dense
from keras.optimizers import SGD
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.datasets import load_iris

# 载入 Iris 数据集,然后进行训练集和测试集的划分,75%数据作为训练集,其余25%作为测试集
print("[INFO] loading data...")
dataset = load_iris()
(trainX, testX, trainY, testY) = train_test_split(dataset.data,
                                                  dataset.target, test_size=0.25)

# 将标签进行 one-hot 编码
lb = LabelBinarizer()
trainY = lb.fit_transform(trainY)
testY = lb.transform(testY)

Здесь мы будем использоватьKerasреализовать нейронную сеть, а затем метка должна бытьone-hotкодирование, то есть горячее кодирование.

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

# 利用 Keras 定义网络模型
model = Sequential()
model.add(Dense(3, input_shape=(4,), activation="sigmoid"))
model.add(Dense(3, activation="sigmoid"))
model.add(Dense(3, activation="softmax"))

# 采用梯度下降训练模型
print('[INFO] training network...')
opt = SGD(lr=0.1, momentum=0.9, decay=0.1 / 250)
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=["accuracy"])
H = model.fit(trainX, trainY, validation_data=(testX, testY), epochs=250, batch_size=16)

# 预测
print('[INFO] evaluating network...')
predictions = model.predict(testX, batch_size=16)
print(classification_report(testY.argmax(axis=1), predictions.argmax(axis=1), target_names=dataset.target_names))

Вот нейронная сеть с 3 полностью связанными слоями, первые два слоя используютSigmoidфункция активации, а затем последний слой является выходным слоем, поэтому используйтеsoftmaxПревратите результат в значение вероятности. Далее необходимо определить использованиеSGDАлгоритм оптимизации функции потерьcategorical_crossentropy, количество итераций 250,batch_size16.

Полная версия выглядит следующим образом:

from keras.models import Sequential
from keras.layers.core import Dense
from keras.optimizers import SGD
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.datasets import load_iris

# 载入 Iris 数据集,然后进行训练集和测试集的划分,75%数据作为训练集,其余25%作为测试集
print("[INFO] loading data...")
dataset = load_iris()
(trainX, testX, trainY, testY) = train_test_split(dataset.data,
                                                  dataset.target, test_size=0.25)

# 将标签进行 one-hot 编码
lb = LabelBinarizer()
trainY = lb.fit_transform(trainY)
testY = lb.transform(testY)

# 利用 Keras 定义网络模型
model = Sequential()
model.add(Dense(3, input_shape=(4,), activation="sigmoid"))
model.add(Dense(3, activation="sigmoid"))
model.add(Dense(3, activation="softmax"))

# 采用梯度下降训练模型
print('[INFO] training network...')
opt = SGD(lr=0.1, momentum=0.9, decay=0.1 / 250)
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=["accuracy"])
H = model.fit(trainX, trainY, validation_data=(testX, testY), epochs=250, batch_size=16)

# 预测
print('[INFO] evaluating network...')
predictions = model.predict(testX, batch_size=16)
print(classification_report(testY.argmax(axis=1),
                            predictions.argmax(axis=1), target_names=dataset.target_names))

запустить команду напрямуюpython nn_iris.py, вывод следующий:

Здесь вы получаете 100% точность, такую ​​же, как и в оригинале. Конечно, на самом деле результаты, приведенные в исходном тексте, показаны на рисунке ниже.Видно, что количество категорий на самом деле другое.

CNN

наконец осознатьbasic_cnn.pyэтот код.

Также сначала стоит импортировать необходимые библиотечные функции:

from keras.models import Sequential
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.layers.core import Activation
from keras.layers.core import Flatten
from keras.layers.core import Dense
from keras.optimizers import Adam
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from PIL import Image
from imutils import paths
import numpy as np
import argparse
import os

# 配置参数
ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", type=str, default="3scenes",
                help="path to directory containing the '3scenes' dataset")
args = vars(ap.parse_args())

также импортироватьKerasстроитьCNNСетевая модель , и поскольку она обрабатывает данные изображения, поэтомуPIL,imutilsтакже импортируется.

Затем необходимо загрузить данные и разделить обучающий набор и тестовый набор.Для загруженных данных здесь напрямую используются исходные данные о пикселях изображения, и только данные изображения должны быть отрегулированы до единого размера, здесь равномерно отрегулированы до 32×32 и нормализовано до[0,1]диапазон.

# 加载数据并提取特征
print("[INFO] extracting image features...")
imagePaths = paths.list_images(args['dataset'])
data = []
labels = []

# 循环遍历所有的图片数据
for imagePath in imagePaths:
    # 加载图片,然后调整成 32×32 大小,并做归一化到 [0,1]
    image = Image.open(imagePath)
    image = np.array(image.resize((32, 32))) / 255.0
    data.append(image)

    # 保存图片的标签信息
    label = imagePath.split(os.path.sep)[-2]
    labels.append(label)

# 对标签编码,从字符串变为整型
lb = LabelBinarizer()
labels = lb.fit_transform(labels)

# 划分训练集和测试集
(trainX, testX, trainY, testY) = train_test_split(np.array(data), np.array(labels), test_size=0.25)

Затем определите 4-слойныйCNNСтруктура сети, включая 3 слоя сверточных слоев и последний слой выходного слоя, алгоритм оптимизации используетAdamвместоSGD. Код выглядит следующим образом:

# 定义 CNN 网络模型结构
model = Sequential()
model.add(Conv2D(8, (3, 3), padding="same", input_shape=(32, 32, 3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(16, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(32, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Flatten())
model.add(Dense(3))
model.add(Activation("softmax"))

# 训练模型
print("[INFO] training network...")
opt = Adam(lr=1e-3, decay=1e-3 / 50)
model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"])
H = model.fit(trainX, trainY, validation_data=(testX, testY),
              epochs=50, batch_size=32)

# 预测
print("[INFO] evaluating network...")
predictions = model.predict(testX, batch_size=32)
print(classification_report(testY.argmax(axis=1),
                            predictions.argmax(axis=1), target_names=lb.classes_))

Полная версия выглядит следующим образом:

from keras.models import Sequential
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.layers.core import Activation
from keras.layers.core import Flatten
from keras.layers.core import Dense
from keras.optimizers import Adam
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from PIL import Image
from imutils import paths
import numpy as np
import argparse
import os

# 配置参数
ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", type=str, default="3scenes",
                help="path to directory containing the '3scenes' dataset")
args = vars(ap.parse_args())

# 加载数据并提取特征
print("[INFO] extracting image features...")
imagePaths = paths.list_images(args['dataset'])
data = []
labels = []

# 循环遍历所有的图片数据
for imagePath in imagePaths:
    # 加载图片,然后调整成 32×32 大小,并做归一化到 [0,1]
    image = Image.open(imagePath)
    image = np.array(image.resize((32, 32))) / 255.0
    data.append(image)

    # 保存图片的标签信息
    label = imagePath.split(os.path.sep)[-2]
    labels.append(label)

# 对标签编码,从字符串变为整型
lb = LabelBinarizer()
labels = lb.fit_transform(labels)

# 划分训练集和测试集
(trainX, testX, trainY, testY) = train_test_split(np.array(data), np.array(labels), test_size=0.25)

# 定义 CNN 网络模型结构
model = Sequential()
model.add(Conv2D(8, (3, 3), padding="same", input_shape=(32, 32, 3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(16, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(32, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Flatten())
model.add(Dense(3))
model.add(Activation("softmax"))

# 训练模型
print("[INFO] training network...")
opt = Adam(lr=1e-3, decay=1e-3 / 50)
model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"])
H = model.fit(trainX, trainY, validation_data=(testX, testY),
              epochs=50, batch_size=32)

# 预测
print("[INFO] evaluating network...")
predictions = model.predict(testX, batch_size=32)
print(classification_report(testY.argmax(axis=1),
                            predictions.argmax(axis=1), target_names=lb.classes_))

Команда Runpython basic_cnn.py, вывод следующий:

CNNТочность должна достигать90%, который превосходит несколько предыдущих алгоритмов машинного обучения.


резюме

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

Из этого простого руководства по началу работы вы должны понять следующее:

  1. Ни один алгоритм не идеален и не может быть полностью применен ко всем сценариям.Даже популярный в настоящее время метод глубокого обучения имеет свои ограничения, поэтому его следуетАнализ конкретных проблем!
  2. Вспомните 5-этапный процесс машинного обучения, рекомендованный в начале, и еще раз просмотрите его здесь:
    • Оцените свою проблему
    • Подготовка данных (необработанные данные, извлечение признаков, проектирование признаков и т. д.)
    • Изучите различные алгоритмы машинного обучения
    • Проверьте результаты эксперимента
    • Получите представление о самых эффективных алгоритмах
  3. Последний момент заключается в том, что результаты алгоритма, который я запускаю, будут отличаться от результатов исходного автора.На самом деле это причина, по которой обучающий набор и тестовый набор не совпадают каждый раз, когда данные отбираются! Это на самом деле показываетДанные очень важны, для машинного обучения,хорошие данные важны!

Затем, согласно этому руководству, вы можете продолжить узнавать больше о каждом алгоритме машинного обучения, понимать основные принципы и реализацию каждого алгоритма и пытаться реализовать его вручную, а не просто вызывать существующую библиотеку, что будет более впечатляющим. здесь «Машинное обучение в действии» представляет классические алгоритмы машинного обучения и шаг за шагом поможет вам реализовать алгоритм!

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

www.pyimagesearch.com/

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


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

  1. Обратите внимание на общественный номер»Машинное обучение и компьютерное зрение"
  2. Оставьте сообщение на фоне общедоступной учетной записи WeChat 『py_ml

Добро пожаловать, чтобы обратить внимание на мою общедоступную учетную запись WeChat — машинное обучение и компьютерное зрение, или отсканируйте QR-код ниже, давайте общаться, учиться и прогрессировать вместе!

Прекрасная рекомендация в прошлом

Серия машинного обучения
Рекомендация руководства по проектам и ресурсам Github