Обнаружение выбросов с использованием гауссовой смеси
У меня есть 5000 точек данных для каждой из моих 17 функций в массиве numpy, в результате чего получается массив 5000 x 17. Я пытаюсь найти выбросы для каждой функции, используя гауссову смесь, и я довольно запутался в следующем: 1) сколько компонентов я должен использовать для своей GaussiasnMixture? 2) Должен ли я разместить GaussianMixture непосредственно на массиве 5000 x 17 или на каждом столбце объектов, чтобы получить 17 моделей GaussianMixture?
clf = mixture.GaussianMixture(n_components=1, covariance_type='full')
clf.fit(full_feature_array)
или же
clf = mixture.GaussianMixture(n_components=17, covariance_type='full')
clf.fit(full_feature_array)
или же
for feature in range(0, full_feature_matrix):
clf[feature] = mixture.GaussianMixture(n_components=1, covariance_type='full')
clf.fit(full_feature_array[:,feature)
2 ответа
Задача выбора количества компонентов для моделирования распределения с помощью гауссовой модели смеси является примером выбора модели. Это не так просто и существует много подходов. Хорошее резюме можно найти здесь https://en.m.wikipedia.org/wiki/Model_selection. Одним из самых простых и широко используемых является перекрестная проверка.
Обычно выбросы могут быть определены как принадлежащие компоненту или компонентам с наибольшей дисперсией. Вы бы назвали эту стратегию неконтролируемым подходом, однако все еще может быть трудно решить, какой должна быть дисперсия отсечки. Лучшим подходом (если применимо) является контролируемый подход, при котором вы будете обучать GMM с помощью данных без выбросов (путем удаления выбросов вручную). Затем вы используете это, чтобы классифицировать выбросы как те, которые имеют особенно низкий уровень вероятности. Второй способ сделать это с помощью контролируемого подхода - это подготовить два GMM (один для выбросов и один для выбросов с использованием выбора модели), а затем выполнить двухклассовую классификацию для новых данных. Относительно вашего вопроса об обучении одномерных и многомерных GMM - трудно сказать, но для целей выявления выбросов одномерные GMM (или эквивалентно многомерные GMM с диагональными ковариационными матрицами) могут быть достаточными и потребовать обучения меньшего количества параметров по сравнению с общими многомерными GMM, поэтому я бы хотел начать с этого.
Используя модель гауссовой смеси (GMM), любую точку, расположенную в области с низкой плотностью, можно считать выбросом. Возможно, проблема заключается в том, как определить область с низкой плотностью. Например, вы можете сказать, что плотность ниже четвертого квантиля является выбросом.
densities = gm.score_samples(X)
density_threshold = np.percentile(densities, 4)
anomalies = X[densities < density_threshold]
Что касается выбора количества компонентов - посмотрите на «информационный критерий», предоставляемый AIC или BIC с учетом разного количества компонентов - в таких случаях они часто соглашаются. Самый низкий лучше.
gm.bic(x)
gm.aic(x)
в качестве альтернативы,
from sklearn.mixture import BayesianGaussianMixture
bgm = BayesianGaussianMixture(n_components=8, n_init=10) # n_components should be large enough
bgm.fit(X)
np.round(bgm.weights_, 2)
выход
array([0.5 , 0.3, 0.2 , 0. , 0. , 0. , 0. , 0. ])
Итак, байесовский gmm обнаружил, что есть три кластера.