支持向量机(SVM)可以解决支持分类和回归问题,这两个问题的解决都是通过构造函数h来实现的,该函数将输入向量x与输出y进行匹配:y = h(x )

优缺点

优点:该算法可以基于内核对线性和非线性问题的极限进行建模。它对于“过拟合”也非常可行,尤其是在大空间中。

劣势:支持向量机需要大量的内存,由于选择正确的核(kernel)很重要,所以很难调整,而且在相当大的数据集下也无法获得良好的结果。

简要说明

假设我们有6点的数据集,如下所示


支持向量机遗传算法R语言 支持向量机结果_支持向量机遗传算法R语言


你可以看到它们是线性可分的,但问题是有成千上万的直线可以做到这一点


支持向量机遗传算法R语言 支持向量机结果_数据集_02


所有这些线均有效,并且可以100%正确的进行分类。但问题是,这些线是有效的,但不是最优的。

如下图所示,它们的原理很简单:它们的目的是使用尽可能“简单”的边界将数据分离到类中,从而使不同数据组之间的距离和它们之间的边界达到最大。这个距离也被称为“margin”,支持向量机因此被称为“wide margin separators”,“支持向量”是最接近边界的数据。


支持向量机遗传算法R语言 支持向量机结果_机器学习_03


要使用的机器学习数据集

1)进行分类的SVM:我们将使用“ Social Network Ads”机器学习数据集,这是此数据集的链接(https://www.kaggle.com/rakeshrau/social-network-ads)。数据集由5列组成(User ID、Gender、 Age、 Estimated Salary 和 Purchased),共有400行。


支持向量机遗传算法R语言 支持向量机结果_支持向量机_04


2)第二个SVM进行回归:我们将使用“Position Salaries”机器学习数据集,这是此数据集(https://www.kaggle.com/farhanmd29/position-salaries)的链接。数据集由3列组成(Position、 Level、Salary),有10行。


支持向量机遗传算法R语言 支持向量机结果_机器学习_05


要达到的结果

分类:可视化并识别不同类,并按数据集绘制分界线以进行测试

回归:可视化数据点并绘制回归线,并预测level为4.5和8.5员工的薪水

遵循的步骤

分类

  1. 导入必要的库
  2. 导入数据集
  3. 将数据分为训练集和测试集
  4. 根据需要建立特征缩放
  5. 从SVM库创建用于分类的SVC对象
  6. 拟合数据集(训练集)
  7. 预测结果(测试集)
  8. 评估机器学习模型

回归

  1. 导入必要的Python库
  2. 导入机器学习数据集
  3. 根据需要建立特征缩放
  4. 从SVM库创建用于回归的SVC对象
  5. 拟合数据集
  6. 预测结果

算法实现(分类)

这部分代码进行了数据预处理,特征缩放,将数据划分为训练集和测试集,然后从支持向量机类中声明我们的SVC分类模型以进行拟合和预测

# Importing the librariesimport numpy as npimport matplotlib.pyplot as pltimport pandas as pd# Importing the datasetdataset = pd.read_csv('Social_Network_Ads.csv')X = dataset.iloc[:, [2, 3]].valuesy = dataset.iloc[:, 4].values# Splitting the dataset into the Training set and Test setfrom sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)# Feature Scalingfrom sklearn.preprocessing import StandardScalersc = StandardScaler()X_train = sc.fit_transform(X_train)X_test = sc.transform(X_test)# Fitting classifier to the Training setfrom sklearn.svm import SVCclassifier = SVC(random_state=0) # for non-linear model use this parametre kernel='rbf'classifier.fit(X_train, y_train)# Predicting the Test set resultsy_pred = classifier.predict(X_test)# Making the Confusion Matrixfrom sklearn.metrics import confusion_matrixcm = confusion_matrix(y_test, y_pred)

数据可视化部分的Python代码如下:

# Visualising the Training set resultsfrom matplotlib.colors import ListedColormapX_set, y_set = X_train, y_trainX1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),                     np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),             alpha = 0.75, cmap = ListedColormap(('red', 'green')))plt.xlim(X1.min(), X1.max())plt.ylim(X2.min(), X2.max())for i, j in enumerate(np.unique(y_set)):    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],                c = ListedColormap(('red', 'green'))(i), label = j)plt.title('Classifier (Training set)')plt.xlabel('Age')plt.ylabel('Estimated Salary')plt.legend()plt.show()

结果

我们将使用线性和非线性的核来可视化svc对象的测试集


支持向量机遗传算法R语言 支持向量机结果_支持向量机遗传算法R语言_06

线性核


支持向量机遗传算法R语言 支持向量机结果_支持向量机_07

非线性核


算法实现(回归)

与上面的SVR模型相类似。

import numpy as npimport pandas as pdimport matplotlib.pyplot as plt# import and split the data and classesdataset = pd.read_csv("Position_Salaries.csv")X = dataset.iloc[:, 1:-1].valuesY = dataset.iloc[:, 2].values# features scalingfrom sklearn.preprocessing import StandardScalersc_X = StandardScaler()sc_Y = StandardScaler()X = sc_X.fit_transform(X)Y = sc_Y.fit_transform(np.reshape(Y, (10,1)))# Fitting Regression modelto the datasetfrom sklearn.svm import SVRregressor = SVR() # add this parametre kernel='rbf'regressor.fit(X,Y)# predicts a new result with polyn regy_pred = sc_Y.inverse_transform(regressor.predict(sc_X.transform(np.array([[8.5]]))))# Visualisation the regression resultplt.scatter(x=X, y=Y,color='red')plt.plot(X, regressor.predict(X), color='green')plt.title('Truth of Bluff / SVR')plt.xlabel('Position level')plt.ylabel('Salary')plt.show()

结果

我们需要了解SVM有几种类型的核(‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’)。


支持向量机遗传算法R语言 支持向量机结果_支持向量机遗传算法R语言_08


4.5的预测为130101.64,8.5为303706.02

我们将regressor = SVR()替换为regressor = SVR(kernel='rbf'),然后重新运行程序


支持向量机遗传算法R语言 支持向量机结果_数据集_09


而预测这里有115841.63(4.5)和403162.82(8.5)

最后

SVM的限制包括:

  • SVM算法不适用于大型数据集。
  • 当数据集的噪声较大时,支持向量机不能很好地工作。
  • 如果每个数据点的样本数量超过了训练数据样本的数量,SVM将会表现不佳。
  • 由于支持向量分类器通过在分类超平面的上方和下方放置数据点来工作,因此没有概率解释。