机器学习实战-决策树分类算法
鉴于目前Python最流行的机器学习库Scikit集成了很多成型的算法,本博客就使用其中的决策树对Kdd99数据集进行分类处理,完整代码位于Github(https://github.com/PENGZhaoqing/kdd99-scikit)
Kdd99数据集
KDD Cup是由SIGKDD赞助的数据挖掘分析的比赛,每年举行一次,Kdd99是1999年比赛的关于入侵检测的数据集,不过现在学术界已经抛弃了这个数据集,若要测试自己算法的有效性还是使用其他数据集吧,我们只为初窥两种分类算法
任务目的是检测网络连接,区分正常和非正常的连接。非正常的连接大概有四大类: DOS、R2L、 U2R和probing,每一类下还有若干小类别
- 值得注意的是,训练集和测试集中的数据概率分布不同,测试集比训练集多出了14种攻击小类别,官方给的解释是:这能够很好的模拟真实情况,而且新的攻击类别一般为已知攻击类别的变形。因此算法模型需要能很好的抓住每种攻击类别的feature,数据集都能在官网上获得
1. 数据预处理
1.1 原始文件预处理
原始训练集和测试集的分类结果都是攻击的特定类,共有24+14=38种 ,而在这里,我们不考虑那么细的分类,只把所有的连接分到四个攻击的大类即可,因此我们根据官网提供的映射关系,将type属性降为5类,用数字0,1,2,3,4替换,分别代表四种攻击的大类和正常情况
- 执行以下代码能将位于raw目录下的测试集和训练集预处理到data目录下
from io import open
category = {}
category["back."] = 2
category["buffer_overflow."] = 3
category["ftp_write."] = 4
category["guess_passwd."] = 4
category["imap."] = 4
category["ipsweep."] = 1
category["land."] = 2
category["loadmodule."] = 3
category["multihop."] = 4
category["neptune."] = 2
category["nmap."] = 1
category["perl."] = 3
category["phf."] = 4
category["pod."] = 2
category["portsweep."] = 1
category["rootkit."] = 3
category["satan."] = 1
category["smurf."] = 2
category["spy."] = 4
category["teardrop."] = 2
category["warezclient."] = 4
category["warezmaster."] = 4
category["apache2."] = 2
category["back."] = 2
category["buffer_overflow."] = 3
category["ftp_write."] = 4
category["guess_passwd."] = 4
category["httptunnel."] = 4
category["httptunnel."] = 3
category["imap."] = 4
category["ipsweep."] = 1
category["land."] = 2
category["loadmodule."] = 3
category["mailbomb."] = 2
category["mscan."] = 1
category["multihop."] = 4
category["named."] = 4
category["neptune."] = 2
category["nmap."] = 1
category["perl."] = 3
category["phf."] = 4
category["pod."] = 2
category["portsweep."] = 1
category["processtable."] = 2
category["ps."] = 3
category["rootkit."] = 3
category["saint."] = 1
category["satan."] = 1
category["sendmail."] = 4
category["smurf."] = 2
category["snmpgetattack."] = 4
category["snmpguess."] = 4
category["sqlattack."] = 3
category["teardrop."] = 2
category["udpstorm."] = 2
category["warezmaster."] = 2
category["worm."] = 4
category["xlock."] = 4
category["xsnoop."] = 4
category["xterm."] = 3
category[