我正在使用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时,它会出现同样的问题吗?
只有在使用封闭形式解决方案时才会出现故障:
(X T X)-1 X T y
并应用了额外的验证。
但是,这不是唯一可以使用的方法,而不是Spark中通常使用的方法。可以使用数值方法,如
使用pseudoinverse。这是通常在不同包中实现线性的方式。
迭代优化程序包括梯度下降的不同变体。
即使(X T X)不可逆或病态也可以使用。当然不能保证这些会产生任何合理的解决方案。
仅当要素数低于4096(默认值为)时,默认情况下才o.a.s.ml.regression.LinearRegression使用闭合形式解(“普通”求解器LinearRegression.MAX_FEATURES_FOR_NORMAL_SOLVER
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。