Python / Sklearn中的循环回归模型

时间:2018-07-17 19:07:24

标签: python scikit-learn regression

我试图在一组相同的输入/自变量上系统地回归几个不同的因变量(国家),并希望使用Sklearn在Python中以循环方式进行。因变量看起来像这样:

            Europe  UK  Japan   USA Canada
    Jan-10  10  13  39  42  16
    Feb-10  13  16  48  51  19
    Mar-10  15  18  54  57  21
    Apr-10  12  15  45  48  18
    May-10  11  14  42  45  17

而自变量看起来像这样:

            Input 1 Input 2 Input 3 Input 4
    Jan-10  90  50  3   41
    Feb-10  95  54  5   43
    Mar-10  92  52  1   45
    Apr-10  91  60  1   49
    May-10  90  67  11  49

我发现手动将它们+一次存储预测一次很容易(即在所有四个输入上都输入欧洲,然后在日本等),但是还没有弄清楚如何编写一个可以将它们全部组合在一起的循环函数走。我怀疑我可能需要使用列表/字典来存储因变量,然后将它们一个接一个地调用,但是我不太了解如何以Python的方式编写它。

单个循环的现有代码如下:

    x = pd.DataFrame('countryinputs.csv')
    countries = pd.DataFrame('countryoutputs.csv')
    y = countries['Europe']

    from sklearn.linear_model import LinearRegression
    regressor = LinearRegression()
    regressor.fit(X, y)

    y_pred = regressor.predict(X)

1 个答案:

答案 0 :(得分:0)

仅遍历列名。然后将名称传递给已定义的函数。实际上,您可以将过程包装为字典理解,然后传递到DataFrame构造函数中以返回预测值的数据框(与原始数据框的形状相同):

X = pd.DataFrame(...)
countries = pd.DataFrame(...)

def reg_proc(label):
    y = countries[label]

    regressor = LinearRegression()
    regressor.fit(X, y)

    y_pred = regressor.predict(X)        
    return(y_pred)

pred_df = pd.DataFrame({lab: reg_proc(lab) for lab in countries.columns}, 
                       columns = countries.columns)

使用随机的种子数据进行演示,其中以下 tools 将是您的国家

数据

import numpy as np
import pandas as pd

from sklearn.linear_model import LinearRegression

np.random.seed(7172018)
tools = pd.DataFrame({'pandas': np.random.uniform(0,1000,50),
                      'r': np.random.uniform(0,1000,50),
                      'julia': np.random.uniform(0,1000,50),
                      'sas': np.random.uniform(0,1000,50),
                      'spss': np.random.uniform(0,1000,50),
                      'stata': np.random.uniform(0,1000,50)
                     },  
                     columns=['pandas', 'r', 'julia', 'sas', 'spss', 'stata'])

X = pd.DataFrame({'Input1': np.random.randn(50)*10,
                  'Input2': np.random.randn(50)*10,
                  'Input3': np.random.randn(50)*10,
                  'Input4': np.random.randn(50)*10})

模型

def reg_proc(label):
    y = tools[label]

    regressor = LinearRegression()
    regressor.fit(X, y)

    y_pred = regressor.predict(X)        
    return(y_pred)

pred_df = pd.DataFrame({lab: reg_proc(lab) for lab in tools.columns}, 
                       columns = tools.columns)

print(pred_df.head(10))

#        pandas           r       julia         sas        spss       stata
# 0  547.631679  576.025733  682.390046  507.767567  246.020799  557.648181
# 1  577.334819  575.992992  280.579234  506.014191  443.044139  396.044620
# 2  430.494827  576.211105  541.096721  441.997575  386.309627  558.472179
# 3  440.662962  524.582054  406.849303  420.017656  508.701222  393.678200
# 4  588.993442  472.414081  453.815978  479.208183  389.744062  424.507541
# 5  520.215513  489.447248  670.708618  459.375294  314.008988  516.235188
# 6  515.266625  459.292370  477.485995  436.398180  446.777292  398.826234
# 7  423.930650  414.069751  629.444118  378.059735  448.760240  449.062734
# 8  549.769034  406.531405  653.557937  441.425445  348.725447  456.089921
# 9  396.826924  399.327683  717.285415  361.235709  444.830491  429.967976