机器学习算法(四): 基于支持向量机的分类预测(SVM) |
您所在的位置:网站首页 › svm算法的优缺点 › 机器学习算法(四): 基于支持向量机的分类预测(SVM) |
机器学习算法(四): 基于支持向量机的分类预测(SVM) 本项目链接:https://www.heywhale.com/home/column/64141d6b1c8c8b518ba97dcc 1.相关流程支持向量机(Support Vector Machine,SVM)是一个非常优雅的算法,具有非常完善的数学理论,常用于数据分类,也可以用于数据的回归预测中,由于其其优美的理论保证和利用核函数对于线性不可分问题的处理技巧,在上世纪90年代左右,SVM曾红极一时。 本文将不涉及非常严格和复杂的理论知识,力求于通过直觉来感受 SVM。 推荐参考:SVM参考文章 了解支持向量机的分类标准;了解支持向量机的软间隔分类;了解支持向量机的非线性核函数分类;Demo实践Step1:库函数导入Step2:构建数据集并进行模型训练Step3:模型参数查看Step4:模型预测Step5:模型可视化2. 算法实战2.1 Demo实践首先我们利用sklearn直接调用 SVM函数进行实践尝试 Step1:库函数导入 ## 基础函数库 import numpy as np ## 导入画图库 import matplotlib.pyplot as plt import seaborn as sns ## 导入逻辑回归模型函数 from sklearn import svmStep2:构建数据集并进行模型训练 ##Demo演示LogisticRegression分类 ## 构造数据集 x_fearures = np.array([[-1, -2], [-2, -1], [-3, -2], [1, 3], [2, 1], [3, 2]]) y_label = np.array([0, 0, 0, 1, 1, 1]) ## 调用SVC模型 (支持向量机分类) svc = svm.SVC(kernel='linear') ## 用SVM模型拟合构造的数据集 svc = svc.fit(x_fearures, y_label)Step3:模型参数查看 ## 查看其对应模型的w print('the weight of Logistic Regression:',svc.coef_) ## 查看其对应模型的w0 print('the intercept(w0) of Logistic Regression:',svc.intercept_)the weight of Logistic Regression: [[0.33364706 0.33270588]] the intercept(w0) of Logistic Regression: [-0.00031373]Step4:模型预测 ## 模型预测 y_train_pred = svc.predict(x_fearures) print('The predction result:',y_train_pred)The predction result: [0 0 0 1 1 1]Step5:模型可视化 由于此处选择的线性核函数,所以在此我们可以将svm进行可视化。 # 最佳函数 x_range = np.linspace(-3, 3) w = svc.coef_[0] a = -w[0] / w[1] y_3 = a*x_range - (svc.intercept_[0]) / w[1] # 可视化决策边界 plt.figure() plt.scatter(x_fearures[:,0],x_fearures[:,1], c=y_label, s=50, cmap='viridis') plt.plot(x_range, y_3, '-c') plt.show()可以对照之前的逻辑回归模型的决策边界,我们可以发现两个决策边界是有一定差异的(可以对比两者在X,Y轴上的截距),这说明这两个不同在相同数据集上找到的判别线是不同的,而这不同的原因其实是由于两者选择的最优目标是不一致的。接下来我们进行SVM的一些简单介绍。 2.2 实践升级我们常常会碰到这样的一个问题,首先给你一些分属于两个类别的数据 import numpy as np import matplotlib.pyplot as plt from sklearn.datasets.samples_generator import make_blobs %matplotlib inline # 画图 X, y = make_blobs(n_samples=60, centers=2, random_state=0, cluster_std=0.4) plt.scatter(X[:, 0], X[:, 1], c=y, s=60, cmap=plt.cm.Paired)/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/sklearn/utils/deprecation.py:144: FutureWarning: The sklearn.datasets.samples_generator module is deprecated in version 0.22 and will be removed in version 0.24. The corresponding classes / functions should instead be imported from sklearn.datasets. Anything that cannot be imported from sklearn.datasets is now part of the private API. warnings.warn(message, FutureWarning)现在需要一个线性分类器,将这些数据分开来。 我们可能会有多种分法: # 画散点图 X, y = make_blobs(n_samples=60, centers=2, random_state=0, cluster_std=0.4) plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap=plt.cm.Paired) x_fit = np.linspace(0, 3) # 画函数 y_1 = 1 * x_fit + 0.8 plt.plot(x_fit, y_1, '-c') y_2 = -0.3 * x_fit + 3 plt.plot(x_fit, y_2, '-k')那么现在有一个问题,两个分类器,哪一个更好呢? 为了判断好坏,我们需要引入一个准则:好的分类器不仅仅是能够很好的分开已有的数据集,还能对未知数据集进行两个的划分。 假设,现在有一个属于红色数据点的新数据(3, 2.8) # 画散点图 X, y = make_blobs(n_samples=60, centers=2, random_state=0, cluster_std=0.4) plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap=plt.cm.Paired) plt.scatter([3], [2.8], c='#cccc00', marker=' |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |