【问题标题】:String Subsequence Kernel and SVM using Python使用 Python 的字符串子序列内核和 SVM
【发布时间】:2014-03-07 16:02:12
【问题描述】:

如何使用子序列字符串内核 (SSK) [Lodhi 2002] 在 Python 中训练 SVM(支持向量机)?

【问题讨论】:

    标签: python machine-learning svm supervised-learning


    【解决方案1】:

    我找到了使用 Shogun Library 的解决方案。您必须从提交 0891f5a38bcb 安装它,因为以后的修订会错误地删除所需的类。

    这是一个工作示例:

    from shogun.Features import *
    from shogun.Kernel import *
    from shogun.Classifier import *
    from shogun.Evaluation import *
    from modshogun import StringCharFeatures, RAWBYTE
    from shogun.Kernel import SSKStringKernel
    
    
    strings = ['cat', 'doom', 'car', 'boom']
    test = ['bat', 'soon']
    
    train_labels  = numpy.array([1, -1, 1, -1])
    test_labels = numpy.array([1, -1])
    
    features = StringCharFeatures(strings, RAWBYTE)
    test_features = StringCharFeatures(test, RAWBYTE)
    
    # 1 is n and 0.5 is lambda as described in Lodhi 2002
    sk = SSKStringKernel(features, features, 1, 0.5)
    
    # Train the Support Vector Machine
    labels = BinaryLabels(train_labels)
    C = 1.0
    svm = LibSVM(C, sk, labels)
    svm.train()
    
    # Prediction
    predicted_labels = svm.apply(test_features).get_labels()
    print predicted_labels
    

    【讨论】:

      【解决方案2】:

      最近,字符串子序列内核 (SSK) [Lodhi.等。 al., 2002] 已添加到Shogun Machine Learning toolbox 中,可用于包括 Python 在内的所有模块化接口。您可以找到一个使用此内核解决 DNA 分类问题的工作示例here,使用 LibSVM。

      【讨论】:

      • 我已经能够运行此示例,但是当尝试使用更改 n 参数和衰减参数的其他数据运行时,我总是从经过训练的 SVM 获得相同的准确度。这怎么可能?
      【解决方案3】:

      这是对gcedo's answer 的更新,可与当前版本的 shogun (Shogun 6.1.3) 一起使用。

      工作示例:

      import numpy as np
      from shogun import StringCharFeatures, RAWBYTE
      from shogun import BinaryLabels
      from shogun import SubsequenceStringKernel
      from shogun import LibSVM
      
      strings = ['cat', 'doom', 'car', 'boom','caboom','cartoon','cart']
      test = ['bat', 'soon', 'it is your doom', 'i love your cat cart','i love loonytoons']
      
      train_labels  = np.array([1, -1, 1, -1,-1,-1,1])
      test_labels = np.array([1, -1, -1, 1])
      
      features = StringCharFeatures(strings, RAWBYTE)
      test_features = StringCharFeatures(test, RAWBYTE)
      
      # 1 is n and 0.5 is lambda as described in Lodhi 2002
      sk = SubsequenceStringKernel(features, features, 3, 0.5)
      
      # Train the Support Vector Machine
      labels = BinaryLabels(train_labels)
      C = 1.0
      svm = LibSVM(C, sk, labels)
      svm.train()
      
      # Prediction
      predicted_labels = svm.apply(test_features).get_labels()
      print(predicted_labels)
      

      【讨论】:

        【解决方案4】:

        为了将来参考,当前版本的 Shogun (3.2.0) 中的内核名称为 StringSubsequenceKernel

        来源:https://code.google.com/p/shogun-toolbox/source/browse/src/shogun/kernel/string/StringSubsequenceKernel.h

        【讨论】:

          猜你喜欢
          • 2018-08-18
          • 2016-01-24
          • 2020-11-09
          • 1970-01-01
          • 2020-03-19
          • 2018-06-24
          • 2012-11-26
          • 2019-01-18
          • 2020-12-02
          相关资源
          最近更新 更多