English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
机器学习中的预测问题通常分为2类别:回归与分类。
简单来说,回归就是预测数值,而分类是给数据打上标签进行归类。
本文讲述如何使用Python进行基本的数据拟合,以及如何对拟合结果的误差进行分析。
本例中使用一个2次函数加上随机的扰动来生成500个点,然后尝试用1、2、10零次方的多项式对该数据进行拟合。
拟合的目的是根据训练数据拟合出一个多项式函数,该函数能够很好地拟合现有数据,并且能够对未知数据进行预测。
代码如下:
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 ''' Daten generation ''' x = np.arange(0, 1, 0.002) y = norm.rvs(0, size=500, scale=0.1) y = y + ter Potenz. Das von der Funktion zurückgegebene coef_ ist der Polynomparameter. Zum Beispiel**2 ''' Quadratischer Fehler ''' def rmse(y_test, y): return sp.sqrt(sp.mean((y_test - y) ** 2)) ''' Dies ist der Grad der Überlegenheit gegenüber dem Durchschnitt, der zwischen [0~1]。0 bedeutet schlechter als der Durchschnitt.1bedeutet perfekte Vorhersage. Diese Implementierung basiert auf scikit-Dokumentation der learn-Website ''' def R2(y_test, y_true): return 1 - ((y_test - y_true)**2).sum() / ((y_true - y_true.mean())**2).sum() ''' Dies ist die Version aus Conway&White 'Analyse von Fallstudien zur maschinellen Lernverwendung''' 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), stellt den Fall dar, bei dem alle Vorhersagen mit den tatsächlichen Ergebnissen übereinstimmen.2(y_test, y), stellt den Fall dar, bei dem alle Vorhersagen mit den tatsächlichen Ergebnissen übereinstimmen.22(y_test, y), clf.score(x[:, np.newaxis], y))) plt.plot(x, y_test, linewidth=2) plt.grid() plt.legend(['1','2','10loc='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
plt.show()}1Das angezeigte Ergebnis des Programms ist wie folgt:
0.099268453ter Potenz. Das von der Funktion zurückgegebene coef_ ist der Polynomparameter. Zum Beispiel -0.16140183
y = 0.
1x
Hier müssen wir auf folgende Punkte achten:-Fehleranalyse.2Regression zu analysieren, die gebräuchlichen Fehler sind die Quadratwurzel des mittleren Quadratfehlers (RMSE) und R
Quadrat (RRMSE
stellt den Fall dar, bei dem alle Vorhersagen mit den tatsächlichen Ergebnissen übereinstimmen.2macht den Unterschied zwischen dem Vorhersagewert und dem tatsächlichen Wert, indem man den Quadratmittelwert der Fehler berechnet. Diese Methode ist sehr beliebt (Bewertungsmethode des Netflix-Machine-Learning-Wettbewerbs) und ist eine quantitative Abwägungsmethode.1bedeutet, dass es schlechter ist als der Fall, in dem man einfach den Durchschnitt nimmt, und1zwischen
stellt den Fall dar, bei dem alle Vorhersagen mit den tatsächlichen Ergebnissen übereinstimmen.2R2unterschiedlich sind. So ist die Funktion R-basiert auf der Berechnungsmethode von scikit
learn-Dokumentation verwendet wird, was mit dem Ergebnis der Funktion clf.score übereinstimmt.22verwendet, während R2Die Implementierung der Funktion stammt aus dem Werk von Conway 'Maschine Lernen: Fallstudienanalyse', unterscheidet sich darin, dass er2.
RMSE-Werte zu berechnen.1sehen wir, dass die Polynomordnung2wenn die Fitting-Qualität nicht gut ist, R82.2ter Potenz erhöht wird, kann sie auch 0 erreichen.88Wenn die Ordnung auf10Nulltermpolynomfunktion auf 0 erhöht.2nur auf 0 erhöht.89.
2、Überanpassung.
Verwendung von10Nulltermpolynomfitten, die tatsächlich besser funktionieren, aber die Vorhersagefähigkeit des Modells ist sehr schlecht.
und beachten Sie die Polynomkoeffizienten, die viele große Werte aufweisen, sogar bis zu10von12ten Potenz.
Hier ändern wir den Code, um500 Beispiele am Ende2Beispiele aus dem Trainingsset entfernt. Aber im Test werden immer noch alle500 Beispiele.
clf.fit(x[:498, np.newaxis], y[:498]
Die nach dieser Änderung gewonnenen Ergebnisse der Polynomfunktion passen wie folgt:
[-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.34, clf.score=0.57
fehlt nur der letzte2trainingsbeispiel, rote Linie (10Die Vorhersage der Nulltermmatrix verändert sich stark, R2schnell auf 0 abfällt.57.
Gegengleichzeitig1,2Die Fitting-Ergebnisse der n-ten Polynomfunktion, R2stattdessen leicht ansteigt.
Dies zeigt, dass hochgradige Polynome das Trainingsdaten übertrieben gut passen, einschließlich einer großen Menge an Rauschen, was zu einem vollständigen Verlust der Vorhersagefähigkeit der Daten Trends führt. Wie bereits erwähnt,10Die Koeffizientenwerte der Nulltermmatrix sind unendlich groß. Menschen denken natürlich, dass sie durch Begrenzen der Größe dieser Koeffizienten während des Fitting-Prozesses die Bildung dieser deformierten Fitting-Funktion vermeiden können.
Grund原理是将拟合多项式的所有系数绝对值之和(L1Regularisierung) oder Quadratsumme (L2Regularisierung) wird in das Strafmodell aufgenommen und ein Strafkraftfaktor w festgelegt, um das Entstehen dieser krankhaften Koeffizienten zu vermeiden.
Diese Idee wird in die Ridge-Regression (Verwendung von Ridge-Regression) angewendet.2Regulierung)、Lasso-Methode(L1Regulierung)、Elastic Net(L1+L2Regulierung) und anderen Methoden, können sie effektiv Überanpassung vermeiden. Mehr Prinzipien können Sie in den entsprechenden Materialien nachlesen.
Sehen wir uns als Beispiel die Ridge Regression an100-fach Polynomfitten ob effektiv ist. Ändern Sie den Code wie folgt:
clf = Pipeline([('poly', PolynomialFeatures(degree=d)),
('linear', linear_model.Ridge ())])
clf.fit(x[:400, np.newaxis], y[:400]
Ergebnisse wie folgt:
[ 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
Man kann sehen,100-fach Polynomkoeffizientenparameter sehr klein werden. Die meisten sind nahe bei 0.
Es ist auch bemerkenswert, dass nach der Verwendung von Strafmodellen wie Ridge Regression,1fache und2fache Polynomregression R2Wert könnte etwas niedriger als die grundlegende lineare Regression sein.
Allerdings solch ein Modell, selbst wenn es100-fach Polynom, im Training400 Beispiele, Vorhersage500 Beispiele haben nicht nur kleineren R2Nicht nur kleineren Fehler, sondern auch hervorragende Vorhersagefähigkeiten.
Das ist der gesamte Inhalt dieses Artikels. Wir hoffen, dass er Ihnen bei Ihrem Lernen hilft und wir bitten Sie, die Anleitung zu unterstützen.
Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem jeweiligen Urheber. Der Inhalt wurde von Internetbenutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine rechtlichen Verantwortlichkeiten. Wenn Sie verdächtige Urheberrechtsinhalte finden, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden.3Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem jeweiligen Urheber. Der Inhalt wurde von Internetbenutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine rechtlichen Verantwortlichkeiten. Wenn Sie verdächtige Urheberrechtsinhalte finden, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden.