僕の世界観を変えてみる

文系男子が趣味でプログラミングを勉強していくブログです。他にも日常で起きたどうでもいいことや愚痴を書いていきたいです。座右の銘は和を以て貴しとなすです。仲良くやろうよ。

【python】scikit-learnのImportErrorが出たのでAnacondaを再インストールした(泣く)

f:id:htmllifehack:20180924193853j:plain

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をクリックしてから編集ボタンをクリックで追加できます。

f:id:htmllifehack:20180924211927j:plain

追加したpathも削除したけどimportErrorが出たのでpathも原因ではなさそうだけどわからないな。

まとめ:なんでもかんでもAnaconda

余談だがpython入門とかで検索するとだいたいのページで書かれているのは”とりあえずAnacondaインストール!”

Anacondaには機械学習に必要なパッケージなどさまざまなパッケージがもともとインストールされているので初心者に最適!などとかかれている。

そんななか”なんでもかんでもAnacondaするのは間違っている”と否定派の意見も書かれていた。

僕ならpythonを始めてみたいって人には同じようにAnacondaをすすめるけどなあ、と当時は考えていた。

しかし今回のことがあって正直どっちがいいのかわからなくなった。

Anacondaを入れることでpipも使えるようになってしまうわけだし、そもそもパッケージの管理ソフトはpipみたいなところもある。

じゃcondaでもpipでもどっちを使ってもいいんじゃないかって考えが今回の事件の原因なんじゃなかろうか。

まあ、はっきりとしたことは不明だがPC買い替えたらpythonとpipでやろうかなあとは考えています。

ちなみに、Anacondaのアンインストールめちゃくちゃ時間かかるよ。

なんだかはっきりしない内容の記事でごめんね。