时间序列预测(一)—— 数据预处理
時間序列預測(一)—— 數據預處理
歡迎大家來我的個人博客網站觀看原文:https://xkw168.github.io/2019/05/20/時間序列預測-一-數據預處理.html
??最近在做時間序列的預測問題,這里就稍微總結回顧一下,便于以后查閱,也希望能給大家提供到幫助,有什么問題歡迎多多交流。
??這是一個系列的文章,主要從代碼的角度分析問題(爭取做到代碼片段的隨用隨取),不涉及太多的模型原理(我會盡可能講一下自己的理解),本系列文章包含了數據預處理和基本時間序列分析預測模型:
(一)數據預處理
(二)AR模型(自回歸模型)
(三)Xgboost模型
(四)LSTM模型
(五)Prophet模型(自回歸模型)
數據預處理(pre-processing)
數據預處理在數據分析中占據了重要的地位,這里主要介紹幾種常見的預處理方法
1. 歸一化(反歸一化)
??歸一化可以說是數據預處理里面最常用的方法之一了,在模型訓練中不同的數據取值范圍假如相差過大很容易造成模型錯誤的分配權重,所以很多時候歸一化必不可少。
def normalize(data, method="MinMax", feature_range=(0, 1)):"""normalize the data:param data: list of data:param method: support MinMax scaler or Z-Score scaler:param feature_range: use in MinMax scaler:return: normalized data(list), scaler"""data = np.array(data)if len(data.shape) == 1 or data.shape[1] != 1:# reshape(-1, 1) --> reshape to a one column n rows matrix(-1 means not sure how many row)data = data.reshape(-1, 1)if method == "MinMax":scaler = MinMaxScaler(feature_range=feature_range)elif method == "Z-Score":scaler = StandardScaler()else:raise ValueError("only support MinMax scaler and Z-Score scaler")scaler.fit(data)# scaler transform apply to each column respectively# (which means that if we want to transform a 1-D data, we must reshape it to n x 1 matrix)return scaler.transform(data).reshape(-1), scalerdef denormalize(data, scaler):"""denormalize data by scaler:param data::param scaler::return: denormalized data"""data = np.array(data)if len(data.shape) == 1 or data.shape[1] != 1:data = data.reshape(-1, 1)# max, min, mean, variance are all store in scaler, so we need it to perform inverse transformreturn scaler.inverse_transform(data).reshape(-1)2.重采樣
??有時候原始數據的采樣頻率可能太高,導致噪聲比較大,重采樣可以在一定程度上降低噪聲,同時數據量較大的時候還可以起到減小數據量提高模型的迭代速度。
def resample(data, period="W"):"""resample the original data to reduce noise:param data::param period: the period of data e.g. B - business day, D - calendar day, W - weekly, Y - yearly etc.(reference: pandas DateOffset Objects'http://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html'):return:"""data = data.set_index(pd.DatetimeIndex(data['ds']))return data.resample(period, label="right").mean().reset_index()3.數據劃分
??用于將原始數據劃分為訓練機,測試集和驗證集,可以自行調整分配權重。
def split_data(observed_data, split_ratio=(8, 2, 1)):"""split the observed data into train-evaluation-test three part:param observed_data::param split_ratio: relative proportion among train,evaluation,test:return: train, evaluation, test data"""total = split_ratio[0] + split_ratio[1] + split_ratio[2]length = len(observed_data)train_cnt = int((split_ratio[0] / total) * length)test_cnt = int((split_ratio[2] / total) * length)return observed_data[:train_cnt], observed_data[train_cnt:-test_cnt], observed_data[-test_cnt:]4.各種濾波(中值,均值,巴特沃斯)
??這個主要用于信號處理,一般的數據分析可能用的不多。
def median_filter(datas, length=3):"""median filter, length must be odd number:param datas::param length::return:"""return signal.medfilt(datas, length).tolist()def average_filter(datas, length=3):"""average filter, length should not greater than 5:param datas::param length::return:"""if isinstance(datas, np.ndarray):datas = datas.tolist()updated = []if length == 2:for d1, d2 in zip(datas[:-1], datas[1:]):updated.append(np.average([d1, d2]))elif length == 3:for d1, d2, d3 in zip(datas[:-2], datas[1:-1], datas[2:]):updated.append(np.average([d1, d2, d3]))elif length == 4:for d1, d2, d3, d4 in zip(datas[:-3], datas[1:-2], datas[2:-1], datas[3:]):updated.append(np.average([d1, d2, d3, d4]))else:for d1, d2, d3, d4, d5 in zip(datas[:-4], datas[1:-3], datas[2:-2], datas[3:-1], datas[4:]):updated.append(np.average([d1, d2, d3, d4, d5]))return updated# noinspection PyTupleAssignmentBalance def butter_filter(datas, hc=0.1):b, a = signal.butter(5, hc, btype="low")return signal.filtfilt(b, a, datas)5.數據可視化
??數據可視化也是預處理中很重要的一個手段,可以用于分析數據的各項屬性。
- 折線圖:用于分析數據的變化趨勢
- 箱型圖:用于分析數據異常值
- 正態分布圖:用于分析數據是否符合正態分布
- 散點圖:用于分析數據的分布情況(線性度,聚合度等)
- 熱力圖:用于分析多組數據間的相關系數(注意,一定是多組數據)
- 柱狀圖:用于分析數據的相對大小/占比
- 餅狀圖:用于分析數據的占比
模型結果衡量
??當有多個模型的時候,我們需要有一個指標衡量模型建表現的好壞,針對時間序列(連續),可以選取均方誤差(mse)和均方根誤差(rmse)。
def rmse(predictions, targets):"""root-mean-square error:param predictions::param targets::return:"""predictions = np.array(predictions)targets = np.array(targets)return np.sqrt(((predictions - targets) ** 2).mean())def mse(predictions, targets):"""mean-square error:param predictions::param targets::return:"""predictions = np.array(predictions)targets = np.array(targets)return ((predictions - targets) ** 2).mean()總結
以上是生活随笔為你收集整理的时间序列预测(一)—— 数据预处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Planning and Learnin
- 下一篇: 计算机网络孙家启,孙家华