ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

经典统计预测模型

经典统计预测模型 目录方法一线性回归 / 多元回归Linear / Multiple Regression1.1 是什么生活比喻1.2 数学直觉1.3 代码实战预测工资方法二岭回归 / Lasso回归正则化回归2.1 是什么生活比喻2.2 数学直觉2.3 代码实战对比三个模型方法三逻辑回归Logistic Regression3.1 是什么生活比喻3.2 数学直觉3.3 代码实战根据学习时长预测考试是否通过方法四时间序列分解Time Series Decomposition4.1 是什么生活比喻4.2 数学直觉4.3 代码实战拆解一组虚拟的月销售数据总结什么时候用方法一线性回归 / 多元回归Linear / Multiple Regression1.1是什么生活比喻这就像你用尺子在一堆散点中间画一条最直的线。如果只有一个影响因素比如温度影响冰淇淋销量那就是一根直线——线性回归。如果有多个影响因素比如温度、是否有促销、星期几都影响冰淇淋销量那就是在一个多维空间里画一个“平面”——多元回归。1.2 数学直觉它背后的核心叫最小二乘法意思就是让这根线到所有真实数据点的“垂直距离的平方和”最小。通俗讲就是让这根线尽可能贴近所有点。1.3 代码实战预测工资假设我们有工龄(x)和工资(y)我们来预测一下 10 年工龄能拿多少钱。import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression # 1. 造数据工龄1-8年对应的工资加点随机波动 X np.array([1, 2, 3, 4, 5, 6, 7, 8]).reshape(-1, 1) # 特征必须二维 y np.array([4500, 5200, 5800, 6400, 7500, 8200, 9100, 9800]) # 标签 # 2. 创建模型并训练就是让电脑去找那根最直的线 model LinearRegression() model.fit(X, y) # 3. 看看线画得怎么样截距c 和 斜率a print(f斜率为{model.coef_[0]:.2f}) # 每多一年工龄工资涨多少 print(f截距为{model.intercept_:.2f}) # 基础工资 # 4. 预测工龄10年的工资 predict_X np.array([[10]]) predict_y model.predict(predict_X) print(f预测10年工龄的工资为{predict_y[0]:.2f}元) # 5. 画个图直观理解 plt.scatter(X, y, colorblue, label真实数据) plt.plot(X, model.predict(X), colorred, linewidth2, label回归线) plt.scatter(10, predict_y, colorgreen, s100, label预测点) plt.xlabel(工龄); plt.ylabel(工资); plt.legend(); plt.show()小白总结只要你的数据大致是一条向上的直线用它准没错。但如果数据是弯的比如抛物线它就会偏得很离谱因为它是直线。方法二岭回归 / Lasso回归正则化回归2.1 是什么生活比喻想象你在考数学给你 100 个条件特征去推一个结果但很多条件其实是废话比如“今天星期几”对“房价”影响很小。标准线性回归会强行把所有条件都用上导致模型变得极其复杂过拟合就像把数学题答案硬背下来换个新题就不会了。Lasso回归L1正则化像个“狠心的剪刀手”它会直接把没用的条件系数砍成 0帮你筛选掉没用的特征。岭回归L2正则化像个“温和的缩水机”它不会把系数砍成0但会把所有特征的系数都缩小一点让模型更稳定。2.2 数学直觉在线性回归的损失函数后面加一个惩罚项。Lasso 加的是|系数|之和所以系数容易被逼到 0。岭回归加的是系数^2之和系数会缩小但不会消失。2.3 代码实战对比三个模型我们造 5 个特征但只有前 2 个有用看看 Lasso 怎么把没用的特征系数变成 0。from sklearn.linear_model import LinearRegression, Ridge, Lasso # 造数据特征X有5列但y只和第1列、第2列有关系后面3列是噪声 np.random.seed(42) X np.random.rand(100, 5) * 10 # y 3*第1列 5*第2列 随机误差 y 3 * X[:, 0] 5 * X[:, 1] np.random.randn(100) * 2 # 1. 普通线性回归容易把噪声也学进去 lr LinearRegression().fit(X, y) print(普通线性回归的系数5个, np.round(lr.coef_, 2)) # 2. 岭回归系数缩小但不为0 ridge Ridge(alpha1.0).fit(X, y) # alpha是惩罚力度 print(岭回归的系数5个 , np.round(ridge.coef_, 2)) # 3. Lasso回归直接把无关特征干成0 lasso Lasso(alpha0.5).fit(X, y) print(Lasso回归的系数5个 , np.round(lasso.coef_, 2))运行结果你会看到普通线性回归后面几个噪声系数可能很大Lasso 会把第3、4、5个系数直接变成0.00。这就是特征筛选方法三逻辑回归Logistic Regression⚠️ 注意重点虽然它名字里有“回归”但它实际上是做二分类是/否的千万不要用来预测连续的数字。3.1 是什么生活比喻它就像一个法官在打分。它会把任何输入比如你的考试分数通过一个神奇的S 型曲线Sigmoid函数压缩在 0 到 1 之间变成“属于某个类别的概率”。概率 0.5判为“是”比如 及格。概率 0.5判为“否”比如 不及格。3.2 数学直觉它内部还是算的线性回归那一套但算完之后把z塞进公式这样无论 z 是正无穷还是负无穷输出都在 0~1 之间。3.3 代码实战根据学习时长预测考试是否通过from sklearn.linear_model import LogisticRegression # 数据学习小时数 (X) 和 是否通过 (y: 0挂科, 1通过) X np.array([0.5, 0.8, 1.2, 1.8, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0]).reshape(-1, 1) y np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1]) # 3小时左右是分界线 # 创建逻辑回归模型 log_model LogisticRegression() log_model.fit(X, y) # 预测学 2 小时能过吗学 4.5 小时呢 pred_2h log_model.predict([[2]]) pred_4_5h log_model.predict([[4.5]]) prob_2h log_model.predict_proba([[2]]) # 输出属于[挂科, 通过]的概率 print(f学2小时预测结果0挂1过{pred_2h[0]}) print(f学2小时挂科概率{prob_2h[0][0]:.2f} 通过概率{prob_2h[0][1]:.2f}) print(f学4.5小时预测结果{pred_4_5h[0]})运行结果学 2 小时大概率预测为 0挂科学 4.5 小时大概率预测为 1通过。方法四时间序列分解Time Series Decomposition4.1 是什么生活比喻时间序列就是按时间顺序记录的数据比如每年双十一的销售额。你以为数据就是一堆上下跳动的点其实它内部藏着三部分趋势Trend整体是往上走还是往下走比如社会进步销售额逐年增加。季节性Seasonal周期性波动比如每年 11 月必定大涨每年 2 月必定大跌。残差Residual随机突发情况无法解释的纯噪音比如某年突然出了个爆款导致异常高。4.2 数学直觉分解公式加法模型原始数据 趋势 季节 残差。它像个剥洋葱的刀一刀一刀帮你把原始数据拆开让你看清楚长期规律和周期规律。⚠️ 注意它只是一种分析方法帮你把数据看懂并不是直接用来“预测未来数值”的模型。通常我们会先分解再用其他模型去预测拆出来的“趋势”和“季节”部分(如时间序列预测模型)。4.3 代码实战拆解一组虚拟的月销售数据import pandas as pd from statsmodels.tsa.seasonal import seasonal_decompose import matplotlib.pyplot as plt # 1. 构造一个虚拟的 3年36个月月销量数据 # 趋势每月递增 10季节每年7月索引6和12月索引11暴涨 np.random.seed(42) time np.arange(1, 37) trend 200 time * 10 seasonal 50 * np.sin(time * 2 * np.pi / 12) # 12个月一个周期的正弦波 noise np.random.normal(0, 30, 36) data trend seasonal noise # 转为 pandas 时间序列 index pd.date_range(start2020-01-01, periods36, freqM) series pd.Series(data, indexindex) # 2. 进行分解加法模型周期为12个月 result seasonal_decompose(series, modeladditive, period12) # 3. 画出拆解后的四张图Observed原始, Trend趋势, Seasonal季节, Residual残差 result.plot() plt.show() # 打印前6个月的残差值看看纯随机的部分有多大 print(残差随机噪音前6个月的值, result.resid.head().values)运行结果你会看到四张子图。趋势图是一条平稳向上的直线季节图是规律起伏的正弦波残差图是杂乱无章的抖动。总结什么时候用情况模型要预测具体数字比如销量、温度、房价且数据大致呈直线变化线性 / 多元回归要预测具体数字但特征变量特别多几十上百个怕模型学乱了Lasso砍特征或岭回归稳系数要判断是/否比如 会不会逾期、会不会生病、买还是不买逻辑回归必选极度稳定且解释性强手头是按年月日排列的数据想先观察长期趋势和旺季淡季规律时间序列分解分析利器但不直接用于最终预测
返回列表