我试图在
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$a reg_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 coefficients zero_coef_IndepVars.v <- names(which(is.na(reg_model$coefficients))) print(zero_coef_IndepVars.v)
Python代码:
import pandas as pd from sklearn import linear_model a = [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 combination target = df['a'] reg_data = pd.DataFrame() reg_data['a'] = target train_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 object reg_model = linear_model.LinearRegression() # Train the model using the training sets reg_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日进行测试)应该让你在那里.