Потоковая передача на векторизатор в конвейере

Для этого используется Object#equals() . Вы можете изменить (исправить) это поведение, применив его соответственно к вашей сущности.

private Long id;

@Override
public boolean equals(Object other) {
    return (other != null && getClass() == other.getClass() && id != null)
        ? id.equals(getClass().cast(other).id)
        : (other == this);
}

Не забывайте, что hashCode() удовлетворяет equals-hashCode контракт .

@Override
public int hashCode() {
    return (id != null) 
        ? (getClass().hashCode() + id.hashCode())
        : super.hashCode();
}

Если вы не можете изменить существующий объект по какой-то неясной причине, оберните его в свой собственный DTO.

Конвертер преобразует только объект и его уникальный String для использования в выводах HTML и HTTP-запроса и поэтому не влияет на выбор. Это влияет только на потенциальную ошибку Validation: значение недопустимо .

См. Также:

1
задан Christopher 31 January 2019 в 19:06
поделиться

1 ответ

Только с 100 000 документов, если они не гигантские, не обязательно загрузка данных в память вызывает проблемы. Обратите особое внимание:

  • loading & amp; Токенизация документов уже прошла успешно, прежде чем вы даже начнете поиск / поиск по сетке scikit, и дальнейшее умножение использования памяти происходит в альтернативных моделях с обязательным повторением, не в оригинальных документах
  • [ 1113] API-интерфейсы scikit-learn обычно предполагают, что обучающие данные полностью находятся в памяти - поэтому, хотя самые внутренние классы gensim (Doc2Vec) довольны потоковыми данными произвольного размера, сложнее адаптировать их к scikit-learn

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

У меня часто возникали проблемы с памятью или блокировкой при попытках scikit-learn на параллелизме (как это разрешено с помощью n_jobs -подобных параметров), особенно в ноутбуках Jupyter. Он разветвляется на все процессы ОС, которые, как правило, увеличивают использование памяти. (Каждый подпроцесс получает полную копию памяти родительского процесса, которая может эффективно использоваться - до тех пор, пока подпроцесс не начнет перемещать / изменять вещи.) Иногда происходит сбой одного процесса или межпроцессного взаимодействия, и основной процесс просто остается в ожидании для ответа - который, кажется, особенно смущает ноутбуки Jupyter.

Таким образом, если у вас нет тонны памяти и вам абсолютно не нужен параллелизм научения научению, я бы рекомендовал сначала попытаться заставить работать вещи с n_jobs=1 - и только позже экспериментировать с большим количеством рабочих мест.

Напротив, workers класса Doc2VecD2VTransformer) используют более легкие нити, и вы должны использовать по крайней мере workers=3 и, возможно, 8 (если у вас есть по крайней мере так много ядер, а не workers=1, который вы используете сейчас.

Но также: вы выполняете кучу избыточных действий с неясной ценностью в своем коде. Набор тестов из начального разбиения train-test никогда не использовался. (Возможно, вы думали оставить его в качестве окончательного набора проверки? Это самый строгий способ получить точную оценку эффективности вашего конечного результата на будущих невидимых данных, но во многих контекстах данные ограничены, и эта оценка не так важна, как просто делать все возможное с ограниченными данными.)

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

Так что вам не нужно делать cross_val_score() снова - вы можете прочитать результаты из GridSearchCV.

0
ответ дан gojomo 31 January 2019 в 19:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: