静かなる名辞

pythonとプログラミングのこと



ImportError: No module named 'sklearn.cross_validation'の対処

概要

 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.1 documentation

 ところで実際問題として、cross_validationモジュールが将来的に消滅することは数年前からの規定事項だったので、cross_validationモジュールを使っている書籍やサイトは情報が古いと言わざるを得ない。なので、場合によっては、その情報源は切り捨てる(使いものにならないとみなす)ことも考慮する。

 どうしてもコードを書き換えないで使いたければ、古いバージョンのsklearnにダウングレードするという手はある。おすすめはできないが、一つの方法ではある。

$ pip uninstall scikit-learn
$ pip install scikit-learn==0.19

まとめ

 機械学習が流行り始めてから5年くらいは経っているので、そろそろ古い情報に惑わされる人も増えてきていると思う。

 どんなことにも言えるけど、情報の鮮度を意識することが重要。