3. 基础模型回顾:线性回归、决策树、支持向量机在环境预测中的应用
各位同学,咱们今天聊聊三个老朋友——线性回归、决策树、支持向量机。说实话,这三个模型在环境预测里,就像工具箱里的扳手、螺丝刀和电钻。各有各的脾气,也各有各的绝活。
我刚开始做环境预测那会儿,总觉得模型越复杂越好。后来被现实狠狠教育了一顿。你想想看,有时候一个简单的线性回归,反而比那些花里胡哨的深度学习模型更靠谱。为什么?因为环境数据太脏了,太乱了。
3.1 线性回归:简单但别小看它
线性回归,说白了就是找一条直线,让所有数据点到这条线的距离之和最小。嗯,就这么简单。
在环境预测里,我经常用它做两件事:
- 趋势分析:比如PM2.5浓度随时间的变化趋势
- 相关性分析:比如气温和臭氧浓度的关系
举个实际例子。我曾经帮一个工业园区做空气质量预测。他们想看看风速和污染物扩散的关系。我直接用线性回归拟合了一下,R²达到了0.78。虽然不算特别高,但足够说明问题了。
核心公式:y = wx + b
其中w是权重,b是偏置。说白了,就是找一条最合适的直线。
# 一个简单的线性回归示例
from sklearn.linear_model import LinearRegression
import numpy as np
# 假设我们有风速和PM2.5的数据
wind_speed = np.array([2, 4, 6, 8, 10]).reshape(-1, 1)
pm25 = np.array([150, 120, 90, 60, 30])
model = LinearRegression()
model.fit(wind_speed, pm25)
print(f"斜率: {model.coef_[0]:.2f}")
print(f"截距: {model.intercept_:.2f}")
避坑指南:我曾经犯过一个低级错误——直接用线性回归预测非线性关系。比如气温和臭氧浓度,其实是U型关系,用线性回归拟合,结果惨不忍睹。所以,先画个散点图看看趋势,再做决定。
3.2 决策树:像做决策一样做预测
决策树,你可以把它想象成一个「如果-那么」的规则集合。比如:如果温度大于30度,那么臭氧浓度高;如果温度小于30度,那么臭氧浓度低。就这么一层层分下去。
我个人特别喜欢决策树的一点是——它完全不需要数据标准化。你想想看,环境数据里,有的变量是温度(0-40度),有的是湿度(0-100%),有的是风速(0-20m/s)。用线性回归,你得先标准化。但决策树不用,它只管分叉。
我记得有一次做水质预测,数据里有pH值、溶解氧、浊度等十几个指标。用决策树跑了一遍,发现最重要的分叉点是溶解氧。嗯,这个结果和专家经验完全吻合。
小技巧:决策树容易过拟合,尤其是深度太大的时候。我一般把最大深度限制在5-8层,效果最好。
# 决策树示例
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
# 假设我们有环境特征数据
X = np.random.rand(100, 5) # 5个特征
y = np.random.rand(100) # 目标变量
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
tree = DecisionTreeRegressor(max_depth=5, min_samples_leaf=10)
tree.fit(X_train, y_train)
print(f"训练集R²: {tree.score(X_train, y_train):.3f}")
print(f"测试集R²: {tree.score(X_test, y_test):.3f}")
3.3 支持向量机:小样本的救星
支持向量机(SVM),这个名字听起来挺唬人。其实核心思想很简单:找一个超平面,把不同类别的数据分开,而且让这个超平面离两边数据都尽可能远。
在环境预测里,SVM特别适合处理小样本问题。为什么?因为环境监测站点有限,有时候一个城市只有十几个监测点。用深度学习?数据量不够。用线性回归?非线性关系拟合不好。这时候,SVM就派上用场了。
我做过一个项目,只有30个监测点的数据,要预测整个区域的空气质量。用SVM配合RBF核函数,效果出奇的好。R²达到了0.85,比决策树高了将近10个百分点。
关键参数:
- C:惩罚系数,越大越容易过拟合
- gamma:RBF核的参数,控制单个样本的影响范围
- kernel:核函数,常用的是RBF和线性核
# SVM示例
from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler
# SVM对数据尺度敏感,一定要标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
svm = SVR(kernel='rbf', C=100, gamma=0.1, epsilon=0.1)
svm.fit(X_train_scaled, y_train)
print(f"SVM测试集R²: {svm.score(X_test_scaled, y_test):.3f}")
避坑指南:我曾经用SVM时,忘了标准化数据,结果模型完全跑偏。SVM对数据尺度非常敏感,不像决策树那么「皮实」。所以,标准化这步千万别省。
3.4 三个模型的对比
说了这么多,咱们来做个对比。我根据自己的经验,整理了一个表格:
| 特性 | 线性回归 | 决策树 | 支持向量机 |
|---|---|---|---|
| 数据量要求 | 中等 | 中等 | 小样本表现好 |
| 是否需要标准化 | 是 | 否 | 是 |
| 可解释性 | 高 | 高 | 低 |
| 非线性拟合能力 | 弱 | 强 | 强(配合核函数) |
| 过拟合风险 | 低 | 高 | 中等 |
| 训练速度 | 快 | 快 | 中等 |
你想想看,在实际项目中该怎么选?我的建议是:
- 如果数据量少(几十个样本),优先试SVM
- 如果数据量大(几千个样本),决策树或线性回归都行
- 如果关系简单(线性关系),线性回归就够了
- 如果关系复杂(非线性),决策树或SVM
3.5 知识体系图
下面这张图,是我自己画的。它把这三个模型的核心逻辑串起来了。你看一眼,就能明白它们各自的位置。
这张图你看懂了吗?三个模型各有千秋。线性回归简单,决策树灵活,SVM稳健。但说实话,单独用任何一个,都有短板。这就是为什么我们要学集成学习——把它们的优点结合起来。
我的经验:在实际项目中,我很少只用单个模型。通常的做法是:先用线性回归做个baseline,再用决策树看看特征重要性,最后用SVM做精细调优。三个模型的结果一对比,心里就有底了。
好了,这一章就到这里。记住一句话:没有最好的模型,只有最合适的模型。下一章,咱们聊聊怎么把这些基础模型组合起来,做成集成模型。