Линейная регрессия PySpark в наборе данных с большим количеством функций, чем точек данных - PullRequest
0 голосов
/ 28 ноября 2018

Я использую PySpark для разработки простого приложения для анализа текста.Цель состоит в том, чтобы классифицировать определенный документ как Спам или Не Спам.У меня есть приблизительно 1000 документов для обучения модели ( n ).

После очистки данных (исправление орфографических ошибок, определение стволов и т. Д.) Я использую IDF для извлечения вектора объектов.По умолчанию размерность этого метода векторизации составляет 2 ^ 18 = 262144, что означает, что у меня будет в общей сложности 262144 очень разреженных объекта ( p ).

Учитывая, что p >> n :

Насколько я помню, и согласно некоторым найденным статьям и веб-статьям невозможно применить линейную регрессию к данным этого типа без какого-либо сокращения возможностей, иначеалгоритм потерпит неудачу (потому что при p> n дисперсия будет бесконечной).

Чтобы проверить это, я запустил линейную регрессию для моих данных:

...

idf_stage = IDF(inputCol=hashingTF.getOutputCol(), outputCol="features", minDocFreq=1)
lr = LinearRegression(maxIter=10, tol=1E-6)

pipeline = Pipeline(stages=[..., idf_stage, lr])

model = pipeline.fit(train)
results = model.transform(test)
results.select("label", "prediction").show()

И я получил следующие результаты:

+-----+--------------------+
|label|          prediction|
+-----+--------------------+
|  1.0|  0.8123660495998272|
|  1.0|  0.9485273761704205|
|  0.0| 0.25039087467730653|
|  1.0|  1.2359878831283708|
|  0.0|-0.14295806192187976|
|            ...           |
+-----+--------------------+

Я ожидал, что это не удастся, поэтому я удивился, когда заметил, что исключений не было.

Есть пара вещей, которые я не могу понять:

Вопрос 1: Когда говорят, что алгоритм линейной регрессии потерпит неудачу, когда p> n, что являетсясмысл неудачи?Разве он не должен работать вообще и генерировать исключение или он должен запускаться, но возвращать результаты, которые не должны учитываться?

Вопрос 2: Если алгоритм должен генерировать исключение, почему он работает?Делает ли Spark какое-либо сокращение возможностей за кулисами?

Вопрос 3: Поскольку логистическая регрессия может быть превращена в задачу линейной регрессии с использованием переменных преобразований, возникает ли такая же проблема, когда p> n?

1 Ответ

0 голосов
/ 28 ноября 2018

Отказ будет ожидаться, только если вы используете решение в закрытой форме:

(X T X) -1 X T y

и была применена дополнительная проверка.

Однако это не единственный подход, который можно использовать, и не тот, который обычно используется в Spark.Можно использовать численные методы, такие как

  • Использование псевдообратная .Именно так обычно реализуется линейность в разных пакетах.

  • Итеративные процедуры оптимизации, включая различные варианты градиентного спуска.

и могут использоваться дажеесли (X T X) необратим или плохое состояние.Конечно, нет никакой гарантии, что это приведет к какому-либо разумному решению.

По умолчанию o.a.s.ml.regression.LinearRegression использует решение в закрытой форме ( "обычный" решатель ), только если число функций меньше, чем4096 (это значение по умолчанию LinearRegression.MAX_FEATURES_FOR_NORMAL_SOLVER).

...