Browse Source

[ML] Remove LegacyFeatureImportance (#62989)

As #62486 has been backported to 7.x, we can now
remove `LegacyFeatureImportance` from the master branch.
Dimitris Athanasiou 5 years ago
parent
commit
b4f57bc979

+ 2 - 14
x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/results/ClassificationInferenceResults.java

@@ -5,7 +5,6 @@
  */
 package org.elasticsearch.xpack.core.ml.inference.results;
 
-import org.elasticsearch.Version;
 import org.elasticsearch.common.io.stream.StreamInput;
 import org.elasticsearch.common.io.stream.StreamOutput;
 import org.elasticsearch.common.xcontent.XContentBuilder;
@@ -84,14 +83,7 @@ public class ClassificationInferenceResults extends SingleValueInferenceResults
 
     public ClassificationInferenceResults(StreamInput in) throws IOException {
         super(in);
-        if (in.getVersion().onOrAfter(Version.V_8_0_0)) {
-            this.featureImportance = in.readList(ClassificationFeatureImportance::new);
-        } else {
-            this.featureImportance = in.readList(LegacyFeatureImportance::new)
-                .stream()
-                .map(LegacyFeatureImportance::forClassification)
-                .collect(Collectors.toList());
-        }
+        this.featureImportance = in.readList(ClassificationFeatureImportance::new);
         this.classificationLabel = in.readOptionalString();
         this.topClasses = Collections.unmodifiableList(in.readList(TopClassEntry::new));
         this.topNumClassesField = in.readString();
@@ -120,11 +112,7 @@ public class ClassificationInferenceResults extends SingleValueInferenceResults
     @Override
     public void writeTo(StreamOutput out) throws IOException {
         super.writeTo(out);
-        if (out.getVersion().onOrAfter(Version.V_8_0_0)) {
-            out.writeList(featureImportance);
-        } else {
-            out.writeList(featureImportance.stream().map(LegacyFeatureImportance::fromClassification).collect(Collectors.toList()));
-        }
+        out.writeList(featureImportance);
         out.writeOptionalString(classificationLabel);
         out.writeCollection(topClasses);
         out.writeString(topNumClassesField);

+ 0 - 160
x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/results/LegacyFeatureImportance.java

@@ -1,160 +0,0 @@
-/*
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
- * or more contributor license agreements. Licensed under the Elastic License;
- * you may not use this file except in compliance with the Elastic License.
- */
-package org.elasticsearch.xpack.core.ml.inference.results;
-
-import org.elasticsearch.Version;
-import org.elasticsearch.common.io.stream.StreamInput;
-import org.elasticsearch.common.io.stream.StreamOutput;
-import org.elasticsearch.common.io.stream.Writeable;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-/**
- * This class captures serialization of feature importance for
- * classification and regression prior to version 7.10.
- */
-public class LegacyFeatureImportance implements Writeable {
-
-    public static LegacyFeatureImportance fromClassification(ClassificationFeatureImportance classificationFeatureImportance) {
-        return new LegacyFeatureImportance(
-            classificationFeatureImportance.getFeatureName(),
-            classificationFeatureImportance.getTotalImportance(),
-            classificationFeatureImportance.getClassImportance().stream().map(classImportance -> new ClassImportance(
-                classImportance.getClassName(), classImportance.getImportance())).collect(Collectors.toList())
-        );
-    }
-
-    public static LegacyFeatureImportance fromRegression(RegressionFeatureImportance regressionFeatureImportance) {
-        return new LegacyFeatureImportance(
-            regressionFeatureImportance.getFeatureName(),
-            regressionFeatureImportance.getImportance(),
-            null
-        );
-    }
-
-    private final List<ClassImportance> classImportance;
-    private final double importance;
-    private final String featureName;
-
-    LegacyFeatureImportance(String featureName, double importance, List<ClassImportance> classImportance) {
-        this.featureName = Objects.requireNonNull(featureName);
-        this.importance = importance;
-        this.classImportance = classImportance == null ? null : Collections.unmodifiableList(classImportance);
-    }
-
-    public LegacyFeatureImportance(StreamInput in) throws IOException {
-        this.featureName = in.readString();
-        this.importance = in.readDouble();
-        if (in.readBoolean()) {
-            if (in.getVersion().before(Version.V_7_10_0)) {
-                Map<String, Double> classImportance = in.readMap(StreamInput::readString, StreamInput::readDouble);
-                this.classImportance = ClassImportance.fromMap(classImportance);
-            } else {
-                this.classImportance = in.readList(ClassImportance::new);
-            }
-        } else {
-            this.classImportance = null;
-        }
-    }
-
-    @Override
-    public void writeTo(StreamOutput out) throws IOException {
-        out.writeString(featureName);
-        out.writeDouble(importance);
-        out.writeBoolean(classImportance != null);
-        if (classImportance != null) {
-            if (out.getVersion().before(Version.V_7_10_0)) {
-                out.writeMap(ClassImportance.toMap(classImportance), StreamOutput::writeString, StreamOutput::writeDouble);
-            } else {
-                out.writeList(classImportance);
-            }
-        }
-    }
-
-    @Override
-    public boolean equals(Object object) {
-        if (object == this) { return true; }
-        if (object == null || getClass() != object.getClass()) { return false; }
-        LegacyFeatureImportance that = (LegacyFeatureImportance) object;
-        return Objects.equals(featureName, that.featureName)
-            && Objects.equals(importance, that.importance)
-            && Objects.equals(classImportance, that.classImportance);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(featureName, importance, classImportance);
-    }
-
-    public RegressionFeatureImportance forRegression() {
-        assert classImportance == null;
-        return new RegressionFeatureImportance(featureName, importance);
-    }
-
-    public ClassificationFeatureImportance forClassification() {
-        assert classImportance != null;
-        return new ClassificationFeatureImportance(featureName, classImportance.stream().map(
-            aClassImportance -> new ClassificationFeatureImportance.ClassImportance(
-                aClassImportance.className, aClassImportance.importance)).collect(Collectors.toList()));
-    }
-
-    public static class ClassImportance implements Writeable {
-
-        private static ClassImportance fromMapEntry(Map.Entry<String, Double> entry) {
-            return new ClassImportance(entry.getKey(), entry.getValue());
-        }
-
-        private static List<ClassImportance> fromMap(Map<String, Double> classImportanceMap) {
-            return classImportanceMap.entrySet().stream().map(ClassImportance::fromMapEntry).collect(Collectors.toList());
-        }
-
-        private static Map<String, Double> toMap(List<ClassImportance> importances) {
-            return importances.stream().collect(Collectors.toMap(i -> i.className.toString(), i -> i.importance));
-        }
-
-        private final Object className;
-        private final double importance;
-
-        public ClassImportance(Object className, double importance) {
-            this.className = className;
-            this.importance = importance;
-        }
-
-        public ClassImportance(StreamInput in) throws IOException {
-            this.className = in.readGenericValue();
-            this.importance = in.readDouble();
-        }
-
-        double getImportance() {
-            return importance;
-        }
-
-        @Override
-        public void writeTo(StreamOutput out) throws IOException {
-            out.writeGenericValue(className);
-            out.writeDouble(importance);
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) return true;
-            if (o == null || getClass() != o.getClass()) return false;
-            ClassImportance that = (ClassImportance) o;
-            return Double.compare(that.importance, importance) == 0 &&
-                Objects.equals(className, that.className);
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(className, importance);
-        }
-    }
-}

+ 2 - 14
x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/results/RegressionInferenceResults.java

@@ -5,7 +5,6 @@
  */
 package org.elasticsearch.xpack.core.ml.inference.results;
 
-import org.elasticsearch.Version;
 import org.elasticsearch.common.io.stream.StreamInput;
 import org.elasticsearch.common.io.stream.StreamOutput;
 import org.elasticsearch.common.xcontent.XContentBuilder;
@@ -69,25 +68,14 @@ public class RegressionInferenceResults extends SingleValueInferenceResults {
 
     public RegressionInferenceResults(StreamInput in) throws IOException {
         super(in);
-        if (in.getVersion().onOrAfter(Version.V_8_0_0)) {
-            this.featureImportance = in.readList(RegressionFeatureImportance::new);
-        } else {
-            this.featureImportance = in.readList(LegacyFeatureImportance::new)
-                .stream()
-                .map(LegacyFeatureImportance::forRegression)
-                .collect(Collectors.toList());
-        }
+        this.featureImportance = in.readList(RegressionFeatureImportance::new);
         this.resultsField = in.readString();
     }
 
     @Override
     public void writeTo(StreamOutput out) throws IOException {
         super.writeTo(out);
-        if (out.getVersion().onOrAfter(Version.V_8_0_0)) {
-            out.writeList(featureImportance);
-        } else {
-            out.writeList(featureImportance.stream().map(LegacyFeatureImportance::fromRegression).collect(Collectors.toList()));
-        }
+        out.writeList(featureImportance);
         out.writeString(resultsField);
     }
 

+ 0 - 77
x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/inference/results/LegacyFeatureImportanceTests.java

@@ -1,77 +0,0 @@
-/*
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
- * or more contributor license agreements. Licensed under the Elastic License;
- * you may not use this file except in compliance with the Elastic License.
- */
-package org.elasticsearch.xpack.core.ml.inference.results;
-
-import org.elasticsearch.common.io.stream.Writeable;
-import org.elasticsearch.test.AbstractWireSerializingTestCase;
-
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import static org.hamcrest.Matchers.equalTo;
-
-public class LegacyFeatureImportanceTests extends AbstractWireSerializingTestCase<LegacyFeatureImportance> {
-
-    public static LegacyFeatureImportance createRandomInstance() {
-        return createRandomInstance(randomBoolean());
-    }
-
-    public static LegacyFeatureImportance createRandomInstance(boolean hasClasses) {
-        double importance = randomDouble();
-        List<LegacyFeatureImportance.ClassImportance> classImportances = null;
-        if (hasClasses) {
-            classImportances = Stream.generate(() -> randomAlphaOfLength(10))
-                .limit(randomLongBetween(2, 10))
-                .map(featureName -> new LegacyFeatureImportance.ClassImportance(featureName, randomDouble()))
-                .collect(Collectors.toList());
-
-            importance = classImportances.stream().mapToDouble(LegacyFeatureImportance.ClassImportance::getImportance).map(Math::abs).sum();
-        }
-        return new LegacyFeatureImportance(randomAlphaOfLength(10), importance, classImportances);
-    }
-
-    @Override
-    protected LegacyFeatureImportance createTestInstance() {
-        return createRandomInstance();
-    }
-
-    @Override
-    protected Writeable.Reader<LegacyFeatureImportance> instanceReader() {
-        return LegacyFeatureImportance::new;
-    }
-
-    public void testClassificationConversion() {
-        {
-            ClassificationFeatureImportance classificationFeatureImportance = ClassificationFeatureImportanceTests.createRandomInstance();
-            LegacyFeatureImportance legacyFeatureImportance = LegacyFeatureImportance.fromClassification(classificationFeatureImportance);
-            ClassificationFeatureImportance convertedFeatureImportance = legacyFeatureImportance.forClassification();
-            assertThat(convertedFeatureImportance, equalTo(classificationFeatureImportance));
-        }
-        {
-            LegacyFeatureImportance legacyFeatureImportance = createRandomInstance(true);
-            ClassificationFeatureImportance classificationFeatureImportance = legacyFeatureImportance.forClassification();
-            LegacyFeatureImportance convertedFeatureImportance = LegacyFeatureImportance.fromClassification(
-                classificationFeatureImportance);
-            assertThat(convertedFeatureImportance, equalTo(legacyFeatureImportance));
-        }
-    }
-
-    public void testRegressionConversion() {
-        {
-            RegressionFeatureImportance regressionFeatureImportance = RegressionFeatureImportanceTests.createRandomInstance();
-            LegacyFeatureImportance legacyFeatureImportance = LegacyFeatureImportance.fromRegression(regressionFeatureImportance);
-            RegressionFeatureImportance convertedFeatureImportance = legacyFeatureImportance.forRegression();
-            assertThat(convertedFeatureImportance, equalTo(regressionFeatureImportance));
-        }
-        {
-            LegacyFeatureImportance legacyFeatureImportance = createRandomInstance(false);
-            RegressionFeatureImportance regressionFeatureImportance = legacyFeatureImportance.forRegression();
-            LegacyFeatureImportance convertedFeatureImportance = LegacyFeatureImportance.fromRegression(regressionFeatureImportance);
-            assertThat(convertedFeatureImportance, equalTo(legacyFeatureImportance));
-        }
-    }
-}