- 什么是 skearn? 管道?-管道?

我不知道 sklearn.pipeline.Pipeline是怎么工作的。

医生中有一些解释,例如:

具有最终估计的变换流水线。

为了让我的问题更清楚,什么是 steps? 它们是如何工作的?

剪辑

多亏了这些答案,我的问题才变得更加清晰:

当我调用流水线并将两个变压器和一个估计器作为步骤传递时,例如:

pipln = Pipeline([("trsfm1",transformer_1),
("trsfm2",transformer_2),
("estmtr",estimator)])

我打电话的时候会发生什么?

pipln.fit()
OR
pipln.fit_transform()

我想不出一个评估者如何能成为一个变压器以及如何安装一个变压器。

98720 次浏览

我认为默克哈维的想法是对的。Scikit-learn 的管道类是一个有用的工具,可以将多个不同的转换器和一个估计器封装到一个对象中,这样您只需要调用一次重要的方法(fit()predict()等)。让我们分解两个主要组成部分:

  1. Transformers 是同时实现 fit()transform()的类。您可能熟悉一些 sklearn 预处理工具,比如 TfidfVectorizerBinarizer。如果您查看这些预处理工具的文档,您将看到它们实现了这两种方法。我觉得非常酷的是,一些估计器也可以用作转换步骤,例如 LinearSVC

  2. Estimators 是同时实现 fit()predict()的类。您会发现许多分类器和回归模型都实现了这两种方法,因此您可以轻松地测试许多不同的模型。可以使用另一个转换器作为最终估计器(即,它不一定实现 predict(),但肯定实现 fit())。所有这些意味着你不能调用 predict()

至于您的编辑: 让我们来看一个基于文本的示例。使用 LabelBinarizer,我们希望将标签列表转换为二进制值列表。

bin = LabelBinarizer()  #first we initialize


vec = ['cat', 'dog', 'dog', 'dog'] #we have our label list we want binarized

现在,当二进制器被安装在一些数据上时,它将有一个称为 classes_的结构,其中包含变压器“知道”的唯一类。如果不调用 fit(),二进制数据库就不知道数据是什么样的,所以调用 transform()没有任何意义。如果在试图适应数据之前打印出类的列表,那么就会出现这种情况。

print bin.classes_

在尝试这种方法时,我会得到以下错误:

AttributeError: 'LabelBinarizer' object has no attribute 'classes_'

但是当你在 vec列表中放置二进制数据时:

bin.fit(vec)

再试一次

print bin.classes_

我得到了以下信息:

['cat' 'dog']




print bin.transform(vec)

现在,在 vec对象上调用转换之后,我们得到以下结果:

[[0]
[1]
[1]
[1]]

至于作为变换器使用的估计器,让我们使用 DecisionTree分类器作为一个特征提取器的例子。决策树之所以伟大有很多原因,但就我们的目的而言,重要的是它们能够对 发现的有用于预测的特征进行排序。当您在决策树上调用 transform()时,它将获取您的输入数据并找出 认为最重要的特性。因此,可以考虑将数据矩阵(n 行 × m 列)转换为更小的矩阵(n 行 × k 列) ,其中 k 列是决策树发现的最重要的特性。

Scikit-learn 中的 former -一些具有 fit 和转换方法的类,或 fit _ change 方法。

预测器 -一些具有拟合和预测方法或拟合 _ 预测方法的类。

管道 只是一个抽象的概念,不是现有的 ml 算法。在机器学习任务中,在应用最终估计器之前,通常需要对原始数据集执行一系列不同的转换(找到一组特性,生成新特性,只选择一些好的特性)。

这里 是管道使用的一个很好的例子。 流水线为所有3个转换步骤和结果估计器提供了一个单一接口。它将转换器和预测器封装在内部,现在您可以执行以下操作:

    vect = CountVectorizer()
tfidf = TfidfTransformer()
clf = SGDClassifier()


vX = vect.fit_transform(Xtrain)
tfidfX = tfidf.fit_transform(vX)
predicted = clf.fit_predict(tfidfX)


# Now evaluate all steps on test set
vX = vect.fit_transform(Xtest)
tfidfX = tfidf.fit_transform(vX)
predicted = clf.fit_predict(tfidfX)

只要:

pipeline = Pipeline([
('vect', CountVectorizer()),
('tfidf', TfidfTransformer()),
('clf', SGDClassifier()),
])
predicted = pipeline.fit(Xtrain).predict(Xtrain)
# Now evaluate all steps on test set
predicted = pipeline.predict(Xtest)

通过管道,您可以轻松地对这个元估计器的每个步骤的一组参数执行网格搜索。如上面的链接所述。除最后一步外,所有步骤都必须是变换,最后一步可以是变换器或预测器。 回答编辑 : 当你调用 pipln.fit()-每个变压器内的管道将安装在以前的变压器输出(第一个变压器是在原始数据集学习)。最后一个估计器可以是变换器或者预测器,只有当你的最后一个估计器是变换器(实现了适合变换,或者分别进行变换和拟合方法)时,你才能在管道上调用 fit _ change () ,只有当你的最后一个估计器是预测器时,你才能在管道上调用 fit _ 預()或者预测()。因此,不能在管道上调用 fit _ change 或转换,管道的最后一步是预测器。

ML 算法通常处理表格数据。您可能希望在 ML 算法之前和之后对这些数据进行预处理和后处理。管道是将这些数据处理步骤链接起来的一种方法。

什么是 ML 管道,它们是如何工作的?

管道是转换数据的一系列步骤。它来自于旧的“管道和过滤器”设计模式(例如,您可以想到具有管道“ |”或重定向操作符“ >”的 unix bash 命令)。但是,管道是代码中的对象。因此,可以为每个过滤器(也称为每个管道步骤)创建一个类,然后再创建一个类将这些步骤组合到最终的管道中。有些管道可以串联或并联其他管道,有多个输入或输出,等等。我们认为 流水线式机器学习是:

Scikit-Learning 管道的方法

管道(或管道中的步骤):

  • 合身”对数据进行学习并获取状态(例如: 神经网络的神经权值就是这样的状态)
  • 变形”(或“预测”)来实际处理数据并生成预测。

也可以调用这个方法将两者链接起来:

  • 拟合变换”来适应然后转换数据,但在一个通道,这允许潜在的代码优化时,这两个方法必须一个接一个直接完成。

管道类的问题

Scikit-Learning 的“管道和过滤器”设计模式简直美极了。但是如何将其用于深度学习、 AutoML 和复杂的生产级管道呢?

Scikit-Learning 在2007年发布了第一个版本,是 前深度学习时代。然而,它是最著名和最被采用的机器学习库之一,并且还在不断发展。最重要的是,它使用管道和过滤器设计模式作为一种软件架构风格-这使得 Scikit-Learning 如此神话般,并且提供了准备使用的算法。然而,在开展以下工作方面存在大量问题,我们在2020年就应该能够做到这一点:

  • 自动机器学习(AutoML) ,
  • 深度学习管道,
  • 更复杂的机器学习管道。

我们发现的解决 Scikit-Learning 问题的方法

当然,Scikit-Learning 是非常方便和完善的。但是,它需要刷新。这里是我们的解决方案与 神经轴使 Scikit-学习新鲜和可用的现代计算项目!

通过 神经轴提供的其他流水线方法和特性

注意: 如果管道的一个步骤不需要其中一个 fit 或转换方法,那么它可以从 NonFittableMixin非转换混合继承,并提供其中一个方法的默认实现,不执行任何操作。

作为启动器,管道或它们的步骤也可能是 可选地定义这些方法:

  • 设计”,它将在每个步骤中调用“ setup”方法。例如,如果一个步骤包含一个 TensorFlow、 PyTorch 或 Kera 神经网络,这些步骤可以创建它们的神经图,并在适合之前在“ setup”方法中将它们注册到 GPU。不建议在步骤的构造函数中直接创建图表,原因有几个,比如在自动机器学习算法中使用不同的超参数多次运行之前,如果步骤被复制,该算法会为您搜索最佳超参数。
  • 拆除”,与“ setup”方法相反: 它清除资源。

默认情况下提供以下方法允许管理超参数:

  • 得到高分泌物”将返回超参数的字典。如果管道包含更多管道(嵌套管道) ,则超参数的键使用双下划线“ _ _”分隔符进行链接。
  • Set _ hyperparams”将允许您以获取超参数时的相同格式设置新的超参数。
  • 获得超参数空间”允许您获得超参数的空间,如果您定义了一个超参数,它将不是空的。因此,这里与“ get _ hyperparams”的唯一区别是,您将获得统计分布值,而不是精确的值。例如,层数的一个超参数可以是 RandInt(1, 3),它意味着1到3层。您可以调用 .rvs()对这个结构随机挑选一个值,并将其发送到“ set _ hyperparams”,以尝试对其进行训练。
  • Set _ hyperparams _ space”可以使用与“ get _ hyperparams _ space”中相同的超参数分布类来设置新空间。

要了解更多关于我们建议的解决方案的信息,请阅读以上链接的大列表中的条目。

    from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.preprocessing import StandardScaler
from sklearn import metrics
import pandas as pd


class TextTransformer(BaseEstimator, TransformerMixin):
"""
Преобразование текстовых признаков
"""
def __init__(self, key):
self.key = key


def fit(self, X, y=None, *parg, **kwarg):
return self


def transform(self, X):
return X[self.key]
    



class NumberTransformer(BaseEstimator, TransformerMixin):
"""
Преобразование числовых признаков
"""
def __init__(self, key):
self.key = key


def fit(self, X, y=None):
return self


def transform(self, X):
return X[[self.key]]






def fit_predict(model, X_train, X_test, y_train, y_test):
vec_tdidf = TfidfVectorizer(ngram_range=(2,2), analyzer='word', norm='l2')
    

text = Pipeline([
('transformer', TextTransformer(key='clear_messages')),
('vectorizer', vec_tdidf)
])
word_numeric = Pipeline([
('transformer', NumberTransformer(key='word_count')),
('scalar', StandardScaler())
])
word_class = Pipeline([
('transformer', NumberTransformer(key='preds')),
('scalar', StandardScaler())
])
# Объединение всех признаков
features = FeatureUnion([('Text_Feature', text),
('Num1_Feature', word_numeric),
('Num2_Feature', word_class)
])
    

# Классификатор
clf = model
    

# Объединение классификатора и признаков
pipe = Pipeline([('features', features),
('clf',clf)
])
    

# Обучение модели
pipe_fit=pipe.fit(X_train, y_train)
    

# Предсказание данных
preds = pipe_fit.predict(X_test)
    

return preds, pipe_fit