前提・実現したいこと
・Pythonをさわり始めました。
・以下のようなパラメータ最適化ができないか試行中です。
●後に示しますが、現状結果は何だかなといったところです。
最適化については色々な解説サイト様がありましたが、関数の形まるごとに触れているのは探しきれませんでした。
宜しければアドバイスが欲しく思います。。。
--
例えば4個のパラメータ(a,b,c,d)で決まる関数F(a,b,c,d)がある。
F = a*x + b(x**2) + c*(x**3) + d*(x**4)
ある実験・計測により、この関数Fに完全に従う曲線が得られたとして、
このときのパラメータ(a,b,c,d)を求めたい。(いわゆる逆問題?)
--
本当はもっと実用的なモデルで考えたいですが、
とてもその段階にないので、まずはこの辺りから始めたいと思いました。
最適化にはまずOptunaを試してみてからという話も聞きましたので、
名付けなど見苦しいかもですが以下のようなコードを書いてみました。
該当のソースコード
Python
1import numpy as np 2import optuna 3 4study_F_ML = optuna.create_study() 5study_F_ML.optimize(objective_F, n_trials= 1000) 6 7def F(a,b,c,d): 8 x = np.arange(1001)/100.0 9 y = a*x + b*(x**2) + c*(x**3) + d*(x**4) 10 y_goal = 30 * x + (-50)*(x**2) + 20*(x**3) + (-2)*(x**4) 11 #最適化の目標はa = 30 , b = -50, c = 20, d = -2 12 y_MAE = (1/1001) * abs(y- y_goal).sum(axis=0) #MAEで評価 13 return y_MAE 14 15def objective_F(trial): 16 a = trial.suggest_uniform('a', -100, 100) 17 b = trial.suggest_uniform('b', -100, 100) 18 c = trial.suggest_uniform('c', -100, 100) 19 d = trial.suggest_uniform('d', -100, 100) 20 score = F(a,b,c,d) 21 return score
結果
目標値にある程度近い値は出ましたが、実用にはまだ遠いかなといった感じです。
Python
1study_F_ML.best_params 2{'a': 23.71088301113415, 3 'b': -61.00813218555368, 4 'c': 25.742281885308095, 5 'd': -2.5264525629825365} 6 #最適化の目標はa = 30 , b = -50, c = 20, d = -2
ご相談内容
何となくパラメータ最適化はできたのですが、まだまだ精度が足りません。
こんなものかなとも思いましたが、この例ではパラメータの選び方によっては完全一致もあり得るので、
上手く最適化できていない印象です。
特に目的関数について、RMSEやMAEでは誤差の総和で判断されるので、関数の形状についての情報が失われちゃうのかなとか思っています。
なんとも雑なご質問ですが、精度の向上のためにはどのような改善方法があるか、知見をいただけると幸いです。