当前位置: 首页 > ai >正文

机器学习之线性回归——小白教学

一、线性回归简介

1.什么是线性回归

线性回归(Linear    regression)是利⽤回归⽅程(函数)对⼀个或多个⾃变量(特征值)和因变量(⽬标值)之间关系进⾏建模的⼀种分析⽅式。

特点:只有⼀个⾃变量的情况称为单变量回归,多于⼀个⾃变量情况的叫做多元回归

 

 线性回归⽤矩阵表示举例:

线性回归的特征与⽬标的关系分析 :

线性回归当中主要有两种模型,⼀种是线性关系,另⼀种是⾮线性关系。

二、线性回归api初步使⽤

sklearn.linear_model.LinearRegression(fit_intercept=True)
通过正规⽅程优化
参数:fit_intercept:是否计算偏置
属性:LinearRegression.coef_:回归系数
LinearRegression.intercept_:偏置
sklearn.linear_model.SGDRegressor(loss="squared_loss",    fit_intercept=True,    learning_rate    ='invscaling',eta0=0.01)
SGDRegressor类实现了随机梯度下降学习,它⽀持不同的loss函数和正则化惩罚项来拟合线性回归模型。
参数:loss:损失类型
loss=”squared_loss”:    普通最⼩⼆乘法
fit_intercept:是否计算偏置
learning_rate    :    string,    optional
学习率填充
'constant':    eta    =    eta0
'optimal':    eta    =    1.0    /    (alpha    *    (t    +    t0))    [default]
'invscaling':    eta    =    eta0    /    pow(t,    power_t)
power_t=0.25:存在⽗类当中对于⼀个常数值的学习率来说,可以使⽤learning_rate=’constant’    ,并使⽤eta0来指定学习率。
属性:
SGDRegressor.coef_:回归系数
SGDRegressor.intercept_:偏置

三、线性回归的损失和优化

1.损失函数

总损失定义为:

y 为第i个训练样本的真实值
h(x )为第i个训练样本特征值组合预测函数
⼜称最⼩⼆乘法

2.优化算法

如何去求模型当中的W,使得损失最⼩?(⽬的是找到最⼩损失对应的W值)
线性回归经常使⽤的两种优化算法:1.正规⽅程  2.梯度下降法

(1) 正规⽅程的推导

把该损失函数转换成矩阵写法:

其中y是真实值矩阵,X是特征值矩阵,w是权重矩阵
对其求解关于w的最⼩值,起⽌y,X    均已知⼆次函数直接求导,导数为零的位置,即为最⼩值。
求导:

 

注:式(1)到式(2)推导过程中,    X是⼀个m⾏n列的矩阵,并不能保证其有逆矩阵,但是右乘X 把其变成⼀个⽅阵,保证其有逆矩阵。
式(5)到式(6)推导过程中,和上类似。 

四、项目案列

1.问题背景

糖尿病是一种常见的慢性疾病,其病情发展与多种因素相关(如年龄、体重指数、血压等)。本案例将通过线性回归模型,探索这些因素与糖尿病病情进展的量化关系,实现对病情的预测。

2 数据介绍

输入特征(10 个):age(年龄)、sex(性别)、bmi(体重指数)、bp(平均血压)、s1-s6(6 项血清指标)

目标变量:target(一年后糖尿病病情进展的量化值)

数据已做标准化处理,可直接用于模型训练。

3.完整流程实现:

1. 导入必要的库

import pandas as pd  # 用于数据读取和处理
from sklearn.linear_model import LinearRegression  # 导入线性回归模型

2. 读取数据

data = pd.read_csv('糖尿病数据.csv', encoding='gbk')

用pd.read_csv读取 CSV 格式的糖尿病数据

 encoding='gbk'指定编码格式,确保中文正常显示(Windows 系统常见需求)

3. 计算相关性

corr = data[['age','sex','bmi','bp','s1','s2','s3','s4','s5','s6','target']].corr()

选取数据中的 10 个特征和 1 个目标变量target

用corr()计算这些变量之间的相关系数,用于分析变量间的相关性强度

4. 定义特征和目标变量

x = data[['age','sex','bmi','bp','s1','s2','s3','s4','s5','s6']]  # 特征变量
y = data[['target']]  # 目标变量(一年后糖尿病病情进展)

x包含 10 个输入特征:年龄、性别、体重指数、血压及 6 项血清指标
y是需要预测的目标变量:糖尿病病情进展的量化值

5. 构建并训练线性回归模型

lr_model = LinearRegression()  # 初始化线性回归模型
lr_model.fit(x, y)  # 用特征x和目标变量y训练模型

LinearRegression()创建线性回归模型实例
fit(x, y)通过最小二乘法拟合数据,求解最优回归系数

6. 评估模型性能

score = lr_model.score(x, y)  # 计算决定系数R²
print(f"模型决定系数(R²):{score}")

score(x, y)计算模型的决定系数 R²,衡量模型对数据的拟合程度
R² 取值范围为 [0,1],越接近 1 表示模型拟合效果越好

7. 准备预测数据并进行预测

# 构建带特征名的预测数据(解决特征名匹配问题)
predict_data = pd.DataFrame([[0.00538306037424807, -0.044641636506989, -0.0363846922044735,0.0218723549949558, 0.00393485161259318, 0.0155961395104161,0.0081420836051921, -0.00259226199818282, -0.0319914449413559,-0.0466408735636482]],columns=['age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6']
)
print("预测结果:", lr_model.predict(predict_data))  # 输出预测值

将新样本数据转换为 DataFrame 并指定与训练数据相同的特征名
predict(predict_data)使用训练好的模型对新样本进行预测,输出糖尿病病情进展的预测值

8. 提取模型参数并构建回归方程

coefficients = lr_model.coef_[0]  # 提取特征系数(权重),转换为一维数组
intercept = lr_model.intercept_[0]  # 提取截距项,转换为标量# 构建线性回归方程表达式
features = ['age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6']
model_expression = "y = "
for i in range(len(coefficients)):model_expression += f"{coefficients[i]:.2f}x{i+1} + "  # 拼接系数和特征编号
model_expression += f"{intercept:.2f}"  # 拼接截距项print(f'线性回归模型为:{model_expression}')  # 输出完整的回归方程
  • coef_[0]获取 10 个特征对应的系数(权重),表示各特征对目标变量的影响程度
  • intercept_[0]获取回归方程的截距项
  • 通过循环构建完整的线性回归方程表达式,直观展示各特征与目标变量的量化关系

完整代码如下:

import pandas as pd
from sklearn.linear_model import LinearRegression
data=pd.read_csv('糖尿病数据.csv',encoding='gbk')
corr=data[['age','sex','bmi','bp','s1','s2','s3','s4','s5','s6','target']].corr()
x=data[['age','sex','bmi','bp','s1','s2','s3','s4','s5','s6']]
y=data[['target']]
lr_model=LinearRegression()
lr_model.fit(x,y)
score=lr_model.score(x,y)
print(f"模型决定系数(R²):{score}")
predict_data = pd.DataFrame([[0.00538306037424807, -0.044641636506989, -0.0363846922044735,0.0218723549949558, 0.00393485161259318, 0.0155961395104161,0.0081420836051921, -0.00259226199818282, -0.0319914449413559,-0.0466408735636482]],columns=['age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6'])
print("预测结果:", lr_model.predict(predict_data))
coefficients = lr_model.coef_[0]
intercept = lr_model.intercept_[0]
features = ['age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6']
model_expression = "y = "
for i in range(len(coefficients)):model_expression += f"{coefficients[i]:.2f}x{i+1} + "
model_expression += f"{intercept:.2f}"
print(f'线性回归模型为:{model_expression}')

 代码整体作用

通过线性回归模型分析糖尿病数据中各医学特征与病情进展的关系,构建可解释的数学模型,并利用该模型对新患者的病情进展进行预测。代码同时解决了特征名不匹配警告和系数格式化错误等常见问题,确保模型正常运行并输出直观的结果。

http://www.xdnf.cn/news/16520.html

相关文章:

  • LRU(Least Recently Used)原理及算法实现
  • 最新优茗导航系统源码/全开源版本/精美UI/带后台/附教程
  • BreachForums 黑客论坛强势回归
  • sqLite 数据库 (2):如何复制一张表,事务,聚合函数,分组加过滤,列约束,多表查询,视图,触发器与日志管理,创建索引
  • JAVA_TWENTY—ONE_单元测试+注解+反射
  • 学习Python中Selenium模块的基本用法(3:下载浏览器驱动续)
  • Seq2Seq学习笔记
  • 前端优化之虚拟列表实现指南:从库集成到手动开发
  • 嵌入式学习日志————TIM定时中断之定时器定时中断
  • Python算法实战:从排序到B+树全解析
  • 算法精讲:二分查找(一)—— 基础原理与实现
  • 自学嵌入式 day37 HTML
  • 信号上升沿时间与频谱分量的关系
  • FastAPI后台任务:异步魔法还是同步噩梦?
  • Simulink建模-Three-Phase V-I Measurement 模块详解
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现各种食物的类型检测识别(C#代码UI界面版)
  • react 的 useTransition 、useDeferredValue
  • GitHub下载项目完整配置SSH步骤详解
  • Python day28
  • Linux重定向的理解
  • Mysql缓冲池和LRU
  • 树形结构递归查询与嵌套结构转换:Flask + PostgreSQL 完整实现
  • Linux 启动流程、密码破解、引导修复完全手册
  • MoR vs MoE架构对比:更少参数、更快推理的大模型新选择
  • vue面试题
  • AI驱动的知识管理新时代:释放组织潜力的关键武器
  • Python Flask: Windows 2022 server SMB账户(共享盘账户)密码修改
  • Java注解全面解析与应用实战
  • 在Word和WPS文字中把全角数字全部改为半角
  • 微信小程序无法构建npm,可能是如下几个原因