top of page
Team I.A. Italia

Feature Engineering e Feature Selection per Principianti e non – Python e Machine Learning Tutorial


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.


Feature Engineering e Feature Selection per Principianti e non – Python e Machine Learning Tutorial
Feature Engineering e Feature Selection per Principianti e non – Python e Machine Learning Tutorial

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.


 i Data Scientist passano il 60% del loro tempo a pulire e organizzare i dati
i Data Scientist passano il 60% del loro tempo a pulire e organizzare i dati


“ 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.


Normalizzazione Min-Max
Normalizzazione Min-Max

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.


Standardizzazione
Standardizzazione

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

Codifica one-hot
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.

1 commento

Valutazione 0 stelle su 5.
Non ci sono ancora valutazioni

Aggiungi una valutazione
Ospite
11 feb 2022

Ottima guida molto interessante

Mi piace
PCR (5).gif
PCR (4).gif
PCR.gif
PCR.gif
PCR.gif
PCR.gif
PCR (5).gif
3.gif
Vediamo se riesci a cliccarmi ! Nascondo una Sorpresa... (2).png

Ciao 

🤗 Articoli consigliati dalla nostra
Intelligenza Artificiale in base ai tuoi interessi

Correlazione Alta

Correlazione Media

Correlazione Bassa

Iscriviti

VUOI DIVENTARE UN MEMBRO DI INTELLIGENZA ARTIFICIALE ITALIA GRATUITAMENTE E TRARNE I SEGUENTI BENEFICI?

Corsi Gratis

più di 150 lezioni online

Dataset Gratis

più di 150o dataset

Ebook Gratis

più di 10 libri da leggere

Editor Gratis

un editor python online

Progetti Gratis

più di 25 progetti python

App Gratis

4 servizi web con I.A.

Unisciti Ora a oltre
1.000.000
di lettori e appassionanti d'I.A.

Tutto ciò che riguarda l'intelligenza Artificiale, in unico posto, in italiano e gratis.

MEGLIO DI COSI' NON SI PUO' FARE

Dopo l'iscrizione riceverai diversi Regali

VUOI SCRIVERE ARTICOLI INSIEME A NOI.

Grazie

bottom of page