Рубрики
Без рубрики

Красивый конвейер машинного обучения с Scikit-Learn

Этот пост должен дать представление о том, как использовать scikit-learn API для создания красивого конвейера машинного обучения

Автор оригинала: Bruce Kuo.

Разработка функциональных возможностей-это самая сложная часть применения машинного обучения к вашему продукту. Эта заметка направлена на то, чтобы дать лучшие манеры при использовании scikit-learn to do feature engineering and machine learning на основе моего личного опыта.

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

  • обработка пропущенных значений
  • нормализация/стандартизация
  • взаимодействие функций
  • кодировка меток
  • одна горячая кодировка

Приступая к разработке модели машинного обучения, мы обычно должны попробовать множество возможных решений и быстро перебрать различные возможные комбинации трюков с функциями. Есть много статей, говорящих о том, как сделать вышеописанные инженерные работы. Но когда вы хотите применить различные подходы к различным функциям, вы можете написать сложный код для разработки функций. Код может содержать несколько преобразований numpy/scipy и обратную связь в конвейеры scikit learn. Это приводит к тому, что код нелегко поддерживать и трудно отлаживать, когда возникает проблема. В этой статье я хочу представить несколько трюков в scikit-learn to build up a machine learning model pipeline, который охватывает:

  • особенности проектирования на разных колоннах
  • ансамблевое обучение с индивидуальными трансформаторами
  • API глубокого обучения со сложным конвейером функций

Мы определяем некоторые фрагменты кода о входных/выходных данных здесь, прежде чем говорить о деталях:

train_data = pd.read_csv("input_data.csv")
train_labels = pd.read_csv("input_labels.cs v")
predict_data = pd.read_csv("predict_data.csv")

Давайте посмотрим, как сделать простую разработку функций, если вы не применяете конвейер.

Пример кода

pca_transform = PCA(n_components=10)
pca_transform.fit(train_data.values)
pca_transform_data = pca_transform.transform(train_data.values)

nmf_transform = NMF()
nmf_transform.fit(train_data.values)
nmf_transform_data = nmf_transform.transform(train_data.values)

union_data = np.hstack(nmf_transform_data, pca_transform_data)

model = RandomForestClassifier()
model.fit(union_data, train_labels.values)

pca_transform_predict_data = pca_transform.transform(predict_data.values)
nmf_transform_predict_data = nmf_transform.transform(predict_data.values)
union_predict_data = np.hstack(
  pca_transform_predict_data, nmf_transform_predict_data)
predictions = model.predict(union_predict_data)

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

Плюсы

  • Наивная реализация

Аферы

  • Нужно заботиться о многих деталях с интерфейсом numpy/scipy
  • Есть много дубликатов кода, чтобы делать подобные вещи

Чтобы сделать всю операцию более чистой, scikit-learn предоставляет pipeline API , чтобы позволить пользователю создавать конвейер машинного обучения, не заботясь о деталях.

Пример кода

model_pipeline = Pipeline(steps=[
  ("dimension_reduction", PCA(n_components=10)),
  ("classifiers", RandomForestClassifier())
])

model_pipeline.fit(train_data.values, train_labels.values)
predictions = model_pipeline.predict(predict_data.values)

Плюсы

  • Избавьтесь от обработки деталей между двумя этапами.
  • Код прост в обслуживании

Аферы

  • Если вы используете эту реализацию, примените только 1 тип преобразования к заданным объектам. Но это первый шаг к тому, чтобы сделать ваш конвейер более элегантным.

Если вы хотите применить различные функции обработки объектов к вашему набору данных. Вы можете попробовать Feature Union API . API предоставляет простой способ объединения массивов из разных типов преобразования. Вот фрагменты кода, если вы хотите его использовать:

Пример кода

model_pipeline = Pipeline(steps=[
  ("feature_union", FeatureUnion([
    ("pca", PCA(n_components=1)),
    ("svd", TruncatedSVD(n_components=2))
  ])),
  ("classifiers", RandomForestClassifier())
])

model_pipeline.fit(train_data.values, train_labels.values)
predictions = model_pipeline.predict(predict_data.values)

Плюсы

  • Используйте различные функции трансформатора, не разделяя свой код на несколько частей, и составляйте их.

Аферы

  • Нельзя применять разные преобразования по разным признакам
  • Невозможно напрямую отправить pandas dataframe и использовать dict-подобный способ доступа к данным в вашем конвейере.

С помощью Idea 3 вы можете легко реализовать свой конвейер с различными преобразованиями. Но есть две проблемы, о которых мы упоминали выше, мы пытаемся решить эти проблемы и найти Колонный трансформатор API после обследования различных материалов. Мне очень нравится этот API, потому что он позволяет упростить ваш конвейер, например конфигурацию, и обучить/предсказать ваши данные с помощью простой команды.

Пример кода

model_pipeline = Pipeline(steps=[
  ("features", FeatureUnion([
    (
      "numerical_features",
      ColumnTransformer([
        (
          "numerical",
          Pipeline(steps=[(
            "impute_stage",
            SimpleImputer(missing_values=np.nan, strategy="median",)
          )]),
          ["feature_1"]
        )
      ])
    ), (
      "categorical_features",
      ColumnTransformer([
        (
          "country_encoding",
          Pipeline(steps=[
            ("ohe", OneHotEncoder(handle_unknown="ignore")),
            ("reduction", NMF(n_components=8)),
          ]),
          ["country"],
        ),
      ])
    ), (
      "text_features",
      ColumnTransformer([
        (
          "title_vec",
          Pipeline(steps=[
            ("tfidf", TfidfVectorizer()),
            ("reduction", NMF(n_components=50)),
          ]),
          "title"
        )
      ])
    )
  ])),
  ("classifiers", RandomForestClassifier())
])

model_pipeline.fit(train_data, train_labels.values)
predictions = model_pipeline.predict(predict_data)

Плюсы

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

Аферы

Я не могу найти никаких трудностей, если бы мы использовали такую реализацию в разработке функций.

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

  • как сделать штабелирование ансамблевого обучения в вашем конвейере
  • как интегрировать keras в ваш конвейер

Укладка ансамблевых методов в конвейер

Как вы знаете, мы обычно хотим использовать метод укладки, чтобы избежать смещения от одного конкретного метода. Если вы все еще новичок в обучении укладке, вы можете сначала прочитать этот учебник . Поэтому при реализации методов укладки возникает вопрос: как сделать метод укладки одним шагом в вашем конвейере? Я прочитал этот материал и дух, чтобы создать шаг, строит индивидуальный класс трансформатора . Реализация здесь не идеальна, но является хорошим исходным материалом для расширения.

Быстрая адаптация нейросетевой модели с помощью Kereta API

Keras Scikit-Learn API предоставляет простой способ интеграции вашей модели нейронной сети с scikit learn API. Вы можете быстро реализовать свою модель keras и интегрироваться с вашим пользовательским конвейером в качестве одного шага в вашем объекте конвейера.

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

Это всего лишь простое введение, чтобы дать представление о том, как сделать функциональную инженерию элегантным способом. Я считаю, что есть еще много удивительных трюков, которые могут помочь нам создать конвейеры машинного обучения с простым кодом. Изучая документацию и дизайн API в scikit-learn, я наслаждаюсь их мыслями о разработке машинного обучения и думаю, что вполне стоит следовать им.