一, 选题背景与需求
数据集来源: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)
| 直出结果 | 四舍五入处理 | 真实标记 | 是否正确预测 |
| 2 | 2G | 是 | |
| 5 | 5G | 是 | |
| 4 | 4G | 是 | |
| 5 | 5G | 是 | |
| 2.99 | 3 | 3G | 是 |
| 4.38 | 4 | 4G | 是 |
| 4.05 | 4 | 4G | 是 |
| 4 | 4G | 是 | |
| 2 | 2G | 是 | |
| 3.95 | 4 | 4G | 是 |
| 4.04 | 4 | 4G | 是 |
| 2.95 | 3 | 3G | 是 |
| 3.36 | 3 | 3G | 是 |
| 4 | 4G | 是 | |
| 5 | 5G | 是 | |
| 4.07 | 4 | 4G | 是 |
| 2.84 | 3 | 3G | 是 |
| 5 | 5G | 是 | |
| 4 | 4G | 是 | |
| 2.73 | 3 | 3G | 是 |
| 2.83 | 3 | 3G | 是 |
| 4.12 | 4 | 4G | 是 |
| 2 | 2G | 是 | |
| 2.55 | 3 | 3G | 是 |
| 5 | 5G | 是 |
从表中不难看出,预测准确率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]
这与处理过的数据集得到的结果几乎一致,从而证明了随机森林对数据特征工程的要求很低,可以很好的处理数据噪声。
16万+

被折叠的 条评论
为什么被折叠?



