Понимание min_df и max_df в scikit CountVectorizer

У меня есть пять текстовых файлов, которые я ввел в CountVectorizer. При указании min_df и max_df экземпляра CountVectorizer то, что означает минимальная/минимальная скорость документа? Является ли это частотой слова в его конкретном текстовом файле или это частота слова во всем общем корпусе (5 файлов txt)?

Как это отличается, когда min_df и max_df предоставляются как целые числа или как float?

Документация, похоже, не дает подробного объяснения и не служит примером для демонстрации использования min_df и/или max_df. Может ли кто-нибудь дать объяснение или пример, демонстрирующий min_df или max_df.

Ответ 1

max_df используется для удаления терминов, которые появляются слишком часто, также называемых "фиксированными словами". Например:

  • max_df = 0.50 означает "игнорировать условия, которые появляются в более чем 50% документов ".
  • max_df = 25 означает "игнорировать условия, которые появляются в более чем 25 документах ".

Значение max_df умолчанию max_df 1.0, что означает "игнорировать условия, которые появляются в более чем 100% документов ". Таким образом, значение по умолчанию не игнорирует никаких условий.


min_df используется для удаления терминов, которые появляются слишком редко. Например:

  • min_df = 0.01 означает "игнорировать условия, которые появляются менее чем в 1% документов ".
  • min_df = 5 означает "игнорировать условия, которые появляются в менее чем 5 документах ".

Значение min_df умолчанию min_df 1, что означает "игнорировать термины, которые отображаются менее чем за один документ ". Таким образом, значение по умолчанию не игнорирует никаких условий.

Ответ 2

Согласно CountVectorizer документации здесь.

При использовании float в диапазоне [0.0, 1.0] они ссылаются на частоту документа. Это процент документов, содержащих этот термин.

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

Рассмотрим пример, где у вас есть 5 текстовых файлов (или документов). Если вы установите max_df = 0.6 то это приведет к 0.6*5=3 документам. Если вы установите max_df = 2, это просто переведет на 2 документа.

Пример исходного кода ниже копируется из Github здесь и показывает, как max_doc_count строится из max_df. Код для min_df аналогичен и может быть найден на странице GH.

max_doc_count = (max_df
                 if isinstance(max_df, numbers.Integral)
                 else max_df * n_doc)

Значения по умолчанию для min_df и max_df равны 1 и 1.0 соответственно. В основном это говорит: "Если мой термин найден только в одном документе, он игнорируется. Точно так же, если он найден во всех документах (100% или 1,0), он игнорируется".

max_df и min_df используются для вычисления max_doc_count и min_doc_count, максимального и минимального количества документов, в которых должен быть найден термин. Затем он передается self._limit_features в качестве аргументов ключевого слова high и low соответственно, docstring для self._limit_features -

"""Remove too rare or too common features.

Prune features that are non zero in more samples than high or less
documents than low, modifying the vocabulary, and restricting it to
at most the limit most frequent.

This does not prune samples with zero features.
"""

Ответ 3

Значения по умолчанию для min_df и max_df равны 1 и 1.0 соответственно. Эти значения по умолчанию действительно ничего не делают.

При этом я считаю, что принятый в настоящее время ответ на ответ @Ffisegydd не совсем корректен.

Например, запустите это с использованием значений по умолчанию, чтобы увидеть, что при min_df=1 и max_df=1.0, тогда

1) используются все токены, которые появляются, по крайней мере, в одном документе (например, все жетоны!)

2) используются все токены, которые появляются во всех документах (мы будем тестировать с одним кандидатом: везде).

cv = CountVectorizer(min_df=1, max_df=1.0, lowercase=True) 
# here is just a simple list of 3 documents.
corpus = ['one two three everywhere', 'four five six everywhere', 'seven eight nine everywhere']
# below we call fit_transform on the corpus and get the feature names.
X = cv.fit_transform(corpus)
vocab = cv.get_feature_names()
print vocab
print X.toarray()
print cv.stop_words_

Мы получаем:

[u'eight', u'everywhere', u'five', u'four', u'nine', u'one', u'seven', u'six', u'three', u'two']
[[0 1 0 0 0 1 0 0 1 1]
 [0 1 1 1 0 0 0 1 0 0]
 [1 1 0 0 1 0 1 0 0 0]]
set([])

Все токены сохранены. Нет временных слов.

Дальше возиться с аргументами прояснит другие конфигурации.

Для удовольствия и проницательности я также рекомендовал бы играть с stop_words = 'english' и, видя, что, особенно, все слова, кроме "семи", удаляются! Включая "всюду".

Ответ 4

Я бы добавил этот момент и для понимания min_df и max_df в tf-idf лучше.

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

НО качество вашей кластеризации НЕ должно быть уменьшено.

Можно подумать, что доступ ко всем терминам (например, слишком частые термины или стоп-слова) может снизить качество, но в tf-idf это не так. Потому что измерение tf-idf инстинктивно даст низкий балл этим терминам, фактически делая их не влиятельными (как они появляются во многих документах).

Итак, чтобы подвести итог, обрезка терминов с помощью min_df и max_df заключается в улучшении производительности, а не в качестве кластеров (в качестве примера).

И решающим моментом является то, что если вы ошибочно установите min и max, вы потеряете некоторые важные условия и, следовательно, снизите качество. Поэтому, если вы не уверены в правильном пороге (это зависит от ваших документов), или если вы уверены в своих возможностях обработки машины, оставьте параметры min, max неизменными.

Ответ 5

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