こんにちは、フルスタックエンジニアのryuです。
今回の記事は、’SVC’ object has no attribute ‘_probA’というエラーの対処方法について解説します。機械学習のSVMの予測モデルをDjangoで使用した場合に発生したエラーです。原因はscikit-learnのバージョンの違いでした。
SVC object has no attribute _probAというエラーの対処方法
今回の記事は、「’SVC’ object has no attribute ‘_probA’」というエラーの対処方法について解説します。
原因は、作成したモデルのscikit-learnのバージョンと、予測を実行したscikit-learnのバージョンが違うことでした。さらに詳しく解説します。
エラーが起きた状況
まず、エラーが起きた状況について解説します。Djangoを使用して機械学習の予測アプリの作成をしていました。DjangoはDockerで動作していました。
予測のモデルをGoogle Colaboratoryで作成して、保存したモデルをDjangoで使用しておりました。
予測モデルの作成のコードについては以下の通りです。
import numpy as np
import pickle
from sklearn import svm
#csvファイルの読み込み
npArray = np.loadtxt("data.csv", delimiter = ",", dtype = "float")
# 説明変数の格納
x = npArray[:, 0:5]
#目的変数の格納
y = npArray[:, 5:6].ravel()
#学習手法にSVMを選択
model = svm.SVC( probability=True)
#学習
model.fit(x,y)
#学習モデルの保存
with open('model.pickle', mode='wb') as f:
pickle.dump(model,f,protocol=2)
エラーの対処方法
Djangoには先ほども紹介した通り、「SVC’ object has no attribute ‘_probA」が表示されました。エラーについて調査していると、以下のコメントを発見しました。
現在使用しているモデルのトレーニングに使用したのと同じバージョンのsci-kitを使用する必要があることが判明しました(scikit-learn == 0.21.2)。それ以降のバージョンのscikitは、既存のコード/モデルでは機能しません。scikitをアップグレードする場合は、新しいバージョンのscikitでモデルを再トレーニングする必要があります。
(https://stackoverflow.com/ より引用 日本語訳)
つまり、sicikit-learnのバージョンを学習時と予測時で合わせれば良いのです。学習したモデルを別の環境で実行しようとするとこのようなエラーがでるらしいですね。
今回の場合は、Docker内に学習データとコーディングを移動させてモデルを作成したら解消しました。
エラーの対処方法まとめ
今回の記事では、scikit-learnのエラーについて解説しました。モデル作成後のエラーは分かりづらいので原因調査に苦労しました。
同じエラーで苦労している方の助けになればと思います。当ブログではこのようなITに関連する記事を解説しているので興味のある方は他の記事もご欄下さい。
また、AIや機械学習について勉強したい方はこちらの参考書がオススメです。