use of org.knime.core.node.port.pmml.PMMLPortObjectSpecCreator in project knime-core by knime.
the class LogRegLearner method init.
/**
* Initialize instance and check if settings are consistent.
*/
private void init(final DataTableSpec inSpec, final PMMLPortObjectSpec pmmlSpec, final Set<String> exclude) throws InvalidSettingsException {
List<String> inputCols = new ArrayList<String>();
for (DataColumnSpec column : inSpec) {
inputCols.add(column.getName());
}
if (!m_settings.getIncludeAll()) {
List<String> included = Arrays.asList(m_settings.getIncludedColumns());
if (!inputCols.containsAll(included)) {
LOGGER.warn("Input does not contain all learning columns. " + "Proceed with the remaining learning columns.");
}
inputCols.retainAll(included);
}
inputCols.remove(m_settings.getTargetColumn());
if (inputCols.isEmpty()) {
throw new InvalidSettingsException("At least one column must " + "be included.");
}
DataColumnSpec targetColSpec = null;
List<DataColumnSpec> regressorColSpecs = new ArrayList<DataColumnSpec>();
// Auto configuration when target is not set
if (null == m_settings.getTargetColumn() && m_settings.getIncludeAll()) {
for (int i = 0; i < inSpec.getNumColumns(); i++) {
DataColumnSpec colSpec = inSpec.getColumnSpec(i);
String colName = colSpec.getName();
inputCols.remove(colName);
if (colSpec.getType().isCompatible(NominalValue.class)) {
m_settings.setTargetColumn(colName);
}
}
// when there is no column with nominal data
if (null == m_settings.getTargetColumn()) {
throw new InvalidSettingsException("No column in " + "spec compatible to \"NominalValue\".");
}
}
// remove all columns that should not be used
inputCols.removeAll(exclude);
for (int i = 0; i < inSpec.getNumColumns(); i++) {
DataColumnSpec colSpec = inSpec.getColumnSpec(i);
String colName = colSpec.getName();
if (m_settings.getTargetColumn().equals(colName)) {
if (colSpec.getType().isCompatible(NominalValue.class)) {
targetColSpec = colSpec;
} else {
throw new InvalidSettingsException("Type of column \"" + colName + "\" is not nominal.");
}
} else if (inputCols.contains(colName)) {
if (colSpec.getType().isCompatible(DoubleValue.class) || colSpec.getType().isCompatible(NominalValue.class)) {
regressorColSpecs.add(colSpec);
} else {
throw new InvalidSettingsException("Type of column \"" + colName + "\" is not one of the allowed types, " + "which are numeric or nomial.");
}
}
}
if (null != targetColSpec) {
// Check if target has at least two categories.
final Set<DataCell> targetValues = targetColSpec.getDomain().getValues();
if (targetValues != null && targetValues.size() < 2) {
throw new InvalidSettingsException("The target column \"" + targetColSpec.getName() + "\" has one value, only. " + "At least two target categories are expected.");
}
String[] learnerCols = new String[regressorColSpecs.size() + 1];
for (int i = 0; i < regressorColSpecs.size(); i++) {
learnerCols[i] = regressorColSpecs.get(i).getName();
}
learnerCols[learnerCols.length - 1] = targetColSpec.getName();
PMMLPortObjectSpecCreator creator = new PMMLPortObjectSpecCreator(pmmlSpec, inSpec);
creator.setTargetCols(Arrays.asList(targetColSpec));
creator.setLearningCols(regressorColSpecs);
m_pmmlOutSpec = creator.createSpec();
m_learner = new Learner(m_pmmlOutSpec, m_settings.getTargetReferenceCategory(), m_settings.getSortTargetCategories(), m_settings.getSortIncludesCategories());
} else {
throw new InvalidSettingsException("The target is " + "not in the input.");
}
}
use of org.knime.core.node.port.pmml.PMMLPortObjectSpecCreator in project knime-core by knime.
the class LogRegLearnerNodeModel method execute.
/**
* {@inheritDoc}
*/
@Override
protected PortObject[] execute(final PortObject[] inObjects, final ExecutionContext exec) throws Exception {
final BufferedDataTable data = (BufferedDataTable) inObjects[0];
DataTableSpec tableSpec = data.getDataTableSpec();
// handle the optional PMML input
PMMLPortObject inPMMLPort = m_pmmlInEnabled ? (PMMLPortObject) inObjects[1] : null;
PMMLPortObjectSpec inPMMLSpec = null;
if (inPMMLPort != null) {
inPMMLSpec = inPMMLPort.getSpec();
} else {
PMMLPortObjectSpecCreator creator = new PMMLPortObjectSpecCreator(tableSpec);
inPMMLSpec = creator.createSpec();
inPMMLPort = new PMMLPortObject(inPMMLSpec);
}
LogRegLearner learner = new LogRegLearner(new PortObjectSpec[] { tableSpec, inPMMLSpec }, m_pmmlInEnabled, m_settings);
m_content = learner.execute(new PortObject[] { data, inPMMLPort }, exec);
String warn = learner.getWarningMessage();
if (warn != null) {
setWarningMessage(warn);
}
// third argument is ignored since we provide a port
PMMLPortObject outPMMLPort = new PMMLPortObject((PMMLPortObjectSpec) learner.getOutputSpec()[0], inPMMLPort, null);
PMMLGeneralRegressionTranslator trans = new PMMLGeneralRegressionTranslator(m_content.createGeneralRegressionContent());
outPMMLPort.addModelTranslater(trans);
return new PortObject[] { outPMMLPort, m_content.createTablePortObject(exec) };
}
use of org.knime.core.node.port.pmml.PMMLPortObjectSpecCreator in project knime-core by knime.
the class LogisticRegressionContent method createSpec.
private static PMMLPortObjectSpec createSpec(final DataTableSpec spec, final String target, final String[] learningCols) {
PMMLPortObjectSpecCreator c = new PMMLPortObjectSpecCreator(spec);
c.setTargetColName(target);
c.setLearningColsNames(Arrays.asList(learningCols));
return c.createSpec();
}
use of org.knime.core.node.port.pmml.PMMLPortObjectSpecCreator in project knime-core by knime.
the class PolyRegLearnerNodeModel method createModelSpec.
private PMMLPortObjectSpec createModelSpec(final PMMLPortObjectSpec inModelSpec, final DataTableSpec inDataSpec) throws InvalidSettingsException {
String[] selectedCols = computeSelectedColumns(inDataSpec);
DataColumnSpec[] usedColumns = new DataColumnSpec[selectedCols.length + 1];
int k = 0;
Set<String> hash = new HashSet<String>(Arrays.asList(selectedCols));
for (DataColumnSpec dcs : inDataSpec) {
if (hash.contains(dcs.getName())) {
usedColumns[k++] = dcs;
}
}
usedColumns[k++] = inDataSpec.getColumnSpec(m_settings.getTargetColumn());
DataTableSpec tableSpec = new DataTableSpec(usedColumns);
PMMLPortObjectSpecCreator crea = new PMMLPortObjectSpecCreator(inModelSpec, inDataSpec);
crea.setLearningCols(tableSpec);
crea.setTargetCol(usedColumns[k - 1]);
return crea.createSpec();
}
use of org.knime.core.node.port.pmml.PMMLPortObjectSpecCreator in project knime-core by knime.
the class AbstractTreeModelExporter method reduceSpec.
/**
* Recursively goes through the tree and only keeps those learning cols that are actually used
* by the model.
* The target is always retained since we currently need to be able to set a target in segmentations
* (this could change if we update to PMML 4.3).
*
* @param pmmlSpec the full spec
* @return a spec that only contains those learn columns that actually appear in the model
*/
private PMMLPortObjectSpec reduceSpec(final PMMLPortObjectSpec pmmlSpec) {
assert m_treeModel != null;
PMMLPortObjectSpecCreator creator = new PMMLPortObjectSpecCreator(pmmlSpec);
Set<String> usedFields = new HashSet<>();
recursivelyCheckUsedFields(m_treeModel.getRootNode(), pmmlSpec.getLearningFields().size(), usedFields);
creator.setLearningCols(pmmlSpec.getLearningCols().stream().filter(s -> usedFields.contains(s.getName())).collect(Collectors.toList()));
return creator.createSpec();
}
Aggregations