Salta el contingut
 

Selecció de característiques: Mètodes de filtre

Autor: Joan Puigcerver Ibáñez

Correu electrònic: j.puigcerveribanez@edu.gva.es

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Selecció de característiques: Mètodes de filtre

Els mètodes de filtre són una tècnica de reducció de dimensionalitat basada en la selecció de característiques que analitzen la relevància de les característiques a partir d'una funció sobre les dades.

Umbral de variància

L'umbral de variància és una tècnica de filtre univariada que es basa en eliminar les característiques amb baixa variància, ja que aquestes no aporten informació rellevant al model.

La classe VarianceThreshold de scikit-learn permet eliminar les característiques amb baixa variància.

constant_filter = VarianceThreshold(threshold=0)
constant_filter.fit_transform(X_train)
constant_filter.transform(X_test)

El paràmetre threshold indica el valor de la variància per sobre del qual les característiques seran considerades.

  • Si threshold=0, es eliminaran les característiques amb variància zero.
  • Si threshold és un valor diferent de zero, es eliminaran les característiques amb variància inferior a aquest valor.

En aquest cas, és important normalitzar les dades mitjançant MinMaxScaler per evitar que l'escala afecte al càlcul de la variància.

Basada en correlació

La selecció de característiques basada en correlació és una tècnica de filtre multivariada que elimina les característiques amb alta correlació, ja que aquestes aporten la mateixa informació al model.

Per eliminar les característiques amb alta correlació, cal seguir els següents passos:

  1. Obtindre la matriu de correlació de les característiques.
corr_matrix = X_train.corr().abs()
  1. Seleccionar la part superior de la matriu de correlació, ja que la matriu és simètrica i la diagonal principal conté la correlació de cada característica amb ella mateixa.
upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(np.bool))
  1. Trobar les característiques amb una correlació superior a un determinat umbral, que seran les que eliminarem.
corr_threshold = 0.7
to_drop = [column for column in upper.columns if any(upper[column] > corr_threshold)]
  1. Eliminar les característiques amb alta correlació.
# Drop features
X_train = X_train.drop(columns=to_drop, axis=1)
X_test = X_test.drop(columns=to_drop, axis=1)

Codi font

reduccio_filtres.py
import pandas as pd
from sklearn import preprocessing
from sklearn.feature_selection import VarianceThreshold
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

df = pd.read_csv('./../files/ud5/laptop_pricing_cleaned.csv', index_col=0)
df = df.iloc[:, 1:]
df = df.select_dtypes(include=['number'])

X = df.drop(columns = 'Price', axis = 1)
y = df['Price']

X_train, X_test, y_train, y_test = train_test_split(X, y, train_size   = 0.7)

# scaler = preprocessing.MinMaxScaler()
# X_train = scaler.fit_transform(X_train)

# print(X_train)

# Filtre univariant - Variables costants (VarianceThreshold)
constant_filter = VarianceThreshold(threshold=0)
constant_filter.fit(X_train)

print(X_train.var())
print("Columnas originales: ", len(X_train.columns))
print("Columnas després del threshold: ", len(X_train.columns[constant_filter.get_support()]))
print(X_train.columns[constant_filter.get_support()])

# Filtre multivariant - Variables correlacionades entre si
figure = plt.figure(figsize = (15, 10))
axes = figure.add_subplot()
corr_features = X_train.corr()
_ = sns.heatmap(corr_features, annot=True, cmap=plt.cm.coolwarm, axes = axes)
# plt.show()

corr_threshold = 0.7
corr_matrix = X_train.corr().abs()

upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(np.bool))
print(upper)

to_drop = [column for column in upper.columns if any(upper[column] > corr_threshold)]
print(to_drop)

# Drop features
X_train = X_train.drop(columns=to_drop, axis=1)
X_test = X_test.drop(columns=to_drop, axis=1)

print(X_train.shape)