Skip to content

Commit 0cff2df

Browse files
Change normalization to Scaling in SVM
1 parent 6f3aef2 commit 0cff2df

File tree

3 files changed

+26
-5
lines changed

3 files changed

+26
-5
lines changed

Orange/classification/svm.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
from Orange.classification import SklLearner, SklModel
44
from Orange.base import SklLearner as SklLearnerBase
5-
from Orange.preprocess import Normalize
5+
from Orange.preprocess import Scale
66

77
__all__ = ["SVMLearner", "LinearSVMLearner", "NuSVMLearner",
88
"OneClassSVMLearner"]
99

1010

11-
svm_pps = SklLearner.preprocessors + [Normalize()]
11+
svm_pps = SklLearner.preprocessors + [Scale(center=Scale.NoCentering)]
1212

1313

1414
class SVMClassifier(SklModel):

Orange/widgets/model/owsvm.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
from Orange.widgets.utils.owlearnerwidget import OWBaseLearner
1111
from Orange.widgets.utils.signals import Output
1212
from Orange.widgets.utils.widgetpreview import WidgetPreview
13+
from Orange.classification import SklLearner
14+
from Orange.preprocess import Scale
1315

1416

1517
class OWSVM(OWBaseLearner):
@@ -26,6 +28,12 @@ class OWSVM(OWBaseLearner):
2628

2729
LEARNER = SVMLearner
2830

31+
pps = SklLearner.preprocessors
32+
scaling = [Scale(center=Scale.NoCentering)]
33+
34+
def __init__(self):
35+
super().__init__(SklLearner.preprocessors)
36+
2937
class Outputs(OWBaseLearner.Outputs):
3038
support_vectors = Output("Support vectors", Table, explicit=True)
3139

@@ -56,13 +64,22 @@ class Outputs(OWBaseLearner.Outputs):
5664
limit_iter = Setting(True)
5765
#: maximum number of iterations
5866
max_iter = Setting(100)
67+
#: scaling of data
68+
scale_data = Setting(True)
5969

6070
_default_gamma = "auto"
6171
kernels = (("Linear", "x⋅y"),
6272
("Polynomial", "(g x⋅y + c)<sup>d</sup>"),
6373
("RBF", "exp(-g|x-y|²)"),
6474
("Sigmoid", "tanh(g x⋅y + c)"))
6575

76+
def set_preprocessor(self, preprocessor):
77+
if preprocessor is None:
78+
self.preprocessors = self.pps
79+
else:
80+
self.preprocessors = preprocessor
81+
self.apply()
82+
6683
def add_main_layout(self):
6784
self._add_type_box()
6885
self._add_kernel_box()
@@ -176,6 +193,10 @@ def _add_optimization_box(self):
176193
alignment=Qt.AlignRight, controlWidth=100,
177194
callback=self.settings_changed,
178195
checkCallback=self.settings_changed)
196+
self.scaling_box = gui.checkBox(
197+
self.optimization_box, self,
198+
'scale_data', label='Scale data',
199+
callback=self.settings_changed)
179200

180201
def _show_right_kernel(self):
181202
enabled = [[False, False, False], # linear
@@ -210,7 +231,7 @@ def create_learner(self):
210231
'probability': True,
211232
'tol': self.tol,
212233
'max_iter': self.max_iter if self.limit_iter else -1,
213-
'preprocessors': self.preprocessors
234+
'preprocessors': list(self.preprocessors) + self.scaling if self.scale_data else self.preprocessors
214235
}
215236
if self.svm_type == self.SVM:
216237
return SVMLearner(C=self.C, epsilon=self.epsilon, **common_args)

Orange/widgets/utils/owlearnerwidget.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,15 +90,15 @@ class Outputs:
9090

9191
OUTPUT_MODEL_NAME = Outputs.model.name # Attr for backcompat w/ self.send() code
9292

93-
def __init__(self):
93+
def __init__(self, preprocessors=None):
9494
super().__init__()
9595
self.data = None
9696
self.valid_data = False
9797
self.learner = None
9898
if self.learner_name is None:
9999
self.learner_name = self.name
100100
self.model = None
101-
self.preprocessors = None
101+
self.preprocessors = preprocessors
102102
self.outdated_settings = False
103103

104104
self.setup_layout()

0 commit comments

Comments
 (0)