English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
機械学習における予測問題は通常、以下のように分類されます。2カテゴリ:回帰と分類。
簡単に言えば、回帰は数値の予測であり、分類はデータにタグを付けて分類することです。
この記事では、Pythonを使用して基本的なデータフィッティングを行い、フィッティング結果のエラーを分析する方法について説明します。
この例では、1つの2次の関数にランダムなノイズを加えて生成します。500ポイントを生成し、次の関数とランダムなノイズを加えて生成しようと試みます。1、2、100次の多項式がこのデータにフィットさせるために使用されます。
フィッティングの目的は、トレーニングデータに基づいて多項式関数をフィットさせることで、現有データをよくフィットさせ、未知データの予測を行うことです。
以下はコードです:
import matplotlib.pyplot as plt import numpy as np import scipy as sp from scipy.stats import norm from sklearn.pipeline import Pipeline from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures from sklearn import linear_model '''データ生成''' x = np.arange(0, 1, 0.002) y = norm.rvs(0, size=500, scale=0.1) y = y + x**2 '''均方根誤差''' def rmse(y_test, y): return sp.sqrt(sp.mean((y_test - y) ** 2)) '''平均と比較した優れた度合いは、[0~1]。0は平均よりも劣ることを示します。1これは完璧な予測を意味します。このバージョンの実装はscikit-learnの公式ドキュメント''' def R2(y_test, y_true): return 1 - ((y_test - y_true)**2).sum() / ((y_true - y_true.mean())**2).sum() '''これはConway&White『機械学習の使用例と解析』のバージョンです''' def R22(y_test, y_true): y_mean = np.array(y_true) y_mean[:] = y_mean.mean() return 1 - rmse(y_test, y_true) / rmse(y_mean, y_true) plt.scatter(x, y, s=5) degree = [1,2,100] y_test = [] y_test = np.array(y_test) for d in degree: clf = Pipeline([('poly', PolynomialFeatures(degree=d)), ('linear', LinearRegression(fit_intercept=False))]) clf.fit(x[:, np.newaxis], y) y_test = clf.predict(x[:, np.newaxis]) print(clf.named_steps['linear'].coef_) print('rmse=%.2f, R2=%.2f, R22=%.2f, clf.score=%.2f' % (rmse(y_test, y), は、すべての予測が実際の結果と完全に一致する場合を示しています。2(y_test, y), は、すべての予測が実際の結果と完全に一致する場合を示しています。22(y_test, y), clf.score(x[:, np.newaxis], y))) plt.plot(x, y_test, linewidth=2) plt.grid() plt.legend(['1','2','10plt.subplot(1, 1, 1), loc='upper left') plt.show()
このプログラムの実行結果は以下の通りです:
[-0.16140183 0.99268453}
rmse=0.13, R2=0.82, R22=0.58, clf.score=0.82
[ 0.00934527 -0.03591245 1.03065829}
rmse=0.11, R2=0.88, R22=0.66, clf.score=0.88
[ 6.07130354e-02 -1.02247150e+00 6.66972089e+01 -1.85696012e+04
......
-9.43408707e+12 -9.78954604e+12 -9.99872105e+12 -1.00742526e+13
-1.00303296e+13 -9.88198843e+12 -9.64452002e+12 -9.33298267e+12
-1.00580760e+12}
rmse=0.10, R2=0.89, R22=0.67, clf.score=0.89
で、表示されているcoef_は多項式のパラメータです。例えば、1次のフィッティング結果は
y = 0.99268453x -0.16140183
ここで注意すべき点は以下の通りです:
1、誤差分析があります。
を回帰分析に使用するとき、一般的な誤差には均方根誤差(RMSE)とR-)2の二乗(R
)RMSE
は、すべての予測が実際の結果と完全に一致する場合を示しています。2は、予測値と実際の値の誤差の二乗の平均を示します。この測度方法は非常に人気があり(Netflixの機械学習コンペティションの評価方法)、定量的なバランスを取る方法です。1方法は、予測値を均値を使用する場合と比較してどれだけ良いかを見ることです。その範囲は通常(0,1)の間で使用されます。0は、何も予測しない場合よりも均値を取る方が良い場合を示します。その範囲は通常(0,
は、すべての予測が実際の結果と完全に一致する場合を示しています。2R2の計算方法に基づいており、異なる文献では少し異なります。この記事の関数R-は、scikit
learnのウェブサイトのドキュメントで実現されています。clf.score関数の結果と一致しています。22であり、R2関数の実現はConwayの著作「機械学習の使用例解析」から来ており、彼はclf.score関数を使用していますが、2。
個のRMSEの比率を計算してR1私たちは多項式の次数が2に達すると、拟合がうまくいきませんが、R82。2次の多項式が0.88次の多項式の次に100次、R2もしくは0.89。
2、過度にフィッティングすることも含めます。
を使用して、100次の多項式フィッティングを行うと効果が少し向上しましたが、このモデルの予測能力は非常に悪いです。
そして、多项式係数に注目すると、非常に大きな値が多く見られ、その中には10の12次の
ここで、私たちはコードを修正し、500個のサンプルの最後の2個がトレーニングセットから除外されましたが、テストではそれでもすべての500個のサンプル。
clf.fit(x[:498, np.newaxis], y[:498])
このように修正した多項式フィッティング結果は以下の通りです:
[-0.17933531 1.0052037 }
rmse=0.12, R2=0.85, R22=0.61, clf.score=0.85
[-0.01631935 0.01922011 0.99193521}
rmse=0.10, R2=0.9, R22=0.69, clf.score=0.90
...
rmse=0.21, R2=0.57, R22=0.34clf.score=0.57
最後の2個のトレーニングサンプル、赤い線(100次の多項式フィッティング結果の予測が大きく偏りました、R2急激に0に低下しました。57。
しかし反対に見てみると、1、2次の多項式フィッティング結果、R2逆にわずかに上昇しました。
これは、高次多項式がトレーニングデータを過度にフィッティングしていることを示しています。その中には多くのノイズも含まれており、データのトレンドに対する予測能力を完全に失ってしまっています。前にも見たように、100次の多項式フィッティングでは係数の値が非常に大きくなります。これらの係数の値の大きさをフィッティングプロセス中に制限することで、このような歪んだフィッティング関数を避ける方法が考えられます。
その基本的な原理は、フィッティング多項式のすべての係数の絶対値の和(L2)1正則化または平方和(L2)2正則化を懲罰モデルに加え、このような歪んだ係数を生み出さないように、懲罰強度係数wを指定します。
この考え方がリッジ回帰(Ridge Regression)に適用されています。2正規化)、Lasso法(L1正規化)、エラストikusネット(Elastic net、L1+L2正規化などの方法で、過剰適合を効果的に避けることができます。さらに詳しい原理については、関連資料を参照してください。
以下では、リッジ回帰を例として見てみましょう100次の多項式のフィッティングが効果的かどうかを確認するために、コードを以下のように修正します:
clf = Pipeline([('poly', PolynomialFeatures(degree=d)),
('linear', linear_model.Ridge ())])
clf.fit(x[:400, np.newaxis], y[:400])
結果は以下の通りです:
[ 0. 0.75873781}
rmse=0.15, R2=0.78, R22=0.53, clf.score=0.78
[ 0. 0.35936882 0.52392172}
rmse=0.11, R2=0.87, R22=0.64, clf.score=0.87
[ 0.00000000e+00 2.63903249e-01 3.14973328e-01 2.43389461e-01
1.67075328e-01 1.10674280e-01 7.30672237e-02 4.88605804e-02
......
3.70018540e-11 2.93631291e-11 2.32992690e-11 1.84860002e-11
1.46657377e-11}
rmse=0.10, R2=0.9, R22=0.68, clf.score=0.90
次に、100次の多項式の係数パラメータが非常に小さくなります。ほとんどが0に近いです。
また、リッジ回帰などのペナルティモデルを使用すると、1次の2次の多項式回帰のR2値が基本的な線形回帰よりも少し低くなる可能性があります。
しかし、このようなモデルは、100次の多項式、トレーニング400個のサンプルにおいて、予測500個のサンプルで、R2誤差はありますが、優れた予測能力も持っています。
これで本文のすべてが終わり、皆さんの学習に役立つことを願っています。また、呐喊教程を多くのサポートをお願いします。
声明:本文の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーにより自発的に貢献し、自己でアップロードされています。本サイトは所有権を持ちません。また、人工編集は行われていません。著作権侵害が疑われる内容がある場合は、以下のメールアドレスまでご連絡ください:notice#oldtoolbag.com(メール送信時は、#を@に変更してください。届出をいただき、関連証拠を提供いただければ、本サイトは即座に侵害疑いのコンテンツを削除します。)