2016-10-07 1 views
1

Je voudrais utiliser la fonction GaussianMixture par scikit-learn, et je dois effectuer la sélection du modèle. Je veux le faire en utilisant GridSearchCV, et je voudrais utiliser pour la sélection le BIC et l'AIC. Ces deux valeurs sont mises en œuvre dans GaussianMixture(), mais je ne sais pas comment les insérer dans la définition de mon meilleur buteur personnalisé, puisque la fonctionsélection de modèle pour GaussianMixture en utilisant GridSearch

make_scorer(score_func, greater_is_better=True, needs_proba=False, needs_threshold=False, **kwargs) 

que j'utilise pour créer mon meilleur buteur personnalisé prend comme entrer une fonction score_funct, qui doit être définie comme

Quelqu'un peut-il m'aider?

+0

Puis-je vous demander pourquoi vous utilisez le BIC ou l'AIC? Je recommanderais d'utiliser la validation croisée à la place. Aussi, je suppose que vous utilisez GridSearchCV pour décider du nombre de gaussiennes à utiliser? –

+0

Oui, j'utilise aussi GridSearchCV pour le nombre de gaussiennes. Je suis au vrai début de mon analyse et j'essaie beaucoup de choses, et j'ai découvert que BIC et AIC sont deux moyens possibles. J'utilise GaussianMixture pour la détection d'anomalies, je ne sais pas si cela aide. – lapally

+0

Je vais poster une réponse qui explique comment utiliser GridSearchCV, et comment utiliser le BIC ou l'AIC. –

Répondre

0

L'utilisation du BIC/AIC est une alternative à l'utilisation de la validation croisée. GridSearchCV sélectionne les modèles utilisant la validation croisée. Pour effectuer une sélection de modèle en utilisant le BIC/AIC, nous devons faire quelque chose d'un peu différent. Prenons un exemple où nous générons des échantillons à partir de deux gaussiennes, puis essayons de les adapter en utilisant scikit-learn.

import numpy as np 
X1 = np.random.multivariate_normal([0.,0.],[[1.,0.],[0.,1.]],10000) 
X2 = np.random.multivariate_normal([10.,10.],[[1.,0.],[0.,1.]],10000) 
X = np.vstack((X1,X2)) 
np.random.shuffle(X) 

enter image description here

Méthode 1: Validation croisée

Cross validation consiste à diviser les données en morceaux. On adapte ensuite le modèle sur certaines pièces («formation») et teste comment il fonctionne sur les pièces restantes («validation»). Cela protège contre le sur-ajustement. Ici, nous allons utiliser la validation croisée double, où nous divisons les données en deux.

from sklearn.mixture import GaussianMixture 
from sklearn.model_selection import GridSearchCV 
import matplotlib.pyplot as plt 

#check 1->4 components 
tuned_parameters = {'n_components': np.array([1,2,3,4])} 
#construct grid search object that uses 2 fold cross validation 
clf = GridSearchCV(GaussianMixture(),tuned_parameters,cv=2) 
#fit the data 
clf.fit(X) 
#plot the number of Gaussians against their rank 
plt.scatter(clf.cv_results_['param_n_components'],\ 
      clf.cv_results_['rank_test_score']) 

Nous pouvons voir que la validation croisée 2-octets favorise deux composants gaussiens, comme nous le prévoyons.

enter image description here

Méthode 2: BIC/AIC

Au lieu d'utiliser la validation croisée, nous pouvons évaluer le BIC en utilisant le modèle le mieux adapté compte tenu de chaque numéro de gaussiennes. Nous choisissons ensuite le modèle qui a le plus petit BIC. La procédure serait identique si l'on utilisait l'AIC (bien que ce soit une statistique différente, et puisse fournir des réponses différentes: mais votre structure de code serait identique à ci-dessous). Après avoir effectué cette procédure, nous pouvons tracer le nombre de gaussiennes par rapport au BIC.

plt.plot(n,bic) 

enter image description here

Ainsi, nous pouvons voir que le BIC est réduit au minimum pour deux gaussiennes, de sorte que le meilleur modèle selon cette méthode a également deux composants. Parce que j'ai pris 10000 échantillons de deux gaussiennes très bien séparées (c'est-à-dire que la distance entre leurs centres est beaucoup plus grande que l'une ou l'autre de leurs dispersions), la réponse était très nette. Ce n'est pas toujours le cas, et souvent aucune de ces méthodes ne vous dira avec certitude quel nombre de gaussiennes utiliser, mais plutôt une certaine fourchette raisonnable.

+0

merci beaucoup pour l'excellente explication. Il était maintenant possible d'utiliser GridSearchCV pour sélectionner le modèle en utilisant BIC (ou AIC), au lieu d'utiliser le cycle for. – lapally

+0

Oui, mais 'GridSearchCV' est spécialement conçu pour la validation croisée. La validation croisée est une * alternative * au BIC/AIC, et donc l'utilisation du BIC/AIC avec 'GridSearchCV' n'a pas vraiment de sens. On devrait utiliser l'un ou l'autre. –

+0

La section 3.2.4.2 de [cette page] (http://scikit-learn.org/stable/modules/grid_search.html) explique que vous pouvez utiliser des critères d'information plutôt que la validation croisée dans certains cas, mais cela ne semble être que explicitement implémenté pour 'linear_model.LassoLarsIC', donc il faut utiliser une boucle' for' pour 'GaussianMixture' comme je l'ai fait ci-dessus. J'ai édité ma réponse pour rendre cela un peu plus clair. est-ce que cela aide? –