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

Erro acontece já no terceiro comando

print(generos.columns) print(modelo.cluster_centers_)

  • grupos = pd.DataFrame(modelo.cluster_centers_, columns=generos.columns)

--> ValueError: Shape of passed values is (3, 2), indices imply (3, 20)

CÓDIGO COMPLETO:

# CONHECENDO OS DADOS

import pandas as pd

uri_filmes = 'https://raw.githubusercontent.com/oyurimatheus/clusterirng/master/movies/movies.csv'
filmes = pd.read_csv(uri_filmes)

filmes.columns = ['filme_id', 'titulo', 'generos']

filmes.head()

generos = filmes.generos.str.get_dummies()

dados_dos_filmes = pd.concat([filmes, generos], axis=1)

dados_dos_filmes.head()

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()

generos_escalados = scaler.fit_transform(generos)

generos_escalados

# CLUSTERIZANDO(AGRUPANDO) OS RESULTADOS COM K-Mean

from sklearn.cluster import KMeans

modelo = KMeans(n_clusters=3)

modelo.fit(generos_escalados)

print(f'Grupos {modelo.labels_}')

# VISUALIZANDO CENTROIDES

from sklearn.datasets import make_blobs

dados, _ = make_blobs(n_samples=1000, n_features=2, random_state=7)

dados = pd.DataFrame(dados, columns=['coluna1', 'coluna2'])
dados.head()
# Exibição do Resultado ---->>>

import matplotlib.pyplot as plt
plt.scatter(x=dados.coluna1, y=dados.coluna2)
# Exibição do Resultado ---->>>

modelo = KMeans(n_clusters=3)
grupos = modelo.fit_predict(dados)

plt.scatter(x=dados.coluna1, y=dados.coluna2, c=grupos, cmap='viridis')
# Exibição do Resultado ---->>>

centroides = modelo.cluster_centers_
plt.scatter(dados.coluna1, dados.coluna2, c=grupos, cmap='viridis')

plt.scatter(centroides[:, 0], centroides[:, 1], marker='X', s=169, linewidths=5, color='g', zorder=8)
# Exibição do Resultado ---->>>

# VISUALIZANDO GRAFICO DE DISPERSÃO E REDUÇÃO DE DIMENSÃO

# Vamos começar visualizando os centróides de cada grupo. Para isso, podemos falar para o Python imprimir os centróides e os nomes dos gêneros - que são as colunas do data frame generos:
print(generos.columns)
print(modelo.cluster_centers_)

# Para facilitar o trabalho e a manipulação desses dados,
# vamos criar um data frame chamado grupos a partir dos centroides.
# Portanto, falamos para o pandas (pd) criar um DataFrame a partir dos centroides e
# nomear as colunas (columns) com o nome dos gêneros:
grupos = pd.DataFrame(modelo.cluster_centers_, columns=generos.columns)

# Podemos ver o data frame colocando a variável grupos como a última instrução da célula.
# Vamos visualizar os centroides transpondo(transpose) o data frame de grupos e pedindo para o pandas plotar(plot)
# um gráfico de barras (bar).
# Como queremos que cada cluster tenha seu próprio gráfico, vamos falar que teremos subplots e para facilitar a visualização,
# vamos definir um tamanho para a figura (figsize) e dizer que não queremos compartilhar os labels do eixo x:
grupos.transpose().plot.bar(subplots=True,
               figsize=(25, 25),
               sharex=False)

# Podemos visualizar os filmes pertencentes a algum grupo, por exemplo o grupo 0.
# Basta realizar um filtro pelos labels_ do modelo e pedir alguns dados da amostra:
grupo = 0
filtro = modelo.labels_ == grupo
dados_dos_filmes[filtro].sample(10)

# Vamos plotar um gráfico de pontos. Porém, temos 20 gêneros, ou seja, 20 dimensões.
# Logo, antes de plotar o gráfico, temos que reduzir as dimensões.
# Para isso, vamos utilizar o algoritmo TNSE do módulo manifold da sklearn.
from sklearn.manifold import TSNE

# A partir desse algoritmo podemos criar um objeto TSNE e utilizar o método fit_transform.
# Este método nos retorna um array do numpy com as features reduzidas.
tsne = TSNE()
visualizacao = tsne.fit_transform(generos_escalados)

# Agora basta importamos o seaborn e plotarmos um gráfico de dispersão (scatterplot).
# Mas antes, vamos atribuir um valor para o tamanho da figura (figure.figsize), apenas para facilitar a visualização:
import seaborn as sns
sns.set(rc={'figure.figsize': (13, 13)})
sns.scatterplot(x=visualizacao[:, 0],
               y=visualizacao[:, 1],
               hue=modelo.labels_,
               palette=sns.color_palette('Set1', 3))
2 respostas
solução!

Olá Givaldo.

Analisando o erro, percebemos que o formato passados são invalidos, passamos 20 valores para as colunas, mas temos apenas duas colunas no modelo.cluster_centers_.

grupos = pd.DataFrame(modelo.cluster_centers_, columns=generos.columns)
--> ValueError: Shape of passed values is (3, 2), indices imply (3, 20)

Voltando no código, percebemos que a causa são os dados que foram usados para treinar o modelo.

modelo = KMeans(n_clusters=3)
grupos = modelo.fit_predict(dados)

Esses dados na verdade não tem relação com os dados dos filmes e sim foram gerados pelo make_blobs.

Acredito que o trecho onde é feita a visualização dos centroides esteja no lugar errado, coloquei ele no final do código e deu tudo certo.

# VISUALIZANDO CENTROIDES
from sklearn.datasets import make_blobs

dados, _ = make_blobs(n_samples=1000, n_features=2, random_state=7)

dados = pd.DataFrame(dados, columns=['coluna1', 'coluna2'])
dados.head()
# Exibição do Resultado ---->>>

import matplotlib.pyplot as plt
plt.scatter(x=dados.coluna1, y=dados.coluna2)
# Exibição do Resultado ---->>>

modelo = KMeans(n_clusters=3)
grupos = modelo.fit_predict(dados)

plt.scatter(x=dados.coluna1, y=dados.coluna2, c=grupos, cmap='viridis')
# Exibição do Resultado ---->>>

centroides = modelo.cluster_centers_
plt.scatter(dados.coluna1, dados.coluna2, c=grupos, cmap='viridis')

plt.scatter(centroides[:, 0], centroides[:, 1], marker='X', s=169, linewidths=5, color='g', zorder=8)

Desse jeito, nosso código vai ficar assim, deixando o modelo sendo treinando pelos dados generos_escalados e então os modelo.cluster_centers_ vão ter o numero compatível com as colunas generos.columns.

# CLUSTERIZANDO(AGRUPANDO) OS RESULTADOS COM K-Mean

from sklearn.cluster import KMeans

modelo = KMeans(n_clusters=3)

modelo.fit(generos_escalados)

print(f'Grupos {modelo.labels_}')

# VISUALIZANDO GRAFICO DE DISPERSÃO E REDUÇÃO DE DIMENSÃO

# Vamos começar visualizando os centróides de cada grupo. Para isso, podemos falar para o Python imprimir os centróides e os nomes dos gêneros - que são as colunas do data frame generos:
print(generos.columns)
print(modelo.cluster_centers_)

# Para facilitar o trabalho e a manipulação desses dados,
# vamos criar um data frame chamado grupos a partir dos centroides.
# Portanto, falamos para o pandas (pd) criar um DataFrame a partir dos centroides e
# nomear as colunas (columns) com o nome dos gêneros:
grupos = pd.DataFrame(modelo.cluster_centers_, columns=generos.columns)

Bons Estudos.

Obrigado pela solução!!!