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 |
|
Siguiente lectura en los datos, convertidores = {4: iris_type} "4" se refiere a la quinta columna:
1 2 |
|
Leer resultados:
(2) Divida Iris en conjunto de entrenamiento y conjunto de prueba
1 2 3 |
|
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 |
|
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 |
|
El resultado es:
Si desea ver la función de decisión, puede usar decision_function ()
1 2 |
|
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 |
|
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 |
|
3. Draw
1 2 3 4 4 5 5 6 6 7 7 8 9 9 10 11 12 |
|
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
=
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()