Розуміння min_df та max_df у scikit CountVectorizer


77

У мене є п’ять текстових файлів, які я ввожу в CountVectorizer. При зазначенні min_df та max_df для екземпляра CountVectorizer, що саме означає мінімальна / максимальна частота документа? Це частота слова у конкретному текстовому файлі чи частота слова у всьому загальному корпусі (5 текстових файлів)?

Чим відрізняється, коли min_df та max_df подаються як цілі числа або як плаваючі?

Схоже, що документація не містить детального пояснення, а також не надає приклад, щоб продемонструвати використання min_df та / або max_df. Хтось може надати пояснення або приклад, що демонструє min_df або max_df.

Відповіді:


229

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

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

За замовчуванням max_dfце 1.0, що означає "ігнорувати терміни, які містяться у понад 100% документів ". Таким чином, налаштування за замовчуванням не ігнорує жодних термінів.


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

  • min_df = 0.01означає "ігнорувати терміни, що містяться менш ніж в 1% документів ".
  • min_df = 5означає "ігнорувати терміни, що містяться менш ніж у 5 документах ".

За замовчуванням min_dfце 1, що означає "ігнорувати терміни, що містяться менше ніж в одному документі ". Таким чином, налаштування за замовчуванням не ігнорує жодних термінів.


Дуже чітка відповідь, дякую!
kapelnick

11

Відповідно до CountVectorizerдокументації тут .

При використанні поплавка в діапазоні [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, відповідно. В основному це говорить: "Якщо мій термін знайдено лише в 1 документі, він ігнорується. Аналогічно, якщо він знаходиться у всіх документах (100% або 1,0), тоді він ігнорується".

max_dfі min_dfобидва використовуються внутрішньо для розрахунку max_doc_countі min_doc_count, максимальна і мінімальна кількість документів, термін повинен бути знайдений. Це потім передається в self._limit_featuresякості іменованих аргументів highі , lowвідповідно, в рядок документації для self._limit_featuresIS

"""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.
"""

6
Це бентежить. Документація для " min_dfговорить" ігнорувати терміни, частота документів яких суворо нижча від заданого порогу. Тож частота, строго нижча за замовчуванням 1, означала б ігнорувати терміни, які ніколи не з’являються (!), Але зберегти терміни, які з’являються один раз.
Моніка Хеднек

1
@MonicaHeddneck правильно. Ця відповідь неправильно інтерпретує точні значення min_dfі max_df. Я додав відповідь, яка пояснює, як саме ці параметри інтерпретуються CountVectorizer.
Kevin Markham

так, це відповідь дещо неправильна, як зазначили @MonicaHeddneck та Kevin, як для min_df, так і для max_df
jeremy_rutman

10

Я б додав цей пункт також для кращого розуміння min_dfта max_dfв tf-idf.

Якщо ви використовуєте значення за замовчуванням, тобто враховуючи всі терміни, ви створили, безумовно, більше токенів. Тож ваш процес кластеризації (або будь-яка інша справа, яку ви хочете зробити з цими умовами пізніше) займе більше часу.

АЛЕ якість кластеризації НЕ повинна знижуватися.

Можна подумати, що дозволити присутність усіх термінів (наприклад, занадто часті терміни або слова-зупинки) може знизити якість, але в tf-idf це ні. Оскільки вимірювання tf-idf інстинктивно дасть низький бал цим термінам, фактично роблячи їх не впливовими (як це трапляється у багатьох документах).

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

І найважливіший момент полягає в тому, що якщо ви помилково встановите minі max, ви втратите деякі важливі умови і, таким чином, знизите якість. Так що, якщо ви не впевнені в правильному порога (це залежить від набору документів), або , якщо ви впевнені , про можливості обробки вашої машини, залиште min, maxпараметри без змін.


2
Дякую - це той самий висновок, до якого я дійшов самостійно.
Ізопікнальне коливання

4

Значення за замовчуванням для 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'і побачити, що, як правило, всі слова, крім "сім", видалено! У тому числі "скрізь".


1

Мета MIN_DF- ігнорувати слова, які мають дуже мало випадків, щоб вважати їх значущими. Наприклад, у вашому тексті ви можете мати імена людей, які можуть відображатися лише в 1 або двох документах. У деяких додатках це може кваліфікуватися як шум і може бути усунене подальшим аналізом. Так само ви можете ігнорувати занадто поширені слова MAX_DF.

Замість того, щоб використовувати мінімальну / максимальну частоту термінів (загальне входження слова) для усунення слів, MIN_DFі MAX_DFподивіться, скільки документів містить термін, більш відомий як частота документів. Пороговими значеннями може бути абсолютне значення (наприклад, 1, 2, 3, 4) або значення, що представляє частку документів (наприклад, значення 0,25, ігнорування слів, що з’явились у 25% документів).

Дивіться деякі приклади використання тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.