Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Erro ao calcular o coeficiente de silhueta do MeanShift

Boa noite, estou seguindo da mesma forma que o instrutor, até copiei o código que foi prescrito porém ainda continuo recebendo erro ao executar a célula.

Segue o código:

valores_silhueta = []
quantil_plot = []
for quantil in faixa_quantil:
    bandwidth = estimate_bandwidth(dataframe, quantile = quantil)
    agrupador = MeanShift(bandwidth = bandwidth)
    labels = agrupador.fit_predict(dataframe)
    if(len(np.unique(labels)) < len(dataframe) and len(np.unique((labels)) > 1)):
        media_silhueta = silhouette_score(dataframe, labels)
        valores_silhueta.append(media_silhueta)
        quantil_plot.append(quantil)

Erro:

ValueError                                Traceback (most recent call last)
<ipython-input-103-22fe51fc511d> in <module>()
      6     labels = agrupador.fit_predict(dataframe)
      7     if(len(np.unique(labels)) < len(dataframe) and len(np.unique((labels)) > 1)):
----> 8         media_silhueta = silhouette_score(dataframe, labels)
      9         valores_silhueta.append(media_silhueta)
     10         quantil_plot.append(quantil)

2 frames
/usr/local/lib/python3.7/dist-packages/sklearn/metrics/cluster/_unsupervised.py in check_number_of_labels(n_labels, n_samples)
     33         raise ValueError(
     34             "Number of labels is %d. Valid values are 2 to n_samples - 1 (inclusive)"
---> 35             % n_labels
     36         )
     37 

ValueError: Number of labels is 1. Valid values are 2 to n_samples - 1 (inclusive)

Alguém consegue me ajudar com isso? Obrigado

2 respostas
solução!

Olá, João! Tudo tranquilo com você?

Esse erro está acontecendo pois os parâmetros passados para o if estão sendo utilizados de forma a gerar esse comportamento. Fui na transcrição verificar isso e realmente a transcrição está diferente do código apresentado em aula.

O erro está nessa parte aqui:

if(len(np.unique(labels)) < len(dataframe) and len(np.unique((labels)) > 1)):

O "> 1" está inserido no último len, sendo que deveria ser passado fora, pois da forma como está nesse if você estaria comparando o número de valores únicos serem maior que 1 ou não, e fazendo um len disso.

Para consertar isso, basta refatorar esse if da seguinte forma:

valores_silhueta = []
quantil_plot = []

for quantil in faixa_quantil:
    bandwidth = estimate_bandwidth(df, quantile = quantil)
    agrupador = MeanShift(bandwidth = bandwidth) 
    labels = agrupador.fit_predict(df)

    if (len(np.unique(labels)) < len(df) and len(np.unique(labels)) > 1):
            media_silhueta = silhouette_score(df, labels)
            valores_silhueta.append(media_silhueta)
            quantil_plot.append(quantil)

Consertamos também esse código na transcrição do vídeo, agradecemos muito por ter levantado esse ponto.

Espero ter ajudado, mas se ainda persistir alguma dúvida estou sempre à disposição.

:)

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!

Muito obrigado pela ajuda Bruno, realmente o problema era no if como você mencionou, só algo a se atentar é que no código que você publicou acima o if está fora da estrutura for, mas na verdade precisa ficar dentro. Mas tirando esse ponto tudo funcionou corretamente, obrigado novamente.