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])
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))