sklearn机器学习之SVM不同核函数不同数据集的效果

1.导入相应包

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs, make_circles, make_classification, make_moons
from sklearn import svm
from matplotlib.colors import ListedColormap
import pandas as pd

2.准备数据集

#生成数据集
n_samples = 100
datasets = [
    make_moons(n_samples=n_samples, noise=0.2, random_state=0),
    make_circles(n_samples=n_samples, noise=0.2, factor=0.5, random_state=1),
    make_blobs(n_samples=n_samples, centers=2, random_state=5),
    make_classification(n_samples=n_samples, n_features = 2, n_informative=2, n_redundant=0, random_state=5)
]
#定义核函数
Kernel = ["linear", "poly", "rbf", "sigmoid"]
#绘制图像
for X,Y in datasets:
    plt.figure(figsize=(5,4))
    plt.scatter(X[:,0], X[:,1], c=Y, s=50, cmap="rainbow")

图像太占位置,在下述给出。

3.定义模型并可视化效果

此次可视化代码有一定难度,可以参考注释。

#每行为不同数据集
nrows = len(datasets)
#每列为不同核函数,+1表示增加一列绘制原图
ncols = len(Kernel) + 1
#创建画布子图
fig, axes = plt.subplots(nrows, ncols, figsize=(20, 16))
#遍历数据集
for ds_cnt, (X, Y) in enumerate(datasets):
	#去除第零列绘制原图
    ax = axes[ds_cnt, 0]
    #第一个图上方设置标题
    if(ds_cnt == 0):
        ax.set_title("Input data")
    #绘制原图散点图
    ax.scatter(X[:, 0], X[:, 1], c=Y, zorder=10, cmap=plt.cm.Paired, edgecolors='k')
    ax.set_xticks(())
    ax.set_yticks(())
	#遍历核函数
    for est_idx, kernel in enumerate(Kernel):
    	#取出子图
        ax = axes[ds_cnt, est_idx + 1]
        #训练对应核函数的模型
        clf = svm.SVC(kernel=kernel, gamma=2).fit(X, Y)
		#获得评分
        score = clf.score(X, Y)
        #绘制原图散点图
        ax.scatter(X[:, 0], X[:, 1], c=Y, zorder=10, cmap=plt.cm.Paired, edgecolors='k')
        #绘制支持向量点
        ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=50, facecolors='none', zorder=10, edgecolors='k')
		#找出两列特征的最小最大值
        x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
        y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
        #np.mgrid, 合并了之前使用的np.linspace和np.meshgrid的用法, 200j代表分割为200等份
        XX, YY = np.mgrid[x_min: x_max: 200j, y_min: y_max: 200j]
        #np.c_与np.vstack类似的功能,注意展平获得距离后需要用reshape函数还原为原始维度与XX保持一致(为了后续画图pcolormesh参数能对应上)
        Z = clf.decision_function(np.c_[XX.ravel(), YY.ravel()]).reshape(XX.shape)
        #Paired表示颜色相近的色彩输出,比如浅蓝、深蓝 ;浅红、深红;浅绿,深绿
        ax.pcolormesh(XX, YY, Z > 0, cmap=plt.cm.Paired)
        #绘制等高线(上篇博客中已经讲过)
        ax.contour(XX, YY, Z, colors=['k', 'k', 'k'], linestyles=['--', '-', '--'], levels=[-1, 0, 1])
        ax.set_xticks(())
        ax.set_yticks([])
        #设置核函数标题
        if ds_cnt == 0:
            ax.set_title(Kernel[est_idx])
        #显示正确率,bbox为设置文字嵌入的背景块,transform表示确定文字对应的坐标轴(这里就是子图的坐标轴而不是大图),horizontalalignment表示在坐标轴右边
        ax.text(0.95, 0.06, ('%.2f' % score).lstrip('0'), size=15, bbox=dict(boxstyle='round', alpha=0.8, facecolor='white'), transform=ax.transAxes, horizontalalignment='right')
#将子图紧缩(自动)
plt.tight_layout()

绘制出的图像如下:
sklearn机器学习之SVM不同核函数不同数据集的效果_第1张图片
我们看到‘rbf’核函数时效果都比较好。

你可能感兴趣的:(支持向量机,机器学习,可视化,人工智能)