package water.api.schemas3;
import hex.AUC2;
import hex.ModelMetricsBinomial;
import water.api.API;
import water.util.TwoDimTable;
public class ModelMetricsBinomialV3<I extends ModelMetricsBinomial, S extends ModelMetricsBinomialV3<I, S>>
extends ModelMetricsBaseV3<I,S> {
// @API(help="The standard deviation of the training response.", direction=API.Direction.OUTPUT)
// public double sigma; // Belongs in a mythical ModelMetricsSupervisedV3
@API(help="The R^2 for this scoring run.", direction=API.Direction.OUTPUT)
public double r2;
@API(help="The logarithmic loss for this scoring run.", direction=API.Direction.OUTPUT)
public double logloss;
@API(help="The AUC for this scoring run.", direction=API.Direction.OUTPUT)
public double AUC;
@API(help="The Gini score for this scoring run.", direction=API.Direction.OUTPUT)
public double Gini;
@API(help="The mean misclassification error per class.", direction=API.Direction.OUTPUT)
public double mean_per_class_error;
@API(help="The class labels of the response.", direction=API.Direction.OUTPUT)
public String[] domain;
// @API(help = "The ConfusionMatrix at the threshold for maximum F1.", direction = API.Direction.OUTPUT)
// public ConfusionMatrixV3 cm;
@API(help = "The Metrics for various thresholds.", direction = API.Direction.OUTPUT, level = API.Level.expert)
public TwoDimTableV3 thresholds_and_metric_scores;
@API(help = "The Metrics for various criteria.", direction = API.Direction.OUTPUT, level = API.Level.secondary)
public TwoDimTableV3 max_criteria_and_metric_scores;
@API(help = "Gains and Lift table.", direction = API.Direction.OUTPUT, level = API.Level.secondary)
public TwoDimTableV3 gains_lift_table;
@Override
public S fillFromImpl(ModelMetricsBinomial modelMetrics) {
super.fillFromImpl(modelMetrics);
// sigma = modelMetrics._sigma;
r2 = modelMetrics.r2();
logloss = modelMetrics._logloss;
mean_per_class_error = modelMetrics._mean_per_class_error;
AUC2 auc = modelMetrics._auc;
if (null != auc) {
AUC = auc._auc;
Gini = auc._gini;
// Fill TwoDimTable
String[] thresholds = new String[auc._nBins];
for( int i=0; i<auc._nBins; i++ )
thresholds[i] = Double.toString(auc._ths[i]);
AUC2.ThresholdCriterion crits[] = AUC2.ThresholdCriterion.VALUES;
String[] colHeaders = new String[crits.length+2];
String[] colHeadersMax = new String[crits.length-8/*drop npr tpr etc.*/];
String[] types = new String[crits.length+2];
String[] formats = new String[crits.length+2];
colHeaders[0] = "Threshold";
types[0] = "double";
formats[0] = "%f";
int i;
for( i=0; i<crits.length; i++ ) {
if (colHeadersMax.length > i) colHeadersMax[i] = "max " + crits[i].toString();
colHeaders[i+1] = crits[i].toString();
types [i+1] = crits[i]._isInt ? "long" : "double";
formats [i+1] = crits[i]._isInt ? "%d" : "%f" ;
}
colHeaders[i+1] = "idx"; types[i+1] = "int"; formats[i+1] = "%d";
TwoDimTable thresholdsByMetrics = new TwoDimTable("Metrics for Thresholds", "Binomial metrics as a function of classification thresholds", new String[auc._nBins], colHeaders, types, formats, null );
for( i=0; i<auc._nBins; i++ ) {
int j=0;
thresholdsByMetrics.set(i, j, Double.valueOf(thresholds[i]));
for (j = 0; j < crits.length; j++) {
double d = crits[j].exec(auc, i); // Note: casts to Object are NOT redundant
thresholdsByMetrics.set(i, 1+j, crits[j]._isInt ? (Object) ((long) d) : d);
}
thresholdsByMetrics.set(i, 1+j, i);
}
this.thresholds_and_metric_scores = new TwoDimTableV3().fillFromImpl(thresholdsByMetrics);
// Fill TwoDimTable
TwoDimTable maxMetrics = new TwoDimTable("Maximum Metrics", "Maximum metrics at their respective thresholds", colHeadersMax,
new String[]{"Threshold","Value","idx"},
new String[]{"double", "double","long"},
new String[]{"%f", "%f", "%d"},
"Metric" );
for( i=0; i<colHeadersMax.length; i++ ) {
int idx = crits[i].max_criterion_idx(auc);
maxMetrics.set(i,0,idx==-1 ? Double.NaN : auc._ths[idx]);
maxMetrics.set(i,1,idx==-1 ? Double.NaN : crits[i].exec(auc,idx));
maxMetrics.set(i,2,idx);
}
max_criteria_and_metric_scores = new TwoDimTableV3().fillFromImpl(maxMetrics);
}
if (modelMetrics._gainsLift != null) {
TwoDimTable t = modelMetrics._gainsLift.createTwoDimTable();
if (t!=null) this.gains_lift_table = new TwoDimTableV3().fillFromImpl(t);
}
return (S) this;
}
}