多项式回归用于解决样本特征与样本值存在非线性关系的回归问题
多项式回归的原理
多项式回归的原理是假定样本特征与观测值之间呈现非线性关系,比如y=ax3+bx2+cx+d
或者:y=ax1k+bx2k+cx1k-1x2+dx2k-1x1+ex1k-2x22+……+αx1+θx2+C
那么多项式回归所做的工作就是对样本进行处理,使其增加特征,增加的特征分别是每个原来特征组合的k次方、k-1次方,……一直到二次方,并且为了进行线型回归,还会在样本特征中增加一列1.
Pipeline和PolynomialFeatures的应用
- PolynomialFeatures PolynomialFeatures类的作用是给定一个样本,将样本按照指定的指数,根据上文中的处理样本的规则,增加样本的特征,产生一个新的样本,相当于是对数据的预处理,用法如下:调用、实例化、训练、得出结果 如果原样本有两个特征,给定的degree=3,那么处理后的数据如下。
from sklearn.preprocessing import PolynomialFeatures
poly=PolynomialFeatures(degree=???) //???代表将样本处理成几次方
poly.fit(x)
X1=poly.transform(x)
- Pipeline
多项式回归的过程中,原样本经过预处理之后,增加了新的特征得到新的多项式样本,如果指定的degree较高,预处理后不同 维度的值数量级差别较大,比如如果存在一个数值为10,degree也为10 ,那么经过PolynomialFeatures处理之后,会得到一个1010的数,各个维度的数值差别太大,数据分布不均衡,使用梯度下降法,会导致数据的搜索过程缓慢,因此在进行了第一步的预处理后,还要对新的数据进行归一化处理;最后才选择一个线性回归算法进行回归计算。
从以上可以看出,每次进行多项式回归都要重复三个步骤:多项式处理、归一化处理、线性回归,为了简单化,使用Pipeline可以将以上三步合为一个整体,依次进行。
算法原理:首先从sklern的pipeline子 模块中调用Pipeline方法,之后实例化,传入参数是一个列表,分别是多项式回归的每一个步骤对应的类
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
实例化如下:
poly_reg=Pipeline([
('poly',PolynomialFeatures(degree=degree)),
('std_scaler',StandardScaler()),
('lreg',LinearRegression())
])
或者封装成一个函数,
def PolynomialRegression(degree):
return Pipeline([
('poly',PolynomialFeatures(degree=degree)),
('std_scaler',StandardScaler()),
('lreg',LinearRegression())
])
函数的使用:
poly=PolynomialRegression(5) //实例化
poly5.fit(x,y) //训练
y_5=poly5.predict(x) //预测
自己所犯错误
在人工模拟多项式回归的原理过程中,首先生成一个随机的样本数据x和y,
x=np.random.uniform(-3,3,size=100)
X=x.reshape(-1,1)
y=0.5*x**2+x+2+np.random.normal(0,1,size=100)
这里将x转换成列向量是因为后期要增加特征,而每一列代表一个特征,但是为什么不在创建x的时候直接生成一个列向量,因为后期绘制散点图和plot,求中折线图plot需要数据按顺序,此时列向量x的索引坐标是二维数组,用得到的索引数组来索引y的值会出错。
sklearn中每一个机器学习的算法的标准是:有构造函数、训练函数、预测函数以及模型好坏的评价函数等等,如果遵循这个标准,那么使用sklearn的其他 模块时,就能无缝衔接