1 多项式回归
1.1 介绍
在线性回归中,我们介绍了的是这种模型y = kX +b来拟合图形,但是也存在一些数据分析用线性拟合效果很差,或者说不适合用线性回归来拟合,如下图
相对而言,用多项式就比较合适。多项式就是如同
y = a + bx^2 + c这种, y = a + bx^2 +cx^3 + d 等等
也就是多项式的模型一般是这样子的:
1.2 回归实现
下面以这个数据做一个示例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from numpy import genfromtxt
# 加载数据
data = genfromtxt("job.csv", delimiter=",")
x_data = data[1:, 1]
y_data = data[1:, 2]
plt.scatter(x_data, y_data)
plt.show()
# print(x_data, y_data)
- 线性回归
# 一维变二维
x_data = x_data[:, np.newaxis]
y_data = y_data[:, np.newaxis]
# 创建并拟合模型
model = LinearRegression()
model.fit(x_data, y_data)
plt.scatter(x_data, y_data)
plt.plot(x_data, model.predict(x_data), 'r')
plt.show()
- 多项式回归
# 定义多项式回归, degree的值可以调节多项式的特征
poly_reg = PolynomialFeatures(degree=3)
# 特征处理
x_poly = poly_reg.fit_transform(x_data)
# 定义回归模型
reg = LinearRegression()
reg.fit(x_poly, y_data)
plt.plot(x_data, y_data, 'b.')
plt.plot(x_data, reg.predict(x_poly), 'r')
plt.show()
2 拟合&正则化
之前我们在模型那一块有讲过模型拟合会出现欠拟合、过拟合,今天我们来具体讲一下吧
2.1拟合问题
2.1.1 拟合出现的类型
- 过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在测试数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)
- 欠拟合:一个假设在训练数据上不能获得更好的拟合,并且在测试数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)
回归中出现的拟合问题:
分类拟合中出现的问题如下:
2.2 解决拟合出现的问题
(1)欠拟合原因以及解决办法
原因:学习到数据的特征过少
解决办法:
• 1)添加其他特征项,有时候我们模型出现欠拟合的时候是因为特征项不够导致的,可以添加其他特征项来很好地解决。例如,“组合”、“泛化”、“相关性”三类特征是特征添加的重要手段,无论在什么场景,都可以照葫芦画瓢,总会得到意想不到的效果。除上面的特征之外,“上下文特征”、“平台特征”等等,都可以作为特征添加的首选项。
• 2)添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强。
(2)过拟合原因以及解决办法
原因:原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾各个测试数据点
解决办法:
• 1)重新清洗数据,导致过拟合的一个原因也有可能是数据不纯导致的,如果出现了过拟合就需要我们重新清洗数据。
• 2)增大数据的训练量,还有一个原因就是我们用于训练的数据量太小导致的,训练数据占总数据的比例过小。
• 3)正则化
• 4)减少特征维度,防止维灾难
3 正则化
3.1 介绍
在学习的时候,数据提供的特征有些影响模型复杂度或者这个特征的数据点异常较多,所以算法在学习的时候尽量减少这个特征的影响(甚至删除某个特征的影响),这就是正则化。如图示例
3.2 分类
-
L2正则化
1)作用:可以使得其中一些W(权重)的都很小,都接近于0,削弱某个特征的影响
2)优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象
3)Ridge回归
4)代价函数
-
L1正则化
1)作用:可以使得其中一些W的值直接为0,删除这个特征的影响
2)LASSO回归
3)代价函数