Sto usando Python sklearn (versione 0.17) per selezionare il modello ideale su un set di dati. Per fare questo, ho seguito questi passi:python sklearn: qual è la differenza tra il punteggio accuracy_score e learning_curve?
- dividere il set di dati utilizzando
cross_validation.train_test_split
contest_size = 0.2
. - Utilizzare
GridSearchCV
per selezionare il classificatore ideale k-closest-neighbors sul set di allenamento. - Passare il classificatore restituito da
GridSearchCV
aplot_learning_curve
.plot_learning_curve
ha dato la trama mostrata di seguito. - Eseguire il classificatore restituito da
GridSearchCV
sul set di prova ottenuto.
Dalla trama, possiamo vedere che il punteggio per il max. la dimensione dell'allenamento è di circa 0,43. Questo punteggio è il punteggio restituito dalla funzione sklearn.learning_curve.learning_curve
.
Ma quando ho eseguito il meglio classificatore sul set di test ottengo un punteggio di accuratezza di 0,61, come restituito da sklearn.metrics.accuracy_score
(previsto correttamente le etichette/numero di etichette)
Link a immagine:
Questo è il codice che sto usando. Non ho incluso la funzione plot_learning_curve
in quanto richiederebbe molto spazio. Ho preso il plot_learning_curve
da here
import pandas as pd
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report
from matplotlib import pyplot as plt
import sys
from sklearn import cross_validation
from sklearn.learning_curve import learning_curve
from sklearn.grid_search import GridSearchCV
from sklearn.cross_validation import train_test_split
filename = sys.argv[1]
data = np.loadtxt(fname = filename, delimiter = ',')
X = data[:, 0:-1]
y = data[:, -1] # last column is the label column
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2)
params = {'n_neighbors': [2, 3, 5, 7, 10, 20, 30, 40, 50],
'weights': ['uniform', 'distance']}
clf = GridSearchCV(KNeighborsClassifier(), param_grid=params)
clf.fit(X_train, y_train)
y_true, y_pred = y_test, clf.predict(X_test)
acc = accuracy_score(y_pred, y_test)
print 'accuracy on test set =', acc
print clf.best_params_
for params, mean_score, scores in clf.grid_scores_:
print "%0.3f (+/-%0.03f) for %r" % (
mean_score, scores.std()/2, params)
y_true, y_pred = y_test, clf.predict(X_test)
#pred = clf.predict(np.array(features_test))
acc = accuracy_score(y_pred, y_test)
print classification_report(y_true, y_pred)
print 'accuracy last =', acc
print
plot_learning_curve(clf, "KNeighborsClassifier",
X, y,
train_sizes=np.linspace(.05, 1.0, 5))
è normale? Posso capire che potrebbe esserci qualche differenza nei punteggi, ma questa è una differenza di 0,18, che quando convertita in percentuali è del 43% contro il 61%. Anche il rapporto_del_registrazione fornisce un richiamo medio di 0,61.
Sto facendo qualcosa di sbagliato? C'è una differenza nel modo in cui learning_curve
calcola i punteggi? Ho anche provato a passare la funzione scoring='accuracy'
a learning_curve
per vedere se corrisponde al punteggio di precisione, ma non ha fatto alcuna differenza.
Qualsiasi consiglio sarebbe di grande aiuto.
Sto utilizzando la qualità del vino (bianco) data set from UCI e ho rimosso anche l'intestazione prima di eseguire il codice.
Dov'è il tuo codice per plot_learning_curve()? Sembra che sia qui che l'incoerenza è. I punteggi di accuratezza della convalida incrociata di GridSearchCV sono ragionevolmente vicini all'accuratezza calcolata sul set di test. – SPKoder
@SPKoder Immagino che abbia usato la funzione dal sito web di sklearn: http://scikit-learn.org/stable/auto_examples/model_selection/plot_learning_curve.html#example-model-selection-plot-learning-curve-py. A proposito, ho fatto diversi test e sono abbastanza sicuro di aver trovato una spiegazione, puoi verificarlo e ricontrollare la mia ipotesi –