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.
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)
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)
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.
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')
À 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.
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.)
Si vous avez des questions ou des préoccupations concernant la description, veuillez commenter.
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)
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