Это 12-й день моего участия в ноябрьском испытании обновлений. Узнайте подробности события:Вызов последнего обновления 2021 г.
Зачем нужен трубопровод?
При разработке ежедневных проектов машинного обучения могут возникать такие процессы, как масштабирование данных, комбинирование функций, обучение и подгонка моделей, а когда задача становится более сложной, применяются более сложные алгоритмы и модели.
В то же время, при условии игнорирования некоторых деталей, весь процесс машинного обучения можно выполнить более эффективно, объединив эти этапы обработки данных в цепочку алгоритмов;
Что такое трубопровод?
В sklearn так называемый конвейер — это цепочка обработки, состоящая из ряда шагов преобразования данных или подгоняемой модели (если есть, модель должна быть в конце конвейера).
Каковы преимущества трубопровода?
Pipeline в sklearn имеет следующие замечательные применения:
- Удобство и инкапсуляция: прямой вызов методов подгонки и прогнозирования для обучения и прогнозирования всех моделей алгоритмов в конвейере.
- Совместный выбор параметров. Вы можете выбрать параметры всех средств оценки в конвейере с помощью поиска по сетке (метод настройки параметров).
- Безопасность: одни и те же образцы используются для обучения преобразователя и предиктора, а конвейер помогает предотвратить утечку статистики из тестовых данных в обученную модель с перекрестной проверкой.
Принцип трубопровода
Конвейер может объединить множество алгоритмических моделей, чтобы сформировать типичный рабочий процесс для задач машинного обучения.
Механизм конвейерной обработки подобен подключению всех моделей к трубе, а затем обработке данных по очереди для получения окончательного результата классификации.
Например, модель 1 может быть процессом стандартизации данных, модель 2 может быть моделью выбора признаков или моделью извлечения признаков, а модель 3 может быть моделью классификатора или модели прогнозирования (модель не обязательно должна состоять из трех, в соответствии с вашими фактическими потребностями). ), как показано на следующем рисунке.
В sklearn все оценщики, кроме последнего в конвейере, должны быть преобразователями.Последний оценщик может быть любого типа (преобразователь, классификатор, регрессор).Если последний оценщик (оценщик) является классификатором, можно использовать весь конвейер. в качестве классификатора, и если последняя оценка является регрессором, весь конвейер может использоваться в качестве регрессора.
Примечание:
- Оценщик: Оценщик, все модели алгоритмов машинного обучения называются оценщиками.
- Преобразователь: Преобразователь, такой как нормализация. Выход преобразователя можно поместить в другой преобразователь или оценщик в качестве входных данных.
Полный пример Pipeline в шагах sklearn выглядит следующим образом:
- Во-первых, предварительно обработайте данные, например, обработайте пропущенные значения.
- нормализация данных
- Снижение размерности
- Алгоритм выбора признаков
- Алгоритм классификации или предсказания или кластеризации (оценщик, оценщик)
По сути, подгоночный метод конвейера призван обработать признаки с первыми n-1 преобразователями, а затем передать их окончательному оценщику для обучения. Конвейер наследует все методы последней оценки.
Использование конвейера в sklearn
sklearn.pipeline.Pipeline(steps, memory=None, verbose=False)
Детали параметра:
-
steps
: шаги, построенные с использованием списка (ключ, значение), где ключ — это имя, которое вы дали шагу, а значение — объект оценщика. -
memory
: Параметр памяти. Когда вам нужно сохранить «трансформер» в середине конвейера, вам нужно использовать параметр памяти. По умолчанию — None.
Методы класса Pipeline
Методы Pipeline должны выполнять соответствующий метод в каждом учащемся, если у учащегося нет этого метода, будет сообщено об ошибке.
Предположим, что в конвейере всего n учеников:
- Преобразование: выполнение метода преобразования каждого ученика по очереди.
- fit: последовательно выполнить методы подгонки и преобразования для первых n-1 учащихся и выполнить метод подгонки для n-го учащегося (последнего учащегося).
- предсказать: выполнить метод предсказания n-го ученика.
- оценка: выполнить метод оценки n-го ученика.
- set_params: установить параметры n-го ученика.
- get_param: Получить параметр n-го ученика.
Дело о трубопроводе
Преобразование модульных функций
Инструкции по шагам:
- Шаг 1. Сначала используйте StandardScaler для стандартизации каждого столбца набора данных (преобразователя).
- Шаг 2: Затем используйте анализ основных компонентов PCA, чтобы уменьшить размер элемента (трансформатор),
- Шаг 3: Наконец, используйте модель SVC для классификации (оценщик).
То, что обучается, является моделью, которую можно получить путемpipe.predict(X)
Он непосредственно используется для прогнозирования.При прогнозировании данные будут преобразованы с начала шага, что позволяет избежать необходимости написания дополнительного кода для данных, используемых моделью для прогнозирования. также черезpipe.score(X,Y)
Получите правильную скорость этой модели на тренировочном наборе X.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
iris=load_iris()
pipe=Pipeline([('sc', StandardScaler()),('pca',PCA()),('svc',SVC())])
# ('sc', StandardScaler()) sc为自定义转换器名称, StandardScaler()为执行标准化任务的转换器
pipe.fit(iris.data, iris.target)
# 预测
print(pipe.predict(iris.data))
# 评估模型的分数(准确率)
print(pipe.score(iris.data, iris.target))
результат операции:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 2 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
0.9733333333333334
Кроме того, мы также можем использоватьmake_pipeline
функция, это простая реализация класса Pipeline, вам нужно только передать экземпляр класса каждого шага, вам не нужно называть его самостоятельно, он автоматически устанавливает нижний регистр класса для имени шага.
from sklearn.pipeline import make_pipeline
from sklearn.naive_bayes import GaussianNB
make_pipeline(StandardScaler(),GaussianNB())
результат операции:
Pipeline(steps=[('standardscaler', StandardScaler()),
('gaussiannb', GaussianNB())])
Автоматический поиск по сетке
Конвейер также можно комбинировать с GridSearch для выбора параметров.
Инструкции по шагам:
- Шаг 1: Сначала используйте TfidfVectorizer для извлечения признаков.
- Шаг 2: Затем используйте модель SVC для классификации.
- Шаг 3: Наконец, выполните поиск по сетке с перекрестной проверкой через GridSearchCV.
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
import numpy as np
# 下载数据
news = fetch_20newsgroups(subset='all')
# 切分数据集
X_train,X_test,y_train,y_test = train_test_split(news.data[:3000],news.target[:3000],test_size=0.25,random_state=33)
# 文本特征抽取
vec = TfidfVectorizer()
X_count_train = vec.fit_transform(X_train)
X_count_test = vec.transform(X_test)
# 使用pipeline简化系统搭建流程,将文本抽取与分类器模型串联起来
clf = Pipeline([('vect',TfidfVectorizer(stop_words='english')),('svc',SVC())])
# 这里经pipeline进行特征处理、SVC模型训练之后,得到的直接就是训练好的分类器clf
parameters = {
'svc__gamma': np.logspace(-2,1,4),
'svc__C': np.logspace(-1,1,3),
'vect__analyzer': ['word']
}
# GridSearchCV使用交叉验证进行网格搜索,其中,n_jobs=-1代表使用计算机的全部CPU
gs = GridSearchCV(clf, parameters, verbose=2, refit=True, cv=3, n_jobs=-1)
gs.fit(X_train,y_train)
# 通过交叉验证获取最好的超参数和模型评估最好的分数
print (gs.best_params_, '---',gs.best_score_)
# 评估最好的模型的分数(准确率)
print (gs.score(X_test, y_test))
результат операции:
Fitting 3 folds for each of 12 candidates, totalling 36 fits
{'svc__C': 10.0, 'svc__gamma': 0.1, 'vect__analyzer': 'word'} --- 0.7888888888888889
0.8226666666666667
Видно, что ключи в переменной параметров имеют префикс, нетрудно обнаружить, что этот префикс на самом деле является именем операции, определенной в Pipeline. Сочетание этих двух элементов делает наш код очень лаконичным.
Примечание о поиске по сетке:
Поиск по сетке — это метод настройки, который выполняет исчерпывающий поиск в списке параметров, обучает каждый случай нахождению оптимальных параметров; видно, что основным недостатком этого метода является его трудоемкость, и чем больше параметров, тем чем больше значений-кандидатов, тем больше времени требуется! Поэтому в основном сначала задается большой диапазон, а потом уточняется.
Комбинация функций
FeatureUnion
Объединяет несколько преобразователей в новый объект-преобразователь.Во время подбора каждый преобразователь подбирает данные независимо, параллельно, а матрицы выходных признаков располагаются рядом в большой матрице.
Объект FeatureUnion принимает список объектов преобразования.FeatureUnion
Может иPipeline
используется в комбинации.
Уведомление:
FeatureUnion не может проверить, выдают ли два преобразователя один и тот же вывод признаков, он просто создает набор векторов признаков, которые изначально были отделены друг от друга. Вызывающий должен убедиться, что он производит другой вывод функции.
Инструкции по шагам:
- Шаг 1: Выполните обработку объектов с помощью StandardScaler и FunctionTransformer соответственно.
- Шаг 2: Затем объедините функции, обработанные StandardScaler, с функциями, обработанными FunctionTransformer.
from sklearn.pipeline import FeatureUnion
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import FunctionTransformer
from numpy import log1p
# 原始矩阵数据形状
print(iris.data.shape)
step1=('Standar', StandardScaler())
step2=('ToLog', FunctionTransformer(log1p))
steps=FeatureUnion(transformer_list=[step1,step2])
print(steps)
data=steps.fit_transform(iris.data)
# 经过特征组合之后的矩阵数据形状
print(data.shape)
# 查看第一行数据
print(data[0])
результат операции:
(150, 4)
FeatureUnion(transformer_list=[('Standar', StandardScaler()),
('ToLog',
FunctionTransformer(func=<ufunc 'log1p'>))])
(150, 8)
[-0.90068117 1.01900435 -1.34022653 -1.3154443 1.80828877 1.5040774
0.87546874 0.18232156]