我一直在用Spark的glmnet软件包(我能根据其他论坛帖子找到的最接近的类比)对Spark 1.6.2 ML的LogisticRegression进行正面比较。
我在使用分类功能时特别关注这两个适合的包。使用连续功能时,两个包的结果具有可比性。
对于我第一次使用Spark,我使用ML Pipeline API转换我的单个21级分类变量(称为教师的FAC),使用StringIndexer,然后使用OneHotEncoder获取二进制矢量表示。
当我在Spark和R中使用我的模型时,我得到以下几组结果(它们甚至不会关闭):
SPARK 1.6.2 ML
lrModel.intercept -3.1453838659926427
lrModel.weights [0.37664264958084287,0.697784342445422,0.4269429071484017,0.3521764371898419,0.19233585960734872,0.6708049751689226,0.49342372792676115,0.5471489576300356,0.37650628365008465,1.0447861554914701,0.5371820187662734,0.4556833133252492,0.2873530144304645,0.09916227313130375,0.1378469333986134,0.20412095883272838,0.4494641670133712,0.4499625784826652,0.489912016708041,0.5433020878341336]
R(glmnet)
(拦截)-2.79255253 facG -0.35292166 facU -0.16058275 facN 0.69187146 facY -0.06555711 facA 0.09655696 facI 0.02374558 facK -0.25373146 facX 0.31791765 facM 0.14054251 facC 0.02362977 facT 0.07407357 facP 0.09709607 见0.10282076 facH -0.21501281 facQ 0.19044412 见0.18432837 facF 0.34494177 fac0 0.13707197 facV -0.14871580 fac 0.19431703
我手动检查了glmnet结果,并且他们进行了更正(计算具有特定级别的分类特征的训练样本的比例,并将其与估计模型下的softmax概率进行比较)。即使最大值,这些结果也不会改变。没有。优化中的迭代次数设置为1000000,收敛容差设置为1E-15。将Spark LogisticRegression权重初始化为glmnet估计权重(Spark优化不同的成本函数?)时,这些结果也不会改变。
我应该说优化问题在这两种方法之间没有区别。你应该最大限度地减少后勤损失(一个凸面),从而得到几乎完全相同的答案。)
现在,当我手动将FAC功能重新编码为数据文件中的二进制向量并将这些二进制列读取为" DoubleType" (使用Spark的DataFrame架构),我得到了非常可比的结果。 (以下结果的系数顺序与上述结果不同。参考水平也不同 - " B"在第一种情况下," A"在第二种情况下 - - 此测试的系数应与上述测试的系数不匹配。)
SPARK 1.6.2 ML
lrModel.intercept -2.9530485080391378
lrModel.weights [-0.19233467682265934,0.8524505857034615,0.09501714540028124,0.25712829253044844,0.18430675058702053,0.09317325898819705,0.4784688407322236,0.3010877381053835,0.18417033887042242,0.2346069926274015,0.2576267066227656,0.2633474197307803,0.05448893119304087,0.35096612444193326,0.3448460751810199,0.505448794876487,0.29757609104571175,0.011785058030487976,0.3548130904832268,0.15984047288368383]
R(glmnet) S0 (拦截)-2.9419468179 FAC_B -0.2045928975 FAC_C 0.8402716731 FAC_E 0.0828962518 FAC_F 0.2450427806 FAC_G 0.1723424956 FAC_H -0.1051037449 FAC_I 0.4666239456 FAC_K 0.2893153021 FAC_M 0.1724536240 FAC_N 0.2229762780 FAC_O 0.2460295934 FAC_P 0.2517981380 FAC_Q -0.0660069035 FAC_S 0.3394729194 FAC_T 0.3334048723 FAC_U 0.4941379563 FAC_V 0.2863010635 FAC_W 0.0005482422 FAC_X 0.3436361348 FAC_Y 0.1487405173
两者的标准化设置为FALSE并且不执行正则化(您不应该在此执行它,因为您实际上只是学习了每个特征级别的发生率并且二进制特征列完全是彼此不相关)。此外,我应该提到,分类特征范围的21个级别的发生率从大约800到大约3500(因此这不是由于缺乏数据;估计中的大误差)。
有人经历过这个吗?我向Spark家伙报告了这一步。
一如既往地感谢您的帮助。