2015-11-21 11 views
8

मैंने this thread को SVC() और LinearSVC() के बीच विज्ञान-सीखने के बीच के अंतर के बारे में पढ़ा।विज्ञान के क्षेत्र में एसवीसी और लीनियरएसवीसी के पैरामीटर के तहत समकक्ष सीखते हैं?

अब मैं द्विआधारी वर्गीकरण समस्या का एक डेटा सेट (ऐसी समस्या के लिए, दोनों कार्यों के बीच एक-से-एक/एक-से-आराम रणनीति अंतर को नजरअंदाज किया जा सकता है।)

मैं कोशिश करना चाहता हूँ इन 2 कार्यों में कौन से पैरामीटर मुझे एक ही परिणाम देंगे। सबसे पहले, हमें kernel='linear'SVC() के लिए सेट करना चाहिए, हालांकि, मुझे बस दोनों कार्यों से एक ही परिणाम नहीं मिल सका। मुझे दस्तावेजों से जवाब नहीं मिला, क्या कोई मुझे समकक्ष पैरामीटर सेट खोजने में मदद कर सकता है जिसे मैं ढूंढ रहा हूं?

अपडेट किया गया: मैं scikit सीखने वेबसाइट का एक उदाहरण से निम्नलिखित कोड को संशोधित किया है, और जाहिरा तौर पर वे ही नहीं हैं:

import numpy as np 
import matplotlib.pyplot as plt 
from sklearn import svm, datasets 

# import some data to play with 
iris = datasets.load_iris() 
X = iris.data[:, :2] # we only take the first two features. We could 
         # avoid this ugly slicing by using a two-dim dataset 
y = iris.target 

for i in range(len(y)): 
    if (y[i]==2): 
     y[i] = 1 

h = .02 # step size in the mesh 

# we create an instance of SVM and fit out data. We do not scale our 
# data since we want to plot the support vectors 
C = 1.0 # SVM regularization parameter 
svc = svm.SVC(kernel='linear', C=C).fit(X, y) 
lin_svc = svm.LinearSVC(C=C, dual = True, loss = 'hinge').fit(X, y) 

# create a mesh to plot in 
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), 
        np.arange(y_min, y_max, h)) 

# title for the plots 
titles = ['SVC with linear kernel', 
      'LinearSVC (linear kernel)'] 

for i, clf in enumerate((svc, lin_svc)): 
    # Plot the decision boundary. For that, we will assign a color to each 
    # point in the mesh [x_min, m_max]x[y_min, y_max]. 
    plt.subplot(1, 2, i + 1) 
    plt.subplots_adjust(wspace=0.4, hspace=0.4) 

    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) 

    # Put the result into a color plot 
    Z = Z.reshape(xx.shape) 
    plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8) 

    # Plot also the training points 
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired) 
    plt.xlabel('Sepal length') 
    plt.ylabel('Sepal width') 
    plt.xlim(xx.min(), xx.max()) 
    plt.ylim(yy.min(), yy.max()) 
    plt.xticks(()) 
    plt.yticks(()) 
    plt.title(titles[i]) 

plt.show() 

परिणाम: Output Figure from previous code

उत्तर

13

गणितीय अर्थ में आप की जरूरत स्थापित करने के लिए:

SVC(kernel='linear', **kwargs) # by default it uses RBF kernel 

और

LinearSVC(loss='hinge', **kwargs) # by default it uses squared hinge loss 

एक अन्य तत्व, जो आसानी से तय नहीं किया जा सकता है LinearSVC में intercept_scaling बढ़ रही है, के रूप में इस कार्यान्वयन में पूर्वाग्रह को नियमित कर रहा है (जो एसवीसी में सच नहीं है और न ही SVM में सच होना चाहिए - इस प्रकार इस SVM नहीं है) - फलस्वरूप वे कभी नहीं वास्तव में बराबर होना (जब तक पूर्वाग्रह = 0 आपकी समस्या के लिए), वे दो अलग अलग मॉडल

  • एसवीसी मान के रूप में: 1/2||w||^2 + C SUM xi_i
  • LinearSVC: 1/2||[w b]||^2 + C SUM xi_i

निजी तौर पर मैं विचार LinearSVC sklearn developesr की गलतियों में से एक - इस वर्ग के बस नहीं एक रेखीय SVM है।

अवरोधन स्केलिंग बढ़ रही है (10.0 करने के लिए) के बाद

SVMs

हालांकि, अगर आप यह बहुत ज्यादा पैमाने अप - यह भी विफल हो जाएगा, के रूप में अब सहिष्णुता और पुनरावृत्तियों की संख्या महत्वपूर्ण हैं।

समेकित करने के लिए: रैखिक एसवीसी रैखिक एसवीएम नहीं है, अगर इसका उपयोग न करें तो इसका उपयोग न करें।

+1

हां, मैंने यह 'हानि =' हिंग 'पैरामीटर भी आजमाया है, लेकिन वे अभी भी मुझे वही (या यहां तक ​​कि करीबी) परिणाम नहीं देते हैं .... – Sidney

+0

अद्यतन, अधिक जटिल उत्तर देखें – lejlot

संबंधित मुद्दे