SVM Classifier
The model stage wraps scikit-learn’s SVC as a cinnamon Component.
SVCModel
class SVCModel(Component):
def __init__(self, C: float, kernel: str, class_weight: Optional[str] = 'balanced'):
self.C = C
self.kernel = kernel
self.class_weight = class_weight
self.model = SVC(C=self.C, kernel=self.kernel, class_weight=self.class_weight)
def fit(
self,
x_train, y_train,
x_val=None, y_val=None,
) -> Tuple[Dict[str, float], Optional[Dict[str, float]]]:
self.model.fit(X=x_train, y=y_train)
train_info = self.evaluate(x=x_train, y=y_train)
if x_val is not None:
return train_info, self.evaluate(x=x_val, y=y_val)
return train_info, None
def evaluate(self, x, y) -> Dict[str, float]:
predictions = self.predict(x=x)
return {
'f1': f1_score(y_pred=predictions, y_true=y),
'acc': accuracy_score(y_pred=predictions, y_true=y),
}
def predict(self, x) -> Any:
return self.model.predict(X=x)
fit() trains the SVC and returns evaluation metrics for both train and (optional)
validation sets. evaluate() returns f1 and acc scores. predict()
wraps model.predict() directly.
SVCModelConfig
class SVCModelConfig(Configuration):
C: float = Param(1.0, description='Regularisation parameter of SVC')
kernel: str = Param('linear', description='Kernel type')
class_weight: str = Param(
'balanced',
description='Weighting strategy for class imbalance'
)
@classmethod
@register_method(
name='model',
tags={'svc'},
namespace='examples',
component='examples.components.model.SVCModel'
)
def default(cls) -> 'SVCModelConfig':
return super().default()
The three fields correspond exactly to the three parameters of SVCModel.__init__.
When the Registry builds SVCModel, it calls SVCModel(**config.values),
which unpacks {'C': 1.0, 'kernel': 'linear', 'class_weight': 'balanced'}
directly into the constructor.