栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

笔记三 线性回归(二)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

笔记三 线性回归(二)

目录

介绍

波士顿房价数据集

一、梯度下降法实现线性回归

1、模型实现

2、加载数据:

3、模型调用

 二、最小二乘法实现线性回归

1、模型实现

2、模型调用

 三、对比sklearn的实现

1、预测结果比较

2、评价指标比较


介绍

这节主要介绍三种线性回归方法,并对它们进行对比。前两种方法是我自己写的,分别使用梯度下降法和最小二乘法求得模型参数,第三种方法使用sklearn封装的线性回归。

实验数据是应用sklearn自带的波士顿房价数据,以下对该数据的调用进行介绍

波士顿房价数据集

首先从sklearn的数据集中调用波士顿房价数据

from sklearn.datasets import load_boston

其次加载数据集:

# 加载波士顿房价数据集,返回特征X和标签y
X, y = load_boston(return_X_y=True)

X.shape # (506, 13)
y.shape # (506,)

一、梯度下降法实现线性回归

1、模型实现
import numpy as np
import matplotlib.pyplot as plt

class LinearRegression1:
    '''梯度下降法实现线性回归'''
    def __init__(self,learning_rate=0.1,epoch=5000):
        '''
        learning_rate: 学习率,控制参数更新的幅度
        epoch: 在训练集上训练迭代的最大次数
        cost_list: 记录每次迭代后的经验风险
        '''
        self.learning_rate = learning_rate
        self.epoch = epoch
        self.cost_list = []

    # 模型训练:使用梯度下降法更新参数
    def fit(self,X_train,y_train):
        '''
        X_train: m x n的矩阵
        y_train: 有m个元素的一维数组
        '''
        # 模型有偏置项b,因此需要给每个测试样本增加特征x_temp = 1
        x_temp = np.ones((X_train.shape[0], 1))
        X_train = np.concatenate((x_temp, X_train), axis=1)

        # 训练样本的数量
        m = X_train.shape[0]
        # 训练样本的维数
        n = X_train.shape[1]
        # 模型参数初始化
        self.w = np.ones(n)

        # 模型参数确定
        for i in range(self.epoch):
            # 计算训练样本预测值
            y_pred = np.dot(X_train, self.w)
            # 计算损失函数值
            cost = np.dot(y_pred - y_train, y_pred - y_train) / (2 * m)
            # 记录每次迭代对应的损失函数值
            self.cost_list.append(cost)
            # 参数更新
            self.w -= self.learning_rate / m * np.dot(y_pred - y_train, X_train)

    # 预测函数
    def predict(self, X_test):
        '''
        X_test: m x n的矩阵
        '''
        # 模型有偏置项b,因此需要给每个测试样本增加特征x_temp = 1
        x_temp = np.ones((X_test.shape[0], 1))
        X_test = np.concatenate((x_temp, X_test), axis=1)

        # 返回结果预测结果
        return np.dot(X_test, self.w)

    # 绘制损失函数的收敛趋势图
    def plot_cost(self):
        plt.plot(np.arange(self.epoch), self.cost_list)
        plt.xlabel('epoch')
        plt.ylabel('cost')
        plt.show()

2、加载数据:

利用介绍的方法调用波士顿房价数据集,并对数据进行预处理及数据集的划分。

代码实现如下:

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler

# 加载波士顿房价数据集
X, y = load_boston(return_X_y=True)
# 特征X归一化到 [0,1] 范围内:提升模型收敛速度
X = MinMaxScaler().fit_transform(X)
# 数据集划分,其中测试集占20%
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2)

3、模型调用
# 实例化一个对象
model1 = LinearRegression1()
# 用训练集训练此模型
model1.fit(X_train,y_train)

# 损失函数的收敛趋势图显示
model1.plot_cost()
# 进行预测
y_pred = model1.predict(X_test)

得到损失函数收敛趋势图如下:


 二、最小二乘法实现线性回归 1、模型实现
import numpy as np
import matplotlib.pyplot as plt

class LinearRegression2:
    '''最小二乘法实现线性回归'''

    # 模型训练:使用梯度下降法更新参数
    def fit(self, X_train, y_train):
        '''
        X_train: m x n的矩阵
        y_train: 有m个元素的一维数组
        '''
        # 模型有偏置项b,因此需要给每个测试样本增加特征x_temp = 1
        x_temp = np.ones((X_train.shape[0], 1))
        X_train = np.concatenate((x_temp, X_train), axis=1)

        # 训练样本的数量
        m = X_train.shape[0]
        # 训练样本的维数
        n = X_train.shape[1]

        # 初始化模型参数
        self.w = np.ones((n, 1))

        # 根据最小二乘法确定w
        self.w = np.linalg.inv(X_train.T.dot(X_train)).dot(X_train.T.dot(y_train))


    def predict(self,X_test):
        '''
        X_test: m x n的矩阵
        '''
        # 模型有偏置项b,因此需要给每个测试样本增加特征x_temp = 1
        x_temp = np.ones((X_test.shape[0], 1))
        X_test = np.concatenate((x_temp, X_test), axis=1)

        # 返回结果预测结果
        return np.dot(X_test, self.w)

数据加载和第一个一样

2、模型调用
# 实例化一个对象
model2 = LinearRegression2()
# 用训练集训练此模型
model2.fit(X_train,y_train)
# 预测数据
y_pred = model2.predict(X_test)

# 数据可视化
plt.scatter(y_test,y_pred)
plt.xlabel('y_test')
plt.ylabel('y_pred')

x_max = np.max(y_test)
x = np.arange(0,x_max)
plt.plot(x,x,c='r')
plt.show()

 三、对比sklearn的实现

1、预测结果比较
# 引入 sklearn 线性回归模型
from sklearn.linear_model import LinearRegression
import pandas as pd

# 实例化模型对象
my_model1 = LinearRegression1()    # 梯度下降法
my_model2 = LinearRegression2()    # 最小二乘法
sklearn_model = LinearRegression()   # sklearn自带线性回归模型

# 模型训练
my_model1.fit(X_train,y_train)
my_model2.fit(X_train,y_train)
sklearn_model.fit(X_train,y_train)

# 在测试集上预测
my_model1_pred = my_model1.predict(X_test)
my_model2_pred = my_model2.predict(X_test)
sklearn_model_pred = sklearn_model.predict(X_test)

# 数据输出以表格形式展示,且只展示前15行数据
house_price = pd.Dataframe([y_test,my_model1_pred,my_model2_pred,sklearn_model_pred]).T.head(15)
# 表头列名设置
house_price.columns = ['true_value','my_model1_pred','my_model2_pred','sklearn_model_pred']

# 写入excel
house_price.to_excel('price.xlsx')

结果为:

 true_valuemy_model1_predmy_model2_predsklearn_model_pred
013.811.9499612511.7301884811.73018848
11317.7391041117.5543927417.55439274
224.129.3764951229.714576429.7145764
319.919.8042148619.6350174519.63501745
418.519.2282117519.1425023319.14250233
58.516.7509186416.7607658316.76076583
616.720.4392339420.3029199120.30291991
722.620.0372035619.8636371819.86363718
829.430.388361330.6493738930.64937389
924.428.3404745228.4849453528.48494535
1023.823.1669848223.5055772723.50557727
1122.723.5318516223.3159044823.31590448
1221.720.8727672620.9818399920.98183999
1313.315.9847293316.0149972916.01499729
141920.9751858920.9850920320.98509203

从结果可知,三种模型的预测结果还是较为相似的

2、评价指标比较
  • MSE:均方误差

  • MAE:平均绝对误差

  • :相关系数

# 调用sklearn中的算法计算评价指标
from sklearn.metrics import mean_squared_error,mean_absolute_error,r2_score

# MSE:均方误差
my_model1_mse = mean_squared_error(y_test,my_model1_pred)
my_model2_mse = mean_squared_error(y_test,my_model2_pred)
sklearn_model_mse = mean_squared_error(y_test,sklearn_model_pred)

print(my_model1_mse,my_model2_mse,sklearn_model_mse)

# MAE:平均绝对误差
my_model1_mae = mean_absolute_error(y_test,my_model1_pred)
my_model2_mae = mean_absolute_error(y_test,my_model2_pred)
sklearn_model_mae = mean_absolute_error(y_test,sklearn_model_pred)

print(my_model1_mae,my_model2_mae,sklearn_model_mae)

# R2:相关系数
my_model1_r2 = r2_score(y_test,my_model1_pred)
my_model2_r2 = r2_score(y_test,my_model2_pred)
sklearn_model_r2 = r2_score(y_test,sklearn_model_pred)

print(my_model1_r2,my_model2_r2,sklearn_model_r2)

实验结果:

my_model1my_model2sklearn_model
MSE21.2121.5021.50
MAE3.573.603.60
R20.710.700.70

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/268946.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号