涉及内容
- 多项式回归
- 多项式的sklearn实现
- 偏差和方差
- 增加算法模型泛化能力的正则化处理
多项式回归
- 研究一个因变量与一个或多个自变量(特征)间多项式的回归分析,成为多项式回归(Ploynomial Regression).其为线性回归模型,其回归函数关于回归系数是线性的,自变量x和因变量y之间的关系被建模为n次多项式
- 当自变量只有一个时,成为一元多项式回归;如果自变量(特征)为多个时,称为多项式回归。在一元回归分析中,如果变量y与自变量x的关系为非线性的,且找不到适当函数曲线来拟合,可以采用一元多项式回归。
- 任何函数都可以多项式来逼近,故多项式回归有着广泛应用,如在SVM的核函数,如下面非线性关系数据,无法用直线拟合,但是可以使用多项式更好的拟合

- 与简单线性回归,其输入特征只有一维,即:y=ax+b,(a为曲线斜率吧,b为截距项(或偏置项)),推广到多维特征,即有多个输入特征的线性回归:y = a1*X1 + a2*X2 + … + an*Xn + b
- 线性回归的的本质有个很强的假设条件:数据存在线性关系,但现实世界中往往是非线性的。因此要对回归算法进行改进,使用多项式回归,可对非线性数据进行处理
多项式回归实现思路
- 首先准备数据,创建一个一元二次方程,并增加一些噪音,先用线性关系拟合
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
class LineRegression:
def __init__(self):
pass
@staticmethod
def line_regression():
# 训练数据
x = np.random.uniform(-3, 3, size=100)
# 构建一元关系
y = 0.5 + x**2+x+2+np.random.normal(0, 1, size=100)
# 构建线性回归模型
line_regression = LinearRegression()
# 将训练特征转换为 1行100列特征,对应 实际y值得个数
train_data = x.reshape(-1, 1)
line_regression.fit(X=train_data, y=y)
# 给出预测值
y_predict = line_regression.predict(train_data)
# plt展示 y与 x之间的关系
plt.scatter(x, y)
# plt展示 实际y值与预测值的偏差
plt.scatter(x, y_predict, edgecolors='r')
plt.show()
if __name__ == "__main__":
PolyRegression.line_regression()

- 使用多项式回归拟合
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
class PolyRegression:
def __init__(self):
pass
@staticmethod
def poly_regression():
# 训练数据
x = np.random.uniform(-3, 3, size=100)
# 构建一元关系
y = 0.5 + x**2+x+2+np.random.normal(0, 1, size=100)
# 构建线性回归模型
line_regression = LinearRegression()
# 将训练特征转换为 1行100列特征,对应 实际y值得个数
train_data = x.reshape(-1, 1)
# 使用多项式,先创建一个新特征
# (train_data**2).reshape
# 创建一个新特征
new_feature_data = np.hstack([train_data, train_data**2])
# 构建模型
line_regression.fit(X=new_feature_data, y=y)
# 给出预测值
y_predict = line_regression.predict(new_feature_data)
# plt展示 y与 x之间的关系
plt.scatter(x, y)
# plt展示 实际y值与预测值的偏差
plt.scatter(np.sort(x), y_predict[np.argsort(x)], edgecolors='r')
plt.show()
# 输出模型指标,斜率,截距项协方差
print(line_regression.coef_, line_regression.intercept_)
if __name__ == "__main__":
PolyRegression.poly_regression()

sklearn中的一元多项式回归
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
class PolyRegression:
def __init__(self):
pass
@staticmethod
def poly_regression():
# 1.预处理训练数据
x = np.random.uniform(-3, 3, size=100)
# 构建一元关系
y = 0.5 + x**2+x+2+np.random.normal(0, 1, size=100)
# 将训练特征转换为 1行100列特征,对应 实际y值得个数
train_data = x.reshape(-1, 1)
# 构建线性回归模型,degree表示使用多少幂次(多项式的最高次数)
sklearn_poly_regression = PolynomialFeatures(degree=2)
# 拟合数据
sklearn_poly_regression.fit(train_data)
# 转换数据
X2 = sklearn_poly_regression.transform(X=train_data)
# X2 集合的形式 为100行 3列
print(X2.shape)
# 查看前5行,所有列的数据,:5指前5行数据,所有列数据
# 第一列为0次方,第二列是一次项系数(原来数据样本特征),第三列是二次线系数
print(X2[:5, :])
# 2.模型训练
reg = LinearRegression()
reg.fit(X=X2, y=y)
# 给出预测值
y_predict = reg.predict(X2)
# plt展示 y与 x之间的关系
plt.scatter(x, y)
# plt展示 实际y值与预测值的偏差
plt.scatter(np.sort(x), y_predict[np.argsort(x)], edgecolors='r')
plt.show()
if __name__ == "__main__":
PolyRegression.poly_regression()
