解決したいこと
scipyのminimizeを使って,閾値の最適化問題をときたいと思っていますが,制約条件がうまく機能していません.
PrecisionとRecallに基づいた最適化です.
具体的には,
Recallが0.9以上の制約条件のもとでPrecisionが最大となる閾値を得たいです.
条件設定にて最適な閾値が0.3となる仮想の問題を設定してみたのですが,
以下に示すように,初期値の閾値(0.5)を出力してしまいます.
なお,こちらのサイトのコードを参考にさせていただきました.
https://www.sairablog.com/article/scipy-minimize-threshold-optimization.html
ご協力いただけないでしょうか.
該当するソースコード
python
1from scipy.optimize import minimize 2import numpy as np 3from sklearn.metrics import accuracy_score, precision_score,recall_score 4y_test=np.array([1,1,1,1,0,0,0,0]) 5y_prob=np.array([0.3,0.4,0.6,0.7,0.2,0.1,0.25,0.28]) 6 7# 目的関数 8def func(threshhold): 9 global y_test,y_prob 10 return -precision_score(y_test,y_prob>=threshhold) 11 12# 制約条件式 13def cons1(threshhold): 14 global y_test,y_prob 15 recall=recall_score(y_test,y_prob>=threshhold) 16 return (recall-0.9) 17 18# 制約条件式が非負となるようにする 19cons = ( 20 {'type': 'ineq', 'fun': cons1}, 21# {'type': 'ineq', 'fun': cons2} 22) 23x=np.array([0.5]) 24result = minimize(func, constraints=cons,x0=x,method='Nelder-Mead') 25print(result) 26# 結果の閾値は0.5 27print(precision_score(y_test,y_prob>=0.5)) 28print(recall_score(y_test,y_prob>=0.5)) 29# 理想の閾値は0.3 30print(precision_score(y_test,y_prob>=0.3)) 31print(recall_score(y_test,y_prob>=0.3))
結果)
fun: -1.0 jac: array([0.]) message: 'Positive directional derivative for linesearch' nfev: 3 nit: 5 njev: 1 status: 8 success: False x: array([0.5]) 0.5 1.0 1.0 1.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/07 15:32