《Python数据科学手册》笔记
一、简单线性回归
最简单的线性回归模型是将数据拟合成一条直线,拟合方程为 y = ax + b,其中a是斜率,b是直线截距。
二、基函数回归
通过基函数对原始数据进行变换,将变量间的线性回归模型转换为非线性回归模型。常用的基函数有多项式基函数、高斯基函数。需要注意的是,基函数是对原始数据进行变换,模型仍然是一个线性模型。下面举例用Scikit-Learn实现多项式基函数和高斯基函数的变换。
1.多项式基函数
Scikit-Learn内置了PolynomialFeatures转换器实现多项式投影。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#创建一个7次多项式回归模型
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
poly_model = make_pipeline(PolynomialFeatures(7),LinearRegression())
#生成训练数据
rng = np.random.RandomState(1)
x = 10*rng.rand(50)
y = np.sin(x) + 0.1*rng.randn(50)
#拟合数据并预测
poly_model.fit(x[:,np.newaxis],y)
xfit = np.linspace(0,10,1000)
yfit = poly_model.predict(xfit[:,np.newaxis])
#画图
plt.scatter(x,y)
plt.plot(xfit,yfit)
运行结果如下:
可见拟合效果非常好。
2.高斯基函数
还有一种常用的拟合方法使用的并不是一组多项式基函数,而是一组高斯基函数。Scikit-Learn并没有内置这些高斯基函数,需要我们自己写一个转换器来创建。
from sklearn.base import BaseEstimator,TransformerMixin
#自定义转换器来创建高斯基函数
class GaussianFeatures(BaseEstimator,TransformerMixin):
def __init__(self,N,width_factor=2.0):
self.N = N;
self.width_factor = width_factor
@staticmethod
def _gauss_basis(x,y,width,axis=None):
arg = (x-y)/width
return np.exp(-0.5*np.sum(arg**2,axis))
def fit(self,X,y=None):
#在数据区间中创建N个高斯分布中心
self.centers_ = np.linspace(X.min(),X.max(),self.N)
self.width_ = self.width_factor*(self.centers_[1] - self.centers_[0])
return self
def transform(self,X):
return self._gauss_basis(X[:,:,np.newaxis],self.centers_,self.width_,axis=1)
#训练模型及预测新数据
gauss_model = make_pipeline(GaussianFeatures(20),LinearRegression())
gauss_model.fit(x[:,np.newaxis],y)
xfit = np.linspace(0,10,1000)
yfit = gauss_model.predict(xfit[:,np.newaxis])
#画图
plt.scatter(x,y)
plt.plot(xfit,yfit)
plt.xlim(0,10)
运行结果如下:
三、正则化
在线性回归模型中引入基函数会让模型变得更加灵活,但是也容易造成过拟合:相邻基函数的系数相互抵消。解决这个问题的方式是对较大的模型参数进行惩罚,从而抑制模型剧烈波动,这个惩罚机制即为正则化。常见的有两种正则化方式:岭回归(L2范数正则化)和Lasso正则化(L1范数正则化)。
1.岭回归(L2范数正则化)
对模型系数平方和进行惩罚(L2正则化)。
模型拟合的惩罚项为:,其中是一个自由参数,用来控制惩罚的力度,如果趋近于0,那么模型就恢复到标准线性回归结果,如果趋近于无穷,那么所以模型相应都会被压制。
该模型内置在Sciki-Learn的Ridge评估器中。用法如下:
from sklearn.linear_model import Ridge
model = make_pipeline(GaussianFeatures(30),Ridge(alpha=0.1))
2.Lasso正则化(L1范数正则化)
对模型系数绝对值的和进行惩罚(L1范数)。
模型拟合的惩罚项为:,它更喜欢将模型系数设置为0。
该模型内置在Sciki-Learn的Lasso评估器中。用法如下:
from sklearn.linear_model import Lasso
model = make_pipeline(GaussianFeatures(30),Ridge(alpha=0.001))
3.两种正则化的比较
岭回归可以非常高效地计算,相比于原始的线性回归模型,几乎没有消耗更多的计算资源。Lasso正则化倾向于构建稀疏模型。