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

本文目录:

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

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

1.数据情况

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

  1. import pandas as pd 
  2. import numpy as np 
  3.  
  4. filenames=['AvaPdcch','OccPdcch','ConRrc','UpPrb','DownPrb','EffConRrc'] #属性列表 
  5.  
  6. #读取数据 
  7. dataset=[] 
  8. for filename in filenames: 
  9. df=pd.read_csv(filename+'.csv',delimiter=',') 
  10. partfea=np.array(df)[:,-1] 
  11. dataset.append(partfea) 
  12.  
  13. dataset=np.array(dataset) 
  14. dataset=dataset.T 
  15.  
  16. print(dataset.shape,dataset[1302]) 

输出:

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

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

2.数据预处理

  • 缺失值填充
  1. from sklearn import preprocessing 
  2.  
  3. impute = preprocessing.Imputer() 
  4. dataset = impute.fit_transform(dataset) 
  5.  
  6. 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. from sklearn.preprocessing import MinMaxScaler 
  2.  
  3. scaler = MinMaxScaler(feature_range=(0, 1)) 
  4. dataset = scaler.fit_transform(dataset) 
  5.  
  6. print(dataset.shape,dataset[1302]) 

输出:

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

3.样本划分及标签处理

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

  1. train_size=int(0.8*len(dataset)) 
  2. #训练集 
  3. train_X=dataset[0:train_size,:] 
  4. train_y=dataset[1:train_size+1,:] 
  5. #验证集 
  6. vali_X=dataset[train_size:,:] 
  7. vali_y=dataset[train_size+1:,:] 
  8.  
  9. train_X=train_X.reshape(train_X.shape[0],1,train_X.shape[1]) 
  10. vali_X=vali_X.reshape(vali_X.shape[0],1,vali_X.shape[1]) 
  11.  
  12. 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. import keras 
  2. from keras.models import Sequential 
  3. from keras.layers import Dense 
  4. from keras.layers import LSTM 
  5. from keras.utils import plot_model 
  6. from IPython.display import SVG 
  7.  
  8. from keras.utils.vis_utils import model_to_dot 
  9.  
  10. #构建LSTM网络 
  11. model=Sequential() 
  12. model.add(LSTM(32,input_shape=(1,6))) 
  13. model.add(Dense(6)) 
  14.  
  15. #编译模型 
  16. model.compile(loss='mean_squared_error', optimizer='adam') 
  17.  
  18. #打印模型 
  19. model.summary() 
  20.  
  21. #保存模型 
  22. SVG(model_to_dot(model,show_shapes=True).create(prog='dot', format='svg')) 
  23.  
  24. #训练LSTM网络 
  25. model.fit(train_X, train_y, epochs=10, batch_size=1, verbose=1) 

5.模型评估

  1. #预测数据 
  2. valipredict=model.predict(vali_X) 
  3. print(valipredict.shape,vali_y.shape) 
  1. #画图模型预测显示 
  2. finalypredict=[] 
  3. #归一化后的数据画图,有6列 
  4. plt.subplots(2,3,figsize=(18,6))  
  5. for ind in range(6): 
  6. #归一化数据转换为真实数据 
  7. valipredict_real=valipredict[:,ind]*(scaler.data_max_[ind]-scaler.data_min_[ind])+scaler.data_min_[ind] 
  8. vali_y_real=vali_y[:,ind]*(scaler.data_max_[ind]-scaler.data_min_[ind])+scaler.data_min_[ind] 
  9.  
  10. #未来的6个真实值 
  11. finalypredict.append(valipredict_real[-1]) 
  12.  
  13. plt.subplot(2, 3,ind+1) 
  14. plt.title(filenames[ind])  
  15. plt.plot(valipredict_real,color='red',label='valipredict') 
  16. plt.plot(vali_y_real,color='green',label='vali_y') 
  17.  
  18. 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]

posted @ 2019-04-01 16:40  好奇不止,探索不息  阅读(384)  评论(0编辑  收藏  举报