Создание машинно-обучаемого классификатора с помощью Scikit-learn в Python

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

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

Данный мануал поможет реализовать простой алгоритм машинного обучения в Python с помощью инструмента Scikit-learn. Для этого мы будем использовать базу данных о раке молочной железы и классификатор Naive Bayes (NB), который предсказывает, является ли опухоль злокачественной или доброкачественной.

Требования

Для работы вам понадобится локальная среда разработки Python 3 и предварительно установленное приложение Jupyter Notebook. Это приложение очень полезно при запуске экспериментов по машинному обучению: оно позволяет запускать короткие блоки кода и быстро просматривать результаты, легко тестировать и отлаживать код.

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

1: Импорт Scikit-learn

Для начала нужно установить модуль Scikit-learn. Это одна из лучших и наиболее документированных библиотек Python для машинного обучения.

Чтобы начать работу над проектом, разверните среду разработки Python 3. Убедитесь, что вы находитесь в каталоге, в котором хранится эта среда, и выполните следующую команду:

. my_env/bin/activate

После этого проверьте, не был ли модуль Sckikit-learn установлен ранее.

python -c "import sklearn"

Если модуль sklearn установлен, команда выполнится без ошибок. Если модуль не установлен, вы увидите ошибку:

Traceback (most recent call last): File "<string>", line 1, in <module> ImportError: No module named 'sklearn'

Чтобы загрузить библиотеку, используйте pip:

pip install scikit-learn[alldeps]

После завершения установки запустите Jupyter Notebook:

jupyter notebook

В Jupyter создайте документ ML Tutorial. В первую ячейку документа импортируйте модуль sklearn.

import sklearn

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

2: Импорт наборов данных

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

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

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

...
from sklearn.datasets import load_breast_cancer
# Load dataset
data = load_breast_cancer()

Переменная data содержит словарь, важными ключами которого являются названия классификационных меток (target_names), метки (target), названия атрибутов (feature_names) и атрибуты (data).

Читайте также:

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

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

...
# Organize our data
label_names = data['target_names']
labels = data['target']
feature_names = data['feature_names']
features = data['data']

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

...
# Look at our data
print(label_names)
print(labels[0])
print(feature_names[0])
print(features[0])

Запустите код, чтобы увидеть результат.

Как видно в выводе, имена классов — malignant и benign, которые затем отображаются как двоичные значения 0 и 1, где 0 представляет собой злокачественные, а 1 – доброкачественные опухоли. Согласно выводу, первый экземпляр данных представляет собой злокачественную опухоль, средний радиус которой равен 1.79900000e+01.

Загрузив данные, можно начать работу над классификатором.

3: Систематизация данных в наборы

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

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

Модуль sklearn предоставляет функцию train_test_split(), которая автоматически разделит данные на два набора.

...
from sklearn.model_selection import train_test_split
# Split our data
train, test, train_labels, test_labels = train_test_split(features,
labels,
test_size=0.33,
random_state=42)

Функция случайным образом разбивает данные с помощью параметра test_size. Теперь у вас есть тестовый набор (test), который представляет 33% от исходного набора данных. Оставшиеся данные (train) составляют тренировочный набор. Также теперь есть соответствующие метки как для переменных train_labels и test_labels

4: Сборка и оценка модели

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

Импортируйте модуль GaussianNB. Инициализируйте модель с помощью функции GaussianNB(), а затем потренируйте модель, применив ее к данным с помощью gnb.fit():

...
from sklearn.naive_bayes import GaussianNB
# Initialize our classifier
gnb = GaussianNB()
# Train our classifier
model = gnb.fit(train, train_labels)

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

Используйте функцию predict() в наборе test и отобразите результат:

...
# Make predictions
preds = gnb.predict(test)
print(preds)

Запустите код.

В выводе Jupyter Notebook вы увидите, что функция predict() возвращает массив из 0 и 1, которые представляют предсказанные программой результаты.

5: Оценка точности модели

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

...
from sklearn.metrics import accuracy_score
# Evaluate accuracy
print(accuracy_score(test_labels, preds))

Судя по результатам, данный классификатор NB имеет точность 94,15%. Это означает, что 94,15% ситуаций он оценивает правильно и может предсказать результат.

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

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
# Load dataset
data = load_breast_cancer()
# Organize our data
label_names = data['target_names']
labels = data['target']
feature_names = data['feature_names']
features = data['data']
# Look at our data
print(label_names)
print('Class label = ', labels[0])
print(feature_names)
print(features[0])
# Split our data
train, test, train_labels, test_labels = train_test_split(features,
labels,
test_size=0.33,
random_state=42)
# Initialize our classifier
gnb = GaussianNB()
# Train our classifier
model = gnb.fit(train, train_labels)
# Make predictions
preds = gnb.predict(test)
print(preds)
# Evaluate accuracy
print(accuracy_score(test_labels, preds))

Теперь вы можете продолжить работу с этим кодом и усложнить свой классификатор. Вы можете экспериментировать с различными подмножествами функций или попробовать другие алгоритмы. Больше идей машинного обучения можно найти на сайте Scikit-learn.

Tags: , ,