hinge_loss¶

`pai4sk.metrics.``hinge_loss`(y_true, pred_decision, labels=None, sample_weight=None)

Average hinge loss (non-regularized)

In binary class case, assuming labels in y_true are encoded with +1 and -1, when a prediction mistake is made, `margin = y_true * pred_decision` is always negative (since the signs disagree), implying `1 - margin` is always greater than 1. The cumulated hinge loss is therefore an upper bound of the number of mistakes made by the classifier.

In multiclass case, the function expects that either all the labels are included in y_true or an optional labels argument is provided which contains all the labels. The multilabel margin is calculated according to Crammer-Singer’s method. As in the binary case, the cumulated hinge loss is an upper bound of the number of mistakes made by the classifier.

For SnapML solver this supports both local and distributed(MPI) method of execution.

Read more in the User Guide.

Parameters: y_true (array, shape = [n_samples]) – True target, consisting of integers of two values. The positive label must be greater than the negative label. It also accepts SnapML data partition, which includes the correct labels. pred_decision (array, shape = [n_samples] or [n_samples, n_classes]) – Predicted decisions, as output by decision_function (floats). labels (array, optional, default None) – Contains all the labels for the problem. Used in multiclass hinge loss. sample_weight (array-like of shape = [n_samples], optional) – Sample weights. loss float

References

 [2] Koby Crammer, Yoram Singer. On the Algorithmic Implementation of Multiclass Kernel-based Vector Machines. Journal of Machine Learning Research 2, (2001), 265-292

Examples

```>>> from pai4sk import svm
>>> from pai4sk.metrics import hinge_loss
>>> X = [[0], [1]]
>>> y = [-1, 1]
>>> est = svm.LinearSVC(random_state=0)
>>> est.fit(X, y)
LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,
intercept_scaling=1, loss='squared_hinge', max_iter=1000,
multi_class='ovr', penalty='l2', random_state=0, tol=0.0001,
verbose=0)
>>> pred_decision = est.decision_function([[-2], [3], [0.5]])
>>> pred_decision  # doctest: +ELLIPSIS
array([-2.18...,  2.36...,  0.09...])
>>> hinge_loss([-1, 1, 1], pred_decision)  # doctest: +ELLIPSIS
0.30...
```

In the multiclass case:

```>>> X = np.array([[0], [1], [2], [3]])
>>> Y = np.array([0, 1, 2, 3])
>>> labels = np.array([0, 1, 2, 3])
>>> est = svm.LinearSVC()
>>> est.fit(X, Y)
LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,
intercept_scaling=1, loss='squared_hinge', max_iter=1000,
multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,
verbose=0)
>>> pred_decision = est.decision_function([[-1], [2], [3]])
>>> y_true = [0, 2, 3]
>>> hinge_loss(y_true, pred_decision, labels)  #doctest: +ELLIPSIS
0.56...
```