意外的Spark多项式逻辑回归系数

我在Mac上运行Spark 2.1.1,操作系统是Sierra(如果这有帮助的话)。我尝试在一个在线找到的测试数据集上拟合一个多项式逻辑回归模型,这里我报告了前几行(我不知道如何在这里附件文件):

1,0,241,0,261,0,261,1,271,1,273,1,27

第一列是标签(’brand’,值为:1, 2, 3),第二列和第三列是特征(’sex’和’age’)。

由于标签有3个类别,多项式逻辑回归应该执行3个二项模型,然后从中选择最大化该类别概率的预测。因此,我期望模型返回一个3×2的系数矩阵:3是因为类别有3个,2是因为特征有2个。这个文档似乎与这一观点一致。

但是,出乎意料的是…

>>> logit_model.coefficientMatrixDenseMatrix(4, 2, [-1.2781, -2.8523, 0.0961, 0.5994, 0.6199, 0.9676, 0.5621, 1.2853], 1)>>> logit_model.interceptVectorDenseVector([-4.5912, 13.0291, 1.2544, -9.6923])

系数矩阵是4×2的,我有4个截距而不是3个。更奇怪的是这个:

>>> logit_model.numClasses4

由于某种奇怪的原因,模型“感觉”有4个类别,即使我只有3个(请查看下面的代码以进行检查)。

有什么建议吗?非常感谢。


这是完整的代码:

from pyspark.sql import functions as ffrom pyspark.sql import types as tfrom pyspark.ml import classification as clfrom pyspark.ml import feature as featcustomSchema = t.StructType(    [t.StructField('brand', t.IntegerType(), True),    t.StructField('sex', t.IntegerType(), True),    t.StructField('age', t.IntegerType(), True)])test_df01 = (    spark    .read    .format('csv')    .options(delimiter=',', header=False)    .load('/Users/vanni/Downloads/mlogit_test.csv', schema=customSchema))va = (    feat.VectorAssembler()    .setInputCols(['sex', 'age'])    .setOutputCol('features'))test_df03 = (    va    .transform(test_df01)    .drop('sex')    .drop('age')    .withColumnRenamed('brand', 'label'))logit_abst = (    cl.LogisticRegression()    .setFamily('multinomial')    .setStandardization(False)    .setThresholds([.5, .5, .5]) # 需要在知道实际值后调整    .setThreshold(None)    .setMaxIter(100) # 默认值    .setRegParam(0.0) # 默认值    .setElasticNetParam(0.0) # 默认值    .setTol(1e-6) # 默认值)logit_model = logit_abst.fit(test_df03)

这里是检查类别只有3个的代码:

>>> test_df03.select('label').distinct().orderBy('label').show()+-----+|label|+-----+|    1||    2||    3|+-----+

回答:

这里没有任何奇怪的事情发生。Spark假设标签是连续的整数值,以DoubleType表示,并且从0开始。

由于你得到的最大标签是3,Spark假设标签实际上是0, 1, 2, 3 – 即使数据集中从未出现0。

如果这种行为不符合你的需求,你应该重新编码标签为从0开始,或者在原始标签上应用StringIndexer

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注