基於加權移動平均的數據擴充辦法(Python)

問題背景

在做分析建模時,經常會遇到樣本稀少的情況,例如上市企業的財報數據,每個季度發佈一次,如果一家企業到目前爲止上市了三年,那它的實際樣本數量也就12條,使用這種如此小數量級的樣本量來進行建模會導致模型存在穩定性差、過擬合、泛化能力差等風險。所以有必要對樣本進行擴充。

對樣本進行擴充的方法比較多,譬如根據樣本的實際分佈使用相關模型進行數據模擬,或者使用Bootstrapping方法對樣本進行有放回採樣,又或者借鑑缺失值處理的方法對樣本進行擴充,等等。在使用深度學習對圖片數據集進行訓練的時候,爲了增加訓練數據,常常會對圖片做左右翻轉、剪切、縮放、翻轉等相關操作以擴充樣本。

然而上述這些方法並不是任何場景都適用,還是以上市企業的財報預測爲例。假設所預測的目標變量是上市企業的淨營收,目標企業的上市時間爲3年,那總共也就12個樣本,且樣本是隨時間變化的序列,時間粒度爲季度。此時使用上述方法進行樣本擴充會存在很多的問題,譬如使用相關模型進行數據模擬,會讓本來數量太少而不具代表性的樣本加入更多的不確定因素,導致預測的失真;企業的淨營收數據是一個時間序列,使用Bootstrapping進行有放回採樣也不合理;想借助深度學習的例子進行樣本擴充更是無從下手。

解決方法
或許可以換一種思路來進行樣本擴充。原先樣本的時間粒度爲季度,是否可以將時間粒度縮小爲天或者其他比季度小的時間粒度來進行樣本擴充,同時保持數據不失真呢?答案是肯定的。

可以借鑑時間序列預測中的加權移動平均法的思想來對樣本進行擴充。
在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述


import pandas as pd
import datetime
import matplotlib.pyplot as plt

df_data = pd.read_excel('data.xlsx')
print(df_data)
vList = df_data['num'].to_list()
dateList = df_data['date'].to_list()

plt.figure()
plt.title('original data')
plt.plot(dateList, vList)
plt.show()

#  # dateList:季度列表。將季度表示爲日期形式,取季度的最後一天表示該季度,如2015年第四季度表示爲20151231。列表中的日期從小到大排序
#  # vList:淨營收列表。對應季度列表排序。
after_date = []
after_num = []
for i in range(len(dateList)):
    if i < len(dateList) - 1:
        startDate = dateList[i]
        lastDate = dateList[i + 1]
        nDays = (lastDate - startDate).days
        print(nDays)

        for j in range(nDays):
            currentDate = startDate + datetime.timedelta(days=j)
            currentDayStr = currentDate.strftime('%Y%m%d')
            currentValue = ((nDays - j) / nDays) * vList[i] / nDays + (j / nDays) * vList[i + 1] / nDays
            print(currentDayStr + '\t' + str(round(currentValue, 6)))
            after_date.append(currentDayStr)
            after_num.append(round(currentValue, 6))

plt.figure()
plt.title('add data')
plt.plot(after_date, after_num)
plt.show()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章