2016-01-30 3 views
5

Попытка создать дерево решений с перекрестной проверкой с использованием склеры и панадов.перекрестная проверка + деревья решений в sklearn

Мой вопрос приведен в коде ниже, перекрестная проверка разбивает данные, которые затем я использую для обучения и тестирования. Я попытаюсь найти наилучшую глубину дерева, воссоздав его n раз с разными максимальными глубинами. При использовании перекрестной проверки я должен использовать k folds CV, и если да, то как я буду использовать это в коде, который у меня есть?

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 

вот ссылка на данные, которые я использую, в случае, если кто-то поможет. https://archive.ics.uci.edu/ml/datasets/MAGIC+Gamma+Telescope

ответ

14

В вашем коде вы создаете статический тест-тест. Если вы хотите выбрать лучшую глубину путем перекрестной проверки, вы можете использовать sklearn.cross_validation.cross_val_score внутри цикла for.

Для получения дополнительной информации вы можете прочитать sklearn's documentation.

Вот обновление кода с 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) 

В качестве альтернативы, вы можете использовать sklearn.grid_search.GridSearchCV и не писать для цикла самостоятельно, особенно если вы хотите, чтобы оптимизировать для более чем одного гипер-параметра.

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

Это именно то, что я искал; спасибо – razeal113

+1

Приятно слышать это. Можете ли вы принять ответ? – Dimosthenis

+2

+1 для ответа на заданный вопрос, а также предложение поиска сетки, что, безусловно, является лучшей практикой для этого типа проблем. – dsal1951

Смежные вопросы