Начало работы#

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

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

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

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

Вот простой пример, где мы обучаем 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]  # classes of each sample
>>> clf.fit(X, y)
RandomForestClassifier(random_state=0)

The fit метод обычно принимает 2 входа:

  • Матрица образцов (или матрица плана) X. Размер X обычно (n_samples, n_features), что означает, что образцы представлены строками, а признаки представлены столбцами.

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

Оба X и y обычно ожидаются в виде массивов NumPy или эквивалентных структур array-like типы данных, хотя некоторые оценщики работают с другими форматами, такими как разреженные матрицы.

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

>>> clf.predict(X)  # predict classes of the training data
array([0, 1])
>>> clf.predict([[4, 5, 6], [14, 15, 16]])  # predict classes of new data
array([0, 1])

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

Трансформеры и препроцессоры#

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

В scikit-learn, предобработчики и преобразователи следуют тому же API, что и объекты оценщиков (они фактически все наследуются от одного и того же BaseEstimator класс). Объекты трансформеров не имеют predict метод, а скорее преобразовать метод, который выводит новую преобразованную матрицу выборок 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
...
>>> # create a pipeline object
>>> pipe = make_pipeline(
...     StandardScaler(),
...     LogisticRegression()
... )
...
>>> # load the iris dataset and split it into train and test sets
>>> X, y = load_iris(return_X_y=True)
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
...
>>> # fit the whole pipeline
>>> pipe.fit(X_train, y_train)
Pipeline(steps=[('standardscaler', StandardScaler()),
                ('logisticregression', LogisticRegression())])
>>> # we can now use it like any other estimator
>>> accuracy_score(pipe.predict(X_test), y_test)
0.97...

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

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

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

>>> 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)  # defaults to 5-fold CV
>>> result['test_score']  # r_squared score is high because dataset is easy
array([1., 1., 1., 1., 1.])

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

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

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

>>> from sklearn.datasets import make_regression
>>> from sklearn.ensemble import RandomForestRegressor
>>> from sklearn.model_selection import RandomizedSearchCV
>>> from sklearn.model_selection import train_test_split
>>> from scipy.stats import randint
...
>>> # create a synthetic dataset
>>> X, y = make_regression(n_samples=20640,
...                        n_features=8,
...                        noise=0.1,
...                        random_state=0)
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
...
>>> # define the parameter space that will be searched over
>>> param_distributions = {'n_estimators': randint(1, 5),
...                        'max_depth': randint(5, 10)}
...
>>> # now create a searchCV object and fit it to the data
>>> 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}

>>> # the search object now acts like a normal random forest estimator
>>> # with max_depth=9 and n_estimators=4
>>> search.score(X_test, y_test)
0.84...

Примечание

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

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

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

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

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

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