机器学习
xueyifeiyun1989zx,公众号:围着围巾的小黑机器学习之监督学习实战
前文我们提到机器学习中的监督学习,其中有一个模型是我们提到的但是没有训练测试的,叫做支持向量机(简称SVM)。支持向量机也是监督学习里面一个非常容易理解的模型。概念和公式定义我们就不带大家看了,我们还是从代码实战的角度来学习。
SVM本质原理是利用超平面将数据分割成可分的部分,对于可分的数据集来说不用做维度转换,那么对于不可分的数据集要想利用SVM怎么办呢,是有办法的,就是核函数。核函数的存在的意义就是将低维不可分的数据转化成高维可分的数据,从而实现对数据的分类。本文主要关注不同SVM中的核函数,因为我们主要是应用为主,所以只会提高各种核函数并做相关的代码实践,不会对各种核函数的原理进行分析。
另外还有一个问题是需要在本文解决的,大家如果前文仔细看的话,会发现在整个训练和预测的过程中,我们生成了两个数据集,操作起来有点麻烦,那么是否有现成的方法可以自动帮我们将数据集切分成训练集和测试集呢,答案显然是肯定的。
1、导入依赖包、生成基础数据集
from sklearn.datasets import make_classificationimport matplotlib.pyplot as pltfrom sklearn import preprocessingfrom sklearn.model_selection import train_test_splitfrom sklearn.svm import SVCfrom sklearn.metrics import accuracy_scoreimport matplotlib.pyplot as pltimport mpl_toolkits.mplot3d# 生成基础特征数据,该数据包含100条记录,每条记录包含两个特征X,y = make_classification(n_samples = 10000,\n_features = 3,n_redundant = 0,n_repeated = 0)
2、对数据集合进行拆分和模型训练
# 生成训练集和测试集train_x,test_x,train_y,test_y = train_test_split(X,y)# 选择linear核函数,在sklearn中,其模型默认的核函数的rbfsvm = SVC(kernel = 'linear')svm.fit(train_x,train_y)
3、模型预测
# 在训练集上预测predict_train = svm.predict(train_x)# 在训练集上准确率accuracy_score(train_y,predict_train)# 0.8693# 在测试集上预测predict_test = svm.predict(test_x)# 在测试集上准确率accuracy_score(test_y,predict_test)# 0.8573
4、模型可视化
# 分别生成预测正确的和预测错误的数据集合predictTure = test_x[test_y == predict_test]predictFalse = test_x[test_y != predict_test]# 定义一个画图的方法,输入的参数为预测正确和预测错误的数据集合def plot3DPredictStatus(predictTure,predictFalse): # 创建一个三维的绘图工程 ax = plt.subplot(projection = '3d') # 设置图名称 ax.set_title('3d_predict_show') # 绘制数据点 color: 'r'红色,'b'蓝色等颜色 # x代表预测错误的数据 ,o代表预测正确的数据 ax.scatter(predictTure[:,0], \ predictTure[:,1], predictTure[:,2],\ c = 'r',marker = 'o',cmap = 'coolwarm') ax.scatter(predictFalse[:,0],\ predictFalse[:,1], predictFalse[:,2], \ c = 'b',marker = 'x',cmap = 'coolwarm') # 设置x坐标轴 ax.set_xlabel('X') # 设置y坐标轴 ax.set_ylabel('Y') # 设置z坐标轴 ax.set_zlabel('Z') # 画图 plt.show()# 画图函数调用plot3DPredictStatus(predictTure,predictFalse)
图、在预测集上正确的点(红色)和错误(蓝色)的点
5、对比不同核函数的效果
通过查看sklearn的SVM相关的参数说明(如下图),知道其至少提供linear、poly、rbf、sigmod、precomputed等核函数。
图、sklearn中SVM相关的核函数类型说明
# 定义模拟多个核函数的方法def multkernelCompare(): print('{:>10s}|{:8s}'.format('kernel','accuracy')) for kernel in ['linear','poly','rbf','sigmoid']: svm = SVC(kernel = kernel) svm.fit(train_x,train_y) accuracy =accuracy_score(test_y,svm.predict(test_x)) print('{:>10s}|{:8.4f}'.format(kernel,accuracy))# 不同核函数对比方法调用multkernelCompare()
图、不同核函数预测结果的准确性对比