Быстрый старт

Цель этого руководства — проиллюстрировать некоторые из основных функций, которые предоставляет scikit-learn . Он предполагает очень базовые практические знания методов машинного обучения (подбор модели, прогнозирование, перекрестная проверка и т. д.). Пожалуйста, обратитесь к инструкциям по установке для установки scikit-learn.

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

Обучение и предсказание: основы оценки

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

Вот простой пример, где мы обучаем RandomForestClassifier по некоторым очень простым данным:

>>> from sklearn.ensemble import RandomForestClassifier
>>> clf = RandomForestClassifier(random_state=0) 
>>> X = [[ 1,  2,  3],  # 2 записи (samples), 3 признака (features)
...      [11, 12, 13]]
>>> y = [0, 1]  # класс для каждой записи (для первой записи 0, для второй 1)
>>> clf.fit(X, y) # обучение
RandomForestClassifier(random_state=0)

Метод обучения (fit) обычно принимает 2 параметра:

  • Матрица признаков X . Размер X обычно равен (n_samples, n_features), что означает, что выборки представлены в виде строк, а объекты представлены в виде столбцов.
  • Целевые значения y, которые являются действительными числами для задач регрессии или целыми числами для классификации (или любым другим дискретным набором значений). Для задач обучения без учителя указывать не нужно. y обычно представляет собой одномерный массив, где i-ый элемент соответствует целевому значению i-ой записи (строки) X.

Преобразователи и препроцессоры 

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

В scikit-learn, препроцессоры и преобразователи (transformers) следуют тому же API, что и объекты оценки (фактически все они наследуются от одного и того же BaseEstimator класса). Объекты-преобразователи не имеют метода прогнозирования , а имеют метод преобразования , который выводит недавно преобразованную матрицу выборки X:

>>> from sklearn.preprocessing import StandardScaler
>>> X = [[0, 15],
...      [1, -10]]
>>> # scale data according to computed scaling values
>>> StandardScaler().fit(X).transform(X)
array([[-1.,  1.],
       [ 1., -1.]])

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

Конвейеры: связывание препроцессоров и оценщиков 

Преобразователи и оценщики (предикторы) могут быть объединены в единый объединяющий объект: Pipeline. Конвейер предлагает тот же API, что и обычный оценщик: его можно настроить и использовать для прогнозирования с помощью fit и predict. Как мы увидим позже, использование конвейера также предотвратит утечку данных, то есть раскрытие некоторых данных тестирования в ваших обучающих данных.

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

>>> from sklearn.preprocessing import StandardScaler
>>> from sklearn.linear_model import LogisticRegression
>>> from sklearn.pipeline import make_pipeline
>>> from sklearn.datasets import load_iris
>>> from sklearn.model_selection import train_test_split
>>> from sklearn.metrics import accuracy_score
...
>>> # создание конвеера (pipeline)
>>> pipe = make_pipeline(
...     StandardScaler(),
...     LogisticRegression()
... )
...
>>> # загрузка датасета Ирис и разделение на тестовю и обучающую выборку
>>> X, y = load_iris(return_X_y=True)
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
...
>>> # обучение с использованием пайплайна
>>> pipe.fit(X_train, y_train)
Pipeline(steps=[('standardscaler', StandardScaler()),
                ('logisticregression', LogisticRegression())])
>>> # проверяем оценку с помощью accuracy_score оценки на тестовых данных
>>> accuracy_score(pipe.predict(X_test), y_test)
0.97...

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

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

Здесь мы кратко покажем, как выполнить 5-кратную процедуру перекрестной проверки с помощью метода cross_validate. Обратите внимание, что также можно вручную перебирать части данных (фолды — folds), использовать различные стратегии разделения данных и использовать пользовательские функции оценки. Пожалуйста, обратитесь к нашему Руководству пользователя для более подробной информации:

>>> from sklearn.datasets import make_regression
>>> from sklearn.linear_model import LinearRegression
>>> from sklearn.model_selection import cross_validate
...
>>> X, y = make_regression(n_samples=1000, random_state=0)
>>> lr = LinearRegression()
...
>>> result = cross_validate(lr, X, y)  # по умолчанию разбивается на 5 фолдов
>>> result['test_score']  # оценка r-квадрат
array([1., 1., 1., 1., 1.])

Автоматический подбор параметров 

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

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

>>> from sklearn.datasets import fetch_california_housing
>>> from sklearn.ensemble import RandomForestRegressor
>>> from sklearn.model_selection import RandomizedSearchCV
>>> from sklearn.model_selection import train_test_split
>>> from scipy.stats import randint
...
>>> X, y = fetch_california_housing(return_X_y=True)
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
...
>>> # указывает набор параметров, которые будут использованы
>>> param_distributions = {'n_estimators': randint(1, 5),
...                        'max_depth': randint(5, 10)}
...
>>> # создание search объекта, и обучение на тренировочных данных
>>> search = RandomizedSearchCV(estimator=RandomForestRegressor(random_state=0),
...                             n_iter=5,
...                             param_distributions=param_distributions,
...                             random_state=0)
>>> search.fit(X_train, y_train)
RandomizedSearchCV(estimator=RandomForestRegressor(random_state=0), n_iter=5,
                   param_distributions={'max_depth': ...,
                                        'n_estimators': ...},
                   random_state=0)
>>> search.best_params_
{'max_depth': 9, 'n_estimators': 4}

>>> # наилучшие параметры оказались - max_depth=9 and n_estimators=4
>>> search.score(X_test, y_test)
0.73...

Примечание

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

Использование конвейера для перекрестной проверки и поиска в значительной степени убережет вас от этой распространенной ловушки.

Следующие шаги 

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

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

Вы также можете ознакомиться с нашими многочисленными примерами , иллюстрирующими использование scikit-learn в различных контекстах.