2014-07-22 3 views
1

J'essaie d'évaluer un ensemble de données multivariables en effectuant une validation croisée avec un seul interlocuteur, puis en supprimant les échantillons non prédictifs de l'ensemble de données original (corrigé par Benjamini, FDR > 10%).Validation croisée par un seul utilisateur

En utilisant le docs on cross-validation, j'ai trouvé l'itérateur leave-one-out. Cependant, en essayant d'obtenir le score pour le nième pli, une exception est soulevée disant que plus d'un échantillon est nécessaire. Pourquoi le .predict() fonctionne-t-il alors que .score() ne fonctionne pas? Comment puis-je obtenir le score pour un seul échantillon? Dois-je utiliser une autre approche?

Code Unsuccessful:

from sklearn import ensemble, cross_validation, datasets 

dataset = datasets.load_linnerud() 
x, y = dataset.data, dataset.target 
clf = ensemble.RandomForestRegressor(n_estimators=500) 

loo = cross_validation.LeaveOneOut(x.shape[0]) 
for train_i, test_i in loo: 
    score = clf.fit(x[train_i], y[train_i]).score(x[test_i], y[test_i]) 
    print('Sample %d score: %f' % (test_i[0], score)) 

exception Résultant:

ValueError: r2_score can only be computed given more than one sample. 


[EDIT, pour clarifier]:

Je ne demande pas pourquoi ce n » t travail, mais pour un différent approche ent qui fait. Après l'ajustement/l'entraînement de mon modèle, comment puis-je tester la qualité d'un échantillon unique adapté au modèle entraîné?

Répondre

1

cross_validation.LeaveOneOut(x.shape[0]) crée autant de plis que le nombre de lignes. Cela entraîne que chaque exécution de validation n'obtient qu'une seule instance. Maintenant, pour dessiner une "ligne", vous avez besoin de deux points, alors qu'avec votre instance, vous n'avez qu'un seul point. C'est ce que votre message d'erreur dit, qu'il faut plus d'une instance (ou échantillon) pour dessiner la "ligne" qui sera utilisée pour calculer la valeur de r^2.

Généralement, dans le monde ML, les gens rapportent 10 fois ou 5 fois le résultat de la validation croisée. Donc, je recommanderais de régler le n à 10 ou 5, en conséquence. Edit: Après une discussion rapide avec @banana, nous avons réalisé que la question n'avait pas été comprise correctement au début. Comme il n'est pas possible d'obtenir le score R2 pour un seul point de données, une alternative consiste à calculer la distance entre les points réels et prévus. Cela peut être fait en utilisant numpy.linalg.norm(clf.predict(x[test_i])[0] - y[test_i])

+0

Bien que cela soit vrai, il ne répond pas à ma question. "J'essaie d'évaluer un ensemble de données multivariable par validation croisée" leave-one-out ", puis de supprimer les échantillons qui ne sont pas prédictifs de l'ensemble de données original, comment puis-je obtenir le score pour un seul échantillon?" Veuillez lire la question plus attentivement. – Banana

+0

D'accord, votre question a juste changé. La réponse explique pourquoi vous avez besoin de deux points de données pour obtenir un score, basé sur l'approximation d'une ligne (ou d'une courbe), puis sur la distance du point de données réel à partir de cette ligne/courbe. Vous avez besoin de deux points pour générer une ligne. Predict, d'un autre côté, est le long d'une seule dimension, soit vous avez raison, soit vous êtes incorrect. C'est pourquoi il n'a besoin que d'un point de données. –

+0

Cela pourrait aider à expliquer les valeurs r2 - http://www.graphpad.com/guides/prism/6/curve-fitting/index.htm?reg_diagnostics_tab_7_2.htm –

Questions connexes