优秀的编程知识分享平台

网站首页 > 技术文章 正文

支持向量机(SVM)说明及示例

nanyue 2024-11-24 19:41:24 技术文章 1 ℃


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

优缺点

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

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

简要说明

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

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

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

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

要使用的机器学习数据集

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

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

要达到的结果

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

回归:可视化数据点并绘制回归线,并预测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 libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Importing the dataset
dataset = pd.read_csv('Social_Network_Ads.csv')
X = dataset.iloc[:, [2, 3]].values
y = dataset.iloc[:, 4].values

# Splitting the dataset into the Training set and Test set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)

# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

# Fitting classifier to the Training set
from sklearn.svm import SVC
classifier = SVC(random_state=0) # for non-linear model use this parametre kernel='rbf'
classifier.fit(X_train, y_train)

# Predicting the Test set results
y_pred = classifier.predict(X_test)

# Making the Confusion Matrix
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)

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

# Visualising the Training set results
from matplotlib.colors import ListedColormap
X_set, y_set = X_train, y_train
X1, 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对象的测试集

算法实现(回归)

与上面的SVR模型相类似。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# import and split the data and classes
dataset = pd.read_csv("Position_Salaries.csv")
X = dataset.iloc[:, 1:-1].values
Y = dataset.iloc[:, 2].values


# features scaling
from sklearn.preprocessing import StandardScaler
sc_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 dataset
from sklearn.svm import SVR
regressor = SVR() # add this parametre kernel='rbf'
regressor.fit(X,Y)

# predicts a new result with polyn reg
y_pred = sc_Y.inverse_transform(regressor.predict(sc_X.transform(np.array([[8.5]]))))

# Visualisation the regression result
plt.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’)。

4.5的预测为130101.64,8.5为303706.02

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

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

最后

SVM的限制包括:

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