在机器学习中,支持向量机(SVM)是带有相关学习算法的监督学习模型,该算法分析用于分类和回归分析的数据。它主要用于分类问题。在该算法中,将每个数据项绘制为n维空间中的一个点(其中n是特征数),每个特征的值是特定坐标的值。然后,通过找到最能区分这两个类别的超平面来执行分类。
除了执行线性分类外,SVM还可以有效地执行非线性分类,将其输入隐式映射到高维特征空间。
SVM的工作原理
支持向量机(SVM)是由分离超平面正式定义的判别式分类器。换句话说,给定带标签的训练数据(监督学习),该算法将输出最优超平面,该超平面将新示例分类。
使用SVM时出现的最重要问题是如何确定正确的超平面。请考虑以下情形:
- 方案1:
在这种情况下,存在三个称为A,B,C的超平面。现在的问题是确定最能区分星星和圆圈的正确超平面。在找到正确的超平面之前对星形和圆形进行分类的经验法则是,应该选择能更好地将两个类别分开的超平面。
在这种情况下,B可以更好地对星形和圆形进行分类,因此它是正确的超平面。
- 方案2:
现在以另一个场景为例,所有三个平面都很好地隔离了各个班级。现在的问题是如何在这种情况下识别正确的飞机。在这种情况下,请计算余量,即最近的数据点与超平面之间的距离。具有最大距离的平面将被视为正确的超平面,以更好地分类。
在此,C具有最大的余量,因此将其视为右超平面。
以上是确定正确的超平面的一些情况。
注:对于使用Python中的SVM,是指判断在使用Python支持向量机(SVM)对数据进行分类的详细信息
SVM在R中的实现
在这里,以从文件Social.csv导入社交网络辅助数据集为例。
以下步骤介绍了该实现:
- 导入数据集
# Importing the dataset dataset = read.csv('Social_Network_Ads.csv') dataset = dataset[3:5]
输出:
- 选择第3-5列
这样做是为了简化计算和实现(使示例保持简单)。# Taking columns 3-5 dataset = dataset[3:5]
输出:
- 编码目标特征
# Encoding the target feature as factor dataset$Purchased = factor(dataset$Purchased, levels = c(0, 1))
输出:
- 分割数据集
# Splitting the dataset into the Training set and Test set install.packages('caTools') library(caTools) set.seed(123) split = sample.split(dataset$Purchased, SplitRatio = 0.75) training_set = subset(dataset, split == TRUE) test_set = subset(dataset, split == FALSE)
输出:
- 分离器
- 训练数据集
- 测试数据集
- 功能缩放
# Feature Scaling training_set[-3] = scale(training_set[-3]) test_set[-3] = scale(test_set[-3])
输出:
- 特征缩放训练数据集
- 功能扩展的测试数据集
- 使SVM适应训练集
# Fitting SVM to the Training set install.packages('e1071') library(e1071) classifier = svm(formula = Purchased ~ ., data = training_set, type = 'C-classification', kernel = 'linear')
输出:
- 分类器详细
- 概括地说分类器
- 预测测试结果
# Predicting the Test set results y_pred = predict(classifier, newdata = test_set[-3])
输出:
- 制作混淆矩阵
# Making the Confusion Matrix cm = table(test_set[, 3], y_pred)
输出:
- 可视化训练集结果
# installing library ElemStatLearn library(ElemStatLearn) # Plotting the training data set results set = training_set X1 = seq(min(set[, 1]) - 1, max(set[, 1]) + 1, by = 0.01) X2 = seq(min(set[, 2]) - 1, max(set[, 2]) + 1, by = 0.01) grid_set = expand.grid(X1, X2) colnames(grid_set) = c('Age', 'EstimatedSalary') y_grid = predict(classifier, newdata = grid_set) plot(set[, -3], main = 'SVM (Training set)', xlab = 'Age', ylab = 'Estimated Salary', xlim = range(X1), ylim = range(X2)) contour(X1, X2, matrix(as.numeric(y_grid), length(X1), length(X2)), add = TRUE) points(grid_set, pch = '.', col = ifelse(y_grid == 1, 'coral1', 'aquamarine')) points(set, pch = 21, bg = ifelse(set[, 3] == 1, 'green4', 'red3'))
输出:
- 可视化测试集结果
set = test_set X1 = seq(min(set[, 1]) - 1, max(set[, 1]) + 1, by = 0.01) X2 = seq(min(set[, 2]) - 1, max(set[, 2]) + 1, by = 0.01) grid_set = expand.grid(X1, X2) colnames(grid_set) = c('Age', 'EstimatedSalary') y_grid = predict(classifier, newdata = grid_set) plot(set[, -3], main = 'SVM (Test set)', xlab = 'Age', ylab = 'Estimated Salary', xlim = range(X1), ylim = range(X2)) contour(X1, X2, matrix(as.numeric(y_grid), length(X1), length(X2)), add = TRUE) points(grid_set, pch = '.', col = ifelse(y_grid == 1, 'coral1', 'aquamarine')) points(set, pch = 21, bg = ifelse(set[, 3] == 1, 'green4', 'red3'))
输出:
由于结果是在训练集结果中找到了一个超平面,并被证明是测试集结果中最好的一个。因此,SVM已在R中成功实现。