SVM学习笔记

入门基础理论

点这里
写的太细了,以至于都不需要自己做笔记····

手写笔记

只有自己看得懂,拍照记录一下
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

代码

使用sklearn:官方文档

# 导库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC

# 使用sklearn生成随机数据,模拟数据
from sklearn.datasets.samples_generator import make_blobs
 # n_samples指定样本个数,centers结果种类 cluster_std簇的离散程度
X, y = make_blobs(n_samples=50, centers=2, random_state=0, cluster_std=0.60)

使用matplotlib画SVM图形

def plot_svc_decision_function(model, ax=None, plot_support=True):
    """绘图 二维的svc决策函数"""
    if ax is None:
        ax = plt.gca()
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()

    # create grid to evaluate model
    x = np.linspace(xlim[0], xlim[1], 30)
    y = np.linspace(ylim[0], ylim[1], 30)
    Y, X = np.meshgrid(y, x)
    xy = np.vstack([X.ravel(), Y.ravel()]).T
    P = model.decision_function(xy).reshape(X.shape)

    # plot decision boundary and margins
    ax.contour(X, Y, P, colors='k',
               levels=[-1, 0, 1], alpha=0.5,
               linestyles=['--', '-', '--'])

    # plot support vectors
    if plot_support:
        ax.scatter(model.support_vectors_[:, 0],
                   model.support_vectors_[:, 1],
                   s=300, linewidth=1, facecolors='none')
    ax.set_xlim(xlim)
    ax.set_ylim(ylim)

创建一个简单的svm模型

需要重点关注的就是C的值,还有gamma,两个参数都需要寻找最合适的值。可以通过GridSearchCV来做做最优参数的组合。

  • 调节C,也就是软间隔问题(soft margin),C越大分类越严格,相对的容易过拟合,泛化能力差。C越小越能容忍错误
  • 只在rbf中使用,gamma越大 特征映射纬度越高,模型越复杂,泛化能力越差
clf = SVC(kernel='rbf', C=1, gamma=0.01).fit(X, y)
# clf = SVC(kernel='linear', C=1).fit(X, y)

看看半成品结果

plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')
plot_svc_decision_function(clf)
plt.show()

GridSearchCV寻找最优参数

from sklearn.model_selection import GridSearchCV

param_grid = {'C': [1, 5, 10], 'gamma': [0.01, 0.0005, 0.0001]}
grid = GridSearchCV(clf, param_grid=param_grid)
grid.fit(X, y)
print(grid.best_params_)

不同的模型和数据,使用的c和gamma都是不一样的。调参的过程还是看自己。。。
过程中还可以将数据使用K折验证法配合GridSearchCV。
别人的代码:

def ml_svc(X, y):
    """
    svc 算法
    :param X: 训练集
    :param y: 标签
    :param model_name: 模型名
    :return: svc.model
    """
    # 定义模型名
    model_name = 'svc.model'
    
    # 取出部分样例划分 训练集(寻参用) 和 测试集(评估用),进行 网格寻参 以及 评估模型
    X_train, X_test, y_train, y_test = train_test_split(X[:2000], y[:2000], test_size=0.2)

    # 网格寻参范围
    param_grid = {
        'C': [2 ** i for i in range(-5, 15, 2)],
        'gamma': [2 ** i for i in range(3, -15, -2)],
    }
    #  param_grid = {
    #     'C': [1e3, 5e3, 1e4, 5e4, 1e5],
    #     'gamma': [0.0001, 0.0005, 0.001, 0.005, 0.01, 0.1],
    # }
    
    # 定义模型
    svc = SVC(kernel='rbf', class_weight='balanced')
    
    # 定义用于网格寻参的对象,每次锁定一组参数,进行5折交叉验证,评定标准为 f1 score
    clf = GridSearchCV(svc, param_grid, scoring='f1', n_jobs=10, cv=5)
    
    # 开始在数据集 X_train, y_train 上进行网格寻参
    clf.fit(X_train, y_train)
    
    # 打印最优的参数
    print(clf.best_estimator_)
    
    # 评估模型,这里的原理是利用最优参数对应的模型进行预测
    y_pred = clf.predict(X_test)
    print(classification_report(y_test, y_pred))
    print(confusion_matrix(y_test, y_pred))
    
    # 重新定义 svc 模型
    svc = SVC(kernel='rbf', class_weight='balanced',
              C = clf.best_params_['C'], gamma=clf.best_params_['gamma'])
    
    # 训练模型
    model = svc.fit(X, y)
    
    # 打印模型信息
    print(model)
    
    # 保存模型
    with open(model_path + 'svc.model', 'wb') as f:
        pickle.dump(model, f)
    print('save svc.model done')
    return model
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值