質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Q&A

解決済

1回答

3247閲覧

python: scipy.optimize.minimizeを用いた最適化に関する質問

kouheichild

総合スコア18

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

0グッド

0クリップ

投稿2021/01/07 12:28

解決したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

試しに流してみると警告が出ました。
kouheichildさんのところでは出ませんか?

python

1> python minimize_test.py 2C:\Users\XXXXX\anaconda3\lib\site-packages\scipy\optimize\_minimize.py:533: RuntimeWarning: Method Nelder-Mead cannot handle constraints nor bounds. 3 warn('Method %s cannot handle constraints nor bounds.' % method,

Nelder–Mead法は制約や境界を扱うことができません。とのことです。
たぶんこれが原因でしょう。

投稿2021/01/07 15:17

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kouheichild

2021/01/07 15:32

ppaulさま お時間を割いていただき,ありがとうございます. 私はjupyter_notebookで試しているのですが,警告は出ませんでした. また,試しにmethodを変えでみたのですが,うまくいかずreference等を読んでおります. ご回答ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問