2016-01-30 11 views
5

Versuch, einen Entscheidungsbaum mit Kreuzvalidierung mit sklearn und panads zu erstellen.Kreuzvalidierung + Entscheidungsbäume in sklearn

Meine Frage ist in dem Code unten, die Kreuzvalidierung teilt die Daten, die ich dann für Training und Tests verwenden. Ich werde versuchen, die beste Tiefe des Baumes zu finden, indem ich ihn n mal mit verschiedenen maximalen Tiefen neu erstelle. Bei Verwendung der Kreuzvalidierung sollte ich stattdessen k falten CV verwenden und wenn ja, wie würde ich das innerhalb des Codes verwenden, den ich habe?

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 

Hier ist ein Link zu den Daten, die ich benutze, falls das jemand hilft. https://archive.ics.uci.edu/ml/datasets/MAGIC+Gamma+Telescope

Antwort

14

In Ihrem Code erstellen Sie einen statischen Trainingstest-Split. Wenn Sie die beste Tiefe durch Kreuzvalidierung auswählen möchten, können Sie innerhalb der for-Schleife sklearn.cross_validation.cross_val_score verwenden.

Sie können sklearn's documentation für weitere Informationen lesen. Hier

ist ein Update des Codes mit 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) 

Alternativ können Sie sklearn.grid_search.GridSearchCV verwenden und nicht schreiben die for-Schleife selbst, vor allem, wenn Sie für mehr als einen Hyper-Parameter optimieren möchten.

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

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 = grid_search.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_) 
+0

Dies war genau das, was ich suchte; danke – razeal113

+1

Gut zu hören. Kannst du die Antwort akzeptieren? – Dimosthenis

+2

+1 für die Beantwortung der gestellten Frage und auch vorschlagen Gitter Suche, die ist definitiv die bessere Praxis für diese Art von Problem – dsal1951

Verwandte Themen