web-dev-qa-db-fra.com

validation croisée + arbres de décision dans sklearn

Tentative de création d'un arbre de décision avec validation croisée à l'aide de sklearn et de panads.

Ma question est dans le code ci-dessous, la validation croisée divise les données, que j'utilise ensuite pour la formation et les tests. J'essaierai de trouver la meilleure profondeur de l'arbre en le recréant n fois avec différentes profondeurs maximales définies. En utilisant la validation croisée, devrais-je plutôt utiliser k pli CV et si oui, comment pourrais-je l'utiliser dans le code que j'ai?

import numpy as np
import pandas as pd
from sklearn import tree
from sklearn import cross_validation

features = ["fLength", "fWidth", "fSize", "fConc", "fConc1", "fAsym", "fM3Long", "fM3Trans", "fAlpha", "fDist", "class"]

df = pd.read_csv('magic04.data',header=None,names=features)

df['class'] = df['class'].map({'g':0,'h':1})

x = df[features[:-1]]
y = df['class']

x_train,x_test,y_train,y_test = cross_validation.train_test_split(x,y,test_size=0.4,random_state=0)

depth = []
for i in range(3,20):
    clf = tree.DecisionTreeClassifier(max_depth=i)
    clf = clf.fit(x_train,y_train)
    depth.append((i,clf.score(x_test,y_test)))
print depth

voici un lien vers les données que j'utilise au cas où cela aiderait quelqu'un. https://archive.ics.uci.edu/ml/datasets/MAGIC+Gamma+Telescope

15
razeal113

Dans votre code, vous créez une division statique des tests de formation. Si vous souhaitez sélectionner la meilleure profondeur par validation croisée, vous pouvez utiliser sklearn.cross_validation.cross_val_score à l'intérieur de la boucle for.

Vous pouvez lire documentation de sklearn pour plus d'informations.

Voici une mise à jour de votre code avec CV:

import numpy as np
import pandas as pd
from sklearn import tree
from sklearn.cross_validation import cross_val_score
from pprint import pprint

features = ["fLength", "fWidth", "fSize", "fConc", "fConc1", "fAsym", "fM3Long", "fM3Trans", "fAlpha", "fDist", "class"]

df = pd.read_csv('magic04.data',header=None,names=features)
df['class'] = df['class'].map({'g':0,'h':1})

x = df[features[:-1]]
y = df['class']

# x_train,x_test,y_train,y_test = cross_validation.train_test_split(x,y,test_size=0.4,random_state=0)
depth = []
for i in range(3,20):
    clf = tree.DecisionTreeClassifier(max_depth=i)
    # Perform 7-fold cross validation 
    scores = cross_val_score(estimator=clf, X=x, y=y, cv=7, n_jobs=4)
    depth.append((i,scores.mean()))
print(depth)

Vous pouvez également utiliser sklearn.grid_search.GridSearchCV et ne pas écrire la boucle for vous-même, surtout si vous souhaitez optimiser plusieurs hyperparamètres.

import numpy as np
import pandas as pd
from sklearn import tree
from sklearn.model_selection import GridSearchCV

features = ["fLength", "fWidth", "fSize", "fConc", "fConc1", "fAsym", "fM3Long", "fM3Trans", "fAlpha", "fDist", "class"]

df = pd.read_csv('magic04.data',header=None,names=features)
df['class'] = df['class'].map({'g':0,'h':1})

x = df[features[:-1]]
y = df['class']


parameters = {'max_depth':range(3,20)}
clf = GridSearchCV(tree.DecisionTreeClassifier(), parameters, n_jobs=4)
clf.fit(X=x, y=y)
tree_model = clf.best_estimator_
print (clf.best_score_, clf.best_params_) 

Modifier: a changé la façon dont GridSearchCV est importé pour tenir compte du commentaire de learn2day.

21
Dimosthenis