Dicono che i dati siano il nuovo petrolio , ma non usiamo il petrolio direttamente dalla sua fonte. Deve essere elaborato e pulito prima di utilizzarlo per scopi diversi.
Lo stesso vale per i dati, non li usiamo direttamente dalla loro fonte. Deve anche essere elaborato.
Questa può essere una sfida per i principianti nell'apprendimento automatico e nella scienza dei dati perché i dati provengono da fonti diverse con tipi di dati diversi. Pertanto non è possibile applicare lo stesso metodo di pulizia ed elaborazione a diversi tipi di dati.
"Le informazioni possono essere estratte dai dati così come l'energia può essere estratta dal petrolio."- Adeola Adesina
Devi imparare e applicare metodi a seconda dei dati che hai.
Dopo aver letto questo articolo, saprai:
Che cos'è l'ingegneria delle funzionalità e la selezione delle funzionalità.
Diversi metodi per gestire i dati mancanti nel tuo set di dati.
Diversi metodi per gestire le funzionalità continue.
Diversi metodi per gestire le caratteristiche categoriche.
Diversi metodi per la selezione delle caratteristiche.
Cominciamo.🚀
Che cos'è il Feature Engineering l'ingegneria delle Feature?
L'ingegneria delle feature si riferisce a un processo di selezione e trasformazione di variabili/funzioni nel set di dati durante la creazione di un modello predittivo utilizzando l'apprendimento automatico.
Pertanto devi estrarre le funzionalità dal set di dati non elaborato che hai raccolto prima di addestrare i tuoi dati negli algoritmi di apprendimento automatico. Altrimenti, sarà difficile ottenere buone informazioni sui tuoi dati.
Tortura i dati e confesseranno qualsiasi cosa. — Ronald Coase
L'ingegneria delle feature ha due obiettivi:
Preparazione del set di dati di input corretto, compatibile con i requisiti dell'algoritmo di apprendimento automatico.
Migliorare le prestazioni dei modelli di machine learning.
Indagine CrowdFlower
Secondo un sondaggio condotto da CrowdFlower su 80 Data Scientist, i Data Scientist passano il 60% del loro tempo a pulire e organizzare i dati. Questo è il motivo per cui avere competenze nell'ingegneria e nella selezione delle funzionalità è molto importante.
“ Alla fine della giornata, alcuni progetti di machine learning hanno successo e altri falliscono. Cosa fa la differenza? Facilmente il fattore più importante sono le feature utilizzate. ” — Prof. Pedro Domingos dell'Università di Washington
Ora che sai perché è necessario apprendere tecniche diverse per la progettazione delle funzionalità, iniziamo imparando metodi diversi per gestire i dati mancanti.
Come gestire i dati mancanti
La gestione dei dati mancanti è molto importante poiché molti algoritmi di apprendimento automatico non supportano i dati con valori mancanti. La mancanza di valori nel set di dati può causare errori e prestazioni scadenti con alcuni algoritmi di apprendimento automatico. Ecco l'elenco dei valori mancanti comuni che puoi trovare nel tuo set di dati.
N / A
nullo
Vuoto
?
nessuno
sporco
-
NaN
Impariamo diversi metodi per risolvere il problema dei dati mancanti.
Cancellazione variabile
L'eliminazione delle variabili comporta l'eliminazione delle variabili (colonne) con valori mancanti caso per caso. Questo metodo ha senso quando ci sono molti valori mancanti in una variabile e se la variabile è di importanza relativamente minore.
L'unico caso in cui può valere la pena eliminare una variabile è quando i suoi valori mancanti superano il 60% delle osservazioni.
# importa packages
import numpy as np
import pandas as pd
# leggi dataset
data = pd.read_csv('path/to/data')
#setta threshold
threshold = 0.7
# droppa colonne con i valori mancani più alti del threshold
data = data[data.columns[data.isnull().mean() < threshold]]
Nello snippet di codice sopra, puoi vedere come utilizzo NumPy e panda per caricare il set di dati e impostare una soglia su 0.7 . Ciò significa che qualsiasi colonna con valori mancanti superiori al 70% delle osservazioni verrà eliminata dal set di dati.
Ti consiglio di impostare il valore di soglia in base alla dimensione del tuo set di dati.
Imputazione media o mediana
Un'altra tecnica comune consiste nell'utilizzare la media o la mediana delle osservazioni non mancanti. Questa strategia può essere applicata a una feature che contiene dati numerici.
# Sostituisci i valori nulli con la media delle colonne di appartenenza
data = data.fillna(data.median())
Nell'esempio sopra, usiamo il metodo mediano per riempire i valori mancanti nel set di dati.
Valore più comune
Questo metodo sostituisce i valori mancanti con il valore massimo verificato in una colonna/funzione. Questa è una buona opzione per la gestione di colonne/funzioni categoriali .
# Sostituisci i valori nulli con la media delle colonne di appartenenza
data['column_name'].fillna(data['column_name'].value_counts().idxmax(). inplace=True)
Qui utilizziamo il metodo value_counts() di panda per contare l'occorrenza di ciascun valore univoco nella colonna e quindi riempire il valore mancante con il valore più comune.
Come gestire le funzioni continue
Le feature continue nel set di dati hanno un intervallo di valori diverso. Esempi comuni di funzionalità continue sono età, stipendio, prezzi e altezza.
È molto importante gestire le funzionalità continue nel set di dati prima di addestrare gli algoritmi di apprendimento automatico. Se si addestra il modello con un intervallo di valori diverso, il modello non funzionerà bene.
Cosa intendo quando dico un diverso intervallo di valori? Supponiamo che tu abbia un set di dati con due funzioni continue, età e stipendio . La fascia di età sarà diversa dalla fascia di stipendio e ciò può causare problemi.
Di seguito sono riportati alcuni metodi comuni per gestire le funzionalità continue:
Normalizzazione Min-Max in Python
Per ogni valore in una caratteristica, la normalizzazione Min-Max sottrae il valore minimo nella caratteristica e quindi divide per il suo intervallo. L'intervallo è la differenza tra il massimo originale e il minimo originale.
Infine, ridimensiona tutti i valori in un intervallo fisso tra 0 e 1.
È possibile utilizzare il metodo MinMaxScaler di Scikit -learn che trasforma le funzionalità ridimensionando ciascuna funzionalità in un determinato intervallo:
from sklearn.preprocessing import MinMaxScaler
import numpy as np
data = np.array([[4, 6], [11, 34], [10, 17], [1, 5]])
# creiamo lo scaler method
scaler = MinMaxScaler(feature_range=(0,1))
# Scaliamo e trasformiamo i dati
scaled_data = scaler.fit_transform(data)
print(scaled_data)
# [[0.3 0.03448276]
# [1. 1. ]
# [0.9 0.4137931 ]
# [0. 0. ]]
Come puoi vedere, i nostri dati sono stati trasformati e l'intervallo è compreso tra 0 e 1 .
Standardizzazione in Python
La Standardizzazione assicura che ogni caratteristica abbia una media di 0 e una deviazione standard di 1 , portando tutte le caratteristiche alla stessa grandezza.
Se la deviazione standard delle caratteristiche è diversa , anche il loro intervallo sarebbe diverso.
x = osservazione, μ = media, σ = deviazione standard
È possibile utilizzare il metodo StandardScaler di Scikit-learn per standardizzare le funzionalità rimuovendo la media e scalando a una deviazione standard di 1 :
from sklearn.preprocessing import StandardScaler
import numpy as np
data = np.array([[4, 1], [11, 1], [10, 4], [1, 11]])
# creiamo lo scaler method
scaler = StandardScaler()
# Scaliamo e trasformiamo i dati
scaled_data = scaler.fit_transform(data)
print(scaled_data)
# [[-0.60192927 -0.79558708]
# [ 1.08347268 -0.79558708]
# [ 0.84270097 -0.06119901]
# [-1.32424438 1.65237317]]
Verifichiamo che la media di ogni feature (colonna) sia 0 :
print(scaled_data.mean(axis=0))
[0. 0.]
E che la deviazione standard di ogni caratteristica (colonna) è 1 :
print(scaled_data.std(axis=0))
[1. 1.]
Come gestire le caratteristiche categoriche
Le caratteristiche categoriali rappresentano tipi di dati che possono essere suddivisi in gruppi. Ad esempio, generi e livelli di istruzione.
Tutti i valori non numerici devono essere convertiti in numeri interi o float per essere utilizzati nella maggior parte delle librerie di machine learning.I metodi comuni per gestire le caratteristiche categoriali sono:
Codifica etichetta
La codifica dell'etichetta converte semplicemente ogni valore categorico in una colonna in un numero.
Si consiglia di utilizzare la codifica delle etichette per convertirli in variabili binarie.
Nell'esempio seguente imparerai come utilizzare LableEncoder di Scikit -learn per trasformare i valori categoriali in binari:
import numpy as np
import pandas as pd
from sklearn.preprocessing import LabelEncoder
data = {'Gender':['male', 'female', 'female', 'male','male'],
'Country':['Tanzania','Kenya', 'Tanzania', 'Tanzania','Kenya']}
# Creiamo il dataFrame
data = pd.DataFrame(data)
# creiamo il label encoder object
le = LabelEncoder()
data['Gender']= le.fit_transform(data['Gender'])
data['Country']= le.fit_transform(data['Country'])
print(data)
Dati trasformati
Codifica one-hot
Il modo di gran lunga più comune per rappresentare le variabili categoriali è utilizzare la codifica one-hot, o metodi di codifica uno-su-N, noti anche come variabili fittizie.
L'idea alla base delle variabili fittizie è sostituire una variabile categoriale con una o più nuove funzionalità che possono avere i valori 0 e 1.
Nell'esempio seguente, utilizzeremo gli encoder della libreria Scikit-learn. LabelEncoder ci aiuterà a creare una codifica intera di etichette dai nostri dati eOneHotEncoder creerà una codifica one-hot di valori con codifica intera.
import numpy as np
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
# definiamo un esempio
data = np.array(['cold', 'cold', 'warm', 'cold', 'hot', 'hot', 'warm', 'cold', 'warm', 'hot'])
# creiamo integer encode
label_encoder = LabelEncoder()
# alleniamo e trasformia i dati
integer_encoded = label_encoder.fit_transform(data)
print(integer_encoded)
# creiamo one-hot encode
onehot_encoder = OneHotEncoder(sparse=False)
# effttuiamo il reshape dei dati
integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)
# alleniamo e trasformia i dati
onehot_encoded = onehot_encoder.fit_transform(integer_encoded)
print(onehot_encoded)
Questo è l' output di integer_encoded dal metodo LabelEncoder :
[0 0 2 0 1 1 2 0 2 1]
E questo è l'output di onehot_encoded dal metodo OneHotEncoder :
[[1. 0. 0.]
[1. 0. 0.]
[0. 0. 1.]
[1. 0. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 0. 1.]
[1. 0. 0.]
[0. 0. 1.]
[0. 1. 0.]]
Che cos'è la Feature Selection o selezione delle Feature ?
La selezione delle funzionalità è il processo in cui si selezionano automaticamente o manualmente le funzionalità che contribuiscono maggiormente alla variabile o all'output di previsione.
La presenza di funzionalità irrilevanti nei dati può ridurre l'accuratezza dei modelli di machine learning.
I motivi principali per utilizzare la selezione delle funzionalità sono:
Consente all'algoritmo di apprendimento automatico di eseguire l'addestramento più velocemente.
Riduce la complessità di un modello e ne facilita l'interpretazione.
Migliora la precisione di un modello se viene scelto il sottoinsieme corretto.
Riduce il sovradattamento.
"Ho preparato un modello selezionando tutte le caratteristiche e ho ottenuto una precisione di circa il 65% che non è abbastanza buona per un modello predittivo e dopo aver effettuato alcune selezioni di funzionalità e progettazione delle funzionalità senza apportare modifiche logiche al codice del mio modello, la mia precisione è balzata a 81% che è piuttosto impressionante "- Di Raheel Shaikh
I metodi comuni per la selezione delle funzionalità sono:
Selezione univariata
I test statistici possono aiutare a selezionare le caratteristiche indipendenti che hanno la relazione più forte con la caratteristica di destinazione nel set di dati. Ad esempio, il test del chi quadrato.
La libreria Scikit -learn fornisce la classe SelectKBest che può essere usata con una suite di diversi test statistici per selezionare un numero specifico di funzionalità.
Nell'esempio seguente utilizziamo la classe SelectKBest con il test chi-squired per trovare la funzionalità migliore per il set di dati Iris:
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
iris_dataset = load_iris()
# Dividiamo Target e features
X = iris_dataset.data
y = iris_dataset.target
X = X.astype(int)
chi2_features = SelectKBest(chi2, k = 2)
X_kbest_features = chi2_features.fit_transform(X, y)
# features Ridotte
print('Original feature number:', X.shape[1])
print('Reduced feature number:', X_kbest_features.shape[1])
Numero di caratteristica originale: 4 Numero di caratteristica ridotto: 2
Come puoi vedere, il test del chi quadrato ci aiuta a selezionare due importanti caratteristiche indipendenti dalle 4 originali che hanno la relazione più forte con la caratteristica di destinazione.
Importanza delle caratteristiche
L'importanza delle funzionalità ti dà un punteggio per ogni caratteristica dei tuoi dati. Più alto è il punteggio, più importante o rilevante è quella caratteristica per la tua caratteristica target.
L'importanza delle funzionalità è una classe incorporata che viene fornita con classificatori basati su alberi come:
Classificatori forestali casuali
Classificatori albero extra
Nell'esempio seguente, addestreremo il classificatore ad albero aggiuntivo nel set di dati dell'iride e utilizzeremo la classe incorporata .feature_importances_ per calcolare l'importanza di ogni caratteristica:
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.ensemble import ExtraTreesClassifier
iris_dataset = load_iris()
# Dividiamo Target e features
X = iris_dataset.data
y = iris_dataset.target
X = X.astype(int)
# Creiamo il modello
extra_tree_forest = ExtraTreesClassifier(n_estimators = 5,
criterion ='entropy', max_features = 2)
# Alleniamo il modello
extra_tree_forest.fit(X, y)
feature_importance = extra_tree_forest.feature_importances_
# Normalizziamo
feature_importance_normalized = np.std([tree.feature_importances_ for tree in
extra_tree_forest.estimators_],
axis = 0)
# Mostriamo il grafico a barre
plt.bar(iris_dataset.feature_names, feature_importance_normalized)
plt.xlabel('Feature Labels')
plt.ylabel('Feature Importances')
plt.title('Comparison of different Feature Importances')
plt.show()
Caratteristiche importanti
Il grafico mostra che le suddette caratteristiche più importanti sono lunghezza petalo (cm) e larghezza petalo (cm) , e che il minimo caratteristica importante è la larghezza sepalo (cm) . Ciò significa che puoi utilizzare le funzionalità più importanti per addestrare il tuo modello e ottenere le migliori prestazioni.
Matrice di correlazione Heatmap
La correlazione mostra come le caratteristiche sono correlate tra loro o con la caratteristica di destinazione.
La correlazione può essere positiva (un aumento di un valore della caratteristica aumenta il valore della variabile target) o negativa (un aumento di un valore della caratteristica diminuisce il valore della variabile target).
Nell'esempio seguente, utilizzeremo il dataset dei prezzi delle case di Boston dalla libreria Scikit-learn e il metodo corr() di pandas per trovare la correlazione a coppie di tutte le caratteristiche nel dataframe:
from sklearn.datasets import load_boston
import matplotlib.pyplot as plt
import seaborn as sns
boston_dataset = load_boston()
boston = pd.DataFrame(boston_dataset.data, columns=boston_dataset.feature_names)
#X = X.astype(int)
#mostriamo il grafico
ax = sns.heatmap(boston.corr().round(2), annot=True)
Il coefficiente di correlazione va da -1 a 1. Se il valore è prossimo a 1, significa che c'è una forte correlazione positiva tra le due caratteristiche. Quando è vicino a -1, le caratteristiche hanno una forte correlazione negativa. Nella figura sopra, si può vedere che l'IVA e RAD caratteristiche hanno come TRONG correlazione positiva e le DIS e NOX caratteristiche hanno una forte correlazione negativa.
Se scopri che ci sono alcune funzionalità nel tuo set di dati che sono correlate tra loro, significa che trasmettono le stesse informazioni. Si consiglia di rimuoverne uno.
Conclusione
I metodi che ho spiegato in questo articolo ti aiuteranno a preparare la maggior parte dei set di dati strutturati che hai. Ma se stai lavorando su set di dati non strutturati come immagini, testo e audio, dovrai imparare diversi metodi che non sono spiegati in questo articolo.
Ottima guida molto interessante