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

发布于:2025-07-30 ⋅ 阅读:(22) ⋅ 点赞:(0)

一、线性回归简介

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}')

 代码整体作用

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


网站公告

今日签到

点亮在社区的每一天
去签到