[数学モデリング] 一般的なアルゴリズム - 線形回帰 Python の実装

1 はじめに

この記事では主に線形回帰に基づく糖尿病予測のPython実装について説明します。今後さらに更新していきます

2 コードの実装

2.1 データの準備

関連パッケージをインポートする

import numpy as np
import pandas as pd

データセットをロードする
このデータセットは sklearn.datasets に付属している糖尿病データセット (diabetes) データセットの詳細については、公式 Web サイトにアクセスして自分で確認できます

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

データセットの形状、データ、ラベルの上位 5 つのサンプルを表示する

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

ここに画像の説明を挿入
データには 10 列の特徴と 1 列のラベルが含まれていることがわかります。

2.2 モデルの定義

次に、線形回帰モデルのコード実装を説明します モデルの原理を自分で確認できます
線形回帰モデルのモデルパラメータを初期化します

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

モデルの本体を定義する

### 定义模型主体部分
### 包括线性回归公式、均方损失和参数偏导三部分
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

線形回帰モデルのトレーニングのプロセスを定義する

### 定义线性回归模型训练过程
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 トレーニングセットとデータセットの分割

# 导入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 モデルのトレーニングと予測

トレーニング中にモデルパラメータを定義する

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

予測関数を定義する

### 定义线性回归预测函数
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]

評価指標を定義します。R2 は回帰問題の一般的な指標です。MSE、MAE など、さらに多くの指標を試すことができます。

### 定义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

評価指標の値を出力します。このデータに対する線形回帰の効果はあまり満足のいくものではありません。後で説明するためにさらに多くのモデルを使用します。

print(r2_score(y_test, y_pred))

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_44319167/article/details/128823770