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))