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 ''''' Generación de datos ''' x = np.arange(0, 1, 0.002) y = norm.rvs(0, size=500, scale=0.1) y = y + .0**2 ''''' Error cuadrático medio en raíz ''' def rmse(y_test, y): return sp.sqrt(sp.mean((y_test - y) ** 2)) ''''' Excelencia en comparación con el promedio, entre [0~1]。0 representa peor que el promedio.1representa una predicción perfecta. Esta implementación se basa en scikit-sitio web oficial de learn ''' def R2(y_test, y_true): return 1 - ((y_test - y_true)**2).sum() / ((y_true - y_true.mean())**2).sum() ''''' Esta es la versión de Conway & White en 'Análisis de Casos de Uso en Aprendizaje Automático''' 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), método es comparar la predicción con el uso del promedio, para ver cuánto mejor es. Su rango generalmente está en (0,2(y_test, y), método es comparar la predicción con el uso del promedio, para ver cuánto mejor es. Su rango generalmente está en (0,22(y_test, y), clf.score(x[:, np.newaxis], y))) plt.plot(x, y_test, linewidth=2) plt.grid() plt.legend(['1','2','10loc='superior izquierda') plt.show()
El resultado mostrado en la ejecución del programa es el siguiente:
[-0.16140183 0.99268453]
rmse=0.13, R2=0.82, R22=0.58, clf.score=0.82
es el resultado del ajuste.934527 -0.03591245 1es el resultado del ajuste.3065829]
rmse=0.11, R2=0.88, R22=0.66, clf.score=0.88
[ 6es el resultado del ajuste.7130354e-02 -1es el resultado del ajuste.2247150e+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
es el resultado del ajuste.1El resultado mostrado es el coeficiente polinomial.
es el resultado del ajuste.99268453.0 -0.16140183
mostrado es el coeficiente polinomial.
1grado de ajuste produce
y = 0.-x2Aquí debemos prestar atención a estos puntos:
y análisis de errores.se realiza análisis de regresión, errores comunes incluyen la raíz cuadrada media del error cuadrado (RMSE) y R
método es comparar la predicción con el uso del promedio, para ver cuánto mejor es. Su rango generalmente está en (0,2cuadrado (R1RMSE1es la raíz cuadrada media del error cuadrado de la predicción y el valor real. Este método de medición es muy popular (método de evaluación del concurso de aprendizaje automático de Netflix), es un método de equilibrio cuantitativo.
método es comparar la predicción con el uso del promedio, para ver cuánto mejor es. Su rango generalmente está en (0,2representa la situación en la que todas las predicciones coinciden perfectamente con los resultados reales. 0 representa que es peor que no predecir nada, simplemente tomar el promedio, mientras que2R-diferentes documentos ligeramente diferentes. Como la función R
es según el método de cálculo de scikit22y el clf.score implementado en el sitio web de learn, que coincide con el resultado de la función clf.score.2la función de implementación procede de la obra de Conway 'Análisis de Casos de Aprendizaje Automático', diferente en que utiliza2.
calcular la proporción de RMSE para R1Vemos que el número de grados del polinomio es2cuando, aunque el ajuste no es muy bueno, R82.2grado también puede alcanzar 0.88grado de polinomio se elevó a 0.10grado, R2sólo se elevó a 0.89.
2y sobreajuste.
Se utiliza10El ajuste del polinomio de 0 grado produce un efecto algo mejor, sin embargo, la capacidad de medición del modelo es extremadamente mala.
Y además, presten atención a los coeficientes polinomiales, que aparecen en gran cantidad de valores grandes, incluso hasta10de12grado.
Aquí modificamos el código, cambiando500 de muestras, la última2muestras se eliminaron del conjunto de entrenamiento. Sin embargo, en la prueba, se probaron todos los500 de muestras.
clf.fit(x[:498, np.newaxis], y[:498]
Los resultados del ajuste polinomial modificado después de esta modificación son los siguientes:
[-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
sólo falta el último2ejemplo de muestra de entrenamiento, la línea roja (10El ajuste del polinomio de 0 grado produce una gran desviación en la predicción, R2se desciende abruptamente a 0.57.
Mientras que en contraste1,2El resultado del ajuste del polinomio de grado2en lugar de disminuir ligeramente.
Esto indica que los polinomios de alto grado sobreajustan los datos de entrenamiento, incluyendo una gran cantidad de ruido, lo que hace que pierdan completamente la capacidad de predecir la tendencia de los datos. También se ha visto anteriormente que10El ajuste del polinomio de 0 grado produce coeficientes numéricos inmensos. La gente naturalmente piensa en limitar el tamaño de estos coeficientes numéricos durante el proceso de ajuste para evitar la generación de esta función de ajuste anómala.
Su principio básico es la suma de los valores absolutos de todos los coeficientes del polinomio ajustado (L1Se añade la regularización) o la suma de cuadrados (L2Se añade la regularización) al modelo de penalidad y se especifica un factor de intensidad de penalidad w para evitar la generación de este coeficiente anómalo.
Esta idea se aplica en el regreso de collina (Ridge) (usando L2Método Lasso (usando L1Regularización (L1+Regularización (L2Métodos como regularización (L
Veamos un ejemplo de Ridge Regression para ver10La validación de la ajuste de polinomio de orden 0 es efectiva. Modifique el código como se muestra a continuación:
clf = Pipeline([('poly', PolynomialFeatures(degree=d)),
('linear', linear_model.Ridge ())])
clf.fit(x[:400, np.newaxis], y[:400]
Los resultados son los siguientes:
[ 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
Se puede ver que,10El coeficiente de parámetro del polinomio de orden 0 se vuelve muy pequeño. La mayoría está cerca de 0.
Otra cosa que es digna de mención es que después de usar modelos de penalización como Ridge Regression,1El orden y2El valor de R del regreso polinomial de orden2El valor puede ser un poco menor que el regreso lineal básico.
Sin embargo, este modelo, incluso cuando se utiliza100 veces polinomio, en el entrenamiento4En el caso de 00 muestras, la predicción5En el caso de 00 muestras, no solo es más pequeño el R2No solo tiene errores, sino que también tiene una excelente capacidad de predicción.
Esto es todo el contenido de este artículo, espero que ayude a su aprendizaje y que todos los que apoyen el tutorial de clamor.
Declaración: el contenido de este artículo se ha obtenido de la red, pertenece al propietario original, se ha aportado y subido por los usuarios de Internet de manera autónoma. Este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume la responsabilidad legal relevante. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @ para denunciar y proporcionar evidencia. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción de derechos de autor.)