这节我们会介绍多项式回归和在机器学习中最常遇到的问题过拟合.欠拟合
主要介绍使用模型正则化来解决过拟合的问题,
之前学习过线性回归的,我们学习多项式回归会很简单.我们遇到的很多都是非线性的问题.
下面举例说明 一元的
线性回归的基本形式为 ax1+b+…
一般的多项式的形式是 a1x^2+a2x+a3
这样看是不是多项式回归只是多了一个值X2的特征,所以我们只要将特征多增加一个x2就可以了
下面看代码:
from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(666)
x_data=np.random.randint(-3,3,size=(100,1))
y_data=(2*x_data-3)**2 #x^2-4x+4
reg1=LinearRegression()
x_add=x_data**2
x=np.hstack([x_data,x_add])
reg1.fit(x,y_data)
print(reg1.coef_)
x_x=np.linspace(-3,3,num=100)
plt.plot(x_x,(x_x**2)*reg1.coef_[1]+x_x*reg1.coef_[0]+reg1.incepetion_,'r')
plt.show()
就是加入多的特征就行
我们在sklearn里面可以使用他的方法 PolynomialFeatures类
注意一个有趣的事情:这个类会自动给你加一个常数项,但是LinearRegression里面也会给你加常数项,所以
记住每次得到的参数里面会有一个0
我这里面搭配sklearn里面的pipeline管道配合使用 pipeline就是依次调用fit等方法
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
def getPolynomial(degree):
return Pipeline([
("polynomial", PolynomialFeatures(degree=degree)),
("standardscaler", StandardScaler()),
("linearRegression", LinearRegression())
])
x = np.random.uniform(-100, 100, size=100)
X = x.reshape(-1, 1)
y = 0.5 * x**2 + x + 2 + np.random.normal(0, 1, 100)
pipe=getPolynomial(degree=2)
pipe.fit(X,y)
print(pipe.score(X,y))
这个问题牵涉到很多相关概念,我都会简单提一下。(重点解决过拟合问题)
什么是过拟合,欠拟合?
先简单的理解就是过拟合就是你的模型设计的非常复杂,很好的拟合你的训练数据集但是对于你的
测试集,模型表现的能力很差劲,欠拟合就是你的模型简单了,方法不能很好的解决问题,与目标结果
差的很远
解决方法:
1,我们将我们的train_test_split,这样就能一定程度避免过拟合训练集
说道这里,在训练数据集时,我们一般使用交叉验证的方式(cross validation),将训练集分为k份,
k份里面每部分都轮流当测试集,其他都分别当训练集
2. 模型的正则化处理
我们在我们的瞬时函数后面在上一个用于参数大小的项,岭回归一般是我们用的
这里解释一下:一般的过拟合出现都是因为模型复杂,所以出现过拟合时参数都是非常大的
我们一般都采用 RidgeRegression和LassoRegression来解决问题,给他们加的项分别叫L2正则项 ,L1正则项
Lasso回归会让可能一些参数变为0,所以一般有参数选择的作用,但是也有可能出现错误
Ridge回归很好,准确度高,他让每个都尽量小,但是计算速度慢
弹性网络是均衡他们两个回归的特点
基本用法:(弹性网络多个超参)
from sklearn.linear_model import Lasso
from sklearn.linear_model import Ridge
from sklearn.linear_model import ElasticNet
def getPipeLine(degree,alpha):
return Pipeline([
("polynomialFeatures",PolynomialFeatures(degree=degree)),
("standard",StandardScaler()),
("linear",Lasso(alpha=alpha)),
])