2
respostas

Não há vídeo com o coeficiente de silhueta do DBSCAN

Só há vídeos onde são calculados o coeficiente de silhueta para o KMeans e para o MeanShift, mas não para o DBSCAN. No entanto, nesta aula o professor já começa colocando valores arbitrários para o eps e para o min_samples que não havíamos calculado antes. Está faltando informação no curso? Como fazemos para calcular o coeficiente de silhueta para o método DBSCAN?

Obrigado!

2 respostas

Oi Pedro! Tudo bem com você?

No curso o instrutor define mesmo parâmetros diferentes dos que ele definiu nas aulas anteriores mas isso normalmente acontece porque o instrutor antes de gravar as aulas testa os melhores resultados por parâmetro, mesmo assim concordo que seria interessante ter tido a explicação do porquê dos novos valores nos parâmetros de DBSCAN.

Já o calculo do coeficiente de silhueta para o DBSCAN se dá da mesma forma que os demais métodos, ou seja, chamando a métrica silhouette_score e definindo os dados e o label, mas, no caso do DBSCAN, definimos o label desse método:

ag_dbscan = DBSCAN(eps = 2.1, min_samples=56,metric='manhattan')
labels_dbscan = ag_dbscan.fit_predict(df)

print('Silhouette DBSCAN: ',silhouette_score(df,labels_dbscan))

Na documentação do Scikit-learn podemos ver mais alguns exemplos, inclusive existe um exemplo do DBSCAN utilizando o Silhouette para avaliar o desempenho, infelizmente a documentação no site do Scikit é em inglês, mas você pode usar o método de tradução instantânea do seu navegador caso tenha dificuldade com essa língua.

Eu espero ter te ajudado! Se a dúvida persistir, estarei à disposição.

Bons estudos!

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

Tentei criar um calculo do coeficiente de silhueta para o DBSCAN. Como esse algoritmo tem 3 parâmetros resolvi deixar o parâmetro metric constante como manhattan. Segue o código que eu criei.

faixa_eps = np.linspace(0.1, 3, 15)
faixa_samples = [i for i in range(10,100,3)]

valores_silhueta_dbscan = []
for i in faixa_eps:
  for s in faixa_samples:
    agrupador_dbscan = DBSCAN(eps= i, min_samples= s, metric= 'manhattan')
    labels_dbscan = agrupador_dbscan.fit_predict(df)
    if(len(np.unique(labels_dbscan)) < len(df) and len(np.unique(labels_dbscan)) > 1):
      media_silhueta_dbscan = silhouette_score(df, labels_dbscan)
      valores_silhueta_dbscan.append(media_silhueta_dbscan)

fig = go.Figure()
fig.add_trace(go.Scatter3d(x= faixa_eps, y= faixa_samples, z= valores_silhueta_dbscan,
                           mode= 'markers', marker= dict(color = 'red'), text= labels_dbscan))
fig.update_layout(autosize=False, width=800, height=800, margin=dict(l=5, r=5, b=6, t=5))
fig.update_layout(scene = dict(
                    xaxis_title='EPS',
                    yaxis_title='Sample',
                    zaxis_title='Silhuete'))
fig.show()

O resultado foi o seguinte gráfico:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade