【机器学习】SVM算法实现及应用

Ex1使用SVM分类方法对线性可分数据集进行分类。

Ex2使用SVM分类方法对非线性可分数据集进行分类。

Ex3分别使用准确率(accuracy)、ROC曲线、AUC作为评价指标对Ex1和Ex2实验结果进行评估。

    1)使用SVM分类方法对线性可分数据集进行分类

训练线性可分数据集的svm模型,然后用训练出的模型对测试样本分类。

  1. 准备数据
  2. 训练模型
  3. 预测测试样本
  4. 查看支持向量

#X为训练样本,Y为类标签,T为测试样本

X=np.array([[0,0],[1,2],[2,4],[3,3],[3,4],[4,2],[4,4],[4,3],[5,3],[6,2],[7,1],[2,9],[3,8],[4,6],[4,7],[5,6],[5,8],[6,6],[7,4],[8,4],[8,9],[10,10]])                                              

Y= np.array([1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2])

T= np.array([[3,2],[4,8],[6,5],[7,6],[2,5],[5,2]])

    2)使用SVM分类方法对非线性可分数据集进行分类

训练非线性可分数据集的svm模型,然后用训练出的模型对测试样本分类。

  1. 准备数据
  2. 选择核函数以及合适的参数
  3. 训练模型
  4. 预测测试样本
  5. 查看支持向量

#X为训练样本,Y为类标签,T为测试样本

X=np.array([[5,5],[6,4],[5,6],[5,4],[4,5],[8,5],[8,8],[4,5],[5,7],[7,8],[1,2],[1,4],[4,2],[5,1.5],[7,3],[10,4],[4,9],[2,8],[8,9],[9,9],[8,10],[2,5],[9,6]])

Y=np.array([1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2])                         

T=np.array([[6,6],[5.5,5.5],[7,6],[12,14],[7,11],[2,2],[9,9],[8,2],[2,6],[5,10],[4,7],[7,4]])

    3)分类算法建模及分析

运用准确率、精确率、ROC、AUC指标对SVM的预测效果进行评估。

  1. 应用分类算法
  2. 对样本数据进行建模
  3. 用准确度指标和AUC等指标评估模型
  4. 记录并分析实验结果
  5. Ex1源代码:
    #使用SVM分类方法对线性可分数据集进行分类
    import numpy as np
    from sklearn import svm
    import matplotlib.pyplot as plt
    X1=np.array([[0,0],[1,2],[2,4],[3,3],[3,4],[4,2],[4,4],[4,3],[5,3],[6,2],[7,1],[2,9],[3,8],[4,6],[4,7],[5,6],[5,8],[6,6],[7,4],[8,4],[8,9],[10,10]])#训练样本X                                              
    Y1= np.array([1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2])#分类标签Y
    T1= np.array([[3,2],[4,8],[6,5],[7,6],[2,5],[5,2]])#测试集T
    T_Label1 = np.array([2, 2 , 1 , 2 , 1 , 2])
    #建模
    model1 = svm.SVC(kernel='linear')#线性
    model1.fit(X1,Y1)
    s1 = model1.support_vectors_
    print('支持向量机:')
    print(s1)
    T_Predict1 = model1.predict(T1)
    print("预测结果:" , T_Predict1)
    print("真实结果:" , T_Label1)
    plt.scatter(X1[Y1 == 1 , 0], X1[Y1 == 1 , 1])
    plt.scatter(X1[Y1 == 2 , 0], X1[Y1 == 2 , 1])
    plt.show()

    Ex2源代码:

    #使用SVM分类方法对非线性可分数据集进行分类
    import numpy as np
    from sklearn import svm
    import matplotlib.pyplot as plt
    X2=np.array([[5,5],[6,4],[5,6],[5,4],[4,5],[8,5],[8,8],[4,5],[5,7],[7,8],[1,2],[1,4],[4,2],[5,1.5],[7,3],[10,4],[4,9],[2,8],[8,9],[9,9],[8,10],[2,5],[9,6]])
    Y2=np.array([1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2])                         
    T2=np.array([[6,6],[5.5,5.5],[7,6],[12,14],[7,11],[2,2],[9,9],[8,2],[2,6],[5,10],[4,7],[7,4]])
    T_Label2 = np.array([2, 1 , 2 , 2 , 2 , 1 , 2 , 1 , 1 , 2 , 1 , 2])
    model2 = svm.SVC(kernel='rbf' , C=2 , gamma = 1)#建模
    model2.fit(X2 , Y2)#训练
    s2 = model2.support_vectors_
    print('支持向量为:')
    print(s2)
    T_Predict2 = model2.predict(T2)
    print("预测结果:" , T_Predict2)
    print("真实结果:" , T_Label2)
    #分类结果可视化
    plt.scatter(X2[Y2 == 1 , 0], X2[Y2 == 1 , 1],c='black')
    plt.scatter(X2[Y2 == 2 , 0], X2[Y2 == 2 , 1],c='pink')
    print('图形分布为:')
    plt.show()

    Ex3源代码:

    #使用运用准确率、精确率、ROC、AUC指标对SVM的预测效果进行评估。(线性可分数据集)
    import matplotlib.pyplot as plt
    from sklearn.svm import SVC
    from sklearn.metrics import roc_auc_score
    from sklearn.metrics import plot_roc_curve, confusion_matrix
    X=np.array([[0,0],[1,2],[2,4],[3,3],[3,4],[4,2],[4,4],[4,3],[5,3],[6,2],[7,1],[2,9],[3,8],[4,6],[4,7],[5,6],[5,8],[6,6],[7,4],[8,4],[8,9],[10,10]])
    Y = np.array([1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2])
    T = np.array([[3,2],[4,8],[6,5],[7,6],[2,5],[5,2]])
    pred = []
    model = SVC(random_state=0, kernel='linear')
    model.fit(X,Y)
    pred = model.predict(X)
    (tp, fp), (fn, tn) = confusion_matrix(Y, pred)
    print("使用SVM分类方法对线性可分数据集进行分类,此时准确率为:{:.4f}%".format((tp + tn) / (tp + fp + tn + fn) * 100))
    print("使用SVM分类方法对线性可分数据集进行分类,此时精确率为:{:.4f}%".format(tp / (tp + fp) * 100))
    print("使用SVM分类方法对线性可分数据集进行分类,此时AUC 值:{:.4f}".format(roc_auc_score(Y, pred)))
    plt.figure(figsize=(6,6))
    plt.title('Validation ROC')
    plt.plot(fpr, tpr, 'b', label = 'Val AUC = %0.3f' % roc_auc)
    plt.legend(loc = 'lower right')
    plt.plot([0, 1], [0, 1],'r--')
    plt.xlim([0, 1])
    plt.ylim([0, 1])
    plt.ylabel('True Positive Rate')
    plt.xlabel('False Positive Rate')
    plt.show()
    plot_roc_curve(model, X, pred)
    plt.show()
    
    #使用运用准确率、精确率、ROC、AUC指标对SVM的预测效果进行评估。(非线性可分数据集)
    import matplotlib.pyplot as plt
    from sklearn.svm import SVC
    from sklearn.metrics import roc_auc_score
    from sklearn.metrics import plot_roc_curve, confusion_matrix
    X=np.array([[5,5],[6,4],[5,6],[5,4],[4,5],[8,5],[8,8],[4,5],[5,7],[7,8],[1,2],[1,4],[4,2],[5,1.5],[7,3],[10,4],[4,9],[2,8],[8,9],[9,9],[8,10],[2,5],[9,6]])
    Y = np.array([1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2])
    T=np.array([[6,6],[5.5,5.5],[7,6],[12,14],[7,11],[2,2],[9,9],[8,2],[2,6],[5,10],[4,7],[7,4]])
    pred = []
    model = SVC(random_state=0, kernel='rbf')
    model.fit(X, Y)
    pred = model.predict(X)
    (tp, fp), (fn, tn) = confusion_matrix(Y, pred)
    print("使用SVM分类方法对非线性可分数据集进行分类,此时准确率为:{:.4f}%".format((tp + tn) / (tp + fp + tn + fn) * 100))
    print("使用SVM分类方法对非线性可分数据集进行分类,精确率为:{:.4f}%".format(tp / (tp + fp) * 100))
    print("使用SVM分类方法对非线性可分数据集进行分类,此时AUC 值:{:.4f}".format(roc_auc_score(Y, pred)))
    plt.figure(figsize=(6,6))
    plt.title('Validation ROC')
    plt.plot(fpr, tpr, 'b', label = 'Val AUC = %0.3f' % roc_auc)
    plt.legend(loc = 'lower right')
    plt.plot([0, 1], [0, 1],'r--')
    plt.xlim([0, 1])
    plt.ylim([0, 1])
    plt.ylabel('True Positive Rate')
    plt.xlabel('False Positive Rate')
    plt.show()
    plot_roc_curve(model, X,pred)
    plt.show()

    总结:

    通过本次实验,学习了使用SVM分类方法对线性可分数据集和非线性可分数据集进行分类,并学会运用准确率、精确率、ROC、AUC指标对SVM的预测效果进行评估。对支持向量机的概念和实际运用有了更为深入的了解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值