En este post veremos un ejemplo realista de SVM en problemas de clasificación. Vamos a utilizar el conjunto de datos del Pima Indian Diabetes Dataset. Recordemos que la sigla SVM significa Support Vector Machines y se traduce como máquinas de vectores soporte.
Ejemplo realista de SVM
#Ejemplo realista de SVM
#cargamos datos
data = pd.read_csv ("./data/diabetes.csv", sep = ' , ', decimal = ' , ')
#preparamos los datos
features = data.columns.drop (['Outcome'])
X = data [features).values
y = data ['Outcome'].values
print ('Dimensionalidad datos: ', X.shape)
Dimensionalidad datos: (768, 8)
Lo que haremos es ajustar un modelo de SVM al conjunto de datos anterior. Devolveremos las prestaciones en el conjunto de test y compararemos con la solución de Boosted Trees.
Nota: Best Test ACC (lo esperado) = 0.794
#Ejemplo realista de SVM
#paso 1
X_train, X_test, y_train, y_test = train_test_split (x, y, test_size = 0.3, shuffle = True, stratify = y, random_state = 0)
print ('Dimensionalidad train: ', X_train.shape)
print ("Dimensionalidad test: ', X_test.shape)
Dimensionalidad train: (537, 8)
Dimensionalidad test: (231, 8)
#Ejemplo realista de SVM
#Paso 2
vectorC = np.logspace (-3, 3, 21)
vectorG= np.logspace (-5, 1, 21)
param_grid = {'C': vectorC, 'gamma' : vectorG)
grid = GridSearchCV (SVC (kernel = 'rbf'), scoring = 'accuracy', param_grid = param_grid, cv = 5, verbose = 2).fit (x_train, y_train)
print ("best mean cross-validation score: {: .3f}".format (grid.best_score_))
print ("best parameters: {}.format (grid.best_params_)) print (f"Log(C): (math.log10 (grid.best_params_['C'])} \nLog (gamma): {math.log10 (grid.best_params_ ['gamma'])}")
#Mostramos prestaciones en CV
scores = grid.cv_results_ ['mean_test_score'].reshape (len (vectorC), len (vectorG))
plt.figure (figsize = (10, 6))
plt.imshow (scores, interpolation = 'nearest', vmin = 0.6, vmax = 0.9)
plt.xlabel ('log (gamma)')
plt.ylabel ('log (C)')
plt.colorbar ()
plt.xticks (np.arange (len (vectorG)), np.log10 (vectorG), rotation = 90)
plt.yticks (np.arange (len (vectorC)), np.log10 (vector))
plt.title ('5 - fold accuracy')
plt.show ()
Lo primero que vemos en los resultados es que el cross – validation score ha dado 0.76, lo que quiere decir que más o menos coincide con el esperado, que era 0.79.
Nos impide ver bien qué es lo que está pasando. Es decir, este barrido no es el óptimo para este ejercicio, ya que no podemos saber cuál es el mejor valor.
Lo que haremos, por tanto, es disminuir el vmax = 0.8. El resultado será:
Vemos que en el sector derecho no hay nada, aparentemente, y que en el sector izquierdo es donde es probable que se encuentre el mejor accuracy. ¿Qué haríamos en este caso?
Lo que podemos hacer es modificar el vector C y el vector G, por lo que quedaría:
#Ejemplo realista de SVM
vectorC = np.logspace (-1, 6, 21)
vectorG= np.logspace (-10, 2, 21)
El resultado sería:
No ha quedado nada mal, ha mejorado bastante respecto al anterior.
Con esto corroboramos que el mejor accuracy se encuentra en este rango de valores. En la realidad, no nos quedaríamos con este modelo, sino que lo volveríamos mucho más complejo, aumentándole el valor de C, y seguiríamos bajando a ver qué pasa.
Si el mejor accuracy sigue dándonos en el rango inicial, es decir, si hay algún punto en el que mejora, pero solo un poco, nos quedaríamos con el modelo más simple, a no ser que veamos que las prestaciones nos están subiendo en cantidades grandes.
#Ejemplo realista de SVM
#Paso 3
Copt = grid.best_params_ ['C']
Gopt = grid.best_params_ ['gamma']
svmModel = SVC (kernel = 'rbf', gamma = Gopt, C = Copt).fit (X_train, y_train)
print ('Acc (TEST): %0.2f'% svmModel.score (X_test, y_test))
Acc (TEST): 0.77
Si quieres seguir entendiendo la disciplina del Big Data y mejorar tus oportunidades laborales, tenemos para ti el Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, una formación de alta intensidad en la que tendrás la oportunidad de adquirir los conocimientos suficientes para incursionar en el mercado de la tecnología. ¡No esperes más para seguir forjando tu camino y solicita más información ahora!