对流媒体传输关键指标作简单预测

本文使用LSTM对流媒体的6个关键指标进行预测

现收集有流媒体传输过程中的6个指标,这些指标分别是:

  • PDCCH信道CCE可用个数 AvaPdcch
  • PDCCH信道CCE占用个数 OccPdcch
  • RRC连接最大数 ConRrc
  • 上行PRB平均利用率 UpPrb
  • 下行PRB平均利用率 DownPrb
  • 有效RRC连接最大数 EffConRrc

1.数据情况

每个指标的数据格式为:Data-Time-Value,本文首先对数据进行预处理,然后使用LSTM对这6个指标作简单预测。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import pandas as pd
import numpy as np

filenames=['AvaPdcch','OccPdcch','ConRrc','UpPrb','DownPrb','EffConRrc'] #属性列表

#读取数据
dataset=[]
for filename in filenames:
df=pd.read_csv(filename+'.csv',delimiter=',')
partfea=np.array(df)[:,-1]
dataset.append(partfea)

dataset=np.array(dataset)
dataset=dataset.T

print(dataset.shape,dataset[1302])

输出:

(1378, 6) [nan nan 18.0 nan nan 8.0]

从这输出可以看出,数据量就是1378个,每个数据量是前文的6个指标。并且数据中包含缺失值,为了简单,这里使用均值进行填充,实际上还可以更加灵活处理缺失值,比如整行/列去掉,进行插值等。

2.数据预处理

  • 缺失值填充
1
2
3
4
5
6
from sklearn import preprocessing

impute = preprocessing.Imputer()
dataset = impute.fit_transform(dataset)

print(dataset.shape,dataset[1302])

输出:

(1378, 6) [ 7.31026325e+07 9.40476974e+06 1.80000000e+01 3.38872727e-02
1.92543953e-01 8.00000000e+00]

  • 数据归一化
1
2
3
4
5
6
from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)

print(dataset.shape,dataset[1302])

输出:

(1378, 6) [ 0.5072962 0.23767169 0.22222222 0.17733455 0.21859107 0.23809524]

3.样本划分及标签处理

后一个数据作为前一个数据的标签,模型最终是基于当前的数据预测下一状态数据。

1
2
3
4
5
6
7
8
9
10
11
12
train_size=int(0.8*len(dataset))
#训练集
train_X=dataset[0:train_size,:]
train_y=dataset[1:train_size+1,:]
#验证集
vali_X=dataset[train_size:,:]
vali_y=dataset[train_size+1:,:]

train_X=train_X.reshape(train_X.shape[0],1,train_X.shape[1])
vali_X=vali_X.reshape(vali_X.shape[0],1,vali_X.shape[1])

print(train_X.shape,train_y.shape,vali_X.shape,vali_y.shape)

输出:

(1102, 1, 6) (1102, 6) (276, 1, 6) (275, 6)

4.模型训练

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import keras
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.utils import plot_model
from IPython.display import SVG

from keras.utils.vis_utils import model_to_dot

#构建LSTM网络
model=Sequential()
model.add(LSTM(32,input_shape=(1,6)))
model.add(Dense(6))

#编译模型
model.compile(loss='mean_squared_error', optimizer='adam')

#打印模型
model.summary()

#保存模型
SVG(model_to_dot(model,show_shapes=True).create(prog='dot', format='svg'))

#训练LSTM网络
model.fit(train_X, train_y, epochs=10, batch_size=1, verbose=1)

5.模型评估

1
2
3
#预测数据
valipredict=model.predict(vali_X)
print(valipredict.shape,vali_y.shape)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#画图模型预测显示
finalypredict=[]
#归一化后的数据画图,有6列
plt.subplots(2,3,figsize=(18,6))
for ind in range(6):
#归一化数据转换为真实数据
valipredict_real=valipredict[:,ind]*(scaler.data_max_[ind]-scaler.data_min_[ind])+scaler.data_min_[ind]
vali_y_real=vali_y[:,ind]*(scaler.data_max_[ind]-scaler.data_min_[ind])+scaler.data_min_[ind]

#未来的6个真实值
finalypredict.append(valipredict_real[-1])

plt.subplot(2, 3,ind+1)
plt.title(filenames[ind])
plt.plot(valipredict_real,color='red',label='valipredict')
plt.plot(vali_y_real,color='green',label='vali_y')

plt.show()

模型在验证数据上的预测效果

由图可以看出,6个指标基本的趋势被正确预测,但是某个时刻的准确度不是很高,我认为原因有几个:

  1. 数据量太少,导致模型无法学习足够的特征
  2. 特征太简单,某个指标的预测仅仅依赖于包括自身在内的历史时刻的6个值,这明显不够,可以考虑加入更多特征。比如这几个值明显对”时间“敏感,不同的时间区间内,流媒体的传输需要不同,将时间考虑进去将使得模型学习到更加丰富的特征
  3. 模型太简单,在数据量少,特征不多的情况下,我只用了一层的LSTM。

6.预测未来下一个6个指标

将数据中的最后的6个指标输入已经训练好的模型,模型输出6个值,该6个值作为模型预测到的未来下一个6个指标值。

1
2
#前文已经存储,直接输出
print(finalypredict)

[93690488.0, 25693568.0, 40.356155, 0.088783175, 0.64066094, 17.614025]