2016-10-07 2 views
1

Я хотел бы использовать функцию GaussianMixture scikit-learn, и мне нужно выполнить выбор модели. Я хочу сделать это с помощью GridSearchCV, и я бы хотел использовать для выбора BIC и AIC. Оба эти значения реализуются в GaussianMixture(), но я не знаю, как вставить их в определение моего пользовательского бомбардира, так как функцияВыбор модели для GaussianMixture с помощью GridSearch

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

, который я использую, чтобы создать мой пользовательский маркер принимает в качестве введите функцию score_funct, которая должна быть определена как

score_func(y, y_pred, **kwargs) 

Может кто-нибудь мне помочь?

+0

Могу ли я спросить, почему вы используете BIC или AIC? Вместо этого я рекомендую использовать перекрестную проверку. Кроме того, я полагаю, вы используете GridSearchCV, чтобы принять решение о количестве гауссианцев для использования? –

+0

Да, я также использую GridSearchCV для числа гауссиан. Я нахожусь в самом начале моего анализа, и я много чего пробую, и я узнал, что BIC и AIC - два возможных способа. Я использую GaussianMixture для обнаружения аномалий, я не знаю, помогает ли это. – lapally

+0

Я отправлю ответ, в котором подробно описывается, как с помощью GridSearchCV, а также как использовать BIC или AIC. –

ответ

0

Использование BIC/AIC является альтернативой для использования перекрестной проверки. GridSearchCV выбирает модели с использованием перекрестной проверки. Чтобы выполнить выбор модели с помощью BIC/AIC, мы должны сделать что-то немного другое. Возьмем пример, где мы создаем образцы из двух гауссиан, а затем пытаемся их подгонять, используя 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

Метод 1: Перекрестная проверка

Cross validation включает расщепление данных на куски. Затем он подходит для модели на некоторых частях («обучение») и проверяет, насколько хорошо он работает на оставшихся частях («проверка»). Это защищает от чрезмерной установки. Здесь мы будем использовать двукратную перекрестную проверку, где мы разделим данные пополам.

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']) 

Мы можем видеть, что 2-кратная проверка перекрестного предпочтения благоприятствует двум компонентам Гаусса, как мы ожидаем.

enter image description here

Метод 2: BIC/AIC

Вместо использования кросс-проверки, мы можем оценить BIC используя наиболее подходящую модель данное каждое число гауссианов. Затем мы выбираем модель с самым низким BIC. Процедура была бы идентичной, если бы использовалась AIC (хотя она отличается статистикой и может давать разные ответы: но ваша структура кода будет идентична ниже).

bic = np.zeros(4) 
n = np.arange(1,5) 
models = [] 
#loop through each number of Gaussians and compute the BIC, and save the model 
for i,j in enumerate(n): 
    #create mixture model with j components 
    gmm = GaussianMixture(n_components=j) 
    #fit it to the data 
    gmm.fit(X) 
    #compute the BIC for this model 
    bic[i] = gmm.bic(X) 
    #add the best-fit model with j components to the list of models 
    models.append(gmm) 

После выполнения этой процедуры мы можем построить число гауссианцев против BIC.

plt.plot(n,bic) 

enter image description here

Таким образом, мы можем видеть, что BIC минимизируется для двух гауссовых, так что лучшая модель в соответствии с этим способом также имеет два компонента.

Потому что я взял 10000 образцов из двух очень хорошо отделенных гауссианцев (т. Е. Расстояние между их центрами намного больше, чем любая их дисперсия), ответ был очень четким. Это не всегда так, и часто ни один из этих методов не с уверенностью скажет вам, какое число гауссовых использовать, а скорее разумный диапазон.

+0

благодарит за отличное объяснение. Суть в том, что можно использовать GridSearchCV для выбора модели с использованием BIC (или AIC) вместо использования цикла for. – lapally

+0

Да, но «GridSearchCV» специально разработан для перекрестной проверки. Перекрестная проверка является * альтернативой * для BIC/AIC, и поэтому использование BIC/AIC с «GridSearchCV» на самом деле не имеет смысла. Нужно использовать тот или иной. –

+0

В разделе 3.2.4.2 [этой страницы] (http://scikit-learn.org/stable/modules/grid_search.html) объясняется, что в некоторых случаях вы можете использовать критерии информации вместо перекрестной проверки, но это только кажется явно реализована для 'linear_model.LassoLarsIC', поэтому для' GaussianMixture' нужно использовать цикл 'for', как я делал выше. Я отредактировал свой ответ, чтобы сделать это все понятнее. Помогает ли это? –

Смежные вопросы