网站首页 > 基础教程 正文
昨天开始回归系列的第一篇,是最简单的一元线性回归。除了线形关系,还有各种非线性关系,比如指数关系、对数关系、多项式关系,这些都要使用对相应的数据变换后才能进行分析。今天就从对数分析开始,来进行演示说明。很多具体的参数和判别方式和昨天的一元线形回归一样,这一篇就不赘述了。
对数回归是一种非线性回归模型,它假设因变量和自变量之间存在对数关系。与线性回归不同,对数回归利用对数函数来捕捉自变量与因变量之间的非线性关系。通过对数变换,我们可以将原本的非线性关系转化为线性关系,从而使用线性回归的方法进行建模和分析。
对数回归的基本形式可以表示为:y=a+b?ln?(x)。
其中:y是因变量,x是自变量,a是截距,b是斜率。对数回归模型的拟合过程通常通过最小二乘法进行,即最小化预测值与实际值之间的平方差。
【对数回归与线性回归的关系】
对数回归本质上是线性回归的一种变形,通过对自变量取对数,解决非线性关系的问题。其核心思想是在对数尺度上使数据满足线性关系,从而利用线性回归的优势进行分析。
【对数回归的参数解释】
和一元线性回归一样,这里就说几个重要的参数:
斜率和截距
在对数回归模型中,斜率()表示自变量每变动一个单位,对数变换后的因变量的变化量;截距(a)表示当自变量为1时,因变量的值。
R平方值
R平方值(R^2)是模型拟合优度的指标,表示模型解释了因变量变化的比例。R平方值越接近1,模型的拟合效果越好。
p值和假设检验
p值用于检验模型中自变量的显著性。假设检验中,通常设置显著性水平(例如0.05),当p值小于显著性水平时,认为自变量对因变量有显著影响。
AIC和BIC
AIC(Akaike信息准则)和BIC(贝叶斯信息准则)是模型选择的指标,越小越好。这些指标考虑了模型的复杂度,能够防止过拟合。
【案例演示】
还是使用广告费用的投入和销售额之间的关系来说明,只是现在只指数关系了,说明开始随着费用的投入,销售额是不对增加的,但是到了一定程度,就不会有明显增长了。
首先模拟数据↓
import pandas as pd
import numpy as np
np.random.seed(0)
广告费用 = np.random.exponential(scale=100, size=100)
销售额 = 50 + 15 * np.log(广告费用) + np.random.normal(scale=5, size=100)
data = pd.DataFrame({'广告费用': 广告费用, '销售额': 销售额})
在做分析之前,先通过可视化原始数据和对数变换后的数据,帮助理解数据的分布和关系↓
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体为黑体
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
import seaborn as sns
plt.figure(figsize=(14, 6))
plt.subplot(1, 2, 1)
sns.scatterplot(x=data['广告费用'], y=data['销售额'])
plt.title('原始数据')
plt.xlabel('广告费用')
plt.ylabel('销售额')
data['Log_广告费用'] = np.log(data['广告费用'])
plt.subplot(1, 2, 2)
sns.scatterplot(x=data['Log_广告费用'], y=data['销售额'])
plt.title('Log-Transformed Data')
plt.xlabel('Log of 广告费用')
plt.ylabel('销售额')
plt.tight_layout()
plt.show()
从图形可以清晰的看到,左边是原始数据的分布,呈指数分布;右边是变换后的效果,整体呈线形分布。
接下来就使用转换后的数据进行线性回归的模型构建。昨天介绍两种方法,今天这里就直接使用statsmodels来实现,更简单,且模型判断参数更丰富↓
import statsmodels.api as sm
# 定义自变量和因变量
X = sm.add_constant(data['Log_广告费用'])
y = data['销售额']
# 拟合模型
model = sm.OLS(y, X).fit()
# 输出模型摘要
print(model.summary())
几个重要的参数:R方是0.939,调整R方是0.938。说明模型的拟合效果还是很好。Prob (F-statistic)接近0,模型整体显著;P值(P>|t|)接近0,模型参数也显著。整体来说模型效果很不错。绘制一下拟合后的图形↓
plt.figure(figsize=(14, 6))
plt.subplot(1, 2, 1)
sns.scatterplot(x=data['广告费用'], y=data['销售额'])
plt.plot(data['广告费用'], model.predict(sm.add_constant(np.log(data['广告费用']))), color='red')
plt.title('原始数据拟合线')
plt.xlabel('广告费用')
plt.ylabel('销售额')
# 拟合效果图(对数变换数据)
plt.subplot(1, 2, 2)
sns.scatterplot(x=data['Log_广告费用'], y=data['销售额'])
plt.plot(data['Log_广告费用'], model.fittedvalues, color='red')
plt.title('对数变化拟合曲线')
plt.xlabel('Log of 广告费用')
plt.ylabel('销售额')
plt.tight_layout()
plt.show()
看上去效果也不错。
接下来就可以使用模型对数据进行预测了,我们先生成需要预测的数据集↓
# 生成新的广告投入数据
new_广告费用 = np.random.exponential(scale=100, size=20)
new_log_广告费用 = np.log(new_广告费用)
# 创建新的DataFrame
new_data = pd.DataFrame({'广告费用': new_广告费用, 'Log_广告费用': new_log_广告费用})
因为模型是对数变换后的,所以预测的输入变量也需要进行对数变换,最终结果如下↓
# 预测销售额
new_data['Predicted_销售额'] = model.predict(sm.add_constant(new_data['Log_广告费用']))
链接是我使用PowerBI整合的历史文章,按类型分类,可以根据需求查询:Microsoft Power BI↓
https://app.powerbi.com/view?r=eyJrIjoiNjI2NWQ3NjktYjU0ZC00ZWZhLTgzMDgtMGI4ZTk1ZDlkODM3IiwidCI6IjI3NDQ3MWQ0LTM4ZDQtNDVlZS1hMmJkLWU1NTVhOTBkYzM4NiJ9
End
猜你喜欢
- 2024-11-26 使用python,绘制美观且标准的数学坐标系与函数图像
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)