PrecisionとRecallを求める拡張ノードをBobに作らせる
PrecisionとRecallを算出する方法は[逆引き8-2]で紹介しています。そちらを元に、IBM Bobと拡張ノードで求める手続きを示します。
1.想定される利用目的
・予測モデルの性能評価
・実装後のモデルメンテナンスのための性能指標の算出
2.サンプルストリームとデータのダウンロード
ストリーム
3.サンプルストリームの説明
[逆引き8-2]から拡張した部分のみを取り上げています。
a.入力するデータは以下の通りです。
b.[フィルター]ノードを編集します。ストリームの再利用性を上げるためのフィルターです。
c.[拡張のエクスポート]ノードを編集します。スクリプトをどのようにBobに書かせたかは後述します。
[実行]します。
Bobによるスクリプトの作成手順
1.Bobを起動して、作業フォルダを指定します。
2.SPSS Modeler[拡張のエクスポート]ノードからサンプル構文をコピーします。
3.プロンプトを作成します。サンプル構文をペーストします。
プロンプト
故障 $-故障
1 1
1 1
1 1
1 1
1 0
1 1
1 1
1 1
1 1
1 0
0 1
0 0
0 0
0 0
0 0
0 1
0 0
0 0
0 1
0 1
次の実績と予測からAccuracyとPredictionとRecallを計算してください
その上で先と同じ処理を実行して
SPSS Modelerの出力ノードで結果を表示するするネイティブPython APIスクリプトを書いてください。
- 拡張のエクスポートノードのスクリプトの解説として
@https://www.ibm.com/docs/ja/spss-modeler/18.6.0?topic=spark-native-python-apis を参考にしてください。
- シバンは不要です。
###Use this code to import data from Modeler to Python
#import modelerpy
#modelerData = modelerpy.readPandasDataframe()
#modelerDataModel = modelerpy.getDataModel()
4.プロンプトを実行します。
5.Bobの以下の出力を[拡張のエクスポート]にそのまま利用します。
Pythonスクリプト
# SPSS Modeler拡張エクスポートノード用スクリプト(表示のみ)
# 実績と予測データから評価指標(Accuracy, Precision, Recall)を計算して表示
import modelerpy
# Modelerからデータを読み込み
modelerData = modelerpy.readPandasDataframe()
# データフレームから実績と予測の列を取得
actual = modelerData['Flag'].tolist() # 実績列
predicted = modelerData['Pre'].tolist() # 予測列
# 混同行列の要素を計算
TP = 0 # True Positive: 実績1、予測1
TN = 0 # True Negative: 実績0、予測0
FP = 0 # False Positive: 実績0、予測1
FN = 0 # False Negative: 実績1、予測0
for i in range(len(actual)):
if actual[i] == 1 and predicted[i] == 1:
TP += 1
elif actual[i] == 0 and predicted[i] == 0:
TN += 1
elif actual[i] == 0 and predicted[i] == 1:
FP += 1
elif actual[i] == 1 and predicted[i] == 0:
FN += 1
# 評価指標の計算
accuracy = (TP + TN) / (TP + TN + FP + FN) if (TP + TN + FP + FN) > 0 else 0
precision = TP / (TP + FP) if (TP + FP) > 0 else 0
recall = TP / (TP + FN) if (TP + FN) > 0 else 0
# 結果を表示
print("=" * 50)
print("混同行列")
print("=" * 50)
print("True Positive (TP): " + str(TP))
print("True Negative (TN): " + str(TN))
print("False Positive (FP): " + str(FP))
print("False Negative (FN): " + str(FN))
print()
print("=" * 50)
print("評価指標")
print("=" * 50)
print("Accuracy (正解率): {:.4f} ({:.2f}%)".format(accuracy, accuracy*100))
print("Precision (適合率): {:.4f} ({:.2f}%)".format(precision, precision*100))
print("Recall (再現率): {:.4f} ({:.2f}%)".format(recall, recall*100))
print()
print("=" * 50)
print("指標の意味")
print("=" * 50)
print("Accuracy: 全体のうち正しく予測できた割合")
print(" (TP + TN) / 全データ数")
print()
print("Precision: 故障と予測したもののうち、実際に故障だった割合")
print(" TP / (TP + FP)")
print()
print("Recall: 実際の故障のうち、正しく故障と予測できた割合")
print(" TP / (TP + FN)")
print("=" * 50)
# Made with Bob
注意事項
今回は学習と検証を分割せずにサンプルとして示しました。目的に応じて変更してください。
4.参考情報
店舗の数だけファイルを分割するpython拡張ノードをBobに作らせる
SPSS Modeler ノードリファレンス目次
SPSS Modeler 逆引きストリーム集(データ加工)









