用Sklearn和Statsmodels来做linear_regression和Logistic_regression注意事项

ops/2024/10/18 16:53:58/

用Sklearn和Statsmodels来做linear_regression和Logistic_regression注意事项,区别。主要在于 intercept 项,和 regularization。

X = np.array([-1, 0, 1])  # 自变量
Y = np.array([-2, 0, 5])  # 因变量

一、Linear regression 的截距项

又叫 intercept, constant, bias

  1. 使用 statsmodels 进行线性回归时,
    (1) 通常需要手动添加常数项(即截距),因为 statsmodels 的 OLS 默认不包括截距
    。这可以通过使用 statsmodels.tools.add_constant 函数来实现。例如,如果你有一个因变量 y 和一个自变量 X,你可以这样添加常数项:
import statsmodels.api as smX = sm.add_constant(X)  # 添加常数项
model = sm.OLS(Y, X).fit()

这样,X 中就会包含一个值全为 1 的列,它代表了截距项。在 statsmodels 中,add_constant 方法是添加常数项的标准做法 。

(2) 注意在计算 y_pred 时,必须要用 X_poly。建立方法如下:

from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
def my_use_linear_regres(X, Y): # 转换数据的形状X = X.reshape(-1, 1)# 创建一个PolynomialFeatures实例,degree指定多项式的度数poly = PolynomialFeatures(degree=1)   # change this!!!!!!!!!!!!!!!# 转换XX_poly = poly.fit_transform(X)return X_poly

或者:

# 构建设计矩阵
# X_poly = np.vstack([np.ones(len(X)), X, X**2]).T    # 对于二次多项式,我们需要添加X的平方项
X_poly = np.vstack([np.ones(len(X)), X]).T
print(X_poly)
X_poly = my_use_linear_regres(X, Y)
Y_pred = model_mine.predict(X_poly)
Y_pred 
  1. 而在 scikit-learn 中,当你使用 LinearRegression 类时,
    (1) 是否添加常数项(截距)是由类初始化时的 fit_intercept 参数决定的。如果 fit_intercept=True(默认值),则 scikit-learn 会自动为你的模型添加常数项
from sklearn.linear_model import LinearRegression# 创建线性回归模型实例,自动添加常数项
model = LinearRegression(fit_intercept=True)
model.fit(X, y)

在这种情况下,你不需要手动添加常数项,因为 scikit-learn 已经为你处理了(我没试过) 。

或者,你自己加一个 X_poly:

from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
def my_use_linear_regres(X, Y): # 转换数据的形状X = X.reshape(-1, 1)# 创建一个PolynomialFeatures实例,degree指定多项式的度数poly = PolynomialFeatures(degree=1)   # change this!!!!!!!!!!!!!!!# 转换XX_poly = poly.fit_transform(X)# 创建线性回归模型实例model = LinearRegression()# 拟合模型model.fit(X_poly, Y)return model

(2) 预测 y_pred 的时候,自己写式子。

二、Logistic Regression 的截距项和L2 Regularization

在进行逻辑回归时,scikit-learn 和 statsmodels 这两个库有一些关键的区别,特别是在截距项和正则化方面。

截距项

• scikit-learn:默认情况下,scikit-learn 的 LogisticRegression 类会添加一个截距项。如果你想显式地控制是否添加截距项,可以通过设置 fit_intercept 参数为 True 或 False 来实现。(别用它,它自动加一个 L2,不好控制。)
• statsmodels:
使用 smf.glm (广义线性模型)时,是默认自动加一个截距项的! Logistic regression 是 GLM 的特例,其中响应变量是二元的,并且遵循二项分布。链接函数通常是 logit 函数。

naive_model = smf.glm('default~student+balance+income', data=train_default, family=sm.families.Binomial()).fit()
print(naive_model.summary())

在这里插入图片描述

(别的:在 statsmodels 中,当你使用 Logit 函数时,默认情况下不会包括截距项。如果你需要包括截距项,需要在模型公式中显式地包含它,例如使用 “y ~ x1 + x2 + const” 这样的公式,其中 const 就是截距项。这是 AI 说的,我没用过。)

正则化

• scikit-learn:scikit-learn 的 LogisticRegression 类支持 L1 和 L2 正则化,这可以通过设置 penalty 参数为 ‘l1’ 或 ‘l2’ 来实现。L1 正则化可以导致稀疏解,而 L2 正则化则不会。正则化的强度可以通过 C 参数来控制,C 的值越小,正则化强度越大。
scikit-learn 的 LogisticRegression 类中,默认的正则化是 L2 正则化 。这意味着它会使用一个正则化项,即系数的平方和,来防止模型过拟合。L2 正则化有助于处理特征多重共线性问题,并能够使模型参数更加平滑。
默认情况下,LogisticRegression 的 penalty 参数设置为 ‘l2’,同时 solver 参数默认为 ‘lbfgs’,它是一种优化算法,用于找到损失函数的最小值。C 参数控制正则化的强度,其默认值是 1.0,较小的 C 值意味着更强的正则化(即更平滑的模型),而较大的 C 值则意味着更弱的正则化(允许模型更复杂)。fit_intercept 参数默认为 True,表示模型会包含截距项。
如果你希望使用 L1 正则化或者不使用正则化,可以通过调整 penalty 参数来实现。例如,设置 penalty=‘l1’ 可以应用 L1 正则化,而设置 penalty=‘none’ 则不使用正则化。不过需要注意的是,当使用 liblinear 求解器时,不支持不使用正则化的情况。
此外,LogisticRegression 还支持弹性网正则化(‘elasticnet’),它是 L1 和 L2 正则化的组合,通过 l1_ratio 参数来控制两者的比例。

• statsmodels:statsmodels 的逻辑回归实现默认情况下不包括正则化。如果你需要应用正则化,可能需要通过手动修改设计矩阵或使用其他方法来实现。

·

如果你需要更多的自动化和快速原型设计,scikit-learn 可能是更好的选择。而如果你需要更深入地了解模型的细节和定制,statsmodels 可能更适合你的需求。


http://www.ppmy.cn/ops/122520.html

相关文章

操作系统_名词_文件下载_反弹SHELL_防火墙绕过

操作系统 操作系统-用途&命令&权限&用户&防火墙 1、个人计算机&服务器用机 2、windows&Linux常见命令 3、文件权限&服务权限&用户权限 4、系统用户&用户组&服务用户等分类 5、自带防火墙出站&入站规则策略协议 实用案例1&#x…

Leetcode—152. 乘积最大子数组【中等】

2024每日刷题&#xff08;174&#xff09; Leetcode—152. 乘积最大子数组 C实现代码 class Solution { public:int maxProduct(vector<int>& nums) {int n nums.size();int mx nums[0];int mn nums[0];int ans mx;for(int i 1; i < n; i) {const int prem…

认知战认知作战:认知战与安全挑战中方企业在海外的应对策略分析

认知战认知作战&#xff1a;认知战与安全挑战中方企业在海外的应对策略分析 关键词&#xff1a;认知战, 中方企业, 恐怖袭击, 安全挑战, 信息传播, 社会责任, 风险管理, 国际合作,认知作战,新质生产力,人类命运共同体,认知战,认知域,认知战研究中心,认知战争,认知战战术,认知战…

Redis——分布式锁

在一个分布式系统中&#xff0c;只要涉及到多个节点访问同一个公共资源的时候&#xff0c;就需要加锁来实现互斥&#xff0c;从而达到线程安全的问题。 但是呢&#xff0c;分布式系统不同一些&#xff0c;因为分布式系统部署在不同的服务器上&#xff0c;很可能大量的请求打到…

City Builder Urban 城市都市街道建筑场景模型

目前拥有178项优质资产。 城市建设者:Urban一个高质量的资产包,专为快速的纽约式城市建设而设计,与所有渲染管道兼容。 资产 56个带LOD的街道和屋顶道具 13个可堆叠的建筑部件与LOD混合搭配 10个不同尺寸的建筑装饰/分离器,总共40个装饰 请参阅秋季列表的技术细节 1个带有C…

【分布式微服务云原生】8分钟探索RPC:远程过程调用的奥秘与技术实现

摘要 在分布式系统中&#xff0c;RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;技术是连接各个组件的桥梁。本文将深入探讨RPC的概念、技术实现原理、以及请求处理的详细过程。通过清晰的结构、流程图、代码片段和图表&#xff0c;我们将一起揭开…

二分查找一>寻找旋转排序数组中的最小值

1.题目&#xff1a; 2.解析&#xff1a; 代码&#xff1a; 方法一&#xff1a;以最后一个元素为参照物int left 0, right nums.length-1;int n nums.length-1;while(left < right) {int mid left(right-left)/2;if(nums[mid] > nums[n]) left mid1;else right mid…

Nginx03-使用

零、文章目录 Nginx03-使用 1、Nginx服务器启停命令 对于 Nginx 的启停在 Linux 系统中也有很多种方式&#xff0c;我们介绍两种方式&#xff1a; Nginx信号控制Nginx命令行控制 &#xff08;1&#xff09;Nginx信号控制 查看Nginx 中的 master 和 worker 进程 [rootloc…