Поставленная модель не является оценкой кластеризации в YellowBrick - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь визуализировать коленчатый график для моих данных, используя класс алгоритма YellowBrick's KElbowVisualizer и SKLearn's Expectation Maximization: GaussianMixture.

При запуске я получаю ошибку в заголовке. (Я также попробовал ClassificationReport, но это тоже не помогло)

model = GaussianMixture()

data = get_data(data_name, preprocessor_name, train_split=0.75)
X, y, x_test, y_test = data

visualizer = KElbowVisualizer(model, k=(4,12))
visualizer.fit(X)        # Fit the data to the visualizer
visualizer.show()        # Finalize and render the figure

Я не могу найти ничего в YellowBrick, чтобы помочь мне оценить количество компонентов для максимизации ожидания.

Ответы [ 2 ]

8 голосов
/ 09 ноября 2019

Yellowbrick использует проверки типа оценки склеарна , чтобы определить, подходит ли модель для визуализации. Вы можете использовать force_model param , чтобы обойти проверку типов (хотя кажется, что документация KElbow должна обновляться с этим).

Однако, даже если force_model=Trueпроходит через YellowbrickTypeError, но это не значит, что GaussianMixture работает с KElbow. Это связано с тем, что локтевой визуализатор настроен для работы с API центроидальной кластеризации и требует как n_clusters гиперпарам, так и labels_ обученный параметр. Модели максимизации ожиданий не поддерживают этот API.

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

from sklearn.base import ClusterMixin
from sklearn.mixture import GaussianMixture
from yellowbrick.cluster import KElbow
from yellowbrick.datasets import load_nfl

class GMClusters(GaussianMixture, ClusterMixin):

    def __init__(self, n_clusters=1, **kwargs):
        kwargs["n_components"] = n_clusters
        super(GMClusters, self).__init__(**kwargs)

    def fit(self, X):
        super(GMClusters, self).fit(X)
        self.labels_ = self.predict(X)
        return self 


X, _ = load_nfl()
oz = KElbow(GMClusters(), k=(4,12), force_model=True)
oz.fit(X)
oz.show()

Это действительно дает график KElbow (хотя и не очень хороший для этого конкретного набора данных):

KElbow with distortion score

Другой ответупоминал баллы Calinksi Harabasz, которые можно использовать в визуализаторе KElbow следующим образом:

oz = KElbow(GMClusters(), k=(4,12), metric='calinski_harabasz', force_model=True)
oz.fit(X)
oz.show()

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

1 голос
/ 01 ноября 2019

Вы можете использовать sklearn calinski_harabasz_score - см. Соответствующие документы здесь .

scores = pd.DataFrame()
components = 100
for n in range(2,components):
    model = GaussianMixture(n_components=n)
    y = model.fit_predict(X)
    scores.loc[n,'score'] = calinski_harabasz_score(X,y)
plt.plot(scores.reset_index()['index'],scores['score'])

Что-то подобное должно дать аналогичную функциональность.

...