📜  使用R中的支持向量机(SVM)对数据进行分类

📅  最后修改于: 2021-04-17 03:40:41             🧑  作者: Mango

在机器学习中,支持向量机(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中成功实现。