備忘録的な

プログラミングや機械学習に関する備忘録

scikit-learnのStratifiedKFoldの結果が0.19とそれ以前で変わる件

scikit-learnのStratifiedKFoldが0.18.2から0.19.0への変更で、実行結果が異なるようになりました。
それも、shuffle=Trueとしたときだけです。
StratifiedKFoldは識別の際にラベルの数の偏りを考慮した分割をするため有用ですが、
このことを覚えておいた方がよさそうです。

0.18.1 0.18.2 0.19.0
KFold 0.96 0.96 0.96
KFold(shuffle) 0.9533333 0.9533333 0.9533333
cross_val_score 0.9599673 0.9599673 0.9599673
StratifiedKFold 0.9599673 0.9599673 0.9599673
StratifiedKFold(shuffle) 0.9603758 0.9603758 0.9665033

検証用コードはこちら

from sklearn.utils import shuffle
from sklearn.datasets import load_iris
from sklearn.svm import LinearSVC
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold, StratifiedKFold

iris = load_iris()
X, y = shuffle(iris.data, iris.target, random_state=0)

clf = LinearSVC(random_state=0)

score = cross_val_score(clf, X, y, cv=KFold()).mean()
print('KFold: {s}'.format(s=score))

score = cross_val_score(clf, X, y, cv=KFold(shuffle=True, random_state=0)).mean()
print('KFold (shuffle): {s}'.format(s=score))

score = cross_val_score(clf, X, y).mean()
print('cross_val_score: {s}'.format(s=score))

score = cross_val_score(clf, X, y, cv=StratifiedKFold()).mean()
print('StratifiedKFold: {s}'.format(s=score))

score = cross_val_score(clf, X, y, cv=StratifiedKFold(shuffle=True, random_state=0)).mean()
print('StratifiedKFold (shuffle): {s}'.format(s=score))