随机森林模型的基础是决策树,随机森林与决策树都是分类器模型。
决策树的基本思路非常直白:对于给定的样本数据和它们对应的标签结果,想办法每次去对样本数据做一个划分(一般是二划分),来让划分出的各类结果间尽可能分明(如以最大化信息增益或最小化基尼指数作为划分标准),以此不断逐层构造出决策树。构建完成后,给入一个待预测输入时,将根据划分方法在树中各节点处进行判断,最终取得叶子节点处的输出结果(如下图)。决策树的典型算法是 ID3 和 CART。
然而决策树在给定方法及其超参数后只能对现有数据进行唯一的分类,如果输入特征和输出标签组成复杂,则会产生较深的树,时很容易过拟合,导致对新数据的预测结果不尽人意。因此便引入了随机森林的方法。
随机森林的改进方式是,对样本数据进行多种细微变化(比如做多次有放回的随机抽样)产生多个变化样本集,对每个变化样本集下分别产生一个决策树,从而构成决策树森林。当要对一个待预测输入进行求解时,给入森林中各棵决策树分别求得他们的输出,最终取各决策树具备最大共识的一个输出作为森林的输出。这是一种 Bagging 集成学习的具体方法。
检查原论文所提供的 PCAP 数据,可发现有许多上行和下行的「数据包」(文件只提取了各数据包的前 72 个字节):
此外,我们通过笔记本,用 Wi-Fi 接入宿舍的校园无线网络环境,通过 Google Chrome 浏览器访问视频网站哔哩哔哩,用 Wireshark 软件进行抓包如下,可以看到也是类似地通过 QUIC 和 HTTP(TCP 和 TLSv1.2)传递视频流信息。不过有时会自动切换为 IPv6 进行通信。
可以使用 Python 网络包解析库 scapy
(文档见参考 [1])的 util.rdpcap()
方法进行 PCAP 文件的读取。在本机,提取 100, 000 行数据包需要大约 18 秒。此后便可以通过 for packet in pcap
来遍历(或以下标方式提取)其中的数据包 packet
( scapy.packet.Packet
类)。每个数据包可提取其 UNIX 时间戳(或称 UNIX Epoch)为 packet.time
(单位为秒)。
scapy.layers.ininet.IP
表示网络模型中 IPv4 这一层级。通过 packet.haslayer(layers.inet.IP)
可判断数据包 packet
有无 IPv4 层,如果有则可以通过 packet[layers.inet.IP]
的方法提取之,下称 IPv4 层信息为 packet_ip
。
IPv4 报文头部格式如下(图片来源:维基百科 https://en.wikipedia.org/wiki/IPv4#IHL)。