bp神经网络只有一类样本怎么分类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bp神经网络只有一类样本怎么分类相关的知识,希望对你有一定的参考价值。
神经网络一列为一个样本,所以对于matlab 而言,要求输入和输出的列数必须一样的经常有人问起的问题:
Error using ==> network/train
Targets are incorrectly sized for network.
Matrix must have 1 rows.
解决:要求P T 的列数一样 ,如果不一样 P=p’ t=t’ 转置一下
2.
归一
澄清一个对归一的错误理解1
样本矩阵为9行4列。9组样本,4个变量。现在归一化:
x=[68.7 66.6 5610 19.2;
89.9 90.8 4500 11.8;
120.8 120.6 6800 20.6;
169 40.4 6160 40.6;
180.8 69.8 7330 33.4;
190.3 130.2 7320 31.6;
109.8 151.1 5754 86.1;
33.2 61.4 8255 22.6;
111.7 126.6 7040 13.6;]
写法一:
for i=1:9
x1(i,:)=(x(i,:)-min(x(i,:)))/(max(x(i,:))-min(x(i,:)))
end
结果:
0.0089 0.0085 1.0000 0
0.0174 0.0176 1.0000 0
0.0148 0.0148 1.0000 0
0.0210 0 1.0000 0.0000
0.0202 0.0050 1.0000 0
0.0218 0.0135 1.00 00 0
0.0042 0.0115 1.0000 0
0.0013 0.0047 1.0000 0
0.0140 0.0161 1.0000 0
写法二:
x=x\'
for i=1:4
x1(i,:)=(x(i,:)-min(x(i,:)))/(max(x(i,:))-min(x(i,:)))
end
结果:
Columns 1 through 8
0.2260 0.3609 0.5576 0.8644 0.9395 1.0000 0.4876 0
0.2367 0.4553 0.7245 0 0.2656 0.8112 1.0000 0.1897
0.2956 0 0.6125 0.4421 0.7537 0.7510 0.3340 1.0000
0.0996 0 0.1184 0.3876 0.2907 0.2665 1.0000 0.1454
Column 9
0.4997
0.7787
0.6764
0.0242
注意:写法 2为正确的归一化
对归一的错误理解2
将数据集分为训练集和测试集,对训练集和测试集分别做归一处理
所以就会有人问 如果我的测试集只有一个数据 如何归一呀
最大最小值从那里找呀
正确的理解是:
训练集和测试集的归一标准是一样的
建议:
如果训练集和测试集是一起归一的 可以自己编程实现归一
如果是训练集和测试集是分开的,最好是使用matlab自带的premnmx、postmnmx、tramnmx 函数
如果是自己编程的话 ,请注意训练集和测试集的归一标准需要一样
premnmx、postmnmx、tramnmx 函数
的使用例子如下:
Example
Here is the code to normalize a given data set so
that the inputs and targets will fall in the
range [-1,1], using PREMNMX, and the code to train a network
with the normalized data.
p = [-10 -7.5 -5 -2.5 0 2.5 5 7.5 10];
t = [0 7.07 -10 -7.07 0 7.07 10 7.07 0];
[pn,minp,maxp,tn,mint,maxt] = premnmx(p,t);
net = newff(minmax(pn),[5 1],\'tansig\' \'purelin\',\'trainlm\');
net = train(net,pn,tn);
If we then receive new inputs to apply to the trained
network, we will use TRAMNMX to transform them
first. Then the transformed inputs can be used
to simulate the previously trained network. The
network output must also be unnormalized using
POSTMNMX.
p2 = [4 -7];
[p2n] = tramnmx(p2,minp,maxp);
an = sim(net,pn);
[a] = postmnmx(an,mint,maxt);
这个是归一到-1 和 1 之间 那我要归一到0 1 之间怎么办
有人说可以使用加绝对值就归一到 0 1之间了
我觉得加绝对值可能会有些问题
比较好的方式是变换
P 在-1 1 之间
Pp=(p+1)/2 就可以归一到0 1之间
至于要归一到0.1- 0.9 之间 选取合适的变换就可以做到了
二、神经网络(BP)系列(2)(初学者系列)每次结果不一样解析
这个系列主要针对使用matlab 神经网络工具箱,对一些初学者容易理解错误的地方进行解析。
神经网络每次结果不同解析
神经网络每次结果不同是因为初始化的权值和阈值是随机的
因为每次的结果不一样,才有可能找到比较理想的结果啊
找到比较好的结果后,用命令save filename net;保存网络,
可使预测的结果不会变化,调用时用命令load filename net;
取p_test=[ ];
t_test=[ ];
t=sim(net,p_test);
err=t_test-t;
plot(p_test,err);
选择误差小的保存网络
save filename net
以后调用时
load filename net
p_test=[ ];
t_test=[ ];
t=sim(net,p_test);
err=t_test-t;
plot(p_test,err):
因为每次初始化网络时都是随机的,而且训练终止时的误差也不完全相同,结果训练后的权植和阀也不完全相同(大致是一样的),所以每次训练后的结果也略有不同
举个例子,这样初始化就能使网络的输出结果是一样的,另外也可以给网络特定的权值,一种方法是把预测结果后的效果比较好的权值做为初值
p=[0.8726 0.9441 0;0 0 0.7093;0.7378 0.7093 0.3795;0.6416 0.3795 0.7031;1 0.7031 0.4241;0.7774 0.4241 0.9559;0.9559 0.5012 0.7052;...
0.8209 0.7052 0.4983;0.6011 0.4983 1;]\';
t=[0 0.7378 0.6416 1 0.7774 0.5012 0.8209 0.6011 0.9350];
rand(\'state\',0);
net=newff(minmax(p),[6,1],\'tansig\',\'logsig\',\'trainlm\');
net.trainParam.epochs=2000;
net.trainParam.goal=0.001;
net=train(net,p,t);
y=sim(net,p);
error=y-t;
res=norm(error);
p_test=[0.9350 1 0.6236;]\';
t_test=[ 0.8027]
a=sim(net,p_test)
rand(\'state\',0);
这个的作用是每次初始化一样
0是种子数,如果换成其他数,就可以产生不同的随机值
注: rand(\'state\',0);的使用有点为结果相同而相同,至于这样的结果网络性能是否达到好的要求则没有考虑,建议还是不要用这种方法使每次结果相同
用保存网络的方法吧
消除初值影响可以考虑的另一个方法是简单集成神经网络
原理
由于选择不同的权值所得结果不同,使最终神经网络泛化能力体现出一定的随机性。利用这个特性也可以改善神经网络的泛化能力,神经网络集成便是利用这种思路的体现,即先训练一组只有初始权值不同的子网,然后通过各子网“表决(Voting)” 的形式(如加权和)得到学习系统的输出。
当神经网络集成用于分类器时,集成的输出通常由个体网络的输出投票产生。通常利用绝对多数投票法(某分类成为最终结果当且仅当输出结果为该分类的神经网络的数目最多)。理论分析和大量实验表明,后者优于前者。因此,在对分类器进行集成时,目前大多采用相对多数投票法。
当神经网络集成用于回归估计时,集成的输出通常由各网络的输出通过简单平均或加权平均产生。Perrone等人认为,采用加权平均可以得到比简单平均更好的泛化能力。
三、神经网络(BP)系列(3)(初学者请看)分类实例
分类实例
输入输出设计:
对某一问题分析,影响网络性能的输入主要有5个指标,输出则分为8类。8类的话可以用三位二进制表示。
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
神经网络的输入为5维的向量,输出为三维的向量。输入的数据具有不同的单位和量级,所以在输入在输入神经网络之前应该首先进行归一化处理,将样本数据归一到0 1之间。
样本总共有328组数据
将样本集分为训练集和测试集
随机抽取70取做为测试测试集
其余的作为训练集
网络设计
采用tansig(x)和logsig(x)函数作为传输函数,tansig(x)如下式:
tansig=2/(1+exp(-2x))-1
logsig(x) 如下式:
logsig(x) = 1 / (1 + exp(-n))
对于有限个输入到输出的映射,并不需要无限个隐层节点,这就涉及到如何选择隐层节点数的问题,而这一问题的复杂性,使得至今为止尚未找到一个很好的解析 式,隐层节点数往往根据前人设计所得的经验和自己进行试验来确定。设计网络时我采用的方法是通过神经网络训练来确定隐含层的个数,首先确定隐含层中节点数目的范围,设计一个隐含层神经元数目可变的BP网络,通过误差对比,确定最佳的隐含层神经元的个数。最后确定的隐含层的个数为12。所以网络结构为 5-12-3的三层结构。
load(\'CSHuju1.mat\');
p=CC1(:,[1,3:6])\';
T=[0 0 0;
1 1 1;
1 1 0;
1 0 1;
1 0 0;
0 1 1;
0 1 0;
0 0 1];
t=repmat(T,41,1)\';
pp=p;
%%%%%%归一到 0 1 之间
for i=1:5
p(i,:)=(p(i,:)-min(p(i,:)))/(max(p(i,:))-min(p(i,:)));
end
AllSamNum=328;%总样本数
TrainSamNum=258;%训练样本数
TestSamNum=AllSamNum-TrainSamNum;%测试样本数
PerPos=randperm(AllSamNum);
TrainDataIn=p(:,1:TrainSamNum)
TrainDataOut=t(:,1:TrainSamNum)
TestDataIn=p(:,PerPos(:,TrainSamNum+1:TrainSamNum+TestSamNum))
TestDataOut=t(:,PerPos(:,TrainSamNum+1:TrainSamNum+TestSamNum))
MaxMin=[0 1; 0 1; 0 1; 0 1;0 1];
net=newff(MaxMin,[12,3],\'tansig\',\'logsig\',\'trainlm\');
%训练参数设置
net.trainParam.epochs=1000;
%训练次数
net.trainParam.goal=0.0001;
%训练结束的目标
LP.lr=0.1;
%学习率
net.trainParam.show=20;
net=train(net,TrainDataIn,TrainDataOut);
out=sim(net,TestDataIn)
训练结果:
TRAINLM, Epoch 0/1000, MSE 0.296308/0.0001, Gradient 83.9307/1e-010
TRAINLM, Epoch 20/1000, MSE 0.0224641/0.0001, Gradient 6.7605/1e-010
TRAINLM, Epoch 40/1000, MSE 0.00563627/0.0001, Gradient 3.27027/1e-010
TRAINLM, Epoch 60/1000, MSE 0.00348587/0.0001, Gradient 1.49868/1e-010
TRAINLM, Epoch 80/1000, MSE 0.00247714/0.0001, Gradient 0.459233/1e-010
TRAINLM, Epoch 100/1000, MSE 0.0018843/0.0001, Gradient 0.289155/1e-010
TRAINLM, Epoch 120/1000, MSE 0.00148204/0.0001, Gradient 0.392871/1e-010
TRAINLM, Epoch 140/1000, MSE 0.00119585/0.0001, Gradient 0.340864/1e-010
TRAINLM, Epoch 160/1000, MSE 0.000980448/0.0001, Gradient 0.391987/1e-010
TRAINLM, Epoch 180/1000, MSE 0.000779059/0.0001, Gradient 0.389835/1e-010
TRAINLM, Epoch 200/1000, MSE 0.000606974/0.0001, Gradient 0.310202/1e-010
TRAINLM, Epoch 220/1000, MSE 0.000388926/0.0001, Gradient 0.331632/1e-010
TRAINLM, Epoch 240/1000, MSE 0.000143563/0.0001, Gradient 0.0403953/1e-010
TRAINLM, Epoch 248/1000, MSE 9.87756e-005/0.0001, Gradient 0.174263/1e-010
TRAINLM, Performance goal met.
训练好的权值、阈值的输出方法是:
输入到隐层权值:w1=net.iw1,1
隐层阈值:theta1=net.b1
隐层到输出层权值:w2=net.lw2,1;
输出层阈值:theta2=net.b2
>>w1=net.iw1,1
w1 =
1.7663 -2.8022 -0.7142 -2.1099 -2.4011
3.6614 -2.5297 -4.4295 5.0508 8.1899
4.4007 7.6775 -6.0282 6.1567 1.8775
4.5009 -9.9915 5.9737 5.0234 3.3931
0.2703 -2.8850 0.4482 -2.9153 1.3648
2.3769 3.3151 0.8745 3.1900 1.2608
-2.2815 -6.6847 1.8738 2.4093 -2.9033
-5.3332 6.1506 -8.4386 -6.7979 3.1428
-0.0135 -10.8942 -9.6333 7.2311 12.0693
2.3130 5.2211 0.0155 2.9431 0.3135
-6.4017 -0.8987 0.1976 3.2527 0.1444
-3.6517 -1.6339 3.5505 2.4813 1.7880
>> theta1=net.b1
theta1 =
0.5955
-5.4876
-9.8986
-4.4731
3.6523
-4.0371
5.6187
5.7426
0.9147
-8.5523
-2.3632
-5.6106
>> w2=net.lw2,1
w2 =
Columns 1 through 8
-0.2751 -3.5658 -2.3689 -6.4192 -1.1209 1.5711 -1.7615 7.6202
-1.2874 -9.1588 -14.4533 7.5064 3.7074 0.9019 8.7033 -5.0031
3.3536 -0.8844 7.8887 0.9336 0.8410 -2.4905 1.0627 -9.3513
Columns 9 through 12
-2.5894 -1.9950 -3.0132 -4.7009
13.3490 -9.8521 -4.6680 -4.2037
-5.9251 2.9388 -1.6797 -2.1077
>> theta2=net.b2
theta2 =
-2.4762
0.5692
0.6694
输出:
out =
Columns 1 through 8
1.0000 1.0000 0.0020 0.0000 1.0000 1.0000 0.0000 0.0000
1.0000 0.0000 0.0041 1.0000 1.0000 1.0000 1.0000 1.0000
0.9991 0.0000 0.0036 0.0015 0.9992 0.9985 0.0055 0.0036
Columns 9 through 16
1.0000 0.0000 0.0019 1.0000 0.0000 0.0000 0.0000 0.9996
1.0000 1.0000 0.9901 1.0000 1.0000 1.0000 1.0000 0.0000
0.9977 0.9999 0.9996 0.9994 0.0046 0.0023 0.0014 1.0000
Columns 17 through 24
0.0020 0.9925 0.0020 0.0000 0.0020 1.0000 0.0002 1.0000
0.0041 0.0284 0.0041 0.0284 0.0041 1.0000 0.9983 1.0000
0.0036 0.9955 0.0036 1.0000 0.0036 0.9989 0.9999 0.9990
Columns 25 through 32
1.0000 0.9938 1.0000 0.0000 1.0000 0.9999 0.0000 1.0000
1.0000 0.0177 0.0000 0.0021 1.0000 0.0006 1.0000 1.0000
0.0000 0.9971 0.0000 1.0000 0.0000 0.0004 0.9999 0.0000
Columns 33 through 40
0.9954 1.0000 0.0000 0.0000 0.9951 0.0020 0.0000 0.9997
0.0065 1.0000 1.0000 0.0025 0.0178 0.0041 1.0000 0.0000
0.9986 0.9990 0.9999 1.0000 0.0101 0.0036 0.0013 1.0000
Columns 41 through 48
0.0000 1.0000 0.9983 0.0000 0.0020 1.0000 0.0000 0.9873
0.0020 1.0000 0.0000 0.0037 0.0041 1.0000 0.0328 0.0637
1.0000 0.0000 0.9999 1.0000 0.0036 0.9982 1.0000 0.9884
Columns 49 through 56
0.0000 0.0001 1.0000 1.0000 1.0000 0.0000 0.0004 1.0000
0.0164 0.9992 0.9982 1.0000 1.0000 1.0000 0.9965 0.9998
1.0000 0.9999 0.9948 0.9991 0.9989 0.0024 0.9998 0.9968
Columns 57 through 64
1.0000 1.0000 0.0000 0.0020 0.0020 0.0001 0.0001 0.0000
0.9763 1.0000 0.0134 0.0041 0.0041 0.9990 0.0395 0.0017
0.0202 0.9988 1.0000 0.0036 0.0036 0.9999 0.9999 1.0000
Columns 65 through 70
0.9993 0.0000 0.0000 0.9978 1.0000 1.0000
0.0000 0.0018 0.0110 0.0001 1.0000 0.9998
1.0000 1.0000 1.0000 0.9999 0.9987 0.0007
每次结果因为初始化不同会不一样,可以选取一个性能比较好的网络
保持起来
save myBpNet net
save myShu.mat TestDataIn TestDataOut
测试数据也保存起来
(TestDataIn TestDataOut 为测试数据的输入向量和目标向量)
以后调用时
load myshu.mat
load myBpNet net
out=sim(net,TestDataIn)
基本框架程序:(前面的样本数据自己根据实际情况设计)
load(\'CSHuju1.mat\');
p=CC1(:,[1,3:6])\';
T=[0 0 0;
1 1 1;
1 1 0;
1 0 1;
1 0 0;
0 1 1;
0 1 0;
0 0 1];
t=repmat(T,41,1)\';
pp=p;
%%%%%%归一到 0 1 之间
for i=1:5
p(i,:)=(p(i,:)-min(p(i,:)))/(max(p(i,:))-min(p(i,:)));
end
AllSamNum=328;%总样本数
TrainSamNum=258;%训练样本数
TestSamNum=AllSamNum-TrainSamNum;%测试样本数
PerPos=randperm(AllSamNum);
TrainDataIn=p(:,1:TrainSamNum)
TrainDataOut=t(:,1:TrainSamNum)
TestDataIn=p(:,PerPos(:,TrainSamNum+1:TrainSamNum+TestSamNum))
TestDataOut=t(:,PerPos(:,TrainSamNum+1:TrainSamNum+TestSamNum))
MaxMin=[0 1; 0 1; 0 1; 0 1;0 1];
net=newff(MaxMin,[12,3],\'tansig\',\'logsig\',\'trainlm\');
net.trainParam.epochs=1000;
%训练次数
net.trainParam.goal=0.0001;
%训练结束的目标
LP.lr=0.1;
%学习率
net.trainParam.show=20;
net=train(net,TrainDataIn,TrainDataOut);
out=sim(net,TestDataIn) 参考技术A 没法分,考虑用一类支持向量机(One-Class SVM)吧
PU Learning简介:对无标签数据进行半监督分类
当只有几个正样本,你如何分类无标签数据
假设您有一个交易业务数据集。有些交易被标记为欺诈,其余交易被标记为真实交易,因此您需要设计一个模型来区分欺诈交易和真实交易。 假设您有足够的数据和良好的特征,这似乎是一项简单的分类任务。 但是,假设数据集中只有15%的数据被标记,并且标记的样本仅属于一类,即训练集15%的样本标记为真实交易,而其余样本未标记,可能是真实交易样本,也可能是欺诈样本。您将如何对其进行分类? 样本不均衡问题是否使这项任务变成了无监督学习问题? 好吧,不一定。
此问题通常被称为PU(正样本和未标记)分类问题,首先要将该问题与两个相似且常见的“标签问题”相区别,这两个问题使许多分类任务复杂化。第一个也是最常见的标签问题是小训练集问题。当您有大量数据但实际上只有一小部分被标记时,就会出现这种情况。这个问题有很多种类和许多特定的训练方法。另一个常见的标签问题(通常与PU问题混为一谈)是,训练的数据集是被完全标记的但只有一个类别。例如,假设我们拥有的只是一个非欺诈性交易的数据集,并且我们需要使用该数据集来训练一个模型,以区分非欺诈性交易和欺诈性交易。这也是一个常见问题,通常被视为无监督的离群点检测问题,在机器学习领域中也有很多工具专门用于处理这些情况(OneClassSVM可能是最著名的)。
相比之下,PU分类问题涉及的训练集,其中仅部分数据被标记为正,而其余数据未标记,可能为正或负。 例如,假设您在银行工作,可以获得很多交易数据,但只能确认其中一部分是100%真实的。 我将要举的例子将与伪钞相关。这个例子包含一个1200张钞票的数据集,其中大部分未标记,只有一部分被确认为真钞。 尽管PU问题也很普遍,但是与前面提到的两个分类问题相比,这个问题被讨论的次数通常要少得多,而且很少有实际的示例或库可供使用。
这篇文章的目的是提出一种可行的办法来解决PU问题,这个方法我最近在一个分类项目中使用过。 它基于Charles Elkan和Keith Noto的论文《Learning classifiers from only positive and unlabeled data》(2008年),以及Alexandre Drouin撰写的一些代码。 尽管在科学出版物中有更多的PU学习方法(我打算在以后的文章中讨论另一种颇受欢迎的方法),但是Elkan和Noto(E&N)的方法非常简单,并且可以在Python中轻松实现。
一点点理论
E&N方法本质上认为,在给定一个具有正样本和未标记样本的数据集的情况下,某个样本为正的概率[P(y = 1 | x)]等于一个样本被标记的概率[P(s = 1 | x)]除以一个正样本被标记的概率[P(s = 1 | y = 1)]。
如果这个说法是正确的(我并不会去证明或反驳它-您可以阅读论文本身的证明并验证代码),那么实现起来似乎相对容易。 之所以这样,是因为尽管我们没有足够的标记数据来训练分类器来告诉我们样本是正还是负,但在PU问题中,我们有足够的标记数据来告诉我们一个正样本是否可能被标记。根据E&N的方法,这足以估算一个样本是否是正样本
更正式地讲,给定一个未标记的数据集,其中只有一组样本被标记为正样本。幸运的是,如果我们可以估计P(s = 1 | x)/ P(s = 1 | y = 1),那么就可以根据以下步骤使用任何基于sklearn的分类器进行估算:
(1)将分类器使用在包含标签和无标签样本的数据集上,同时使用已标记的指示器作为目标y,以这种方式拟合分类器对其进行训练,以预测给定样本x被标记的概率P(s = 1 | x)。
(2)使用分类器来预测数据集中已知正样本被标记的概率,使用预测的结果表示对正样本被标记的概率— P(s = 1 | y = 1 | x)
计算这些预测概率的均值,得到P(s=1|y=1).
在估计了P(s = 1 | y = 1)之后,为了根据E&N方法预测数据点k为正样本的概率,我们要做的就是估计P(s = 1 | k)或K被标记的概率,这正是分类器(1)所做的。
(3)使用我们训练的分类器(1)来估计K被标记的概率或者P(s=1|k)
(4)一旦我们估计了P(s = 1 | k),我们就可以通过将k除以在步骤(2)中估计的P(s = 1 | y = 1)来对k进行分类,然后获得它属于这两个类的实际概率。
现在编写代码并进行测试
上述1-4可按如下方式实施:
# prepare data
x_data = the training set
y_data = target var (1for the positives and not-1for the rest)
# fit the classifier and estimate P(s=1|y=1)
classifier, ps1y1 =
fit_PU_estimator(x_data, y_data, 0.2, Estimator())
# estimate the prob that x_data is labeled P(s=1|X)
predicted_s = classifier.predict_proba(x_data)
# estimate the actual probabilities that X is positive# by calculating P(s=1|X) / P(s=1|y=1)
predicted_y = estimated_s / ps1y1
让我们从这里的主要方法开始:fit_PU_estimator()方法。
fit_PU_estimator()方法完成了2个主要任务:它适合您在正样本和未标记样本的数据集中选择合适的分类器,然后估计正样本被标记的概率。相应地,它返回一个拟合的分类器(已学会估计给定样本被标记的概率)和估计概率P(s = 1 | y = 1)。 之后,我们要做的就是找到P(s = 1 | x)或x被标记的概率。因为分类器被这样训练过,所以我们只需要调用其predict_proba()方法即可。最后,为了对样本x进行实际分类,我们只需要将结果除以已经得到的P(s = 1 | y = 1)。
用代码表示为:
pu_estimator, probs1y1 = fit_PU_estimator(
x_train,
y_train,
0.2,
xgb.XGBClassifier())
predicted_s = pu_estimator.predict_proba(x_train)
predicted_s = predicted_s[:,1]
predicted_y = predicted_s / probs1y1
fit_PU_estimator()方法本身的实现是非常简单的
deffit_PU_estimator(X,y, hold_out_ratio, estimator):# The training set will be divided into a fitting-set that will be used # to fit the estimator in order to estimate P(s=1|X) and a held-out set of positive samples# that will be used to estimate P(s=1|y=1)# --------# find the indices of the positive/labeled elementsassert (type(y) == np.ndarray), "Must pass np.ndarray rather than list as y"
positives = np.where(y == 1.)[0]
# hold_out_size = the *number* of positives/labeled samples # that we will use later to estimate P(s=1|y=1)
hold_out_size = int(np.ceil(len(positives) * hold_out_ratio))
np.random.shuffle(positives)
# hold_out = the *indices* of the positive elements # that we will later use to estimate P(s=1|y=1)
hold_out = positives[:hold_out_size]
# the actual positive *elements* that we will keep aside
X_hold_out = X[hold_out]
# remove the held out elements from X and y
X = np.delete(X, hold_out,0)
y = np.delete(y, hold_out)
# We fit the estimator on the unlabeled samples + (part of the) positive and labeled ones.# In order to estimate P(s=1|X) or what is the probablity that an element is *labeled*
estimator.fit(X, y)
# We then use the estimator for prediction of the positive held-out set # in order to estimate P(s=1|y=1)
hold_out_predictions = estimator.predict_proba(X_hold_out)
#take the probability that it is 1
hold_out_predictions = hold_out_predictions[:,1]
# save the mean probability
c = np.mean(hold_out_predictions)
return estimator, c
defpredict_PU_prob(X, estimator, prob_s1y1):
prob_pred = estimator.predict_proba(X)
prob_pred = prob_pred[:,1]
return prob_pred / prob_s1y1
为了对此进行测试,我使用了钞票数据集,该数据集基于从真实和伪造钞票的图像中提取的4个数据点。 我首先在标记的数据集上使用分类器以设置基线,然后删除75%的样本的标签以测试其在P&U数据集上的表现。如输出所示,确实该数据集并不是最难分类的数据集,但是您可以看到,尽管PU分类器仅了解约153个正样本,而其余所有1219均未标记,但与全标签分类器相比,它的表现相当出色 。 但是,它确实损失了大约17%的召回率,因此损失了很多正样本。但是,我相信与其他方案相比,这个结果是令人相当满意的。
===>> load data set <<===data size: (1372, 5)Target variable (fraud or not):
07621610===>> create baseline classification results <<===Classification results:f1: 99.57%
roc: 99.57%
recall: 99.15%
precision: 100.00%===>> classify on all the data set <<===Target variable (labeled or not):
-112191153Classification results:f1: 90.24%
roc: 91.11%
recall: 82.62%
几个要点
首先,这种方法的性能很大程度上取决于数据集的大小。 在此示例中,我使用了大约150个正样本和大约1200个未标记的样本。 这远不是该方法的理想数据集。 例如,如果我们只有100个样本,则分类器的效果会非常差。 其次,如随附的笔记所示,有一些变量需要调整(例如要设置的样本大小,用于分类的概率阈值等),但是最重要的可能是选择的分类器及其参数。 我之所以选择使用XGBoost,是因为它在特征少的小型数据集上的性能相对较好,但是需要注意的是,它并非在每种情况下都表现得很好,并且测试正确的分类器也很重要。
作者:Alon Agmon
Deephub翻译组:gkkkkkk
以上是关于bp神经网络只有一类样本怎么分类的主要内容,如果未能解决你的问题,请参考以下文章