网站首页 > 技术文章 正文
在本文中,我们将讨论分类问题中最常用的机器学习算法。支持向量机(SVM)算法用于回归,分类以及异常值检测。
超线或超平面由决策点或支持向量分隔。所述支持向量是提供最接近的不同类地点之间的最大容限的采样点。此分离平面称为边距。误差越大,误差就越小,错误分类的比率也就越小。
上图显示了划分不同类别的线性超平面。但是,我们可以通过选择SVM的分类类中为决策点选择的不同核函数参数,来选择不同的标准来划分类。不同的内核是linear,rbf,多项式和sigmoid(tanh)。
支持向量机在高维数据集中非常有用。此外,高维表示数据集中的要素列数量更多。
有时,如果模型过度拟合,则为避免这种情况,我们应该使用正则化并选择其他内核。SVM使用五重交叉验证而不是直接概率估计。
作为支持向量机的输入,使用密集的NumPy数组和稀疏向量。在这里,稀疏向量是来自大行和列矩阵的行和列的子集。
sklearn为分类提供了SVM类中的不同功能类。这些类是SVC,NuSVC,LinearSVC,OneClassSVM。
SVM中用于回归的类为SVR,NuSVR,LinearSVR。
SVC和NuSVC几乎相同,但是使用了不同的参数。对于线性SVC,由于名称是线性的,因此没有内核参数。OneClassSVm还用于基于密度的数据集的异常检测。
有关SVM实用的一些技巧
- 当我们有大量的数据那么我们就应该更改默认缓存大小SVC,SVR,NuSVC,NuSVR高达500 MB。
- 在将C值设置为数据中噪声点的下侧时,我们还应该集中精力进行正则化。
- 在建模之前,必须对数据进行缩放或标准化,以表示均值为“ 0”,方差为“ 1”。
- 如果数据集不平衡,则应使用该fit方法将class_weight参数用作平衡。
SVM中的内核
内核是SVM中的数学函数,用于将数据作为输入并进行一些处理以在数据点之间进行分类分离。
- 线性:当我们看到不同的类是线性可分离的时,将使用此内核。
- 径向基函数(rbf):此内核用作通用程序,而我们不知道数据分离情况。
使用rbf内核时,应始终考虑两个参数,即gamma和C。这两个参数是调整参数之一。
- 乙状结肠(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)
在这上面的输出,我们看到的调整参数,如C,kernel,gamma,shrinking,cache_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分类在分类和回归中非常有用。内核参数提供了不同的超平面分隔,以适用于任何类型的数据集。
猜你喜欢
- 2024-11-24 7000字,Python分析:泰坦尼克号中女生更容易生还?
- 2024-11-24 SVM 算法 和 梅尔倒谱系数 结合使用噪音检测的应用
- 2024-11-24 scikit-learn的5大新功能
- 2024-11-24 机器学习集成方法:Bagging, Boosting, Stacking, Voting, Blending
- 2024-11-24 Kaggle练习赛---Titanic的分析与整理
- 2024-11-24 超参数自动调参库介绍
- 2024-11-24 支持向量机SVM(Support Vector Machine) Ⅰ原创 Yu
- 2024-11-24 集成学习小介
- 2024-11-24 如何利用手机远训练机器学习模型
- 2024-11-24 使用SVC支持向量机算法来进行人脸识别的CNN神经网络训练
- 最近发表
-
- 使用Knative部署基于Spring Native的微服务
- 阿里p7大佬首次分享Spring Cloud学习笔记,带你从0搭建微服务
- ElasticSearch进阶篇之搞定在SpringBoot项目中的实战应用
- SpringCloud微服务架构实战:类目管理微服务开发
- SpringBoot+SpringCloud题目整理
- 《github精选系列》——SpringBoot 全家桶
- Springboot2.0学习2 超详细创建restful服务步骤
- SpringCloud系列:多模块聚合工程基本环境搭建「1」
- Spring Cloud Consul快速入门Demo
- Spring Cloud Contract快速入门Demo
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)