本帖最后由 酥醉的飓风 于 2014-3-12 21:50 编辑
我已经建立好数据库,也已经把字符串update成数字,第42列属性显示normal的update成1,
其他的表示dos,probe,r2l,u2r的依次update成2,3,4,5;
随机取的时候,sql里用的newid()函数,sql语句如下:
select top 5100 * from [kddtest].[dbo].[kddcup.data] where [列 41]=1 order by newid();
select top 600 * from [kddtest].[dbo].[kddcup.data] where [列 41]=2 order by newid();
select top 800 * from [kddtest].[dbo].[kddcup.data] where [列 41]=3 order by newid();
select top 60 * from [kddtest].[dbo].[kddcup.data] where [列 41]=4 order by newid();
select top 120 * from [kddtest].[dbo].[kddcup.data] where [列 41]=5 order by newid();
我做的先是把normal分别和dos,probe,r2l,u2r的数据单独混合,然和其中一部分作为训练集,一部分作为测试集例如2500条normal数据和800条probe数据混合组成3300条总的数据,训练集2000(normal1500条,probe500条),测试集1300(normal1000,probe300条)
svm程序如下:
clear all;close all; clc;
%% probe
A=xlsread('C:\Users\HURRICANE\Desktop\kdd_all_data\kdd_all_data\kddprobe.csv');
B=xlsread('C:\Users\HURRICANE\Desktop\kdd_all_data\kdd_all_data\kddnormal.csv');
C=zeros(2000,42);
D=zeros(1300,42);
C(1:500,:)=A(1:500,:);
C(501:2000,:)=B(2001:3500,:);
D(1:300,:)=A(501:800,:);
D(301:1300,:)=B(3501:4500,:);
train_X=C(:,1:end-1);
train_label=C(:,end);
test_X=D(:,1:end-1);
test_label=D(:,end);
%% 归一化处理(一)
[train_x,PS]=mapminmax(train_X');
train_x=train_x';
test_x=mapminmax('apply',test_X',PS);
test_x=test_x';
model = svmtrain(train_label,train_x);
[predict_label,accurancy]=svmpredict(test_label,test_x,model);
检测率结果老是过高(也是98%多,这是没进行参数优化的),而且运行n次,结果都相同的。我从数据库用同样的方法重取过数据,不过结果依然不理想。我用过一个乳腺癌的数据,每次运行的结果都是不同的,在一个数值小范围波动,结果比较理想,间接证明程序应该没问题。我现在怀疑去数据取得有问题,小弟已经查过各种资料,真的没辙了。。。。
求各路大神帮忙看一看,提点意见