English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
机器学习中的预测问题通常分为2类:回归与分类。
简单的说回归就是预测数值,而分类是给数据打上标签归类。
本文讲述如何用Python进行基本的数据拟合,以及如何对拟合结果的误差进行分析。
本例中使用一个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 ''' Génération des données ''} x = np.arange(0, 1, 0.002) y = norm.rvs(0, size=500, scale=0.1) y = y + x**2 ''' Racine carrée de l'erreur quadratique moyenne ''} def rmse(y_test, y): return sp.sqrt(sp.mean((y_test - y) ** 2)) ''' est le degré d'excellence par rapport à la moyenne, entre [0~1]。0 signifie moins que la moyenne.1représente une prédiction parfaite. Cette version de l'implémentation est basée sur scikit-site web de learn ''' def R2(y_test, y_true): return 1 - ((y_test - y_true)**2).sum() / ((y_true - y_true.mean())**2).sum() '''C'est la version dans 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), R2(y_test, y), R22(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()
Les résultats affichés par le programme sont les suivants :
[-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
Le coef_ affiché est le paramètre polynomial. Par exemple1degré d'ajustement est
y = 0.99268453x -0.16140183
Voici quelques points que nous devons noter :
1et l'analyse des erreurs.
L'analyse de régression, les erreurs courantes incluent la racine carrée de l'erreur quadratique moyenne (RMSE) et R-Le carré (R2)。
RMSEest la moyenne des racines carrées des erreurs quadratiques entre les valeurs prédites et les valeurs réelles. Cette méthode de mesure est très populaire (méthode d'évaluation du concours de machine learning Netflix), c'est une méthode de jugement quantitatif.
R2est une méthode pour comparer la valeur prédite avec la moyenne utilisée uniquement, pour voir combien elle est meilleure. L'intervalle est généralement dans (0,1représente le cas où on ne prédit rien, on prend directement la moyenne, tandis que1représente la situation où toutes les prédictions correspondent parfaitement aux résultats réels.
R2différents documents peuvent légèrement varier. Comme la fonction R2est basé sur le calcul de-learn documentation officielle, et les résultats de la fonction clf.score sont identiques.
et R22La fonction de l'implémentation de Conway dans l'ouvrage "Analyse de cas de l'apprentissage automatique" est différente, car il utilise2Pour calculer R2.
Nous voyons que le degré polynomial est1Bien que le ajustement ne soit pas trop bon, R2peut atteindre 0.82.2degré, le polynôme de88. Et lorsque le degré est augmenté à100e fois, R2n'a augmenté que jusqu'à 0.89.
2et le sureajustement.
L'utilisation10Le polynôme de 0e degré fait une régression, l'effet est en fait un peu meilleur, mais la capacité de prédiction du modèle est extrêmement médiocre.
Et notez bien les coefficients polynomiaux, qui montrent une grande quantité de valeurs élevées, même atteignant10de12degré.
Voici, nous modifions le code, en500 échantillons, y compris le dernier2échantillons ont été supprimés du jeu de données d'entraînement. Cependant, lors du test, tous les500 échantillons.
clf.fit(x[:498, np.newaxis], y[:498]
Les résultats de la régression polynomiale modifiée sont les suivants :
[-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
ce n'est qu'un manque du dernier2des échantillons d'entraînement, la ligne rouge (10Le résultat de la prédiction du polynôme de 0e ordre a subi une forte déviation, R2est brusquement descendu à 0.57.
En revanche,1,2Les résultats de l'ajustement du polynôme de degré2au lieu de cela, il a légèrement augmenté.
Cela montre que les polynômes de degré élevé surajustent les données d'entraînement, y compris une grande quantité de bruit, ce qui entraîne une perte complète de la capacité de prédiction de la tendance des données. Avant cela, on a vu aussi que10Le coefficient du polynôme de 0e ordre est extrêmement grand. Les gens pensent naturellement à limiter la taille de ces coefficients pendant le processus d'ajustement pour éviter de générer une fonction d'ajustement anormale.
Le principe de base est la somme des valeurs absolues de tous les coefficients du polynôme d'ajustement.1La régularisation) ou la somme des carrés (L2La régularisation est ajoutée au modèle de pénalité, et un facteur de pénalité w est spécifié pour éviter la génération de coefficients anormaux.
Cette idée est appliquée à la régression de crête (Ridge) utilisant L2Régularisation)、Méthode Lasso (utilisant L1Régularisation)、Méthode Lasso (utilisant L1+Régularisation)、Réseau élastique (Elastic net, utilisant L2Les méthodes de régularisation, telles que L
Voyons un exemple de Ridge Regression pour voir100 fois le polynôme de fitting est-il efficace. Modifiez le code comme suit :
clf = Pipeline([('poly', PolynomialFeatures(degree=d)),
('linear', linear_model.Ridge ())])
clf.fit(x[:400, np.newaxis], y[:400]
Les résultats sont les suivants :
[ 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
On peut voir que,100 fois les coefficients des paramètres du polynôme deviennent très petits. La plupart sont proches de 0.
En plus de cela, il est noteworthy que, après l'utilisation de modèles de pénalité tels que Ridge Regression,1Le degré et2Le polynôme de régression du R2La valeur peut être légèrement inférieure à la régression linéaire de base.
Cependant, ce type de modèle, même s'il est utilisé100 fois le polynôme, en entraînement400 échantillons, la prédiction500 échantillons, non seulement le R est plus petit2Non seulement des erreurs, mais aussi une excellente capacité de prévision.
Voici la totalité du contenu de cet article, j'espère que cela pourra aider à votre apprentissage, et j'espère que vous pourrez également soutenir le tutoriel Néanmoins.
Déclaration : le contenu de cet article est extrait du réseau, la propriété intellectuelle appartient à ses auteurs respectifs, le contenu est contribué et téléchargé par les utilisateurs d'Internet, le site web ne possède pas de propriété, n'a pas été édité par l'homme, et n'assume pas de responsabilité juridique. Si vous trouvez du contenu susceptible de violer les droits d'auteur, veuillez envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois confirmée, le site supprimera immédiatement le contenu suspect de violation de droit d'auteur.)