【Python与机器学习 4-5】 SVM(support vector machines) 支撑向量机

算法思想

找到一个可以分割两类类别的边界,这个边界其实有很多条,如何找到最优的边界呢?

间隔

分类器间隔: 分类边界可以扩展到样本点的最大宽度。
最大间隔分类器:在样本中能够达到最大间隔的线性分类器被称为线性SVM (Linear Support Vector Machine, LSVM)

SVM 正则项

这里写图片描述

C值越大,入越小,正则化越弱 ,容忍的错误越小-> narrow margin,即间隔更窄,也就是新来点的时候能更精确的判断

C值越小,正则化越强 ->large margin,因为间隔大新来点时判断错误的可能性就大

优缺点及优化

优点

•模型简单,容易训练
•能快速预测
•适用于较大(数据量,特征维度) 的数据集
•对于预测结果能很好地解释原因

适用数据:
①线性可分的二分类数据:数据为二分类问题,且这两类数据可以通过线性 分开的
②对小样本数据有优势
③对数值型数据好,对符号性不太好

缺点

•对于低维度的数据,可能没有其他分类器表现的好
•不能很好地去分类不能线性分割的数据集(考虑使用非线性核函数,即 kernel SVM)

优化–使用非线性核函数 kernel SVM

选择一个好的kenel进行升维非常难选

scikit-learn调用SVM模型

建立模型

svm_model = SVC(C=c_value)

训练模型

svm_model.fit(X_train, y_train)

例子

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.svm import SVC

# 加载数据集
fruits_df = pd.read_table('fruit_data_with_colors.txt')

X = fruits_df[['width', 'height']]
y = fruits_df['fruit_label'].copy()

# 将不是apple的标签设为0
y[y != 1] = 0
# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/4, random_state=0)

# 不同的C值
c_values = [0.0001, 1, 10000]

for c_value in c_values:
    # 建立模型
    svm_model = SVC(C=c_value)

    # 训练模型
    svm_model.fit(X_train, y_train)

    # 验证模型
    y_pred = svm_model.predict(X_test)

    acc = accuracy_score(y_test, y_pred)
    print('C={},准确率:{:.3f}'.format(c_value, acc))

     # 可视化
    plot_class_regions_for_classifier(lr_model, X_test.values, y_test.values, title='C={}'.format(c_value))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值