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

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

Понимание проблемы

Задача классификатора чисел состоит в том, чтобы правильно идентифицировать рукописные цифры. Для этой цели часто используется база данных MNIST (модифицированный национальный институт стандартов и технологий). Этот набор данных содержит 70 000 изображений рукописных цифр в градациях серого, каждое из которых имеет размер 28x28 пикселей.

Проектный подход

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

Подготовка данных

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

Кроме того, важно нормализовать данные изображения. Данные изображения обычно состоят из интенсивности пикселей в диапазоне от 0 (черный) до 255 (белый). Масштабируя эти значения в диапазоне от 0 до 1, модели легче учиться на данных.

# Import necessary libraries
from sklearn.model_selection import train_test_split
from keras.datasets import mnist
import numpy as np

# Load dataset
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# Normalize pixel values to be between 0 and 1
X_train, X_test = X_train / 255.0, X_test / 255.0

# Reshape input data from (28, 28) to (28, 28, 1)
w, h = 28, 28
X_train = X_train.reshape(X_train.shape[0], w, h, 1)
X_test = X_test.reshape(X_test.shape[0], w, h, 1)

Выбор модели

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

# Import necessary libraries
from keras.models import Sequential
from keras.layers import Dense, Conv2D, Flatten

# Create a sequential model
model = Sequential()

# Add layers
model.add(Conv2D(64, kernel_size=3, activation='relu', input_shape=(28,28,1)))
model.add(Conv2D(32, kernel_size=3, activation='relu'))
model.add(Flatten())
model.add(Dense(10, activation='softmax')) # Output layer

Обучение модели

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

# Compile the model
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

# Train the model
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=3)

Оценка модели

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

# Evaluate the model
test_loss, test_acc = model.evaluate(X_test, y_test)
print('Test accuracy:', test_acc)

Настройка гиперпараметров

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

# Import necessary libraries
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import GridSearchCV

# Function to create model for KerasClassifier
def create_model():
    model = Sequential()
    model.add(Conv2D(64, kernel_size=3, activation='relu', input_shape=(28,28,1)))
    model.add(Conv2D(32, kernel_size=3, activation='relu'))
    model.add(Flatten())
    model.add(Dense(10, activation='softmax'))
    model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
    return model

# Create the KerasClassifier
model = KerasClassifier(build_fn=create_model, verbose=0)

# Define the grid search parameters
batch_size = [10, 20, 40, 60, 80, 100]
epochs = [10, 50, 100]
param_grid = dict(batch_size=batch_size, epochs=epochs)

# Conduct Grid Search
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1)
grid_result = grid.fit(X_train, y_train)

# Print Results
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))

Заключение

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

Вот копия кода, с которым вы можете поиграть самостоятельно; https://colab.research.google.com/drive/1CkHY3XBmlZ6_TDF60oJxEzskDHDBbbNa?usp=sharing