この記事では、特定のエラーについてピンポイントで解決方法をご紹介します。
執筆時点(2023年2月21日)の情報です。
今後は変わる可能性があることをご理解ください。
また、sklearn(scikit-learn)のバージョンは「1.2.0」で検証していますが、実はあまり関係ありません。
エラーの概要と経緯
機械学習のスクリプトで学習済みデータを保存する際、joblibライブラリをインポートしようとしたらエラーが出ました。
そういえば、このスクリプトを最後に使ったのは2020年。
もしかしたら古いのかも?という点を調べて解決方法が分かりましたのでご紹介します。
ちなみに、実行すると、
Traceback (most recent call last):
File "C:\Users\papa\digittest\test.py", line 5, in <module>
from sklearn.externals import joblib
ImportError: cannot import name 'joblib' from 'sklearn.externals'
というエラーが出ます。
機械学習のスクリプトでエラーが出ると絶望するかもしれませんが、解決方法は必ずあるので安心してください。
エラーの原因
今回のエラーの原因は、scikit-learnのバージョンによるもの。
以前はjoblibがsklearn.externalsにバインドされていたので、
from sklearn.externals import joblib
で良かったのですが、ライブラリの一覧を見ると、
このようにjoblib が単体で存在します。
つまり、直接インポートすれば良いのでは?と考えました。
解決方法
それでは、実際にインポートしてdumpしてみましょう。
import joblib
.
.
.
joblib.dump(clf, 'digits.pkl')
実行するとエラーなく学習済みデータ「digits.pkl」ができました。
なお、公式のリファレンスには解決方法がありませんでしたので、上記には根拠などありませんが、joblib がライブラリの一覧に存在するためこれが正解であると考えます。
今回のスクリプトの全体像
念のため、こちらで実行したスクリプトの全文を載せておきます。
from sklearn import datasets, svm, metrics
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
import joblib
digits = datasets.load_digits()
x = digits.images
y = digits.target
x = x.reshape((-1, 64))
print(x)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
clf = svm.LinearSVC()
clf.fit(x_train, y_train)
y_pred = clf.predict(x_test)
print(accuracy_score(y_test, y_pred))
joblib.dump(clf, 'digits.pkl')
これを実行することで、scikit-learnの手書き数字データセットを用いた学習済みデータを作成することができます。
参考までに、よくある手書き数字の機械学習サンプルを実行した図。
続きが気になる方、手書き数字を認識させたいという要望がありましたら次の記事を書きたいと思います。
まとめ
今回はscikit-learnでfrom sklearn.externals import joblibをしたときにImportError: cannot import name ‘joblib’ from ‘sklearn.externals’ エラーが出たときの理由と解決策について解説しました。
無事にエラーが解決できたら嬉しいです。
「上手くいかない」「別のエラーが出た」などがありましたら、フォームやコメントでお知らせください。
それでは、ステキなPythonライフを!
Pythonの機械学習について詳しく知りたいという初学者には、こちらの書籍がおススメです。