Author: tdunning
Date: Sun Dec 12 22:40:16 2010
New Revision: 1044948
URL: http://svn.apache.org/viewvc?rev=1044948&view=rev
Log:
MAHOUT-557 - Fixed bug and added test that demonstrates how tied scores can
cause index out of range.
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/classifier/evaluation/Auc.java
mahout/trunk/core/src/test/java/org/apache/mahout/classifier/evaluation/AucTest.java
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/classifier/evaluation/Auc.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/classifier/evaluation/Auc.java?rev=1044948&r1=1044947&r2=1044948&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/classifier/evaluation/Auc.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/classifier/evaluation/Auc.java
Sun Dec 12 22:40:16 2010
@@ -157,18 +157,16 @@ public class Auc {
// how many negatives are tied?
int k0 = 0;
- while (i0 < n0 && v0 == tieScore) {
+ while (i0 < n0 && scores[0].get(i0) == tieScore) {
k0++;
i0++;
- v0 = scores[0].get(i0);
}
// and how many positives
int k1 = 0;
- while (i1 < n1 && v1 == tieScore) {
+ while (i1 < n1 && scores[1].get(i1) == tieScore) {
k1++;
i1++;
- v1 = scores[1].get(i1);
}
// we found k0 + k1 tied values which have
Modified:
mahout/trunk/core/src/test/java/org/apache/mahout/classifier/evaluation/AucTest.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/test/java/org/apache/mahout/classifier/evaluation/AucTest.java?rev=1044948&r1=1044947&r2=1044948&view=diff
==============================================================================
---
mahout/trunk/core/src/test/java/org/apache/mahout/classifier/evaluation/AucTest.java
(original)
+++
mahout/trunk/core/src/test/java/org/apache/mahout/classifier/evaluation/AucTest.java
Sun Dec 12 22:40:16 2010
@@ -39,6 +39,29 @@ public class AucTest extends MahoutTestC
}
@Test
+ public void testTies() {
+ Auc auc = new Auc();
+ Random gen = RandomUtils.getRandom();
+ auc.setProbabilityScore(false);
+ for (int i=0;i<100000;i++) {
+ auc.add(0, gen.nextGaussian());
+ auc.add(1, gen.nextGaussian() + 1);
+ }
+
+ // ties outside the normal range could cause index out of range
+ auc.add(0, 5.0);
+ auc.add(0, 5.0);
+ auc.add(0, 5.0);
+ auc.add(0, 5.0);
+
+ auc.add(1, 5.0);
+ auc.add(1, 5.0);
+ auc.add(1, 5.0);
+
+ assertEquals(0.76, auc.auc(), 0.05);
+ }
+
+ @Test
public void testEntropy() {
Auc auc = new Auc();
Random gen = RandomUtils.getRandom();