【问题标题】:[Statsmodels]: How can I get statsmodel to return the pvalue of an OLS object?[Statsmodels]:如何让 statsmodels 返回 OLD 对象的值?
【发布时间】:2018-01-26 05:05:00
【问题描述】:

我对编程很陌生,我正在学习 Python 以熟悉数据分析和机器学习。

我正在学习关于多元线性回归的反向消除的教程。这是现在的代码:

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Importing the dataset
dataset = pd.read_csv('50_Startups.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 4].values

#Taking care of missin' data
#np.set_printoptions(threshold=100) 
from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values = 'NaN', strategy = 'mean', axis = 0)
imputer = imputer.fit(X[:, 1:3])
X[:, 1:3] = imputer.transform(X[:, 1:3]) 

#Encoding categorical data
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelEncoder_X = LabelEncoder()
X[:, 3] = labelEncoder_X.fit_transform(X[:, 3])
onehotecnoder = OneHotEncoder(categorical_features = [3])
X = onehotecnoder.fit_transform(X).toarray()

#Avoid the Dummy Variables Trap
X = X[:, 1:]

#Splitting data in train and test
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)

#Fitting multiple Linear Regression to Training set
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train)

#Predict Test set
regressor = regressor.predict(X_test)

#Building the optimal model using Backward Elimination
import statsmodels.formula.api as sm
a = 0
b = 0
a, b = X.shape
X = np.append(arr = np.ones((a, 1)).astype(int), values = X, axis = 1)
print (X.shape)

X_optimal = X[:,[0,1,2,3,4,5]]
regressor_OLS = sm.OLS(endog = y, exog = X_optimal).fit()
regressor_OLS.summary()
X_optimal = X[:,[0,1,3,4,5]]
regressor_OLS = sm.OLS(endog = y, exog = X_optimal).fit()
regressor_OLS.summary()
X_optimal = X[:,[0,3,4,5]]
regressor_OLS = sm.OLS(endog = y, exog = X_optimal).fit()
regressor_OLS.summary()
X_optimal = X[:,[0,3,5]]
regressor_OLS = sm.OLS(endog = y, exog = X_optimal).fit()
regressor_OLS.summary()
X_optimal = X[:,[0,3]]
regressor_OLS = sm.OLS(endog = y, exog = X_optimal).fit()
regressor_OLS.summary()

现在,执行消除的方式对我来说似乎真的很手动,我想自动化它。为了做到这一点,我想知道是否有办法让我以某种方式返回回归量的 pvalue(例如,如果在 statsmodels 中有一种方法可以做到这一点)。这样我想我应该能够循环 X_optimal 数组的特征,看看 pvalue 是否大于我的 SL 并消除它。

谢谢!

【问题讨论】:

    标签: python machine-learning data-analysis statsmodels


    【解决方案1】:

    感谢 Keith 的回答,只需对 Keith 的循环进行一些小修复以使其更高效:

    sigLevel = 0.05
    X_opt = X[:,[0,1,2,3,4,5]]
    regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit()
    pVals = regressor_OLS.pvalues
    
    while pVals[np.argmax(pVals)] > sigLevel:
         X_opt = np.delete(X_opt, np.argmax(pVals), axis = 1)
         print("pval of dim removed: " + str(np.argmax(pVals)))
         print(str(X_opt.shape[1]) + " dimensions remaining...")
         regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit()
         pVals = regressor_OLS.pvalues
    
    regressor_OLS.summary()
    

    【讨论】:

      【解决方案2】:

      遇到了同样的问题。

      您可以通过

      访问 p 值
      regressor_OLS.pvalues 
      

      它们以科学计数法存储为 float64 数组。我对 python 有点陌生,我确信有更清洁、更优雅的解决方案,但这是我的:

      sigLevel = 0.05
      
      X_opt = X[:,[0,1,2,3,4,5]]
      regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit()
      regressor_OLS.summary()
      pVals = regressor_OLS.pvalues
      
      while np.argmax(pVals) > sigLevel:
          droppedDimIndex = np.argmax(regressor_OLS.pvalues)
          keptDims = list(range(len(X_opt[0])))
          keptDims.pop(droppedDimIndex)
          print("pval of dim removed: " + str(np.argmax(pVals)))
          X_opt = X_opt[:,keptDims]
          regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit()
          pVals = regressor_OLS.pvalues
          print(str(len(pVals)-1) + " dimensions remaining...")
          print(pVals)
      
      regressor_OLS.summary()
      

      【讨论】:

        猜你喜欢
        • 2015-01-15
        • 2014-07-28
        • 2021-05-28
        • 2015-12-31
        • 1970-01-01
        • 2016-02-17
        • 1970-01-01
        • 2018-06-12
        • 1970-01-01
        相关资源
        最近更新 更多