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

机器学习 线性回归算法及案例实现

目录

一.核心思想

二.误差项

1.什么是误差(残差):

2.误差项特性:

3.误差项的分布规律

三.极大似然估计

四.线性回归API参数

五.线性回归模型的属性和方法

六.案例实现

1.一元线性回归

2.多元线性回归

3.糖尿病案例实现


一.核心思想

线性回归的核心是找到一条最优的直线(或超平面,针对多个自变量),使得该直线尽可能接近所有数据点,即让实际观测值与直线上的预测值之间的误差最小化。

  • 对于单自变量(一元线性回归),模型可表示为:(y = wx + b\) 其中,y 是因变量(被预测的变量),x 是自变量(用于预测的变量),w 是斜率(表示自变量对因变量的影响程度),b 是截距(当自变量为 0 时因变量的取值)。

  • 对于多自变量(多元线性回归),模型扩展为:y = w1x1 + w2x2 + ... + wnxn + b 其中x1, x2, ..., xn是多个自变量,w1, w2, ..., wn 是各自的系数,代表每个自变量对因变量的独立影响。

二.误差项

1.什么是误差(残差):

实际观测值 y 与模型预测值y^之间的差异,即 e = y - y^。线性回归的目标是使所有残差的平方和最小(最小二乘法)

2.误差项特性:

  • 必然存在,自然界中产生的数据普遍存在波动和误差,因此误差项是不可避免的。
  • 服从正态分布(大部分误差集中在零附近,极少数偏离较远)

3.误差项的分布规律

  • 误差项服从正态分布(高斯分布),其概率密度函数表现为:
    • 误差值为零时概率最大(因模型拟合时尽量使数据点靠近预测线)。
    • 误差值远离零的概率逐渐减小(极端误差出现的概率极低)。

三.极大似然估计

极大似然估计可以作为线性回归模型中参数(如斜率、截距)的估计手段

极大似然估计的含义是指世界发生的事件都是最大概率出现的事件,由内部规律支撑其必然性。例如买彩票:单次购买不中是大概率事件,而多次购买中奖是必然结果。
真实发生的事件均为大概率事件,小概率事件仅针对个体(如张三出门被车撞),但需结合全局数据(如几千人出行仅一人出事)才能体现规律。

四.线性回归API参数

源码如下:

  • fit_intercept:是否包含截距(β₀),默认 True(建议保留,避免强制过原点)。
  • normalize:归一化,默认 False
  • copy_X:是否复制输入数据,默认 True(通常无需额外复制)。
  • n_jobs:并行任务数,-1 表示使用所有 CPU 核心,大规模数据可加速计算;默认 None(单进程)。

五.线性回归模型的属性和方法

  • 属性
    • coef_:特征系数(β₁, β₂, ...)。
    • intercept_:截距值(β₀)。
  • 方法
    • fit():训练模型。
    • predict():预测结果。
    • score():模型评分。

六.案例实现

1.一元线性回归

使用广告投入(X)和销售额(Y)的模拟数据演示一元线性回归。

data.csv数据如下:

        

导入相关的库

import pandas as pd
from sklearn.linear_model import LinearRegression

数据含有列名我们用pandas库的read()方法读取数据

data = pd.read_csv('data.csv')

计算算广告投入与销售额的相关系数(皮尔逊相关系数),结果为 0.9062,表明高度相关

corr=data[['广告投入','销售额']].corr()
print(corr)

使用 LinearRegression 训练模型,并划分特征数据x与结果y

需要注意由于predict()方法中参数必须是二维的,fit()方法中的第一个参数必须是二维数组所以我们这里的x必须都是二维数据所以又加了一个中括号,y最好也写出二维数组

lr_model = LinearRegression()
x = data[['广告投入']]
y = data[['销售额']]

调用fit()方法训练模型,并计算得分准确性

lr_model.fit(x,y)
score = lr_model.score(x,y)

获取斜率和截距,建立回归方程

a=lr_model.coef_[0][0]
b=lr_model.intercept_[0]
print('y={}x+{}'.format(a,b))y=3.737885462555064x+-36.36123348017615

预测数据

result1=lr_model.predict([[35]])
result2=lr_model.predict([[35],[45]])
print(result1,result2)[[94.46475771]] [[ 94.46475771][131.84361233]]

完整代码

import pandas as pd
from sklearn.linear_model import LinearRegressiondata = pd.read_csv('data.csv')# 打印相关系数矩阵
corr=data[['广告投入','销售额']].corr()
print(corr)lr_model = LinearRegression()
x = data[['广告投入']]
y = data[['销售额']]lr_model.fit(x,y)
score = lr_model.score(x,y)a=lr_model.coef_[0][0]
b=lr_model.intercept_[0]
print('y={}x+{}'.format(a,b))result1=lr_model.predict([[35]])
result2=lr_model.predict([[35],[45]])
print(result1,result2)

2.多元线性回归

以体重和年龄(X)预测血压收缩值(Y),数据包含多列特征。

数据内容如下:

实现思路与一元线性回归大差不差,完整代码如下:

import pandas as pd
from sklearn.linear_model import LinearRegression
data = pd.read_csv('多元线性回归.csv',encoding='gbk')
corr = data[['体重','年龄','血压收缩']].corr()lr_model =LinearRegression()
x=data[['体重','年龄']]
y=data[['血压收缩']]
lr_model.fit(x,y)
score = lr_model.score(x,y)result1=lr_model.predict([[80,45]])
result2=lr_model.predict([[80,45],[95,25]])a1=lr_model.coef_[0][0]
a2=lr_model.coef_[0][1]
b=lr_model.intercept_[0]
print('y={}x1+{}x2+{}'.format(a1,a2,b))y=2.136558138364147x1+0.4002161546496849x2+-62.963359112475956

3.糖尿病案例实现

提供 443 条糖尿病患者数据,目标变量(Y)为糖尿病指标值

分析特征X(如年龄、BMI、化验指标等)与目标变量的关系

糖尿病数据.csv数据如下:

读取数据,并计算相关系数

import pandas as pd
from sklearn.linear_model import LinearRegression
data = pd.read_csv('糖尿病数据.csv')
corr=data[['age','sex','bmi','bp','s1','s2','s3','s4','s5','s6','target']].corr()

利用pandas库的iloc方法划分数据集,我们将前220行作为训练集,其余作为测试集

train_data = data.iloc[:220,:]
test_data = data.iloc[220:,:]

构建模型,并划分训练集的特征数据与预测结果,由数据内容可知最后一列为结果

lr_model = LinearRegression()
train_x=train_data.iloc[:,:-1]
train_y=train_data.iloc[:,-1]

训练模型并计算得分

lr_model.fit(train_x,train_y)
score_train=lr_model.score(train_x,train_y)
print('score_train=',score_train)score_train= 0.4903256259671942

划分训练集的特征数据与预测结果,然后将数据进行预测,计算得分

test_x=test_data.iloc[:,:-1]
test_y=test_data.iloc[:,-1]
lr_model.predict(test_x)
score_test=lr_model.score(test_x,test_y)
print('score_test=',score_test)score_test= 0.5253249763474657

完整代码实现:

import pandas as pd
from sklearn.linear_model import LinearRegression
data = pd.read_csv('糖尿病数据.csv')
corr=data[['age','sex','bmi','bp','s1','s2','s3','s4','s5','s6','target']].corr()
print(corr)
train_data = data.iloc[:220,:]
test_data = data.iloc[220:,:]lr_model = LinearRegression()
train_x=train_data.iloc[:,:-1]
train_y=train_data[['target']]
lr_model.fit(train_x,train_y)
score_train=lr_model.score(train_x,train_y)
print('score_train=',score_train)test_x=test_data.iloc[:,:-1]
test_y=test_data[['target']]
lr_model.predict(test_x)
score_test=lr_model.score(test_x,test_y)
print('score_test=',score_test)

http://www.dtcms.com/a/304422.html

相关文章:

  • RESTful API开发指南:使用Spring Boot构建企业级接口
  • x86_64汇编
  • 微信小程序私密消息
  • 实习日志111
  • ElementUI表格 el-table实现自动循环滚动
  • Rust:高效错误处理工具 anyhow
  • 大文档免费翻译方法分享
  • AbMole小课堂丨Blasticidin S(杀稻瘟菌素S)在构建稳转株、抗肿瘤、抗植物病害的跨界应用
  • 6、微服务架构常用十种设计模式
  • 随缘玩 一: 代理模式
  • 算法导论核心代码精粹
  • USRP X440 和USRP X410 直接RF采样架构的优势
  • 【51单片机静态1位数码管显示按键倒计时控制蜂鸣器】2022-9-28
  • Wndows Docker Desktop-Unexpected WSL error
  • AUTOSAR Mcal Dio - 模块介绍 + EB配置工具介绍
  • 【开源项目】轻量加速利器 HubProxy 自建 Docker、GitHub 下载加速服务
  • Doris中文检索效果调优
  • 自组织遗传算法(Self-Organizing Genetic Algorithm, SOGA)求解Rastrigin函数优化问题
  • 【Rust并发集合】如何在多线程中并发安全地使用集合
  • 【AI News | 20250728】每日AI进展
  • 接口自动化测试pytest框架
  • 网络原理--HTTPHTTPS
  • JAVA_TWENTY—ONE_单元测试+注解+反射
  • MySQL——MVCC
  • ftp加ssl,升级ftps
  • 解决Spring MVC中@PathVariable参数为null导致的404问题:全面解析与最佳实践
  • Spring MVC数据传递全攻略
  • 架构实战——互联网架构模板(“网络层”技术)
  • WINCC选项组配置
  • Spring Boot 请求限流实战:基于 IP 的高效防刷策略