机器学习训练的PIPELINE机制

作者: 七喜酱子 | 来源:发表于2019-07-10 15:02 被阅读0次

    前言

    本文转载自微信公众号“数据鹰眼”,原作者 布鲁斯

    机器学习从Alpha go大火之后,很多测试同学都很感兴趣,作为机器学习开篇第一文,从pipeline讲起~~

    pipeline这个词,应该来自linux。在linux体系下的各种命令工具的处理,支持pipeline,即管道机制,例如:

    cat xxx | awk '{xxxx}' | sort | uniq

    这是一种良好的接口规范,工具的功能有公共的接口规范,就像流水线一样,一步接着一步。机器学习的处理过程,也可以是pipeline。实际上scikit-learn开发了整套的pipeline机制,并封装到 sklearn.pipline命名空间下面。

    首先,我们看看这个库都有什么:

    pipeline.FeatureUnion(transformer_list[, …]) Concatenates results of multiple transformer objects.
    pipeline.Pipeline(steps[, memory]) Pipeline of transforms with a final estimator.
    pipeline.make_pipeline(*steps, **kwargs) Construct a Pipeline from the given estimators.
    pipeline.make_union(*transformers, **kwargs) Construct a FeatureUnion from the given trans

    可以看出,最关键的是 FeatureUnion、Pipeline,我们继续看看这2个对象都可以实现什么功能。

    PIPELINE

    sklearn中把机器学习处理过程抽象为estimator,其中estimator都有fit方法,表示“喂”数据进行初始化or训练。estimator有2种:

    1、特征变换(transformer)
    可以理解为特征工程,即:特征标准化、特征正则化、特征离散化、特征平滑、onehot编码等。该类型统一由一个transform方法,用于fit数据之后,输入新的数据,进行特征变换。

    2、预测器(predictor)
    即各种模型,所有模型fit进行训练之后,都要经过测试集进行predict所有,有一个predict的公共方法。

    上面的抽象的好处即可实现机器学习的pipeline,显然特征变换是可能并行的,通过FeatureUnion实现。特征变换在训练集、测试集之间都需要统一,所以pipeline可以达到模块化的目的。举个NLP处理的例子:

    # 生成训练数据、测试数据
    X_train, X_test, y_train, y_test = train_test_split(X, y)

    # pipeline定义
    pipeline = Pipeline([
    ('vect', CountVectorizer()),
    ('tfidf', TfidfTransformer()),
    ('clf', RandomForestClassifier())
    ])

    # train classifier
    pipeline.fit(X_train, y_train)

    # predict on test data
    y_pred = pipeline.predict(X_test)

    显然,看起来好些训练过程只需要fit和predict,在pipeline内部传输过程,自动调用了fit\transform

    FEATUREUNION

    上面看到特征变换往往需要并行化处理,即FeatureUnion所实现的功能。直接看例子:

    pipeline = Pipeline([
    ('features', FeatureUnion([
    ('text_pipeline', Pipeline([
    ('vect', CountVectorizer(tokenizer=tokenize)),
    ('tfidf', TfidfTransformer())
    ])),
    ('findName', FineNameExtractor())
    ])),

    ('clf', RandomForestClassifier())
    ])

    看起来,pipeline还可以嵌套pipeline,整个机器学习处理流程就像流水工人一样。上面自定义了一个pipeline处理对象FineNameExtractor,该对象是transformer,自定义一个transformer是很简单的,创建一个对象,继承自BaseEstimator, TransformerMixin即可,直接上代码:

    from sklearn.base import BaseEstimator, TransformerMixin
    class FineNameExtractor(BaseEstimator, TransformerMixin):

    def find_name(self, text):
    return True

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

    def transform(self, X):
    X_tagged = pd.Series(X).apply(self.find_name)
    return pd.DataFrame(X_tagged)

    执行一个PIPELINE,可能还少了点什么,再加上自动调参就完美了,sklearn的调参通过GridSearchCV实现,pipeline+gridsearch简直是绝配。GridSearchCV实际上也有fit、predict方法,所以,你会发现,整个sklearn的机器学习是高效抽象的,训练代码可以写得很简洁。

    相关文章

      网友评论

        本文标题:机器学习训练的PIPELINE机制

        本文链接:https://www.haomeiwen.com/subject/wujhkctx.html