# margin

Find classification margins for support vector machine (SVM) classifier

## Syntax

``m = margin(SVMModel,TBL,ResponseVarName)``
``m = margin(SVMModel,TBL,Y)``
``m = margin(SVMModel,X,Y)``

## Description

````m = margin(SVMModel,TBL,ResponseVarName)` returns the classification margins (`m`) for the trained support vector machine (SVM) classifier `SVMModel` using the sample data in table `TBL` and the class labels in `TBL.ResponseVarName`.`m` is returned as a numeric vector with the same length as `Y`. The software estimates each entry of `m` using the trained SVM classifier `SVMModel`, the corresponding row of `X`, and the true class label `Y`.```
````m = margin(SVMModel,TBL,Y)` returns the classification margins (`m`) for the trained SVM classifier `SVMModel` using the sample data in table `TBL` and the class labels in `Y`.```

example

````m = margin(SVMModel,X,Y)` returns the classification margins for `SVMModel` using the predictor data in matrix `X` and the class labels in `Y`.```

## Examples

collapse all

Load the `ionosphere` data set.

```load ionosphere rng(1); % For reproducibility```

Train an SVM classifier. Specify a 15% holdout sample for testing, standardize the data, and specify that `'g'` is the positive class.

```CVSVMModel = fitcsvm(X,Y,'Holdout',0.15,'ClassNames',{'b','g'},... 'Standardize',true); CompactSVMModel = CVSVMModel.Trained{1}; ... % Extract the trained, compact classifier testInds = test(CVSVMModel.Partition); % Extract the test indices XTest = X(testInds,:); YTest = Y(testInds,:);```

`CVSVMModel` is a `ClassificationPartitionedModel` classifier. It contains the property `Trained`, which is a 1-by-1 cell array holding a `CompactClassificationSVM` classifier that the software trained using the training set.

Estimate the test sample classification margins.

```m = margin(CompactSVMModel,XTest,YTest); m(10:20)```
```ans = 11×1 3.5459 5.5940 4.9946 4.5610 -4.7964 5.5123 -2.8773 1.8671 9.4992 9.5024 ⋮ ```

An observation margin is the observed true class score minus the maximum false class score among all scores in the respective class. Classifiers that yield relatively large margins are preferred.

Perform feature selection by comparing test sample margins from multiple models. Based solely on this comparison, the model with the highest margins is the best model.

Load the `ionosphere` data set.

```load ionosphere rng(1); % For reproducibility```

Partition the data set into training and test sets. Specify a 15% holdout sample for testing.

```Partition = cvpartition(Y,'Holdout',0.15); testInds = test(Partition); % Indices for the test set XTest = X(testInds,:); YTest = Y(testInds,:);```

`Partition` defines the data set partition.

Define these two data sets:

• `fullX` contains all predictors (except the removed column of 0s).

• `partX` contains the last 20 predictors.

```fullX = X; partX = X(:,end-20:end);```

Train SVM classifiers for each predictor set. Specify the partition definition.

```FullCVSVMModel = fitcsvm(fullX,Y,'CVPartition',Partition); PartCVSVMModel = fitcsvm(partX,Y,'CVPartition',Partition); FCSVMModel = FullCVSVMModel.Trained{1}; PCSVMModel = PartCVSVMModel.Trained{1};```

`FullCVSVMModel` and `PartCVSVMModel` are `ClassificationPartitionedModel` classifiers. They contain the property `Trained`, which is a 1-by-1 cell array holding a `CompactClassificationSVM` classifier that the software trained using the training set.

Estimate the test sample margins for each classifier.

```fullM = margin(FCSVMModel,XTest,YTest); partM = margin(PCSVMModel,XTest(:,end-20:end),YTest); n = size(XTest,1); p = sum(fullM < partM)/n```
```p = 0.2500 ```

Approximately 25% of the margins from the full model are less than those from the model with fewer predictors. This result suggests that the model trained with all the predictors is better.

## Input Arguments

collapse all

SVM classification model, specified as a `ClassificationSVM` model object or `CompactClassificationSVM` model object returned by `fitcsvm` or `compact`, respectively.

Sample data, specified as a table. Each row of `TBL` corresponds to one observation, and each column corresponds to one predictor variable. Optionally, `TBL` can contain additional columns for the response variable and observation weights. `TBL` must contain all of the predictors used to train `SVMModel`. Multicolumn variables and cell arrays other than cell arrays of character vectors are not allowed.

If `TBL` contains the response variable used to train `SVMModel`, then you do not need to specify `ResponseVarName` or `Y`.

If you trained `SVMModel` using sample data contained in a table, then the input data for `margin` must also be in a table.

If you set `'Standardize',true` in `fitcsvm` when training `SVMModel`, then the software standardizes the columns of the predictor data using the corresponding means in `SVMModel.Mu` and the standard deviations in `SVMModel.Sigma`.

Data Types: `table`

Predictor data, specified as a numeric matrix.

Each row of `X` corresponds to one observation (also known as an instance or example), and each column corresponds to one variable (also known as a feature). The variables in the columns of `X` must be the same as the variables that trained the `SVMModel` classifier.

The length of `Y` and the number of rows in `X` must be equal.

If you set `'Standardize',true` in `fitcsvm` to train `SVMModel`, then the software standardizes the columns of `X` using the corresponding means in `SVMModel.Mu` and the standard deviations in `SVMModel.Sigma`.

Data Types: `double` | `single`

Response variable name, specified as the name of a variable in `TBL`. If `TBL` contains the response variable used to train `SVMModel`, then you do not need to specify `ResponseVarName`.

If you specify `ResponseVarName`, then you must do so as a character vector or string scalar. For example, if the response variable is stored as `TBL.Response`, then specify `ResponseVarName` as `'Response'`. Otherwise, the software treats all columns of `TBL`, including `TBL.Response`, as predictors.

The response variable must be a categorical, character, or string array, logical or numeric vector, or cell array of character vectors. If the response variable is a character array, then each element must correspond to one row of the array.

Data Types: `char` | `string`

Class labels, specified as a categorical, character, or string array, logical or numeric vector, or cell array of character vectors. `Y` must be the same as the data type of `SVMModel.ClassNames`. (The software treats string arrays as cell arrays of character vectors.)

The length of `Y` must equal the number of rows in `TBL` or the number of rows in `X`.

collapse all

### Classification Edge

The edge is the weighted mean of the classification margins.

The weights are the prior class probabilities. If you supply weights, then the software normalizes them to sum to the prior probabilities in the respective classes. The software uses the renormalized weights to compute the weighted mean.

One way to choose among multiple classifiers, for example, to perform feature selection, is to choose the classifier that yields the highest edge.

### Classification Margin

The classification margin for binary classification is, for each observation, the difference between the classification score for the true class and the classification score for the false class.

The software defines the classification margin for binary classification as

`$m=2yf\left(x\right).$`

x is an observation. If the true label of x is the positive class, then y is 1, and –1 otherwise. f(x) is the positive-class classification score for the observation x. The classification margin is commonly defined as m = yf(x).

If the margins are on the same scale, then they serve as a classification confidence measure. Among multiple classifiers, those that yield greater margins are better.

### Classification Score

The SVM classification score for classifying observation x is the signed distance from x to the decision boundary ranging from -∞ to +∞. A positive score for a class indicates that x is predicted to be in that class. A negative score indicates otherwise.

The positive class classification score $f\left(x\right)$ is the trained SVM classification function. $f\left(x\right)$ is also the numerical predicted response for x, or the score for predicting x into the positive class.

`$f\left(x\right)=\sum _{j=1}^{n}{\alpha }_{j}{y}_{j}G\left({x}_{j},x\right)+b,$`

where $\left({\alpha }_{1},...,{\alpha }_{n},b\right)$ are the estimated SVM parameters, $G\left({x}_{j},x\right)$ is the dot product in the predictor space between x and the support vectors, and the sum includes the training set observations. The negative class classification score for x, or the score for predicting x into the negative class, is –f(x).

If G(xj,x) = xjx (the linear kernel), then the score function reduces to

`$f\left(x\right)=\left(x/s\right)\prime \beta +b.$`

s is the kernel scale and β is the vector of fitted linear coefficients.

For more details, see Understanding Support Vector Machines.

## Algorithms

For binary classification, the software defines the margin for observation j, mj, as

`${m}_{j}=2{y}_{j}f\left({x}_{j}\right),$`

where yj ∊ {-1,1}, and f(xj) is the predicted score of observation j for the positive class. However, mj = yjf(xj) is commonly used to define the margin.

## References

[1] Christianini, N., and J. C. Shawe-Taylor. An Introduction to Support Vector Machines and Other Kernel-Based Learning Methods. Cambridge, UK: Cambridge University Press, 2000.

## Extended Capabilities

Introduced in R2014a