Быстрый старт ¶
Цель этого руководства — проиллюстрировать некоторые из основных функций, которые предоставляет 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
в различных контекстах.