【python】scikit-learnのImportErrorが出たのでAnacondaを再インストールした(泣く)
scikit-learnを久しぶりに使ってみたら動かなくなっていた。
そんな経験はございませんか?
私はありますう。
それはつい昨日のこと。
出先ではMacを使ってsklearnでいろいろやっていたので、家に帰ってから続きをやろうとwindowsでjupyter notebookを開いたのです。
するとどうでしょう、なぜか”指定されたモジュールが見つかりません”と出るんですね。
久しぶりにやる気がでたと思ったらこれですよまったく。
指定されたモジュールが見つかりません
エラーの全文はこれ
--------------------------------------------------------------------------- ImportError Traceback (most recent call last) <ipython-input-3-986fd6b1446a> in <module>() ----> 1 from sklearn.linear_model import LogisticRegression 2 from sklearn.model_selection import cross_val_score, train_test_split 3 from sklearn import metrics ~\Anaconda3\lib\site-packages\sklearn\__init__.py in <module>() 132 else: 133 from . import __check_build --> 134 from .base import clone 135 __check_build # avoid flakes unused variable error 136 ~\Anaconda3\lib\site-packages\sklearn\base.py in <module>() 11 from scipy import sparse 12 from .externals import six ---> 13 from .utils.fixes import signature 14 from . import __version__ 15 ~\Anaconda3\lib\site-packages\sklearn\utils\__init__.py in <module>() 8 9 from .murmurhash import murmurhash3_32 ---> 10 from .validation import (as_float_array, 11 assert_all_finite, 12 check_random_state, column_or_1d, check_array, ~\Anaconda3\lib\site-packages\sklearn\utils\validation.py in <module>() 16 17 from ..externals import six ---> 18 from ..utils.fixes import signature 19 from .. import get_config as _get_config 20 from ..exceptions import NonBLASDotWarning ~\Anaconda3\lib\site-packages\sklearn\utils\fixes.py in <module>() 142 from ._scipy_sparse_lsqr_backport import lsqr as sparse_lsqr 143 else: --> 144 from scipy.sparse.linalg import lsqr as sparse_lsqr # noqa 145 146 ~\Anaconda3\lib\site-packages\scipy\sparse\linalg\__init__.py in <module>() 112 from __future__ import division, print_function, absolute_import 113 --> 114 from .isolve import * 115 from .dsolve import * 116 from .interface import * ~\Anaconda3\lib\site-packages\scipy\sparse\linalg\isolve\__init__.py in <module>() 4 5 #from info import __doc__ ----> 6 from .iterative import * 7 from .minres import minres 8 from .lgmres import lgmres ~\Anaconda3\lib\site-packages\scipy\sparse\linalg\isolve\iterative.py in <module>() 8 import numpy as np 9 ---> 10 from . import _iterative 11 12 from scipy.sparse.linalg.interface import LinearOperator ImportError: DLL load failed: 指定されたモジュールが見つかりません
もう最初からsklearnのimportErrorのようなので、もしかしたらsklearnのversionが上がってから書き方が多少かわったからそれかなー?なんて考えていたけど甘かった。
結論からいうとAnacondaの再インストール
困ったときのStackOverflowやいろいろなサイトに書かれていたように試してみたけどダメだったのだ。
おそらく原因はcondaとpipの衝突か、pathいじったからか、どちらか。
condaとpipの衝突について詳しく知りたい人はこちらのブログを。
▼condaとpip:混ぜるな危険 - onoz000’s blog
どうやら双方でパッケージ名が異なる場合があったり、お互いのパッケージを読み込んでいたり、condaのパッケージが上書きされてしまったりいろいろあるらしい。
そのほかの対処法
sklearnに必要なnumpyやscipyのアップデートをすることで改善されたというような記事を見つけた。
StackOverflowにもnumpyやscipyとmklの更新/インストールで解決したとも書かれていた。
mklとはインテルの数値演算モジュールのことらしい。
sklearnのアップデートでまとめてアップデートする。
C:\ > conda update scikit-learn
これでScikit-learnのバージョンを最新(0.19.2)にする。
ついでにnumpyやscipyなども一緒にアップデートされる。
conda updateを使ってscikit-learnをアップデートしたが僕はこれでは解決しなかった。
なのでpipでもアップデートしてみたんだ。
scikit-learnはpipでもcondaでもscikit-learnだから大丈夫だと思うけどcondaとpipの衝突もありえるのでやらないほうがいいかも?
環境変数のpathを追加したことが原因?
確証はないんだけど、数日前にpathを追加したんだ。
もともとpathを追加しないとpythonのパッケージを読み込めないらしんだけどAnaconda入れたときは何もしなくてもちゃんと読めていたからpathは追加していなかった。
それまでずっとcondaでインストールしていたんだけどどうしてもpipを使いたいってときあるじゃん?
なのでpath、追加してみました。
一応追加方法としてはコンパネ→システムとセキュリティ→システムの詳細設定→環境変数→pathをクリックしてから編集ボタンをクリックで追加できます。
追加したpathも削除したけどimportErrorが出たのでpathも原因ではなさそうだけどわからないな。
まとめ:なんでもかんでもAnaconda
余談だがpython入門とかで検索するとだいたいのページで書かれているのは”とりあえずAnacondaインストール!”
Anacondaには機械学習に必要なパッケージなどさまざまなパッケージがもともとインストールされているので初心者に最適!などとかかれている。
そんななか”なんでもかんでもAnacondaするのは間違っている”と否定派の意見も書かれていた。
僕ならpythonを始めてみたいって人には同じようにAnacondaをすすめるけどなあ、と当時は考えていた。
しかし今回のことがあって正直どっちがいいのかわからなくなった。
Anacondaを入れることでpipも使えるようになってしまうわけだし、そもそもパッケージの管理ソフトはpipみたいなところもある。
じゃcondaでもpipでもどっちを使ってもいいんじゃないかって考えが今回の事件の原因なんじゃなかろうか。
まあ、はっきりとしたことは不明だがPC買い替えたらpythonとpipでやろうかなあとは考えています。
ちなみに、Anacondaのアンインストールめちゃくちゃ時間かかるよ。
なんだかはっきりしない内容の記事でごめんね。