Skip to content

Commit

Permalink
Merge pull request #898 from kernc/Preprocessors,unite!
Browse files Browse the repository at this point in the history
Unite preprocessor handling in Learner-outputting widgets
  • Loading branch information
BlazZupan committed Dec 8, 2015
2 parents f4e00d1 + 38446d3 commit f6979aa
Show file tree
Hide file tree
Showing 14 changed files with 95 additions and 145 deletions.
23 changes: 8 additions & 15 deletions Orange/widgets/classify/owclassificationtree.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
from Orange.data import Table
from Orange.preprocess.preprocess import Preprocess
from Orange.classification.tree import TreeLearner, TreeClassifier
from Orange.widgets import widget, gui
from Orange.widgets.settings import Setting
from Orange.widgets.utils.owlearnerwidget import OWProvidesLearner
from Orange.widgets.utils.sql import check_sql_input


class OWClassificationTree(widget.OWWidget):
class OWClassificationTree(OWProvidesLearner, widget.OWWidget):
name = "Classification Tree"
icon = "icons/ClassificationTree.svg"
description = "Classification tree algorithm with forward pruning."
priority = 30

inputs = [("Data", Table, "set_data"),
("Preprocessor", Preprocess, "set_preprocessor")]
inputs = [("Data", Table, "set_data")] + OWProvidesLearner.inputs

outputs = [
("Learner", TreeLearner),
Expand All @@ -23,6 +22,7 @@ class OWClassificationTree(widget.OWWidget):
resizing_enabled = False

LEARNER = TreeLearner

model_name = Setting("Classification Tree")
attribute_score = Setting(0)
limit_min_leaf = Setting(True)
Expand Down Expand Up @@ -63,10 +63,10 @@ def __init__(self):
box.layout().addWidget(self.report_button)
gui.separator(box, 20)
self.btn_apply = gui.button(box, self, "&Apply",
callback=self.set_learner, disabled=0,
callback=self.apply, disabled=0,
default=True)

self.set_learner()
self.apply()

def send_report(self):
from Orange.canvas.report import plural_w
Expand All @@ -85,7 +85,7 @@ def send_report(self):
if self.data:
self.report_data("Data", self.data)

def set_learner(self):
def apply(self):
self.learner = self.LEARNER(
criterion=self.scores[self.attribute_score][1],
max_depth=self.max_depth if self.limit_depth else None,
Expand Down Expand Up @@ -116,14 +116,7 @@ def set_data(self, data):
if data is not None and data.domain.class_var is None:
self.error(0, "Data has no target variable")
self.data = None
self.set_learner()

def set_preprocessor(self, preproc):
if preproc is None:
self.preprocessors = None
else:
self.preprocessors = (preproc,)
self.set_learner()
self.apply()


if __name__ == "__main__":
Expand Down
16 changes: 5 additions & 11 deletions Orange/widgets/classify/owknn.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
from Orange.data import Table
from Orange.classification import KNNLearner, SklModel
from Orange.preprocess.preprocess import Preprocess
from Orange.widgets import widget, gui
from Orange.widgets.settings import Setting
from Orange.widgets.utils.owlearnerwidget import OWProvidesLearner
from Orange.widgets.utils.sql import check_sql_input


class OWKNNLearner(widget.OWWidget):
class OWKNNLearner(OWProvidesLearner, widget.OWWidget):
name = "Nearest Neighbors"
description = "k-nearest neighbors classification algorithm."
icon = "icons/KNN.svg"
inputs = [("Data", Table, "set_data"),
("Preprocessor", Preprocess, "set_preprocessor")]
inputs = [("Data", Table, "set_data")] + OWProvidesLearner.inputs
outputs = [("Learner", KNNLearner), ("Classifier", SklModel)]

want_main_area = False
Expand Down Expand Up @@ -50,15 +49,10 @@ def set_data(self, data):
if data is not None:
self.apply()

def set_preprocessor(self, preproc):
if preproc is None:
self.preprocessors = None
else:
self.preprocessors = (preproc,)
self.apply()
LEARNER = KNNLearner

def apply(self):
learner = KNNLearner(
learner = self.LEARNER(
n_neighbors=self.n_neighbors,
metric=self.metrics[self.metric_index],
preprocessors=self.preprocessors
Expand Down
16 changes: 5 additions & 11 deletions Orange/widgets/classify/owlogisticregression.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,18 @@

from Orange.data import Table
from Orange.classification import logistic_regression as lr
from Orange.preprocess.preprocess import Preprocess
from Orange.widgets import widget, settings, gui
from Orange.widgets.utils.owlearnerwidget import OWProvidesLearner
from Orange.widgets.utils.sql import check_sql_input


class OWLogisticRegression(widget.OWWidget):
class OWLogisticRegression(OWProvidesLearner, widget.OWWidget):
name = "Logistic Regression"
description = "Logistic regression classification algorithm with " \
"LASSO (L1) or ridge (L2) regularization."
icon = "icons/LogisticRegression.svg"

inputs = [("Data", Table, "set_data"),
("Preprocessor", Preprocess, "set_preprocessor")]
inputs = [("Data", Table, "set_data")] + OWProvidesLearner.inputs
outputs = [("Learner", lr.LogisticRegressionLearner),
("Classifier", lr.LogisticRegressionClassifier)]

Expand Down Expand Up @@ -85,16 +84,11 @@ def set_data(self, data):
if data is not None:
self.apply()

def set_preprocessor(self, preproc):
if preproc is None:
self.preprocessors = None
else:
self.preprocessors = (preproc,)
self.apply()
LEARNER = lr.LogisticRegressionLearner

def apply(self):
penalty = ["l1", "l2"][self.penalty_type]
learner = lr.LogisticRegressionLearner(
learner = self.LEARNER(
penalty=penalty,
dual=self.dual,
tol=self.tol,
Expand Down
16 changes: 5 additions & 11 deletions Orange/widgets/classify/owmajority.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
from Orange.data import Table
from Orange.classification.majority import MajorityLearner, ConstantModel
from Orange.preprocess.preprocess import Preprocess
from Orange.widgets import widget, gui
from Orange.widgets.settings import Setting
from Orange.widgets.utils.owlearnerwidget import OWProvidesLearner


class OWMajority(widget.OWWidget):
class OWMajority(OWProvidesLearner, widget.OWWidget):
name = "Majority"
description = "Classification to the most frequent class " \
"from the training set."
priority = 20
icon = "icons/Majority.svg"

inputs = [("Data", Table, "set_data"),
("Preprocessor", Preprocess, "set_preprocessor")]
inputs = [("Data", Table, "set_data")] + OWProvidesLearner.inputs
outputs = [("Learner", MajorityLearner),
("Classifier", ConstantModel)]

Expand Down Expand Up @@ -44,15 +43,10 @@ def set_data(self, data):
if data is not None:
self.apply()

def set_preprocessor(self, preproc):
if preproc is None:
self.preprocessors = None
else:
self.preprocessors = (preproc,)
self.apply()
LEARNER = MajorityLearner

def apply(self):
learner = MajorityLearner(
learner = self.LEARNER(
preprocessors=self.preprocessors
)
learner.name = self.learner_name
Expand Down
16 changes: 5 additions & 11 deletions Orange/widgets/classify/ownaivebayes.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,15 @@

from Orange.data import Table
from Orange.classification.naive_bayes import NaiveBayesLearner, NaiveBayesModel
from Orange.preprocess.preprocess import Preprocess
from Orange.widgets import widget, gui, settings
from Orange.widgets.utils.owlearnerwidget import OWProvidesLearner


class OWNaiveBayes(widget.OWWidget):
class OWNaiveBayes(OWProvidesLearner, widget.OWWidget):
name = "Naive Bayes"
description = "Naive Bayesian classifier."
icon = "icons/NaiveBayes.svg"
inputs = [("Data", Table, "set_data"),
("Preprocessor", Preprocess, "set_preprocessor")]
inputs = [("Data", Table, "set_data")] + OWProvidesLearner.inputs
outputs = [("Learner", NaiveBayesLearner),
("Classifier", NaiveBayesModel)]

Expand Down Expand Up @@ -56,15 +55,10 @@ def set_data(self, data):
else:
self.send("Classifier", None)

def set_preprocessor(self, preproc):
if preproc is None:
self.preprocessors = None
else:
self.preprocessors = (preproc,)
self.apply()
LEARNER = NaiveBayesLearner

def apply(self):
learner = NaiveBayesLearner(
learner = self.LEARNER(
preprocessors=self.preprocessors
)
learner.name = self.learner_name
Expand Down
15 changes: 4 additions & 11 deletions Orange/widgets/classify/owrandomforest.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,27 +5,27 @@
from PyQt4.QtCore import Qt

from Orange.data import Table
from Orange.preprocess.preprocess import Preprocess
from Orange.classification.random_forest import (RandomForestLearner,
RandomForestClassifier)
from Orange.widgets import widget, settings, gui
from Orange.widgets.utils.owlearnerwidget import OWProvidesLearner
from Orange.widgets.utils.sql import check_sql_input


class OWRandomForest(widget.OWWidget):
class OWRandomForest(OWProvidesLearner, widget.OWWidget):
name = "Random Forest Classification"
description = "Random forest classification algorithm."
icon = "icons/RandomForest.svg"

inputs = [("Data", Table, "set_data"),
("Preprocessor", Preprocess, "set_preprocessor")]
inputs = [("Data", Table, "set_data")] + OWProvidesLearner.inputs
outputs = [("Learner", RandomForestLearner),
("Model", RandomForestClassifier)]

want_main_area = False
resizing_enabled = False

LEARNER = RandomForestLearner

learner_name = settings.Setting("RF Classification Learner")
n_estimators = settings.Setting(10)
max_features = settings.Setting(5)
Expand Down Expand Up @@ -135,13 +135,6 @@ def set_data(self, data):
if data is not None:
self.apply()

def set_preprocessor(self, preproc):
if preproc is None:
self.preprocessors = None
else:
self.preprocessors = (preproc,)
self.apply()

def apply(self):
common_args = dict()
common_args["n_estimators"] = self.n_estimators
Expand Down
14 changes: 4 additions & 10 deletions Orange/widgets/classify/owsvmclassification.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,18 @@

from Orange.data import Table
from Orange.classification.svm import SVMLearner, SVMClassifier, NuSVMLearner
from Orange.preprocess.preprocess import Preprocess
from Orange.widgets import widget, settings, gui
from Orange.widgets.utils.owlearnerwidget import OWProvidesLearner
from Orange.widgets.utils.sql import check_sql_input


class OWSVMClassification(widget.OWWidget):
class OWSVMClassification(OWProvidesLearner, widget.OWWidget):
name = "SVM"
description = "Support vector machines classifier with standard " \
"selection of kernels."
icon = "icons/SVM.svg"

inputs = [("Data", Table, "set_data"),
("Preprocessor", Preprocess, "set_preprocessor")]
inputs = [("Data", Table, "set_data")] + OWProvidesLearner.inputs
outputs = [("Learner", SVMLearner, widget.Default),
("Classifier", SVMClassifier),
("Support vectors", Table)]
Expand Down Expand Up @@ -132,12 +131,7 @@ def set_data(self, data):
if data is not None:
self.apply()

def set_preprocessor(self, preproc):
if preproc is None:
self.preprocessors = None
else:
self.preprocessors = (preproc,)
self.apply()
LEARNER = SVMLearner # OWProvidesLearner uses this

def apply(self):
kernel = ["linear", "poly", "rbf", "sigmoid"][self.kernel_type]
Expand Down
17 changes: 5 additions & 12 deletions Orange/widgets/regression/owknnregression.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,20 @@
from Orange.data import Table
from Orange.regression.knn import KNNRegressionLearner
from Orange.regression import SklModel
from Orange.preprocess.preprocess import Preprocess

from Orange.widgets import widget, gui
from Orange.widgets.settings import Setting
from Orange.widgets.utils.owlearnerwidget import OWProvidesLearner
from Orange.widgets.utils.sql import check_sql_input


class OWKNNRegression(widget.OWWidget):
class OWKNNRegression(OWProvidesLearner, widget.OWWidget):
name = "Nearest Neighbors"
description = "k-nearest neighbours regression algorithm."
icon = "icons/kNearestNeighbours.svg"
priority = 20

inputs = [("Data", Table, "set_data"),
("Preprocessor", Preprocess, "set_preprocessor")]
inputs = [("Data", Table, "set_data")] + OWProvidesLearner.inputs
outputs = [("Learner", KNNRegressionLearner),
("Predictor", SklModel)]

Expand Down Expand Up @@ -63,19 +62,13 @@ def set_data(self, data):
if data is not None:
self.apply()

def set_preprocessor(self, preproc):
"""Set preprocessor to apply on training data."""
if preproc is None:
self.preprocessors = None
else:
self.preprocessors = (preproc,)
self.apply()
LEARNER = KNNRegressionLearner

def apply(self):
"""
Construct the learner and apply it on the training data if available.
"""
learner = KNNRegressionLearner(
learner = self.LEARNER(
n_neighbors=self.n_neighbors,
metric=self.metrics[self.metric_index],
preprocessors=self.preprocessors
Expand Down

0 comments on commit f6979aa

Please sign in to comment.