机器学习之线性回归

回归模型定义:

  1、回归分析是预测性建模技术,主要用来研究因变量(yi)与自变量(xi)之间的关系,通常被用来做预测分析、时间序列等。

  2、公式:h(xi) = wxi + b = ∑j = 1wjx + b

  3、实质为根据过去的经验学习中学习出这些权重系数wj和偏置常数b各自取多少才能使得回归预测的准确度更高。

  4、使用最小化损失函数进行求解。(最小均方误差)

  5、使用梯度下降法对损失函数求偏导数。求出最小均方误差。

线性回归的sklearn实现

  在scikit-learn中,线性回归模型对应的是liner_model.LinearRegression ,除此之外还有基于L1正则化的Lasso回归(Lasso Regression),基于L2正则化的线性回归(Ridge Regression),以及基于L1与L2正则化融合的Lasso CNet(ElasticNet Regression)中对应的linear_model.Lasso 、linear_model.Ridge 、linear_model.ElasticNet 。

普通线性回归:

from sklearn import linear_model
linear_model.LinearRegression(fit_intercept = True ,normalize = False ,n_jobs = -1)

参数:

  fit_intercept:选择是否计算偏置常数b,默认为True ,表示计算

  normalize:选择在拟合数据前是否进行归一化,默认为False ,表示不进行归一化

  n_jobs:表示所有cpu核都调用

属性:

  coef_:用于输出线性回归模型的权重向量w

  intercept_:用于输出线性回归模型的偏置常数b

方法:

  fit(X_train ,y_train):进行模型训练

  score(X_test ,y_test):返回模型在测试集上的预测准确率

 

Lasso回归:

from sklearn import linear_model
linear_model.Lasso(alpha=1.0 ,
                    fit_intercept=True ,
                    normalize=False ,
                    precompute=False ,
            max_iter=1000 , tol
=0.0001 , warm_start=False , positive=False , selection='cyclic')

参数:

  alpha:L1正则化项前面带的常数调节因子

  fit_intercept:选择是否计算偏置常数b,默认为True ,表示计算

  normalize:选择在拟合数据前是否进行归一化,默认为False ,表示不进行归一化

  precompute:选择是否使用预先计算的Gram矩阵来加快计算,默认为False

  max_iter:设定最大迭代次数,默认为1000次

  tol:设定判断迭代收斂函数,默认为0.0001

  warm_start:设定是否使用前一次训练的结果继续训练,默认为False,表示每次从头开始训练

  positive:默认为False,如果为True,则强制所有权重系数都为正值

  select:每轮迭代时选择哪个权重系数进行更新,默认为cycle ,表示从前往后依次选择;如果设定为random,则表示每次随机选择一个权重系数进行更新

属性:

  coef_:用于输出线性回归模型的权重向量w

  intercept_:用于输出线性回归模型的偏置常数b

  n_iter_:用于输出实际迭代的次数

方法:

  fit(X_train ,y_train):进行模型训练

  score(X_test ,y_test):返回模型在测试集上的预测准确率

  predict(X):用训练好的模型来预测待预测数据集X,返回数据为预测集对应的预测结果yˆ

 

岭回归:

  岭回归的实质是在基本线性回归模型基础上添加L2正则化,使得各个特征的权重wj尽量衰减,从而达到特征变量选择的目的。

linear_model.Ridge(alpha=1.0 ,
                   fit_intercept=True ,
                   normalize=False ,
                   max_iter=None ,
                   tol=0.001 ,
                   solver='auto')

参数:

  alpha:L1正则化项前面带的常数调节因子

  fit_intercept:选择是否计算偏置常数b,默认为True ,表示计算

  normalize:选择在拟合数据前是否进行归一化,默认为False ,表示不进行归一化

  precompute:选择是否使用预先计算的Gram矩阵来加快计算,默认为False

  max_iter:设定最大迭代次数,默认为1000次

  tol:设定判断迭代收斂函数,默认为0.0001

  solver:指定问题最优化问题的算法,默认为auto,表示自动选择。其他方法:

    1、svd:使用奇异值分解来计算回归系数

    2、cholesky:使用标准的scipy.linalg.solve函数来求解

    3、sparse_cg:使用scipy.sparse.linalg.cg中的共轭梯度求解器求解

    4、lsqr:使用专门的正则化最小二乘法scipy.sparse.ligalg.lsqr,速度是最快的

    5、sag:使用随机平均梯度下降法求解

属性:

  coef_:用于输出线性回归模型的权重向量w

  intercept_:用于输出线性回归模型的偏置常数b

  n_iter_:用于输出实际迭代的次数

方法:

  fit(X_train ,y_train):进行模型训练

  score(X_test ,y_test):返回模型在测试集上的预测准确率

  predict(X):用训练好的模型来预测待预测数据集X,返回数据为预测集对应的预测结果yˆ

ElasticNet回归: 

  ElasticNet回归(弹性网络回归)是将L1和L2正则化进行融合,在基本的线性回归模型中加入混合正则化项。

linear_model.ElasticNet(alpha=1.0 ,
                        l1_ratio=0.5 ,
                        fit_intercept=True ,
                        normalize=False ,
                        precompute=False ,
                        max_iter=1000 ,
                        tol=0.0001 ,
                        warm_start=False ,
                        positive=False ,
                        selection='cyclic')

参数:

  alpha:L1正则化项前面带的常数调节因子

  l1_ratio:参数是β值,默认为0.5

  fit_intercept:选择是否计算偏置常数b,默认为True ,表示计算

  normalize:选择在拟合数据前是否进行归一化,默认为False ,表示不进行归一化

  precompute:选择是否使用预先计算的Gram矩阵来加快计算,默认为False

  max_iter:设定最大迭代次数,默认为1000次

  tol:设定判断迭代收斂函数,默认为0.0001

  warm_start:设定是否使用前一次训练的结果继续训练,默认为False,表示每次从头开始训练

  positive:默认为False,如果为True,则强制所有权重系数都为正值

  selection:每轮迭代时选择哪个权重系数进行更新,默认为cycle ,表示从前往后依次选择;如果设定为random,则表示每次随机选择一个权重系数进行更新

属性:

  coef_:用于输出线性回归模型的权重向量w

  intercept_:用于输出线性回归模型的偏置常数b

  n_iter_:用于输出实际迭代的次数

方法:

  fit(X_train ,y_train):进行模型训练

  score(X_test ,y_test):返回模型在测试集上的预测准确率

  predict(X):用训练好的模型来预测待预测数据集X,返回数据为预测集对应的预测结果yˆ

 

案例之波士顿房价预测  

#导入数据
from sklearn.datasets import load_boston
boston = load_boston()
X = boston.data
y = boston.target
#划分训练测试
from sklearn.model_selection import train_test_split
X_train ,X_test ,y_train ,y_test = train_test_split(X ,y ,train_size = 0.7)

普通线性回归模型:

from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X_train ,y_train)
lr.score(X_test ,y_test)

 

 

 

 lasso模型:

from sklearn.linear_model import Lasso
las = Lasso()
las.fit(X_train ,y_train)
las.score(X_test ,y_test)

 

 

 

 岭回归模型:

from sklearn.linear_model import Ridge
rdg = ElasticNet()
rdg.fit(X_train ,y_train)
rdg.score(X_test ,y_test)

 

 

 

 ElasticNet模型:

from sklearn.linear_model import ElasticNet
elt = ElasticNet()
elt.fit(X_train ,y_train)
elt.score(X_test ,y_test)

 

 

 

 

画图表现:

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(20,3))
axes = fig.add_subplot(1,1,1)
line1 = axes.plot(range(len(y_test)) ,y_test ,'b' ,label = 'Actual')
elt_result = elt.predict(X_test)
line2 = axes.plot(range(len(elt_result)) ,elt_result ,'r--' ,label = 'Predict' ,linewidth = 2)
axes.grid()
fig.tight_layout()
plt.legend(handles = line1)
plt.title('House Price')
plt.show()

 

posted @ 2020-12-07 20:58  17孤独的牧羊人  阅读(349)  评论(0编辑  收藏  举报