这几天需求比较少,于是就想找个比赛打,顺便学习,充电,搜了一下,看到阿里云有很多正在进行的比赛,于是就报名参加了一个,一开始看到数据,感觉数据不大,应该好做,但是,再一细看,比赛有算法要求,给了一个算法列表,我一看,靠,一个都没见过,亏我做了大半年数据分析,看来还是嫩的很,基础理论知识太薄弱了,需要大补,于是各种百度,看算法列表上的算法都是干什么的,经过一番搜索,发现他列的算法都是那种公式型的,需要比较扎实的理论知识,概率与统计,线性代数,微积分什么的,后来我就搜现在有什么好用的包来做这方面的东西没有,发现有个包是做这个的,它就是statsmodels,于是开始看sm的文档,看了两天,终于看到一个能用到比赛的模型,于是就赶紧带入数据建模,预测,做出一个结果,提交了上去,嘿,你还别说,上来准确率就得了0.49,排行榜46名,我心情大好,非常有成就感,虽然我还没弄明白具体的原理,哈哈。

废话少说,放代码

from statsmodels.datasets import co2
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
f = r"C:\Users\c-master\Desktop\下载\tianchi\train.csv"
data = pd.read_csv(f)
data.set_index('time',inplace=True)
#data=co2.load(as_pandas=True).data
#data = data[['cv1']]
print(data)

data.plot()

data_diff=data.diff(20).dropna()#12阶差分,删掉缺失值
data_diff=data
print(data_diff.head(10))

from statsmodels.tsa.arima_model import ARMA#导入ARMA类
from statsmodels.tsa.api import VAR
#from statsmodels.tsa.arima.model import ARMA,ARIMA
model=VAR(data_diff)
results = model.fit(1)
print(results.summary())

results.plot()

results.plot_acorr()

predict_df = pd.read_csv(r"C:\Users\c-master\Desktop\下载\tianchi\predict.csv")
predict_data = predict_df.set_index("time")
lag_order = results.k_ar
print(lag_order)
df = pd.DataFrame({
    'cv1':[324],
    'cv2':[0.877]
})
for i in range(0,50):
    pre_res = results.forecast(predict_data.values[i*100+2-1:i*100+2], 99)
    tmp_data = predict_data.iloc[i*100+2-1:i*100+2,[3,4]].copy()

    dt = pd.DataFrame(pre_res,columns=['dv1','dv2','mv1','cv1','cv2'])
    tmp_res = dt.loc[:,['cv1','cv2']]
    df = pd.concat([df,tmp_data,tmp_res],axis=0)

df.to_csv("predict.txt",index=False)

这个代码实现是一个var算法,翻译过来就是向量自回归算法,用来处理多列的时序数据建模,在深度学习爆火的当下,大家已经很熟悉,处理时序预测有专门的神经网络lstm,trasformer等,但是没办法,官方不让用,因为这个算法要用到控制器里,而神经网络模型首先比较大,第二,可解释性比较差,所以不太适合,所以只能用传统的公式模型,虽然这些传统模型在神经网络的光辉下已经不再那么耀眼,但是技术含量是丝毫不含糊的,理解起来比神经网络更难,因为涉及到的理论知识特别多。

        总的来说,这次参赛还是有很大收获,不管最后什么排名,通过比赛,知道自己哪些地方还需要补足,学到东西,这些隐藏目标才是最重要的。