lazo regreso-regreso a la practica

Práctica de regresión del algoritmo de regresión de lazo de Python

concepto basico

Regularización

La regularización se refiere a hacer restricciones explícitas en el modelo para evitar el sobreajuste. La regresión de lazo utilizada en este artículo es la regularización L1. (Desde un punto de vista matemático, lasso penaliza la norma L1 del vector de coeficientes, es decir, la suma de los valores absolutos de los coeficientes).

Los principios específicos de regularización no se describen aquí. Quienes estén interesados ​​pueden leer este artículo: Comprensión intuitiva de los términos de regularización L1 y L2 en el aprendizaje automático .

Introducción al algoritmo

regresión de lazo

Antes de entender el lazo de regresión, se recomienda que los amigos hacen una cierta comprensión de mínimos cuadrados ordinarios y regresión contraída, puede hacer referencia a estos dos artículos: la práctica de mínimos cuadrados regresión , canto la práctica de regresión regresión .

Además de la regresión de crestas, lasso es otro modelo de regresión lineal regularizado, por lo que su fórmula de modelo es la misma que la del método de mínimos cuadrados, como se muestra en la siguiente fórmula:

y = w [0] * x [0] + w [1] * x [1] + w [2] x [2] +… + w [p] x [p] + b

Al igual que la regresión de crestas, el uso de lazo también restringe el coeficiente w a cerca de 0, pero el método utilizado es diferente, llamado regularización L1. El resultado de la regularización L1 es que algunos coeficientes son exactamente 0 cuando se usa lazo. Esto muestra que el modelo ignora por completo algunas características. Esto puede verse como una selección de funciones automatizada. Algunos coeficientes son exactamente 0, por lo que el modelo es más fácil de entender y también puede presentar las características más importantes del modelo.

Fuentes de datos

Precios de la vivienda en Boston: https://www.kaggle.com/altavish/boston-housing-dataset
es un dato muy clásico
Inserte la descripción de la imagen aquí

Explique brevemente los principales indicadores de estos datos:
ZN: La proporción de terreno por encima de los 25,000 pies cuadrados que se divide en zonas como terreno residencial.
RM: El número medio de habitaciones por residencia.
EDAD: Proporción de casas propias construidas antes de 1940
CHAS: Si pasa un río (si es igual a 1, significa sí, igual a 0 significa no)
CRIM: tasa de criminalidad
MEDV: precio de la vivienda
otros indicadores no hace falta decir que son todos algunos otros indicadores de vivienda, los amigos interesados ​​pueden comprobarlo por sí mismos.

Procesamiento de datos

1. Importar bibliotecas de terceros

import pandas as pd
import numpy as np
import winreg
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Lasso###导入岭回归算法
from sklearn.metrics import r2_score

Las reglas antiguas aparecen primero para importar cada módulo necesario para el modelado a su vez.

2. Leer el archivo

import winreg
real_address = winreg.OpenKey(winreg.HKEY_CURRENT_USER,r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders',)
file_address=winreg.QueryValueEx(real_address, "Desktop")[0]
file_address+='\\'
file_origin=file_address+"\\源数据-分析\\HousingData.csv"#设立源数据文件的桌面绝对路径
house_price=pd.read_csv(file_origin)#https://www.kaggle.com/altavish/boston-housing-dataset

Porque cada vez que descarga datos, debe transferir el archivo al directorio raíz de Python o leerlo en la carpeta de descarga, lo cual es muy problemático. Así que configuré una ruta de escritorio absoluta a través de la biblioteca winreg, de modo que solo necesito descargar los datos al escritorio o pegarlos en una carpeta específica en el escritorio para leerlos, y no se confundirán con otros datos.
De hecho, hasta este paso, estamos pasando por el proceso, básicamente cada minería de datos tiene que hacerse nuevamente, no hay nada que decir.

3. Limpiar los datos

1. Encuentra los valores perdidos
Inserte la descripción de la imagen aquí

Puede ver que estos datos no incluyen muchos valores faltantes, así que elimínelos.

house_price1=house_price.dropna().reset_index()
del house_price1["index"]

2. Encuentra el valor de la mutación

Inserte la descripción de la imagen aquí
Generalmente, es para ver si el valor propio contiene datos iguales a cero. De hecho, lo más sencillo es ver si los datos contienen valores poco realistas, como la tasa de criminalidad. En la práctica, no existe un área con una tasa de criminalidad igual a 0. De los resultados anteriores, no hay otros problemas con estos datos.
Tanto ZN como CHAS en estos datos usan 0 y 1 como indicador, por lo que es normal incluir 0.

4. Modelado

train=house_price1.drop(["MEDV"],axis=1)
X_train,X_test,y_train,y_test=train_test_split(train,house_price1["MEDV"],random_state=23)
lasso=Lasso(alpha=10,max_iter=0)
lasso.fit(X_train,y_train)
print("Lasso训练模型得分:"+str(r2_score(y_train,lasso.predict(X_train))))#训练集
print("Lasso待测模型得分:"+str(r2_score(y_test,lasso.predict(X_test))))#待测集

Después de introducir el algoritmo de lazo, después del modelado, se puntúa la precisión del conjunto de prueba y los resultados obtenidos son los siguientes:

Inserte la descripción de la imagen aquí
Como puede ver en los resultados, Lasso tiene un rendimiento deficiente en el conjunto de entrenamiento y el conjunto de prueba. Esto indica que hay un sobreajuste. Similar a la regresión de cresta, lasso también tiene un parámetro de regularización alfa, que puede controlar la fuerza del coeficiente que tiende a 0. En el modelo anterior, usamos alfa = 10. Para reducir el desajuste, intentamos reducir el alfa. Al mismo tiempo, también necesitamos aumentar el valor de max_iter (el número máximo de iteraciones para ejecutar). El resultado es el siguiente:
Inserte la descripción de la imagen aquí

Después de modificar sucesivamente los coeficientes, se puede ver que la precisión de entrenamiento del modelo es de aproximadamente el 79%, y para los nuevos datos, la precisión del modelo es de aproximadamente el 60%.
En este punto, el modelado de este conjunto de datos está completo.
ps: Si el valor de max_iter es demasiado pequeño, aparecerá una advertencia de que el valor debe ser mayor y el valor de max_iter no afectará la precisión del modelo.

discutir

Comparación con el algoritmo de regresión de crestas

Echemos un vistazo a las ventajas y desventajas de la regresión de lazo y cresta cambiando los valores de los parámetros de restricción.

from sklearn.linear_model import Ridge###导入岭回归算法
result=pd.DataFrame(columns=["参数","lasso训练模型得分","lasso待测模型得分","岭回归训练模型得分","岭回归待测模型得分"])
for i in range(1,100):
    alpha=i/10
    ridge=Ridge(alpha=alpha)
    lasso=Lasso(alpha=alpha,max_iter=10000)
    ridge.fit(X_train,y_train)
    lasso.fit(X_train,y_train)
    result=result.append([{
    
    "参数":alpha,"lasso训练模型得分":r2_score(y_train,lasso.predict(X_train)),"lasso待测模型得分":r2_score(y_test,lasso.predict(X_test)),"岭回归训练模型得分":r2_score(y_train,ridge.predict(X_train)),"岭回归待测模型得分":r2_score(y_test,ridge.predict(X_test))}])

El resultado es el siguiente:
Inserte la descripción de la imagen aquí

Se puede ver que a medida que cambia el alfa, los dos algoritmos mostrarán ciertas reglas, ya sean el modelo de entrenamiento o el modelo a probar. A continuación, usamos un gráfico de líneas para mostrar los datos anteriores de manera más intuitiva:

import matplotlib.pyplot as plt
import seaborn as sns
plt.style.use("fivethirtyeight")
sns.set_style({
    
    'font.sans-serif':['SimHei','Arial']})#设定汉字字体,防止出现方框
%matplotlib inline
#在jupyter notebook上直接显示图表
fig= plt.subplots(figsize=(15,5))
plt.plot(result["参数"],result["lasso训练模型得分"],label="lasso训练模型得分")#画折线图
plt.plot(result["参数"],result["lasso待测模型得分"],label="lasso待测模型得分")
plt.plot(result["参数"],result["岭回归训练模型得分"],label="岭回归训练模型得分")
plt.plot(result["参数"],result["岭回归待测模型得分"],label="岭回归待测模型得分")
plt.rcParams.update({
    
    'font.size': 15})
plt.legend()
plt.xticks(fontsize=15)#设置坐标轴上的刻度字体大小
plt.yticks(fontsize=15)
plt.xlabel("参数",fontsize=15)#设置坐标轴上的标签内容和字体
plt.ylabel("得分",fontsize=15)

El resultado es el siguiente:
Inserte la descripción de la imagen aquí

Se puede ver que si el alfa es pequeño, podemos ajustar un modelo más complejo y tener un mejor desempeño en el conjunto de entrenamiento y el conjunto de prueba. La capacidad de generalización del modelo es ligeramente mejor que usar la regresión de cresta (líneas rojas y verdes). Pero con el aumento del parámetro alfa, el fenómeno de desajuste del modelo de algoritmo de lazo se volverá cada vez más obvio (línea roja y línea azul), es decir, la precisión del modelo y la capacidad de generalización disminuirán gradualmente.

Pero si el alfa se establece demasiado pequeño, el efecto de la regularización se eliminará y se producirá un ajuste excesivo, lo que dará como resultado un resultado similar al método de mínimos cuadrados.

Al mismo tiempo, se puede ver que cuando alfa toma un cierto valor, el rendimiento predictivo de la regresión de la cresta es similar al del modelo de lazo (observe la intersección de las dos líneas).

Por lo tanto, en la práctica, generalmente se prefiere la regresión de crestas para estos dos modelos. Se puede ver en la figura que a medida que cambian los parámetros, la puntuación del modelo cambia suavemente, e incluso cuando los parámetros aumentan, la capacidad de generalización será ligeramente Mejora (verde línea). Pero si hay muchas características y cree que solo algunas de ellas son importantes, entonces puede ser mejor elegir lazo. Del mismo modo, si desea un modelo que sea más fácil de explicar, Lasso puede proporcionar un modelo que sea más fácil de entender, porque solo selecciona una parte de los valores propios como entrada.

Lo anterior trata sobre el funcionamiento real y las vistas del algoritmo de lazo. Hay muchos lugares donde no es muy bueno. Los internautas son bienvenidos a hacer sugerencias y espero encontrar algunos amigos para discutir juntos.

Supongo que te gusta

Origin blog.csdn.net/weixin_43580339/article/details/112983192
Recomendado
Clasificación