[英]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.