具有比数据点更多特征的数据集中的PySpark线性回归

时间:2018-11-28 16:14:46

标签: apache-spark pyspark linear-regression apache-spark-mllib apache-spark-ml

我正在使用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:由于使用变量变换可以将Logistic回归转化为线性回归问题,当p> n时,它是否会出现相同的问题?

1 个答案:

答案 0 :(得分:1)

仅当您使用封闭式解决方案时,才会预期失败:

(X T X) -1 X T y

并应用了其他验证。

但是,这不是唯一可以使用的方法,也不是Spark中通常使用的方法。可以使用数值方法,例如

  • 使用pseudoinverse。通常是在不同的程序包中实现线性方式。

  • 迭代优化过程,包括梯度下降的不同变体。

,即使(X T X)不可逆或患病也可以使用。当然,我们无法保证会导致任何明智的解决方案。

默认情况下,o.a.s.ml.regression.LinearRegression仅在要素数量少于4096(默认值为"normal" solver)时才使用封闭式解决方案(LinearRegression.MAX_FEATURES_FOR_NORMAL_SOLVER)。