本文目录:
现收集有流媒体传输过程中的6个指标,这些指标分别是:
- PDCCH信道CCE可用个数 AvaPdcch
- PDCCH信道CCE占用个数 OccPdcch
- RRC连接最大数 ConRrc
- 上行PRB平均利用率 UpPrb
- 下行PRB平均利用率 DownPrb
- 有效RRC连接最大数 EffConRrc
1.数据情况
每个指标的数据格式为:Data-Time-Value
,本文首先对数据进行预处理,然后使用LSTM对这6个指标作简单预测。
- 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.数据预处理
- 缺失值填充
- 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]
- 数据归一化
- 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.样本划分及标签处理
后一个数据作为前一个数据的标签,模型最终是基于当前的数据预测下一状态数据。
- 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.模型训练
- 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.模型评估
- #预测数据
- valipredict=model.predict(vali_X)
- print(valipredict.shape,vali_y.shape)
- #画图模型预测显示
- 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个指标基本的趋势被正确预测,但是某个时刻的准确度不是很高,我认为原因有几个:
- 数据量太少,导致模型无法学习足够的特征
- 特征太简单,某个指标的预测仅仅依赖于包括自身在内的历史时刻的6个值,这明显不够,可以考虑加入更多特征。比如这几个值明显对”时间“敏感,不同的时间区间内,流媒体的传输需要不同,将时间考虑进去将使得模型学习到更加丰富的特征
- 模型太简单,在数据量少,特征不多的情况下,我只用了一层的LSTM。
6.预测未来下一个6个指标
将数据中的最后的6个指标输入已经训练好的模型,模型输出6个值,该6个值作为模型预测到的未来下一个6个指标值。
- #前文已经存储,直接输出
- print(finalypredict)
[93690488.0, 25693568.0, 40.356155, 0.088783175, 0.64066094, 17.614025]