优秀的编程知识分享平台

网站首页 > 技术文章 正文

使用Python全面解释SVM分类

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

在本文中,我们将讨论分类问题中最常用的机器学习算法。支持向量机(SVM)算法用于回归分类以及异常值检测

超线或超平面由决策点或支持向量分隔。所述支持向量是提供最接近的不同类地点之间的最大容限的采样点。此分离平面称为边距。误差越大,误差就越小,错误分类的比率也就越小。

上图显示了划分不同类别的线性超平面。但是,我们可以通过选择SVM的分类类中为决策点选择的不同核函数参数,来选择不同的标准来划分类。不同的内核是linearrbf多项式sigmoid(tanh)

支持向量机在高维数据集中非常有用。此外,高维表示数据集中的要素列数量更多。

有时,如果模型过度拟合,则为避免这种情况,我们应该使用正则化并选择其他内核。SVM使用五重交叉验证而不是直接概率估计。

作为支持向量机的输入,使用密集的NumPy数组和稀疏向量。在这里,稀疏向量是来自大行和列矩阵的行和列的子集。

sklearn为分类提供了SVM类中的不同功能类。这些类是SVCNuSVCLinearSVCOneClassSVM。

SVM中用于回归的类为SVRNuSVRLinearSVR

SVC和NuSVC几乎相同,但是使用了不同的参数。对于线性SVC,由于名称是线性的,因此没有内核参数。OneClassSVm还用于基于密度的数据集的异常检测。

有关SVM实用的一些技巧

  • 当我们有大量的数据那么我们就应该更改默认缓存大小SVCSVRNuSVCNuSVR高达500 MB。
  • 在将C值设置为数据中噪声点的下侧时,我们还应该集中精力进行正则化。
  • 在建模之前,必须对数据进行缩放或标准化,以表示均值为“ 0”,方差为“ 1”。
  • 如果数据集不平衡,则应使用该fit方法将class_weight参数用作平衡。

SVM中的内核

内核是SVM中的数学函数,用于将数据作为输入并进行一些处理以在数据点之间进行分类分离。

  • 线性:当我们看到不同的类是线性可分离的时,将使用此内核。
  • 径向基函数(rbf):此内核用作通用程序,而我们不知道数据分离情况。

使用rbf内核时,应始终考虑两个参数,即gammaC。这两个参数是调整参数之一。

  • 乙状结肠(Sigmoid):此内核主要用于神经网络或逻辑回归以进行二进制分类。
  • 多项式:用于图像处理。多项式的阶数大于2即d = 2

机器学习中的正则化

机器学习中的正则化称为,C用于模型建模中的过度拟合时使用。也称为惩罚参数。此参数的主要功能是用来避免在训练期间误识别数据。

我们每次在机器学习中进行优化和正则化都是解决过度拟合问题的一种优化技术。

C应选择这样的误判,应避免。较小的,良好的分离裕度总是更好C。当我们有时看到不同类的数据点非常接近时,超平面会做出艰难的决定,以将值更大的类分开C

Gamma

通过检查从超平面到数据点的距离,可以认为Gamma值构成了一个平滑的超平面。在低价值的伽玛意味着它检查附近的数据点的距离和较大值的伽马意味着它测量数据远点距离也从超平面。

虽然我们不知道如何手动选择正确的值进行优化。在这种情况下,我们应该使用它GridSearchCV来调整参数,并获得参数的值。

我知道消化所有这些要点要记住需要时间,但请相信我,你练习练习肯定完全没问题。

现在,我们将做一个实践来解决SVM的分类问题。

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

现在,在导入库之后,我们将读取CSV文件并将功能分为独立变量和因变量。

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

现在将数据分为训练和测试数据。

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)

在对机器学习算法建模之前,我们应该始终进行标准缩放。

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

有时,人们在fit_transform训练和仅transform进行测试之间感到困惑。两者之间的差异是我们在火车上进行缩放的拟合变换,因此标准化后得到的均值和方差对于测试数据也应相同。如果我们对训练数据和测试数据都进行了拟合变换,那么对于这两个数据我们将获得不同的均值和方差。因此,这对我们的模型不利。

在此算法中,我们将使用线性核。

from sklearn.svm import SVC
classifier = SVC(kernel = 'linear', random_state= 0)
classifier.fit(X_train, y_train)
#output:
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape='ovr', degree=3, gamma='auto_deprecated',
  kernel='linear', max_iter=-1, probability=False, random_state=0,
  shrinking=True, tol=0.001, verbose=False)

在这上面的输出,我们看到的调整参数,如Ckernelgammashrinkingcache_size等。

如果存在大量迭代,则使用缩减参数来缩短训练时间中的迭代次数。

现在,我们将预测数据并建立模型。

y_pred = classifier.predict(X_test)

现在,我们计算混淆矩阵。

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
#output:
array([[66,  2],
       [ 8, 24]], dtype=int64)

用线性核可视化训练和测试结果。

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.5, 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], alpha=0.5,
                c = ListedColormap(('red', 'green'))(i), label = j)
plt.title('SVM (Training set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend()
plt.show()

现在,可视化测试集。

from matplotlib.colors import ListedColormap
X_set, y_set = X_test, y_test
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.5, 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], alpha=0.9,
 c = ListedColormap((‘red’, ‘green’))(i), label = j)
plt.title(‘SVM (Test set)’)
plt.xlabel(‘Age’)
plt.ylabel(‘Estimated Salary’)
plt.legend()
plt.show()

这些是训练和测试集上的线性分离核。我们观察到图中有很好的分类。

结论:

SVM分类在分类和回归中非常有用。内核参数提供了不同的超平面分隔,以适用于任何类型的数据集。

最近发表
标签列表