Введение

В предыдущих статьях NLP Pipeline 101 с примером базового кода - обработка текста и NLP Pipeline 101 with Basic Code Example - Feature Extraction я говорил о первых двух шагах построения конвейера NLP. В этой статье я остановлюсь на последнем шаге: моделировании.

Моделирование

Заключительным этапом конвейера НЛП является моделирование, которое включает в себя:

Модель: разработка статистической модели или модели машинного обучения;

Тренировка: подгонка параметров под данные тренировки с помощью процедуры оптимизации;

Прогноз: затем используйте его для прогнозирования невидимых данных.

Ниже приведен пример кода:

def main():
    # load data
    X, y = load_data()
    # train test split
    X_train, X_test, y_train, y_test = train_test_split(X, y)
    # feature extraction
    vect = CountVectorizer(tokenizer=tokenize)
    tfidf = TfidfTransformer()
    # choose model
    clf = RandomForestClassifier()

    # train classifier
    X_train_counts = vect.fit_transform(X_train)
    X_train_tfidf = tfidf.fit_transform(X_train_counts)
    clf.fit(X_train_tfidf, y_train)

    # predict on test data
    X_test_counts = vect.transform(X_test)
    X_test_tfidf = tfidf.transform(X_test_counts)
    y_pred = clf.predict(X_test_tfidf)

    # display results
    display_results(y_test, y_pred)

Трубопровод

Мы можем использовать конвейер scikit-learn, чтобы упростить приведенный выше код. Конвейер определяется как последовательное применение списка преобразований и окончательного оценщика. Промежуточные этапы конвейера должны реализовывать методы подгонки и преобразования, а окончательная оценка должна реализовывать только подгонку.

Теперь давайте сделаем паузу и узнаем, что такое оценщик, преобразователь и предиктор.

ОЦЕНКА. Оценщик - это любой объект, который учится на данных, будь то алгоритм классификации, регрессии или кластеризации, или преобразователь, который извлекает или фильтрует полезные функции из необработанных данных. Поскольку оценщики учатся на данных, каждая из них должна иметь fit метод, принимающий набор данных.

ТРАНСФОРМАТОР: преобразователь - это особый тип оценщика, у которого есть метод fit для обучения на основе обучающих данных, а затем метод transform для применения модели преобразования к новым данным. Эти преобразования могут включать в себя очистку, сокращение, расширение или создание элементов.

ПРОГНОЗИРУЮЩИЙ: предиктор - это особый тип оценщика, который имеет predict метод прогнозирования на основе тестовых данных на основе алгоритма контролируемого обучения и имеет fit метод обучения модели. по обучающим данным.

Используя конвейер, мы можем переписать приведенный выше код следующим образом:

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

# train classifier
pipeline.fit(Xtrain)

# evaluate all steps on test set
predicted = pipeline.predict(Xtest)

Почему трубопровод?

1. Простота и удобство

Объединение всех ваших шагов в один оценщик позволяет вам автоматически подогнать и спрогнозировать все шаги вашей последовательности с помощью одного вызова. Он выполняет более мелкие шаги за вас, поэтому вы можете сосредоточиться на быстром и эффективном внедрении изменений более высокого уровня.

2. Оптимизация всего рабочего процесса

Запустив поиск по сетке в конвейере, вы можете оптимизировать весь рабочий процесс, включая этапы преобразования данных и моделирования. Это учитывает любые взаимодействия между этапами, которые могут повлиять на окончательные показатели. Ниже приведен пример кода.

pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('clf', SVC())
])

parameters = {
    'scaler__with_mean': [True, False]
    'clf__kernel': ['linear', 'rbf'],
    'clf__C':[1, 10]
}

cv = GridSearchCV(pipeline, param_grid=parameters)

cv.fit(X_train, y_train)
y_pred = cv.predict(X_test)

3. Предотвращение утечки данных

При использовании Pipeline все преобразования для подготовки данных и извлечения функций происходят в каждом сегменте процесса перекрестной проверки. Это предотвращает распространенные ошибки, когда на ваш тренировочный процесс могут повлиять ваши тестовые данные.

Feature Union

Feature union - это класс в модуле конвейера scikit-learn, который позволяет нам выполнять шаги параллельно и использовать объединение их результатов для следующего шага. Конвейер выполняет список шагов в линейной последовательности, а объединение функций выполняет список шагов в параллельном А потом их результаты объединяет.

Как и конвейеры, объединения функций строятся с использованием списка (key, value) пар, где ключ - это строка, которой вы хотите присвоить имя шага, а значение - это объект оценки.

X = df['text'].values
y = df['label'].values
X_train, X_test, y_train, y_test = train_test_split(X, y)

pipeline = Pipeline([
    ('features', FeatureUnion([

        ('nlp_pipeline', Pipeline([
            ('vect', CountVectorizer()
            ('tfidf', TfidfTransformer())
        ])),

        ('txt_len', TextLengthExtractor())
    ])),

    ('clf', RandomForestClassifier())
])

# train classifier
pipeline.fit(Xtrain)

# predict on test data
predicted = pipeline.predict(Xtest)

В этом примере кода мы используем объединение функций для объединения двух функций: nlp_pipeline и tex_len.

Создание собственного трансформатора

С помощью объединения конвейеров и функций мы можем значительно упростить наш код. Но что, если нам нужен какой-то трансформатор, которого нет в sklearn? К счастью, мы можем создавать собственные трансформаторы по индивидуальному заказу.

Все, что нам нужно сделать, это написать класс и изменить его подгонку и метод преобразования.

import numpy as np
import pandas as pd
from sklearn.base import BaseEstimator, TransformerMixin

class CaseNormalizer(BaseEstimator, TransformerMixin):
    def fit(self, X, y=None):
        return self

    def transform(self, X):
        return pd.Series(X).apply(lambda x: x.lower()).values

case_normalizer = CaseNormalizer()

X = np.array(['Implementing', 'a', 'Custom', 'Transformer', 'from', 'SCIKIT-LEARN'])
case_normalizer.transform(X)

Здорово ! Теперь я прошел все три основных шага конвейера НЛП. В последней дополнительной главе я снова покажу шаги с законченным проектом. Надеюсь, вам это понравится.