2017-07-06 4 views
0

J'essaye de faire des prédictions pour l'ensemble de données d'iris. J'ai décidé d'utiliser svms à cette fin. Mais, cela me donne une précision 1.0. Est-ce un cas de surapprentissage ou est-ce parce que le modèle est très bon? Voici mon code.Support vector machine overfitting mes données

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) 
svm_model = svm.SVC(kernel='linear', C=1,gamma='auto') 
svm_model.fit(X_train,y_train) 
predictions = svm_model.predict(X_test) 
accuracy_score(predictions, y_test) 

Ici, precision_score renvoie la valeur 1. Veuillez m'aider. Je suis un débutant en apprentissage automatique.

+1

Essayez d'utiliser la validation croisée à l'aide de cross_val_score. Vous pouvez utiliser laisser une validation croisée pour voir si les changements de précision – sera

+0

S'il vous plaît voir l'exemple que je viens de poster. C'est le même code mais en utilisant la validation croisée cette fois. J'espère que cela t'aides – sera

Répondre

1

Vous pouvez cross validation:

Exemple:

from sklearn.model_selection import LeaveOneOut 
from sklearn import datasets 
from sklearn.svm import SVC 
from sklearn.model_selection import cross_val_score 

#load iris data 
iris = datasets.load_iris() 
X = iris.data 
Y = iris.target 

#build the model 
svm_model = SVC(kernel ='linear', C = 1, gamma = 'auto',random_state = 0) 

#create the Cross validation object 
loo = LeaveOneOut() 

#calculate cross validated (leave one out) accuracy score 
scores = cross_val_score(svm_model, X,Y, cv = loo, scoring='accuracy') 

print(scores.mean()) 

Résultat (la précision moyenne des 150 plis puisque nous avons utilisé leave-one-out):

0.97999999999999998 

ligne de fond :

La validation croisée (en particulier LeaveOneOut) est un bon moyen pour éviter le surapprentissage et obtenir des résultats robustes.

2

Le jeu de données iris n'est pas particulièrement difficile d'où obtenir de bons résultats. Cependant, vous avez raison de ne pas faire confiance à un modèle de précision de classification à 100%. Dans votre exemple, le problème est que les 30 points de test sont tous correctement classés. Mais cela ne signifie pas que votre modèle est capable de généraliser pour toutes les nouvelles instances de données. Essayez simplement de changer le test_size à 0.3 et les résultats ne sont plus 100% (il descend à 97.78%).

La meilleure façon de garantir la robustesse et d'éviter le surapprentissage est d'utiliser la validation croisée. Un exemple sur la façon de le faire facilement à partir de votre exemple:

from sklearn import datasets 
from sklearn import svm 
from sklearn.model_selection import train_test_split 
from sklearn.model_selection import cross_val_score 


iris = datasets.load_iris() 
X = iris.data[:, :4] 
y = iris.target 

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

svm_model = svm.SVC(kernel='linear', C=1, gamma='auto') 
scores = cross_val_score(svm_model, iris.data, iris.target, cv=10) #10 fold cross validation 

Ici cross_val_score utilise différentes parties de l'ensemble de données sous forme de données de test itérativement (validation croisée) tout en conservant tous vos paramètres précédents. Si vous vérifiez score, vous verrez que les 10 exactitudes calculées maintenant vont de 87,87% à 100%. Pour signaler la performance finale du modèle, vous pouvez par exemple utiliser la moyenne des valeurs notées.

Espérons que cela aide et bonne chance! :)