sklearn 中的线性回归、岭回归、Lasso回归参数配置及示例

2023-10-30


本文主要讲一些sklearn中回归模型的使用,如果需要了解相关理论,请查阅: 【线性回归】面向新手的基础知识

线性回归

引入

from sklearn.linear_model import LinearRegression
# 默认参数如下:
LinearRegression(fit_intercept=True,normalize=False,copy_X=True,n_jobs=1)

重要参数

1,fit_intercept

bool类型,默认为True,表示是否计算截距(即 y = wx + b 中的 b ),推荐设置为True

2,normalize

bool类型,默认为False,表示是否对各个特征进行标准化(默认方法是:减去均值并除以 l 2 l_2 l2 范数),推荐设置为True。如果设置为False,则建议在输入模型之前,手动进行标准化。

标准化的好处:

  1. 加速收敛

  2. 提升精度

注意:fit_intercept 设置为 False 时,将忽略此参数。

3,n_jobs

数值型,默认值为None。表示使用多少个处理器进行运算,当模型有多个回归目标( _targets > 1 )时,加速效果比较明显。推荐设置为 -1 ,此时会调用所有处理器。

重要属性

1,coef_

对应 X 各个特征的系数,绝对值越接近1,表示相关性越强。

2,intercept_

intercept_ 表示模型学习到的截距值。

注意:属性后面有下划线 _

重要方法

1,fit(X, y) ,训练模型

2,predict(X),使用模型进行预测

3,score(X, y),返回 R 2 R^2 R2 值 (确定系数) ,越接近1说明拟合的效果越好。

例子

import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score

# 载入糖尿病数据集
diabetes_X, diabetes_y = datasets.load_diabetes(return_X_y=True)

# 只从中抽取一个特征
diabetes_X = diabetes_X[:, np.newaxis, 2]

# 划分训练集与测试集
diabetes_X_train = diabetes_X[:-20]
diabetes_y_train = diabetes_y[:-20]
diabetes_X_test = diabetes_X[-20:]
diabetes_y_test = diabetes_y[-20:]

# 线性回归模型
regr = linear_model.LinearRegression(fit_intercept=True, normalize=True, n_jobs=-1)
regr.fit(diabetes_X_train, diabetes_y_train)
diabetes_y_pred = regr.predict(diabetes_X_test)
print('系数: \n', regr.coef_)

# 结果评估
print('均方误差: %.2f'
      % mean_squared_error(diabetes_y_test, diabetes_y_pred))
print('确定系数(R^2): %.2f'
      % r2_score(diabetes_y_test, diabetes_y_pred))

# 绘图
plt.scatter(diabetes_X_test, diabetes_y_test,  color='black')
plt.plot(diabetes_X_test, diabetes_y_pred, color='blue', linewidth=3)
plt.show()

输出结果:

系数:
[938.23786125]
均方误差: 2548.07
确定系数(R^2): 0.47

在这里插入图片描述

岭回归

引入

# 加⼊L2正则化的线性回归
from sklearn.linear_model import Ridge
# 默认参数如下:
Ridge(alpha=1.0, fit_intercept=True, normalize=False, copy_X=True, max_iter=None, \
      tol=0.001, solver='auto', random_state=None)

重要参数

1,alpha

正则项系数,初始值为1,数值越大,则对复杂模型的惩罚力度越大。

调参方法:

  1. 给定alpha较小的值,例如0.1。
  2. 根据验证集准确率以10倍为单位增大或者减小参数值。
  3. 在找到合适的数量级后,在此数量级上微调。

合适的候选值:[0.001, 0.01, 0.1, 1, 10, 100]

2,fit_intercept

bool类型,默认为True,表示是否计算截距(即 y = wx + b 中的 b ),推荐设置为True

3,normalize

bool类型,默认为False,表示是否对各个特征进行标准化(默认方法是:减去均值并除以 l 2 l_2 l2 范数),推荐设置为True。如果设置为False,则建议在输入模型之前,手动进行标准化。

标准化的好处:

  1. 加速收敛

  2. 提升精度

注意:fit_intercept 设置为 False 时,将忽略此参数。

4,solver

求解优化问题的算法,推荐保持默认值’auto’,可以根据数据类型选择最合适的算法。可选的算法有:

  1. ‘svd’,采⽤用奇异值分解的⽅方法来计算
  2. ‘cholesky’,采⽤用scipy.linalg.solve函数求得闭式解。
  3. ‘sparse_cg’,采⽤用scipy.sparse.linalg.cg函数来求取最优解。
  4. ‘lsqr’,使用scipy.sparse.linalg.lsqr 求解,它是最快的。
  5. ‘sag’,使用随机平均梯度下降,当n_samples和n_features都较大时,通常比其他求解器更快。

5,max_iter

数值型,部分求解器需要通过迭代实现,这个参数指定了模型优化的最大迭代次数,推荐保持默认值None

6,random_state

随机数种子,推荐设置一个任意整数,例如0,2020等,好处是模型可以复现。

7,n_jobs

数值型,默认值为None。表示使用多少个处理器进行运算,当模型有多个回归目标( _targets > 1 )时,加速效果比较明显。推荐设置为 -1 ,此时会调用所有处理器。

重要属性

1,coef_

对应 X 各个特征的系数,绝对值越接近1,表示相关性越强。

2,intercept_

intercept_ 表示模型学习到的截距值。

注意:属性后面有下划线 _

重要方法

1,fit(X, y) ,训练模型

2,predict(X),使用模型进行预测

3,score(X, y),返回 R 2 R^2 R2 值 (确定系数) ,越接近1说明拟合的效果越好。

示例

import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score

# 载入糖尿病数据集
diabetes_X, diabetes_y = datasets.load_diabetes(return_X_y=True)

# 划分训练集与测试集
diabetes_X_train = diabetes_X[:-20]
diabetes_y_train = diabetes_y[:-20]
diabetes_X_test = diabetes_X[-20:]
diabetes_y_test = diabetes_y[-20:]

# 岭回归模型
regr = linear_model.Ridge(alpha=0.001, fit_intercept=True, normalize=True, random_state=0)
regr.fit(diabetes_X_train, diabetes_y_train)
diabetes_y_pred = regr.predict(diabetes_X_test)
print('系数: \n', regr.coef_)

# 结果评估
print('均方误差: %.2f'
      % mean_squared_error(diabetes_y_test, diabetes_y_pred))
print('确定系数(R^2): %.2f'
      % r2_score(diabetes_y_test, diabetes_y_pred))

输出:

系数:
[ 0.79171416 -236.95051097 511.18477367 327.22355517 -734.56024578
429.87194777 67.40320158 174.60152289 713.22832241 76.6722493 ]
均方误差: 2003.26
确定系数(R^2): 0.59

Lasso 回归

引入

from sklearn.linear_model import Lasso
Lasso(alpha=1.0, fit_intercept=True, normalize=False, precompute=False,
copy_X=True, max_iter=1000,tol=1e-4, warm_start=False,
positive=False,random_state=None,selection='cyclic')

重要参数

1,alpha

正则项系数,初始值为1,数值越大,则对复杂模型的惩罚力度越大。

调参方法:

  1. 给定alpha较小的值,例如0.1。
  2. 根据验证集准确率以10倍为单位增大或者减小参数值。
  3. 在找到合适的数量级后,在此数量级上微调。

合适的候选值:[0.001, 0.01, 0.1, 1, 10, 100]

2,fit_intercept

bool类型,默认为True,表示是否计算截距(即 y = wx + b 中的 b ),推荐设置为True

3,normalize

bool类型,默认为False,表示是否对各个特征进行标准化(默认方法是:减去均值并除以 l 2 l_2 l2 范数),推荐设置为True。如果设置为False,则建议在输入模型之前,手动进行标准化。

标准化的好处:

  1. 加速收敛

  2. 提升精度

注意:fit_intercept 设置为 False 时,将忽略此参数。

4,precompute

bool 类型,默认值为False,决定是否提前计算Gram矩阵来加速计算。

5,max_iter

数值型,部分求解器需要通过迭代实现,这个参数指定了模型优化的最大迭代次数,推荐保持默认值None

6,warm_start

bool类型,默认值为False。如果为True,那么使⽤用前⼀次训练结果继续训练。否则从头开始训练。

7,positive

bool类型,默认值为False。如果为True,那么强制要求权重向量的分量都为正数。

9,selection

字符串,默认值为"cyclic"。它指定了了当每轮迭代的时候,选择权重向量的哪个分量来更新:

(1) “random”: 更新的时候,随机选择权重向量的⼀个分量来更更新。

(2) “cyclic”: 更新的时候,从前向后依次选择权重向量的⼀个分量来更新。

10,random_state

随机数种子,推荐设置一个任意整数,例如0,2020等,好处是模型可以复现。

11,n_jobs

数值型,默认值为None。表示使用多少个处理器进行运算,当模型有多个回归目标( _targets > 1 )时,加速效果比较明显。推荐设置为 -1 ,此时会调用所有处理器。

重要属性

1,coef_

对应 X 各个特征的系数,绝对值越接近1,表示相关性越强。

2,intercept_

intercept_ 表示模型学习到的截距值。

注意:属性后面有下划线 _

重要方法

1,fit(X, y) ,训练模型

2,predict(X),使用模型进行预测

3,score(X, y),返回 R 2 R^2 R2 值 (确定系数) ,越接近1说明拟合的效果越好。

示例

import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score

# 载入糖尿病数据集
diabetes_X, diabetes_y = datasets.load_diabetes(return_X_y=True)

# 划分训练集与测试集
diabetes_X_train = diabetes_X[:-20]
diabetes_y_train = diabetes_y[:-20]
diabetes_X_test = diabetes_X[-20:]
diabetes_y_test = diabetes_y[-20:]

# LASSO回归模型
regr = linear_model.Lasso(alpha=0.08, fit_intercept=True, normalize=True, \
                          precompute=False,  copy_X=True, max_iter=1000,tol=1e-4, \
                          warm_start=False, positive=False, random_state=None,\
                          selection='cyclic')
regr.fit(diabetes_X_train, diabetes_y_train)
diabetes_y_pred = regr.predict(diabetes_X_test)
print('系数: \n', regr.coef_)

# 结果评估
print('均方误差: %.2f'
      % mean_squared_error(diabetes_y_test, diabetes_y_pred))
print('确定系数(R^2): %.2f'
      % r2_score(diabetes_y_test, diabetes_y_pred))

输出:

系数:
[ 0. -170.70972431 510.82478065 290.22047462 -71.2270991
-0. -226.56455408 0. 480.30488212 54.40099876]
均方误差: 2004.60
确定系数(R^2): 0.59

可以看到有些系数为0,这也说明Lasso回归具有特征选择的作用。

参考文章:

sklearn.linear_model.LinearRegression

sklearn.linear_model.Ridge

sklearn.linear_model.Lasso

sklearn常用机器学习算法参数详解

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sklearn 中的线性回归、岭回归、Lasso回归参数配置及示例 的相关文章