概要
sklearnで書籍やネットに掲載されているコードを実行した結果、表題のようなエラーが出ることがある。
一例をあげる。
>>> from sklearn.cross_validation import cross_val_score Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named 'sklearn.cross_validation'
こういうエラーが出たときの対処について説明する。
スポンサーリンク
原因
sklearnのバージョンの不一致が原因。
sklearn 0.20からcross_validationモジュールは消滅し、代わりにmodel_selectionモジュールを使うことになった。
(model_selectionモジュール自体は0.19とかでも存在する)
なお、sklearnのバージョンは次のようなコマンドで確認できる。ただし、環境によっては微妙にコマンドが違う可能性もある(pip3だったりcondaだったり。常識的なことだが、念のために書いておく)。
$ pip show scikit-learn Name: scikit-learn Version: 0.20.0 # バージョン Summary: A set of python modules for machine learning and data mining Home-page: http://scikit-learn.org Author: None Author-email: None License: new BSD Location: *** # インストール先 Requires: numpy, scipy Required-by: sklearn
対処
基本的にはcross_validationモジュールに存在した関数・クラス等はmodel_selectionモジュールに移動している。なので、以下のように書き換えれば正常に動作する。
# 古い書き方 from sklearn.cross_validation import cross_val_score # 新しい書き方 from sklearn.model_selection import cross_val_score
ただし、一部で使い方の変わっているクラスなどがあるので注意。KFoldクラスが例として挙げられる。変更点はドキュメントを見て確認する必要がある。
class sklearn.cross_validation.KFold(n, n_folds=3, shuffle=False, random_state=None)sklearn.cross_validation.KFold — scikit-learn 0.19.2 documentation
class sklearn.model_selection.KFold(n_splits=’warn’, shuffle=False, random_state=None)sklearn.model_selection.KFold — scikit-learn 0.20.2 documentation
ところで実際問題として、cross_validationモジュールが将来的に消滅することは数年前からの規定事項だったので、cross_validationモジュールを使っている書籍やサイトは情報が古いと言わざるを得ない。なので、場合によっては、その情報源は切り捨てる(使いものにならないとみなす)ことも考慮する。
どうしてもコードを書き換えないで使いたければ、古いバージョンのsklearnにダウングレードするという手はある。おすすめはできないが、一つの方法ではある。
$ pip uninstall scikit-learn $ pip install scikit-learn==0.19
まとめ
機械学習が流行り始めてから5年くらいは経っているので、そろそろ古い情報に惑わされる人も増えてきていると思う。
どんなことにも言えるけど、情報の鮮度を意識することが重要。