Pythonで始める機械学習でお勉強中にFutureWarningに遭遇しました。GroupKFoldで起こったのですが、とりあえず今は使えるもののこの先使えなくなることが示されているので修正します。
FutureWarningを発生させてみる
少し前の書籍の型に合わせてコードを書いてみます。FutureWarningが発生するはずです。
@python
from sklearn.model_selection import GroupKFold # グループ交差検証
from sklearn.datasets import make_blobs # 合成データ生成
# 合成データセットを生成
X, y = make_blobs(n_samples=10, random_state=0)
# 最初の2サンプルが同じグループに、次の4つが同じグループに
groups = [0, 0, 1, 1, 1, 1, 3, 3, 4, 4]
scores = cross_val_score(logreg, X, y, groups, cv=GroupKFold(n_splits=3))
print("Cross-validation scores:\n{}".format(scores))
おそらくこの型が少し前の技術書の仕様だと思います。Pythonで始める機械学習もこの型でした。
結果をみてみます。
Cross-validation scores:
[0.5 1. 1. ]
/Users/user/opt/anaconda3/envs/ML/lib/python3.6/site-packages/sklearn/utils/validation.py:71:
FutureWarning: Pass groups=[0, 0, 1, 1, 1, 1, 3, 3, 4, 4] as keyword args.
From version 0.25 passing these as positional arguments will result in an error
FutureWarning)
こんな感じのWarningが発生します。
最後の方を読んでみると、バージョン0.25からはgroups配列は位置引数としてだとエラーになるよみたいな感じのことを言っています。改善方法は至ってシンプルです。
次に示します。
改善策
改善策は至ってシンプルです。
**groups=(グループ配列)**にすればいいのです。直したコードを示します。
@python
from sklearn.model_selection import GroupKFold # グループ交差検証
from sklearn.datasets import make_blobs # 合成データ生成
# 合成データセットを生成
X, y = make_blobs(n_samples=10, random_state=0)
# 最初の2サンプルが同じグループに、次の4つが同じグループに
groups = [0, 0, 1, 1, 1, 1, 3, 3, 4, 4]
scores = cross_val_score(logreg, X, y, groups=groups, cv=GroupKFold(n_splits=3))
print("Cross-validation scores:\n{}".format(scores))
直したのはこの部分
scores = cross_val_score(logreg, X, y, groups=groups, cv=GroupKFold(n_splits=3))
単にgroups=groupsにするだけです。これだけで直ります。
やはりFutureWarningが多いですね〜この周りは。