下午好。
我在pyspark中借助LogisticRegression解决了多标签分类问题。但是,在我将模型拟合到数据之后,模型的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())