La clasificación y la estimación de la svm para el aprendizaje automático

Como un ejemplo de cómo se puede utilizar una SVM para resolver un problema complejo para el aprendizaje de máquina, aquí se encuentra una demostración de una tarea de reconocimiento de escritura y la forma de resolverlo usando un núcleo no lineal, el RBF. El algoritmo SVM aprende del conjunto de datos dígitos disponible a partir de los conjuntos de datos de módulo en el paquete scikit-learn. El conjunto de datos dígitos contiene una serie de imágenes de 8 x 8-escala de grises de píxeles de números escritos a mano que van de 0 a 9.

El problema es bastante simple en comparación con los muchos problemas que se resuelven los motores de reconocimiento de imágenes de hoy, sino que ayuda a captar el potencial del enfoque de aprendizaje. A pesar de que el ejemplo se basa en Python, se puede crear un ejemplo similar utilizando R debido a que ambos idiomas se basan en la misma biblioteca LIBSVM trabajo detrás de las escenas. La salida ejemplo aparece a continuación.

matplotlib.pyplot importación como PLT

matplotlib importación como MPL

de load_digits sklearn.datasets importación

importar numpy como NP

la importación al azar

dígitos = load_digits ()

X, Y = digits.data, digits.target

% Matplotlib inline

random_examples = [random.randint (0, len (digits.images))

para i en el rango de (10)]

para n, número en Enumerar (random_examples):

plt.subplot (2, 5, n + 1)

plt.imshow (digits.images [número], CMAP = `binario`,

interpolación = `none`, medida = [0,8,0,8])

plt.grid ()

plt.show ()

conjunto de datos MNIST
Una muestra del conjunto de datos dígitos manuscrita MNIST proporcionada por scikit-learn.

El código de ejemplo imprime al azar unas pocas muestras de manera que se puede ver un ejemplo de los diferentes estilos manuscritas encontradas en el conjunto de datos. Sus ejemplos impresos pueden ser diferentes. El código hace que la información gráfica de una serie de números, colocado en un vector, cada una apuntando a un píxel de la imagen. El algoritmo se entera de que si ciertos pixeles activan juntos, la imagen representada corresponde a un número particular.

Este ejemplo demuestra la idea expuesta por la tribu Analogizers: Ciertos patrones corresponden a respuestas basadas en una analogía. SVM tienden a ocultar este hecho, ya que parecen ofrecer una combinación lineal de funciones ponderadas, al igual que lo hace la regresión lineal, sino recordar que al aplicar las funciones del núcleo, la optimización se basa en los productos de punto de ejemplos.

productos escalares son una manera de estimar la distancia entre los puntos con el fin de dividir el espacio de características en particiones homogéneos que tienen la misma clase en el interior. La distancia es una manera de establecer similitudes en un espacio hecho de características. A continuación, las SVM funciona en la similitud, puntos y patrones basados ​​en la distancia asociar.

Para verificar correctamente los resultados del modelo, extraer el primer 30 por ciento de los ejemplos para su uso como un conjunto de prueba (un fuera de la muestra). También desea preparar las características de cambio de escala en la van de -1 a +1 a aliviar los cálculos SVM. El algoritmo aprende primero los parámetros de la transformación del conjunto de entrenamiento solo y sólo después de que se aplican al equipo de prueba para que evitar cualquier tipo de fuga de información fuera de la muestra.

Una acción crítica para tomar antes de alimentar a los datos en una SVM está escalando. Escalamiento transforma todos los valores al rango entre -1 a 1 (o de 0 a 1, si lo prefiere). Escalamiento transformación evita el problema de tener algunas variables influyen en el algoritmo y hace que los cálculos exactos, suave y rápido.

El código se inicia mediante la adopción de una SVM con un núcleo no lineal. Para comprobar la utilidad de la representación por el algoritmo de aprendizaje automático, el ejemplo se utiliza el nivel de acierto (el porcentaje de aciertos) como una medida de lo bien que el modelo es).

de sklearn.cross_validation train_test_split importación

de sklearn.cross_validation cross_val_score importación

Video: The wonderful and terrifying implications of computers that can learn | Jeremy Howard | TEDxBrussels

de sklearn.preprocessing MinMaxScaler importación

# Mantenemos el 30% ejemplos al azar para la prueba

X_train, X_test, y_train, y_test = train_test_split (X,

y, test_size = 0,3, random_state = 101)

# Escalamos los datos en el rango [-1,1]

escala = MinMaxScaler (feature_range = (- 1, 1)). caber (X_train)

X_train = scaling.transform (X_train)

X_test = scaling.transform (X_test)

de importación sklearn.svm SVC

svm = SVC ()

cv_performance = cross_val_score (SVM, X_train, y_train,

CV = 10)

test_performance = svm.fit (X_train, y_train) .score (X_test,

y_test)

print ( `La validación cruzada exactitud puntuación:% 0.3f,`

`Exactitud de la prueba Clasificación:% 0.3f`

% (Np.mean (cv_performance), test_performance))

La validación cruzada nivel de acierto: 0,981,

prueba de nivel de acierto: 0,985

Después de haber verificado la validación cruzada calificar usando los hiper-parámetros por defecto, el código utiliza una búsqueda sistemática en busca de mejores opciones que podrían proporcionar un mayor número de respuestas exactas. Durante la búsqueda, el código prueba diferentes combinaciones de lineal y junto con RBF do y gama parámetros. (En este ejemplo se puede requerir mucho tiempo para funcionar.)

GridSearchCV de importación sklearn.grid_search

importar numpy como NP

learning_algo = SVC (kernel = `lineal`, random_state = 101)

search_space = [{ `kernel`: [ `lineal`],

`C`: np.logspace (-3, 3, 7)},

{ `Núcleo`: [ `RBF`],

`C`: np.logspace (-3, 3, 7),

`Gamma`: np.logspace (-3, 2, 6)}]

gridsearch = GridSearchCV (learning_algo,

param_grid = search_space,

reinstala = True, CV = 10)

gridsearch.fit (X_train, y_train)

print ( `Mejor parámetro:% s`

% Str (gridsearch.best_params_))

cv_performance = gridsearch.best_score_

test_performance = gridsearch.score (X_test, y_test)

print ( `La validación cruzada exactitud puntuación:% 0.3f,`

`Exactitud de la prueba Clasificación:% 0.3f`

% (Cv_performance, test_performance))

Mejor parámetro: { `kernel`: `rbf`, `C`: 1,0,

`Gamma`: ,10000000000000001}

La validación cruzada nivel de acierto: 0.988,

prueba de nivel de acierto: 0,987

Los cálculos pueden tardar unos minutos, después de lo cual el equipo informa de la mejor núcleo, do, y gama parámetros, junto con un CV mejora de puntuación de llegar a casi el 99 por ciento de exactitud. La precisión es alta, lo que indica que el ordenador puede distinguir casi todas las diferentes formas de escribir los números del 0 al 9. Como resultado final, el código imprime los números que la SVM predijo erróneamente en la prueba.

predicción = gridsearch.predict (X_test)

wrong_prediction = (predicción! = y_test)

test_digits = scaling.inverse_transform (X_test)

para n, (número, yp, yt) en enumerate (zip (

scaling.inverse_transform (X_test) [wrong_prediction],

predicción [wrong_prediction],

y_test [wrong_prediction])):

plt.subplot (2, 5, n + 1)

plt.imshow (number.reshape ((8,8)), CMAP = `binario`,

interpolación = `none`,

medida = [0,8,0,8])

plt.title ( `pred:` + str (yp) +"! ="+ Str (yt))

plt.grid ()

plt.show ()

SVM con RBF
Los números escritos a mano que la SVM con kernel RBF no podían adivinar correctamente.

Los números que ya ha recibido el algoritmo mal son particularmente difíciles de adivinar, y no es de extrañar que no podía llegar a todos ellos a la derecha. Asimismo, recuerda que el conjunto de datos proporcionado por scikit-learn es sólo una parte de lo real conjunto de datos MNIST. El conjunto de datos consta de 60.000 ejemplos de entrenamiento y 10.000 ejemplos de prueba. Utilizando el mismo algoritmo de SVC y la misma configuración, el SVC puede aprender el conjunto de datos original, permitiendo al ordenador para leer cualquier número escrito a mano se presente.

Artículos Relacionados