Python scikit-learnで決定木モデルの性能検証
前回決定木で予測モデルを作成しましたが、機械学習におけるモデルの性能検証について書きたいと思います。
データの分割
まず、基本的な考え方としてモデル作成に使う訓練データと検証用のテストデータに分け、 性能検証をします。
いつもの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回行い、その平均値をモデルの性能とします。
(※引用 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/30.88
0.98
0.96
0.93999999999999995
いずれにせよ、性能検証にはkfoldが一般的でこちらを使っておけば無難でしょう。
参考
3.1. Cross-validation: evaluating estimator performance — scikit-learn 0.17.1 documentation