如何使用支持向量机学习非线性数据集

作者: 不靠谱的猫 2020-05-21 09:02:37

 支持向量机(SVM)

什么是支持向量机呢?支持向量机是监督机器学习模型,可对数据进行分类分析。实际上,支持向量机算法是寻找能将实例进行分离的优秀超平面的过程。

如何使用支持向量机学习非线性数据集

如果数据像上面那样是线性可分离的,那么我们用一个线性分类器就能将两个类分开。如果我们的数据是非线性可分的,我们应该怎么做呢?就像这样:

如何使用支持向量机学习非线性数据集

正如我们所看到的,即使来自不同类的数据点是可分离的,我们也不能简单地画一条直线来进行分类。

如何使用支持向量机学习非线性数据集

那么我们如何使用支持向量机来拟合非线性机器学习数据集呢?

使用SVM进行实验

创建机器学习数据集

首先创建非线性机器学习数据集。Python代码如下:

  1. # Import packages to visualize the classifer 
  2. from matplotlib.colors import ListedColormap 
  3. import matplotlib.pyplot as plt 
  4. import warnings 
  5.  
  6. # Import packages to do the classifying 
  7. import numpy as np 
  8. from sklearn.svm import SVC 
  9.  
  10. Create Dataset 
  11. np.random.seed(0) 
  12. X_xor = np.random.randn(200, 2) 
  13. y_xor = np.logical_xor(X_xor[:, 0] > 0, 
  14.                        X_xor[:, 1] > 0) 
  15. y_xor = np.where(y_xor, 1, -1) 
  16.  
  17. fig = plt.figure(figsize=(10,10)) 
  18. plt.scatter(X_xor[y_xor == 1, 0], 
  19.             X_xor[y_xor == 1, 1], 
  20.             c='b', marker='x'
  21.             label='1'
  22. plt.scatter(X_xor[y_xor == -1, 0], 
  23.             X_xor[y_xor == -1, 1], 
  24.             c='r'
  25.             marker='s'
  26.             label='-1'
  27.  
  28. plt.xlim([-3, 3]) 
  29. plt.ylim([-3, 3]) 
  30. plt.legend(loc='best'
  31. plt.tight_layout() 
  32. plt.show() 
如何使用支持向量机学习非线性数据集

尝试使用线性支持向量机

我们首先尝试使用线性支持向量机,Python实现如下:

  1. # Import packages to do the classifying 
  2. from mlxtend.plotting import plot_decision_regions 
  3. import numpy as np 
  4. from sklearn.svm import SVC 
  5.  
  6. Create a SVC classifier using a linear kernel 
  7. svm = SVC(kernel='linear', C=1000, random_state=0) 
  8. # Train the classifier 
  9. svm.fit(X_xor, y_xor) 
  10.  
  11. # Visualize the decision boundaries 
  12. fig = plt.figure(figsize=(10,10)) 
  13. plot_decision_regions(X_xor, y_xor, clf=svm) 
  14. plt.legend(loc='upper left'
  15. plt.tight_layout() 
  16. plt.show() 

C是与错误分类相关的成本。C值越高,算法对数据集的正确分离就越严格。对于线性分类器,我们使用kernel='linear'。

如何使用支持向量机学习非线性数据集

如我们所见,即使我们将成本设置得很高,但这条线也无法很好地分离红点和蓝点。

径向基函数核

到目前为止,我们使用的线性分类器为:

如何使用支持向量机学习非线性数据集

正如我们所看到的,g(x)是一个线性函数。当g(x) >为0时,预测值为1。当g(x) <0时,预测值为-1。但是由于我们不能使用线性函数处理像上面这样的非线性数据,我们需要将线性函数转换成另一个函数。

如何使用支持向量机学习非线性数据集

这个分类器似乎是我们非线性数据的理想选择。让我们来看看Python的代码:

  1. Create a SVC classifier using an RBF kernel 
  2. svm = SVC(kernel='rbf', random_state=0, gamma=1/100, C=1) 
  3. # Train the classifier 
  4. svm.fit(X_xor, y_xor) 
  5.  
  6. # Visualize the decision boundaries 
  7. fig = plt.figure(figsize=(10,10)) 
  8. plot_decision_regions(X_xor, y_xor, clf=svm) 
  9. plt.legend(loc='upper left'
  10. plt.tight_layout() 
  11. plt.show() 

gamma是1 / sigma。请记住,sigma是调节函数。因此,gamma值越小,sigma值就越大,分类器对各个点之间的距离就越不敏感。

如何使用支持向量机学习非线性数据集

让我们把伽玛放大看看会发生什么

  1. Create a SVC classifier using an RBF kernel 
  2. svm = SVC(kernel='rbf', random_state=0, gamma=1, C=1) 
  3. # Train the classifier 
  4. svm.fit(X_xor, y_xor) 
  5.  
  6. # Visualize the decision boundaries 
  7. fig = plt.figure(figsize=(10,10)) 
  8. plot_decision_regions(X_xor, y_xor, clf=svm) 
  9. plt.legend(loc='upper left'
  10. plt.tight_layout() 
  11. plt.show() 
如何使用支持向量机学习非线性数据集

好像将伽玛值提高100倍可以提高分类器对训练集的准确性。把伽马值再乘以10会怎么样呢?

  1. Create a SVC classifier using an RBF kernel 
  2. svm = SVC(kernel='rbf', random_state=0, gamma=10, C=1) 
  3. # Train the classifier 
  4. svm.fit(X_xor, y_xor) 
  5.  
  6. # Visualize the decision boundaries 
  7. fig = plt.figure(figsize=(10,10)) 
  8. plot_decision_regions(X_xor, y_xor, clf=svm) 
  9. plt.legend(loc='upper left'
  10. plt.tight_layout() 
  11. plt.show() 
如何使用支持向量机学习非线性数据集

这是否意味着如果我们将伽玛提高到10000,它将更加准确呢?事实上,如果伽玛值太大,则分类器最终会对差异不敏感。

如何使用支持向量机学习非线性数据集

让我们增加C。C是与整个机器学习数据集的错误分类相关的成本。换句话说,增加C将增加对整个数据集的敏感性,而不仅仅是单个数据点。

  1. from ipywidgets import interact, interactive, fixed, interact_manual 
  2. import ipywidgets as widgets 
  3.  
  4. warnings.filterwarnings("ignore"
  5.  
  6. @interact(x=[1, 10, 1000, 10000, 100000]) 
  7. def svc(x=1): 
  8.   # Create a SVC classifier using an RBF kernel 
  9.   svm = SVC(kernel='rbf', random_state=0, gamma=.01, C=x) 
  10.   # Train the classifier 
  11.   svm.fit(X_xor, y_xor) 
  12.  
  13.   # Visualize the decision boundaries 
  14.   fig = plt.figure(figsize=(10,10)) 
  15.   plot_decision_regions(X_xor, y_xor, clf=svm) 
  16.   plt.legend(loc='upper left'
  17.   plt.tight_layout() 
  18.   plt.show() 
如何使用支持向量机学习非线性数据集

我们已经找到了参数,因此我们的SVM分类器可以成功地将两组点分开。

最后

我希望本文能让您对SVM分类器是什么以及如何使用它来学习非线机器学习性数据集有一个直观的认识。如果数据是高维的,您则无法通过可视化来判断分类器的性能。好的做法是根据训练集进行训练,并在测试集上使用混淆矩阵或f1-分数等指标。

机器学习 技术 数据
上一篇:我国迈入创新型国家行列,5G、人工智能、自动驾驶等成果卓著 下一篇:为什么语音技术在新冠病毒大流行期间重新流行?
评论
取消
暂无评论,快去成为第一个评论的人吧

更多资讯推荐

可再生能源与机器学习“双重加持”,谷歌成功实现风力预测

从传统角度看,电力电场的发电能力普遍较弱,因为我们至今很难预测无形无相的风,会在新一天中表现出怎样的活动趋势。

佚名 ·  15h前
明确解释:机器学习与统计建模有何不同

这篇文章提出了一个非常重要的区别,我们应该将其理解为数据科学领域的活跃部分。 上面的维恩图最初是由SAS Institute发布的,但是它们的图显示统计和机器学习之间没有重叠,据我所知,这是一个疏忽。

闻数起舞 ·  20h前
人工智能在半导体市场的发展潜力及其意义

IHSMarkit在本周发布的一项人工智能应用调查中预测,到2025年,人工智能应用将从2019年的428亿美元激增至1289亿美元。

佚名 ·  1天前
沙发变身遥控器,涂鸦里藏PCB,MIT技术宅的智能家居竟然是这样

把墙壁、沙发、柱子或者家中任何东西,埋进电路和传感器,整个房子也就被改造成了大型PCB电路板,每一条线路、每一个节点、每一个控制装置,都嵌入到房间自身的装修中,像个变色龙一样,你再也看不到突兀的开关了。

鱼羊 郭一璞 ·  1天前
马云:机器不可能取代人类!那会取代什么呢?

在上海纽约大学2020届毕业生典礼上,阿里巴巴创始人马云表示,“机器是不可能取代人类的”。那什么会被取代呢?

月初 ·  1天前
不用任何数学方法,如何计算圆面积

借鉴统计学习和机器学习的核心原理,我们可以使用蒙特卡罗模拟和多项式/二次回归来创建基于计算的方法,以找到圆的面积公式。

机器之心 ·  1天前
2020年十大人工智能趋势

人工智能在工作场所中崛起以支持和维持数字化劳动力的趋势是2020年的明显趋势。人工智能,机器学习,神经网络或其他任何花哨的术语行业都应运而生,它被定义为复杂的计算机技术,被广泛用于理解和改善业务和客户体验。

闻数起舞 ·  1天前
机器学习变革物流运输和交通出行

云和机器学习的融合催生了自动驾驶技术尤其是人们出行方式的广泛创新,正在改变整个行业的游戏规则。根据普华永道(PWC)的数据,68%的物流运输企业负责人认为,未来5年,提供物流运输服务的核心技术的改变将颠覆整个行业。

AWS大中华区云服务产品管理总经理顾凡 ·  3天前
Copyright©2005-2020 51CTO.COM 版权所有 未经许可 请勿转载