use of org.jpmml.converter.Label in project jpmml-r by jpmml.
the class GLMConverter method encodeModel.
@Override
public Model encodeModel(Schema schema) {
RGenericVector glm = getObject();
RDoubleVector coefficients = (RDoubleVector) glm.getValue("coefficients");
RGenericVector family = (RGenericVector) glm.getValue("family");
Double intercept = coefficients.getValue(getInterceptName(), true);
RStringVector familyFamily = (RStringVector) family.getValue("family");
RStringVector familyLink = (RStringVector) family.getValue("link");
Label label = schema.getLabel();
List<? extends Feature> features = schema.getFeatures();
if (coefficients.size() != (features.size() + (intercept != null ? 1 : 0))) {
throw new IllegalArgumentException();
}
List<Double> featureCoefficients = getFeatureCoefficients(features, coefficients);
MiningFunction miningFunction = getMiningFunction(familyFamily.asScalar());
String targetCategory = null;
switch(miningFunction) {
case CLASSIFICATION:
{
CategoricalLabel categoricalLabel = (CategoricalLabel) label;
if (categoricalLabel.size() != 2) {
throw new IllegalArgumentException();
}
targetCategory = categoricalLabel.getValue(1);
}
break;
default:
break;
}
GeneralRegressionModel generalRegressionModel = new GeneralRegressionModel(GeneralRegressionModel.ModelType.GENERALIZED_LINEAR, miningFunction, ModelUtil.createMiningSchema(label), null, null, null).setDistribution(parseFamily(familyFamily.asScalar())).setLinkFunction(parseLinkFunction(familyLink.asScalar())).setLinkParameter(parseLinkParameter(familyLink.asScalar()));
GeneralRegressionModelUtil.encodeRegressionTable(generalRegressionModel, features, intercept, featureCoefficients, targetCategory);
switch(miningFunction) {
case CLASSIFICATION:
generalRegressionModel.setOutput(ModelUtil.createProbabilityOutput(DataType.DOUBLE, (CategoricalLabel) label));
break;
default:
break;
}
return generalRegressionModel;
}
use of org.jpmml.converter.Label in project jpmml-r by jpmml.
the class LRMConverter method encodeSchema.
@Override
public void encodeSchema(RExpEncoder encoder) {
RGenericVector lrm = getObject();
RIntegerVector freq = (RIntegerVector) lrm.getValue("freq");
RStringVector freqNames = freq.dimnames(0);
super.encodeSchema(encoder);
Label label = encoder.getLabel();
DataField dataField = (DataField) encoder.toCategorical(label.getName(), freqNames.getValues());
encoder.setLabel(dataField);
}
use of org.jpmml.converter.Label in project jpmml-r by jpmml.
the class ElmNNConverter method encodeModel.
@Override
public NeuralNetwork encodeModel(Schema schema) {
RGenericVector elmNN = getObject();
RDoubleVector inpweight = (RDoubleVector) elmNN.getValue("inpweight");
RDoubleVector biashid = (RDoubleVector) elmNN.getValue("biashid");
RDoubleVector outweight = (RDoubleVector) elmNN.getValue("outweight");
RStringVector actfun = (RStringVector) elmNN.getValue("actfun");
RDoubleVector nhid = (RDoubleVector) elmNN.getValue("nhid");
Label label = schema.getLabel();
List<? extends Feature> features = schema.getFeatures();
switch(actfun.asScalar()) {
case "purelin":
break;
default:
throw new IllegalArgumentException();
}
NeuralInputs neuralInputs = NeuralNetworkUtil.createNeuralInputs(features, DataType.DOUBLE);
List<? extends Entity> entities = neuralInputs.getNeuralInputs();
List<NeuralLayer> neuralLayers = new ArrayList<>(2);
NeuralLayer hiddenNeuralLayer = new NeuralLayer();
int rows = ValueUtil.asInt(nhid.asScalar());
int columns = 1 + features.size();
for (int row = 0; row < rows; row++) {
List<Double> weights = FortranMatrixUtil.getRow(inpweight.getValues(), rows, columns, row);
Double bias = biashid.getValue(row);
bias += weights.remove(0);
Neuron neuron = NeuralNetworkUtil.createNeuron(entities, weights, bias).setId("hidden/" + String.valueOf(row + 1));
hiddenNeuralLayer.addNeurons(neuron);
}
neuralLayers.add(hiddenNeuralLayer);
entities = hiddenNeuralLayer.getNeurons();
NeuralLayer outputNeuralLayer = new NeuralLayer();
// XXX
columns = 1;
for (int column = 0; column < columns; column++) {
List<Double> weights = FortranMatrixUtil.getColumn(outweight.getValues(), rows, columns, column);
Double bias = Double.NaN;
Neuron neuron = NeuralNetworkUtil.createNeuron(entities, weights, bias).setId("output/" + String.valueOf(column + 1));
outputNeuralLayer.addNeurons(neuron);
}
neuralLayers.add(outputNeuralLayer);
entities = outputNeuralLayer.getNeurons();
NeuralOutputs neuralOutputs = NeuralNetworkUtil.createRegressionNeuralOutputs(entities, (ContinuousLabel) label);
NeuralNetwork neuralNetwork = new NeuralNetwork(MiningFunction.REGRESSION, NeuralNetwork.ActivationFunction.IDENTITY, ModelUtil.createMiningSchema(label), neuralInputs, neuralLayers).setNeuralOutputs(neuralOutputs);
return neuralNetwork;
}
use of org.jpmml.converter.Label in project jpmml-sparkml by jpmml.
the class ModelConverter method encodeSchema.
public Schema encodeSchema(SparkMLEncoder encoder) {
T model = getTransformer();
Label label = null;
if (model instanceof HasLabelCol) {
HasLabelCol hasLabelCol = (HasLabelCol) model;
String labelCol = hasLabelCol.getLabelCol();
Feature feature = encoder.getOnlyFeature(labelCol);
MiningFunction miningFunction = getMiningFunction();
switch(miningFunction) {
case CLASSIFICATION:
{
if (feature instanceof CategoricalFeature) {
CategoricalFeature categoricalFeature = (CategoricalFeature) feature;
DataField dataField = encoder.getDataField(categoricalFeature.getName());
label = new CategoricalLabel(dataField);
} else if (feature instanceof ContinuousFeature) {
ContinuousFeature continuousFeature = (ContinuousFeature) feature;
int numClasses = 2;
if (model instanceof ClassificationModel) {
ClassificationModel<?, ?> classificationModel = (ClassificationModel<?, ?>) model;
numClasses = classificationModel.numClasses();
}
List<String> categories = new ArrayList<>();
for (int i = 0; i < numClasses; i++) {
categories.add(String.valueOf(i));
}
Field<?> field = encoder.toCategorical(continuousFeature.getName(), categories);
encoder.putOnlyFeature(labelCol, new CategoricalFeature(encoder, field, categories));
label = new CategoricalLabel(field.getName(), field.getDataType(), categories);
} else {
throw new IllegalArgumentException("Expected a categorical or categorical-like continuous feature, got " + feature);
}
}
break;
case REGRESSION:
{
Field<?> field = encoder.toContinuous(feature.getName());
field.setDataType(DataType.DOUBLE);
label = new ContinuousLabel(field.getName(), field.getDataType());
}
break;
default:
throw new IllegalArgumentException("Mining function " + miningFunction + " is not supported");
}
}
if (model instanceof ClassificationModel) {
ClassificationModel<?, ?> classificationModel = (ClassificationModel<?, ?>) model;
CategoricalLabel categoricalLabel = (CategoricalLabel) label;
int numClasses = classificationModel.numClasses();
if (numClasses != categoricalLabel.size()) {
throw new IllegalArgumentException("Expected " + numClasses + " target categories, got " + categoricalLabel.size() + " target categories");
}
}
String featuresCol = model.getFeaturesCol();
List<Feature> features = encoder.getFeatures(featuresCol);
if (model instanceof PredictionModel) {
PredictionModel<?, ?> predictionModel = (PredictionModel<?, ?>) model;
int numFeatures = predictionModel.numFeatures();
if (numFeatures != -1 && features.size() != numFeatures) {
throw new IllegalArgumentException("Expected " + numFeatures + " features, got " + features.size() + " features");
}
}
Schema result = new Schema(label, features);
return result;
}
use of org.jpmml.converter.Label in project jpmml-r by jpmml.
the class GLMConverter method encodeSchema.
@Override
public void encodeSchema(RExpEncoder encoder) {
RGenericVector glm = getObject();
RGenericVector family = (RGenericVector) glm.getValue("family");
RGenericVector model = (RGenericVector) glm.getValue("model");
RStringVector familyFamily = (RStringVector) family.getValue("family");
super.encodeSchema(encoder);
MiningFunction miningFunction = getMiningFunction(familyFamily.asScalar());
switch(miningFunction) {
case CLASSIFICATION:
Label label = encoder.getLabel();
RIntegerVector variable = (RIntegerVector) model.getValue((label.getName()).getValue());
DataField dataField = (DataField) encoder.toCategorical(label.getName(), RExpUtil.getFactorLevels(variable));
encoder.setLabel(dataField);
break;
default:
break;
}
}
Aggregations