代码之家  ›  专栏  ›  技术社区  ›  Chris

多个预测

  •  4
  • Chris  · 技术社区  · 6 年前

    我有一个df,在这里我需要预测未来7天每天的因变量(数字)。这个 train 数据如下:

    df.head()
    Date                   X1                X2             X3    Y
    2004-11-20          453.0               654            989  716   # row 1
    2004-11-21          716.0               878            886  605
    2004-11-22          605.0               433            775  555
    2004-11-23          555.0               453            564  680
    2004-11-24          680.0               645            734  713
    

    具体来说,日期 2004-11-20 在第一排我需要一个 Y 未来7天每天的预测值,而不仅仅是当前日期(变量 Y ,并考虑到预测第5天开始于 2004—11-20 我不打算在以后的4天内从 2004—11-20 .

    我一直在思考如何再创建7个变量( "Y+1day" , "Y+2day “等等),但是我需要为每天创建一个训练df,因为机器学习技术只返回一个变量作为输出。有更简单的方法吗?

    我正在使用Skikit学习库进行建模。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Charles Landau    6 年前

    你绝对可以训练一个模型来预测 sklearn . 和 pandas 非常灵活。在下面的示例中,我将日期列转换为日期时间索引,然后使用 shift 获取更多Y值的实用程序。

    import io
    import pandas as pd
    import numpy as np
    from sklearn.model_selection import train_test_split
    
    # Read from stackoverflow artifacts
    s = """Date  X1  X2   X3   Y
    2004-11-20          453.0               654            989  716  
    2004-11-21          716.0               878            886  605
    2004-11-22          605.0               433            775  555
    2004-11-23          555.0               453            564  680
    2004-11-24          680.0               645            734  713"""
    text = io.StringIO(s)
    df = pd.read_csv(text, sep='\\s+')
    
    # Datetime index
    df["Date"] = pd.to_datetime(df["Date"], format="%Y/%m/%d")
    df = df.set_index("Date")
    
    # Shifting for Y@Day+N   
    df['Y1'] = df.shift(1)['Y'] # One day later
    df['Y2'] = df.shift(2)['Y'] # Two...
    

    当我们使用轮班时,我们必须输入或删除结果的nan。在大型数据集中,这可能只会导致在时间范围的边缘输入或丢弃数据。例如,如果您希望7天的移位,那么根据数据的结构和移位方式,数据集将丢失7天。

    df.dropna(inplace=True) # Drop two rows
    
    train, test = train_test_split(df)
    # Get two training rows
    trainX = train.drop(["Y", "Y1", "Y2"], axis=1)
    trainY = train.drop(["X1", "X2", "X3"], axis=1)
    
    # Get the test row
    X = test.drop(["Y", "Y1", "Y2"], axis=1)
    Y = test.drop(["X1", "X2", "X3"], axis=1)
    

    现在我们可以从sklearn实例化一个分类器并进行预测。

    from sklearn.linear_model import LinearRegression
    
    clf = LinearRegression()
    model = clf.fit(trainX, trainY)
    model.predict(X) # Array of three numbers
    model.score(X, Y) # Predictably abysmal score
    

    用sklearn版本,这些对我来说都很好。 0.20.1 . 当然,我从中得到了一个糟糕的分数结果,但是模型确实训练了,并且预测方法确实返回了每个y列的预测,而分数方法返回了一个分数。