[Modelado matemático] Algoritmos comunes: implementación de Python de regresión lineal

1. Introducción

Este artículo explica principalmente la implementación en Python de la predicción de la diabetes basada en la regresión lineal, y se realizarán más actualizaciones más adelante.

2 implementación de código

2.1 Preparación de datos

importar paquetes relacionados

import numpy as np
import pandas as pd

Cargue el conjunto de datos
Este conjunto de datos es el conjunto de datos sobre diabetes (diabetes) que viene con sklearn.datasets. Para obtener detalles sobre el conjunto de datos, puede ir al sitio web oficial para verificarlo usted mismo.

from sklearn.datasets import load_diabetes
diabetes = load_diabetes() # 加载数据集
data = diabetes.data
target = diabetes.target 

Vea las 5 mejores muestras de formas, datos y etiquetas de conjuntos de datos

print(data.shape)
print(target.shape)
print(data[:5])
print(target[:5])

inserte la descripción de la imagen aquí
Puede ver que los datos incluyen 10 columnas de características y una columna de etiquetas.

2.2 Definición del modelo

A continuación, explique la implementación del código del modelo de regresión lineal. Puede verificar el principio del modelo usted mismo.
Inicialice los parámetros del modelo del modelo de regresión lineal.

### 初始化模型参数
def initialize_params(dims): 
    '''
    dims: 训练数据的维度
    w: 初始化的权重
    b:  初始化的偏置
    '''
    w = np.zeros((dims, 1))
    b = 0
    return w, b

Definir el cuerpo del modelo.

### 定义模型主体部分
### 包括线性回归公式、均方损失和参数偏导三部分
def linear_loss(X, y, w, b): # 训练集数据、y训练集标签
    num_train = X.shape[0] # 有多少条训练样本
    num_feature = X.shape[1] # 特征的维度
    y_hat = np.dot(X, w) + b # 求线性回归模型的预测值
    loss = np.sum((y_hat-y)**2)/num_train # 计算损失函数
    dw = np.dot(X.T, (y_hat-y)) /num_train
    db = np.sum((y_hat-y)) /num_train
    return y_hat, loss, dw, db

Definir el proceso de entrenamiento del modelo de regresión lineal.

### 定义线性回归模型训练过程
def linear_train(X, y, learning_rate=0.01, epochs=10000):
    loss_his = [] # 记录损失函数的空列表 #每次迭代的均方损失
    w, b = initialize_params(X.shape[1])
    for i in range(1, epochs):
        y_hat, loss, dw, db = linear_loss(X, y, w, b)
        w += -learning_rate * dw
        b += -learning_rate * db
        loss_his.append(loss)
        if i % 10000 == 0:
            print('epoch %d loss %f' % (i, loss))
        params = {
    
    
            'w': w,
            'b': b
        }
        grads = {
    
    
            'dw': dw,
            'db': db
        }     
    return loss_his, params, grads

2.3 División del conjunto de entrenamiento y conjunto de datos

# 导入sklearn diabetes数据接口
from sklearn.datasets import load_diabetes
# 导入sklearn打乱数据函数
from sklearn.utils import shuffle
diabetes = load_diabetes()
data, target = diabetes.data, diabetes.target # 与上边两行是等价的关系
X, y = shuffle(data, target, random_state=13) # 随机打乱数据集,随机种子设置为13
offset = int(X.shape[0] * 0.8) # 按照8:2的比例划分了训练集和测试集
X_train, y_train = X[:offset], y[:offset] # 训练数据和训练标签
X_test, y_test = X[offset:], y[offset:] # 测试数据和测试标签
y_train = y_train.reshape((-1,1))
y_test = y_test.reshape((-1,1))
print("X_train's shape: ", X_train.shape)
print("X_test's shape: ", X_test.shape)
print("y_train's shape: ", y_train.shape)
print("y_test's shape: ", y_test.shape)

2.4 Entrenamiento y predicción de modelos.

Definir los parámetros del modelo durante el entrenamiento.

# 线性回归模型训练
loss_his, params, grads = linear_train(X_train, y_train, 0.01, 200000)
# 打印训练后得到模型参数
print(params)

Definir la función de predicción.

### 定义线性回归预测函数
def predict(X, params):
    w = params['w']
    b = params['b']
    # b = 150.8144748910088
    y_pred = np.dot(X, w) + b
    return y_pred
y_pred = predict(X_test, params)
y_pred[:5]

Defina indicadores de evaluación, R2 es un indicador común para problemas de regresión, puede probar con más indicadores, como MSE, MAE, etc.

### 定义R2系数函数
def r2_score(y_test, y_pred):
    y_avg = np.mean(y_test)
    ss_tot = np.sum((y_test - y_avg)**2) # 总离差平方和
    ss_res = np.sum((y_test - y_pred)**2) # 残差平方和
    r2 = 1 - (ss_res/ss_tot) # R方
    return r2

Imprima el valor del índice de evaluación. El efecto de la regresión lineal sobre estos datos no es muy satisfactorio. Se utilizarán más modelos para explicar más adelante.

print(r2_score(y_test, y_pred))

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_44319167/article/details/128823770
Recomendado
Clasificación