Логистическая регрессия Pyspark имеет нулевые коэффициенты после подгонки - PullRequest
0 голосов
/ 25 мая 2018

Добрый день.

Я решаю проблему классификации по нескольким меткам с помощью LogisticRegression в pyspark.Однако после того, как я подгоняю модель к данным, все элементы CoefficientMatrix модели равны нулю.

Я заметил, что если я уменьшу количество выборок в обучающем наборе до некоторого уровня, модель иногдана самом деле что-то узнает, а коэффициенты не равны нулю.Это на самом деле зависит от обучающей подвыборки: некоторые случайные начальные числа предоставляют подвыборки с ненулевыми коэффициентами, а некоторые с нулевыми коэффициентами.Я проверил ввод для nans и infs: все в порядке с этой стороны.

Данные редки.Я нашел небольшую подвыборку, которая дает нулевой коэффициент, и начал выборку данных из него, чтобы еще больше уменьшить количество объектов, чтобы я мог более внимательно изучить проблему, вызывающую объекты.Наконец я получил небольшую плохую подвыборку из 16 элементов.Все объекты, кроме одного, имели редкие черты.Когда я выбросил единственный плотный объект, коэффициенты снова стали реалистичными.

Почему происходит такое поведение?Что мне делать в такой ситуации?

У меня около 90 ярлыков в цели, 356 функций.Данные редки.Модель Sklearn в том же наборе данных хорошо вписывается.

Я использую pyspark 2.1.0 и python 3.5.3.Вот пример моего кода:

from pyspark.ml.classification import LogisticRegression
from pyspark.ml.feature import VectorAssembler

df = sqlContext.table('data')

assert df.columns[-1] == 'label'

assembler = VectorAssembler(inputCols=df.columns[:-1], outputCol='features')
df = assembler.transform(df)

# frac is a float between 0 and 1
train, test = df.sample(fraction=frac,
                        withReplacement=False).randomSplit([0.75, 0.25])

lr = LogisticRegression(maxIter=100, standartization=False, family='auto')
model = lr.fit(train)

print(model.coefficientMatrix.toArray().sum(),
      model.coefficientMatrix.toArray().min(),
      model.coefficientMatrix.toArray().max())
...