机器学习之线性回归——小白教学
一、线性回归简介
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}')
代码整体作用
通过线性回归模型分析糖尿病数据中各医学特征与病情进展的关系,构建可解释的数学模型,并利用该模型对新患者的病情进展进行预测。代码同时解决了特征名不匹配警告和系数格式化错误等常见问题,确保模型正常运行并输出直观的结果。