Я не считаю другие ответы удовлетворительными.Главным образом потому, что вы должны учитывать как структуру временных рядов данных, так и информацию о поперечном сечении.Вы не можете просто рассматривать функции в каждом случае как одну серию.Это неизбежно приведет к потере информации и, просто говоря, статистически неверно.
При этом если вам действительно нужно перейти на PCA, вы должны по крайней мере сохранить информацию о временных рядах:
PCA
После silgon мы преобразуем данные в массив Numpy:
# your 1000 pandas instances
instances = [pd.DataFrame(data=np.random.normal(0, 1, (300, 20))) for _ in range(1000)]
# transformation to be able to process more easily the data as a numpy array
data=np.array([d.values for d in instances])
Это упрощает применение PCA:
reshaped_data = data.reshape((1000*300, 20)) # create one big data panel with 20 series and 300.000 datapoints
n_comp=10 #choose the number of features to have after dimensionality reduction
pca = PCA(n_components=n_comp) #create the pca object
pca.fit(pre_data) #fit it to your transformed data
transformed_data=np.empty([1000,300,n_comp])
for i in range(len(data)):
transformed_data[i]=pca.transform(data[i]) #iteratively apply the transformation to each instance of the original dataset
Конечная форма вывода: transformed_data.shape: Out[]: (1000,300,n_comp)
.
PLS
Однако вы можете (и должны, на мой взгляд) строить факторы из вашей матрицы характеристикиспользуя частичные наименьшие квадраты PLS .Это также обеспечит дальнейшее уменьшение размерности.
Допустим, ваши данные имеют следующую форму.T=1000, N=300, P=20
.
Тогда мы имеем y = [T, 1], X = [N, P, T].
Сейчасдовольно легко понять, что для этого нам нужно, чтобы наши матрицы были совместимыми для умножения .В нашем случае у нас будет: y = [T, 1] = [1000,1], X pca = [T, P * N] =[1000,20 * 300]
Интуитивно понятно, что мы создаем новую функцию для каждой задержки ( 299 = N-1 ) каждого из P =20 базовых функций.
Т.е. для данного экземпляра i , у нас будет что-то вроде этого:
Экземпляр i : x 1, i , x 1, i-1 , ..., x 1, ij , x 2, i, x 2, i-1 , ..., x 2, ij , ..., x P, i , x P, i-1 , ..., x P, ij с j = 1, ..., N-1 :
Сейчасреализация PLS в python довольно проста.
# your 1000 pandas instances
instances = [pd.DataFrame(data=np.random.normal(0, 1, (300, 20))) for _ in range(1000)]
# transformation to be able to process more easily the data as a numpy array
data=np.array([d.values for d in instances])
# reshape your data:
reshaped_data = data.reshape((1000, 20*300))
from sklearn.cross_decomposition import PLSRegression
n_comp=10
pls_obj=PLSRegression(n_components=n_comp)
factorsPLS=pls_obj.fit_transform(reshaped_data,y)[0]
factorsPLS.shape
Out[]: (1000, n_comp)
Что делает PLS?
Чтобы упростить понимание, рассмотрим трехходовой регрессионный фильтр (рабочий документ здесь ) (3PRF).Келли и Пруитт показывают, что PLS - их особый случай. 3PRF:
(
)
Где Z представляет матрицу прокси.У нас их нет, но, к счастью, Келли и Пруитт показали, что мы можем жить без них.Все, что нам нужно сделать, это убедиться, что регрессоры (наши функции) стандартизированы и запускают первые две регрессии без перехвата.При этом прокси будут выбраны автоматически.
Итак, вкратце, PLS позволяет вам
- Добиться дальнейшего уменьшения размерности, чем PCA.
- учитывает какизменчивость поперечного сечения признаков и информации о временных рядах каждого ряда при создании факторов.