[PYTHON] [Apprentissage automatique] Sélection de fonctionnalités de variables catégorielles à l'aide du test du chi carré

introduction

Pendant ce temps, j'ai obtenu le niveau 2 du test statistique, et dans le cadre de la préparation du test, j'ai étudié une méthode statistique appelée «test du chi carré». Je me suis demandé si ce "test du chi carré" serait utile pour sélectionner les quantités de fonctionnalités dans l'apprentissage automatique, et j'ai constaté qu'il était déjà implémenté dans Select KBest de scicit-learn, donc j'aimerais noter comment l'utiliser.

Qu'est-ce que le test du chi carré?

Aussi connu sous le nom de «test d'indépendance», il sert à tester que l'événement A et l'événement B sont «indépendants».

En supposant que l'événement A et l'événement B sont indépendants, vérifiez dans quelle mesure la valeur mesurée est "impossible" et "impossible" = "l'événement A et l'événement B ne sont pas indépendants et ont une certaine relation" Je crois comprendre que c'est un test de cela.

Les sites suivants seront très utiles pour une explication un peu plus détaillée.

Test d'indépendance - Test du chi carré le plus populaire (Statistics WEB)

Comparaison de l'exemple d'implémentation Python et du taux de réponse correct

Données utilisées cette fois

Utilisez les données suivantes, y compris les données catégorielles dans les variables explicatives. Ces données enregistrent si le revenu annuel d'une personne dépasse 50K, ainsi que des informations telles que l'âge, la profession et le sexe de la personne.

Nom des données Adult Data Set
URL https://archive.ics.uci.edu/ml/datasets/adult
Le nombre de données 32561

Enregistrez le code pour lire les données ci-dessous. Étant donné que le test du chi carré sert à tester dans quelle mesure la fréquence d'une certaine quantité d'entités s'écarte de la valeur attendue, les données numériques (données quantitatives) sont exclues et l'apprentissage est effectué en utilisant uniquement des données de catégorie.

from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np

#Lecture des données et spécification des noms de colonne
#Lecture et traitement des données
columns=['age','workclass','fnlwgt','education','education-num',
 'marital-status','occupation','relationship','race','sex','capital-gain',
 'capital-loss','hours-per-week','native-country','Income']
data = pd.read_csv('adult.data.csv', header=None).sample(frac=1).dropna()
data.columns=columns
print(data.shape)
data = data.replace({' <=50K':0,' >50K':1})
data.head()


#Variable explicative(Données de catégorie)Et séparés par variable objectif
data_x = data[['workclass','education','marital-status','occupation','relationship','race','sex','native-country']]
data_y = data['Income']

#Les données de catégorie sont une variable factice
data_dm = pd.get_dummies(data_x)

#Divisé en données d'entraînement et données de test
X_train, X_test, Y_train, Y_test = train_test_split(data_dm, data_y, train_size=0.7)

Lorsque le montant de la fonction n'est pas sélectionné

Tout d'abord, vérifions le résultat lorsque la quantité de caractéristiques n'est pas sélectionnée, c'est-à-dire lorsque le modèle est entraîné en utilisant toutes les quantités de caractéristiques.

Le modèle utilisé cette fois est le renforcement du gradient, et il est entraîné par défaut sans réglage des paramètres.

from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import GradientBoostingClassifier
from imblearn.pipeline import Pipeline 

scaler = StandardScaler()
clf = GradientBoostingClassifier()

#Une série de traitements(Pipeline)Définir
#Standardisation → formation des discriminateurs
estimator = [
    ('scaler',scaler),
    ('clf',clf)
]

pipe = Pipeline(estimator)
pipe.fit(X_train, Y_train)
print('Taux de réponse correct: ' + str(pipe.score(X_test, Y_test)))

Taux de réponse correcte: 0,828743986078

Je n'ai fait aucun réglage des paramètres, donc c'est précis. Ensuite, regardons les résultats lorsque la sélection de la quantité d'entités à l'aide du test du chi carré est effectuée.

Sélection de fonctionnalités à l'aide du test du chi carré

La sélection des fonctionnalités par test du chi carré peut être facilement implémentée en utilisant "SelectKBest" de scikit-learn. Je vais.

Cette classe réduit le nombre d'entités en fonction de l'indice d'évaluation spécifié par le paramètre score_func. La méthode utilisée est l'ajustement / transformation habituelle. Le nombre d'entités après réduction peut être spécifié par le paramètre k.

Il existe plusieurs indices d'évaluation qui peuvent être sélectionnés, mais comme le test du chi carré est utilisé ici, «chi2» est spécifié.

Nous formons d'abord toutes les fonctionnalités, puis réduisons les fonctionnalités une par une, et terminons l'itération lorsque le taux de réponse correct du modèle commence à baisser. (Il semble que ce soit une méthode appelée "Élimination des fonctionnalités vers l'arrière")

from sklearn.feature_selection import SelectKBest, chi2
max_score = 0
for k in range(len(data_dm.columns)):
    print(len(data_dm.columns)-k)
    select = SelectKBest(score_func=chi2, k=len(data_dm.columns)-k) 
    scaler = StandardScaler()
    clf = GradientBoostingClassifier()

    #Une série de traitements(Pipeline)Définir
    #Extraction de fonctionnalités → standardisation → formation des classificateurs
    estimator = [
        ('select',select),
        ('scaler',scaler),
        ('clf',clf)
    ]

    pipe_select = Pipeline(estimator)
    pipe_select.fit(X_train, Y_train)
    score = pipe_select.score(X_test, Y_test)
    if score < max_score:
        break
    else:
        max_score = score
        pipe_fix = pipe_select

print('Taux de réponse correct: ' + str(pipe_fix.score(X_test, Y_test)))

Taux de réponse correct: 0,828948715324

Le taux de réponse correcte a légèrement augmenté. Il semble que les données d'origine contenaient des caractéristiques inutiles, et il semble que les caractéristiques pourraient être exclues en sélectionnant les caractéristiques par le test du chi carré.

En passant, les fonctionnalités exclues peuvent être confirmées ci-dessous.

mask = -pipe_fix.steps[0][1].get_support()
data_dm.iloc[:,mask].columns

Index(['native-country_ Greece', 'native-country_ Holand-Netherlands','native-country_ Thailand'],dtype='object')

Sélection de fonctionnalités basée sur un modèle

À titre de comparaison, je présenterai également une autre méthode de sélection des quantités de caractéristiques. Certains modèles utilisés dans l'apprentissage automatique conservent les fonctionnalités qui contribuent considérablement à la précision. Par exemple, régression Lasso, régression Ridge. Ici, jetons un œil à un exemple d'implémentation de la sélection de fonctionnalités par Random Forest et le résultat.

from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier

select = SelectFromModel(RandomForestClassifier(n_estimators=100, n_jobs=-1))
scaler = StandardScaler()
clf = GradientBoostingClassifier()

#Une série de traitements(Pipeline)Définir
#Extraction de fonctionnalités → standardisation → formation des classificateurs
estimator = [
    ('select',select),
    ('scaler',scaler),
    ('clf',clf)
]

pipe_rf = Pipeline(estimator)
pipe_rf.fit(X_train, Y_train)
print('Taux de réponse correct: ' + str(pipe_rf.score(X_test, Y_test)))

Taux de réponse correcte: 0,826287235132

Le taux de précision est plus faible que lorsque toutes les fonctionnalités sont utilisées.

Je pense que la précision n'est pas bonne car les paramètres du modèle utilisé pour la sélection des fonctionnalités ne sont pas réglés. Ce n'est pas le sujet principal, je ne vais donc pas approfondir cet article.

Résumé

Dans cet article, j'ai présenté une brève explication du test du chi carré et un exemple d'implémentation à l'aide de Select KBest. Ma compréhension actuelle est que la sélection de la quantité d'entités par le test du chi carré n'est valide que pour les problèmes de classification car la quantité d'entités est des données catégoriques. Pour les quantités d'entités qui incluent des données numériques ou pour les problèmes de régression, utilisez la sélection de quantité d'entités basée sur des indicateurs d'évaluation tels que le coefficient de corrélation de Pearson et l'ANOVA. (À propos, j'utilise souvent la sélection de quantité d'entités par forêt aléatoire, ce qui est facile à utiliser indépendamment des données de catégorie ou des données numériques.)

finalement

Si vous avez des questions ou des préoccupations concernant la description, veuillez commenter.

[Annexe 1] Raison de la création d'une variable fictive avant l'ajustement à SelectKBest

Document de chi2 spécifié par score_func de SelectKBest (sklearn.feature_selection.chi2 ), Vous trouverez la description suivante.

X : {array-like, sparse matrix}, shape = (n_samples, n_features_in)

Les données passées en tant que paramètres sont écrites sous forme de tableau fragmenté, c'est-à-dire un tableau avec la plupart des éléments 0.

Si vous lisez la source, vous pouvez voir qu'il existe un code comme le suivant, qui calcule la valeur totale de chaque colonne, c'est-à-dire la fréquence de sa quantité d'entités. Pour effectuer ce calcul, vous pouvez voir qu'une erreur se produit si vous transmettez les données comprenant la chaîne de caractères avant d'en faire une variable factice en tant que paramètre.

feature_count = X.sum(axis=0).reshape(1, -1)

De plus, même si la quantité d'entités contient des données numériques (données quantitatives), aucune erreur ne se produira, mais un calcul mystérieux sera effectué. (Par exemple, s'il existe une quantité caractéristique d'âge, l'âge total de toutes les lignes sera calculé et reconnu comme une fréquence)

[Annexe 2] Confirmation de la quantité de fonctionnalités sélectionnée par Select KBest

Après l'ajustement, l'instance SelectKBest aura une liste des fonctionnalités sélectionnées avec la méthode get_support (). Lorsque la méthode de transformation est exécutée, il semble que la quantité de caractéristiques dont le masque est True est sélectionnée et renvoyée à partir des quantités de caractéristiques des données d'entrée.

La source suivante est un exemple d'implémentation lorsque le nombre d'entités est réduit à 10.

from sklearn.feature_selection import SelectKBest, chi2
select = SelectKBest(score_func=chi2, k=10) 
select.fit(X_train, Y_train)

mask = select.get_support()
mask

array([ True, True, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], dtype=bool)

Vous pouvez vérifier le montant de fonction que vous avez sélectionné avec le code suivant, par exemple.

data_dm.iloc[:,mask].columns

Index(['age', 'fnlwgt', 'education-num', 'capital-gain', 'capital-loss','hours-per-week', 'marital-status_ Married-civ-spouse','marital-status_ Never-married', 'relationship_ Husband','relationship_ Own-child'],dtype='object')

Recommended Posts

[Apprentissage automatique] Sélection de fonctionnalités de variables catégorielles à l'aide du test du chi carré
Essayez d'utiliser le bloc-notes Jupyter à partir d'Azure Machine Learning
Raisonnement causal utilisant l'apprentissage automatique (organisation des méthodes de raisonnement causal)
Bases de l'apprentissage automatique (mémoire)
Importance des ensembles de données d'apprentissage automatique
Apprentissage automatique avec python sans perdre aux variables catégorielles (conversion de variable factice)
Importance de l'apprentissage automatique et de l'apprentissage par mini-lots
Apprentissage automatique ③ Résumé de l'arbre de décision
Développement d'applications à l'aide d'Azure Machine Learning
Procédure d'apprentissage automatique de base: ③ Comparez et examinez la méthode de sélection de la quantité de caractéristiques
Algorithme d'apprentissage automatique (généralisation de la régression linéaire)
Prévision du cours des actions à l'aide de l'apprentissage automatique (scikit-learn)
Exemple d'utilisation de variables de classe et de méthodes de classe
[Apprentissage automatique] Classification des sujets LDA à l'aide de scikit-learn
[Apprentissage automatique] Prédiction FX à l'aide de l'arbre de décision
20 sélections recommandées en 2020 de livres d'introduction à l'apprentissage automatique
Algorithme d'apprentissage automatique (implémentation de la classification multi-classes)
Unité 5 Ingénierie des fonctionnalités pour la sélection des fonctionnalités d'apprentissage automatique
[Apprentissage automatique] Apprentissage supervisé utilisant l'estimation de la densité du noyau
Prévision du cours des actions à l'aide de l'apprentissage automatique (édition de retour)
[Apprentissage automatique] Liste des packages fréquemment utilisés
[Apprentissage automatique] Analyse de régression à l'aide de scicit learn
[Super Introduction] Apprentissage automatique utilisant Python - De la construction d'environnement à l'implémentation de perceptron simple-
Apprentissage automatique: reconnaissance d'image de MNIST à l'aide de PCA et de Gaussian Native Bayes
Un mémorandum de méthode souvent utilisé dans l'apprentissage automatique utilisant scikit-learn (pour les débutants)