机器学习初步探索1--通过网络测量数据判断无线网络代数

一, 选题背景与需求

数据集来源:5g_coverage_dataset

此数据集提供10项特征,1个样本标记,共计10000个样本。尽管不确定是否为real world data,但从通信从业者的角度来看样本特征值,可以判断其是具有一定可用性的。另外本人在经历过一段时间对机器学习的学习后,也需要拿到一些数据集来锻炼自己的实践能力。

因此,这个规模不大,特征明确,符合自身知识领域范畴的数据集十分符合拿来做一次机器学习探索。

二, 数据分析

2.1 解读特征与标记

数据集大小为1.6MB,csv格式,10001行,读取文件对计算机无任何性能要求。

打开文件可以观察到10个特征项:

Signal_Strength_dBm接受信号强度,应当指的是rsrp
Frequency_Band_MHz载波频段,例如3500MHz,1800MHz等
Bandwidth_MHz载波带宽,从数据来看,并不是常规3GPP定义的带宽,甚至把guard band算进去也有点对不上,只能推断可能具体运营商配置有差异
Download_Speed_Mbps下行速率,核心特征
Upload_Speed_Mbps上行速率,核心特征
Latency_ms通信延迟
Location_Type位置类型,商业区,城郊,农村三种属性
Tower_Density发射塔密度,单位面积内发射塔的数量
User_Density用户密度,单位面积内用户数量
SNR_dB信噪比

以及一个标记:

Generation网络制式,2/3/4/5G,难以想象国外还有2G在网,甚至还会产生数据流量

 观察特征后可以得到一个结论,特征间存在非线性关系,并且其中一些还是强相关的。

强相关:

信号强度和上下行速率,信号强度与MCS和BLER有比较强的关联,而MCS和BLER又直接影响到上下行速率;

载波频段与上下行速率,4G和5G存在TDD与FDD两种复用模式,不同的复用模式也决定了上下行速率的限值,不同的频段决定了其所支持的复用模式;

一般相关:

位置类型,发射塔密度,用户密度与信噪比,商业区的密度一般是要高于农村的,而较高的密度有可能带来较高的背景噪声,例如站间互扰,大量电气设备的电磁干扰等。

2.2 预览特征值

位置类型与标记为字符串,其余为浮点数,判断为原始记录值。信号强度值为常规的负数,但在上下行速率,载波带宽以及延迟中均发现了异常的负数,可能是记录时网络异常所导致,当做数据噪声来看待。

导入pandas后,使用.info()函数查看数据

import pandas as pd


data_file = "../../Data/5g_coverage_dataset.csv"
data = pd.read_csv(data_file)
print(data.info())

RangeIndex: 10000 entries, 0 to 9999
Data columns (total 11 columns):
 #   Column               Non-Null Count  Dtype  
---  ------               --------------  -----  
 0   Signal_Strength_dBm  10000 non-null  float64
 1   Frequency_Band_MHz   10000 non-null  float64
 2   Bandwidth_MHz        10000 non-null  float64
 3   Download_Speed_Mbps  10000 non-null  float64
 4   Upload_Speed_Mbps    10000 non-null  float64
 5   Latency_ms           10000 non-null  float64
 6   Location_Type        10000 non-null  object 
 7   Tower_Density        10000 non-null  float64
 8   User_Density         10000 non-null  float64
 9   SNR_dB               10000 non-null  float64
 10  Generation           10000 non-null  object 
dtypes: float64(9), object(2)
memory usage: 859.5+ KB

可以看到数据集很完整,没有留空数据。

2.3 数据预处理

由于特征值中不仅有数字,也有字符串型对象,所以先将对象数字化:

#  替换网络制式信息为2,3,4,5
data["Generation"] = data["Generation"].map({"2G": 2, "3G": 3, "4G": 4, "5G": 5})
# 替换位置信息为0,1,2
data["Location_Type"] = data["Location_Type"].map({"Urban": 0, "Suburban": 1, "Rural": 2})

接下来再将其余浮点数通过minmax进行规范化:

# 对其他列数据进行归一化处理
signal_scaler = MinMaxScaler(feature_range=(1, 10))
operation_columns = ["Signal_Strength_dBm", "Bandwidth_MHz", "Download_Speed_Mbps",
    "Upload_Speed_Mbps", "Latency_ms", "Tower_Density", "User_Density", "SNR_dB"]
data[operation_columns] = signal_scaler.fit_transform(data[operation_columns])
# 查看是否处理后存在列丢失的情况
print(data.columns)

这里选择数值范围为1-10,原因是通信工程领域数量级通常是差10db即相差10倍,通过之前的数据分析可以看到在信号强度,信噪比中明确存在这样的关系,而上下行速率在不同网络制式中也存在近似的倍率。载波频段未做处理,原因是其本身就已经是具有明确区别的离散值。

三,模型选择

根据前面的数据分析结果可知:

特征间具有非线性关系;

数据中存在噪声;

标记值是离散值。

因此模型应当选择从适合分类的任务中选择,下面是几种典型的分类模型及其特点:

分类模型优缺点概括
模型名称优点缺点
决策树

  • 直观易解释,可视化强。

  • 无需数据标准化,可处理混合类型数据(数值型、类别型)。

  • 对噪声数据鲁棒性较好。

  • 易过拟合,需剪枝或集成方法优化。

  • 对样本量需求大,小数据集效果差。

  • 忽略特征间相关性

随机森林

  • 高准确性,抗过拟合能力强。

  • 可自动处理高维数据,支持并行计算。

  • 提供特征重要性评估。

  • 计算资源消耗大,训练时间长。

  • 模型复杂度高,解释性差。

  • 对不平衡数据敏感。

支持向量机(SVM)

  • 适合小样本、高维数据,泛化能力强。

  • 可通过核函数处理非线性问题(如RBF核)。

  • 对噪声有一定鲁棒性。

  • 参数调优复杂(如核函数选择、正则化参数C)。

  • 大规模数据训练效率低。

  • 多分类需额外策略(如OVR)。

朴素贝叶斯

  • 计算速度快,适合高维稀疏数据(如文本分类)。

  • 对缺失数据不敏感,小数据集表现稳定。

  • 特征独立性假设不成立时效果差。

  • 对类别不平衡数据敏感(需平滑处理)。

K近邻(KNN)

  • 无需训练,算法简单直观。

  • 适应非线性数据,支持多分类。

  • 计算复杂度高,内存消耗大。

  • 对异常值和噪声敏感。

  • 需特征标准化,否则距离计算不准确。

逻辑回归

  • 计算高效,适合大规模数据。

  • 输出概率解释性强,可动态调整分类阈值。

  • 仅适合线性可分数据,需特征工程处理非线性关系。

  • 对多重共线性敏感。

神经网络

  • 自动学习复杂非线性模式,适合图像、语音等高维数据。

  • 支持端到端训练,特征工程依赖少。

  • 需大量数据和计算资源,训练时间长。

  • 模型解释性差,调参复杂(如学习率、网络层数)。

从表格中可以发现随机森林较为适合本次任务,其自助法(bagging取样)+多颗决策树集成学习法可以很好抗噪声,无需预处理数据,能够很好的抗过拟合。

从sklearn导入随机森林模型,并划分测试集与训练集,执行训练与测试,并打印模型分数。

import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import cross_val_score


data_file = "../../Data/5g_coverage_dataset.csv"
data = pd.read_csv(data_file)
# print(data["Bandwidth_MHz"].describe(include='all'))
# print(data.head())
# 替换网络制式信息为2,3,4,5
data["Generation"] = data["Generation"].map({"2G": 2, "3G": 3, "4G": 4, "5G": 5})
# 替换位置信息为0,1,2
data["Location_Type"] = data["Location_Type"].map({"Urban": 0, "Suburban": 1, "Rural": 2})
# 对其他列数据进行归一化处理
signal_scaler = MinMaxScaler(feature_range=(1, 10))
operation_columns = ["Signal_Strength_dBm", "Bandwidth_MHz", "Download_Speed_Mbps",
    "Upload_Speed_Mbps", "Latency_ms", "Tower_Density", "User_Density", "SNR_dB"]
data[operation_columns] = signal_scaler.fit_transform(data[operation_columns])
# 查看是否处理后存在列丢失的情况
print(data.columns)
# 定义特征列和标记列
y = data["Generation"]
X = data.drop(["Generation"], axis=1)
# 划分测试集和训练集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建并训练随机森林模型
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
# 使用随机森林模型进行预测
y_pred_rf = rf_model.predict(X_test)
# 评估随机森林模型
mse_rf = mean_squared_error(y_test, y_pred_rf)
r2_rf = r2_score(y_test, y_pred_rf)
print("随机森林模型结果:")
print(f"均方误差 (MSE): {mse_rf}")
print(f"R² 分数: {r2_rf}")
print(f"模型特征重要性: {rf_model.feature_importances_}\n")

运行代码后得到结果:

均方误差 (MSE): 0.0033836499999999993
R² 分数: 0.9973403494375169
模型特征重要性: [1.92183371e-04 3.35784337e-03 1.39215467e-02 8.65348535e-01
 2.55459191e-02 8.96471040e-02 2.04487578e-05 1.39257508e-03
 2.93226760e-05 5.44521813e-04]

结果令人感到意外,MSE=0.00338,还不到0.01,R²=0.9973,近乎完美拟合。通过特征权重(特征重要性)来看,这个模型将Download_Speed_Mbps与Latency_ms作为最重要的指标,这也符合常理,毕竟每一代无线通信网络都是提升速率降低延迟。

四,验证与测试

首先能想到的是k折验证

scores = cross_val_score(rf_model, X, y, cv=5)  # 5-fold 交叉验证
print(f"Cross-validation scores: {scores}")
# 最终结果是这些评分的平均值,表示模型的性能。
print(f"Mean accuracy: {scores.mean()}")

运行后的结果:

[0.99724477 0.99718283 0.9944684  0.99684152 0.99745307]
Mean accuracy: 0.9966381169596865

由此也可判断模型的过拟合可能性极低。

通过实际数据进行验证,从原数据集中切下一块(25样本)作为预测集,余下数据作为训练集和测试集,预测集同样经过minmax处理。重新训练模型后对预测集进行预测,得到下表中的结果

# 预测新数据
predictions = rf_model.predict(validate_data)
print("预测结果:", predictions)
预测结果对照表
直出结果四舍五入处理真实标记是否正确预测
22G
55G
44G
55G
2.9933G
4.3844G
4.0544G
44G
22G
3.9544G
4.0444G
2.9533G
3.3633G
44G
55G
4.0744G
2.8433G
55G
44G
2.7333G
2.8333G
4.1244G
22G
2.5533G
55G

从表中不难看出,预测准确率100%,甚至直出直接命中也占到了48%(12/25)。由此可见采用随机森林处理此问题是十分成功的。

五,总结

这个数据集非常的基础,但很意外的是使用随机森林竟然得到了非常理想的结果,这说明随机森林非常适合处理这种数据规模不大,特征间存在关联,且特征值差异较大的多分类问题。

为了验证随机森林是否能够很好的处理数据中的噪声,使用原始数据集进行了训练,并且得到了如下结果:

R² 分数: 0.9973403494375169
模型特征重要性: [1.92183371e-04 3.35784337e-03 1.39215467e-02 8.65348535e-01
 2.55459191e-02 8.96471040e-02 2.04487578e-05 1.39257508e-03
 2.93226760e-05 5.44521813e-04]

这与处理过的数据集得到的结果几乎一致,从而证明了随机森林对数据特征工程的要求很低,可以很好的处理数据噪声。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值