回归算法之线性回归

线性回归的定义是:目标值预期是输入变量的线性组合。线性模型形式简单、易于建模,但却蕴含着机器学习中一些重要的基本思想。线性回归,是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。

优点:结果易于理解,计算不复杂
缺点:对非线性的数据拟合不好
适用数据类型:数值型和标称型

对于单变量线性回归,例如:前面房价例子中房子的大小预测房子的价格。 f ( x ) = w 1 ∗ x + w 0 f(x) = w_1*x+w_0 f(x)=w1x+w0,这样通过主要参数 w 1 w_1 w1就可以得出预测的值。
通用公式为:
h ( θ ) = θ 0 + θ 1 x h(\theta)=\theta_0+\theta_1x h(θ)=θ0+θ1x
那么对于多变量回归,例如:瓜的好坏程度 f ( x ) = w 0 + 0.2 色 泽 + 0.5 根 蒂 + 0.3 ∗ 敲 声 f(x) = w_0+0.2色泽+0.5根蒂+0.3*敲声 f(x)=w0+0.2+0.5+0.3,得出的值来判断一个瓜的好与不好的程度。
通用公式为:
h ( θ ) = θ 0 + θ 1 x + θ 2 x 2 h(\theta)=\theta_0+\theta_1x+\theta_2x_2 h(θ)=θ0+θ1x+θ2x2
线性模型中的向量 W W W值,客观的表达了各属性在预测中的重要性,因此线性模型有很好的解释性。对于这种“多特征预测”也就是(多元线性回归),那么线性回归就是在这个基础上得到这些W的值,然后以这些值来建立模型,预测测试数据。简单的来说就是学得一个线性模型以尽可能准确的预测实值输出标记。
那么如果对于多变量线性回归来说我们可以通过向量的方式来表示 W W W值与特征 X X X值之间的关系:
θ = θ 0 θ 1 θ 2 θ 3 X = x 0 x 1 x 2 x 3 \begin{aligned} \theta= \begin{array} {|c|} \theta_{0} \\ \theta_{1}\\ \theta_2 \\ \theta_{3} \end{array} \end{aligned} \begin{aligned} X= \begin{array} {|c|} x_{0} \\ x_{1}\\ x_2 \\ x_{3} \end{array} \end{aligned} θ=θ0θ1θ2θ3X=x0x1x2x3
两向量相乘,结果为一个整数是估计值,其中所有特征集合的第一个特征值 x 0 ​ ​ = 1 x_0​​ =1 x0=1,那么我们可以通过通用的向量公式来表示线性模型:
h ( θ ) = θ T ∗ x h(\theta)=\theta^T*x h(θ)=θTx
一个列向量的转置与特征的乘积,得出我们预测的结果,但是显然我们这个模型得到的结果可定会有误差,如下图所示:
单变量

在这里插入图片描述
多变量
在这里插入图片描述
损失函数
损失函数是一个贯穿整个机器学习重要的一个概念,大部分机器学习算法都会有误差,我们得通过显性的公式来描述这个误差,并且将这个误差优化到最小值。

对于线性回归模型,将模型与数据点之间的距离差之和做为衡量匹配好坏的标准,误差越小,匹配程度越大。我们要找的模型就是需要将 f ( x ) f(x) f(x)和我们的真实值之间最相似的状态。于是我们就有了误差公式,模型与数据差的平方和最小:
J ( θ ) = ∑ i = 1 m ( h θ ( x i ) − y i ) 2 J(\theta)=\sum_{i=1}^m(h_\theta(x^i)-y^i)^2 J(θ)=i=1m(hθ(xi)yi)2
上面公式定义了所有的误差和,那么现在需要使这个值最小?那么有两种方法,一种使用梯度下降算法,另一种使正规方程解法(只适用于简单的线性回归)。

梯度下降算法

上面误差公式是一个通式,我们取两个单个变量来求最小值,误差和可以表示为:
c o s t ( w 0 + w 1 x 1 ) = ∑ i = 1 N ( w 0 + w 1 x i − y i ) 2 cost(w_0+w_1x_1)=\sum_{i=1}^N(w_0+w_1x_i-y_i)^2 cost(w0+w1x1)=i=1N(w0+w1xiyi)2
可以通过调整不同的 w 1 w_1 w1​​ 和 w 0 w_0 w0​​ 的值,就能使误差不断变化,而当你找到这个公式的最小值时,你就能得到最好的 w 1 w_1 w1 w 0 w_0 w0,而这对 ( w 1 , w 0 ) \left({w_1},{w_0}\right) (w1,w0)就是能最好描述你数据关系的模型参数。

怎么找 c o s t ( w 0 + w 1 x 1 ) cost\left({w_0+w_1x_1}\right) cost(w0+w1x1)的最小? c o s t ( w 0 + w 1 x 1 ) cost\left({w_0+w_1x_1}\right) cost(w0+w1x1)的图像其实像一个山谷一样,有一个最低点。找这个最低点的办法就是,先随便找一个点 ( w 1 ​ ​ = 5 , w 0 ​ ​ = 4 ) (w_1​​ =5, w_0​​ =4) (w1=5,w0=4), 然后 沿着这个碗下降的方向找,最后就能找到山谷的最低点。
在这里插入图片描述
所以得出 w 1 ′ ′ − w 1 ′ = − ∂ c o s t ( w 0 + w 1 x 1 ) ∂ w 1 {w_1^{''}}-{w_1^{'}}=-\frac{\partial{cost\left({w_0+w_1x_1}\right)}}{\partial w1} w1w1=w1cost(w0+w1x1)那么这个过程是按照某一点在 w 1 w_1 w1上的偏导数下降寻找最低点。当然在进行移动的时候也需要考虑,每次移动的速度,也就是 α \alpha α的值,这个值也叫做(学习率),如下式:
w 1 : = − w 1 − α ∂ c o s t ( w 0 + w 1 x 1 ) ∂ w 1 {w_1}:=-{w_1}-\alpha\frac{\partial{cost\left({w_0+w_1x_1}\right)}}{\partial w1} w1:=w1αw1cost(w0+w1x1)

w 0 : = − w 0 − α ∂ c o s t ( w 0 + w 1 x 1 ) ∂ w 1 {w_0}:=-{w_0}-\alpha\frac{\partial{cost\left({w_0+w_1x_1}\right)}}{\partial w1} w0:=w0αw1cost(w0+w1x1)

这样就能求出 w 0 w_0 w0, w 1 w_1 w1​​ 的值,当然你这个过程是不断的进行迭代求出来,通过交叉验证方法即可。

LinearRegression

sklearn.linear_model.LinearRegression

class LinearRegression(fit_intercept = True,normalize = False,copy_X = True,n_jobs = 1)
  """
  :param normalize:如果设置为True时,数据进行标准化。请在使用normalize = False的估计器调时用fit之前使用preprocessing.StandardScaler

  :param copy_X:boolean,可选,默认为True,如果为True,则X将被复制

  :param n_jobs:int,可选,默认1。用于计算的CPU核数
  """

实例代码:

from sklearn.linear_model import LinearRegression
reg = LinearRegression()

方法
fit(X,y,sample_weight = None)

使用X作为训练数据拟合模型,y作为X的类别值。X,y为数组或者矩阵

reg.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])

predict(X)

预测提供的数据对应的结果

reg.predict([[3,3]])

array([ 3.])

属性

  • coef_

    • 表示回归系数w=(w1,w2…)
reg.coef_

array([ 0.5,  0.5])

加入交叉验证

前面我们已经提到了模型的交叉验证,那么我们这个自己去建立数据集,然后通过线性回归的交叉验证得到模型。由于sklearn中另外两种回归岭回归、lasso回归都本省提供了回归CV方法,比如linear_model.Lasso,交叉验证linear_model.LassoCV;linear_model.Ridge,交叉验证linear_model.RidgeCV。所以我们需要通过前面的cross_validation提供的方法进行k-折交叉验证.

from sklearn.datasets.samples_generator import make_regression
from sklearn.model_selection import cross_val_score
from sklearn import linear_model
import matplotlib.pyplot as plt

lr = linear_model.LinearRegression()
X, y = make_regression(n_samples=200, n_features=5000, random_state=0)
result = cross_val_score(lr, X, y)
print result

线性回归案例分析

波士顿房价预测

1.美国波士顿地区房价数据描述

from sklearn.datasets import load_boston

boston = load_boston()

print boston.DESCR

2.波士顿地区房价数据分割

from sklearn.cross_validation import train_test_split
import numpy as np
X = boston.data
y = boston.target

X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=33,test_size = 0.25)

3.训练与测试数据标准化处理

from sklearn.preprocessing import StandardScaler
ss_X = StandardScaler()
ss_y = StandardScaler()

X_train = ss_X.fit_transform(X_train)
X_test = ss_X.transform(X_test)
y_train = ss_X.fit_transform(y_train)
X_train = ss_X.transform(y_test)

4.使用最简单的线性回归模型LinearRegression和梯度下降估计SGDRegressor对房价进行预测

from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X_train,y_train)
lr_y_predict = lr.predict(X_test)

from sklearn.linear_model import SGDRegressor
sgdr = SGDRegressor()
sgdr.fit(X_train,y_train)
sgdr_y_predict = sgdr.predict(X_test)

5.性能评测

对于不同的类别预测,我们不能苛刻的要求回归预测的数值结果要严格的与真实值相同。一般情况下,我们希望衡量预测值与真实值之间的差距。因此,可以测评函数进行评价。其中最为直观的评价指标均方误差(Mean Squared Error)MSE,因为这也是线性回归模型所要优化的目标。

MSE的计算方法如式:
M S E = 1 m ∑ i = 1 m ( y i − y ˉ ) 2 MSE=\frac{1}{m}\sum_{i=1}^m(y_i-\bar{y})^2 MSE=m1i=1m(yiyˉ)2

使用MSE评价机制对两种模型的回归性能作出评价

from sklearn.metrics import mean_squared_error

print '线性回归模型的均方误差为:',mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_tranform(lr_y_predict))
print '梯度下降模型的均方误差为:',mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_tranform(sgdr_y_predict))

通过这一比较发现,使用梯度下降估计参数的方法在性能表现上不及使用解析方法的LinearRegression,但是如果面对训练数据规模十分庞大的任务,随即梯度法不论是在分类还是回归问题上都表现的十分高效,可以在不损失过多性能的前提下,节省大量计算时间。根据Scikit-learn光网的建议,如果数据规模超过10万,推荐使用随机梯度法估计参数模型。

注意:线性回归器是最为简单、易用的回归模型。正式因为其对特征与回归目标之间的线性假设,从某种程度上说也局限了其应用范围。特别是,现实生活中的许多实例数据的各种特征与回归目标之间,绝大多数不能保证严格的线性关系。尽管如此,在不清楚特征之间关系的前提下,我们仍然可以使用线性回归模型作为大多数数据分析的基线系统。

完整代码如下:

from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_boston
from sklearn.cross_validation import train_test_split
from sklearn.metrics import mean_squared_error,classification_report
from sklearn.cluster import KMeans


def linearmodel():
    """
    线性回归对波士顿数据集处理
    :return: None
    """

    # 1、加载数据集

    ld = load_boston()

    x_train,x_test,y_train,y_test = train_test_split(ld.data,ld.target,test_size=0.25)

    # 2、标准化处理

    # 特征值处理
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)


    # 目标值进行处理

    std_y  = StandardScaler()
    y_train = std_y.fit_transform(y_train)
    y_test = std_y.transform(y_test)

    # 3、估计器流程

    # LinearRegression
    lr = LinearRegression()

    lr.fit(x_train,y_train)

    # print(lr.coef_)

    y_lr_predict = lr.predict(x_test)

    y_lr_predict = std_y.inverse_transform(y_lr_predict)

    print("Lr预测值:",y_lr_predict)


    # SGDRegressor
    sgd = SGDRegressor()

    sgd.fit(x_train,y_train)

    # print(sgd.coef_)

    y_sgd_predict = sgd.predict(x_test)

    y_sgd_predict = std_y.inverse_transform(y_sgd_predict)

    print("SGD预测值:",y_sgd_predict)

    # 带有正则化的岭回归

    rd = Ridge(alpha=0.01)

    rd.fit(x_train,y_train)

    y_rd_predict = rd.predict(x_test)

    y_rd_predict = std_y.inverse_transform(y_rd_predict)

    print(rd.coef_)

    # 两种模型评估结果

    print("lr的均方误差为:",mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))

    print("SGD的均方误差为:",mean_squared_error(std_y.inverse_transform(y_test),y_sgd_predict))

    print("Ridge的均方误差为:",mean_squared_error(std_y.inverse_transform(y_test),y_rd_predict))

    return None

欠拟合与过拟合

机器学习中的泛化,泛化即是,模型学习到的概念在它处于学习的过程中时模型没有遇见过的样本时候的表现。在机器学习领域中,当我们讨论一个机器学习模型学习和泛化的好坏时,我们通常使用术语:过拟合和欠拟合。我们知道模型训练和测试的时候有两套数据,训练集和测试集。在对训练数据进行拟合时,需要照顾到每个点,而其中有一些噪点,当某个模型过度的学习训练数据中的细节和噪音,以至于模型在新的数据上表现很差,这样的话模型容易复杂,拟合程度较高,造成过拟合。而相反如果值描绘了一部分数据那么模型复杂度过于简单,欠拟合指的是模型在训练和预测时表现都不好的情况,称为欠拟合。

我们来看一下线性回归中拟合的几种情况图示:

在这里插入图片描述
θ 0 + θ 1 x \theta_0+\theta_1x θ0+θ1x
在这里插入图片描述
θ 0 + θ 1 x + θ 2 x 2 \theta_0+\theta_1x+\theta_2x_2 θ0+θ1x+θ2x2
在这里插入图片描述
θ 0 + θ 1 x + θ 2 x 2 + θ 3 x 3 + θ 4 x 4 \theta_0+\theta_1x+\theta_2x_2+\theta_3x^3+\theta_4x^4 θ0+θ1x+θ2x2+θ3x3+θ4x4
还有在逻辑回归分类中的拟合情况:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解决过拟合的方法

在线性回归中,对于特征集过小的情况,容易造成欠拟合(underfitting),对于特征集过大的情况,容易造成过拟合(overfitting)。针对这两种情况有了更好的解决办法

欠拟合

欠拟合指的是模型在训练和预测时表现都不好的情况,欠拟合通常不被讨论,因为给定一个评估模型表现的指标的情况下,欠拟合很容易被发现。矫正方法是继续学习并且试着更换机器学习算法。

过拟合

对于过拟合,特征集合数目过多,我们需要做的是尽量不让回归系数数量变多,对拟合(损失函数)加以限制。

(1)当然解决过拟合的问题可以减少特征数,显然这只是权宜之计,因为特征意味着信息,放弃特征也就等同于丢弃信息,要知道,特征的获取往往也是艰苦卓绝的。

(2)引入了 正则化 概念。

直观上来看,如果我们想要解决上面回归中的过拟合问题,我们最好就要消除 x 3 x_3 x3​​ 和 x 4 x_4 x4​​ 的影响,也就是想让 θ 3 \theta_3 θ3, θ 4 \theta_4 θ4
​​ 都等于0,一个简单的方法就是我们对 θ 3 , θ 4 \theta_3{,}\theta_4 θ3,θ4​​ 进行惩罚,增加一个很大的系数,这样在优化的过程中就会使这两个参数为零。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值