1、线性回归的简单介绍
线性回归分为一元线性回归和多元线性回归,是统计学中用于建模和分析变量之间关系的两种基本方法。它们的主要区别在于模型中所涉及的预测变量(自变量)的数量。
一元线性回归(Simple Linear Regression)
- 一元线性回归是分析两个变量之间线性关系的方法,其中一个变量是自变量(X),另一个是因变量(Y)。在这种模型中,我们假设Y与X之间存在线性关系,即Y可以表示为X的线性函数加上一个误差项。一元线性回归的方程可以表示为:
- 一元线性回归是分析两个变量之间线性关系的方法,其中一个变量是自变量(X),另一个是因变量(Y)。在这种模型中,我们假设Y与X之间存在线性关系,即Y可以表示为X的线性函数加上一个误差项。一元线性回归的方程可以表示为:
多元线性回归(Multiple Linear Regression)
- 多元线性回归是一元线性回归的扩展,它用于分析一个因变量(Y)与两个或更多自变量(X1, X2, …, Xn)之间的线性关系。在多元线性回归模型中,Y被假设为这些自变量的线性组合加上一个误差项。多元线性回归的方程可以表示为:
- 多元线性回归是一元线性回归的扩展,它用于分析一个因变量(Y)与两个或更多自变量(X1, X2, …, Xn)之间的线性关系。在多元线性回归模型中,Y被假设为这些自变量的线性组合加上一个误差项。多元线性回归的方程可以表示为:
主要区别
- 自变量数量:一元线性回归只涉及一个自变量,而多元线性回归涉及两个或更多自变量。
- 模型复杂度:由于包含更多的自变量,多元线性回归模型能够捕捉更复杂的数据关系,但也面临过拟合和变量选择等挑战。
- 解释性:在多元线性回归中,每个自变量的回归系数表示在保持其他自变量不变的情况下,该自变量每增加一个单位对因变量的平均影响。而在一元线性回归中,这个解释更为直接和简单。
- 应用场景:当数据集中只有一个自变量时,使用一元线性回归;当数据集包含多个可能相关的自变量时,使用多元线性回归。
2、安装scikit-learn
Python中执行线性回归的一个非常流行和强大的库是scikit-learn。scikit-learn提供了丰富的工具来进行数据挖掘和数据分析,包括简单和复杂的线性回归模型。
如果你还没有安装scikit-learn,你可以通过pip来安装它:
pip install scikit-learn
3、准备示例的数据集
- 首先我们给定准备用于模型训练的数据集,如下图所示的两份数据集(左边为一元线性模型的数据集,右边为二元):
- 自取数据集:
- 链接:链接: https://pan.baidu.com/s/1FVr0lYZHm4ciIzzy_AKXsw?pwd=1822 提取码: 1822
4、一元线性回归示例
通过模型训练,找到广告投入(自变量)的多少对销售额(因变量)影响的一元线性关系
步骤:
- 1、导入数据
- 2、 绘制数据之间的散点图
- 3、求数据之间的相关系数
- 4、设置模型参数,建立回归模型
- 5、训练模型并检测
- 6、求出线性回归模型
- 7、利用回归模型进行预测
1、导入数据
- 运用pandas中读取文件的方式,导入数据
data = pd.read_csv("data.csv")
- 运用pandas中读取文件的方式,导入数据
2、 绘制数据之间的散点图
运用matplotlib库中的画图方法画出数据之间的散点图,观察数据之间是否具有线性相关的趋势
这一步骤在整个代码中并没有起到处理数据的作用,只是为了让我们可以直观的看出数据之间的关系
plt.scatter(data.广告投入, data.销售额) plt.show()
3、求数据之间的相关系数
- 在Python中,特别是在使用pandas库处理数据时,corr()函数是一个非常有用的方法,它用于计算DataFrame中列与列之间的相关系数。
- 相关系数越接近1,说明它们之间受相互的影响越大
corr = data.corr()
4、设置模型参数,建立回归模型
- 分别用变量接收数据中的值,后面传入模型中训练
- 这里直接调用 scikit-learn 库中的 LinearRegression() 模型
x = data[['广告投入']] y = data[['销售额']] lr = LinearRegression()
5、训练模型并检测
- 在 fit() 训练方法中传入训练数据
- predict()方法用于对新的或现有的自变量进行预测,返回预测的因变量值,这里我们直接传入我们训练的自变量,观察得出的结果有多少偏差
- score()方法用于评估模型对给定数据(x, y)的拟合优度,其中x是自变量数据,y是真实的因变量数据。对于线性回归模型,score 方法默认计算的是决定系数(R2 score),它表示模型预测值与实际值之间的拟合程度。R2 score的值越接近1,说明模型的拟合效果越好;如果为0,则表示模型的表现和简单预测平均值一样;如果小于0,则表示模型的表现甚至不如简单预测平均值。
lr.fit(x, y) result = lr.predict(x) score = lr.score(x, y)
6、求出线性回归模型
- 分别求出回归的模型的截距和斜率
a = round(lr.intercept_[0], 2) # 查看截距 -> a:-36.36 b = round(lr.coef_[0][0], 2) # 查看斜率 -> b:3.74 # 运用字符串的方法打印出线性回归模型 print("线性回归模型为:y = {}x + {}.".format(b, a)) # 结果:线性回归模型为:y = 3.74x + -36.36
- 分别求出回归的模型的截距和斜率
7、利用回归模型进行预测
- 自定义变量的值,传入到模型中得出结果
predict = lr.predict([[21], [23], [99]]) print(predict) """ 结果: [[ 42.13436123] [ 49.61013216] [333.68942731]] """
- 自定义变量的值,传入到模型中得出结果
完整代码
import pandas as pd
from sklearn.linear_model import LinearRegression
from matplotlib import pyplot as plt
# 导入数据
data = pd.read_csv("一元.csv")
# 绘制散点图
plt.scatter(data.广告投入, data.销售额)
plt.show()
# 求数据之间的相关系数
corr = data.corr()
# 设定模型参数,建立回归模型
x = data[['广告投入']]
y = data[['销售额']]
lr = LinearRegression()
# print(x, y)
# 训练模型
lr.fit(x, y)
# 对回归模型进行检测
result = lr.predict(x)
score = lr.score(x, y)
a = round(lr.intercept_[0], 2) # 查看截距
b = round(lr.coef_[0][0], 2) # 查看斜率
print("线性回归模型为:y = {}x + {}".format(b, a))
# 利用回归模型进行预测
predict = lr.predict([[21], [23], [99]])
print(predict)
5、二元线性回归示例
- 通过模型训练,找到体重、年龄(自变量)对血压收缩(因变量)影响的线性关系
- 二元线性模型在代码上与一元线性模型没有太多的区别,只是在自变量的数量上有区别,只需要给定自变量多个元素即可
- 直接上完整代码,数据集在上面的连接中自取
- 完整代码:
import pandas as pd
from sklearn.linear_model import LinearRegression
# 导入数据
data = pd.read_csv("二元.csv", encoding='gbk', engine='python')
# print(data)
# 打印相关系数矩阵
corr = data[["体重", "年龄", "血压收缩"]].corr()
# 设定模型参数,建立回归模型
lr_model = LinearRegression()
x = data[['体重', '年龄']]
y = data[['血压收缩']]
# 训练模型
lr_model.fit(x, y)
# 计算准确率
score = lr_model.score(x, y)
print(score)
# 自定义参数给模型,进行预测
print(lr_model.predict([[80, 60]]))
print(lr_model.predict([[70, 30], [70, 20]]))
# 得到回归模型中的参数值
a = lr_model.coef_
b = lr_model.intercept_
print("线性回归模型为: y = {:.2f}x1 + {:.2f}x2 + {:.2f}.".format(a[0][0], a[0][1], b[0]))
# 线性回归模型为: y = 2.14x1 + 0.40x2 + -62.96