Apprendimento automatico 101: #1
Sommario
· Introduzione
∘ Perché non .get_dummies( ) ?
· Importazione di dati
∘ Dimensioni
∘ Numero di variabili categoriali
∘ Variabili categoriali di filtro
∘ Numero previsto di colonne aggiuntive
· One Hot Encoding (OHE)
∘ Numero effettivo di colonne aggiuntive
Introduzione
Le macchine AMANO i numeri NON amano molto i dati di testo
Molti dati si presentano sotto forma di dati di testo. I data scientist devono essere in grado di convertire questi dati in un tipo di dati numerici in modo che i nostri algoritmi di apprendimento automatico non esplodano
Nel nostro primo tutorial di Machine Learning 101 , impareremo come One Hot Encode (OHE) variabili categoriali in un set di dati.
Prenderemo un set di dati sui dati di vendita di alloggi e codificheremo tutte le caratteristiche categoriche di questo frame di dati per creare variabili fittizie che assumeranno il valore di 0️ o 1 . Queste variabili fittizie verranno quindi aggiunte nuovamente al frame di dati originale.
A nostra volta, dovremo anche eliminare ️ le colonne di testo originali che sono state codificate, poiché i nostri algoritmi di apprendimento automatico non le gradirebbero ❌
Perché non .get_dummies() ?
Un approccio alternativo alla codifica delle variabili categoriali consiste nell'utilizzare il metodo .get_dummies() . Perché non utilizzare questo metodo, invece?
La risposta è perché .get_dummies() è molto meno efficiente rispetto all'utilizzo di OHE per set di dati più grandi OHE è più efficiente in quanto sfrutta qualcosa chiamato matrice sparsa piuttosto che emettere l'intero frame di dati.
Importazione di dati
I dati per questo tutorial possono essere trovati nel mio Github .
# Import libraries
import pandas as pd
import numpy as np
import warnings
# Ignore warnings
warnings.filterwarnings("ignore")
# Import data
data = pd.read_csv("Housing_Sales_Data.csv")
# Display subset of data frame
data.iloc[:,:10].head()
Usando .shape , possiamo trovare le dimensioni del nostro data frame abitativo: 1379 righe e 80 colonne.
# Inspect df dimensions
data.shape
Usando il metodo .value_counts() , possiamo contare il numero di ogni tipo di variabile nel nostro data frame Troveremo 43 colonne di tipo di dati oggetto (variabili stringa). Queste sono le nostre colonne categoriche.
# Count data types
data.dtypes.value_counts()
Ora creeremo una variabile, mask , che ci consentirà di filtrare le colonne non categoriali dal nostro data frame. mask assumerà un valore booleano per ogni caratteristica a seconda che la caratteristica sia una variabile categoriale.
# Create mask variable
mask = data.dtypes == np.object
# Display mask
mask
# Select only categorical variables
categorical_cols = data.columns[mask]
È buona norma vedere quante variabili aggiuntive si prevede di creare, per vedere se il numero previsto è allineato con il numero effettivo di colonne create alla fine.
Per determinare quante colonne extra verrebbero create, usiamo una funzione lambda . Per ogni variabile categoriale, la funzione lambda restituirà il numero di classi univoche per quella funzionalità.
# Determine number of extra columns
num_ohe_cols = (data[categorical_cols]
.apply(lambda x: x.nunique())
.sort_values(ascending=False))
# Display first 10 rows
num_ohe_cols.head(10)
Non saremo interessati a codificare caratteristiche con un solo valore, quindi le rimuoveremo dal frame di dati ❌ In questa occasione non ci sono caratteristiche con un solo valore, ma è un passo utile da avere.
# No need to encode if there is only one value
small_num_ohe_cols = num_ohe_cols.loc[num_ohe_cols>1]
Ad esempio, Neighbourhood creerà 25 variabili fittizie, poiché ha 25 classi uniche (vedi sopra). Prima di aggiungere nuovamente queste nuove colonne al frame di dati originale, elimineremo la colonna Quartiere originale poiché non sarà più necessaria (e non può essere utilizzata a causa del suo tipo di dati)! Quindi, stiamo aggiungendo 25 variabili... ma sottraendo 1.
# Subtract 1 value from each feature
small_num_ohe_cols -= 1
# Sum of new features
small_num_ohe_cols.sum()
Una codifica a caldo (OHE)
Prima di importare OneHotEncoder , creeremo una copia del nostro frame di dati per calcolare la differenza nelle colonne prima e dopo la codifica.
# Copy of the data
data_ohe = data.copy()
# Import OneHotEncoder
from sklearn.preprocessing import OneHotEncoder
# Initialise
ohe = OneHotEncoder()
# The encoders
ohe = OneHotEncoder(drop="first")
Fortunatamente ... non ha un impatto significativo sulla prevedibilità di cui si occupa principalmente l'apprendimento automatico Quindi, non lo useremo qui.
Ora creeremo un ciclo for Questo ciclo:
- Passa attraverso ogni caratteristica categorica
- One Hot Codifica i dati per restituire un array sparso
- Rimuove la colonna associata dal frame di dati originale
- Ottieni i nomi di tutte le etichette di classe univoche dalla colonna
- Crea nomi di colonna per ogni colonna codificata in base al valore
- Crea un nuovo frame di dati
- Aggiungi un nuovo frame di dati codificato al frame di dati originale
# (1) - Loop through categorical variables
for col in num_ohe_cols.index:
# (2) - OHE data to get sparse matrix
new_dat = ohe.fit_transform(data_ohe[[col]])
# (3) - Remove this column from original df
data_ohe = data_ohe.drop(col, axis=1)
# (4) - Get unique value names
cats = ohe.categories_
# (5) - Create column names
new_cols = ['_'.join([col,cat]) for cat in cats[0]]
# (6) - Create new df
new_df = pd.DataFrame(new_dat.toarray(),columns=new_cols)
# (7) - Append df
data_ohe = pd.concat([data_ohe, new_df], axis =1)
Questo frame di dati viene quindi aggiunto al frame di dati originale dopo che Foundation ne è stato eliminato. Questo processo si ripete per tutte le 43 variabili categoriche nel data frame originale
Numero effettivo di colonne aggiuntive
Dopo aver codificato ogni variabile categoriale e aggiunto tutte le variabili fittizie al frame di dati originale... ora desideriamo accertare quante colonne aggiuntive sono state create dalla codifica. Ricordiamo, ne aspettiamo 215!
Usiamo .shape[1] su entrambi i frame di dati (quello con le nuove variabili fittizie e quello originale). Ciò restituirà il numero di colonne in entrambi i frame di dati. Quindi sottraiamo semplicemente l'uno dall'altro.
# Column difference is as calculated above
data_ohe.shape[1] - data.shape[1]
Finito!
Con ciò, questo tutorial si è concluso! Spero che tu l'abbia trovato utile. Alla prossima... Zuppa di piselli ✌️

![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































