Guía para el aprendizaje automático de Python desde cero (2) -Regresión OLS del aprendizaje supervisado

introducir

Este blog presentará 监督学习/Supervised Learning/SLla primera rama con ejemplos: 回归/Regression.

Preparación antes de empezar

Antes de comenzar, asegúrese de tener los siguientes paquetes en su entorno Python:
pandas, numpy, sklearn.

Todo el código de este artículo se puede ejecutar Anacondaen formato Jupyter Lab.

texto

Primero, entendamos: ¿Por qué 回归/Regressiones una especie de aprendizaje supervisado? ¿Cuál es la naturaleza de este problema?

Primero debemos comprender la naturaleza del problema de regresión. En pocas palabras, la esencia del problema de regresión es que para un mapeo fff ,
f : R norte ↦ R f:\mathbb{R}^n\mapsto \mathbb{R}F:RnorteR
, tenemos alguna matriz de su定义域/Domainsuma对应域/Codomain. Queremos utilizar estos datos existentes para encontrar un modelo/función de regresión que mejor se ajuste a los datos.

Desde otra perspectiva, para cada dato, el dominio de definición del mapeo puede entenderse como 特征集/Feature Sety su dominio correspondiente puede entenderse como 标签集/Label Set. Lo que buscamos es la función de mapeo desconocido, que corresponde a la del aprendizaje automático 黑箱模型/Blackbox Model.

Pero para convertir esto en un problema de aprendizaje totalmente supervisado, también debemos definir qué queremos optimizar. Como queremos encontrar el mapeo que mejor se ajuste a los datos, podemos considerar la minimización 误差平方和/Sum of Squared Errors/SSE. Para una persona con mmUn conjunto de datos de m datos y un mapeo correspondientefff , la suma de los errores cuadrados de este mapeo para este conjunto de datos se define como

ℓ = ∑ i = 1 m ( y ( i ) − f ( x ( i ) ) ) 2 \ell = \sum_{i=1}^m \Big(y^{(i)} - f\big({ \bf x}^{(i)}\grande)\Grande)^2=yo = 1m( y( yo )f ( x( yo ) ))2

, es decir, la diferencia entre la etiqueta verdadera de cada dato y la etiqueta predicha asignada se eleva al cuadrado y luego se suma. Si consideramos la suma de errores cuadrados como aprendizaje supervisado 损失函数/Loss Function, entonces se puede llamar a este problema de regresión 普通最小二乘法线性回归问题/OLS Linear Regression. Todo lo que tenemos que hacer es encontrar el mapeo fff , minimizando la suma de errores al cuadrado.

Definamos este problema con más rigor. Sea x {\bf x}x como conjunto de características,w \bf ww se usa como el conjunto de pesos de cada característica, luego para el mapeo lineal
f ( x ; w ) = w T ⋅ x = w 0 x 0 + w 1 x 1 + . . . + wnxnf({\bf x; w }) = {\bf w}^T\cdot{\bf x}=w_0x_0+w_1x_1+...+w_nx_nf ( x ;w )=wtX=w0X0+w1X1+...+wnorteXnorte
, la función de pérdida que queremos minimizar ℓ \ell可定义为:
ℓ ( w ) = ∑ i = 1 m ( y ( i ) − f ( x ( i ) ) ) 2 = ∑ i = 1 n ( y ( i ) − w T ⋅ x ( i ) ) 2 = ∑ yo = 1 norte ( y ( yo ) - y ^ ( yo ) ) 2 . \ell({\bf w}) = \sum_{i=1}^m \Big(y^{(i)} - f\big({\bf x}^{(i)}\big)\Big )^2 = \sum_{i=1}^n \Big(y^{(i)} - {\bf w}^T\cdot{\bf x}^{(i)}\Big)^2 = \sum_{i=1}^n \Big(y^{(i)} - \hat{y}^{(i)}\Big)^2.( w )=yo = 1m( y( yo )f ( x( yo ) ))2=yo = 1norte( y( yo )wtX( yo ) )2=yo = 1norte( y( yo )y^( yo ) )2. En otras palabras ,
la esencia de la regresión lineal bajo aprendizaje supervisado puede entenderse como un problema de optimización:
w = arg ⁡ min ⁡ w ℓ ( w ) {\bf w} = \arg\min_{ {\bf w} } \ell({\bfw}).w=arg _wmin( w ) .

Entonces, ¿cómo podemos encontrar la función de regresión lineal más adecuada?
En primer lugar, este problema tiene una solución única y óptima y pertenece al P/NPproblema P. Solo desde este punto de vista, la regresión lineal es un problema relativamente simple y fácil de resolver en el mundo del aprendizaje automático.

El proceso de encontrar 普通最小二乘法线性回归问题/OLS Linear Regressionla solución óptima se puede resolver simplemente confiando en algo de álgebra lineal. El proceso de derivación es relativamente tedioso y complicado, y el blogger no lo mostrará aquí, los estudiantes interesados ​​pueden buscarlo ellos mismos. Pero la conclusión es que el conjunto de ponderaciones de características w ∗ {\bf w}^* que mejor se ajusta a los datos (o minimiza la suma de errores al cuadrado)w , se puede obtener mediante la siguiente multiplicación de matrices:
w ∗ = ( XTX ) − 1 XTY {\bf w}^* = ({\bf X}^T {\bf X})^{-1}{\bf X }^T{\bf Y}w=( XTX )_1X _T Y
, dondeX {\bf X}X es el conjunto de características (el tamaño es el tipo de característica multiplicado por el número de filas de datos),Y {\bf Y}Y esmmVector de m elementos (conjunto de etiquetas). Para las computadoras, este tipo de multiplicación de matrices es un caso pequeño.

Sin embargo, sin el proceso de aprendizaje, ¿sigue siendo aprendizaje automático?
Muchos estudiantes, incluido el propio blogger, tuvieron este problema cuando estudiaban aquí. El modelo no parece tener un proceso iterativo y progresivo, sino que salta de cero a la solución óptima en un solo paso. Pero, estrictamente hablando, hay un proceso de aprendizaje. El modelo obtiene el conjunto de características y el conjunto de etiquetas y utiliza estos datos para mejorar su capacidad de generalizar los datos. Aunque no existe un avance paso a paso hacia un mejor rendimiento, la computadora aún aprende las características de los datos de manera efectiva. En resumen, la regresión lineal también es un tipo de aprendizaje automático.

Para un conjunto de datos con una función de regresión desconocida, si obtenemos la función de regresión óptima (es decir, minimizamos la suma de errores cuadrados) mediante el método anterior, entonces tendremos cierta capacidad de predicción para nuevos datos.

Entonces, ¿cuáles son los escenarios de aplicación de la regresión lineal?
Hay muchos, como por ejemplo:

  1. Previsión del precio de la vivienda. Si tiene datos anteriores del mercado inmobiliario (como la temperatura promedio anual, el promedio de horas de luz diaria, la distancia a la tienda de conveniencia más cercana, etc.) y los precios anuales de la vivienda, y si cree que los precios de la vivienda tienen una relación lineal (multidimensional) con estos características de la habitación, luego puede usar OLS para predecir los precios de las propiedades.
  2. Análisis de acciones. Al igual que los precios de la vivienda, algunas características de las acciones (como el beneficio neto de la empresa, el horario de apertura, el número de aumentos de límites diarios, etc.) también son indicadores importantes de los precios de las acciones. Sin embargo, cabe señalar que dado que el tiempo y algunos datos no obtenibles (como la probabilidad de que el propietario de la empresa tenga la intención de quebrar) tienen un gran impacto en los precios de las acciones, un modelo de regresión lineal simple puede no ser adecuado para un problema tan complejo como predecir cepo.
  3. Predicción del valor de vida del cliente (CLV). Los ingresos totales que un cliente aporta a una empresa están relacionados en gran medida con el nivel de ingresos del cliente, su edad, su consumo diario medio y otra información. Si hay información del cliente como un conjunto de características y los ingresos totales correspondientes a la empresa como un conjunto de etiquetas, entonces esta información se puede utilizar para predecir su CLV.

código

Después de comprender el principio, podemos usar Python para implementar el algoritmo de aprendizaje de regresión anterior.

Primero, generemos algunos datos simples.

import numpy as np # 用来进行一些数学运算
import pandas as pd # 用来用数据框的方式储存数据
import matplotlib # 用来画图的
import matplotlib.pyplot as plt
from sklearn import linear_model # 我们需要的模型

# X和Y包含生成的数据。X可以理解为特征/Features,Y可以看作标签/Label
# 我们要做的就是训练一个模型,使它能够通过X准确预测Y的对应值
# coeff包含生成函数所使用的系数
X, Y, coeff = skd.make_regression(n_samples=5000, n_features=2, 
                                  noise=5.0, 
                                  coef=True,
                                  random_state=114514)

print(f"特征集大小为{
      
      X.shape},标签集大小为{
      
      Y.shape}。")
# 特征集大小为(5000,2),标签集大小为(5000,)。

Después de generar los datos, podemos verificar el contenido de los datos:

from mpl_toolkits.mplot3d import Axes3D # 一个用来画3D图形的库

fig = plt.figure()
plot3d = fig.gca(projection='3d') # 调用matplotlib的对象
plot3d.view_init(elev=15., azim=35) # 观察角度

x1 = X[:, 0] # 选中X里第0列的所有行
x2 = X[:, 1] # 选中X里第1列的所有行

# 画出数据散点。注意x1,x2,Y的行数要相同
plot3d.scatter3D(x1, x2, Y, c=Y, cmap='Greens', label='Noised Samples');

# 画出真实参考平面
x1min, x1max = int(np.floor(min(x1))), int(np.ceil(max(x1)))
x2min, x2max = int(np.floor(min(x2))), int(np.ceil(max(x2)))
x1plane = np.linspace(x1min, x1max, 2000)
x2plane = np.linspace(x2min, x2max, 2000)
xx1, xx2 = np.meshgrid(range(x1min, x1max), range(x2min, x2max))
x12_coord = np.array([xx1, xx2])
y = coeff[0] * x12_coord[0] + coeff[1] + x12_coord[1]
surf = plot3d.plot_surface(xx1, xx2, y, alpha=0.2, label="True model")

# 给3D图形加上标签
surf._facecolors2d = surf._facecolor3d
surf._edgecolors2d = surf._edgecolor3d 
plot3d.legend()

# 画出坐标轴标签
plot3d.set_xlabel('$x_1$')
plot3d.set_ylabel('$x_2$')
plot3d.set_zlabel('$y$')

plt.show()

Obtenemos el siguiente gráfico:
gráficos modelo
El siguiente paso es sklearnentrenar el modelo de regresión lineal. El código es muy simple, sólo dos líneas.

# 创造线性回归对象
OLS = linear_model.LinearRegression(fit_intercept=True)

# 训练模型
OLS.fit(X, Y)

Podemos comparar manualmente la diferencia entre el modelo real y el modelo entrenado:

print('真实模型参数:')
print('\tw0: {:.2f}, w1: {:.2f}, w2: {:.2f}'.format(0, *coeff))
print('训练模型参数:')
print('\tw0: {:.2f}, w1: {:.2f}, w2: {:.2f}'.format(0, *OLS.coef_))
'''
真实模型参数:
	w0: 0.00, w1: 12.56, w2: 7.64
训练模型参数:
	w0: 0.00, w1: 12.58, w2: 7.77
'''

Se utiliza un enfoque más científico y completo 交叉验证/Cross-validation. El principio de este método es: cada vez, los datos se dividen aleatoriamente en un conjunto de entrenamiento y un conjunto de validación, y luego se sustituyen en el modelo para evaluar los errores del modelo durante el entrenamiento y la validación. Matemáticamente hablando, este método reduce la aleatoriedad de la verificación del muestreo aleatorio y es una evaluación más completa del desempeño del modelo. El código se muestra a continuación:

from sklearn.model_selection import cross_validate

# 这里的cv指的是把数据分成几份。比如,cv=10就是把数据分成十份,取一份作为验证集,九份作为训练集
cv_results = cross_validate(OLS, X, Y, cv=10, scoring="r2",
                            return_train_score=True)

print('Mean test score: {:.3f} (std: {:.3f})'
      '\nMean train score: {:.3f} (std: {:.3f})'.format(
                                              np.mean(cv_results['test_score']),
                                              np.std(cv_results['test_score']),
                                              np.mean(cv_results['train_score']),
                                              np.std(cv_results['train_score'])))
'''
Mean test score: 0.894 (std: 0.009)
Mean train score: 0.895 (std: 0.001)
'''

Nuestro modelo tiene una precisión de validación del 89,4% y una precisión de entrenamiento del 89,5%. En términos generales, es un modelo relativamente preciso sin sobreajuste ni desajuste.

También podemos utilizar el modelo entrenado para hacer predicciones, como:

print(OLS.predict([[42,24]])[0]) # 模型预测结果
print(coeff[0]*42+coeff[1]*24) # 真实值
'''
714.8098105630355
710.6836496552116
'''

Se puede observar que aunque se garantiza la solución óptima, las predicciones del modelo aún no son 100% precisas. La causa de este fenómeno proviene del conjunto de datos 随机噪声/Random Noise, es decir, los datos en sí no son 100% consistentes con su modelo subyacente. A veces podemos reducir el impacto del ruido en el algoritmo. Por ejemplo, para el procesamiento de imágenes, podemos usarlo 高斯滤波/Gaussian Filterpara reducir la interferencia del ruido de la imagen en el algoritmo de aprendizaje.

Conclusión

En el próximo blog, el blogger presentará cómo utilizar métodos ML para resolver 分类/Classificationproblemas simples. Si tienes alguna pregunta o sugerencia, no dudes en comentar o enviar un mensaje privado. Codificar no es fácil. Si te gusta el contenido del blogger, ¡dale me gusta y apóyalo!

Supongo que te gusta

Origin blog.csdn.net/EricFrenzy/article/details/131298610
Recomendado
Clasificación