superi

主にキャリアと金融を嗜むメディア

Python scikit-learnで決定木モデルの性能検証


スポンサーリンク

前回決定木で予測モデルを作成しましたが、機械学習におけるモデルの性能検証について書きたいと思います。

 

www.superi.jp

 データの分割

まず、基本的な考え方としてモデル作成に使う訓練データと検証用のテストデータに分け、 性能検証をします。

いつものirisデータで試してみましょう。

#scikit-learn付属のirisデータを読み込み
from sklearn.datasets import load_iris
iris = load_iris()

検証のためのデータを分割作成するため、scikit-learnのcross_validationクラスを使います。

#交差検証のクラスの読み込み
from sklearn import cross_validation as cv

1.train_test_split

train_test_split関数でデータを分割します。test_sizeでテストに使うデータ量を指定します。

#訓練データとテストデータに分割
X_train, X_test, y_train, y_test \
= cv.train_test_split(iris.data, iris.target, test_size=0.4, random_state=0)

trainデータでモデルを学習し、testデータでモデルを評価します。

from sklearn import tree

clf = tree.DecisionTreeClassifier(max_depth=3)
clf = clf.fit(X_train, y_train)
clf.score(X_test,y_test)

0.94999999999999996

2.cross_val_score

cross_val_score関数を使うとsplitとモデル作成をまるっと出してくれます。

cv=5はデータの分割数で、分割したデータごとの評価値(正答率)を返してくれます。

なので、その平均値をモデルの評価とします。

clf_cvs = tree.DecisionTreeClassifier(max_depth=3)
scores = cv.cross_val_score(clf_cvs, iris.data, iris.target, cv=5)
print(scores)
print(scores.mean())

[ 0.96666667 0.96666667 0.93333333 1. 1. ]
0.973333333333

3.KFold

K-分割交差検証です。データをk分割のデータセットに分け、そのうちの一つをテストデータに、それ以外を訓練データにしてモデルを評価します。さらにこれを別のセグメントをテストデータとし、モデル評価・・・というのをK回行い、その平均値をモデルの性能とします。

f:id:ukichang:20160706003834p:plain

(※引用 Machine Learning FAQ)

KFold関数を使うことで実現できます。n_foldsで分割数を指定します。shuffleは分割前にデータをシャッフルしておくことで、データの偏りによる精度のバラツキを防ぎます。

kf = cv.KFold(150, n_folds=3,shuffle=True)
X = iris.data
y = iris.target
for train, test in kf:
X_train, y_train, X_test, y_test = X[train], y[train], X[test], y[test]
clf = tree.DecisionTreeClassifier(max_depth=3).fit(X_train, y_train)
score = clf.score(X_test, y_test)
print(score)
scores += score
scores/3

0.88
0.98
0.96
0.93999999999999995

いずれにせよ、性能検証にはkfoldが一般的でこちらを使っておけば無難でしょう。

 

参考

3.1. Cross-validation: evaluating estimator performance — scikit-learn 0.17.1 documentation

scikit-learnでCross Validation - Qiita

テキスト分類問題その1 チュートリアル|ビッグデータ大学(β)