Использование 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)
Метод 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-кратная проверка перекрестного предпочтения благоприятствует двум компонентам Гаусса, как мы ожидаем.
Метод 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)
Таким образом, мы можем видеть, что BIC минимизируется для двух гауссовых, так что лучшая модель в соответствии с этим способом также имеет два компонента.
Потому что я взял 10000 образцов из двух очень хорошо отделенных гауссианцев (т. Е. Расстояние между их центрами намного больше, чем любая их дисперсия), ответ был очень четким. Это не всегда так, и часто ни один из этих методов не с уверенностью скажет вам, какое число гауссовых использовать, а скорее разумный диапазон.
Могу ли я спросить, почему вы используете BIC или AIC? Вместо этого я рекомендую использовать перекрестную проверку. Кроме того, я полагаю, вы используете GridSearchCV, чтобы принять решение о количестве гауссианцев для использования? –
Да, я также использую GridSearchCV для числа гауссиан. Я нахожусь в самом начале моего анализа, и я много чего пробую, и я узнал, что BIC и AIC - два возможных способа. Я использую GaussianMixture для обнаружения аномалий, я не знаю, помогает ли это. – lapally
Я отправлю ответ, в котором подробно описывается, как с помощью GridSearchCV, а также как использовать BIC или AIC. –