Предикат_проба не работает для моей модели гауссовой смеси (sklearn, python) - PullRequest
1 голос
/ 11 июля 2019

Запуск Python 3.7.3

Я сделал простой GMM и приспособил его к некоторым данным. При использовании методаprept_proba возвращается 1 и 0 вместо вероятностей для входных данных, принадлежащих каждому гауссиану.

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

from sklearn.mixture import GaussianMixture
import pandas as pd

feat_1 = [1,1.8,4,4.1, 2.2]
feat_2 = [1.4,.9,4,3.9, 2.3]
test_df = pd.DataFrame({'feat_1': feat_1, 'feat_2': feat_2})

gmm_test = GaussianMixture(n_components =2 ).fit(test_df)

gmm_test.predict_proba(test_df) 
gmm_test.predict_proba(np.array([[8,-1]]))

Я получаю массивы, которые имеют всего 1 и 0 или почти (10 ^ -30 или что-то в этом роде).

Если я что-то неправильно интерпретирую, возвращаемое значение должно быть вероятностью каждого, например,

gmm_test.predict_proba(np.array([[8,-1]])) 

определенно не должно быть [1,0] или [0,1].

1 Ответ

0 голосов
/ 12 июля 2019

Пример, который вы привели, дает вам странные результаты, потому что у вас есть только 5 точек данных, и все же вы используете 2 компонента смеси, что в основном вызывает переобучение.

Если вы проверите средства и ковариации ваших компонентов:

print(gmm_test.means_)
>>> [[4.05       3.95      ]
     [1.66666667 1.53333333]]

print(gmm_test.covariances_)
>>> [[[ 0.002501   -0.0025    ]
      [-0.0025      0.002501  ]]
     [[ 0.24888989  0.13777778]
      [ 0.13777778  0.33555656]]]

Из этого вы можете видеть, что первый гауссиан в основном снабжен очень маленькой ковариационной матрицей, а это означает, что, если точка не находится очень близко к ее центру (4.05,3.95), вероятность принадлежности к этому гауссову всегда будет незначительной .

Чтобы убедить вас, что, несмотря на это, ваша модель работает как положено, попробуйте следующее:

epsilon = 0.005    
print(gmm_test.predict_proba([gmm_test.means_[0]+epsilon]))
>>> array([[0.03142181, 0.96857819]])

Как только вы увеличите epsilon, он вернет вам только array([[0., 1.]]), как вы заметили.

...