SVM - 评分函数

Posted

技术标签:

【中文标题】SVM - 评分函数【英文标题】:SVM - scoring function 【发布时间】:2016-05-29 03:39:35 【问题描述】:

我有以下来自 weka 的 SVM 分类输出。我想将 SVM 分类器输出绘制为异常或正常。如何从该输出中获取SVM scoring function

=== 运行信息===

Scheme:       weka.classifiers.functions.SMO -C 1.0 -L 0.001 -P 1.0E-12 -N 0 -V -1 -W 1 -K "weka.classifiers.functions.supportVector.PolyKernel -E 1.0 -C 250007"
Relation:     KDDTrain
Instances:    125973
Attributes:   42
              duration
              protocol_type
              service
              flag
              src_bytes
              dst_bytes
              land
              wrong_fragment
              urgent
              hot
              num_failed_logins
              logged_in
              num_compromised
              root_shell
              su_attempted
              num_root
              num_file_creations
              num_shells
              num_access_files
              num_outbound_cmds
              is_host_login
              is_guest_login
              count
              srv_count
              serror_rate
              srv_serror_rate
              rerror_rate
              srv_rerror_rate
              same_srv_rate
              diff_srv_rate
              srv_diff_host_rate
              dst_host_count
              dst_host_srv_count
              dst_host_same_srv_rate
              dst_host_diff_srv_rate
              dst_host_same_src_port_rate
              dst_host_srv_diff_host_rate
              dst_host_serror_rate
              dst_host_srv_serror_rate
              dst_host_rerror_rate
              dst_host_srv_rerror_rate
              class
Test mode:    10-fold cross-validation

=== 分类器模型(完整训练集)===

SMO

Kernel used:
  Linear Kernel: K(x,y) = <x,y>

Classifier for classes: normal, anomaly

BinarySMO

Machine linear: showing attribute weights, not support vectors.

        -0.0498 * (normalized) duration
 +       0.5131 * (normalized) protocol_type=tcp
 +      -0.6236 * (normalized) protocol_type=udp
 +       0.1105 * (normalized) protocol_type=icmp
 +      -1.1861 * (normalized) service=auth
 +       0      * (normalized) service=bgp
 +       0      * (normalized) service=courier
 +       1      * (normalized) service=csnet_ns
 +       1      * (normalized) service=ctf
 +       1      * (normalized) service=daytime
 +      -0      * (normalized) service=discard
 +      -1.2505 * (normalized) service=domain
 +      -0.6878 * (normalized) service=domain_u
 +       0.9418 * (normalized) service=echo
 +       1.1964 * (normalized) service=eco_i
 +       0.9767 * (normalized) service=ecr_i
 +       0.0073 * (normalized) service=efs
 +       0.0595 * (normalized) service=exec
 +      -1.4426 * (normalized) service=finger
 +      -1.047  * (normalized) service=ftp
 +      -1.4225 * (normalized) service=ftp_data
 +       2      * (normalized) service=gopher
 +       1      * (normalized) service=hostnames
 +      -0.9961 * (normalized) service=http
 +       0.7255 * (normalized) service=http_443
 +       0.5128 * (normalized) service=imap4
 +      -6.3664 * (normalized) service=IRC
 +       1      * (normalized) service=iso_tsap
 +      -0      * (normalized) service=klogin
 +       0      * (normalized) service=kshell
 +       0.7422 * (normalized) service=ldap
 +       1      * (normalized) service=link
 +       0.5993 * (normalized) service=login
 +       1      * (normalized) service=mtp
 +       1      * (normalized) service=name
 +       0.2322 * (normalized) service=netbios_dgm
 +       0.213  * (normalized) service=netbios_ns
 +       0.1902 * (normalized) service=netbios_ssn
 +       1.1472 * (normalized) service=netstat
 +       0.0504 * (normalized) service=nnsp
 +       1.058  * (normalized) service=nntp
 +      -1      * (normalized) service=ntp_u
 +      -1.5344 * (normalized) service=other
 +       1.3595 * (normalized) service=pm_dump
 +       0.8355 * (normalized) service=pop_2
 +      -2      * (normalized) service=pop_3
 +       0      * (normalized) service=printer
 +       1.051  * (normalized) service=private
 +      -0.3082 * (normalized) service=red_i
 +       1.0034 * (normalized) service=remote_job
 +       1.0112 * (normalized) service=rje
 +      -1.0454 * (normalized) service=shell
 +      -1.6948 * (normalized) service=smtp
 +       0.1388 * (normalized) service=sql_net
 +      -0.3438 * (normalized) service=ssh
 +       1      * (normalized) service=supdup
 +       0.8756 * (normalized) service=systat
 +      -1.6856 * (normalized) service=telnet
 +      -0      * (normalized) service=tim_i
 +      -0.8579 * (normalized) service=time
 +      -0.726  * (normalized) service=urh_i
 +      -1.0285 * (normalized) service=urp_i
 +       1.0347 * (normalized) service=uucp
 +       0      * (normalized) service=uucp_path
 +       0      * (normalized) service=vmnet
 +       1      * (normalized) service=whois
 +      -1.3388 * (normalized) service=X11
 +       0      * (normalized) service=Z39_50
 +       1.7882 * (normalized) flag=OTH
 +      -3.0982 * (normalized) flag=REJ
 +      -1.7279 * (normalized) flag=RSTO
 +       1      * (normalized) flag=RSTOS0
 +       2.4264 * (normalized) flag=RSTR
 +       1.5906 * (normalized) flag=S0
 +      -1.952  * (normalized) flag=S1
 +      -0.9628 * (normalized) flag=S2
 +      -0.3455 * (normalized) flag=S3
 +       1.2757 * (normalized) flag=SF
 +       0.0054 * (normalized) flag=SH
 +       0.8742 * (normalized) src_bytes
 +       0.0542 * (normalized) dst_bytes
 +      -1.2659 * (normalized) land=1
 +       2.7922 * (normalized) wrong_fragment
 +       0.0662 * (normalized) urgent
 +       8.1153 * (normalized) hot
 +       2.4822 * (normalized) num_failed_logins
 +       0.2242 * (normalized) logged_in=1
 +      -0.0544 * (normalized) num_compromised
 +       0.9248 * (normalized) root_shell
 +      -2.363  * (normalized) su_attempted
 +      -0.2024 * (normalized) num_root
 +      -1.2791 * (normalized) num_file_creations
 +      -0.0314 * (normalized) num_shells
 +      -1.4125 * (normalized) num_access_files
 +      -0.0154 * (normalized) is_host_login=1
 +      -2.3307 * (normalized) is_guest_login=1
 +       4.3191 * (normalized) count
 +      -2.7484 * (normalized) srv_count
 +      -0.6276 * (normalized) serror_rate
 +       2.843  * (normalized) srv_serror_rate
 +       0.6105 * (normalized) rerror_rate
 +       3.1388 * (normalized) srv_rerror_rate
 +      -0.1262 * (normalized) same_srv_rate
 +      -0.1825 * (normalized) diff_srv_rate
 +       0.2961 * (normalized) srv_diff_host_rate
 +       0.7812 * (normalized) dst_host_count
 +      -1.0053 * (normalized) dst_host_srv_count
 +       0.0284 * (normalized) dst_host_same_srv_rate
 +       0.4419 * (normalized) dst_host_diff_srv_rate
 +       1.384  * (normalized) dst_host_same_src_port_rate
 +       0.8004 * (normalized) dst_host_srv_diff_host_rate
 +       0.2301 * (normalized) dst_host_serror_rate
 +       0.6401 * (normalized) dst_host_srv_serror_rate
 +       0.6422 * (normalized) dst_host_rerror_rate
 +       0.3692 * (normalized) dst_host_srv_rerror_rate
 -       2.5266

Number of kernel evaluations: -1049600465

输出预测 - 样本输出

inst#     actual  predicted error prediction
        1   1:normal   1:normal       1
        2   1:normal   1:normal       1
        3  2:anomaly  2:anomaly       1
        4   1:normal   1:normal       1
        5   1:normal   1:normal       1
        6  2:anomaly  2:anomaly       1
        7  2:anomaly  2:anomaly       1
        8  2:anomaly  2:anomaly       1
        9  2:anomaly  2:anomaly       1
       10  2:anomaly  2:anomaly       1
       11  2:anomaly  2:anomaly       1
       12  2:anomaly  2:anomaly       1
       13   1:normal   1:normal       1
       14  2:anomaly   1:normal   +   1
       15  2:anomaly  2:anomaly       1
       16  2:anomaly  2:anomaly       1
       17   1:normal   1:normal       1
       18  2:anomaly  2:anomaly       1
       19   1:normal   1:normal       1
       20   1:normal   1:normal       1
       21  2:anomaly  2:anomaly       1
       22  2:anomaly  2:anomaly       1
       23   1:normal   1:normal       1
       24   1:normal   1:normal       1
       25  2:anomaly  2:anomaly       1
       26   1:normal   1:normal       1
       27  2:anomaly  2:anomaly       1
       28   1:normal   1:normal       1
       29   1:normal   1:normal       1
       30   1:normal   1:normal       1
       31  2:anomaly  2:anomaly       1
       32  2:anomaly  2:anomaly       1
       33   1:normal   1:normal       1
       34  2:anomaly  2:anomaly       1
       35   1:normal   1:normal       1
       36   1:normal   1:normal       1
       37   1:normal   1:normal       1
       38  2:anomaly  2:anomaly       1
       39   1:normal   1:normal       1
       40  2:anomaly  2:anomaly       1
       41  2:anomaly  2:anomaly       1
       42  2:anomaly  2:anomaly       1
       43   1:normal   1:normal       1
       44   1:normal   1:normal       1
       45   1:normal   1:normal       1
       46  2:anomaly  2:anomaly       1
       47  2:anomaly  2:anomaly       1
       48   1:normal   1:normal       1
       49  2:anomaly   1:normal   +   1
       50  2:anomaly  2:anomaly       1

=== 按类别划分的详细准确度 ===

                 TP Rate  FP Rate  Precision  Recall   F-Measure  MCC      ROC Area  PRC Area  Class
                 0.986    0.039    0.967      0.986    0.976      0.948    0.973     0.960     normal
                 0.961    0.014    0.983      0.961    0.972      0.948    0.973     0.963     anomaly
Weighted Avg.    0.974    0.028    0.974      0.974    0.974      0.948    0.973     0.962

=== 混淆矩阵 ===

     a     b   <-- classified as
 66389   954 |     a = normal
  2301 56329 |     b = anomaly

【问题讨论】:

我认为您必须为我们澄清一些事情。你一直在问如何绘制这个。但是,您还没有描述您如何设想这个情节出现在最终用户面前。您打算使用什么轴,什么风格的绘图(例如,图形与直方图)等等。 @Prune,对此我很抱歉,但我想将图表绘制为以下图表之一。我只想绘制anomaly vs. normal google.com/… 我知道您希望绿色圆圈表示“正常”,红色 X 表示“异常”;但是您对这些符号的物理位置有何设想?本网站上的图像均为 2D 和 3D 示例。您有 42 个维度,其中 3 个是分类项。我还不明白“以下之一”如何映射到您的数据集中。 你是对的。我在想这样的事情***.com/questions/8017427/… - 以防可以转换为 3d。 【参考方案1】:

那个输出评分函数。将等号读取为简单的布尔运算符,计算结果为 1 为真,0 为假。因此,在一个分类属性的所有选择中,只有一个系数会影响评分值。

例如,让我们只考虑前三个属性,以及这些标准化的输入和结果值:

duration      2.0     -0.0498 * 2.0 => -0.0996
protocol_type icmp     0.1105
service       eco_i    1.1964

请注意,其他 protocol_typeservice 术语(例如

-0.6236 * 协议类型=udp

) 的比较结果为 0(protocol_type=upd 变为 0),因此这些系数不会影响总和。

从这三个属性来看,到目前为止的分数是这三个项的总和,即 1.2073。继续其他 39 个属性,加上最后的常数 -2.5266,这就是向量的分数。

这解释得够清楚了吗?


您引用的博客中的关键短语是:

如果评分函数的输出为负数,则输入为 归类为 y = -1 类。如果分数为正,则 输入被分类为属于 y = 1 类。

是的,就是这么简单:实现漂亮的线性评分函数(42 个变量,116 个术语)。插入一个向量。如果函数出现正数,则向量是正常的;如果它出现负数,则向量是异常的。

是的,您的模型比博客的示例要长得多。该示例基于两个连续特征;你有 42 个特征,其中三个是分类特征(因此有额外的 73 个术语)。该示例有 3 个支持向量;你的将有 43 个(N 维需要 N+1 个支持向量)。然而,即使是这个 42 维模型的运行原理也是一样的:正 = 正常,负 = 异常。


至于您希望映射到二维显示... 可能 ...但我不知道您会发现什么有意义这个实例。将 42 个变量映射到 3 个变量会在我们的空间中造成很多拥塞。我在这里和那里看到了一些不错的技巧,尤其是在梯度场中,力向量与数据点具有相同的空间解释。天气图设法表示测量的 x、y、z 坐标,将风速 (3D)、云量以及可能的其他几个指标添加到显示中。那可能是 10 个符号维度。

在您的情况下,我们也许可以将系数小于 0.07 的维度视为无关紧要;节省了 6 个功能。我们也许可以用颜色、虚线/点/实线符号以及 O 或 X 上的微小文本覆盖(正常/异常数据)来表示三个分类特征。在不使用笛卡尔位置(x,y,z 坐标,假设绘图在 3D 中有意义)的情况下,这是 9 下。

但是,我对您的数据的了解还不足以表明我们可以将剩余的 33 个特征塞进 2 维或 3 维的位置。你能以某种方式组合这些输入中的任何一个吗?多个特征的线性组合是否会给你一个在预测中仍然有意义的结果?

如果不是,那么我们就会坚持使用规范方法:选择有趣的特征组合(通常是对)。为每个绘制一个图表,完全忽略其他特征。如果这些都没有视觉意义......我们的答案是:不,我们不能很好地绘制数据。抱歉,但现实经常在复杂的环境中对我们这样做,我们处理表格中的数据、相关性以及我们可以用我们的 3D 思维处理的其他方法。

【讨论】:

你的回答很清楚。但是这个博客中的公式似乎让我感到困惑。我想要的只是为异常与正常绘制一个支持向量机。你能在这个博客中看到他是如何做到的并给我一些提示吗? chrisjmccormick.wordpress.com/2013/04/16/trivial-svm-example 因为 2.0 是我为持续时间设定的值。其他属性选择为 1 或 0,具体取决于布尔评估。从 src_bytes 到末尾的所有特征也将具有不同的值(不是 0 或 1) 是的。对于每一行,您将评分方程的项相加。请注意,您需要标准化输入数据。 WEKA 是否也为您带来了这种转变?如果没有,您可以编写一些代码来重新计算它。 绘图取决于您需要的可视化。你有 42 个维度。您打算如何在二维中表示这一点——颜色可以帮助一些人,但要处理的变量很多。 “SVM 图”不是标准项目。网上的例子一般是2维或3维的。 很高兴能提供帮助。请记住“接受”答案,以便问题优雅地退出。至于“真棒”,这就是 SO 出现的原因:将问题与碰巧对此有所了解的人匹配。我将把这些荣誉转移到网站上。 :-)【参考方案2】:

有点为什么不完全不同,但我想它可以解决你的根本问题。我假设您使用 Weka Explorer 来生成模型。 如果您转到Classify tab,请单击More 选项...并勾选Output predictions。你得到每个分类的概率。这应该允许您绘制正常与异常

对于iris,我得到类似的东西

inst#,    actual, predicted, error, probability distribution
     1 3:Iris-vir 3:Iris-vir          0      0.333 *0.667
     2 3:Iris-vir 3:Iris-vir          0      0.333 *0.667
     3 3:Iris-vir 3:Iris-vir          0      0.333 *0.667
     4 3:Iris-vir 3:Iris-vir          0      0.333 *0.667
     5 3:Iris-vir 3:Iris-vir          0      0.333 *0.667
     6 1:Iris-set 1:Iris-set         *0.667  0.333  0    
     7 1:Iris-set 1:Iris-set         *0.667  0.333  0    
     8 1:Iris-set 1:Iris-set         *0.667  0.333  0    
     9 1:Iris-set 1:Iris-set         *0.667  0.333  0    
    10 1:Iris-set 1:Iris-set         *0.667  0.333  0    

它包含每个类别的概率。

【讨论】:

我没有看到选择或任何东西。我添加了鸢尾花的提取物作为参考。我看到choose 的唯一地方是分类器。 输出中没有 FN(假阴性)评估指标,我不知道为什么。亲爱的有什么提示吗? 它就在那里。输出中有两行。每个班级都有TP / FP。如果您选择第一堂课的 FP,那么您将获得另一堂课的 FN。这可能有点令人困惑,但由于它应该泛化为多类。

以上是关于SVM - 评分函数的主要内容,如果未能解决你的问题,请参考以下文章

如何分分钟理解SVM(中文版)

卷积神经网络

来自 R 中 SVM 概率的信用评分

加快 SVM 评分中的交叉验证

斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时6

人脸表情识别基于matlab PCA+SVM人脸表情识别评分系统含Matlab源码 593期