机器学习之线性回归——基于Scikit-Learn

《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正则化)。

模型拟合的惩罚项为:,其中\alpha是一个自由参数,用来控制惩罚的力度,如果\alpha趋近于0,那么模型就恢复到标准线性回归结果,如果\alpha趋近于无穷,那么所以模型相应都会被压制。

该模型内置在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正则化倾向于构建稀疏模型

猜你喜欢

转载自blog.csdn.net/elma_tww/article/details/88066437
今日推荐