Uso de la máquina de vectores de soporte SVM en Python (con ejemplos y código fuente)

De: http://www.cnblogs.com/luyaoblog/p/6775342.html

Además de usar el algoritmo svm en la caja de herramientas PRTools en Matlab, las máquinas de vectores de soporte también se pueden usar para la clasificación en Python. Debido a que la biblioteca sklearn en Python también integra el algoritmo SVM, el entorno de ejecución de este artículo es Pycharm.

Primero, importe el paquete del algoritmo sklearn

  La biblioteca Scikit-Learn ha implementado todos los algoritmos básicos de aprendizaje automático. Para uso específico, consulte la documentación oficial: http://scikit-learn.org/stable/auto_examples/index.html#support-vector-machines .

  Muchos algoritmos están integrados en skleran, y la forma de importar el paquete es la siguiente,

  Regresión logística: desde sklearn.linear_model import LogisticRegression

      Bayes ingenuos: desde sklearn.naive_bayes import GaussianNB

   K- : : de sklearn.neighbours import KNeighboursclassifier

   : : Desde sklearn.tree import DecisionTreeClassifier

   Máquina de vectores de soporte: desde sklearn import svm

 Segundo, el uso de svc en sklearn

(1) Use loadtxt en numpy para leer el archivo de datos

  Cómo usar loadtxt ():

  

  fname: ruta del archivo. por ejemplo: C: /Dataset/iris.txt.

  dtype: tipo de datos. por ejemplo: flotador, str, etc.

  delimitador: delimitador. por ejemplo: ','.

  convertidores: un diccionario que asigna columnas de datos y funciones de conversión. por ejemplo: {1: fun}, que significa convertir la función de conversión correspondiente en la segunda columna.

  usecols: seleccione columnas de datos.

  Tome el conjunto de datos de orquídeas Iris como ejemplo:

  Debido a que el conjunto de datos original de Iris descargado de la base de datos UCI se ve así, las primeras cuatro columnas son columnas de características, y la quinta columna es una columna de categoría. Hay tres categorías Iris-setosa, Iris-versicolor e Iris-virginica.   

  

  Cuando se utiliza la función loadtxt en numpy para importar el conjunto de datos, se supone que el tipo de datos dtype es de punto flotante, pero es obvio que el tipo de datos de la quinta columna no es de punto flotante.

  Por lo tanto, tenemos que hacer un trabajo adicional, es decir, asignar la quinta columna a los datos de tipo de punto flotante a través de la función de conversión a través del parámetro convertidores en la función loadtxt ().

  Primero, tenemos que escribir una función de conversión:

1

2

3

def iris_type(s):

    it = {'Iris-setosa'0'Iris-versicolor'1'Iris-virginica'2}

    return it[s]

  Siguiente lectura en los datos, convertidores = {4: iris_type} "4" se refiere a la quinta columna:

1

2

path = u'D:/f盘/python/学习/iris.data'  # 数据文件路径

data = np.loadtxt(path, dtype=float, delimiter=',', converters={4: iris_type})

  Leer resultados:

  

(2) Divida Iris en conjunto de entrenamiento y conjunto de prueba

1

2

3

x, y = np.split(data, (4,), axis=1)

= x[:, :2]

x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, train_size=0.6)

  1. división (datos, posición de división, eje = 1 (división horizontal) o 0 (división vertical)).

  2. x = x [:,: 2] es hacer que el dibujo en la etapa posterior sea más intuitivo, por lo que solo se toman las dos primeras columnas del entrenamiento de vectores de valores propios.

  3. sklearn.model_selection.train_test_split divide aleatoriamente el conjunto de entrenamiento y el conjunto de prueba. train_test_split (train_data, train_target, test_size = number, random_state = 0)

  Explicación del parámetro:

  train_data: el conjunto de características de muestra que se dividirá

  train_target: el resultado de la muestra que se dividirá

  test_size: la proporción de muestras, si es un número entero, es el número de muestras

  random_state: es la semilla de números aleatorios.

  Semilla de números aleatorios: de hecho, es el número del número aleatorio del grupo. Cuando necesite repetir la prueba, asegúrese de obtener el mismo número aleatorio. Por ejemplo, si completa 1 cada vez, la matriz aleatoria que obtiene es la misma si los demás parámetros son iguales. Pero llene 0 o no, será diferente cada vez. La generación de números aleatorios depende de las semillas. La relación entre los números aleatorios y las semillas sigue las dos reglas siguientes: semillas diferentes producen números aleatorios diferentes; las mismas semillas producen los mismos números aleatorios incluso si las instancias son diferentes.

(3) Entrenar el clasificador svm

1

2

3

# clf = svm.SVC(C=0.1, kernel='linear', decision_function_shape='ovr')

    clf = svm.SVC(C=0.8, kernel='rbf', gamma=20, decision_function_shape='ovr')

    clf.fit(x_train, y_train.ravel())

   Cuando kernel = 'linear', es un kernel lineal. Cuanto mayor sea la C, mejor será el efecto de clasificación, pero puede haber un sobreajuste (por defecto C = 1).

   Cuando kernel = 'rbf' (predeterminado), es un kernel gaussiano. Cuanto menor es el valor gamma, más continua es la interfaz de clasificación; cuanto mayor es el valor gamma, más "dispersa" la interfaz de clasificación, mejor es el efecto de clasificación, pero puede haber un sobreajuste.

  Cuando decision_function_shape = 'ovr', es un v resto, es decir, una categoría se divide con otras categorías,

  Cuando decision_function_shape = 'ovo', es uno v uno, es decir, dividir las dos categorías y utilizar el método de dos clasificaciones para simular los resultados de la clasificación múltiple.

(4) Calcular la precisión del clasificador svc

1

2

3

4 4

5 5

6 6

print clf.score(x_train, y_train)  # 精度

y_hat = clf.predict(x_train)

show_accuracy(y_hat, y_train, '训练集')

print clf.score(x_test, y_test)

y_hat = clf.predict(x_test)

show_accuracy(y_hat, y_test, '测试集')

 El resultado es:

  Si desea ver la función de decisión, puede usar decision_function ()

1

2

print 'decision_function:\n', clf.decision_function(x_train)

print '\npredict:\n', clf.predict(x_train)

 El resultado es:

  El valor de cada columna en decision_function representa la distancia desde cada categoría.

(5) Dibuja la imagen

  1. Determine el rango del eje de coordenadas, los ejes xey representan respectivamente dos características

1

2

3

4 4

5 5

x1_min, x1_max = x[:, 0].min(), x[:, 0].max()  # 第0列的范围

x2_min, x2_max = x[:, 1].min(), x[:, 1].max()  # 第1列的范围

x1, x2 = np.mgrid[x1_min:x1_max:200j, x2_min:x2_max:200j]  # 生成网格采样点

grid_test = np.stack((x1.flat, x2.flat), axis=1)  # 测试点

# print 'grid_test = \n', grid_testgrid_hat = clf.predict(grid_test)       # 预测分类值grid_hat = grid_hat.reshape(x1.shape)  # 使之与输入的形状相同

   La función mgrid () se usa aquí. La función de esta función se introduce brevemente aquí:

   Suponga que la función objetivo F (x, y) = x + y. El rango del eje x es de 1 ~ 3, y el rango del eje y es de 4 ~ 6. Al dibujar una imagen, hay cuatro pasos principales:

  [Paso 1: x expansión] (expansión a la derecha):

       [1 1 1]

   [2 2 2]

   [3 3 3]

  [Paso 2: expansión y] (expansión hacia abajo):

   [4 5 6]

   [4 5 6]

   [4 5 6]

  [Paso 3: Posicionamiento (xi, yi)]:

   [(1,4) (1,5) (1,6)]

   [(2,4) (2,5) (2,6)]

   [(3,4) (3,5) (3,6)]

  [Paso 4: Sustituir (xi, yi) en F (x, y) = x + y]

  Entonces aquí x1, x2 = np.mgrid [x1_min: x1_max: 200j, x2_min: x2_max: 200j] El resultado es:

  

  Luego, a través de la función stack (), axis = 1, genera puntos de prueba

  

  2. Especifique la fuente predeterminada

1

2

mpl.rcParams['font.sans-serif'= [u'SimHei']

mpl.rcParams['axes.unicode_minus'= False

  3. Draw

1

2

3

4 4

5 5

6 6

7 7

8

9 9

10

11

12

cm_light = mpl.colors.ListedColormap(['#A0FFA0''#FFA0A0''#A0A0FF'])

cm_dark = mpl.colors.ListedColormap(['g''r''b'])

plt.pcolormesh(x1, x2, grid_hat, cmap=cm_light)

plt.scatter(x[:, 0], x[:, 1], c=y, edgecolors='k', s=50, cmap=cm_dark)  # 样本

plt.scatter(x_test[:, 0], x_test[:, 1], s=120, facecolors='none', zorder=10)  # 圈中测试集样本

plt.xlabel(u'花萼长度', fontsize=13)

plt.ylabel(u'花萼宽度', fontsize=13)

plt.xlim(x1_min, x1_max)

plt.ylim(x2_min, x2_max)

plt.title(u'鸢尾花SVM二特征分类', fontsize=15)

# plt.grid()

plt.show()

   pcolormesh(x,y,z,cmap)这里参数代入x1,x2,grid_hat,cmap=cm_light绘制的是背景。

   scatter中edgecolors是指描绘点的边缘色彩,s指描绘点的大小,cmap指点的颜色。

   xlim指图的边界。

最终结果为:

源码:

 

# -*- coding:utf-8 -*-

# -*- coding:utf-8 -*-

from sklearn import svm

import numpy as np

import matplotlib.pyplot as plt

import matplotlib as mpl

from matplotlib import colors

from sklearn.model_selection import train_test_split

def iris_type(s):

    it = {'Iris-setosa'0'Iris-versicolor'1'Iris-virginica'2}

    return it[s]

def show_accuracy(y_hat, y_test, param):

    pass

 

path = 'F:\\Test\\iris.data' # 数据文件路径

data = np.loadtxt(path, dtype=float, delimiter=',', converters={4: iris_type})

 

x, y = np.split(data, (4,), axis=1)

= x[:, :2]

x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, train_size=0.6)

 

# clf = svm.SVC(C=0.1, kernel='linear', decision_function_shape='ovr')

clf = svm.SVC(C=0.8, kernel='rbf', gamma=20, decision_function_shape='ovr')

clf.fit(x_train, y_train.ravel())

 

print clf.score(x_train, y_train)  # 精度

y_hat = clf.predict(x_train)

show_accuracy(y_hat, y_train, '训练集')

print clf.score(x_test, y_test)

y_hat = clf.predict(x_test)

show_accuracy(y_hat, y_test, '测试集')

 

print 'decision_function:\n', clf.decision_function(x_train)

print '\npredict:\n', clf.predict(x_train)

 

x1_min, x1_max = x[:, 0].min(), x[:, 0].max()  # 第0列的范围

x2_min, x2_max = x[:, 1].min(), x[:, 1].max()  # 第1列的范围

x1, x2 = np.mgrid[x1_min:x1_max:200j, x2_min:x2_max:200j]  # 生成网格采样点

grid_test = np.stack((x1.flat, x2.flat), axis=1)  # 测试点

 

 

mpl.rcParams['font.sans-serif'= [u'SimHei']

mpl.rcParams['axes.unicode_minus'= False

 

cm_light = mpl.colors.ListedColormap(['#A0FFA0''#FFA0A0''#A0A0FF'])

cm_dark = mpl.colors.ListedColormap(['g''r''b'])

 

# print 'grid_test = \n', grid_test

grid_hat = clf.predict(grid_test)       # 预测分类值

grid_hat = grid_hat.reshape(x1.shape)  # 使之与输入的形状相同

 

alpha = 0.5

plt.pcolormesh(x1, x2, grid_hat, cmap=cm_light)     # 预测值的显示

# plt.scatter(x[:, 0], x[:, 1], c=y, edgecolors='k', s=50, cmap=cm_dark)  # 样本

plt.plot(x[:, 0], x[:, 1], 'o', alpha=alpha, color='blue', markeredgecolor='k')

plt.scatter(x_test[:, 0], x_test[:, 1], s=120, facecolors='none', zorder=10)  # 圈中测试集样本

plt.xlabel(u'花萼长度', fontsize=13)

plt.ylabel(u'花萼宽度', fontsize=13)

plt.xlim(x1_min, x1_max)

plt.ylim(x2_min, x2_max)

plt.title(u'鸢尾花SVM二特征分类', fontsize=15)

# plt.grid()

plt.show()

来源:https://blog.csdn.net/yaoxy/article/details/78878446

发布了44 篇原创文章 · 获赞 130 · 访问量 137万+

Supongo que te gusta

Origin blog.csdn.net/gb4215287/article/details/105507860
Recomendado
Clasificación