【问题标题】:statistical summary table in sklearn.linear_model.ridge?sklearn.linear_model.ridge 中的统计汇总表?
【发布时间】:2017-02-25 15:20:45
【问题描述】:

在 OLS 形式的 StatsModels 中,results.summary 显示回归结果的汇总(例如 AIC、BIC、R-squared、...)。

有没有办法在 sklearn.linear_model.ridge 中有这个汇总表?

如果有人指导我,我将不胜感激。谢谢。

【问题讨论】:

    标签: python statsmodels sklearn-pandas


    【解决方案1】:

    据我所知,sklearn 中没有类似 R(或 Statsmodels)的汇总表。 (请查看this answer

    相反,如果您需要它,可以使用 statsmodels.regression.linear_model.OLS.fit_regularized 类。 (L1_wt=0 用于岭回归。)

    目前,model.fit_regularized(~).summary() 似乎返回None,尽管下面有文档字符串。但是对象有paramssummary()可以用某种方式。

    返回:一个 RegressionResults 对象,与 fit 返回的类型相同。

    示例。

    样本数据不适用于岭回归,但无论如何我都会尝试。

    在。

    import numpy as np
    import pandas as pd
    import statsmodels
    import statsmodels.api as sm
    import matplotlib.pyplot as plt
    
    statsmodels.__version__
    

    出去。

    '0.8.0rc1'
    

    在。

    data = sm.datasets.ccard.load()
    
    print "endog: " + data.endog_name
    print "exog: " + ', '.join(data.exog_name)
    
    data.exog[:5, :]
    

    出去。

    endog: AVGEXP
    exog: AGE, INCOME, INCOMESQ, OWNRENT
    Out[2]:
    array([[ 38.    ,   4.52  ,  20.4304,   1.    ],
           [ 33.    ,   2.42  ,   5.8564,   0.    ],
           [ 34.    ,   4.5   ,  20.25  ,   1.    ],
           [ 31.    ,   2.54  ,   6.4516,   0.    ],
           [ 32.    ,   9.79  ,  95.8441,   1.    ]])
    

    在。

    y, X = data.endog, data.exog
    
    model = sm.OLS(y, X)
    results_fu = model.fit()
    
    print results_fu.summary()
    

    出去。

                                OLS Regression Results                            
    ==============================================================================
    Dep. Variable:                      y   R-squared:                       0.543
    Model:                            OLS   Adj. R-squared:                  0.516
    Method:                 Least Squares   F-statistic:                     20.22
    Date:                Wed, 19 Oct 2016   Prob (F-statistic):           5.24e-11
    Time:                        17:22:48   Log-Likelihood:                -507.24
    No. Observations:                  72   AIC:                             1022.
    Df Residuals:                      68   BIC:                             1032.
    Df Model:                           4                                         
    Covariance Type:            nonrobust                                         
    ==============================================================================
                     coef    std err          t      P>|t|      [0.025      0.975]
    ------------------------------------------------------------------------------
    x1            -6.8112      4.551     -1.497      0.139     -15.892       2.270
    x2           175.8245     63.743      2.758      0.007      48.628     303.021
    x3            -9.7235      6.030     -1.613      0.111     -21.756       2.309
    x4            54.7496     80.044      0.684      0.496    -104.977     214.476
    ==============================================================================
    Omnibus:                       76.325   Durbin-Watson:                   1.692
    Prob(Omnibus):                  0.000   Jarque-Bera (JB):              649.447
    Skew:                           3.194   Prob(JB):                    9.42e-142
    Kurtosis:                      16.255   Cond. No.                         87.5
    ==============================================================================
    
    Warnings:
    [1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
    

    在。

    frames = []
    for n in np.arange(0, 0.25, 0.05).tolist():
        results_fr = model.fit_regularized(L1_wt=0, alpha=n, start_params=results_fu.params)
    
        results_fr_fit = sm.regression.linear_model.OLSResults(model, 
                                                               results_fr.params, 
                                                               model.normalized_cov_params)
        frames.append(np.append(results_fr.params, results_fr_fit.ssr))
    
        df = pd.DataFrame(frames, columns=data.exog_name + ['ssr*'])
    df.index=np.arange(0, 0.25, 0.05).tolist()
    df.index.name = 'alpha*'
    df.T
    

    出去。

    在。

    %matplotlib inline
    
    fig, ax = plt.subplots(1, 2, figsize=(14, 4))
    
    ax[0] = df.iloc[:, :-1].plot(ax=ax[0])
    ax[0].set_title('Coefficient')
    
    ax[1] = df.iloc[:, -1].plot(ax=ax[1])
    ax[1].set_title('SSR')
    

    出去。

    在。

    results_fr = model.fit_regularized(L1_wt=0, alpha=0.04, start_params=results_fu.params)
    final = sm.regression.linear_model.OLSResults(model, 
                                                  results_fr.params, 
                                                  model.normalized_cov_params)
    
    print final.summary()
    

    出去。

                                OLS Regression Results                            
    ==============================================================================
    Dep. Variable:                      y   R-squared:                       0.543
    Model:                            OLS   Adj. R-squared:                  0.516
    Method:                 Least Squares   F-statistic:                     20.17
    Date:                Wed, 19 Oct 2016   Prob (F-statistic):           5.46e-11
    Time:                        17:22:49   Log-Likelihood:                -507.28
    No. Observations:                  72   AIC:                             1023.
    Df Residuals:                      68   BIC:                             1032.
    Df Model:                           4                                         
    Covariance Type:            nonrobust                                         
    ==============================================================================
                     coef    std err          t      P>|t|      [0.025      0.975]
    ------------------------------------------------------------------------------
    x1            -5.6375      4.554     -1.238      0.220     -14.724       3.449
    x2           159.1412     63.781      2.495      0.015      31.867     286.415
    x3            -8.1360      6.034     -1.348      0.182     -20.176       3.904
    x4            44.2597     80.093      0.553      0.582    -115.564     204.083
    ==============================================================================
    Omnibus:                       76.819   Durbin-Watson:                   1.694
    Prob(Omnibus):                  0.000   Jarque-Bera (JB):              658.948
    Skew:                           3.220   Prob(JB):                    8.15e-144
    Kurtosis:                      16.348   Cond. No.                         87.5
    ==============================================================================
    
    Warnings:
    [1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
    

    【讨论】:

    • 感谢您的回答。抱歉,我对 R 不熟悉。在 python 中,我从 statsmodels.formula.api 导入了 ols。我应用了这个命令,model=ols.ols("y~a1+a2+a3+a4",data).fit()。然后 model.summary() 将显示汇总统计表。我想对我的数据应用岭回归。我试过model=ols.ols("y~a1+a2+a3+a4",data).fit_regularized(L1_wt=0,alpha=0.005),但是结果和没有正则化一样。如果您指导我解决此问题,我将不胜感激。提前谢谢你。
    • @zhr 你知道,.fit_regularized(~).summary() 似乎还没有实现,不像 logit 的那样。所以我用上面的OLSResult 类调用尝试了一些技巧。
    • @su79eu7k - 假设 ssr 是指残差平方和,ssr 的规模是不是太宽泛而无法用于解释比较不同的 alpha 值 wrt 正则化拟合?
    • 我认为这个解决方案有问题。它在一些邪恶的婚姻中结合了来自正规化和非正规化训练模型的报告。作为证据,请尝试在不训练非正则化模型的情况下运行上述脚本 - 它不起作用。这是因为尚未为正则化模型设置归一化 cov 参数(我认为!)
    • 作为一种变通方法,我将使用来自非正则化模型的报告来帮助我解释正则化模型的结果。不理想,但现在可以。将它们组合起来的问题是每个系数的标准误差不受正则化的影响,因此一个显着但由于正则化而缩小的变量可能看起来微不足道。这有意义吗?
    【解决方案2】:
    from statsmodels.tools.tools import pinv_extended
    X_train = sm.add_constant(X_train)
    model = sm.OLS(y_train, X_train)
    
    # If True, the model is refit using only the variables that have non-zero 
    # coefficients in the regularized fit. The refitted model is not regularized.
    result = model.fit_regularized(
                        method = 'elastic_net',
                        alpha = alp,
                        L1_wt = l1,
                        start_params = None,
                        profile_scale = False,
                        #refit = True,
                        refit = False,
                        maxiter = 9000,
                        zero_tol = 1e-5,
                        )
    
    pinv_wexog,_ = pinv_extended(model.wexog)
    normalized_cov_params = np.dot(pinv_wexog, np.transpose(pinv_wexog))
    
    
    final = sm.regression.linear_model.OLSResults(model, 
                                      result.params, 
                                      normalized_cov_params)
    #print(final.summary())
    x = sm.add_constant(X_test)
    #x = X_test
    R2 = r2_score(y_test, final.predict(x))
    
    p = final.pvalues
    t = final.tvalues
    

    【讨论】:

    • 它有什么作用?你应该解释你的解决方案
    • 完美工作以获得模型摘要()
    【解决方案3】:

    感谢@Bugee,我创建了以下函数,该函数返回 statsmodels 指标,例如 rsquared 和 rsquared_adj,以及 summary()。

    您也可以使用 sklearn 线性模型(LinearRegression、Lasso、Ridge...)和 statsmodels OLS 和正则化 OLS。

    from statsmodels.tools.tools import pinv_extended
    import statsmodels.api as sm
    import sklearn, statsmodels
    
    def regression_analysis(X, y, model):
        
        is_statsmodels = False
        is_sklearn = False
        
        # check for accepted linear models
        if type(model) in [sklearn.linear_model._base.LinearRegression,
                           sklearn.linear_model._ridge.Ridge,
                           sklearn.linear_model._ridge.RidgeCV,
                           sklearn.linear_model._coordinate_descent.Lasso,
                           sklearn.linear_model._coordinate_descent.LassoCV,
                           sklearn.linear_model._coordinate_descent.ElasticNet,
                           sklearn.linear_model._coordinate_descent.ElasticNetCV,
                          ]:
            is_sklearn = True
        elif type(model) in [statsmodels.regression.linear_model.OLS, 
                             statsmodels.base.elastic_net.RegularizedResults,
                            ]:
            is_statsmodels = True
        else:
            print("Only linear models are supported!")
            return None
        
        
        
        has_intercept = False
        
        if is_statsmodels and all(np.array(X)[:,0]==1):
            # statsmodels add_constant has been used already
            has_intercept = True  
        elif is_sklearn and model.intercept_:
            has_intercept = True
            
    
        
        if is_statsmodels:
            # add_constant has been used already
            x = X
            model_params = model.params
        else: # sklearn model
            if has_intercept:
                x = sm.add_constant(X)
                model_params = np.hstack([np.array([model.intercept_]), model.coef_])
            else:
                x = X
                model_params = model.coef_
            
        #y = np.array(y).ravel()
        
        # define the OLS model
        olsModel = sm.OLS(y, x)
        
        pinv_wexog,_ = pinv_extended(x)
        normalized_cov_params = np.dot(pinv_wexog, np.transpose(pinv_wexog))
        
        
        return sm.regression.linear_model.OLSResults(olsModel, model_params, normalized_cov_params)
        
    

    如何使用?

    from sklearn.linear_model import Ridge
    
    
    skridge = Ridge(alpha=0.2, max_iter=9000, tol=1e-5, fit_intercept=True)
    skridge.fit(X,y)
    
    result = regression_analysis(X, y, skridge)
    result.summary()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 2011-07-10
      • 2015-09-22
      • 1970-01-01
      相关资源
      最近更新 更多