python解决数据预处理:将KDDCPU99数据格式转换成libsvm可读的格式

       最近在研究基于支持向量机的入侵检测,使用的是KDDCPU99的数据,但是KDDCPU99数据的格式是cvs格式的,我们用的支持向量机的插件用的是libsvm库,但是libsvm读数据的格式是 label index:属性 index:属性;label是分类的标记,后面是跟着的属性。线面本人用python语言写了这段数据转换代码与大家分享。

有啥问题请留言,可以相互交流的。



import string,csv

protocol_type = []
service = []
flag = []
attack_type = []
dos_type = ['back','land','neptune','pod','smurf','teardrop']
probe_type = ['ipsweep','nmap','portsweep','satan']
r2l_type = ['ftp_write','guess_passwd','imap','multihop','phf','spy','warezclient','warezmaster']
u2r_type = ['buffer_overflow','loadmodule','perl','rootkit']

def main():
        print "data dealing..."
        writer=csv.writer(open('/home/tool/svmdata/kddcup.data_10_percent1.csv','wb'),delimiter=" ")
        reader=csv.reader(open('/home/tool/svmdata/kddcup.data_10_percent.csv','rb'))
        for line in reader:
                #protocol
                if line[1] in protocol_type:
                        pass   #not do deal
                else:
                        protocol_type.append(line[1])
                protocol_index = protocol_type.index(line[1])+1
                line[1]=protocol_index
                #service
                if line[2] in service:
                        pass #not do deal
                else:
                        service.append(line[2])
                service_index = service.index(line[2])+1
                line[2] = service_index
                #flag
                if line[3] in flag:
                        pass #not do deal
                else:
                        flag.append(line[3])
                flag_index = flag.index(line[3])+1
                line[3] = flag_index
                #type
                line[41] = ''.join(line[41].split('.'))
                if line[41] == 'normal':
                        line[41] = 1
                elif line[41] in dos_type:
                        line[41] = 2
                elif line[41] in probe_type:
                        line[41] = 3
                elif line[41] in r2l_type:
                        line[41] = 4
                elif line[41] in u2r_type:
                        line[41] = 5

                temp = line[41]
                line.insert(0,temp)
                del line[42]
                for k in range(1,len(line)):
                        k2str = str(k) + ':'
                        line[k] = k2str + str(line[k])
                writer.writerow(line)

if __name__=="__main__":
        main()


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
首先,需要安装libsvm软件包。可以通过以下命令在终端中安装: ``` pip install -U libsvm ``` 接下来,导入所需的库和模块: ```python import pandas as pd from svmutil import * # 导入libsvmpython接口svmutil ``` 数据文件seeds.csv并将其转换libsvm支持的格式: ```python df = pd.read_csv('seeds.csv') y = df.pop('Type').values.tolist() # 提取标签列,并转换为列表 x = df.values.tolist() # 将特征列转换为列表 # 将数据转换libsvm支持的格式 prob = svm_problem(y, x) ``` 接下来,使用交叉验证法选择最优的SVM模型参数: ```python param = svm_parameter('-s 0 -t 2 -c 1 -g 0.1') # 设置SVM参数 acc = svm_train(prob, param) # 进行交叉验证 print('交叉验证准确率:{:.2f}%'.format(acc * 100)) ``` 最后,可以使用训练好的模型进行预测: ```python model = svm_train(prob, param) # 训练模型 y_pred, _, _ = svm_predict(y, x, model) # 进行预测 ``` 完整代码如下: ```python import pandas as pd from svmutil import * # 数据文件 df = pd.read_csv('seeds.csv') # 提取标签列,并转换为列表 y = df.pop('Type').values.tolist() # 将特征列转换为列表 x = df.values.tolist() # 将数据转换libsvm支持的格式 prob = svm_problem(y, x) # 使用交叉验证法选择最优的SVM模型参数 param = svm_parameter('-s 0 -t 2 -c 1 -g 0.1') acc = svm_train(prob, param) print('交叉验证准确率:{:.2f}%'.format(acc * 100)) # 训练模型并进行预测 model = svm_train(prob, param) y_pred, _, _ = svm_predict(y, x, model) print('预测结果:', y_pred) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值