sklearn实现SVC算法

支持向量机(Support Vector Machine)指的是一系列机器学习方法,这类方法的基础是支持向量算法。
SVM算法的基本原理是寻找一个能够区分两类的超平面(hyper plane),使得边际(margin)最大。
所有座落在两边边际超平面上的点就被称为支持向量(Support Vector)。
SVM算法既可用于回归问题,比如SVR(Support Vector Regression,支持向量回归);也可以用于分类问题,比如SVC(Support Vector Classification,支持向量分类)。
关于该算法的讲解,推荐一套比较完整的视频,提供的视频链接是发布在油管上的。查找第7课关于 SVM 的讲解。炼数成金

# coding:utf-8

from time import time
from sklearn.svm import SVC
from sklearn.svm import LinearSVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import f1_score
from sklearn.metrics import make_scorer
import pickle
from cfg import *


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

你可能感兴趣的:(sklearn实现SVC算法)