目录
一、线性回归算法是什么
线性回归(Linear Regression)是一种基本的回归分析方法,目的是通过数据集中的自变量(特征)来预测因变量(目标)。线性回归假设目标变量与自变量之间存在线性关系,模型的目标是通过调整权重(系数)来最小化预测值与实际值之间的差距。
在一元线性回归中,假设目标变量(y)与一个自变量(x)之间有线性关系:
其中:
1.(y) 是因变量(预测目标),
2.(x) 是自变量(输入特征),
3.(a) 是回归系数(斜率),
4.(b) 是截距。
在多元线性回归中,目标变量与多个自变量之间存在线性关系:
这里有多个自变量((x1, x2, …, xn)),相应的回归系数((a1, a2, …, an))表示每个自变量对因变量的影响。
二、一元线性回归和多元线性回归
2.1一元线性回归:
一元线性回归模型仅涉及一个自变量,用来预测一个因变量。模型的形式是:
通过拟合数据,得到系数 (a) 和截距 (b),进而预测目标变量。
2.2.多元线性回归:
多元线性回归涉及多个自变量,能够捕捉更多的复杂关系。模型的形式是:
该模型适用于具有多个特征(变量)的数据集,通常用于预测多个特征影响下的因变量。
三、Python实现线性回归算法
在Python中,我们可以使用scikit-learn库来实现线性回归模型。pandas库则帮助我们处理数据,特别是读取CSV文件,方便数据的操作和处理。
3.1:使用到的库和函数
import pandas as pd
from sklearn.linear_model import LinearRegression
(1)pandas库:用于数据处理,读取CSV文件并进行数据清洗。
pd.read_csv():从CSV文件读取数据。
DataFrame.corr():计算相关系数矩阵。
(2)sklearn.linear_model.LinearRegression:用于实现线性回归模型。
fit():用来训练线性回归模型,基于数据集中的特征和目标变量。
score():用于评估模型的好坏,输出 (R^2) 值。
predict():用于根据训练好的模型对新的数据进行预测。
3.2代码实现一般流程(详细案例背景见第五点)
#第零步:导入相关库和函数
import pandas as pd
from sklearn.linear_model import LinearRegression
#第一步:数据导入和数据预处理
# 导入数据
data = pd.read_csv("多元线性回归.csv", encoding='gbk', engine='python')
# 读取CSV文件,返回DataFrame格式的数据
#这个案例数据集已经处理好了,直接使用,有的案例需要numpy或pandas库中的方法或函数预数据处理
#打印相关系数矩阵,查看各个特征之间的相关性
#corr = data[["体重", "年龄", "血压收缩"]].corr()
#print("相关系数矩阵:")
#print(corr)
# 第二步:建立线性回归模型
lr_model = LinearRegression() # 创建线性回归模型对象
# 定义自变量和因变量
x = data[['体重', '年龄']] # 选取"体重"和"年龄"作为自变量
y = data[['血压收缩']] # 选取"血压收缩"作为因变量
#第三步:训练模型
lr_model.fit(x, y) # 使用训练数据训练回归模型
# 第四步:模型评估
score = lr_model.score(x, y) # 计算R²值,评估模型的拟合度
print(f"模型的R²值:{score:.4f}")
# 第五步:得到回归方程,使用模型进行预测
print("预测结果:")
print(lr_model.predict([[80, 60]])) # 对新的数据进行预测,输入体重为80,年龄为60
print(lr_model.predict([[70, 30], [70, 20]])) # 对多组数据进行预测
# 输出回归模型的系数和截距
a = lr_model.coef_ # 获取回归系数
b = lr_model.intercept_ # 获取截距
print(f"线性回归模型为:y = {a[0][0]:.2f}x1 + {a[0][1]:.2f}x2 + {b[0]:.2f}")
解释代码中的函数和参数:
1.pd.read_csv():pandas库中的方法,用于从CSV文件中读取数据,常用的参数如encoding='gbk'是为了处理中文字符编码问题,确保文件读取不产生乱码,engine='python'指定使用Python解析引擎,这有助于处理一些复杂或非标准的CSV文件格式,尤其是在数据量较小或特定格式时。
2.DataFrame.corr():pandas库中的方法,计算数据框中指定列的相关系数。相关系数衡量两列数据之间的线性关系,取值范围在-1到1之间,1表示完全正相关,-1表示完全负相关,0表示无线性关系。该方法返回一个相关矩阵,可以通过它分析多变量之间的关系。
3.LinearRegression():sklearn.linear_model库中的方法,初始化线性回归模型。这个模型通过最小化误差平方和来拟合数据,以建立自变量和因变量之间的线性关系。通常用于预测和回归任务,是回归分析中最常用的算法之一。
4.fit(X, y):sklearn.linear_model库中的方法,训练线性回归模型。X是输入数据(自变量或特征),y是目标变量(因变量)。fit方法通过学习数据中的模式,调整模型参数(回归系数)以最佳拟合数据。这一步是模型的训练过程。
5.predict():sklearn.linear_model库中的方法,用于预测新的数据点的因变量值。输入的X为新的自变量数据,predict方法利用模型中的已学习的回归系数生成因变量的预测值。它可以在已有模型的基础上预测未见数据的结果。
6.coef_ 和 intercept_:sklearn.linear_model库中的属性,分别表示回归模型的系数和截距。coef_是每个特征变量的权重,表示每个自变量对因变量的影响程度;intercept_是回归方程的常数项,表示当所有自变量为零时,因变量的值。
四、多元线性回归的案例(糖尿病检测)
在这个案例中,我们使用一个多元线性回归模型和多个特征来预测是否患有糖尿病。数据集包含442行数据,每一行是一个患者的特征信息,包含了10个特征(如年龄、性别、体质指数等)和一个目标变量(target),表示是否患有糖尿病。下面是如何使用线性回归模型来实现糖尿病预测。
4.1:csv数据集(测试集/训练集):
4.2:代码实现:
import pandas as pd
from sklearn.linear_model import LinearRegression
# 1. 读取数据
data = pd.read_csv("糖尿病数据.csv") # 读取糖尿病数据集
# 2. 构造自变量(10 个)和因变量
feature_cols = ['age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6'] # 特征列
X = data[feature_cols] # 自变量
y = data['target'] # 因变量
# 3. 建立并训练模型
lr_model = LinearRegression() # 创建线性回归模型对象
lr_model.fit(X, y) # 训练回归模型
# 4. 模型评估
print(f"R² = {lr_model.score(X, y):.4f}") # 输出模型的R²值
# 5. 预测示例
sample1 = pd.DataFrame([[0.0381, 0.0507, 0.0617, 0.0219, -0.0442, -0.0348, -0.0434, -0.0026, 0.0199, -0.0176]],
columns=feature_cols)
sample2 = pd.DataFrame([[0.0, -0.0446, 0.0445, -0.0057, -0.0456, -0.0342, -0.0324, -0.0026, 0.0029, -0.0259],
[0.0, -0.0446, 0.0391, 0.0219, 0.0039, 0.0156, 0.0081, -0.0026, -0.0320, -0.0466]],
columns=feature_cols)
print("预测1:", lr_model.predict(sample1))
print("预测2:", lr_model.predict(sample2))
# 6. 输出完整回归方程
coef = lr_model.coef_ # 获取回归系数
intercept = lr_model.intercept_ # 获取截距
equation = "target = "
equation += " + ".join([f"{c:.3f}*{name}" for c, name in zip(coef, feature_cols)]) # 构建回归方程
equation += f" + {intercept:.3f}"
print("\n回归方程:")
print(equation) # 输出回归方程
读者朋友可以不看下文自行按照3.2的一般流程解读一下这个代码,是不是一目了然了呢?其实,细心的读者有没有发现,线性回归的算法和上一节knn算法的实现流程有许多相似之处呢,哈哈,这或许就是机器学习的魅力,需要读者朋友们好好总结体会!
代码流程解析:
0.导入相关的库或函数(也可以写代码用到时再导入)
1.数据导入和数据预处理:通过 pandas.read_csv() 加载数据集,通过 data[feature_cols] 提取所有特征列,data['target'] 提取目标列(糖尿病是否发生)。
2.建立线性回归模型:使用 LinearRegression() 创建回归模型。
3.训练模型:调用 model.fit(X, y) 进行训练
4.模型评估:通过 model.score(X, y) 输出线性回归模型的 R² 值,评估模型的拟合效果。
5.使用模型进行预测:通过 model.predict() 对新的样本数据进行预测,输出糖尿病的预测概率。
6.输出完整回归方程:通过 model.coef_ 和 model.intercept_ 输出回归方程,详细显示每个特征的系数
五、总结
本文介绍了线性回归算法的基本概念,并展示了如何通过scikit-learn和pandas库实现一元线性回归和多元线性回归模型。通过案例代码,大家可以快速上手,学习如何使用Python进行数据分析和模型构建。同时,我们还讲解了如何评估模型和进行预测。
ps.启发性问题
1.如何选择线性回归模型的特征,以提高模型的预测精度?
2.多元线性回归中如何避免多重共线性问题?
3.除了线性回归,还有哪些机器学习算法适合用于回归问题?
对于这三个问题,读者可以自己思考,查阅相关资料,有什么新颖的想法欢迎大家在评论区讨论分享,一起学习,一起进步!