Ошибка типа конвейера Scikit-learn: zip аргумент # 2 должен поддерживать итерацию

#python #python-3.x #scikit-learn #pipeline

#python #python-3.x #scikit-learn #конвейер

Вопрос:

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

 class AverageWordLengthExtractor(BaseEstimator, TransformerMixin):

    def __init__(self):
        pass
    def average_word_length(self, text):
        return np.mean([len(word) for word in text.split( )])
    def fit(self, x, y=None):
        return self
    def transform(self, x , y=None):
        return pd.DataFrame(pd.Series(x).apply(self.average_word_length))
  

затем я создал конвейер, подобный этому.

 pipeline = Pipeline(['text_length', AverageWordLengthExtractor(), 
                         'scale', StandardScaler()])
  

Когда я выполняю fit_transform в этом конвейере, я получаю сообщение об ошибке,

  File "custom_transformer.py", line 48, in <module>
    main()
  File "custom_transformer.py", line 43, in main
    'scale', StandardScaler()])
  File "/opt/conda/lib/python3.6/site-packages/sklearn/pipeline.py", line 114, in __init__
    self._validate_steps()
  File "/opt/conda/lib/python3.6/site-packages/sklearn/pipeline.py", line 146, in _validate_steps
    names, estimators = zip(*self.steps)
TypeError: zip argument #2 must support iteration
  

Комментарии:

1. Пожалуйста, укажите структуру Series и поток выполнения.

2. @sentence, я передаю серию pandas с одним столбцом, например, сообщение (имя столбца) Обновление погоды — холодный фронт с Кубы, который может пройти над Гаити, Ураган закончился или еще не закончился, Ищу кого-то, но без имени ООН сообщает, что Леоган 80-90 уничтожен. Функционирует только больница Сент-Круа. Отчаянно нуждается в поставках. говорит: западная часть Гаити, остальная часть страны сегодня и вечером Информация о Национальном дворце — Пожалуйста, нам нужны палатки и вода. Мы в бункере, спасибо! >> прямо сейчас я просто пытаюсь передать это в конвейер, который не работает.

3. @anidev711 вам нужна дополнительная помощь?

4. Да, @JanK ваш ответ помог избавиться от этой проблемы, но теперь я получаю другую ошибку. File "custom_transformer.py", line 48, in <module> main() File "custom_transformer.py", line 43, in main 'scale', StandardScaler())]) File "/opt/conda/lib/python3.6/site-packages/sklearn/pipeline.py", line 114, in __init__ self._validate_steps() File "/opt/conda/lib/python3.6/site-packages/sklearn/pipeline.py", line 146, in _validate_steps names, estimators = zip(*self.steps) ValueError: too many values to unpack (expected 2)

5. @anidev711 Если вы считаете, что новая ошибка не связана, подумайте о создании нового вопроса и пометьте этот вопрос как ответ.

Ответ №1:

Pipeline Конструктор ожидает аргумент steps , который представляет собой список кортежей.

Исправленная версия:

 pipeline = Pipeline([('text_length', AverageWordLengthExtractor()), 
                     ('scale', StandardScaler())])
  

Дополнительная информация в официальных документах.