Python和R之间线性回归系数的差异

Python和R之间线性回归系数的差异,第1张

概述我试图在 Python中运行一个线性回归,我已经在R中完成了为了找到具有0个系数的变量.我遇到的问题是R中的线性回归返回NAs对于低方差的列,而scikit学习回归返回系数.在R代码中,我发现并保存这些变量,通过将NAs作为输出的线性回归保存变量,但我似乎无法想像出一种在python中模拟这种行为的方式.我正在使用的代码可以在下面找到. R代码: a <- c(23, 45, 546, 42, 6 我试图在 Python中运行一个线性回归,我已经在R中完成了为了找到具有0个系数的变量.我遇到的问题是R中的线性回归返回NAs对于低方差的列,而scikit学习回归返回系数.在R代码中,我发现并保存这些变量,通过将NAs作为输出的线性回归保存变量,但我似乎无法想像出一种在python中模拟这种行为的方式.我正在使用的代码可以在下面找到.

R代码:

a <- c(23,45,546,42,68,15,47)b <- c(1,2,4,6,34,8)c <- c(22,33,44,55,66,77,88)d <- c(1,1,1)e <- c(1,1.1)f <- c(1,1.01)g <- c(1,1.001)df <- data.frame(a,b,c,d,e,f,g)var_List = c('b','c','d','e','f','g')target <- temp_dsin.df$areg_data <- cbind(target,df[,var_List])if (nrow(reg_data) < length(var_List)){  message(paste0('    WARNING: Data set is rank deficIEnt. Result may be doubtful'))}reg_model <- lm(target ~ .,data = reg_data)print(reg_model$coefficIEnts)#store the independent variables with 0 coefficIEntszero_coef_IndepVars.v <- names(which(is.na(reg_model$coefficIEnts)))print(zero_coef_IndepVars.v)

Python代码:

import pandas as pdfrom sklearn import linear_modela = [23,47]b = [1,8]c = [22,88]d = [1,1]e = [1,1.1]q = [1,1.01]f = [1,1.001]df = pd.DataFrame({'a': a,'b': b,'c': c,'d': d,'e': e,'f': q,'g': f})var_List = ['b','g']# build linear regression model and test for linear combinationtarget = df['a']reg_data = pd.DataFrame()reg_data['a'] = targettrain_cols = df.loc[:,df.columns.str.lower().isin(var_List)]if reg_data.shape[0] < len(var_List):    print('    WARNING: Data set is rank deficIEnt. Result may be doubtful')# Create linear regression objectreg_model = linear_model.linearRegression()# Train the model using the training setsreg_model.fit(train_cols,reg_data['a'])print(reg_model.coef_)

R的输出:

(Intercept)           b           c           d           e           f           g  537.555988   -0.669253   -1.054719          NA -356.715149          NA          NA > print(zero_coef_IndepVars.v)[1] "d" "f" "g"

Python的输出:

b             c   d               e              f            g[-0.66925301   -1.05471932   0.   -353.1483504   -35.31483504   -3.5314835]

正如你所看到的,列’b’,’c’和’e’的值是接近的,但对于’d’,’f’和’g’来说却是非常不同的.对于这个例子回归,我想要返回[‘d’,’f’,’g’],因为它们的输出是从R的NA.问题是,sklearn线性回归为col’d’返回0,而它返回-35.31为col’f’,-3.531为col’g’.

有没有人知道R如何决定是否返回NA或值/如何将此行为实现到Python版本?知道差异在哪里可能有助于我在Python中实现R行为.我需要python脚本的结果来匹配R输出.

解决方法 实现方式有所不同. R中的lm使用基于QR分解的底层C代码.模型矩阵被分解为正交矩阵Q和三角矩阵R.这导致其他人称为“共线性检查”. R不检查,QR分解的性质确保最小共线变量在拟合算法中获得“优先级”.

关于QR分解的更多信息在线性回归的上下文中:
https://www.stat.wisc.edu/~larget/math496/qr.html

来自sklearn的代码基本上是一个关于numpy.linalg.lstsq的包装器,它最小化了欧几里德二次规范.如果您的模型是Y = AX,它最小化|| Y – AX || ^ 2.这是一个不同的(和计算上不太稳定的)算法,它没有QR分解的很好的副作用.

个人笔记:如果您想在经过验证和经过验证的计算框架中对模型进行稳健的拟合,并坚持使用Python,请寻找基于QR或SVD的线性回归实现.软件包scikit-learn或statsmodels(至今仍然在2017年4月22日进行测试)应该让你在那里.

总结

以上是内存溢出为你收集整理的Python和R之间线性回归系数的差异全部内容,希望文章能够帮你解决Python和R之间线性回归系数的差异所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1207125.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存