python machine-learning svm libsvm

Un ejemplo que usa enlaces de python para la biblioteca SVM, LIBSVM



machine-learning (8)

Agregando a @shinNoNoir:

param.kernel_type representa el tipo de función de kernel que desea usar, 0: Lineal 1: polinomio 2: RBF 3: Sigmoid

También tenga en cuenta que, svm_problem (y, x): aquí y es las etiquetas de clase y x las instancias de clase y x y y solo pueden ser listas, tuplas y diccionarios. (No matriz numpy)

Estoy en extrema necesidad de un ejemplo de tarea de clasificación usando LibSVM en python. No sé cómo debería verse la entrada y qué función es la responsable del entrenamiento y cuál para probar Gracias


Aquí hay un ejemplo ficticio que aplasté:

import numpy import matplotlib.pyplot as plt from random import seed from random import randrange import svmutil as svm seed(1) # Creating Data (Dense) train = list([randrange(-10, 11), randrange(-10, 11)] for i in range(10)) labels = [-1, -1, -1, 1, 1, -1, 1, 1, 1, 1] options = ''-t 0'' # linear model # Training Model model = svm.svm_train(labels, train, options) # Line Parameters w = numpy.matmul(numpy.array(train)[numpy.array(model.get_sv_indices()) - 1].T, model.get_sv_coef()) b = -model.rho.contents.value if model.get_labels()[1] == -1: # No idea here but it should be done :| w = -w b = -b print(w) print(b) # Plotting plt.figure(figsize=(6, 6)) for i in model.get_sv_indices(): plt.scatter(train[i - 1][0], train[i - 1][1], color=''red'', s=80) train = numpy.array(train).T plt.scatter(train[0], train[1], c=labels) plt.plot([-5, 5], [-(-5 * w[0] + b) / w[1], -(5 * w[0] + b) / w[1]]) plt.xlim([-13, 13]) plt.ylim([-13, 13]) plt.show()


Este ejemplo demuestra un clasificador SVM de una clase; es lo más simple posible al tiempo que muestra el flujo de trabajo LIBSVM completo.

Paso 1 : Importar NumPy y LIBSVM

import numpy as NP from svm import *

Paso 2: Genere datos sintéticos: para este ejemplo, 500 puntos dentro de un límite determinado (nota: se proporcionan bastantes conjuntos de datos reales en el sitio website LIBSVM)

Data = NP.random.randint(-5, 5, 1000).reshape(500, 2)

Paso 3: Ahora, elija un límite de decisión no lineal para un clasificador de una clase :

rx = [ (x**2 + y**2) < 9 and 1 or 0 for (x, y) in Data ]

Paso 4: A continuación, particione arbitrariamente los datos w / r / t de este límite de decisión:

  • Clase I : los que se encuentran dentro o dentro de un círculo arbitrario

  • Clase II : todos los puntos fuera del límite de decisión (círculo)

El edificio modelo de SVM comienza aquí; todos los pasos anteriores a este fueron solo para preparar algunos datos sintéticos.

Paso 5 : construya la descripción del problema llamando a svm_problem , pasando la función de límite de decisión y los datos , luego vincule este resultado a una variable.

px = svm_problem(rx, Data)

Paso 6: Seleccione una función kernel para el mapeo no lineal

Para este ejemplo, elegí RBF (función de base radial) como función de mi kernel

pm = svm_parameter(kernel_type=RBF)

Paso 7: entrene al clasificador, llamando a svm_model , pasando la descripción del problema (px) y kernel (pm)

v = svm_model(px, pm)

Paso 8: Finalmente, pruebe el clasificador entrenado llamando a predict en el objeto modelo entrenado (''v'')

v.predict([3, 1]) # returns the class label (either ''1'' or ''0'')

Para el ejemplo anterior, utilicé la versión 3.0 de LIBSVM (la versión estable actual en el momento en que se publicó esta respuesta ).

Finalmente, w / r / t la parte de su pregunta con respecto a la elección de la función kernel , Support Vector Machines no es específica para una función particular del kernel; por ejemplo, podría haber elegido un núcleo diferente (gaussiano, polinómico, etc.).

LIBSVM incluye todas las funciones del kernel más utilizadas, lo que es de gran ayuda, ya que puede ver todas las alternativas plausibles y seleccionar una para usar en su modelo; solo se trata de llamar a svm_parameter y pasar un valor para kernel_type (a abreviatura de tres letras para el kernel elegido).

Finalmente, la función kernel que elijas para el entrenamiento debe coincidir con la función kernel utilizada en comparación con los datos de prueba.


LIBSVM lee los datos de una tupla que contiene dos listas. La primera lista contiene las clases y la segunda lista contiene los datos de entrada. crea un conjunto de datos simple con dos clases posibles, también necesitas especificar qué kernel quieres usar creando svm_parameter.

>> from libsvm import * >> prob = svm_problem([1,-1],[[1,0,1],[-1,0,-1]]) >> param = svm_parameter(kernel_type = LINEAR, C = 10) ## training the model >> m = svm_model(prob, param) #testing the model >> m.predict([1, 1, 1])


Los ejemplos de código enumerados aquí no funcionan con LibSVM 3.1, por lo que he mostro más o menos el ejemplo de mossplix :

from svmutil import * svm_model.predict = lambda self, x: svm_predict([0], [x], self)[0][0] prob = svm_problem([1,-1], [[1,0,1], [-1,0,-1]]) param = svm_parameter() param.kernel_type = LINEAR param.C = 10 m=svm_train(prob, param) m.predict([1,1,1])



SVM a través de SciKit-learn:

from sklearn.svm import SVC X = [[0, 0], [1, 1]] y = [0, 1] model = SVC().fit(X, y) tests = [[0.,0.], [0.49,0.49], [0.5,0.5], [2., 2.]] print(model.predict(tests)) # prints [0 0 1 1]

Para obtener más detalles aquí: http://scikit-learn.org/stable/modules/svm.html#svm


param = svm_parameter(''-s 0 -t 2 -d 3 -c ''+str(C)+'' -g ''+str(G)+'' -p ''+str(self.epsilon)+'' -n ''+str(self.nu))

No sé sobre las versiones anteriores, pero en LibSVM 3.xx el método svm_parameter(''options'') tomará solo un argumento .

En mi caso C , G , p y nu son los valores dinámicos. Usted realiza cambios de acuerdo con su código.

opciones:

-s svm_type : set type of SVM (default 0) 0 -- C-SVC (multi-class classification) 1 -- nu-SVC (multi-class classification) 2 -- one-class SVM 3 -- epsilon-SVR (regression) 4 -- nu-SVR (regression) -t kernel_type : set type of kernel function (default 2) 0 -- linear: u''*v 1 -- polynomial: (gamma*u''*v + coef0)^degree 2 -- radial basis function: exp(-gamma*|u-v|^2) 3 -- sigmoid: tanh(gamma*u''*v + coef0) 4 -- precomputed kernel (kernel values in training_set_file) -d degree : set degree in kernel function (default 3) -g gamma : set gamma in kernel function (default 1/num_features) -r coef0 : set coef0 in kernel function (default 0) -c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1) -n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5) -p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1) -m cachesize : set cache memory size in MB (default 100) -e epsilon : set tolerance of termination criterion (default 0.001) -h shrinking : whether to use the shrinking heuristics, 0 or 1 (default 1) -b probability_estimates : whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0) -wi weight : set the parameter C of class i to weight*C, for C-SVC (default 1) -v n: n-fold cross validation mode -q : quiet mode (no outputs)

Fuente de documentación: https://www.csie.ntu.edu.tw/~cjlin/libsvm/