K-significa Raggruppamento in R con Esempio

Sommario:

Anonim

In questo tutorial imparerai

  • Cos'è l'analisi cluster?
  • Algoritmo K-means
  • Ottimo k

Cos'è l'analisi cluster?

L'analisi dei cluster fa parte dell'apprendimento non supervisionato . Un cluster è un gruppo di dati che condividono caratteristiche simili. Possiamo dire che l'analisi del clustering riguarda più la scoperta che una previsione. La macchina cerca la somiglianza nei dati. Ad esempio, puoi utilizzare l'analisi dei cluster per la seguente applicazione:

  • Segmentazione dei clienti: cerca la somiglianza tra i gruppi di clienti
  • Clustering del mercato azionario: azioni del Gruppo basate sulle performance
  • Riduci la dimensionalità di un set di dati raggruppando le osservazioni con valori simili

L'analisi di clustering non è troppo difficile da implementare ed è significativa e utilizzabile per il business.

La differenza più evidente tra l'apprendimento supervisionato e non supervisionato sta nei risultati. L'apprendimento senza supervisione crea una nuova variabile, l'etichetta, mentre l'apprendimento supervisionato prevede un risultato. La macchina aiuta il professionista nella ricerca di etichettare i dati in base a una stretta correlazione. Spetta all'analista utilizzare i gruppi e dare loro un nome.

Facciamo un esempio per comprendere il concetto di clustering. Per semplicità, lavoriamo in due dimensioni. Hai i dati sulla spesa totale dei clienti e sulla loro età. Per migliorare la pubblicità, il team di marketing desidera inviare e-mail più mirate ai propri clienti.

Nel grafico seguente si traccia la spesa totale e l'età dei clienti.

library(ggplot2)df <- data.frame(age = c(18, 21, 22, 24, 26, 26, 27, 30, 31, 35, 39, 40, 41, 42, 44, 46, 47, 48, 49, 54),spend = c(10, 11, 22, 15, 12, 13, 14, 33, 39, 37, 44, 27, 29, 20, 28, 21, 30, 31, 23, 24))ggplot(df, aes(x = age, y = spend)) +geom_point()

A questo punto è visibile un motivo

  1. In basso a sinistra puoi vedere i giovani con un potere d'acquisto inferiore
  2. Upper-middle riflette le persone con un lavoro che possono permettersi di spendere di più
  3. Infine, le persone anziane con un budget inferiore.

Nella figura sopra, raggruppate manualmente le osservazioni e definite ciascuno dei tre gruppi. Questo esempio è in qualche modo semplice e altamente visivo. Se al set di dati vengono aggiunte nuove osservazioni, è possibile etichettarle all'interno dei cerchi. Definisci il cerchio in base al nostro giudizio. È invece possibile utilizzare Machine Learning per raggruppare i dati in modo obiettivo.

In questo tutorial imparerai come utilizzare l' algoritmo k-means .

Algoritmo K-means

K-mean è, senza dubbio, il metodo di clustering più popolare. I ricercatori hanno rilasciato l'algoritmo decenni fa e sono stati apportati molti miglioramenti ai k-means.

L'algoritmo cerca di trovare gruppi riducendo al minimo la distanza tra le osservazioni, chiamate soluzioni ottimali locali . Le distanze vengono misurate in base alle coordinate delle osservazioni. Ad esempio, in uno spazio bidimensionale, le coordinate sono semplici e.

L'algoritmo funziona come segue:

  • Passaggio 1: scegli i gruppi nel piano delle funzionalità in modo casuale
  • Passaggio 2: ridurre al minimo la distanza tra il centro del cluster e le diverse osservazioni ( centroide ). Risulta in gruppi con osservazioni
  • Passaggio 3: spostare il centroide iniziale sulla media delle coordinate all'interno di un gruppo.
  • Passaggio 4: ridurre al minimo la distanza in base ai nuovi centroidi. Vengono creati nuovi confini. Pertanto, le osservazioni si sposteranno da un gruppo all'altro
  • Ripeti finché nessuna osservazione cambia i gruppi

K-means di solito prende la distanza euclidea tra la caratteristica e la caratteristica:

Sono disponibili diverse misure come la distanza Manhattan o la distanza Minlowski. Nota che, K-mean restituisce gruppi diversi ogni volta che esegui l'algoritmo. Ricorda che le prime ipotesi iniziali sono casuali e calcola le distanze finché l'algoritmo non raggiunge un'omogeneità all'interno dei gruppi. Cioè, k-mean è molto sensibile alla prima scelta e, a meno che il numero di osservazioni e gruppi non sia piccolo, è quasi impossibile ottenere lo stesso raggruppamento.

Seleziona il numero di cluster

Un'altra difficoltà riscontrata con k-mean è la scelta del numero di cluster. È possibile impostare un valore elevato di, ovvero un numero elevato di gruppi, per migliorare la stabilità, ma si potrebbe finire con un adattamento eccessivo dei dati. Overfitting significa che le prestazioni del modello diminuiscono sostanzialmente per i nuovi dati in arrivo. La macchina ha appreso i piccoli dettagli del set di dati e fatica a generalizzare lo schema generale.

Il numero di cluster dipende dalla natura del set di dati, dal settore, dall'attività e così via. Tuttavia, esiste una regola pratica per selezionare il numero appropriato di cluster:

con uguale al numero di osservazioni nel set di dati.

In generale, è interessante dedicare del tempo alla ricerca del miglior valore per soddisfare le esigenze aziendali.

Utilizzeremo il set di dati dei prezzi dei personal computer per eseguire la nostra analisi di clustering. Questo set di dati contiene 6259 osservazioni e 10 caratteristiche. Il set di dati osserva il prezzo dal 1993 al 1995 di 486 personal computer negli Stati Uniti. Le variabili sono prezzo, velocità, ram, schermo, cd tra le altre.

Procedi come segue:

  • Importa dati
  • Addestra il modello
  • Valuta il modello

Importa dati

K significa non è adatto per le variabili fattore perché si basa sulla distanza e i valori discreti non restituiscono valori significativi. È possibile eliminare le tre variabili categoriali nel nostro set di dati. Inoltre, non ci sono valori mancanti in questo set di dati.

library(dplyr)PATH <-"https://raw.githubusercontent.com/guru99-edu/R-Programming/master/computers.csv"df <- read.csv(PATH) %>%select(-c(X, cd, multi, premium))glimpse(df)
Produzione
## Observations: 6, 259## Variables: 7## $ price < int > 1499, 1795, 1595, 1849, 3295, 3695, 1720, 1995, 2225, 2… ##$ speed < int > 25, 33, 25, 25, 33, 66, 25, 50, 50, 50, 33, 66, 50, 25,… ##$ hd < int > 80, 85, 170, 170, 340, 340, 170, 85, 210, 210, 170, 210… ##$ ram < int > 4, 2, 4, 8, 16, 16, 4, 2, 8, 4, 8, 8, 4, 8, 8, 4, 2, 4,… ##$ screen < int > 14, 14, 15, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14,… ##$ ads < int > 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,… ## $ trend  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1… 

Dalle statistiche di riepilogo, puoi vedere che i dati hanno valori grandi. Una buona pratica con il calcolo della media k e della distanza è riscalare i dati in modo che la media sia uguale a uno e la deviazione standard sia uguale a zero.

summary(df)

Produzione:

## price speed hd ram## Min. : 949 Min. : 25.00 Min. : 80.0 Min. : 2.000## 1st Qu.:1794 1st Qu.: 33.00 1st Qu.: 214.0 1st Qu.: 4.000 `## Median :2144 Median : 50.00 Median : 340.0 Median : 8.000## Mean :2220 Mean : 52.01 Mean : 416.6 Mean : 8.287## 3rd Qu.:2595 3rd Qu.: 66.00 3rd Qu.: 528.0 3rd Qu.: 8.000## Max. :5399 Max. :100.00 Max. :2100.0 Max. :32.000## screen ads trend## Min. :14.00 Min. : 39.0 Min. : 1.00## 1st Qu.:14.00 1st Qu.:162.5 1st Qu.:10.00## Median :14.00 Median :246.0 Median :16.00## Mean :14.61 Mean :221.3 Mean :15.93## 3rd Qu.:15.00 3rd Qu.:275.0 3rd Qu.:21.50## Max. :17.00 Max. :339.0 Max. :35.00

Puoi riscalare le variabili con la funzione scale () della libreria dplyr. La trasformazione riduce l'impatto dei valori anomali e consente di confrontare una sola osservazione con la media. Se un valore standardizzato (o z-score ) è alto, puoi essere certo che questa osservazione è effettivamente al di sopra della media (un grande z-score implica che questo punto è lontano dalla media in termini di deviazione standard. A z- il punteggio di due indica che il valore è di 2 deviazioni standard dalla media Nota, il punteggio z segue una distribuzione gaussiana ed è simmetrico rispetto alla media.

rescale_df <- df % > %mutate(price_scal = scale(price),hd_scal = scale(hd),ram_scal = scale(ram),screen_scal = scale(screen),ads_scal = scale(ads),trend_scal = scale(trend)) % > %select(-c(price, speed, hd, ram, screen, ads, trend))

La base R ha una funzione per eseguire l'algoritmo della media k. La funzione di base di k media è:

kmeans(df, k)arguments:-df: dataset used to run the algorithm-k: Number of clusters

Addestra il modello

Nella figura tre, hai dettagliato come funziona l'algoritmo. Puoi vedere graficamente ogni passaggio con l'ottimo pacchetto creato da Yi Hui (anche il creatore di Knit per Rmarkdown). L'animazione del pacchetto non è disponibile nella libreria conda. È possibile utilizzare l'altro modo per installare il pacchetto con install.packages ("animazione"). Puoi verificare se il pacchetto è installato nella nostra cartella Anaconda.

install.packages("animation") 

Dopo aver caricato la libreria, aggiungi .ani dopo kmeans e R traccerà tutti i passaggi. A scopo illustrativo, si esegue l'algoritmo solo con le variabili ridimensionate hd e ram con tre cluster.

set.seed(2345)library(animation)kmeans.ani(rescale_df[2:3], 3)

Spiegazione del codice

  • kmeans.ani (rescale_df [2: 3], 3): Seleziona le colonne 2 e 3 del set di dati rescale_df ed esegui l'algoritmo con k set su 3. Traccia l'animazione.

Puoi interpretare l'animazione come segue:

  • Passaggio 1: R sceglie a caso tre punti
  • Passaggio 2: calcola la distanza euclidea e disegna i grappoli. Hai un cluster in verde in basso a sinistra, un grande cluster colorato in nero a destra e uno rosso tra di loro.
  • Step 3: Calcola il centroide, cioè la media dei cluster
  • Ripetere fino a quando i dati non cambiano nel cluster

L'algoritmo converge dopo sette iterazioni. Puoi eseguire l'algoritmo k-mean nel nostro set di dati con cinque cluster e chiamarlo pc_cluster.

pc_cluster <-kmeans(rescale_df, 5)
  • L'elenco pc_cluster contiene sette elementi interessanti:
  • pc_cluster $ cluster: indica il cluster di ciascuna osservazione
  • pc_cluster $ center: i centri del cluster
  • pc_cluster $ totss: la somma totale dei quadrati
  • pc_cluster $ withinss: entro la somma del quadrato. Il numero di componenti restituiti è uguale a "k"
  • pc_cluster $ tot.withinss: somma di withinss
  • pc_clusterbetweenss: somma totale di quadrati meno all'interno della somma di quadrati
  • pc_cluster $ size: numero di osservazioni all'interno di ogni cluster

Si utilizzerà la somma della somma entro il quadrato (cioè tot.withinss) per calcolare il numero ottimale di cluster k. Trovare k è davvero un compito sostanziale.

Ottimo k

Una tecnica per scegliere la k migliore è chiamata metodo del gomito . Questo metodo utilizza l'omogeneità all'interno del gruppo o l'eterogeneità all'interno del gruppo per valutare la variabilità. In altre parole, sei interessato alla percentuale della varianza spiegata da ciascun cluster. Ci si può aspettare che la variabilità aumenti con il numero di cluster, in alternativa, l'eterogeneità diminuisce. La nostra sfida è trovare la k che è oltre i rendimenti decrescenti. L'aggiunta di un nuovo cluster non migliora la variabilità dei dati perché rimangono pochissime informazioni da spiegare.

In questo tutorial, troviamo questo punto utilizzando la misura dell'eterogeneità. La somma dei quadrati totale entro i cluster è il tot. Entro i riquadri nell'elenco restituito da kmean ().

Puoi costruire il grafico del gomito e trovare la k ottimale come segue:

  • Passaggio 1: costruire una funzione per calcolare il totale all'interno dei cluster somma dei quadrati
  • Passaggio 2: eseguire l'algoritmo volte
  • Passaggio 3: creare un data frame con i risultati dell'algoritmo
  • Passaggio 4: tracciare i risultati

Passaggio 1) Costruisci una funzione per calcolare il totale all'interno dei cluster somma dei quadrati

Si crea la funzione che esegue l'algoritmo k-mean e si memorizza il totale nella somma dei quadrati dei cluster

kmean_withinss <- function(k) {cluster <- kmeans(rescale_df, k)return (cluster$tot.withinss)}

Spiegazione del codice

  • funzione (k): imposta il numero di argomenti nella funzione
  • kmeans (rescale_df, k): esegue l'algoritmo k volte
  • return (cluster $ tot.withinss): Memorizza il totale all'interno dei cluster somma dei quadrati

Puoi testare la funzione con uguale a 2.

Produzione:

## Try with 2 cluster
kmean_withinss(2)

Produzione:

## [1] 27087.07 

Passaggio 2) Esegui l'algoritmo n volte

Utilizzerai la funzione sapply () per eseguire l'algoritmo su un intervallo di k. Questa tecnica è più veloce rispetto alla creazione di un ciclo e all'archiviazione del valore.

# Set maximum clustermax_k <-20# Run algorithm over a range of kwss <- sapply(2:max_k, kmean_withinss)

Spiegazione del codice

  • max_k <-20: imposta un numero massimo di 20
  • sapply (2: max_k, kmean_withinss): esegue la funzione kmean_withinss () su un intervallo 2: max_k, ovvero da 2 a 20.

Passaggio 3) Crea un data frame con i risultati dell'algoritmo

Dopo la creazione e il test della nostra funzione, è possibile eseguire l'algoritmo k-mean su un intervallo da 2 a 20, memorizzare i valori tot.withinss.

# Create a data frame to plot the graphelbow <-data.frame(2:max_k, wss)

Spiegazione del codice

  • data.frame (2: max_k, wss): crea un data frame con l'output dell'archivio algoritmo in wss

Passaggio 4) Tracciare i risultati

Si traccia il grafico per visualizzare dove si trova il punto del gomito

# Plot the graph with gglopggplot(elbow, aes(x = X2.max_k, y = wss)) +geom_point() +geom_line() +scale_x_continuous(breaks = seq(1, 20, by = 1))

Dal grafico, puoi vedere che il k ottimale è sette, dove la curva inizia ad avere un rendimento decrescente.

Una volta ottenuto il nostro k ottimale, riesegui l'algoritmo con k uguale a 7 e valuta i cluster.

Esaminando il cluster

pc_cluster_2 <-kmeans(rescale_df, 7)

Come accennato prima, puoi accedere alle restanti informazioni interessanti nell'elenco restituito da kmean ().

pc_cluster_2$clusterpc_cluster_2$centerspc_cluster_2$size 

La parte valutativa è soggettiva e si basa sull'utilizzo dell'algoritmo. Il nostro obiettivo qui è raccogliere computer con caratteristiche simili. Un ragazzo del computer può fare il lavoro a mano e un computer di gruppo in base alla sua esperienza. Tuttavia, il processo richiederà molto tempo e sarà soggetto a errori. L'algoritmo K-mean può preparare il campo per lui / lei suggerendo cluster.

Come valutazione preliminare, è possibile esaminare la dimensione dei cluster.

pc_cluster_2$size

Produzione:

## [1] 608 1596 1231 580 1003 699 542

Il primo cluster è composto da 608 osservazioni, mentre il cluster più piccolo, il numero 4, ha solo 580 computer. Potrebbe essere utile avere omogeneità tra i cluster, altrimenti potrebbe essere necessaria una preparazione dei dati più sottile.

Ottieni uno sguardo più approfondito ai dati con il componente centrale. Le righe si riferiscono alla numerazione del cluster e alle colonne le variabili utilizzate dall'algoritmo. I valori sono il punteggio medio di ciascun cluster per la colonna interessata. La standardizzazione facilita l'interpretazione. I valori positivi indicano che il punteggio z per un dato cluster è superiore alla media complessiva. Ad esempio, il cluster 2 ha la media dei prezzi più alta tra tutti i cluster.

center <-pc_cluster_2$centerscenter

Produzione:

## price_scal hd_scal ram_scal screen_scal ads_scal trend_scal## 1 -0.6372457 -0.7097995 -0.691520682 -0.4401632 0.6780366 -0.3379751## 2 -0.1323863 0.6299541 0.004786730 2.6419582 -0.8894946 1.2673184## 3 0.8745816 0.2574164 0.513105797 -0.2003237 0.6734261 -0.3300536## 4 1.0912296 -0.2401936 0.006526723 2.6419582 0.4704301 -0.4132057## 5 -0.8155183 0.2814882 -0.307621003 -0.3205176 -0.9052979 1.2177279## 6 0.8830191 2.1019454 2.168706085 0.4492922 -0.9035248 1.2069855## 7 0.2215678 -0.7132577 -0.318050275 -0.3878782 -1.3206229 -1.5490909

Puoi creare una mappa di calore con ggplot per aiutarci a evidenziare la differenza tra le categorie.

I colori predefiniti di ggplot devono essere modificati con la libreria RColorBrewer. Puoi usare la libreria conda e il codice da avviare nel terminale:

conda install -cr r-rcolorbrewer

Per creare una mappa termica, procedi in tre passaggi:

  • Costruisci un data frame con i valori del centro e crea una variabile con il numero del cluster
  • Rimodella i dati con la funzione gather () della libreria tidyr. Vuoi trasformare i dati da ampi a lunghi.
  • Crea la tavolozza dei colori con la funzione colorRampPalette ()

Passaggio 1) Costruisci un data frame

Creiamo il set di dati di risagoma

library(tidyr)# create dataset with the cluster numbercluster <- c(1: 7)center_df <- data.frame(cluster, center)# Reshape the datacenter_reshape <- gather(center_df, features, values, price_scal: trend_scal)head(center_reshape)

Produzione:

## cluster features values## 1 1 price_scal -0.6372457## 2 2 price_scal -0.1323863## 3 3 price_scal 0.8745816## 4 4 price_scal 1.0912296## 5 5 price_scal -0.8155183## 6 6 price_scal 0.8830191

Passaggio 2) Rimodellare i dati

Il codice seguente crea la tavolozza dei colori che utilizzerai per tracciare la mappa termica.

library(RColorBrewer)# Create the palettehm.palette <-colorRampPalette(rev(brewer.pal(10, 'RdYlGn')),space='Lab')

Passaggio 3) Visualizza

Puoi tracciare il grafico e vedere che aspetto hanno i cluster.

# Plot the heat mapggplot(data = center_reshape, aes(x = features, y = cluster, fill = values)) +scale_y_continuous(breaks = seq(1, 7, by = 1)) +geom_tile() +coord_equal() +scale_fill_gradientn(colours = hm.palette(90)) +theme_classic()

Sommario

Possiamo riassumere l'algoritmo k-mean nella tabella seguente

Pacchetto

Obbiettivo

funzione

discussione

base

Allena k-mean

kmeans ()

df, k

Accesso al cluster

kmeans () $ cluster

Centri cluster

kmeans () $ centri

Dimensione cluster

kmeans () $ dimensione