当前位置:   article > 正文

机器学习(五) -- 监督学习(7) --SVM2

机器学习(五) -- 监督学习(7) --SVM2

系列文章目录及链接

上篇:机器学习(五) -- 监督学习(7) --SVM1
下篇:


前言

tips:标题前有“***”的内容为补充内容,是给好奇心重的宝宝看的,可自行跳过。文章内容被“文章内容”删除线标记的,也可以自行跳过。“!!!”一般需要特别注意或者容易出错的地方。

本系列文章是作者边学习边总结的,内容有不对的地方还请多多指正,同时本系列文章会不断完善,每篇文章不定时会有修改。

由于作者时间不算富裕,有些内容的《算法实现》部分暂未完善,以后有时间再来补充。见谅!

文中为方便理解,会将接口在用到的时候才导入,实际中应在文件开始统一导入。


 三、**算法实现

四、接口实现

1、API

  1. sklearn.svm.SVC
  2. 导入:
  3. from sklearn.svm import SVC
  4. 语法:
  5. SVC(C=1.0, kernel=‘rbf’, degree=3, gamma=‘auto’,
  6. coef0=0.0, shrinking=True, probability=False,tol=0.001,
  7. cache_size=200, class_weight=None, verbose=False, max_iter=-1,
  8. decision_function_shape=None,random_state=None)
  9. C:惩罚参数,默认值是1.0
  10. C越大,表示越不允许分类出错,这样对训练集测试时准确率很高,但泛化能力弱。
  11. C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。
  12. Kernel:核函数,默认是rbf,
  13. ‘linear’:为线性核,C越大分类效果越好,但可能会过拟合;
  14. ‘rbf’:为高斯核,gamma值越小,分类界面越连续;gamma值越大,分类界面越“散”,分类效果越好,但可能会过拟合;
  15. ‘poly’:多项式核
  16. ‘sigmoid’:Sigmoid核函数
  17. ‘precomputed’:核矩阵
  18. decision_function_shape :‘ovo’, ‘ovr’ or None, default=None
  19. 'ovr'时,为one v rest,即一个类别与其他ov类别进行划分;
  20. 'ovo'时,为one v one,即将类别两两进行划分,用二分类的方法模拟多分类的结果;
  21. degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。
  22. gamma :‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’,则会选择1/n_features
  23. coef0 :核函数的常数项。对于‘poly’和 ‘sigmoid’有用。
  24. probability :是否采用概率估计?.默认为False
  25. shrinking :是否采用shrinking heuristic方法,默认为true
  26. tol :停止训练的误差值大小,默认为1e-3
  27. cache_size :核函数cache缓存大小,默认为200
  28. class_weight :类别的权重,字典形式传递。设置第几类的参数C为weightC(C-SVC中的C)
  29. verbose :允许冗余输出
  30. max_iter :最大迭代次数。-1为无限制。
  31. random_state :数据洗牌时的种子值,int
  32. SVC.coef_:权重
  33. SVC.intercept_:偏置
  1. sklearn.svm.LinearSVC
  2. 导入:
  3. from sklearn.svm import LinearSVC
  4. 语法:
  5. sklearn.svm.LinearSVC(penalty='l2', loss='squared_hinge', dual=True, C=1.0)
  6. 参数:
  7. penalty:正则化参数,L1和L2两种参数可选,仅LinearSVC有。
  8. loss:损失函数,
  9. 有hinge和squared_hinge两种可选,前者⼜称L1损失,后者称为L2损失,默认是squared_hinge,
  10. 其中hinge是SVM的标准损失,squared_hinge是hinge的平方
  11. dual:是否转化为对偶问题求解,默认是True
  12. C:惩罚系数,
  13. 属性:
  14. LinearSVC.coef_:权重
  15. LinearSVC.intercept_:偏置
  16. 方法:
  17. fix(x,y): 训练模型
  18. predict(x): 用模型进行预测,返回预测值
  19. score(x,y[, sample_weight]):返回在(X, y)上预测的准确率

2、线性可分SVM(硬间隔)流程

2.1、获取数据

  1. from sklearn.datasets import load_iris
  2. from sklearn.model_selection import train_test_split
  3. from sklearn.svm import SVC
  4. # 获取数据
  5. iris = load_iris()

2.2、数据预处理

  1. x=iris.data[:,(2,3)]
  2. y=iris.target
  3. setosa_or_versicolor=(y==0)|(y==1)
  4. x=x[setosa_or_versicolor]
  5. y=y[setosa_or_versicolor]
  6. # 划分数据集
  7. x_train,x_test,y_train,y_test = train_test_split(x, y, test_size=0.2, random_state=1473)

2.3、特征工程

2.4、模型训练

  1. # 实例化学习器
  2. model_svc = SVC(kernel='linear',C=float("inf"))
  3. # 模型训练
  4. model_svc.fit(x_train,y_train)
  5. print("建立的支持向量机模型为:\n", model_svc)

2.5、模型评估

  1. # 用模型计算测试值,得到预测值
  2. y_pred=model_svc.predict(x_test)
  3. print('前20条记录的预测值为:\n', y_pred[:20])
  4. print('前20条记录的实际值为:\n', y_test[:20])
  5. # 求出预测准确率和混淆矩阵
  6. from sklearn.metrics import accuracy_score, confusion_matrix
  7. print("预测结果准确率为:", accuracy_score(y_test, y_pred))
  8. print("预测结果混淆矩阵为:\n", confusion_matrix(y_test, y_pred))

2.6、结果预测

经过模型评估后通过的模型可以代入真实值进行预测。

2.7、可视化

  1. x=iris.data[:,(2,3)]
  2. y=iris.target
  3. w=model_svc.coef_[0]
  4. b=model_svc.intercept_[0]
  5. x0=np.linspace(0,5.5,200)
  6. decision_boundary=-w[0]/w[1]*x0-b/w[1]
  7. margin=1/w[1]
  8. gutter_up=decision_boundary+margin
  9. gutter_down=decision_boundary-margin
  10. # 可视化
  11. plt.figure(figsize=(14,8))
  12. # 数据点
  13. plt.plot(x[:,0][y==1],x[:,1][y==1],'bs')
  14. plt.plot(x[:,0][y==0],x[:,1][y==0],'ys')
  15. # 支持向量
  16. svs=model_svc.support_vectors_
  17. plt.scatter(svs[:,0],svs[:,1],s=180,facecolors='red')
  18. # 决策边界和决策超平面
  19. plt.plot(x0,decision_boundary,'k-',linewidth=2)
  20. plt.plot(x0,gutter_up,'k--',linewidth=2)
  21. plt.plot(x0,gutter_down,'k--',linewidth=2)
  22. #
  23. plt.axis([0,5.5,0,2])

 

3、线性SVM(软间隔)流程

 3.1、获取数据

  1. from sklearn.datasets import load_iris
  2. from sklearn.model_selection import train_test_split
  3. from sklearn.svm import SVC
  4. # 获取数据
  5. iris = load_iris()

3.2、数据预处理

  1. x=iris.data[:,(2,3)]
  2. y=(iris.target==2).astype(np.float64)

3.3、特征工程

3.4、模型训练

实现线性SVM用LinearSVC试试

  1. from sklearn.pipeline import Pipeline
  2. from sklearn.preprocessing import StandardScaler
  3. svm_clf=Pipeline((
  4. ('std',StandardScaler()),
  5. ('linear_svc',LinearSVC(C = 1))
  6. ))
  7. svm_clf.fit(x,y)

3.5、模型评估

3.6、结果预测

经过模型评估后通过的模型可以代入真实值进行预测。

svm_clf.predict([[5.5,1.7]])

 

3.7、可视化(不同C值带来的效果差异)

  1. scaler = StandardScaler()
  2. svm_clf1=SVC(kernel='linear',C=1,random_state=1473)
  3. svm_clf2=SVC(kernel='linear',C=100,random_state=1473)
  4. # scaled_svm_clf1=Pipeline((
  5. # ('std',StandardScaler()),
  6. # ('linear_svc',svm_clf1)
  7. # ))
  8. # scaled_svm_clf2=Pipeline((
  9. # ('std',StandardScaler()),
  10. # ('linear_svc',svm_clf2)
  11. # ))
  12. # scaled_svm_clf1.fit(x,y)
  13. # scaled_svm_clf2.fit(x,y)
  14. svm_clf1.fit(x,y)
  15. svm_clf2.fit(x,y)
  1. # 绘制决策边界
  2. def plot_svc_decision_boundary(clf,sv=True):
  3. w=clf.coef_[0]
  4. b=clf.intercept_[0]
  5. x0=np.linspace(0,5.5,200)
  6. decision_boundary=-w[0]/w[1]*x0-b/w[1]
  7. margin=1/w[1]
  8. gutter_up=decision_boundary+margin
  9. gutter_down=decision_boundary-margin
  10. if sv:
  11. svs=clf.support_vectors_
  12. plt.scatter(svs[:,0],svs[:,1],s=180,facecolors='red')
  13. plt.plot(x0,decision_boundary,'k-',linewidth=2)
  14. plt.plot(x0,gutter_up,'k--',linewidth=2)
  15. plt.plot(x0,gutter_down,'k--',linewidth=2)
  1. plt.figure(figsize=(14,4))
  2. plt.subplot(121)
  3. # 数据点
  4. plt.plot(x[:,0][y==1],x[:,1][y==1],'bs',label="Iris-Virginica")
  5. plt.plot(x[:,0][y==0],x[:,1][y==0],'ys',label="Iris-Versicolor")
  6. # 决策边界和决策超平面
  7. plot_svc_decision_boundary(svm_clf1,sv=True)
  8. plt.xlabel("Petal length",fontsize=14)
  9. plt.ylabel("Petal width",fontsize=14)
  10. plt.legend(loc="upper left",fontsize=14)
  11. plt.title("$C={}$".format(svm_clf1.C),fontsize=16)
  12. plt.axis([4,6,0.5,3])
  13. plt.subplot(122)
  14. # 数据点
  15. plt.plot(x[:,0][y==1],x[:,1][y==1],'bs',label="Iris-Virginica")
  16. plt.plot(x[:,0][y==0],x[:,1][y==0],'ys',label="Iris-Versicolor")
  17. # 决策边界和决策超平面
  18. plot_svc_decision_boundary(svm_clf2,sv=True)
  19. plt.xlabel("Petal length",fontsize=14)
  20. plt.ylabel("Petal width",fontsize=14)
  21. plt.legend(loc="upper left",fontsize=14)
  22. plt.title("$C={}$".format(svm_clf2.C),fontsize=16)
  23. plt.axis([4,6,0.5,3])

 4、非线性可分SVM(核技巧)

4.1、升维转换演示

  1. x1D=np.linspace(-4,4,9).reshape(-1,1)
  2. x2D=np.c_[x1D,x1D**2]
  3. y=np.array([0,0,1,1,1,1,1,0,0])
  4. plt.figure(figsize=(11,4))
  5. plt.subplot(121)
  6. plt.grid(True,which='both')
  7. plt.axhline(y=0,color='k')
  8. plt.plot(x1D[:,0][y==0],np.zeros(4),'bs')
  9. plt.plot(x1D[:,0][y==1],np.zeros(5),'g^')
  10. plt.gca().get_yaxis().set_ticks([])
  11. plt.xlabel(r"$x_1$",fontsize=20)
  12. plt.axis([-4.5,4.5,-0.2,0.2])
  13. np.zeros(4)

  1. x1D=np.linspace(-4,4,9).reshape(-1,1)
  2. x2D=np.c_[x1D,x1D**2]
  3. y=np.array([0,0,1,1,1,1,1,0,0])
  4. plt.figure(figsize=(11,4))
  5. plt.subplot(121)
  6. plt.grid(True,which='both')
  7. plt.axhline(y=0,color='k')
  8. plt.plot(x1D[:,0][y==0],np.zeros(4),'bs')
  9. plt.plot(x1D[:,0][y==1],np.zeros(5),'g^')
  10. plt.gca().get_yaxis().set_ticks([])
  11. plt.xlabel(r"$x_1$",fontsize=20)
  12. plt.axis([-4.5,4.5,-0.2,0.2])
  13. np.zeros(4)
  14. plt.subplot(122)
  15. plt.grid(True,which='both')
  16. plt.axhline(y=0,color='k')
  17. plt.axvline(x=0,color='k')
  18. plt.plot(x2D[:,0][y==0],x2D[:,1][y==0],'bs')
  19. plt.plot(x2D[:,0][y==1],x2D[:,1][y==1],'g^')
  20. plt.xlabel(r"$x_1$",fontsize=20)
  21. plt.xlabel(r"$x_2$",fontsize=20,rotation=0)
  22. plt.gca().get_yaxis().set_ticks([0,4,8,12,16])
  23. plt.plot([-4.5,4.5],[6.5,6.5],'r--',linewidth=3)
  24. plt.axis([-4.5,4.5,-1,17])
  25. plt.subplots_adjust(right=1)
  26. plt.show()

4.2、线性核

4.2.1、创建非线性数据
  1. from sklearn.datasets import make_moons
  2. x,y=make_moons(n_samples=100,noise=0.15,random_state=1473)
  3. # 创建非线性数据
  4. def plot_dataset(x,y,axes):
  5. plt.plot(x[:,0][y==0],x[:,1][y==0],'bs')
  6. plt.plot(x[:,0][y==1],x[:,1][y==1],'g^')
  7. plt.axis(axes)
  8. plt.grid(True,which='both')
  9. plt.xlabel(r"$x_1$",fontsize=20)
  10. plt.xlabel(r"$x_2$",fontsize=20,rotation=0)
  11. plot_dataset(x,y,[-1.5,2.5,-1,1.5])
  12. plt.show()

 

4.2.2、分类预测

使用PolynomialFeatures模块进行预处理,使用这个可以增加数据维度
polynomial_svm_clf.fit(X,y)对当前进行训练传进去X和y数据

  1. # 分类预测
  2. from sklearn.datasets import make_moons
  3. from sklearn.pipeline import Pipeline
  4. from sklearn.preprocessing import PolynomialFeatures
  5. polynomial_svm_clf=Pipeline((("poly_features",PolynomialFeatures(degree=3)),
  6. ("scaler" ,StandardScaler()),
  7. ("svm_clf",LinearSVC(C=10,loss="hinge"))))
  8. polynomial_svm_clf.fit(x,y)

  1. def plot_predictions(clf,axes):
  2. x0s=np.linspace(axes[0],axes[1],100)
  3. x1s=np.linspace(axes[2],axes[3],100)
  4. x0,x1=np.meshgrid(x0s,x1s)
  5. x=np.c_[x0.ravel(),x1.ravel()]
  6. y_pred=clf.predict(x).reshape(x0.shape)
  7. plt.contourf(x0,x1,y_pred,cmap=plt.cm.brg,alpha=0.2)
  8. plot_predictions(polynomial_svm_clf,[-1.5,2.5,-1,1.5])
  9. plot_dataset(x,y,[-1.5,2.5,-1,1.5])

4.3、多项式核函数

  1. poly_kernel_svm_clf=Pipeline([
  2. ("scaler",StandardScaler()),
  3. ("svm_clf",SVC(kernel='poly',degree=3,coef0=1,C=5))
  4. ])
  5. poly_kernel_svm_clf.fit(x,y)

 

  1. poly100_kernel_svm_clf=Pipeline([
  2. ("scaler",StandardScaler()),
  3. ("svm_clf",SVC(kernel='poly',degree=10,coef0=100,C=5))
  4. ])
  5. poly100_kernel_svm_clf.fit(x,y)

  1. plt.figure(figsize=(11,4))
  2. plt.subplot(121)
  3. plot_predictions(poly_kernel_svm_clf,[-1.5,2.5,-1,1.5])
  4. plot_dataset(x,y,[-1.5,2.5,-1,1.5])
  5. plt.title(r"$d=3,r=1,C=5$")
  6. plt.subplot(122)
  7. plot_predictions(poly100_kernel_svm_clf,[-1.5,2.5,-1,1.5])
  8. plot_dataset(x,y,[-1.5,2.5,-1,1.5])
  9. plt.title(r"$d=10,r=100,C=5$")
  10. plt.show()

 

 4.4、高斯(径向基)RBF核函数

  1. import numpy as np
  2. from matplotlib import pyplot as plt
  3. ## 构造数据
  4. X1D = np.linspace(-4, 4, 9).reshape(-1, 1)
  5. X2D = np.c_[X1D, X1D ** 2]
  6. y = np.array([0, 0, 1, 1, 1, 1, 1, 0, 0])
  7. from sklearn.datasets import make_moons
  8. X, y = make_moons(n_samples=100, noise=0.15, random_state=42) #指定两个环形测试数据
  9. from sklearn.svm import SVC
  10. from sklearn.pipeline import Pipeline ##使用操作流水线
  11. from sklearn.preprocessing import StandardScaler
  12. ## 通过设置degree值来进行对比实验
  13. poly_kernel_svm_clf = Pipeline([
  14. ("scaler", StandardScaler()),
  15. ("svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5)) ##coef0表示偏置项
  16. ])
  17. poly_kernel_svm_clf.fit(X, y)
  18. poly100_kernel_svm_clf = Pipeline([
  19. ("scaler", StandardScaler()),
  20. ("svm_clf", SVC(kernel="poly", degree=100, coef0=1, C=5))
  21. ])
  22. poly100_kernel_svm_clf.fit(X, y)
  23. # 制图展示对比结果
  24. def plot_predictions(clf, axes):
  25. xOs = np.linspace(axes[0], axes[1], 100)
  26. x1s = np.linspace(axes[2], axes[3], 100)
  27. x0, x1 = np.meshgrid(xOs, x1s) ##构建坐标棋盘
  28. X = np.c_[x0.ravel(), x1.ravel()]
  29. y_pred = clf.predict(X).reshape(x0.shape) #一定要对预测结果进行reshape操作
  30. plt.contourf(x0, x1, y_pred, cmap=plt.cm.brg, alpha=0.2)
  31. def plot_dataset(X, y, axes):
  32. plt.plot(X[:, 0][y == 0], X[:, 1][y == 0], "bs")
  33. plt.plot(X[:, 0][y == 1], X[:, 1][y == 1], "g^")
  34. plt.axis(axes)
  35. plt.grid(True, which='both')
  36. plt.xlabel(r"$x_1$", fontsize=20)
  37. plt.ylabel(r"$x_2$", fontsize=20, rotation=0)
  38. plt.figure(figsize=(11, 4))
  39. plt.subplot(121)
  40. plot_predictions(poly_kernel_svm_clf, [-1.5, 2.5, -1, 1.5])
  41. plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
  42. plt.title(r"$d=3,r=1,C=5$", fontsize=18)
  43. plt.subplot(122)
  44. plot_predictions(poly100_kernel_svm_clf, [-1.5, 2.5, -1, 1.5])
  45. plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
  46. plt.title(r"$d=10,r=100,C=5$", fontsize=18)
  47. plt.show()

  1. # 定义高斯核函数
  2. def gaussian_rbf(x, landmark, gamma):
  3. '''
  4. :param x: 待变换数据
  5. :param landmark:当前选择位置
  6. :param gamma:(不同γ值对公式会产生不同的影响)
  7. :return:
  8. '''
  9. return np.exp(-gamma * np.linalg.norm(x - landmark, axis=1) ** 2)
  1. gamma = 0.3
  2. x1s = np.linspace(-4.5, 4.5, 200).reshape(-1, 1)
  3. ##分别选择不同的地标将数据进行映射
  4. x2s = gaussian_rbf(x1s, -2, gamma)
  5. x3s = gaussian_rbf(x1s, 1, gamma)
  6. XK = np.c_[gaussian_rbf(X1D, -2, gamma), gaussian_rbf(X1D, 1, gamma)]
  7. yk = np.array([0, 0, 1, 1, 1, 1, 1, 0, 0])
  8. plt.figure(figsize=(11, 4))
  1. ###绘制变换前数据分布已经变换过程
  2. plt.subplot(121)
  3. plt.grid(True, which='both')
  4. plt.axhline(y=0, color='k')
  5. plt.scatter(x=[-2, 1], y=[0, 0], s=150, alpha=0.5, c="red")
  6. plt.plot(X1D[:, 0][yk == 0], np.zeros(4), "bs")
  7. plt.plot(X1D[:, 0][yk == 1],np.zeros(5), "g^")
  8. plt.plot(x1s, x2s, "g-")
  9. plt.plot(x1s, x3s, "b:")
  10. plt.gca().get_yaxis().set_ticks([0, 0.25, 0.5, 0.75, 1])
  11. plt.xlabel(r"$x_1$", fontsize=20)
  12. plt.ylabel(r"Similarity", fontsize=14)
  13. plt.annotate(r'$\mathbf{x}$',
  14. xy=(X1D[3, 0], 0),
  15. xytext=(-0.5, 0.20),
  16. ha="center",
  17. arrowprops=dict(facecolor='black', shrink=0.1),
  18. fontsize=18, )
  19. plt.text(-2, 0.9, "Sx_2s", ha="center", fontsize=20)
  20. plt.text(1, 0.9, "Sx_3S", ha="center", fontsize=20)
  21. plt.axis([-4.5, 4.5, -0.1, 1.1])

  1. ###绘制最终结果与分界线
  2. plt.subplot(122)
  3. plt.grid(True, which='both')
  4. plt.axhline(y=0, color='k')
  5. plt.axvline(x=0, color='k')
  6. plt.plot(XK[:, 0][yk == 0], XK[:, 1][yk == 0], "bs")
  7. plt.plot(XK[:, 0][yk == 1], XK[:, 1][yk == 1], "g^")
  8. plt.xlabel(r"$x_2$", fontsize=20)
  9. plt.ylabel(r"$x_3$", fontsize=20, rotation=0)
  10. plt.annotate(r'$\phi\left (\mathbf{x}\right)$',
  11. xy=(XK[3, 0], XK[3, 1]),
  12. xytext=(0.65, 0.50),
  13. ha="center",
  14. arrowprops=dict(facecolor='black', shrink=0.1),
  15. fontsize=18, )
  16. plt.plot([-0.1, 1.1], [0.57, -0.1], "r--", linewidth=3)
  17. plt.axis([-0.1, 1.1, -0.1, 1.1])
  18. plt.subplots_adjust(right=1)
  19. plt.show()

  1. ### 探讨γ值与C值对模型结果的影响'''
  2. from sklearn.svm import SVC
  3. gamma1, gamma2 = 0.1, 5
  4. C1, C2 = 0.001, 1000
  5. hyperparams = (gamma1, C1), (gamma1, C2), (gamma2, C1), (gamma2, C2)
  6. svm_clfs = []
  7. for gamma, C in hyperparams:
  8. rbf_kernel_svm_clf = Pipeline([
  9. ("scaler", StandardScaler()),
  10. ("svm_clf", SVC(kernel="rbf", gamma=gamma, C=C))
  11. ])
  12. rbf_kernel_svm_clf.fit(X, y)
  13. svm_clfs.append(rbf_kernel_svm_clf)
  14. plt.figure(figsize=(11, 7))
  15. for i, svm_clf in enumerate(svm_clfs):
  16. plt.subplot(221 + i)
  17. plot_predictions(svm_clf, [-1.5, 2.5, -1, 1.5])
  18. plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
  19. gamma, C = hyperparams[i]
  20. plt.title(r'$\gamma={},C={}$'.format(gamma, C), fontsize=16)
  21. plt.show()

 


旧梦可以重温,且看:机器学习(五) -- 监督学习(7) --SVM1
欲知后事如何,且看:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/829449
推荐阅读
相关标签
  

闽ICP备14008679号