加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 可以在scikit-learn中使用预先计算的内核从SVM制作ROC

发布时间:2020-12-20 13:34:42 所属栏目:Python 来源:网络整理
导读:我正在使用此示例从SVM分类结果创建ROC图: http://scikit-learn.org/0.13/auto_examples/plot_roc.html 但是,每个数据点实际上由4个length-d特征向量组成,使用不符合特定K(X,X)范例的自定义内核函数进行组合.因此,我必须为scikit-learn提供预先计算的内核才
我正在使用此示例从SVM分类结果创建ROC图: http://scikit-learn.org/0.13/auto_examples/plot_roc.html

但是,每个数据点实际上由4个length-d特征向量组成,使用不符合特定K(X,X)范例的自定义内核函数进行组合.因此,我必须为scikit-learn提供预先计算的内核才能进行分类.它看起来像这样:

K = numpy.zeros(shape = (n,n))

# w1 + w2 + w3 + w4 = 1.0

# v1: array,shape (n,d)
# w1: float in [0,1)
chi = sklearn.metrics.pairwise.chi2_kernel(v1,v1)
mu = 1.0 / numpy.mean(chi)
K += w1 * numpy.exp(-mu * chi)

# v2: array,d)
# w2: float in [0,1)
chi = sklearn.metrics.pairwise.chi2_kernel(v2,v2)
mu = 1.0 / numpy.mean(chi)
K += w2 * numpy.exp(-mu * chi)

# v3: array,d)
# w3: float in [0,1)
chi = sklearn.metrics.pairwise.chi2_kernel(v3,v3)
mu = 1.0 / numpy.mean(chi)
K += w3 * numpy.exp(-mu * chi)

# v4: array,d)
# w4: float in [0,1)
chi = sklearn.metrics.pairwise.chi2_kernel(v4,v4)
mu = 1.0 / numpy.mean(chi)
K += w4 * numpy.exp(-mu * chi)

return K

生成ROC图的主要障碍(来自上面的链接)似乎是将数据拆分为两组,然后在测试集上调用predict_proba()的过程.是否可以使用预先计算的内核进行scikit-learn?

解决方法

简短的回答是“也许不是”.
你尝试过类似下面的东西吗?

基于http://scikit-learn.org/stable/modules/svm.html的示例,您需要以下内容:

import numpy as np

    from sklearn import svm
    X = np.array([[0,0],[1,1]])
    y = [0,1]
    clf = svm.SVC(kernel='precomputed')

    # kernel computation
    K = numpy.zeros(shape = (n,n))

    # "At the moment,the kernel values between all training vectors 
    #  and the test vectors must be provided." 
    #  according to scikit learn web page. 
    #  -- This is the problem!
    # v1: array,d)
    # w1: float in [0,1)
    chi = sklearn.metrics.pairwise.chi2_kernel(v1,v1)
    mu = 1.0 / numpy.mean(chi)
    K += w1 * numpy.exp(-mu * chi)

    # v2: array,d)
    # w2: float in [0,1)
    chi = sklearn.metrics.pairwise.chi2_kernel(v2,v2)
    mu = 1.0 / numpy.mean(chi)
    K += w2 * numpy.exp(-mu * chi)

    # v3: array,d)
    # w3: float in [0,1)
    chi = sklearn.metrics.pairwise.chi2_kernel(v3,v3)
    mu = 1.0 / numpy.mean(chi)
    K += w3 * numpy.exp(-mu * chi)

    # v4: array,d)
    # w4: float in [0,1)
    chi = sklearn.metrics.pairwise.chi2_kernel(v4,v4)
    mu = 1.0 / numpy.mean(chi)
    K += w4 * numpy.exp(-mu * chi)

    # scikit-learn is a wrapper LIBSVM and looking at the LIBSVM Readme file
    # it seems you need kernel values for test data something like this:    

    Kt = numpy.zeros(shape = (nt,n))
    # t1: array,shape (nt,1)
    chi = sklearn.metrics.pairwise.chi2_kernel(t1,v1)
    mu = 1.0 / numpy.mean(chi)
    Kt += w1 * numpy.exp(-mu * chi)

    # v2: array,1)
    chi = sklearn.metrics.pairwise.chi2_kernel(t2,v2)
    mu = 1.0 / numpy.mean(chi)
    Kt += w2 * numpy.exp(-mu * chi)

    # v3: array,1)
    chi = sklearn.metrics.pairwise.chi2_kernel(t3,v3)
    mu = 1.0 / numpy.mean(chi)
    Kt += w3 * numpy.exp(-mu * chi)

    # v4: array,1)
    chi = sklearn.metrics.pairwise.chi2_kernel(t4,v4)
    mu = 1.0 / numpy.mean(chi)
    Kt += w4 * numpy.exp(-mu * chi)

    clf.fit(K,y) 

    # predict on testing examples
    probas_ = clf.predict_proba(Kt)

从这里只是复制底部的http://scikit-learn.org/0.13/auto_examples/plot_roc.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读