【问题标题】:Time series forecasting with svr in scikit learn在 scikit learn 中使用 svr 进行时间序列预测
【发布时间】:2017-05-09 17:23:15
【问题描述】:

我有按日期索引的每日温度数据集,我需要使用 scikit-learn 中的 [SVR][1] 预测未来温度。

我坚持选择训练的 XY 以及测试的 X 放。例如,如果我想在时间 t 预测 Y,那么我需要 训练集包含t-1, t-2, ..., t-N 处的XY,其中N 是用于预测Yt 的先前天数。

我该怎么做?

就是这样。

df=daily_temp1
# define function for create N lags
def create_lags(df, N):
    for i in range(N):
        df['datetime' + str(i+1)] = df.datetime.shift(i+1)
        df['dewpoint' + str(i+1)] = df.dewpoint.shift(i+1)
        df['humidity' + str(i+1)] = df.humidity.shift(i+1)
        df['pressure' + str(i+1)] = df.pressure.shift(i+1)
        df['temperature' + str(i+1)] = df.temperature.shift(i+1)
    df['vism' + str(i+1)] = df.vism.shift(i+1)
    df['wind_direcd' + str(i+1)] = df.wind_direcd.shift(i+1)
    df['wind_speed' + str(i+1)] = df.wind_speed.shift(i+1)
    df['wind_direct' + str(i+1)] = df.wind_direct.shift(i+1)

    return df

# create 10 lags
df = create_lags(df,10)


# the first 10 days will have missing values. can't use them.
df = df.dropna()

# create X and y
y = df['temperature']
X = df.iloc[:, 9:]

# Train on 70% of the data
train_idx = int(len(df) * .7)

# create train and test data
X_train, y_train, X_test, y_test = X[:train_idx], y[:train_idx], X[train_idx:], y[train_idx:]


# fit and predict
clf = SVR()
clf.fit(X_train, y_train)

clf.predict(X_test)

【问题讨论】:

    标签: python pandas scikit-learn time-series svm


    【解决方案1】:

    这是一个将特征矩阵 X 构建为简单的 lag1 - lagN 的解决方案,其中 lag1 是前几天的温度,而 lagN 是 N 天前的温度。

    # create fake temperature
    df = pd.DataFrame({'temp':np.random.rand(500)})
    
    # define function for create N lags
    def create_lags(df, N):
        for i in range(N):
            df['Lag' + str(i+1)] = df.temp.shift(i+1)
        return df
    
    # create 10 lags
    df = create_lags(df,10)
    
    # the first 10 days will have missing values. can't use them.
    df = df.dropna()
    
    # create X and y
    y = df.temp.values
    X = df.iloc[:, 1:].values
    
    # Train on 70% of the data
    train_idx = int(len(df) * .7)
    
    # create train and test data
    X_train, y_train, X_test, y_test = X[:train_idx], y[:train_idx], X[train_idx:], y[:train_idx]
    
    # fit and predict
    clf = SVR()
    clf.fit(X_train, y_train)
    
    clf.predict(X_test)
    

    【讨论】:

    • 谢谢!我试图使其符合我的目标,因为除了以前的温度之外,我还需要其他功能,但我一直遇到错误 TypeError: float() argument must be a string or a number
    • scikit learn 无法处理字符串。您必须将所有字符串转换为数字。如果您有 pandas 数据框,请使用 pd.get_dummies。如果您严格使用 sklearn,请在预处理模块中使用 LabelBinarizer
    • 我已经改变了字符串,现在我有了浮点和日期时间数据类型
    • datetime datetime64[ns] 露点 float64 湿度 float64 压力 float64 温度 float64 vim float64 wind_direcd float64 wind_speed float64 wind_direct float64
    • 去掉日期时间列。将其保留在您的模型中是没有意义的。如果您绝对想出于历史目的保留它,您可以使用可能具有一些可预测性的月份之类的东西。使用df['datetime'].dt.month。基本上,每个特征都必须是数字(整数或浮点数),而不是日期时间、字符串或任何其他数据类型。
    猜你喜欢
    • 2015-08-01
    • 2019-05-22
    • 2018-05-07
    • 2014-01-17
    • 2017-03-14
    • 2020-05-07
    • 2017-04-25
    • 2021-10-26
    相关资源
    最近更新 更多