Suponha que não soubéssemos quantas espécies diferentes estão presentes no dataset iris. Como poderíamos descobrir essa informação aproximadamente a partir dos dados presentes ali?
Uma solução possível seria plotar os dados em um scatterplot e tentar identificar visualmente a existência de grupos distintos. O datase Iris, no entanto, possui quatro dimensões de dados então não é possível visualizá-lo inteiramente (apenas um par de features por vez).
Para visualizar o dataset completo como um scatterplot 2D, é possível usar técnicas de redução de dimensionalidade para comprimir o dataset para duas dimensões perdendo pouca informação estrutural.
In [1]:
import pandas as pd
iris = pd.read_csv('../datasets/iris_without_classes.csv') # Carregue o arquivo 'datasets/iris_without_classes.csv'
In [2]:
# Exiba as primeiras cinco linhas usando o método head() para checar que não existe mais a coluna "Class"
iris.head()
Out[2]:
Usaremos o algoritmo PCA do scikit-learn para reduzir o número de dimenSões para dois no dataset.
In [3]:
# Use PCA's fit_transform() method to reduce the dataset size to two dimensions
from sklearn.decomposition import PCA
RANDOM_STATE=1234
pca = PCA(n_components=2, random_state=RANDOM_STATE) # Crie um objeto PCA com dois componentes
iris_2d = pca.fit_transform(iris) # Use o método fit_transform() para reduzir o dataset para duas dimensões
In [4]:
import matplotlib.pyplot as plt
%matplotlib inline
# Crie um scatterplot do dataset reduzido
plt.scatter(iris_2d[:, 0], iris_2d[:, 1])
# Exiba o gráfico
plt.show()
Quantos grupos distintos você consegue identificar?
O problem descrito anteriormente pode ser descrito como um problema de Clusterização. Clusterização permite encontrar grupos de exemplos que sejam semelhantes a outros exemplos no mesmo grupo mas diferentes de exemplos pertencentes a outros grupos.
Neste exemplo, usaremos o algoritmo KMeans do scikit-learn para encontrar cluster no dataset.
Uma limitação do KMeans é que ele precisa receber o número esperado de clusters como argumento, então é necessário que se tenha algum conhecimento daquele domínio para chutar um número razoável de grupos ou pode-se testar diferentes números de clusters e ver qual deles apresenta o melhor resultado.
In [5]:
# Crie dois modelos KMeans: um com dois clusters e outro com três clusters
# Armazene os identificadores previstos pelos modelos usando dois e três clusters
from sklearn.cluster import KMeans
model2 = KMeans(n_clusters=2, random_state=RANDOM_STATE).fit(iris) # Crie um objeto KMeans que espere dois clusters
labels2 = model2.predict(iris) # Infira o identificador de cluster de cada exemplo no dataset usando predict()
model3 = KMeans(n_clusters=3, random_state=RANDOM_STATE).fit(iris) # Crie um objeto KMeans que espere três clusters
labels3 = model3.predict(iris) # Infira o identificador de cluster de cada exemplo no dataset usando predict()
In [6]:
# Crie um scatterplot usando o dataset reduzido colorindo cada ponto de acordo com o cluster
# ao qual ele pertence segundo o KMeans de dois clusters
plt.scatter(iris_2d[labels2 == 0, 0], iris_2d[labels2 == 0, 1], color='red')
plt.scatter(iris_2d[labels2 == 1, 0], iris_2d[labels2 == 1, 1], color='blue')
# Exiba o scatterplot
plt.show()
In [7]:
# Crie um scatterplot usando o dataset reduzido colorindo cada ponto de acordo com o cluster
# ao qual ele pertence segundo o KMeans de três clusters
plt.scatter(iris_2d[labels3 == 0, 0], iris_2d[labels3 == 0, 1], color='red')
plt.scatter(iris_2d[labels3 == 1, 0], iris_2d[labels3 == 1, 1], color='blue')
plt.scatter(iris_2d[labels3 == 2, 0], iris_2d[labels3 == 2, 1], color='green')
# Exiba o scatterplot
plt.show()
Existem técnicas como Análise de Silhueta para inferir automaticamente o número ótimo de clusters em um dataset. Este link ilustra com um exemplo como essa técnica pode ser implementada usando o scikit-learn.