Sklearnとpanadsを使用して、相互検証付きの決定木を作成しようとしています。
私の質問は以下のコードにあります。相互検証はデータを分割し、トレーニングとテストの両方に使用します。異なる最大深度を設定してn回再作成することにより、ツリーの最良の深度を見つけようとします。交差検証を使用する場合、代わりにkフォールド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
コードでは、静的なトレーニングテストの分割を作成しています。相互検証によって最適な深度を選択する場合は、forループ内でsklearn.cross_validation.cross_val_score
を使用できます。
詳細については、 sklearnのドキュメント を参照してください。
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
を使用して、自分でforループを記述しないこともできます。特に、複数のハイパーパラメーター用に最適化する場合は注意してください。
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_)
Edit:learn2dayのコメントに対応するために、GridSearchCVのインポート方法を変更しました。