本文使用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 pdimport numpy as npfilenames=['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 preprocessingimpute = 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 MinMaxScalerscaler = 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 kerasfrom keras.models import Sequentialfrom keras.layers import Densefrom keras.layers import LSTMfrom keras.utils import plot_modelfrom IPython.display import SVGfrom keras.utils.vis_utils import model_to_dotmodel=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' )) 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=[] 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] 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个指标基本的趋势被正确预测,但是某个时刻的准确度不是很高,我认为原因有几个:
数据量太少,导致模型无法学习足够的特征 特征太简单,某个指标的预测仅仅依赖于包括自身在内的历史时刻的6个值,这明显不够,可以考虑加入更多特征。比如这几个值明显对”时间“敏感,不同的时间区间内,流媒体的传输需要不同,将时间考虑进去将使得模型学习到更加丰富的特征 模型太简单,在数据量少,特征不多的情况下,我只用了一层的LSTM。 6.预测未来下一个6个指标将数据中的最后的6个指标输入已经训练好的模型,模型输出6个值,该6个值作为模型预测到的未来下一个6个指标值。
[93690488.0, 25693568.0, 40.356155, 0.088783175, 0.64066094, 17.614025]