• sklearn 笔记 SVM


    1 分类任务

    1.1 SVC

    • 拟合时间至少是样本数量的二次方关系
    • ——》大数据集,可以考虑LinearSVC

    1.1.1 基本使用方法

    1. sklearn.svm.SVC(
    2. C=1.0,
    3. kernel='rbf',
    4. degree=3,
    5. gamma='scale',
    6. coef0=0.0,
    7. shrinking=True,
    8. probability=False,
    9. tol=0.001,
    10. cache_size=200,
    11. class_weight=None,
    12. verbose=False,
    13. max_iter=-1,
    14. decision_function_shape='ovr',
    15. break_ties=False,
    16. random_state=None)

    1.1.2 主要参数说明

    CL2正则化参数
    kernel

    {‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’} or callable

    算法中使用的kernel

    degree如果kernel是poly的时候,多项式的级数
    gammakernel是rbf、poly、sigmoid时的γ
    coef0kernel时poly和sigmoid时的r
    probability

    是否启用概率估计。

    这必须在调用 fit 之前启用,这会减慢该方法,因为它在内部使用 5 折交叉验证,并且 predict_proba 可能与 predict 不一致。

    decision_function_shape

    {‘ovo’, ‘ovr’}

    如果是多类分类的话,ovo是两两比较 one vs one;ovr是一个和其他的比较 one vs rest

    class_weight每个类设置不同的惩罚参数

    1.1.3 举例

    1. import numpy as np
    2. from sklearn.svm import SVC
    3. X = np.array([[-3, -7], [-2, -10], [1, 1], [2, 5]])
    4. y = np.array([1, 1, 2, 2])
    5. #数据部分
    6. clf=SVC(kernel='linear')
    7. clf.fit(X, y)
    8. #fit数据
    9. clf.predict([[-0.8, -1]])
    10. #array([2])
    11. x=np.linspace(-3,2,50)
    12. a,b=clf.coef_[0]
    13. w=clf.intercept_
    14. y=(-a*x-w)/b
    15. import matplotlib.pyplot as plt
    16. plt.scatter(X[:,0],X[:,1],c=Y)
    17. plt.plot(x,y)

    1.1.4 类属性

    classes_

    类的label

    class_weight各个类的penalty C的数值
    coef_

    如果kernel是“linear',返回w

    fit_status_

    是否正确fit,0正确1不正确

    intercept_

    截距

    n_features_in_输入的feature 维度
    support_

    输入X中,是支持向量的那些向量的坐标

    support_vectors_

    支持向量

    n_support_

    每个类中支持向量的个数

    1.1.5 类函数

    fit(X,Y)
    get_params
    predict(X)
    score(X,Y)

    给定数据集和label的平均准确度

    decision_function(X)

    X中的样本在不同分类器上的评估结果

    X的四个样本在分类器上得到的结果,前两个小于等于-1,所以分到一类;后两个大于等于1,所以分到另一类 

    1.2 NuSVC

    大体上和SVC类似,这里多了一个参数来控制支持向量的数量

    1.2.1 主要参数说明

    除了第一个nu和SVC一样

    nu支持向量比例的下限
    kernel

    {‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’} or callable

    算法中使用的kernel

    degree如果kernel是poly的时候,多项式的级数
    gammakernel是rbf、poly、sigmoid时的γ
    coef0kernel时poly和sigmoid时的r
    probability

    是否启用概率估计。

    这必须在调用 fit 之前启用,这会减慢该方法,因为它在内部使用 5 折交叉验证,并且 predict_proba 可能与 predict 不一致。

    decision_function_shape

    {‘ovo’, ‘ovr’}

    如果是多类分类的话,ovo是两两比较 one vs one;ovr是一个和其他的比较 one vs rest

    class_weight每个类设置不同的惩罚参数

    1.2.2 举例

    1. import numpy as np
    2. from sklearn.svm import NuSVC
    3. X = np.array([[-3, -7], [-2, -10], [1, 1], [2, 5]])
    4. y = np.array([1, 1, 2, 2])
    5. #数据部分
    6. clf=NuSVC(kernel='linear')
    7. clf.fit(X, y)
    8. #fit数据
    9. print(clf.predict([[-0.8, -1]]))
    10. #array([2])
    11. x=np.linspace(-3,2,50)
    12. a,b=clf.coef_[0]
    13. w=clf.intercept_
    14. y=(-a*x-w)/b
    15. import matplotlib.pyplot as plt
    16. plt.scatter(X[:,0],X[:,1],c=Y)
    17. plt.plot(x,y)

    1.2.3 类属性

    和SVC一样

    classes_

    类的label

    class_weight各个类的penalty C的数值
    coef_

    如果kernel是“linear',返回w

    fit_status_

    是否正确fit,0正确1不正确

    intercept_

    截距

    n_features_in_输入的feature 维度
    support_

    输入X中,是支持向量的那些向量的坐标

    support_vectors_

    支持向量

    n_support_

    每个类中支持向量的个数

    1.2.4 类函数

    和SVC一样

    fit(X,Y)
    get_params
    predict(X)
    score(X,Y)

    给定数据集和label的平均准确度

    decision_function(X)

    X中的样本在不同分类器上的评估结果

    X的四个样本在分类器上得到的结果,前两个小于等于-1,所以分到一类;后两个大于等于1,所以分到另一类 

    1.3 多类分类 

    •  SVC 和 NuSVC 实现了多类分类的“ovo”方法(一对一,one vs one)。
      • 总共构建了 n_classes * (n_classes - 1) / 2 个分类器,每个分类器训练来自两个类的数据。
    • 同时,通过设置decision_function_shape 选项,可以将ovo的分类结果转换成ovr(一对其他,one vs rest)的分类结果。
    1. X = [[0], [1], [2], [3]]
    2. Y = [0, 1, 2, 3]
    3. clf = SVC(decision_function_shape='ovo')
    4. clf.fit(X, Y)
    5. clf.decision_function([[1]]).shape
    6. # (1, 6)
    7. #[1]在六个分类器上的结果,两两比较,一共6=4*(4-1)/2
    8. clf = SVC(decision_function_shape='ovr')
    9. clf.fit(X, Y)
    10. clf.decision_function([[1]]).shape
    11. # (1, 4)
    12. # #[1]在四个分类器上的结果,每个类和其他

    1.4 各类不平衡问题

    如果各个类数量不均,那该如何是好呢

    • SVC中提供了class_weight,作为fit的一个参数
    • 这是一个{class_label:value}形式的字典,其中每个value都是大于0的浮点数 
    • value是这个类的L2正则项系数

    • sample_weight参数会将第i个样例的penalty设置成C*sample_weight[i]

    2  Regression

    • 支持向量分类的方法可以扩展到解决回归问题。这种方法称为支持向量回归。
    • SVR和NuSVR类比SVC和NuSVC

    2.1 SVR

    2.1.1 主要参数

    kernel

    {‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’} or callable

    算法中使用的kernel

    degree如果kernel是poly的时候,多项式的级数
    gammakernel是rbf、poly、sigmoid时的γ
    coef0kernel时poly和sigmoid时的r
    probability

    是否启用概率估计。

    这必须在调用 fit 之前启用,这会减慢该方法,因为它在内部使用 5 折交叉验证,并且 predict_proba 可能与 predict 不一致。

    decision_function_shape

    {‘ovo’, ‘ovr’}

    如果是多类分类的话,ovo是两两比较 one vs one;ovr是一个和其他的比较 one vs rest

    class_weight每个类设置不同的惩罚参数

    2.1.2 举例

    1. from sklearn.svm import SVR
    2. from sklearn.pipeline import make_pipeline
    3. from sklearn.preprocessing import StandardScaler
    4. import numpy as np
    5. n_samples, n_features = 10, 5
    6. y = rng.randn(n_samples)
    7. X = rng.randn(n_samples, n_features)
    8. regr = make_pipeline(StandardScaler(), SVR(C=1.0, epsilon=0.2))
    9. regr.fit(X, y)

    2.1.3 类属性

    和SVC一样

    classes_

    类的label

    class_weight各个类的penalty C的数值
    coef_

    如果kernel是“linear',返回w

    fit_status_

    是否正确fit,0正确1不正确

    intercept_

    截距

    n_features_in_输入的feature 维度
    support_

    输入X中,是支持向量的那些向量的坐标

    support_vectors_

    支持向量

    n_support_

    每个类中支持向量的个数

    2.1.4 类函数

    和SVC一样

    fit(X,Y)
    get_params
    predict(X)
    score(X,Y)

    给定数据集和label的平均准确度

    decision_function(X)

    X中的样本在不同分类器上的评估结果

    X的四个样本在分类器上得到的结果,前两个小于等于-1,所以分到一类;后两个大于等于1,所以分到另一类 

     

    3 各种kernel

    linear<x,x'>
    polynomial(\gamma <x,x'>+r)^d
    rrbfexp(-\gamma||x-x'||^2)
    sigmoidtanh(\gamma<x,x'>+r)

     

    3.1 自实现kernel

    1. import numpy as np
    2. from sklearn import svm
    3. def my_kernel(X, Y):
    4. return np.dot(X, Y.T)
    5. clf = svm.SVC(kernel=my_kernel)

    4 其他TIps

     

    4.1 设置C

    • C 默认为 1,这是一个合理的默认选择。
      • 如果有很多noise,你应该减少它
      • 减少 C 对应于更多的正则化。
      • LinearSVC和LinearSVR在C变大时对C的敏感性降低,达到一定阈值后预测结果停止改善。 同时,较大的 C 值将需要更多的时间来训练,有时甚至要长 10 倍

    4.2 对数据尺度进行调整

    • SVM算法不是尺度不变的,因此强烈建议对数据进行scale操作。
      • 例如,将输入向量 X 上的每个属性缩放为 [0,1] 或 [-1,+1],或将其标准化为均值 0 和方差 1。
      • 注意,必须将相同的缩放比例应用于测试向量以 获得有意义的结果。
      • 这可以通过使用pipeline轻松完成:
    1. from sklearn.pipeline import make_pipeline
    2. from sklearn.preprocessing import StandardScaler
    3. from sklearn.svm import SVC
    4. clf = make_pipeline(StandardScaler(), SVC())

  • 相关阅读:
    leetcode-1.两数之和
    LV.12 D17 中断控制器 学习笔记
    坑爹,线上同步近 3w 个用户导致链路阻塞引入发的线上问题,你经历过吗?
    CSS总结第七天
    【C++】哈希应用
    (附源码)spring boot图书管理系统 毕业设计 160934
    驱动LSM6DS3TR-C实现高效运动检测与数据采集(4)----上报匿名上位机实现可视化
    CDH集群spark-shell执行过程分析
    2、图机器学习——Graph Embedding
    Spark中常用的聚合算子说明及使用
  • 原文地址:https://blog.csdn.net/qq_40206371/article/details/127577524