Начало работы#
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 во многих различных контекстах, или посмотрите на Внешние ресурсы, видео и выступления для учебных материалов.