polyfitやcurve_fitでの多項式回帰分析の決定係数及び精度を上げる方法はありますでしょうか?
■解決したいこと
Pythonのpolyfit(numpy)やcurve_fit(scipy)などで多項式回帰を行っております。仕事で決定係数が0.9985以上になる近似式を使いたいのですが、2次式回帰で条件(決定係数0.9985以上)に満たなかったので3次式回帰でトライしてみました。
下記と同じ条件(a,b要素)でExcelのグラフで算出すると精度の高い3次近似式が出てきますが、polyfitだと"Polyfit may be poorly conditioned"とコンディションが悪いとされてまい、近似式の精度が低い状態です。curve_fitで算出された値もExcelで算出されものよりも決定係数が低く近似式がの精度が低い状態です。
■質問
質問と致しましては、
①決定係数を上げるために元データをコンディションの良いデータへ加工するなど、何かよい方法が何かあるものなのか?
②そもそも2次式回帰で決定係数が低いものを3次式回帰にしたところで決定係数が上がるものなのか、また3次曲線ではない曲線(ただの緩やかな曲線)に3次式回帰が適用できるものなのか?
です。機械学習の土台となる数学知識があまりなく、勉強したいのですが時間がなく、様々なサイトを見て見様見真似でやっておりまして、至らない部分もあるかとございますが、ご教授いただけると助かります。
皆様お忙しいところ申し訳ありませんが何卒宜しくお願い致します。
a = [132.90183, 132.90082, 132.899859, 132.898943, 132.898088, 132.897294, 132.896503, 132.895693]
b = [33.794023, 33.793724, 33.793335, 33.792861, 33.792326, 33.791718, 33.791102, 33.790507]
"""
polyfitによる回帰分析
"""
p = np.polyfit(a, b, 3)
print("3次関数式係数 : %s"%(p))
# 2次多項式計算
yfit = np.polyval(p, a)
r2_1 = r2_score(b, yfit)
r2_1 = round(r2_1, 5)
print("決定係数 : %s"%(r2_1))
"""
curve_fitによる回帰分析
"""
# 3次近似式用の関数
def func(x, a, b, c, d):
return a * pow(x, 3) + b * pow(x, 2) + c * x + d
# 近似式の作成
popt, pcov = optimize.curve_fit(func, a, b)
print("popt : %s"%(popt))
print("pcov : %s"%(pcov))
df_a = pd.DataFrame(a)
df_b = pd.DataFrame(b)
# 決定係数
r2_2 = r2_score(df_b[0], func(df_a[0], *popt))
r2_2 = round(r2_2, 5)
print("決定係数 : %s"%(r2_2))