Aplicar m茅todos de envoltura en Python para la selecci贸n de caracter铆sticas

    Introducci贸n

    En el art铆culo anterior, estudiamos c贸mo podemos usar m茅todos de filtro para la selecci贸n de caracter铆sticas para algoritmos de Machine Learning. Los m茅todos de filtro son 煤tiles cuando desea seleccionar un conjunto gen茅rico de caracter铆sticas para todos los modelos de Machine Learning.

    Sin embargo, en algunos escenarios, es posible que desee utilizar un algoritmo de Machine Learning espec铆fico para entrenar su modelo. En tales casos, las caracter铆sticas seleccionadas mediante m茅todos de filtrado pueden no ser el conjunto de caracter铆sticas m谩s 贸ptimo para ese algoritmo espec铆fico. Existe otra categor铆a de m茅todos de selecci贸n de caracter铆sticas que seleccionan las caracter铆sticas m谩s 贸ptimas para el algoritmo especificado. Tales m茅todos se llaman m茅todos de envoltura.

    M茅todos de envoltura para la selecci贸n de funciones

    Los m茅todos de envoltura se basan en algoritmos de b煤squeda codiciosos, ya que eval煤an todas las combinaciones posibles de las funciones y seleccionan la combinaci贸n que produce el mejor resultado para un algoritmo de Machine Learning espec铆fico. Una desventaja de este enfoque es que probar todas las combinaciones posibles de las caracter铆sticas puede ser computacionalmente muy costoso, particularmente si el conjunto de caracter铆sticas es muy grande.

    Como se dijo anteriormente, los m茅todos de envoltura pueden encontrar el mejor conjunto de caracter铆sticas para un algoritmo espec铆fico; sin embargo, una desventaja es que este conjunto de caracter铆sticas puede no ser 贸ptimo para todos los dem谩s algoritmos de Machine Learning.

    Los m茅todos de envoltura para la selecci贸n de caracter铆sticas se pueden dividir en tres categor铆as: Selecci贸n de funciones de avance, Paso hacia atr谩s en la selecci贸n de funciones y Selecci贸n exhaustiva de funciones. En este art铆culo, veremos c贸mo podemos implementar estos enfoques de selecci贸n de caracter铆sticas en Python.

    Selecci贸n de funciones de avance

    En la primera fase de la selecci贸n de caracter铆sticas del paso adelante, se eval煤a el rendimiento del clasificador con respecto a cada caracter铆stica. La funci贸n que funciona mejor se selecciona entre todas las funciones.

    En el segundo paso, se prueba la primera funci贸n en combinaci贸n con todas las dem谩s funciones. Se selecciona la combinaci贸n de dos caracter铆sticas que producen el mejor rendimiento del algoritmo. El proceso contin煤a hasta que se selecciona el n煤mero especificado de funciones.

    Implementemos la selecci贸n de funciones de avance en Python. Estaremos usando el Gesti贸n de siniestros de BNP Paribas Cardif conjunto de datos para esta secci贸n como hicimos en nuestro art铆culo anterior.

    Para implementar la selecci贸n de caracter铆sticas paso adelante, necesitamos convertir valores de caracter铆sticas categ贸ricas en valores de caracter铆sticas num茅ricos. Sin embargo, en aras de la simplicidad, eliminaremos todas las columnas no categ贸ricas de nuestros datos. Tambi茅n eliminaremos las columnas correlacionadas como hicimos en el art铆culo anterior para que tengamos un peque帽o conjunto de funciones para procesar.

    Preprocesamiento de datos

    La siguiente secuencia de comandos importa el conjunto de datos y las bibliotecas necesarias, luego quita las columnas no num茅ricas del conjunto de datos y luego divide el conjunto de datos en conjuntos de entrenamiento y prueba. Finalmente, se eliminan todas las columnas con una correlaci贸n superior a 0,8. Eche un vistazo a este art铆culo para obtener una explicaci贸n detallada de este script:

    import pandas as pd
    import numpy as np
    from sklearn.model_selection import train_test_split
    from sklearn.feature_selection import VarianceThreshold
    
    paribas_data = pd.read_csv(r"E:Datasetsparibas_data.csv", nrows=20000)
    paribas_data.shape
    
    num_colums = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
    numerical_columns = list(paribas_data.select_dtypes(include=num_colums).columns)
    paribas_data = paribas_data[numerical_columns]
    paribas_data.shape
    
    train_features, test_features, train_labels, test_labels = train_test_split(
        paribas_data.drop(labels=['target', 'ID'], axis=1),
        paribas_data['target'],
        test_size=0.2,
        random_state=41)
    
    correlated_features = set()
    correlation_matrix = paribas_data.corr()
    for i in range(len(correlation_matrix .columns)):
        for j in range(i):
            if abs(correlation_matrix.iloc[i, j]) > 0.8:
                colname = correlation_matrix.columns[i]
                correlated_features.add(colname)
    
    
    train_features.drop(labels=correlated_features, axis=1, inplace=True)
    test_features.drop(labels=correlated_features, axis=1, inplace=True)
    
    train_features.shape, test_features.shape
    

    Implementaci贸n de la selecci贸n de funciones de avance en Python

    Para seleccionar las caracter铆sticas m谩s 贸ptimas, usaremos SequentialFeatureSelector funci贸n de la mlxtend biblioteca. La biblioteca se puede descargar ejecutando el siguiente comando en el s铆mbolo del sistema de anaconda:

    conda install -c conda-forge mlxtend
    

    Usaremos el Clasificador de bosque aleatorio para encontrar los par谩metros m谩s 贸ptimos. Los criterios de evaluaci贸n utilizados ser谩n ROC-AUC. El siguiente script selecciona las 15 caracter铆sticas de nuestro conjunto de datos que producen el mejor rendimiento para el clasificador de bosque aleatorio:

    from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
    from sklearn.metrics import roc_auc_score
    
    from mlxtend.feature_selection import SequentialFeatureSelector
    
    feature_selector = SequentialFeatureSelector(RandomForestClassifier(n_jobs=-1),
               k_features=15,
               forward=True,
               verbose=2,
               scoring='roc_auc',
               cv=4)
    

    En el script de arriba pasamos el RandomForestClassifiercomo estimador de la SequentialFeatureSelector funci贸n. los k_features especifica el n煤mero de funciones a seleccionar. Puede configurar cualquier n煤mero de funciones aqu铆. los forward par谩metro, si se establece en True, realiza la selecci贸n de funciones de avance. los verbose El par谩metro se utiliza para registrar el progreso del selector de funciones, el scoring par谩metro define los criterios de evaluaci贸n del desempe帽o y finalmente, cv se refiere a los pliegues de validaci贸n cruzada.

    Creamos nuestro selector de funciones, ahora necesitamos llamar al fit en nuestro selector de funciones y p谩selo por los conjuntos de entrenamiento y prueba como se muestra a continuaci贸n:

    features = feature_selector.fit(np.array(train_features.fillna(0)), train_labels)
    

    Dependiendo del hardware de su sistema, la secuencia de comandos anterior puede tardar alg煤n tiempo en ejecutarse. Una vez que el script anterior termine de ejecutarse, puede ejecutar el siguiente script para ver las 15 funciones seleccionadas:

    filtered_features= train_features.columns[list(features.k_feature_idx_)]
    filtered_features
    

    En el resultado, deber铆a ver las siguientes caracter铆sticas:

    Index(['v4', 'v10', 'v14', 'v15', 'v18', 'v20', 'v23', 'v34', 'v38', 'v42',
           'v50', 'v51', 'v69', 'v72', 'v129'],
          dtype="object")
    

    Ahora, para ver el rendimiento de clasificaci贸n del algoritmo de bosque aleatorio utilizando estas 15 caracter铆sticas, ejecute el siguiente script:

    clf = RandomForestClassifier(n_estimators=100, random_state=41, max_depth=3)
    clf.fit(train_features[filtered_features].fillna(0), train_labels)
    
    train_pred = clf.predict_proba(train_features[filtered_features].fillna(0))
    print('Accuracy on training set: {}'.format(roc_auc_score(train_labels, train_pred[:,1])))
    
    test_pred = clf.predict_proba(test_features[filtered_features].fillna(0))
    print('Accuracy on test set: {}'.format(roc_auc_score(test_labels, test_pred [:,1])))
    

    En el script anterior, entrenamos nuestro algoritmo de bosque aleatorio en las 15 caracter铆sticas que seleccionamos usando la selecci贸n de caracter铆sticas de avance y luego evaluamos el rendimiento de nuestro algoritmo en los conjuntos de entrenamiento y prueba. En la salida, deber铆a ver los siguientes resultados:

    Accuracy on training set: 0.7072327148174093
    Accuracy on test set: 0.7096973252804142
    

    Puede ver que la precisi贸n en los conjuntos de entrenamiento y prueba es bastante similar, lo que significa que nuestro modelo no est谩 sobreajustado.

    Selecci贸n de funciones de paso hacia atr谩s

    La selecci贸n de funciones de paso hacia atr谩s, como sugiere el nombre, es exactamente lo contrario de la selecci贸n de funciones de paso hacia adelante que estudiamos en la 煤ltima secci贸n. En el primer paso de la selecci贸n de caracter铆sticas del paso hacia atr谩s, se elimina una caracter铆stica del conjunto de caracter铆sticas por turnos y se eval煤a el rendimiento del clasificador.

    Se conserva el conjunto de funciones que produce el mejor rendimiento. En el segundo paso, de nuevo se elimina una caracter铆stica de forma rotatoria y se eval煤a el rendimiento de todas las combinaciones de caracter铆sticas excepto las 2 caracter铆sticas. Este proceso contin煤a hasta que la cantidad especificada de caracter铆sticas permanezca en el conjunto de datos.

    Paso hacia atr谩s en la selecci贸n de caracter铆sticas en Python

    En esta secci贸n, implementaremos la selecci贸n de funciones de paso hacia atr谩s en el Gesti贸n de siniestros de BNP Paribas Cardif. El paso de preprocesamiento seguir谩 siendo el mismo que en la secci贸n anterior. El 煤nico cambio ser谩 en el forward par谩metro de la SequentiaFeatureSelector clase. En el caso de la selecci贸n de la funci贸n de retroceso, configuraremos este par谩metro en False. Ejecute el siguiente script:

    from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
    from sklearn.metrics import roc_auc_score
    from mlxtend.feature_selection import SequentialFeatureSelector
    
    feature_selector = SequentialFeatureSelector(RandomForestClassifier(n_jobs=-1),
               k_features=15,
               forward=False,
               verbose=2,
               scoring='roc_auc',
               cv=4)
    
    features = feature_selector.fit(np.array(train_features.fillna(0)), train_labels)
    

    Para ver la funci贸n seleccionada como resultado de la eliminaci贸n del paso hacia atr谩s, ejecute el siguiente script:

    filtered_features= train_features.columns[list(features.k_feature_idx_)]
    filtered_features
    

    La salida se ve as铆:

    Index(['v7', 'v8', 'v10', 'v17', 'v34', 'v38', 'v45', 'v50', 'v51', 'v61',
           'v94', 'v99', 'v119', 'v120', 'v129'],
          dtype="object")
    

    Finalmente, evaluemos el rendimiento de nuestro clasificador de bosque aleatorio en las caracter铆sticas seleccionadas como resultado de la selecci贸n de caracter铆sticas retrocediendo. Ejecute el siguiente script:

    clf = RandomForestClassifier(n_estimators=100, random_state=41, max_depth=3)
    clf.fit(train_features[filtered_features].fillna(0), train_labels)
    
    train_pred = clf.predict_proba(train_features[filtered_features].fillna(0))
    print('Accuracy on training set: {}'.format(roc_auc_score(train_labels, train_pred[:,1])))
    
    test_pred = clf.predict_proba(test_features[filtered_features].fillna(0))
    print('Accuracy on test set: {}'.format(roc_auc_score(test_labels, test_pred [:,1])))
    

    La salida se ve as铆:

    Accuracy on training set: 0.7095207938140247
    Accuracy on test set: 0.7114624676445211
    

    Puede ver que el rendimiento logrado en el conjunto de entrenamiento es similar al logrado mediante la selecci贸n de funciones de avance. Sin embargo, en el conjunto de prueba, la selecci贸n de funciones hacia atr谩s funcion贸 ligeramente mejor.

    Selecci贸n exhaustiva de funciones

    En una selecci贸n exhaustiva de caracter铆sticas, el rendimiento de un algoritmo de Machine Learning se eval煤a frente a todas las combinaciones posibles de las caracter铆sticas del conjunto de datos. Se selecciona el subconjunto de funciones que ofrece el mejor rendimiento. El algoritmo de b煤squeda exhaustiva es el algoritmo m谩s codicioso de todos los m茅todos de envoltura, ya que prueba todas las combinaciones de funciones y selecciona la mejor.

    Una desventaja de la selecci贸n exhaustiva de funciones es que puede ser m谩s lenta en comparaci贸n con el m茅todo de paso hacia adelante y hacia atr谩s, ya que eval煤a todas las combinaciones de funciones.

    Selecci贸n exhaustiva de funciones en Python

    En esta secci贸n, implementaremos la selecci贸n de funciones de paso hacia atr谩s en el Gesti贸n de siniestros de BNP Paribas Cardif. El paso de preprocesamiento seguir谩 siendo similar al de la selecci贸n de la funci贸n Paso adelante.

    Para implementar una selecci贸n de caracter铆sticas exhaustiva, usaremos ExhaustiveFeatureSelector funci贸n de la mlxtend.feature_selection biblioteca. La clase tiene min_featuresy max_features atributos que se pueden utilizar para especificar el n煤mero m铆nimo y m谩ximo de caracter铆sticas en la combinaci贸n.

    Ejecute el siguiente script:

    from mlxtend.feature_selection import ExhaustiveFeatureSelector
    from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
    from sklearn.metrics import roc_auc_score
    
    feature_selector = ExhaustiveFeatureSelector(RandomForestClassifier(n_jobs=-1),
               min_features=2,
               max_features=4,
               scoring='roc_auc',
               print_progress=True,
               cv=2)
    

    Creamos nuestro selector de funciones, ahora necesitamos llamar al fit en nuestro selector de funciones y p谩sale los conjuntos de entrenamiento y prueba como se muestra a continuaci贸n:

    features = feature_selector.fit(np.array(train_features.fillna(0)), train_labels)
    

    Tenga en cuenta que la secuencia de comandos anterior puede tardar bastante en ejecutarse. Para ver la funci贸n seleccionada como resultado de la eliminaci贸n del paso hacia atr谩s, ejecute el siguiente script:

    filtered_features= train_features.columns[list(features.k_feature_idx_)]
    filtered_features
    

    Finalmente, para ver el rendimiento del clasificador de bosque aleatorio en las caracter铆sticas seleccionadas como resultado de una selecci贸n exhaustiva de caracter铆sticas. Ejecute el siguiente script:

    clf = RandomForestClassifier(n_estimators=100, random_state=41, max_depth=3)
    clf.fit(train_features[filtered_features].fillna(0), train_labels)
    
    train_pred = clf.predict_proba(train_features[filtered_features].fillna(0))
    print('Accuracy on training set: {}'.format(roc_auc_score(train_labels, train_pred[:,1])))
    
    test_pred = clf.predict_proba(test_features[filtered_features].fillna(0))
    print('Accuracy on test set: {}'.format(roc_auc_score(test_labels, test_pred [:,1])))
    

    Conclusi贸n

    Los m茅todos de envoltura son algunos de los algoritmos m谩s importantes que se utilizan para la selecci贸n de funciones para un algoritmo de Machine Learning espec铆fico. En este art铆culo, estudiamos diferentes tipos de m茅todos de envoltura junto con su implementaci贸n pr谩ctica. Estudiamos el paso adelante, el paso atr谩s y m茅todos exhaustivos para la selecci贸n de funciones.

    Como regla general, si el conjunto de datos es peque帽o, el m茅todo de selecci贸n de caracter铆sticas exhaustivo debe ser la elecci贸n; sin embargo, en el caso de conjuntos de datos grandes, se deben preferir los m茅todos de selecci贸n de caracter铆sticas de paso hacia adelante o hacia atr谩s.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *