繁体   English   中英

简单地改变apache Mahout分类器输入中的csv头产生不同的模型?

[英]simply changing csv header in apache Mahout classifier input produces different model?

我正在尝试通过Mahout分类器示例(donut.csv)。 但我发现只需更改标题行中某些列的名称,并在分类器命令中更改相应的预测变量名称,就会产生不同的模型。 这根本不符合逻辑。

首先,你获得donut.csv

mahout cat donut.csv |tail -40 > donut0.csv

(“尾巴”是因为mahout cat产生一些初始信息行)

然后我们使用以下命令来训练donut0.csv :(正如“Mahout in action”一书中所建议的那样)

mahout trainlogistic --input donut0.csv \
--output ./model \
--target color --categories 2 \
--predictors x y a b c  --types numeric \
--features 20 --passes 100 --rate 50

它给出了以下输出

color ~ 7.068*Intercept Term + 0.581*a + -1.369*b + -25.059*c + 0.581*x + 2.319*y
      Intercept Term 7.06759
                   a 0.58123
                   b -1.36893
                   c -25.05945
                   x 0.58123
                   y 2.31879
    0.000000000     0.000000000     0.000000000     0.000000000     0.000000000    -1.368933989     0.000000000     0.000000000     0.000000000     0.000000000     0.581234210     0.000000000     0.000000000     7.067587159     0.000000000     0.000000000     0.000000000     2.318786209     0.000000000   -25.059452292 
12/04/27 09:29:21 INFO driver.MahoutDriver: Program took 789 ms (Minutes: 0.01315)

但是如果只是将标题中的“x”列更改为“xa”,并在命令中将相应的预测变量名称更改,则输出模型会完全更改。

$ head -3 donut4.csv 
xa,y,shape,color,k,k0,xx,xy,yy,a,b,c,bias
0.923307513352484,0.0135197141207755,21,20,4,8,0.852496764213146,0.0124828536260896,0.000182782669907495,0.923406490600458,0.0778750292332978,0.644866125183976,1
0.711011884035543,0.909141522599384,22,20,3,9,0.505537899239772,0.64641042683833,0.826538308114327,1.15415605849213,0.953966686673604,0.46035073663368,1



mahout trainlogistic --input donut4.csv \
--output ./model \
--target color --categories 2 \
--predictors xa y a b c  --types numeric \
--features 20 --passes 100 --rate 50



color ~ 6.380*Intercept Term + -1.913*a + -0.577*b + -23.236*c + 2.647*xa + 3.009*y
      Intercept Term 6.38017
                   a -1.91308
                   b -0.57676
                   c -23.23552
                  xa 2.64657
                   y 3.00925
    0.000000000     0.000000000     0.000000000     0.000000000     0.000000000    -0.576759549     0.000000000     0.000000000     2.646572912     0.000000000    -1.913075634     0.000000000     0.000000000     6.380173126     0.000000000     0.000000000     0.000000000     3.009245162     0.000000000   -23.235521029 
12/04/27 10:21:10 INFO driver.MahoutDriver: Program took 728 ms (Minutes: 0.012133333333333333)

我还没有验证新模型,也许它也适合数据,但只是改变名称应该对算法的工作方式没有影响。 对??

谢谢杨

我怀疑这是标题的变化。 我更容易期待它是因为算法中选择的随机值的值不同。 尝试两次运行,不做任何更改,看看是否有任何变化。

它与特征散列有关。 特征名称用于确定特征向量中权重的放置位置。

在20个新闻组示例中,特征向量在org.apache.mahout.classifier.sgd.TrainNewsGroups类中完成。 电话

Vector v = helper.encodeFeatureVector(file, actual, leakType, overallCounts);

是实际创建特征向量的东西。

它使用“特征散列”,这样多个特征可以“散列”到矢量中的相同索引中。 使用以下编码器在NewsgroupHelper类中进行实际的功能散列:

    private final FeatureVectorEncoder encoder = new StaticWordValueEncoder("body");

传入20个功能(使用--features 20)命令行参数,但只使用5个功能(--predictors xa yabc)。

回顾一下NewsgroupHelper代码, encoder.addToVector(word, Math.log1p(words.count(word)), v); 呼叫,它将单词添加到编码器。 显而易见的是,对于'x'功能,哈希索引不会与其他5个功能冲突。 但是,当您使用'xa'功能时,哈希会与其他名称冲突,并将其权重添加到要素向量中。

如果你看一下org.apache.mahout.vectorizer.encoders.StaticWordValueEncoder编码方法,它使用int n = hashForProbe(originalForm, data.size(), name, i); 计算特征索引的方法:originalForm是特征的名称,data.size()是特征的数量,name是编码器的常量名称,i是更改的“探测号”。

TL; DR'x'和'xa'名称在特征散列中发生碰撞,并且您没有循环遍历足够的探针以找到一组没有碰撞的编码向量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM