# WLAN mesh **Repository Path**: sg-first/wlan-mesh ## Basic Information - **Project Name**: WLAN mesh - **Description**: WLAN组网吞吐量预测 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-09-21 - **Last Updated**: 2025-05-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README WLAN ======== ## 描述性统计 所有seq_time构成的条形图: ![](img/seq_time.jpg) 发现40是一个突变点,小于40和大于40的值差很多(断崖下降,过渡的样本很少) ppdu_dur-seq_time散点图: ![](img/ppdu_dur-seq_time.jpg) 如果剔除离群类的话,回归线应该是红色线,而右上角蓝色圆圈是最大的离群类。这说明在回归线置信区间内的样本是常规情况(总发送时间随单帧发送时间均匀增长),而右上角的那些是单帧卡顿严重导致发了一半就超时的。 右上角样本的y值也印证了上一张图的结果:seq_time大于和小于40的样本有不同的特征,小于40大部分都属于正常发送(没有哪一帧突然变慢),大于40就是在超时边缘了 ## 基于数据特征验证 把大于和小于40的分表,看看差异 ### 数值列 发现eirp、other_air_time、ppdu_dur有一定差异。具体看一下: **eirp**(三行分别是全量数据、大于40数据、小于40数据;两列分别是平均数和中位数) ``` eirp 18.8426517571885 19.0 eirp 14.502057613168724 14.0 eirp 21.577225130890053 23.0 ``` eirp(功率)的结果是符合直觉的,差异很明显,功率越高越快 **other_air_time** ``` other_air_time 2034.9190363615955 14.723212499999999 other_air_time 8.996367216049384 10.0691415 other_air_time 20.97633593832023 23.583153 0.0 ``` other_air_time有点怪,小于40的反而慢(有两个特别大的100万的,估计是测量问题,我给去掉了,但去掉之后还是慢,可以看看材料分析一下) **ppdu_dur** ``` ppdu_dur 0.0034480074456000025 0.003685729 ppdu_dur 0.0036534653950617297 0.0037538635000000002 ppdu_dur 0.0033173103730366467 0.0035910325 ``` ppdu_dur也符合直觉(之前散点图也画过了) 不过other_air_time和ppdu_dur在测试集是没给的,所以用处不大 ### RSSI 这个是核心数据。我们来看看它在两个表里是否有区别。首先(对两个表分别操作)把RSSI那个数组里的值拼到一起(他给的数据max sum mean都有,我们只拼mean,否则重复了)然后算数据特征: ``` 全量数据:mean -79.65338441119691 median -82.0 var 132.6670512174157 小于40:mean -77.59463833340006 median -79.0 var 123.52093996929955 大于40:mean -83.63827549947423 median -88.0 var 126.28759740020497 ``` 小于40的是信号强度更高,而且更稳定,也是符合直觉的 材料中提到是用max做**门限判决**的,所以再看下max的情况: ``` 全量数据 mean -78.3123719731275 median -80.0 var 122.79531243120867 小于40 mean -77.22588809445864 median -78.0 var 119.1926523274968 大于40 mean -80.41156538516735 median -84.0 var 123.06896980085637 ``` 结论没啥区别 ## seq_time预测模型(Q1核心) ### 预处理 #### 分别建模or统一建模 题里说可按照**同频AP个数**分别建模,也可统一分析和建模,我们是分别建模,因为比如3AP的表每个AP是可以向两个AP from和to的(sta同理),这样特征数就比2AP多了,想统一建模的话只有两种选择: * 只用2AP特征(缺点:3AP多出来的特征都不能用了)(实验结果见下面的**统一建模测试**) * 给2AP的样本填充数据(缺点:这个填充数据很容易引入噪声) 所以我们主要选择分别建模。分别建模需要按2AP和3AP分别合表,合表得到training_merge_2ap.csv、training_merge_3ap.csv #### 数据转定长 由于数据里RSSI数组长度不确定,然后支持变长输入的模型不太稳定,所以我们给RSSI相关列转成定长的,然后先用定长模型试试 转换规则是,max和sum的列,是对数组里面元素取max和求和。其它都是求均值 这样把每个数组都转成了一个数(转换完的表是reduceRssi_2ap.csv、reduceRssi_3ap.csv) ### 模型 这个问题特征数比较多,有些特征可能是贡献度很低的(但是事先我们不知道是哪个),所以神经网络那种直接混合特征的模型不太适用。然后因为是数值回归问题,所以决策树不太适用。所以用集成学习方法,选择经典的:adaboost #### 特征选择 我们把之前分析的大于小于40两个表里有差异的特征(即eirp和所有RSSI相关的)先都扔进去 2AP结果: ``` data len 196 各个特征贡献度: ap_from_ap_0_mean_ant_rssi: 10.351477323539052 sta_from_ap_0_mean_ant_rssi: 5.433205760423983 sta_to_ap_0_mean_ant_rssi: 2.930671867418225 sta_to_ap_1_mean_ant_rssi: 2.497795466134169 sta_to_ap_0_max_ant_rssi: 2.2687109885811947 eirp: 2.0800144840258747 ap_from_ap_0_sum_ant_rssi: 1.6285454472672702 sta_to_ap_0_sum_ant_rssi: 1.5191359019272652 sta_from_ap_0_sum_ant_rssi: 1.1789184563486943 sta_from_ap_0_max_ant_rssi: 1.0908649707243547 ap_from_ap_0_max_ant_rssi: 0.9850407339916682 sta_to_ap_1_sum_ant_rssi: 0.9148221112295751 sta_to_ap_1_max_ant_rssi: 0.6919001922857717 sta_from_ap_1_mean_ant_rssi: 0.5729871307145354 sta_from_ap_1_sum_ant_rssi: 0.19836816466548954 sta_from_ap_1_max_ant_rssi: 0.13630325986696876 MSE: 5.090254518731437 ``` 可用数据有点少,后面要想办法搞一下 3AP结果: ``` data len 217 各个特征贡献度 sta_from_ap_1_mean_ant_rssi: 3.871883976361597 sta_from_ap_0_mean_ant_rssi: 2.318923531353353 sta_to_ap_1_mean_ant_rssi: 2.0874115633360155 sta_to_ap_0_mean_ant_rssi: 1.9883939162441218 ap_from_ap_1_mean_ant_rssi: 1.463322466846369 ap_from_ap_1_max_ant_rssi: 1.2168689953254084 sta_to_ap_0_max_ant_rssi: 1.2053287405792372 ap_from_ap_0_mean_ant_rssi: 1.1600145609005974 sta_from_ap_1_sum_ant_rssi: 1.1523041118456305 sta_from_ap_0_sum_ant_rssi: 0.8585702132317042 ap_from_ap_0_max_ant_rssi: 0.8363498642228856 ap_from_ap_0_sum_ant_rssi: 0.8333790871126476 sta_from_ap_1_max_ant_rssi: 0.5303726064101337 sta_to_ap_1_sum_ant_rssi: 0.4623661270343428 sta_to_ap_1_max_ant_rssi: 0.3976967212124652 eirp: 0.39742067129340086 sta_from_ap_0_max_ant_rssi: 0.28981222452085714 sta_to_ap_0_sum_ant_rssi: 0.24786917649251333 ap_from_ap_1_sum_ant_rssi: 0.14946877493254912 MSE: 63.82585135820499(不太稳定,总的来说大部分时候60多) ``` 发现max的贡献度偏低。尝试了去除max,但结果没有更好 #### 数据增强 观察数据可以发现,ap_from_ap_0和ap_from_ap_1是交替的,考虑2AP的情况,即,如果当前是AP0,它只有ap_from_ap_1;如果当前是AP1,它只有ap_from_ap_0。不过我们可以在建模时只考虑AP数量而不考虑是哪个AP(即:AP0和AP1用同一个模型预测,这样可以获得更多可用数据),想要实现这个的话,就需要把所有ap_from_ap_1的值合到ap_from_ap_0,替换原先的空数据(对于3AP,还要把ap_from_ap_2合到ap_from_ap_1),然后以ap_from_ap_0作为模型输入。这么操作后得到reduceRssi_2ap_enhancement.csv、reduceRssi_3ap_enhancement.csv **2AP结果**: ``` data len 392 各个特征贡献度: ap_from_ap_0_mean_ant_rssi: 9.367763273823375 sta_to_ap_0_sum_ant_rssi: 0.7278393889568222 sta_to_ap_1_mean_ant_rssi: 0.6148216840714305 sta_to_ap_1_sum_ant_rssi: 0.29692170558419423 sta_from_ap_0_mean_ant_rssi: 0.18154287868920704 ap_from_ap_0_sum_ant_rssi: 0.17322492437307424 sta_to_ap_0_mean_ant_rssi: 0.14184878888566035 sta_from_ap_0_sum_ant_rssi: 0.12378136287291698 sta_to_ap_1_max_ant_rssi: 0.11985848477752105 sta_from_ap_1_sum_ant_rssi: 0.06621287606862311 sta_from_ap_0_max_ant_rssi: 0.03724726044669748 sta_from_ap_1_mean_ant_rssi: 0.007647847455461817 sta_to_ap_0_max_ant_rssi: 0.0032584051897991823 eirp: 0.0 ap_from_ap_0_max_ant_rssi: 0.0 sta_from_ap_1_max_ant_rssi: 0.0 MSE: 26.341319910871437 ``` 可用数据是原来的二倍,但误差超过二倍(√26=5,√5=2.2),不太行 **3AP结果**: ``` data len 691 各个特征贡献度 ap_from_ap_1_mean_ant_rssi: 7.229030724002047 ap_from_ap_0_mean_ant_rssi: 1.7122932981169023 sta_to_ap_2_max_ant_rssi: 1.038001157458863 sta_from_ap_2_mean_ant_rssi: 0.9471611083458733 ap_from_ap_1_max_ant_rssi: 0.920970400101847 sta_to_ap_1_mean_ant_rssi: 0.9088477097159817 sta_to_ap_2_sum_ant_rssi: 0.6498085522978548 sta_from_ap_2_sum_ant_rssi: 0.5743474855393704 sta_to_ap_2_mean_ant_rssi: 0.5260779698517255 sta_to_ap_0_max_ant_rssi: 0.49698572812662484 sta_from_ap_0_mean_ant_rssi: 0.49507463420643777 sta_from_ap_0_sum_ant_rssi: 0.48774592181469634 sta_to_ap_0_mean_ant_rssi: 0.4235671926838529 sta_from_ap_2_max_ant_rssi: 0.41673173879559444 sta_to_ap_0_sum_ant_rssi: 0.38500875981774496 ap_from_ap_0_max_ant_rssi: 0.35666417856952737 ap_from_ap_1_sum_ant_rssi: 0.32450538061703893 sta_from_ap_0_max_ant_rssi: 0.3081865713294807 sta_from_ap_1_mean_ant_rssi: 0.3073638031903004 sta_from_ap_1_sum_ant_rssi: 0.21856994031314284 ap_from_ap_0_sum_ant_rssi: 0.19013453252461104 sta_to_ap_1_max_ant_rssi: 0.18031641782454672 sta_to_ap_1_sum_ant_rssi: 0.13352697444260406 eirp: 0.0567900019452844 sta_from_ap_1_max_ant_rssi: 0.0 MSE: 72.54353433221533 ``` 可用数据是原来的三倍多,误差只有多了一丢丢(√63=7.9,√72=8.4),这个非常可以 #### 统一建模测试 用全量数据(2AP特征)训练 ``` data len 1181 各个特征贡献度 ap_from_ap_0_mean_ant_rssi: 4.590655812604802 sta_from_ap_0_sum_ant_rssi: 2.3377668280334496 sta_from_ap_0_mean_ant_rssi: 2.1696566382373597 sta_from_ap_1_sum_ant_rssi: 1.382036354002165 sta_to_ap_1_mean_ant_rssi: 1.2672086549354165 sta_from_ap_0_max_ant_rssi: 1.2000953143745567 sta_to_ap_1_sum_ant_rssi: 0.689244671962876 ap_from_ap_0_sum_ant_rssi: 0.6628188876668047 sta_to_ap_0_sum_ant_rssi: 0.6437152218573661 sta_to_ap_0_mean_ant_rssi: 0.5333438130685808 sta_to_ap_1_max_ant_rssi: 0.5082569894871913 eirp: 0.3090946931364067 sta_from_ap_1_mean_ant_rssi: 0.28878841239201536 ap_from_ap_0_max_ant_rssi: 0.2460080248158186 sta_to_ap_0_max_ant_rssi: 0.20555789965096707 sta_from_ap_1_max_ant_rssi: 0.0 MSE: 88.86864761732356 ``` 可用数据是原来的二倍,误差(√72=8.4,√88=9.3) #### 注意 * 测试集:不是题里给的那个test set,因为那个没有groundtruth,没法测准确率,我这个测试集是从训练集里9:1随机拆分出来的 * loss:题里要求预测吞吐量用CDF,这里我们预测seq_time,先用MSE * 贡献度算法:特征i的贡献度=Σ_\{每个基学习器\}(该基学习器权重*该基学习器中特征i的贡献度) #### 预测testSet 根据上面对测试集结果的比较,我们给3AP训练一个模型(数据增强的)来预测,2AP给AP0和AP1分别训练一个模型来预测(一共三个模型)。预测结果在test_set_1_2ap_ReduceRssi_pred.csv、test_set_1_3ap_ReduceRssi_pred.csv、test_set_2_2ap_ReduceRssi_pred.csv、test_set_2_3ap_ReduceRssi_pred.csv ## MCS、NSS分析(Q2) 这个大于小于40区别不大,所以用全量数据看 ### NSS NSS就三个值012,2占97.5%,1有26个,0有3个,这里有个坑,根据材料里的解释,NSS是不能为0的(否则没法收发数据),数据里的0可能是哪里搞错了,所以我们都视为1。但即使1有29个,还是非常不均衡。数据这么少,肯定得用异常检测方法,而且需要训练的方法都不太合适,因为数据太少了。所以直接KNN 然后还是那个问题:要不要对2AP和3AP分别建模(因为2AP的特征是3AP的子集,所以可以全都用2AP特征)?为了观察这两组特征对于区分nss=1的样本有没有差异,我们分别对它们做降维可视化: 1. 对全量数据做reduceRssi_enhancement(按前面说的,以数据增强模式把RSSI数组都转为数字),得到training_merge_ReduceRssi.csv 2. 把2AP特征和3AP特征(和Q1用的一样)用PCA降到三维 3. 可视化,结果为群里发的nss_2ap和nss_3ap两个视频 可以看出,nss=1的红色点都是藏在右边那一团大的里,3AP用更多特征也没明显改变红色点的空间位置,所以我们就先用2AP特征做KNN了 需要注意的是,这个可视化结果显示红蓝不可分,不代表对于KNN不可分,首先这是降维的结果,降维就会损失信息,其次是用PCA线性降维的结果,损失的更多,所以这三维空间的距离和高维空间的距离是不一样的,我们只是用这个简单地说明一下情况 #### KNN结果 超参数n_neighbors=2,回测结果`acc=98.13%`,`{nss=1}的recall=100%`(这表示给一些2的分成1了,不过问题不大,这种特别不均衡的主要看recall(TPR)而不是FPR)。但用题里给的testset2的预测结果是…………全是2。这也没啥办法,1的数据就29个,题里也说了不能反应全貌,所以没见过的数据里有分不出来的也正常 ### MCS MCS大部分都是11(占48.2%),去掉11之后这样: ![](img/mcs.PNG) 去掉11之后是可以回归的,但加上11不行(类别不均衡)。所以要先分类(是否是11),对不是11的再回归。是和不是11的正好一半一半,适合做分类 #### 分类 直接用决策树了,按9:1拆分测试集,深度经过测试=8最好,acc=91.56%。决策树结构如下: ![](img/mcsTree.png) #### 回归 对小于11的回归。模型还用adaboost,结果如下: ``` 各个特征贡献度 sta_to_ap_1_mean_ant_rssi: 2.8559192049350313 sta_to_ap_0_sum_ant_rssi: 1.2611350513254043 ap_from_ap_0_mean_ant_rssi: 1.1539565456781022 eirp: 0.916287305682866 ap_from_ap_0_sum_ant_rssi: 0.7955165800039385 sta_from_ap_0_sum_ant_rssi: 0.6230450755889766 sta_to_ap_0_mean_ant_rssi: 0.6143356222424321 sta_to_ap_0_max_ant_rssi: 0.4958040375369915 sta_from_ap_1_sum_ant_rssi: 0.2938511513258753 sta_from_ap_1_mean_ant_rssi: 0.29328764569456756 sta_from_ap_0_max_ant_rssi: 0.1815167645952399 sta_from_ap_0_mean_ant_rssi: 0.15901268609227012 ap_from_ap_0_max_ant_rssi: 0.1416813868447161 sta_to_ap_1_sum_ant_rssi: 0.0427228540829048 sta_to_ap_1_max_ant_rssi: 0.03200118181974436 sta_from_ap_1_max_ant_rssi: 0.01716022978091384 MSE: 1.5403826191174277 ``` #### 预测testSet 如上所示,先用分类模型看是否是11,如果不是,调用分类模型预测。结果在test_set_2_2ap_ReduceRssi_pred.csv、test_set_2_3ap_ReduceRssi_pred.csv(set1是给mcs nss的,不需要预测)。我简单看了一下,11分别占40%和50%,符合原数据分布 ## 预测throughput(Q3) 还是用adaboost预测的。为了获得最优结果,分几种情况讨论,找最好的模型 ### 分别建模 用2AP数据训练模型预测2AP测试集、3AP数据(用全部的3AP特征)训练模型预测3AP测试集 #### 2AP **所有特征都用**: ``` data len 392 各个特征贡献度 seq_time: 16.440970335463394 mcs: 16.381993984924254 sta_to_ap_0_sum_ant_rssi: 7.637146001245413 sta_to_ap_1_sum_ant_rssi: 3.124504515873806 sta_to_ap_1_mean_ant_rssi: 1.1742611393964055 sta_to_ap_0_mean_ant_rssi: 1.047443886152139 sta_from_ap_0_sum_ant_rssi: 0.7848217698677973 ap_from_ap_0_sum_ant_rssi: 0.6889515395364977 nss: 0.5667649138903433 sta_to_ap_1_max_ant_rssi: 0.5022603536210865 sta_from_ap_1_sum_ant_rssi: 0.402137655433279 sta_to_ap_0_max_ant_rssi: 0.2891755527779337 sta_from_ap_0_max_ant_rssi: 0.27103354322606893 ap_from_ap_0_max_ant_rssi: 0.26469431429296975 sta_from_ap_0_mean_ant_rssi: 0.1708325989440559 sta_from_ap_1_max_ant_rssi: 0.14231275545235766 eirp: 0.12427256477750395 ap_from_ap_0_mean_ant_rssi: 0.07229137717240279 sta_from_ap_1_mean_ant_rssi: 0.05036578954985296 MSE: 176.429735426679 ``` 说明数值列很重要,必须要的 **只用数值列**: ``` data len 392 各个特征贡献度 seq_time: 11.232454084401741 mcs: 9.698272006882023 nss: 0.4883123360441786 eirp: 0.22727470194223245 MSE: 293.28017770427397 ``` 结果不行,说明RSSI数据还是有用的 #### 3AP **所有特征都用**: ``` data len 691 各个特征贡献度 seq_time: 31.294541168427017 mcs: 17.012117066963448 sta_to_ap_1_mean_ant_rssi: 1.8750961944499343 sta_to_ap_2_mean_ant_rssi: 1.733469355790636 sta_to_ap_1_sum_ant_rssi: 1.6450149058763663 sta_to_ap_0_mean_ant_rssi: 1.0449953304643302 sta_to_ap_1_max_ant_rssi: 0.7111942632634355 sta_from_ap_0_mean_ant_rssi: 0.6011912489984554 ap_from_ap_1_sum_ant_rssi: 0.5297056378705112 ap_from_ap_0_max_ant_rssi: 0.29511273905302293 sta_to_ap_2_sum_ant_rssi: 0.18347896674865344 ap_from_ap_0_sum_ant_rssi: 0.13125274616076196 sta_from_ap_2_sum_ant_rssi: 0.10843766305722313 ap_from_ap_1_max_ant_rssi: 0.10396573944854118 sta_from_ap_0_max_ant_rssi: 0.09593817840579405 sta_from_ap_1_max_ant_rssi: 0.09435034139494154 sta_to_ap_0_sum_ant_rssi: 0.05324663778709386 eirp: 0.048152756710088465 sta_from_ap_1_mean_ant_rssi: 0.033437129716102076 ap_from_ap_0_mean_ant_rssi: 0.017875644836466812 sta_from_ap_0_sum_ant_rssi: 0.0072057711421963004 nss: 0.0 ap_from_ap_1_mean_ant_rssi: 0.0 sta_from_ap_1_sum_ant_rssi: 0.0 sta_from_ap_2_max_ant_rssi: 0.0 sta_from_ap_2_mean_ant_rssi: 0.0 sta_to_ap_0_max_ant_rssi: 0.0 sta_to_ap_2_max_ant_rssi: 0.0 MSE: 144.88281852325778 ``` 数据更多,loss还比2AP小,这个是非常好的 ### 统一建模 用全量数据(2AP特征)训练 ``` data len 1181 各个特征贡献度 seq_time: 25.93701105204042 mcs: 16.543487158465652 sta_to_ap_0_mean_ant_rssi: 1.667523352371854 sta_to_ap_1_mean_ant_rssi: 1.5162464822405841 sta_to_ap_1_sum_ant_rssi: 1.449885932692473 sta_from_ap_0_sum_ant_rssi: 0.797106218761156 sta_to_ap_0_sum_ant_rssi: 0.7510431738112704 sta_to_ap_1_max_ant_rssi: 0.6177475875273974 sta_from_ap_0_mean_ant_rssi: 0.4991473994000962 ap_from_ap_0_sum_ant_rssi: 0.327965415664875 sta_from_ap_1_mean_ant_rssi: 0.14853712165910876 nss: 0.12028476395606544 ap_from_ap_0_mean_ant_rssi: 0.030361549735406963 sta_to_ap_0_max_ant_rssi: 0.008498042470190766 sta_from_ap_1_sum_ant_rssi: 0.006862716996142667 eirp: 0.0 ap_from_ap_0_max_ant_rssi: 0.0 sta_from_ap_0_max_ant_rssi: 0.0 sta_from_ap_1_max_ant_rssi: 0.0 MSE: 185.96450943589167 ``` 首先需要注意,上面3AP在数据量扩大的情况下已经可以做到loss比2AP更小。因此统一建模的loss值起码对于上面的3AP模型来说是更差的。对于2AP ### 结论 使用全部特征分别建模。结果已经更新在test_set_1_2ap_ReduceRssi_pred.csv、test_set_1_3ap_ReduceRssi_pred.csv、test_set_2_2ap_ReduceRssi_pred.csv、test_set_2_3ap_ReduceRssi_pred.csv ## 预测值分布分析 我们预测的核心字段是seq_time和throughput,现在来看一下预测结果的分布是否与训练集中这两个字段的分布相符 单独给这些数据拉了一个表`预测结果与训练集对应字段分布对比.xlsx`。先直接画图(上面四个),发现预测值的数据范围比训练集小(因为testSet本来样本数就少很多,可能缺边缘case),所以把训练集数据按预测值数据的范围截断,得到后面cut两列,然后画出下面两个图 定量检验一下。我们要分别检验(seq_time cut, predict seq_time)和(throughput cut, predict throughput)是否来自同一个分布。因为没有假设分布,所以使用非参数检验。选个经典的:Mann-Whitney U检验 结果: ``` (seq_time cut, predict seq_time): (statistic=232681.5, pvalue=2.7536261843304764e-16) (throughput cut, predict throughput): (statistic=158364.0, pvalue=0.23429902464145935) ``` seq_time p值接近0,肯定是同一分布。throughput p值0.23(23%的概率来自同一分布),没到显著性水平,不过题里不能保证testSet输入特征的分布一定与训练集(同特征)的总体分布相等,它们之间可能是有点偏差的,所以23%也算能接受 ## 模型架构总结备忘 我们针对模型训练的数据预处理分三个维度: 1. 是否数据增强(如果不数据增强,AP0、AP1(、AP2)要训练不同的模型) 2. 是否2AP 3AP数据合表(合表之后只能用2AP特征,分表的话3AP数据可以用3AP特征) 3. 具体训练时选择哪些特征 * 对于3,文中进行了两次去除特征的尝试,效果都不好,因此本文所有模型都使用(能用的)全部特征 * 对于2,文中进行了两次统一建模(2AP特征)的尝试,