3

我正在尝试通过 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)

我还没有验证新模型,也许它也适合数据,但简单地更改名称应该不会影响算法的工作方式。正确的??

谢谢杨

4

2 回答 2

0

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

于 2013-01-20T23:10:28.350 回答
0

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

在 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.StaticWordValueEncoderencoding方法,它使用int n = hashForProbe(originalForm, data.size(), name, i);方法来计算特征索引:originalForm是特征的名称,data.size()是特征的个数,name是编码器的常量名,i是“探针编号”已更改。

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

于 2013-05-10T23:41:11.237 回答