多项式回归
1. 多项式模型定义
线性回归适用于数据呈线性分布,如果数据样本呈非线性分布,那么之前提到的线性模型就不再适用了。即采用多项式回归为好。
2. 多项式模型定义
与线性模型相比,多项式模型引入了高次项,自变量的指数大于1,例如一元二次方程:
y
=
w
0
+
w
1
x
+
w
2
x
2
y = w_0 + w_1x + w_2x^2
y=w0?+w1?x+w2?x2 一元三次方程:
y
=
w
0
+
w
1
x
+
w
2
x
2
+
w
3
x
3
y = w_0 + w_1x + w_2x^2 + w_3x ^ 3
y=w0?+w1?x+w2?x2+w3?x3 推广到一元n次方程:
y
=
w
0
+
w
1
x
+
w
2
x
2
+
w
3
x
3
+
.
.
.
+
w
n
x
n
y = w_0 + w_1x + w_2x^2 + w_3x ^ 3 + ... + w_nx^n
y=w0?+w1?x+w2?x2+w3?x3+...+wn?xn 上述表达式可以简化为:
y
=
∑
i
=
1
N
w
i
x
i
y = \sum_{i=1}^N w_ix^i
y=i=1∑N?wi?xi
3. 与线性回归的关系
多项式回归可以理解为线性回归的扩展,在线性回归模型中添加了新的特征值.例如,要预测一栋房屋的价格,有
x
1
,
x
2
,
x
3
x_1, x_2, x_3
x1?,x2?,x3?三个特征值,分别表示房子长、宽、高,则房屋价格可表示为以下线性模型:
y
=
w
1
x
1
+
w
2
x
2
+
w
3
x
3
+
b
y = w_1 x_1 + w_2 x_2 + w_3 x_3 + b
y=w1?x1?+w2?x2?+w3?x3?+b 对于房屋价格,也可以用房屋的体积,而不直接使用
x
1
,
x
2
,
x
3
x_1, x_2, x_3
x1?,x2?,x3?三个特征:
y
=
w
0
+
w
1
x
+
w
2
x
2
+
w
3
x
3
y = w_0 + w_1x + w_2x^2 + w_3x ^ 3
y=w0?+w1?x+w2?x2+w3?x3 相当于创造了新的特征
x
,
x
x, x
x,x = 长 * 宽 * 高. 以上两个模型可以解释为:
- 房屋价格是关于长、宽、高三个特征的线性模型
- 房屋价格是关于体积的多项式模型
因此,可以将一元n次多项式变换成n元一次线性模型.
4. 多项式回归实现
对于一元n次多项式,同样可以利用梯度下降对损失值最小化的方法,寻找最优的模型参数
w
0
,
w
1
,
w
2
,
.
.
.
,
w
n
w_0, w_1, w_2, ..., w_n
w0?,w1?,w2?,...,wn?.可以将一元n次多项式,变换成n元一次多项式
5. 过拟合与欠拟合
1)什么是欠拟合、过拟合
一看图就知道哪个是欠拟合和过拟合了,这两种其实都不是好的模型. 前者没有学习到数据分布规律,模型拟合程度不够,预测准确度过低,这种现象称为“欠拟合”;后者过于拟合更多样本,以致模型泛化能力(新样本的适应性)变差,这种现象称为“过拟合”. **欠拟合模型一般表现为训练集、测试集下准确度都比较低;过拟合模型一般表现为训练集下准确度较高、测试集下准确度较低. **一个好的模型,不论是对于训练数据还是测试数据,都有接近的预测精度,而且精度不能太低.
2)如何处理欠拟合、过拟合
- 欠拟合:提高模型复杂度,如增加特征、增加模型最高次幂等等;
- 过拟合:降低模型复杂度,如减少特征、降低模型最高次幂等等.
线性回归模型变种
1. 正则化
1)什么是正则化
过拟合还有一个常见的原因,就是模型参数值太大,所以可以通过抑制参数的方式来解决过拟合问题.如下图所示,右图产生了一定程度过拟合,可以通过弱化高次项的系数(但不删除)来降低过拟合. 例如,可以通过在
θ
3
,
θ
4
\theta_3, \theta_4
θ3?,θ4?的系数上添加一定的系数,来压制这两个高次项的系数,这种方法称为正则化. 但在实际问题中,可能有更多的系数,我们并不知道应该压制哪些系数,所以,可以通过收缩所有系数来避免过拟合.
2)正则化的定义
正则化是指,在目标函数后面添加一个范数,来防止过拟合的手段,这个范数定义为:
∣
∣
x
∣
∣
p
=
(
∑
i
=
1
N
∣
x
∣
p
)
1
p
||x||_p = (\sum_{i=1}^N |x|^p)^{\frac{1}{p}}
∣∣x∣∣p?=(i=1∑N?∣x∣p)p1? 当p=1时,称为L1范数(即所有系数绝对值之和):
∣
∣
x
∣
∣
1
=
(
∑
i
=
1
N
∣
x
∣
)
||x||_1 = (\sum_{i=1}^N |x|)
∣∣x∣∣1?=(i=1∑N?∣x∣) 当p=2是,称为L2范数(即所有系数平方之和再开方):
∣
∣
x
∣
∣
2
=
(
∑
i
=
1
N
∣
x
∣
2
)
1
2
||x||_2 = (\sum_{i=1}^N |x|^2)^{\frac{1}{2}}
∣∣x∣∣2?=(i=1∑N?∣x∣2)21? 通过对目标函数添加正则项,整体上压缩了参数的大小,从而防止过拟合.
2. Lasso回归与岭回归
Lasso 回归和岭回归(Ridge Regression)都是在标准线性回归的基础上修改了损失函数的回归算法. Lasso回归全称为 Least absolute shrinkage and selection operator,又译“最小绝对值收敛和选择算子”、“套索算法”,其损失函数如下所示:
E
=
1
n
∑
i
=
1
N
(
y
i
?
y
i
′
)
2
+
λ
∣
∣
w
∣
∣
1
E = \frac{1}{n}\sum_{i=1}^N (y_i - y_i')^2 + \lambda ||w||_1
E=n1?i=1∑N?(yi??yi′?)2+λ∣∣w∣∣1? 岭回归损失函数为:
λ
\lambda
λ 就是正则强度 影响的是
∣
∣
w
∣
∣
||w||
∣∣w∣∣的影响强度
E
=
1
n
∑
i
=
1
N
(
y
i
?
y
i
′
)
2
+
λ
∣
∣
w
∣
∣
2
E = \frac{1}{n}\sum_{i=1}^N (y_i - y_i')^2 + \lambda ||w||_2
E=n1?i=1∑N?(yi??yi′?)2+λ∣∣w∣∣2? 从逻辑上说,Lasso回归和岭回归都可以理解为通过调整损失函数,减小函数的系数,从而避免过于拟合于样本,降低偏差较大的样本的权重和对模型的影响程度.
模型的加载与保存
import pickle
pickle.dump(模型对象, 文件对象)
model_obj = pickle.load(文件对象)
import numpy as np
import sklearn.linear_model as lm
import pickle
x = np.array([[0.5], [0.6], [0.8], [1.1], [1.4]])
y = np.array([5.0, 5.5, 6.0, 6.8, 7.0])
model = lm.LinearRegression()
model.fit(x, y)
print("训练完成.")
with open('linear_model.pkl', 'wb') as f:
pickle.dump(model, f)
print("保存模型完成.")
```
import numpy as np
import sklearn.linear_model as lm
import sklearn.metrics as sm
import matplotlib.pyplot as mp
import pickle
x = np.array([[0.5], [0.6], [0.8], [1.1], [1.4]])
y = np.array([5.0, 5.5, 6.0, 6.8, 7.0])
with open('linear_model.pkl', 'rb') as f:
model = pickle.load(f)
print("加载模型完成.")
pred_y = model.predict(x)
mp.figure('Linear Regression', facecolor='lightgray')
mp.title('Linear Regression', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
mp.scatter(x, y, c='blue', alpha=0.8, s=60, label='Sample')
mp.plot(x, pred_y, c='orangered', label='Regression')
mp.legend()
mp.show()
|