Начало работы с Scikit-learn в 5 шагах

Начало работы с Scikit-learn в 5 шагах' - 'Getting Started with Scikit-learn in 5 Steps

Введение в Scikit-learn

 

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

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

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

Scikit-learn – это популярная библиотека машинного обучения с открытым исходным кодом на языке Python. Некоторые ключевые причины ее широкого использования включают:

  • Простые и эффективные инструменты для анализа и моделирования данных
  • Доступность для программистов на языке Python с акцентом на ясность
  • Основана на библиотеках NumPy, SciPy и matplotlib для более простой интеграции
  • Широкий спектр алгоритмов для задач, таких как классификация, регрессия, кластеризация, сокращение размерности

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

 

Шаг 1: Начало работы с Scikit-learn

 

Установка и настройка

 

Для установки и использования Scikit-learn в вашей системе должна быть функционирующая установка Python. Мы не будем рассматривать это здесь, но предположим, что у вас на данный момент есть функционирующая установка.

Scikit-learn может быть установлен с помощью pip, менеджера пакетов Python:

pip install scikit-learn

 

Это также установит все необходимые зависимости, такие как NumPy и SciPy. После установки Scikit-learn может быть импортирован в ваши скрипты Python следующим образом:

import sklearn

 

Проверка установки

 

После установки вы можете запустить интерпретатор Python и выполнить вышеприведенную команду импорта.

Python 3.10.11 (main, May 2 2023, 00:28:57) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sklearn

 

Пока вы не увидите никаких сообщений об ошибках, вы готовы начать использовать Scikit-learn!

 

Загрузка образцовых наборов данных

 

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

from sklearn import datasets

iris = datasets.load_iris()
digits = datasets.load_digits()

 

Набор данных digits содержит изображения рукописных цифр вместе с их метками. Мы можем начать знакомиться с Scikit-learn, используя эти образцовые наборы данных, прежде чем перейти к реальным данным.

 

Шаг 2: Предварительная обработка данных

 

Важность предварительной обработки данных

 

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

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

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

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

 

Загрузка и понимание данных

 

Давайте загрузим образец набора данных с помощью Scikit-learn для демонстрации:

from sklearn.datasets import load_iris
iris_data = load_iris()

 

Мы можем изучить характеристики и целевые значения:

print(iris_data.data[0]) # Значение характеристик для первого образца
print(iris_data.target[0]) # Значение целевой переменной для первого образца

 

Перед продолжением работы следует понять смысл характеристик и целевой переменной.

 

Очистка данных

 

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

from sklearn.impute import SimpleImputer

imputer = SimpleImputer(strategy='mean')  
imputed_data = imputer.fit_transform(iris_data.data)

 

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

 

Масштабирование признаков

 

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

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaled_data = scaler.fit_transform(iris_data.data)

 

StandardScaler стандартизирует признаки, устанавливая среднее значение 0 и дисперсию 1. Другие методы масштабирования также доступны.

 

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

 

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

import matplotlib.pyplot as plt
plt.scatter(iris_data.data[:, 0], iris_data.data[:, 1], c=iris_data.target)
plt.xlabel('Длина чашелистика')
plt.ylabel('Ширина чашелистика')
plt.show()

 

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

 

Шаг 3: Выбор модели и обучение

 

Обзор алгоритмов Scikit-learn

 

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

  • Классификация: логистическая регрессия, SVM, наивный байесовский классификатор, деревья решений, случайный лес
  • Регрессия: линейная регрессия, SVR, деревья решений, случайный лес
  • Кластеризация: k-средних, DBSCAN, агломеративная кластеризация

Вместе с многими другими.

 

Выбор алгоритма

 

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

  • Размер и тип данных, доступных для обучения. Это малый или большой набор данных? Какие типы признаков он содержит – изображения, текст, числовые значения?
  • Наличие вычислительных ресурсов. Алгоритмы различаются по вычислительной сложности. Простые линейные модели обучаются быстрее, чем глубокие нейронные сети.
  • Конкретная проблема, которую мы хотим решить. Мы решаем задачу классификации, регрессии, кластеризации или что-то более сложное?
  • Любые специальные требования, такие как необходимость интерпретируемости. Линейные модели более интерпретируемы, чем черные ящики.
  • Желаемая точность/производительность. Некоторые алгоритмы просто работают лучше, чем другие в определенных задачах.

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

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

 

Обучение простой модели

 

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

from sklearn.linear_model import LogisticRegression

model = LogisticRegression()
model.fit(scaled_data, iris_data.target)

 

Вот и все! Модель обучена и готова для оценки и использования.

 

Обучение более сложной модели

 

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

from sklearn.ensemble import RandomForestClassifier

rf_model = RandomForestClassifier(n_estimators=100) 
rf_model.fit(scaled_data, iris_data.target)

 

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

Однако стоит отметить, что независимо от того, используем ли мы простой или более сложный алгоритм для обучения модели, синтаксис Scikit-learn позволяет использовать один и тот же подход, что существенно упрощает процесс обучения. Фактически, почти каждая задача с использованием этой библиотеки может быть выражена с помощью парадигмы fit/transform/predict.

 

Шаг 4: Оценка модели

 

Важность оценки

 

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

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

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

 

Разделение на обучающую и тестовую выборки

 

Мы разделяем данные для оценки производительности модели на новых данных:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(scaled_data, iris_data.target)

 

По соглашению, X обозначает признаки, а y – целевую переменную. Обратите внимание, что y_test и iris_data.target – это разные способы ссылаться на одни и те же данные.

 

Метрики оценки

 

Для классификации ключевые метрики включают:

  • Точность: Общая пропорция правильных предсказаний
  • Точность: Пропорция положительных предсказаний, которые являются действительными положительными значениями
  • Полнота: Пропорция действительных положительных значений, предсказанных положительно

Эти метрики могут быть вычислены с помощью отчета о классификации Scikit-learn:

from sklearn.metrics import classification_report

print(classification_report(y_test, model.predict(X_test)))

 

Это дает нам представление о производительности модели.

 

Шаг 5: Улучшение производительности

 

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

 

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

from sklearn.model_selection import GridSearchCV

params = {'C': [0.1, 1, 10]}
grid_search = GridSearchCV(model, params, cv=5)
grid_search.fit(scaled_data, iris_data.target)

 

Это создает сетку различных сил регуляризации для оптимизации точности модели.

 

Перекрестная проверка

 

Перекрестная проверка обеспечивает более надежную оценку гиперпараметров:

from sklearn.model_selection import cross_val_score

cross_val_scores = cross_val_score(model, scaled_data, iris_data.target, cv=5)

 

Она разбивает данные на 5 блоков и оценивает производительность на каждом из них.

 

Ансамблевые методы

 

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

from sklearn.ensemble import RandomForestClassifier

random_forest = RandomForestClassifier(n_estimators=100)
random_forest.fit(scaled_data, iris_data.target)

 

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

from sklearn.ensemble import VotingClassifier

voting_clf = VotingClassifier(estimators=[('lr', model), ('rf', random_forest)])
voting_clf.fit(scaled_data, iris_data.target)

 

Эта ансамблевая модель объединяет нашу ранее обученную модель логистической регрессии, обозначенную как lr, с вновь определенной моделью случайного леса, обозначенной как rf.

 

Модель стекинга и смешивания

 

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

# Обучение базовых моделей
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC

rf = RandomForestClassifier()
svc = SVC()

rf.fit(X_train, y_train)
svc.fit(X_train, y_train)

# Создание предсказаний для обучения мета-модели
rf_predictions = rf.predict(X_test)
svc_predictions = svc.predict(X_test)

# Создание набора данных для мета-модели
blender = np.vstack((rf_predictions, svc_predictions)).T
blender_target = y_test

# Обучение мета-модели на предсказаниях
from sklearn.ensemble import GradientBoostingClassifier

gb = GradientBoostingClassifier()
gb.fit(blender, blender_target)

# Предсказание финального результата
final_predictions = gb.predict(blender)

 

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

 

Движение вперед

 

Scikit-learn предоставляет обширный инструментарий для машинного обучения с использованием Python. В этом руководстве мы рассмотрели полный рабочий процесс машинного обучения с использованием Scikit-learn — от установки библиотеки и понимания ее возможностей до загрузки данных, обучения моделей, оценки производительности модели, настройки гиперпараметров и создания ансамблей. Библиотека стала чрезвычайно популярной благодаря своему хорошо спроектированному API, широте алгоритмов и интеграции с пакетом PyData. Scikit-learn дает пользователям возможность быстро и эффективно создавать модели и генерировать прогнозы, не утяжеляясь деталями реализации. С этим прочным фундаментом вы теперь можете практически применять машинное обучение к реальным проблемам, используя Scikit-learn. Следующий шаг состоит в определении задач, подходящих для техники машинного обучения, и использовании навыков, полученных в этом руководстве, для извлечения ценности.

Конечно, всегда есть больше, чтобы узнать о Scikit-learn, в частности, и о машинном обучении в общем. Библиотека реализует передовые алгоритмы, такие как нейронные сети, обучение на многообразиях и глубокое обучение с использованием своего API оценщика. Вы всегда можете расширить свою компетентность, изучая теоретические основы этих методов. Scikit-learn также интегрируется с другими библиотеками Python, такими как Pandas, для дополнительных возможностей манипулирования данными. Кроме того, продукт, такой как SageMaker, предоставляет платформу для внедрения моделей Scikit-learn в рамках работы на большом масштабе.

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

    Matthew Mayo (@mattmayo13) имеет степень магистра в области компьютерных наук и диплом по дата-майнингу. В качестве главного редактора VoAGI Мэтью стремится сделать сложные концепции науки о данных доступными. Его профессиональные интересы включают обработку естественного языка, алгоритмы машинного обучения и исследование новых методов искусственного интеллекта. Он движим миссией демократизации знаний в сообществе науки о данных. Мэтью начал программировать с 6 лет.