Cómo utilizar Python para regresión lineal y análisis de errores
Los problemas de predicción en minería de datos suelen dividirse en dos categorías: regresión y clasificación.
En pocas palabras, la regresión consiste en predecir valores, mientras que la clasificación consiste en etiquetar y clasificar los datos.
Este artículo describe cómo utilizar Python para realizar un ajuste de datos básico y cómo analizar el error de los resultados del ajuste.
En este ejemplo, se utiliza una función cuadrática más una perturbación aleatoria para generar 500 puntos y luego se intenta ajustar los datos con polinomios de 1, 2 y 100 potencias.
El propósito del ajuste es ajustar una función polinómica basada en los datos de entrenamiento. Esta función puede ajustarse bien a los datos existentes y predecir datos desconocidos.
El código es el siguiente:
importmatplotlib.pyplot as plt
importnumpy as np
importscipy as sp
fromscipy .stats?importnorm
fromsklearn.pipeline?importPipeline
fromsklearn.linear_model?importLinearRegression
fromsklearn.preprocessing?importPolynomialFeatures
fromsklearn?importlinear_model
'''''' Generación de datos'''
x = np.arange(0,?1,?0.002)
y = norma.rvs (0, tamaño=500, escala=0.1)
y = y + x**2
''''' raíz del error cuadrático medio'''
defrmse(y_test, y):
returnsp.sqrt(sp.mean((y_test - y) **?2))
'''' ' es lo mismo que la media El grado de excelencia en comparación es entre
y_test = []
y_test = np.array(y_test)
ford? grado:
clf = Pipeline([('poly', PolynomialFeatures(grado=d)),
('linear', LinearRegression(fit_intercept=False))]) p>
clf.fit (x[:, np.newaxis], y)
y_test = clf.predict(x[:, np.newaxis])
imprimir (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','100'], loc='upper left')
plt.show()
La pantalla Los resultados de este programa son los siguientes:
p>[-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
El coef_ mostrado es el parámetro polinómico. Por ejemplo, el resultado del primer ajuste es
y = 0.99268453x -0.16140183
Aquí debemos prestar atención a los siguientes puntos:
1. análisis.
Para el análisis de regresión, los errores comúnmente utilizados son el error cuadrático medio (RMSE) y el R cuadrado (R2).
RMSE es la raíz cuadrática media del error entre el valor predicho y el valor real. Esta métrica es popular (método de evaluación para la competencia de aprendizaje automático de Netflix) y es un método de compensación cuantitativa.
El método R2 consiste en comparar el valor predicho con el caso en el que solo se utiliza la media para ver cuánto mejor es. Su intervalo suele estar entre (0,1). 0 indica que es mejor no predecir nada y tomar la media directamente, mientras que 1 indica que todas las predicciones coinciden perfectamente con los resultados reales.
El método de cálculo de R2 es ligeramente diferente en diferentes documentos. Por ejemplo, la función R2 en este artículo se implementa según la documentación del sitio web oficial de scikit-learn y los resultados son consistentes con la función clf.score.
La implementación de la función R22 proviene del libro de Conway "Análisis de casos de uso de aprendizaje automático". La diferencia es que utiliza la proporción de dos RMSE para calcular R2.
Vemos que cuando el grado del polinomio es 1, aunque el ajuste no es muy bueno, R2 puede llegar a 0,82. El polinomio de segundo grado se ha mejorado a 0,88. Cuando el número de veces se incrementó a 100, R2 solo aumentó a 0,89.
2. Sobreajuste.
Utilizando polinomios de potencia 100 para el ajuste, el efecto es realmente mayor, pero la capacidad de medición de este modelo es extremadamente pobre.
Y atención a los coeficientes polinomiales. Hay muchos valores grandes, llegando incluso a 10 elevado a 12.
Aquí modificamos el código para eliminar las últimas 2 de las 500 muestras del conjunto de entrenamiento. Sin embargo, durante la prueba se analizaron las 500 muestras.
clf.fit(x[:498, np.newaxis], y[:498])
Los resultados del ajuste polinomial modificado 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,90, R22=0,69, clf.score=0,90
...
rmse=0,21, R2=0,57, R22=0,34, clf.score= 0,57
Solo porque faltan las dos últimas muestras de entrenamiento, la predicción de la línea roja (el resultado del ajuste del polinomio de potencia número 100) tiene una desviación pronunciada, y R2 también cae bruscamente a 0,57.
Al observar los resultados de ajuste de polinomios de grado 1 y 2, R2 aumentó ligeramente.
Esto muestra que los polinomios de alto orden se ajustan excesivamente a los datos de entrenamiento, incluida una gran cantidad de ruido, lo que hace que pierdan por completo su capacidad para predecir tendencias de datos. Como vimos anteriormente, los valores de los coeficientes ajustados por un polinomio de grado 100 son extremadamente enormes. La gente naturalmente piensa en limitar el tamaño de estos valores de coeficientes durante el proceso de ajuste para evitar generar funciones de ajuste tan deformadas.
El principio básico es sumar la suma de los valores absolutos de todos los coeficientes del polinomio de ajuste (regularización L1) o la suma de cuadrados (regularización L2) al modelo de penalización y especificar una penalización. factor de intensidad w, para evitar este coeficiente de deformidad.
Esta idea se aplica en métodos como la regresión Ridge (usando regularización L2), el método Lasso (usando regularización L1), la red elástica (red elástica, usando regularización L1 + L2), etc., que puede evitar eficazmente sobreajuste.
A continuación se toma la regresión de crestas como ejemplo para ver si el ajuste del polinomio de 100 grados es efectivo. Modifique el código de la siguiente manera:
clf = Pipeline([('poly', PolynomialFeatures(grado=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 280 e-01 7.30672237 e-02 4.88605804e-02
......
3.70018540e-11 2.93631291e-11 2.32992690e-11 1.84860002e-11
1.46657377e-11]
rmse=0.10, R2=0.90, R22=0.68, clf.score=0.90