private List<String> toStringList(double[] doubleArray) {
   List<String> stringList = new ArrayList<String>(doubleArray.length);
   for (int i = 0; i < doubleArray.length; i++) {
     stringList.add(String.valueOf(doubleArray[i]));
   }
   return stringList;
 }
 /**
  * @param features Array of names of features
  * @param weights Array of weights of features
  * @return List of FeatureImportance in the model {@link FeatureImportance}
  */
 private List<FeatureImportance> getFeatureWeights(
     SortedMap<Integer, String> features, double[] weights) {
   List<FeatureImportance> featureWeights = new ArrayList<FeatureImportance>();
   int i = 0;
   for (String featureName : features.values()) {
     FeatureImportance featureImportance = new FeatureImportance();
     featureImportance.setLabel(featureName);
     featureImportance.setValue(weights[i]);
     featureWeights.add(featureImportance);
     i++;
   }
   return featureWeights;
 }
  /**
   * This method returns multiclass confusion matrix for a given multiclass metric object
   *
   * @param multiclassMetrics Multiclass metric object
   */
  private MulticlassConfusionMatrix getMulticlassConfusionMatrix(
      MulticlassMetrics multiclassMetrics, MLModel mlModel) {
    MulticlassConfusionMatrix multiclassConfusionMatrix = new MulticlassConfusionMatrix();
    if (multiclassMetrics != null) {
      int size = multiclassMetrics.confusionMatrix().numCols();
      double[] matrixArray = multiclassMetrics.confusionMatrix().toArray();
      double[][] matrix = new double[size][size];
      // set values of matrix into a 2D array
      for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
          matrix[i][j] = matrixArray[(j * size) + i];
        }
      }
      multiclassConfusionMatrix.setMatrix(matrix);

      List<Map<String, Integer>> encodings = mlModel.getEncodings();
      // decode only if encodings are available
      if (encodings != null) {
        // last index is response variable encoding
        Map<String, Integer> encodingMap = encodings.get(encodings.size() - 1);
        List<String> decodedLabels = new ArrayList<String>();
        for (double label : multiclassMetrics.labels()) {
          Integer labelInt = (int) label;
          String decodedLabel = MLUtils.getKeyByValue(encodingMap, labelInt);
          if (decodedLabel != null) {
            decodedLabels.add(decodedLabel);
          } else {
            continue;
          }
        }
        multiclassConfusionMatrix.setLabels(decodedLabels);
      } else {
        List<String> labelList = toStringList(multiclassMetrics.labels());
        multiclassConfusionMatrix.setLabels(labelList);
      }

      multiclassConfusionMatrix.setSize(size);
    }
    return multiclassConfusionMatrix;
  }