Для этого используется 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: значение недопустимо .
Только с 100 000 документов, если они не гигантские, не обязательно загрузка данных в память вызывает проблемы. Обратите особое внимание:
Doc2Vec
) довольны потоковыми данными произвольного размера, сложнее адаптировать их к scikit-learn Так что вы должны искать в другом месте, и есть другие проблемы с вашим показанным кодом.
У меня часто возникали проблемы с памятью или блокировкой при попытках scikit-learn на параллелизме (как это разрешено с помощью n_jobs
-подобных параметров), особенно в ноутбуках Jupyter. Он разветвляется на все процессы ОС, которые, как правило, увеличивают использование памяти. (Каждый подпроцесс получает полную копию памяти родительского процесса, которая может эффективно использоваться - до тех пор, пока подпроцесс не начнет перемещать / изменять вещи.) Иногда происходит сбой одного процесса или межпроцессного взаимодействия, и основной процесс просто остается в ожидании для ответа - который, кажется, особенно смущает ноутбуки Jupyter.
Таким образом, если у вас нет тонны памяти и вам абсолютно не нужен параллелизм научения научению, я бы рекомендовал сначала попытаться заставить работать вещи с n_jobs=1
- и только позже экспериментировать с большим количеством рабочих мест.
Напротив, workers
класса Doc2Vec
(и D2VTransformer
) используют более легкие нити, и вы должны использовать по крайней мере workers=3
и, возможно, 8 (если у вас есть по крайней мере так много ядер, а не workers=1
, который вы используете сейчас.
Но также: вы выполняете кучу избыточных действий с неясной ценностью в своем коде. Набор тестов из начального разбиения train-test никогда не использовался. (Возможно, вы думали оставить его в качестве окончательного набора проверки? Это самый строгий способ получить точную оценку эффективности вашего конечного результата на будущих невидимых данных, но во многих контекстах данные ограничены, и эта оценка не так важна, как просто делать все возможное с ограниченными данными.)
GridSearchCV
сам выполняет разделение поезда / теста в 5 направлениях как часть своей работы, и его лучшие результаты запоминаются в его свойствах, когда это будет сделано.
Так что вам не нужно делать cross_val_score()
снова - вы можете прочитать результаты из GridSearchCV
.