【问题标题】:How to get a regression summary in scikit-learn like R does?如何像 R 一样在 scikit-learn 中获得回归摘要?
【发布时间】:2014-12-06 19:03:49
【问题描述】:

作为 R 用户,我还想快速了解 scikit。

创建线性回归模型很好,但似乎无法找到一种合理的方法来获得回归输出的标准摘要。

代码示例:

# Linear Regression
import numpy as np
from sklearn import datasets
from sklearn.linear_model import LinearRegression

# Load the diabetes datasets
dataset = datasets.load_diabetes()

# Fit a linear regression model to the data
model = LinearRegression()
model.fit(dataset.data, dataset.target)
print(model)

# Make predictions
expected = dataset.target
predicted = model.predict(dataset.data)

# Summarize the fit of the model
mse = np.mean((predicted-expected)**2)
print model.intercept_, model.coef_, mse, 
print(model.score(dataset.data, dataset.target))

问题:

  • 似乎 interceptcoef 已内置到模型中,我只需键入 print(倒数第二行)即可查看它们。
  • 所有其他标准回归输出(如 R^2、调整后的 R^2、p 值等)怎么样?如果我正确阅读示例,您似乎必须编写函数/方程对于其中的每一个,然后打印出来。
  • 那么,是否没有针对 lin 的标准摘要输出。注册型号?
  • 另外,在我打印的系数输出数组中,没有与每个相关的变量名?我只是得到数字数组。有没有办法打印这些我得到系数的输出和他们去的变量?

我的打印输出:

LinearRegression(copy_X=True, fit_intercept=True, normalize=False)
152.133484163 [ -10.01219782 -239.81908937  519.83978679  324.39042769 -792.18416163
  476.74583782  101.04457032  177.06417623  751.27932109   67.62538639] 2859.69039877
0.517749425413

注意:从线性、山脊和套索开始。我已经浏览了这些例子。下面是基本的OLS。

【问题讨论】:

标签: python r scikit-learn linear-regression summary


【解决方案1】:

sklearn中不存在R类型回归总结报告。主要原因是 sklearn 用于预测建模/机器学习,评估标准基于以前未见过的数据的性能(例如回归的预测 r^2)。

确实存在一个名为sklearn.metrics.classification_report 的分类汇总函数,它计算分类模型上的几种(预测)分数。

如需更经典的统计方法,请查看statsmodels

【讨论】:

  • 感谢指向statsmodels 的指针。但是,缺少摘要功能的主要原因是奇怪的。良好的模型构建需要对模型本身进行一定程度的反省,以至少回答“这有意义吗?”的问题
【解决方案2】:

预测后使用model.summary()

# Linear Regression
import numpy as np
from sklearn import datasets
from sklearn.linear_model import LinearRegression

# load the diabetes datasets
dataset = datasets.load_diabetes()

# fit a linear regression model to the data
model = LinearRegression()
model.fit(dataset.data, dataset.target)
print(model)

# make predictions
expected = dataset.target
predicted = model.predict(dataset.data)

# >>>>>>>Print out the statistics<<<<<<<<<<<<<
model.summary()

# summarize the fit of the model
mse = np.mean((predicted-expected)**2)
print model.intercept_, model.coef_, mse, 
print(model.score(dataset.data, dataset.target))

【讨论】:

  • 在当前版本的 Sklearn 0.19.1 中,线性回归对象没有此摘要方法/属性。在 docs 上找不到它,当我在自己的环境中运行它时,我收到错误 'LinearRegression' object has no attribute 'summary'
【解决方案3】:

statsmodels 包提供了一个安静而体面的总结

from statsmodels.api import OLS
OLS(dataset.target,dataset.data).fit().summary()

【讨论】:

    【解决方案4】:

    我用:

    import sklearn.metrics as metrics
    def regression_results(y_true, y_pred):
    
        # Regression metrics
        explained_variance=metrics.explained_variance_score(y_true, y_pred)
        mean_absolute_error=metrics.mean_absolute_error(y_true, y_pred) 
        mse=metrics.mean_squared_error(y_true, y_pred) 
        mean_squared_log_error=metrics.mean_squared_log_error(y_true, y_pred)
        median_absolute_error=metrics.median_absolute_error(y_true, y_pred)
        r2=metrics.r2_score(y_true, y_pred)
    
        print('explained_variance: ', round(explained_variance,4))    
        print('mean_squared_log_error: ', round(mean_squared_log_error,4))
        print('r2: ', round(r2,4))
        print('MAE: ', round(mean_absolute_error,4))
        print('MSE: ', round(mse,4))
        print('RMSE: ', round(np.sqrt(mse),4))
    

    【讨论】:

      【解决方案5】:

      你可以使用 statsmodels

      import statsmodels.api as sm
      X = sm.add_constant(X.ravel())
      results = sm.OLS(y,x).fit()
      results.summary()  
      

      results.summary() 会将结果组织成三个表格

      【讨论】:

        【解决方案6】:

        您可以使用以下选项来创建汇总表:

        import statsmodels.api as sm
        
        #log_clf = LogisticRegression()
        
        log_clf =sm.Logit(y_train,X_train)
        
        classifier = log_clf.fit()
        
        y_pred = classifier.predict(X_test)
        
        print(classifier.summary2())
        

        【讨论】:

          猜你喜欢
          • 2018-09-24
          • 2017-01-12
          • 2016-09-18
          • 1970-01-01
          • 2015-01-13
          • 2014-06-17
          • 2016-04-10
          • 1970-01-01
          相关资源
          最近更新 更多