Ex1使用SVM分类方法对线性可分数据集进行分类。
Ex2使用SVM分类方法对非线性可分数据集进行分类。
Ex3分别使用准确率(accuracy)、ROC曲线、AUC作为评价指标对Ex1和Ex2实验结果进行评估。
1)使用SVM分类方法对线性可分数据集进行分类
训练线性可分数据集的svm模型,然后用训练出的模型对测试样本分类。
- 准备数据
- 训练模型
- 预测测试样本
- 查看支持向量
#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模型,然后用训练出的模型对测试样本分类。
- 准备数据
- 选择核函数以及合适的参数
- 训练模型
- 预测测试样本
- 查看支持向量
#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的预测效果进行评估。
- 应用分类算法
- 对样本数据进行建模
- 用准确度指标和AUC等指标评估模型
- 记录并分析实验结果
- 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的预测效果进行评估。对支持向量机的概念和实际运用有了更为深入的了解。