[ ]:
# Install hypertools (run this first on Colab)
%pip install -q "hypertools[interactive]"
Clustering with Hypertools¶
The cluster feature performs clustering analysis on the data (an array, dataframe, or list) and returns a list of cluster labels.
The default clustering model is K-Means (argument ‘KMeans’). Also supported: AffinityPropagation, AgglomerativeClustering, BayesianGaussianMixture, Birch, DBSCAN, FeatureAgglomeration, GaussianMixture, HDBSCAN, LatentDirichletAllocation, MeanShift, MiniBatchKMeans, NMF, OPTICS, and SpectralClustering. (Note that FeatureAgglomeration clusters the features – columns – rather than the observations.)
Note that, if a list is passed, the arrays will be stacked and clustering will be performed across all lists (not within each list).
Import Packages¶
[2]:
import hypertools as hyp
from collections import Counter
%matplotlib inline
Load your data¶
We will load one of the sample datasets. This dataset consists of 8,124 samples of mushrooms with various text features.
[3]:
mushrooms = hyp.load('mushrooms')
We can peek at the first few rows of the dataframe using the pandas function head()
[4]:
mushrooms.head()
[4]:
| bruises | cap-color | cap-shape | cap-surface | gill-attachment | gill-color | gill-size | gill-spacing | habitat | odor | ... | ring-type | spore-print-color | stalk-color-above-ring | stalk-color-below-ring | stalk-root | stalk-shape | stalk-surface-above-ring | stalk-surface-below-ring | veil-color | veil-type | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | t | n | x | s | f | k | n | c | u | p | ... | p | k | w | w | e | e | s | s | w | p |
| 1 | t | y | x | s | f | k | b | c | g | a | ... | p | n | w | w | c | e | s | s | w | p |
| 2 | t | w | b | s | f | n | b | c | m | l | ... | p | n | w | w | c | e | s | s | w | p |
| 3 | t | w | x | y | f | n | n | c | u | p | ... | p | k | w | w | e | e | s | s | w | p |
| 4 | f | g | x | s | f | k | b | w | g | n | ... | e | n | w | w | e | t | s | s | w | p |
5 rows × 22 columns
Obtain cluster labels¶
To obtain cluster labels, simply pass the data to hyp.cluster. Since we have not specified a desired number of clusters, the default of 3 clusters is used (labels 0, 1, and 2). Additionally, since we have not specified a desired clustering algorithm, K-Means is used by default.
[5]:
labels = hyp.cluster(mushrooms)
set(labels)
[5]:
{np.int32(0), np.int32(1), np.int32(2)}
We can further examine the number of datapoints assigned each label.
[6]:
Counter(labels)
[6]:
Counter({np.int32(2): 3269, np.int32(1): 3105, np.int32(0): 1750})
Specify number of cluster labels¶
You can also specify the number of desired clusters by setting the n_clusters argument to an integer number of clusters, as below. We can see that when we pass the int 10 to n_clusters, 10 cluster labels are assigned.
Since we have not specified a desired clustering algorithm, K-Means is used by default.
[7]:
labels_10 = hyp.cluster(mushrooms, n_clusters = 10)
set(labels_10)
[7]:
{np.int32(0),
np.int32(1),
np.int32(2),
np.int32(3),
np.int32(4),
np.int32(5),
np.int32(6),
np.int32(7),
np.int32(8),
np.int32(9)}
Different clustering models¶
You may prefer to use a clustering model other than K-Means. To do so, simply pass a string to the cluster argument specifying the desired clustering algorithm.
In this case, we specify the clustering model (HDBSCAN). Note that HDBSCAN determines the number of clusters directly from the data, so we don’t pass n_clusters (it would be ignored).
[8]:
labels_HDBSCAN = hyp.cluster(mushrooms, cluster='HDBSCAN')
[9]:
fig = hyp.plot(mushrooms, '.', hue=[f'cluster {label}' for label in labels_10],
legend=True, title='K-means clustering')
fig2 = hyp.plot(mushrooms, '.', hue=[f'cluster {label}' for label in labels_HDBSCAN],
legend=True, title='HDBSCAN clustering')