Classificazione delle Vocali in Python

Table of Contents

Un modo interessante di testare i dati fonetici raccolti è quello di sottoporli a vari classifiers (algoritmi di classificazione) per vedere quali algoritmi possano essere i più accurati e se i dati sono sufficienti ad avere classificatori affidabili.

Librerie

per prima cosa importiamo le classi necessarie dalla libreria di Scikit Learn oltre che Pandas e Numpy.

from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC

Import e slicing dei dati

Importiamo i nostri dati e prendiamo solo le colonne e righe che servono.

vowelsform = pd.read_csv('informants.csv')

X = vowelsform.loc[:, 'F1':'F2']
y = vowelsform.loc[:, 'vowel_id']

Adesso è ora di dividere il dataframe nei gruppi di train e test. Solitamente è consigliabile usare il 20% dei dati come test ed il restante 80% come train.

X_train, X_test, y_train, y_test = train_test_split(X,y, random_state = 0)

Test

Adesso applichiamo gli algoritmi. Il primo è il KNN (k-nearest neighbor), questo algoritmo osserva il numero n di elementi più vicini ad un punto ed il loro gruppo per poter poi classificare il punto. In questo caso l'algoritmo deciderà a che vocale il punto appartiene basandosi sulle 7 vocali più vicine.

knn = KNeighborsClassifier(n_neighbors = 7)

knn.fit(X_train, y_train)
gauss = GaussianNB()

gauss.fit(X,y)
vec = SVC(gamma=0.0001, C=100)

vec.fit(X,y)

Risultati a confronto

Adesso vediamo quale è il livello di accuratezza di ognuno dei tre algoritmi usando il gruppo test contro train. Dopo di ciò proveremo a vedere come quale vocale viene classificato il dato inserito manualmente.

print('SVM: \t \t', vec.score(X_test,y_test))

print('KNN: \t \t', knn.score(X_test,y_test))

print('Gaussian: \t', gauss.score(X_test,y_test))


vowelpred = vec.predict([[626.891, 1820.1]])

print('SVM: \t \t', vowelpred)


vowelpred = knn.predict([[626.891, 1820.1]])

print('KNN: \t \t', vowelpred)


vowelpred = gauss.predict([[626.891, 1820.1]])

print('Gaussian: \t', vowelpred)

Il risultato:

SVM:             ['E']
KNN:             ['E']
Gaussian:        ['e']
SVM:             0.852713178295
KNN:             0.53488372093
Gaussian:        0.581395348837

in questo caso SVM sembra dare il miglior risultato, il Gaussian è migliore del KNN ma la loro percentuale di accuratezza è comunque troppo bassa per essere considerata affidabile. Una percentuale tra l'80% e 95% è ottimale.

Date: <2018-05-20 Sun>

Author: Andrew

Other posts