Наскільки R масштабує завдання для класифікації тексту? [зачинено]


30

Я намагаюся досягти швидкості з R. Я врешті-решт хочу використовувати R-бібліотеки для класифікації тексту. Мені було просто цікаво, який досвід людей щодо масштабованості R, коли мова йде про класифікацію тексту.

Я, швидше за все, зіткнувся з великими розмірними даними (~ 300k розмірів). Я дивлюся на використання SVM та Random Forest, зокрема, як алгоритми класифікації.

Чи може R бібліотеки масштабуватися до мого розміру проблеми?

Спасибі.

EDIT 1: Просто для уточнення, мій набір даних може мати 1000-3000 рядків (можливо, трохи більше) та 10 класів.

EDIT 2: Оскільки я дуже новачок у R, я попрошу плакати, де це можливо, бути більш конкретними. Наприклад, якщо ви пропонуєте робочий процес / трубопровід, будь ласка, обов'язково вкажіть R бібліотеки, які беруть участь у кожному кроці, якщо це можливо. Деякі додаткові вказівники (на приклади, зразок коду тощо) будуть глазур'ю торта.

EDIT 3: По-перше, дякую всім за ваші коментарі. По-друге, я вибачаюся, можливо, я мав би дати більше контексту для проблеми. Я новачок у R, але не стільки в класифікації тексту. Я вже зробив попередню обробку (стримування, видалення стоп-слова, перетворення tf-idf тощо) на моїй частині моїх даних за допомогою пакету tm , просто щоб зрозуміти щось. Тм був настільки повільним, навіть приблизно на 200документах, що я переймався масштабуванням. Тоді я почав грати з FSelector і навіть це було дуже повільно. І це той момент, коли я зробив свій ОП.

EDIT 4: Мені просто прийшло в голову, що я маю 10 класів і близько ~ 300 навчальних документів на клас, і я фактично будую матрицю termXdoc з усього навчального набору, що призводить до дуже високої розмірності. Але як щодо зведення кожної проблеми класифікації 1-з-к до ряду проблем бінарної класифікації? Це значно зменшило б кількість навчальних документів (і, отже, розмірність) на кожному з етапів k-1, чи не так? Тож такий підхід хороший? Як вона порівнюється за точністю зі звичайною багатокласовою реалізацією?


1
300k розмірів з кількістю рядків? На жаль, R-об'єкти повинні знаходитись у пам'яті (принаймні, якщо ви не вважаєте основні настройки, в основному вимагаючи, щоб ви самі переписали ці алгоритми). Це означає, що, скажімо, 8 гігів оперативної пам’яті, я не думаю, що ви можете зберігати більше декількох сотень рядків з 300k стовпцями.
crayola

@crayola: Кількість рядків може змінюватись від 1000-3000.
Енді

2
R об’єкти не повинні бути в пам'яті. Відображення пам'яті дуже просто. 300k розмірів - це не проблема. Я також припускаю, що ваші дані є рідкісними, як це стосується майже всіх проблем із текстом.
Ітератор

Я щойно помітив коментар вище: лише 1000-3000 рядків? Це дуже мало. Чи можете ви пояснити, що таке ваш корпус? Пакет електронних листів? Описи пакетів в CRAN? У вас може бути більше статистичних проблем з P >> N, ніж з будь-якими проблемами зберігання.
Ітератор

1
@ Ітератор: У нас є деякі освітні ресурси (курсові роботи, есе тощо), які ми хочемо класифікувати.
Енді

Відповіді:


17

Як вимагається в коментарі, ось деякі вказівки на етапи обробки. Ряд інструментів може бути знайдений у перегляді завдань CRAN для обробки природних мов . Ви також можете захотіти поглянути на цей папір на tm(видобуток тексту) пакета для R .

  1. Перед обробкою розглянемо нормалізацію лексем слова. openNLP(для якого є пакет R) - один маршрут.
  2. Для обробки тексту загальним кроком попередньої обробки є нормалізація даних через tf.idfтермін "* зворотна частота документа" - детальніше див. Запис у Вікіпедії . Існують і інші більш новітні нормалізації, але це метод хліба з маслом, тому важливо це знати. Ви можете легко реалізувати його в R: просто зберігати (docID, wordID, freq1, freq2), де freq1 - це кількість разів, коли слово, індексоване wordID, з’явилося в даному документі, а freq2 - це # документ, в якому він з’являється. Не потрібно зберігати цей вектор для слів, які не відображаються в даному документі. Тоді просто візьміть freq1 / freq2 і у вас є ваше значення tf.idf.
  3. Після обчислення значень tf.idf ви можете працювати з повною розмірністю даних або відфільтрувати ті слова, які по суті є неінформативними. Наприклад, будь-яке слово, яке відображається лише в одному документі, не дасть великого розуміння. Це може значно зменшити розмірність. Враховуючи невелику кількість досліджуваних документів, ви можете виявити, що доцільно зменшити розміри до 1 К.
  4. Я б не переоцінював дані (наприклад, для PCA), але ви можете зберігати дані зараз у терміновій матриці (де записи тепер є значеннями tf.idf) з легкістю, використовуючи розрізнені матриці, як підтримує Matrixпакет.

На даний момент у вас є гарний попередньо оброблений набір даних. Я рекомендую перейти до інструментів, цитованих у перегляді завдань CRAN або пакетів для виведення тексту. Кластеризація даних, наприклад, проектування на перші 4 або 6 основних компонентів, може бути дуже цікавою для вашої групи, коли дані будуються на графіку.

Ще одне: ви можете виявити, що зменшення розмірності за лініями PCA (*) може бути корисним при використанні різних методів класифікації, оскільки ви по суті агрегуєте пов'язані слова. Першими 10-50 основних компонентів можуть бути все, що вам потрібно для класифікації документів, враховуючи розмір вибірки.

(*) Примітка: PCA - це лише перший крок. Для когось це може бути дуже цікаво, починаючи з пошуку тексту та PCA, але, зрештою, ви зможете виявити, що це неприємність для розріджених наборів даних. Як перший крок, погляньте на це, особливо черезprcomp та princomp.

Оновлення: у цій відповіді я не вказав перевагу - рекомендую prcomp, ніж princomp.


+1 Приємна відповідь; Мені цікаво лише, чому ви кажете, що невелика кількість доків передбачає меншу кількість важливих змінних - чи не здається це трохи зайвим?

Я не впевнений, що розумію, що ти маєш на увазі. Безперечно, щоб утримати їх не було, тому ці змінні будуть усунені при розумному регуляризації. Більше того, словниковий запас (P) зростає разом з # документами чи зразками (N), тому перший раз, коли цей термін з’являється, це не є великим показником. Продовжуйте додавати документи, а потім повторення терміна в усіх документах стане інформативним.
Ітератор

@Iterator: Дякую за вашу відповідь. Так prcompі / або princompбуде масштабуватися до такого типу даних, який ви вважаєте? Також я просто відредагував своє запитання та додав додаткову інформацію.
Енді

Ні, вони, ймовірно, не змінюватимуться, коли ви потрапите на колонки 300К. :) (Тільки для того, щоб зазначити: X'X у такому випадку матиме записи 90B - проблема зберігання.) Натомість спочатку фільтруйте по tf.idf Якщо є, скажімо, 10 різних класів, то невеликий кратний 10 повинен бути достатнім для більшої розмірності для розділення класів. Отже, 1000 розмірів має бути більш ніж достатньо. Обидва методи PCA (btw, я рекомендую prcomp) будуть добре.
Ітератор

Якщо ви обмежитеся на 1000 розмірів або, можливо, ще декілька (наприклад, 2K), і зробите PCA, ви можете взяти проекції на 100 розмірів (що може бути надмірним, але шкоди в цьому мало), а потім зробити класифікацію. На даний момент нічого надто захоплюючого не відбувається.
Ітератор

5

По-перше, ласкаво просимо! Обробка тексту - це дуже весело, і робити це в R стає все простіше.

Коротка відповідь: так - інструменти в R зараз досить хороші для роботи з подібними даними. Насправді в R, C ++, Groovy, Scala або будь-якій іншій мові немає нічого особливого, коли мова йде про зберігання даних в оперативній пам’яті: кожна мова зберігає 8-байтовий подвійний поплавок у… зачекайте… чекайте. .. 8 байт!

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

Для R вам потрібно буде врахувати:

  1. Ваше представлення даних (дивіться на малі матриці, особливо в Matrixупаковці)
  2. Зберігання даних (можливо, пам'ять, відображена, використовувана bigmemoryабо ff; або розповсюджена за допомогою Hadoop)
  3. Ваш розподіл даних (скільки ви можете помістити в оперативну пам’ять, залежить від обсягу оперативної пам’яті)

Останній пункт справді під вашим контролем.

Що стосується цієї мірності, то вона вже не особливо велика. # Спостережень матиме більший вплив, але ви можете розділити свої дані для адаптації до використання оперативної пам’яті, тому насправді не надто турбуватися.


3

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

Щодо SVM, я сумніваюся, що це гарна ідея боротися з розмірами 300k, тоді як ви, мабуть, можете розробити функцію ядра, яка буде еквівалентна вашим дескрипторам тексту.

EDIT: Матриця 3k x 30k (реальна) займала б щось на зразок 7Gb, тому все, що вам потрібно зробити RF (використовуючи randomForest) за цими даними, - це комп'ютер з 16 Гб оперативної пам’яті, трохи удачі та зовсім небагато часу або просто комп'ютер з 24 ГБ ОЗУ і зовсім небагато часу.


Ну, я, звичайно, збирався зробити функцію вибору (чи-квадрат, заснований на ентропії), але знову ж таки я не зміг знайти жодної бібліотеки R, яка б розширювала цю задачу. Беручи до уваги все це, чи правильно тоді говорити, що, можливо, я повинен почати переглядати не-R рішення?
Енді

1
"зауважте, що немає паралельної реалізації РФ в R". Це лише частково правильно, оскільки foreachпакет добре грає з randomForestпакетом. Я думаю, що є один такий приклад у віньєтці для foreach. (А може doMC.)
crayola

@Andy Справа в тому, що, якщо переписати алгоритми мовою програмування низького рівня, я не впевнений, яке програмне забезпечення зможе застосувати ці алгоритми до ваших даних. Якби я опинився у вашій ситуації, я думаю, я би дотримувався R і переписував randomForestтакі частини , щоб він запитував випадково вибрані стовпці з, наприклад, бази даних SQL при кожній ітерації (такий, що цілих розмірів 300k ніколи не було б бути в барані). Але це, мабуть, головним чином тому, що я знаю більше про R, ніж про інші можливі варіанти.
crayola

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

@crayola Щоправда, але частина злиття жахлива. Більше того, це не паралелізм спільної пам'яті, тому це було б, мабуть, болісно (якщо не неможливо) у цій обстановці.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.