sklearn - Diferente precisión para LibSVM y scikit-learn
sklearn learning curve (1)
SVR
es un modelo de regresión, no un modelo de clasificación. svm-train -c 1
es el modelo Nu-SVC que está disponible como clase sklearn.svm.NuSVC
.
Para el mismo conjunto de datos y parámetros obtengo una precisión diferente para LibSVM
y la implementación SVM de scikit-learn
, aunque scikit-learn
también usa LibSVM
internamente .
¿Qué pasé por alto?
Versión de línea de comando de LibSVM:
me@my-compyter:~/Libraries/libsvm-3.16$ ./svm-train -c 1 -g 0.07 heart_scale heart_scale.model
optimization finished, #iter = 134
nu = 0.433785
obj = -101.855060, rho = 0.426412
nSV = 130, nBSV = 107
Total nSV = 130
me@my-compyter:~/Libraries/libsvm-3.16$ ./svm-predict heart_scale heart_scale.model heart_scale.result
Accuracy = 86.6667% (234/270) (classification)
Versión de Scikit-learn NuSVC:
In [1]: from sklearn.datasets import load_svmlight_file
In [2]: X_train, y_train = load_svmlight_file(''heart_scale'')
In [3]: from sklearn import svm
In [4]: clf = svm.NuSVC(gamma=0.07,verbose=True)
In [5]: clf.fit(X_train,y_train)
[LibSVM]*
optimization finished, #iter = 118
C = 0.479830
obj = 9.722436, rho = -0.224096
nSV = 145, nBSV = 125
Total nSV = 145
Out[5]: NuSVC(cache_size=200, coef0=0.0, degree=3, gamma=0.07, kernel=''rbf'',
max_iter=-1, nu=0.5, probability=False, shrinking=True, tol=0.001,
verbose=True)
In [6]: pred = clf.predict(X_train)
In [7]: from sklearn.metrics import accuracy_score
In [8]: accuracy_score(y_train, pred)
Out[8]: 0.8481481481481481
Versión Scikit-learn SVC:
In [1]: from sklearn.datasets import load_svmlight_file
In [2]: X_train, y_train = load_svmlight_file(''heart_scale'')
In [3]: from sklearn import svm
In [4]: clf = svm.SVC(gamma=0.07,C=1, verbose=True)
In [5]: clf.fit(X_train,y_train)
[LibSVM]*
optimization finished, #iter = 153
obj = -101.855059, rho = -0.426465
nSV = 130, nBSV = 107
Total nSV = 130
Out[5]: SVC(C=1, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.07,
kernel=''rbf'', max_iter=-1, probability=False, shrinking=True, tol=0.001,
verbose=True)
In [6]: pred = clf.predict(X_train)
In [7]: from sklearn.metrics import accuracy_score
In [8]: accuracy_score(y_train, pred)
Out[8]: 0.8666666666666667
Actualizaciones
Actualización1: actualizó el ejemplo de scikit-learn de SVR a NuSVC, vea la respuesta de ogrisel
Actualización2: resultado agregado para verbose=True
Actualización3: se agregó una versión SVC scikit-learn
Entonces parece que mi problema está resuelto. Si utilizo SVC con C=1
y no con NuSVC obtengo los mismos resultados que libsvm, pero ¿alguien puede explicar por qué NuSVC y SVC (C = 1) dan resultados diferentes, aunque deberían hacer lo mismo (ver la respuesta de ogrisel)?