Percetron Learning Algorithm——感知學(xué)習(xí)算法。
算法原理
PLA用于解決的是對(duì)于二維或者高維的 線性可分問題的分類犁跪,最終將問題分為兩類——是或者不是。針對(duì)給定的feature vector給出Yes 或者 No的回答歹袁。值得注意的是PLA一定是針對(duì)線性可分的問題坷衍,即可以找到一條線,或者超平面去分開是和不是的兩堆數(shù)據(jù)条舔,如果不是線性可分枫耳。可以通過Pocket改正算法孟抗,類似貪心的法則找到一個(gè)最適合的權(quán)值迁杨。
找到一個(gè)合適的權(quán)值之后,使用該權(quán)值對(duì)測(cè)試集進(jìn)行二分類凄硼。
抽象模型
權(quán)重向量 wi, 1<=i<=d;
閾值铅协,下面設(shè)為0
做一點(diǎn)小小的變形使得式子更加緊湊
PLA算法"知錯(cuò)能改",其循環(huán)是不斷遍歷feature vector摊沉,找到錯(cuò)誤的點(diǎn)狐史,即y和當(dāng)前w*x不符合,然后校正w说墨,那么為什么要這樣校正呢骏全?因?yàn)檫@樣可以保證Wt越來越靠近perfect直線w
評(píng)測(cè)指標(biāo)
對(duì)于二元分類有這樣的指標(biāo),Accuracy(準(zhǔn)確率)\Precision(精確率)Recall(召回率)F1(F值)
TP:本來為+1尼斧,預(yù)測(cè)為+1
FN:本來為+1姜贡,預(yù)測(cè)為-1
TN:本來為-1,預(yù)測(cè)為-1
FP:本來為-1棺棵,預(yù)測(cè)為+1
T:True F:False
N:negative P:positive
ROC指標(biāo)
True Positive Rate ( TPR ) = TP / [ TP + FN] 楼咳,TPR代表能將正例分對(duì)的概率
False Positive Rate( FPR ) = FP / [ FP + TN] ,F(xiàn)PR代表將負(fù)例錯(cuò)分為正例的概率
在ROC 空間中烛恤,每個(gè)點(diǎn)的橫坐標(biāo)是FPR母怜,縱坐標(biāo)是TPR,這也就描繪了分類器在TP(真正的正例)和FP(錯(cuò)誤的正例)間的trade-off棒动。ROC的主要分 析工具是一個(gè)畫在ROC空間的曲線——ROC curve糙申。我們知道,對(duì)于二值分類問題,實(shí)例的值往往是連續(xù)值柜裸,我們通過設(shè)定一個(gè)閾值缕陕,將實(shí)例分類到正類或者負(fù)類(比如大于閾值劃分為正類)。因此我們 可以變化閾值疙挺,根據(jù)不同的閾值進(jìn)行分類扛邑,根據(jù)分類結(jié)果計(jì)算得到ROC空間中相應(yīng)的點(diǎn),連接這些點(diǎn)就形成ROC curve铐然。ROC curve經(jīng)過(0,0)(1,1)蔬崩,實(shí)際上(0, 0)和(1, 1)連線形成的ROC curve實(shí)際上代表的是一個(gè)隨機(jī)分類器。一般情況下搀暑,這個(gè)曲線都應(yīng)該處于(0, 0)和(1, 1)連線的上方沥阳。
算法偽代碼
原始PLA偽代碼
PLA的優(yōu)缺點(diǎn)
1.首先,PLA的算法是局限在線性可分的訓(xùn)練集上的自点,然而我們拿到一個(gè)訓(xùn)練集桐罕,并不知道其到底是不是線性可分,如果不是桂敛,PLA的算法程序?qū)o限循環(huán)下去功炮,這樣做是不可 行的。
2.即使訓(xùn)練集是線性可分术唬,我們也不知道PLA什么時(shí)候才能找到一個(gè)合適的解薪伏,如果要循環(huán)很多次才能找到,這對(duì)于實(shí)際使用是開銷很大的粗仓。
Pocket-PLA偽代碼
Pocket-PLA需要找到一條分界線去分離兩個(gè)數(shù)據(jù)集嫁怀,使得錯(cuò)誤率最低
然而要準(zhǔn)確找到一條錯(cuò)誤率最低的,被證明出是一個(gè)NP問題潦牛,不能準(zhǔn)確地找到眶掌。那么Pocket算法的思路就是挡育,類似貪心巴碗,如果找到一個(gè)更好(錯(cuò)誤率低)的w,那么就去更新即寒,如果找一個(gè)錯(cuò)誤率更高的橡淆,那么就不去更新的,重新找母赵。每次找一個(gè)隨機(jī)的wt逸爵。對(duì)于所有數(shù)據(jù)都采用w(t+1) = w(t) + yn*xn;修正一次。最后如果這個(gè)wt要比記錄的最好值w‘犯的錯(cuò)誤少凹嘲,就更新最好值师倔。
Pocket優(yōu)缺點(diǎn)
1.wt是隨機(jī)的,可能算了很多次都沒有找出一個(gè)更好的周蹭。
2.假設(shè)數(shù)據(jù)一開始就是線性可分趋艘,那么這個(gè)算法找出來的未必是最好解疲恢,且時(shí)間花費(fèi)也可能比較大。
小數(shù)據(jù)集驗(yàn)證模型
小數(shù)據(jù)集說明:因?yàn)閷?shí)驗(yàn)數(shù)據(jù)給出的分類不平衡瓷胧,所以我從網(wǎng)絡(luò)上找到可一個(gè)開源的數(shù)據(jù)集显拳,權(quán)值的維度是2,方便可視化搓萧,且這個(gè)數(shù)據(jù)集+1和-1的分類比例比較平均杂数,并且是非線性可分的。
set | 權(quán)值維度 | 數(shù)量 | y=+1 | y=-1 |
---|---|---|---|---|
train | 2 | 200 | 100 | 100 |
validation | 2 | 50 | 25 | 25 |
小訓(xùn)練集數(shù)據(jù)分布如下圖
觀察可得我確實(shí)沒找出一條線能夠劃分開兩個(gè)不同類別瘸洛。紅色o表示+1揍移,藍(lán)色x表示-1
下面展示應(yīng)用我的模型的劃分過程
迭代過程1:迭代次數(shù)過少,分類效果很差
迭代過程2:當(dāng)?shù)螖?shù)逐漸增多反肋,直線慢慢像最優(yōu)權(quán)值靠攏(體現(xiàn)PLA學(xué)習(xí)的過程)
迭代過程3:由于測(cè)試集非線性可分羊精,當(dāng)權(quán)值很久沒有改變的時(shí)候,退出迭代的循環(huán)
應(yīng)用權(quán)值(直線)對(duì)驗(yàn)證集劃分
使用通過Train得到的直線(最優(yōu)權(quán)值)進(jìn)行測(cè)試分類器的效果
結(jié)果
<img src="http://upload-images.jianshu.io/upload_images/2560767-0217637fe26b8528.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="300" height="400">
指標(biāo)
左上:Precision-Recall
右上:F1-Recall
左下:F1-Precision
右下:TPR-FPR囚玫,顯示在y=x這條線上方的面積較大喧锦,該分類器效果較好
關(guān)鍵代碼和注釋
Limit.m——限制迭代次數(shù)PLA與Pocket結(jié)合
clear A
clear P
clear R
clear TPRsave
clear FPRsave
clear F1Meansure
% augmented matrix 增廣矩陣
xn=augmentedmatrix(train);
size_label=size(label);
sizeL=size_label(1);
size_xn=size(xn);
% 隨機(jī)預(yù)測(cè)標(biāo)簽
Rand=randi([0,1],size_label(1),size_label(2));
Rand(Rand==0)=-1;
predictlabel=Rand;
Acc=Accuracy(label,predictlabel,sizeL);
tim=1;% 總迭代次數(shù)
count=1;% PLA-Pocket算法 權(quán)值何時(shí)放入口袋
iterator=1;% 原始PLA 算法迭代次數(shù)
% 用于畫圖
A=[];% 記錄正確率
P=[];% 記錄精確率
R=[];% 記錄召回率
TPRsave=[];% 記錄TPR
FPRsave=[];% 記錄FPR
F1Meansure=[];% 記錄F1
maxAcc=0;
maxF1=0;
% 初始化權(quán)值向量
maxW=ones(size_xn(1),1);
new_w=ones(size_xn(1),1);
w=ones(size_xn(1),1);
while(tim<=10000)
if maxAcc==1
break;
end
% 更新W
predictlabel(iterator)=Sign((w')*xn(:,iterator));
if predictlabel(iterator)~=label(iterator)
new_w=w+label(iterator)*xn(:,iterator);
w=new_w;
end
if count==4000
count=0;
tim=tim+1;
Acc=Accuracy(label,predictlabel,sizeL);
Pre=Precision(label,predictlabel,sizeL);
Rec=Recall(label,predictlabel,sizeL);
TPR=TruePositiveRate(label,predictlabel,sizeL);
FPR=FalsePositiveRate(label,predictlabel,sizeL);
F=F1(Pre,Rec,1);
A=[A,Acc];
P=[P,Pre];
R=[R,Rec];
TPRsave=[TPRsave,TPR];
FPRsave=[FPRsave,FPR];
F1Meansure=[F1Meansure,F];
% pocket 記錄最好的權(quán)值向量
if F>maxF1
maxF1=F;
maxW=new_w;
end
end
if iterator==size_xn(2)
iterator=0;
end
iterator=iterator+1;
count=count+1;
end
Pocket.m ——隨機(jī)口袋算法
% augmented matrix
xn=augmentedmatrix(train);
% initial w
w=10000*rand(size_xn(1),1);
tim=1;
while(tim<=1000)
w=10000*rand(size_xn(1),1);% 產(chǎn)生隨機(jī)權(quán)值向量W
for iterator=1:size_xn(2)% 使用驗(yàn)證集對(duì)W更新一次
predictlabel(iterator)=Sign((w')*xn(:,iterator));
if predictlabel(iterator)~=label(iterator)
new_w=w+label(iterator)*xn(:,iterator);
w=new_w;
end
end
% 計(jì)算各個(gè)指標(biāo)
Acc=Accuracy(label,predictlabel,sizeL);
Pre=Precision(label,predictlabel,sizeL);
Rec=Recall(label,predictlabel,sizeL);
TPR=TruePositiveRate(label,predictlabel,sizeL);
FPR=FalsePositiveRate(label,predictlabel,sizeL);
F=F1(Pre,Rec,5);
A=[A,Acc];
P=[P,Pre];
R=[R,Rec];
TPRsave=[TPRsave,TPR];
FPRsave=[FPRsave,FPR];
F1Meansure=[F1Meansure,F];
% 進(jìn)入口袋Pocket的條件
if F>maxF1
maxF1=F;
maxW=new_w;
end
tim=tim+1;
end
計(jì)算各類指標(biāo)
% 計(jì)算準(zhǔn)確率
function Acc=Accuracy(label,predictlabel,sizeL)
error=label-predictlabel;
TP=sizeL-(sum(abs(error))/2);
Acc=TP/sizeL;
end
% 計(jì)算精確率
function Pre=Precision(label,predictlabel,sizeL)
TP=0;
FP=0;
for i=1:sizeL
if label(i)==1 && predictlabel(i)==1
TP=TP+1;
elseif label(i)==-1 && predictlabel(i)==1
FP=FP+1;
end
end
Pre=TP/(TP+FP);
end
% 計(jì)算召回率
function Rec=Recall(label,predictlabel,sizeL)
TP=0;
FN=0;
for i=1:sizeL
if label(i)==1 && predictlabel(i)==1
TP=TP+1;
elseif label(i)==1 && predictlabel(i)==-1
FN=FN+1;
end
end
Rec=TP/(TP+FN);
end
% 計(jì)算F值(加權(quán)版)
function F=F1(Pre,Rec,a)
fenzi=a*a+1;
fenmu=a*a;
F=(fenzi*(Pre*Rec))/(fenmu*(Pre+Rec));
end
% 符號(hào)函數(shù)
function yout=Sign(yin)
if yin>0
yout=1;
elseif yin<0
yout=-1;
end
end
%ROC橫縱坐標(biāo)計(jì)算
function TPR=TruePositiveRate(label,predictlabel,sizeL)
TP=0;
FN=0;
for i=1:sizeL
if label(i)==1 && predictlabel(i)==1
TP=TP+1;
elseif label(i)==1 && predictlabel(i)==-1
FN=FN+1;
end
end
TPR=TP/(TP+FN);
end
function FPR=FalsePositiveRate(label,predictlabel,sizeL)
FP=0;
TN=0;
for i=1:sizeL
if label(i)==-1 && predictlabel(i)==1
FP=FP+1;
elseif label(i)==-1 && predictlabel(i)==-1
TN=TN+1;
end
end
FPR=FP/(FP+TN);
end
實(shí)驗(yàn)結(jié)果和評(píng)測(cè)指標(biāo)
通過train訓(xùn)練出的權(quán)值向量VectorW,作用于validation進(jìn)行二分類
列表放結(jié)果
評(píng)測(cè)指標(biāo)圖
左上:Precision-Recall
右上:F1-Recall
左下:F1-Precision
右下:TPR-FPR
評(píng)測(cè)說明
準(zhǔn)確率和召回率是互相影響的抓督,理想情況下肯定是做到兩者都高燃少,但是一般情況下準(zhǔn)確率高、召回率就低铃在,召回率低阵具、準(zhǔn)確率高,當(dāng)然如果兩者都低定铜,那是什么地方出問題了
Precision-Recall曲線與坐標(biāo)軸之間的面積應(yīng)當(dāng)越大阳液。
最理想的系統(tǒng), 其包含的面積應(yīng)當(dāng)是1揣炕,而所有系統(tǒng)的包含的面積都應(yīng)當(dāng)大于0帘皿。
TPR-FPR 在ROC 空間中,每個(gè)點(diǎn)的橫坐標(biāo)是FPR畸陡,縱坐標(biāo)是TPR鹰溜,這也就描繪了分類器在TP(真正的正例)和FP(錯(cuò)誤的正例)間的trade-off。ROC的主要分 析工具是一個(gè)畫在ROC空間的曲線——ROC curve丁恭。我們知道曹动,對(duì)于二值分類問題,實(shí)例的值往往是連續(xù)值牲览,我們通過設(shè)定一個(gè)閾值馆类,將實(shí)例分類到正類或者負(fù)類(比如大于閾值劃分為正類)薄腻。因此我們 可以變化閾值枉疼,根據(jù)不同的閾值進(jìn)行分類疮装,根據(jù)分類結(jié)果計(jì)算得到ROC空間中相應(yīng)的點(diǎn),連接這些點(diǎn)就形成ROC curve。ROC curve經(jīng)過(0,0)(1,1),實(shí)際上(0, 0)和(1, 1)連線形成的ROC curve實(shí)際上代表的是一個(gè)隨機(jī)分類器。一般情況下押框,這個(gè)曲線都應(yīng)該處于(0, 0)和(1, 1)連線的上方。用ROC curve來表示分類器的performance很直觀好用理逊∠鹕。可是,人們總是希望能有一個(gè)數(shù)值來標(biāo)志分類器的好壞晋被。
于是Area Under roc Curve(AUC)就出現(xiàn)了兑徘。顧名思義,AUC的值就是處于ROC curve下方的那部分面積的大小羡洛。通常挂脑,AUC的值介于0.5到1.0之間,較大的AUC代表了較好的Performance欲侮。
設(shè)計(jì)PLA二分類模型結(jié)果分析
計(jì)算的F1值都是在alpha=1的情況下
迭代次數(shù)為500次崭闲,pocket以F1的閾值為準(zhǔn)
maxWeight on validation
Acc = 0.815000000000000
Pre = 0.373737373737374
Rec = 0.231250000000000
F = 0.285714285714286
分析:迭代次數(shù)過少,分類器效果不明顯威蕉。
右下圖TPR-FPR 藍(lán)色為分類器曲線刁俭,橙色為y=x,曲線都在y=x下方韧涨,說明分類器效果不好
迭代次數(shù)為1000次,pocket以F1的閾值為準(zhǔn)
maxWeight on validation
Acc = 0.831000000000000
Pre = 0.445783132530120
Rec = 0.231250000000000
F = 0.304526748971193
分析:隨著迭代次數(shù)的增大虑粥,pocket里收入了效果較好的權(quán)值
左上:Precision-Recall 曲線下凹如孝,說明精確率和召回率,魚與熊掌不可兼得娩贷,曲線越上凸第晰,分類器效果越好。
右下:TPR-FPR 藍(lán)色為分類器曲線育勺,橙色為y=x但荤,曲線都在y=x上方了,與上一張圖相比分類器性能變好了一些
迭代次數(shù)為10000次,pocket以F1的閾值為準(zhǔn)
maxWeight on validation
Acc = 0.822000000000000
Pre = 0.436619718309859
Rec = 0.387500000000000
F = 0.410596026490066
分析:隨著迭代次數(shù)的增大桑包,pocket里收入了效果更好的權(quán)值
右下:TPR-FPR 藍(lán)色為分類器曲線南蓬,橙色為y=x,曲線都在y=x上方了,與上一張圖相比赘方,橙色線上方面積大一些
迭代次數(shù)為100000次,pocket以F1的閾值為準(zhǔn)
maxWeight on validation
Acc = 0.796000000000000
Pre = 0.409090909090909
Rec = 0.618750000000000
F =
0.492537313432836
分析:隨著迭代次數(shù)的增大窄陡,pocket里收入了效果更好的權(quán)值
之后很多次的迭代炕淮,都是為了pocket里收入的權(quán)值能使召回率Rec上升,照顧到更多的少數(shù)民族+1
Pocket-PLA
當(dāng)alpha為1的時(shí)候
validation
Acc = 0.796000000000000
Pre = 0.402654867256637
Rec = 0.568750000000000
F = 0.471502590673575
當(dāng)alpha從0.1~10
不斷調(diào)高的過程中recall也會(huì)增加
最后我取定alpha=5時(shí)涂圆,也是比較隨緣的
此時(shí)驗(yàn)證集結(jié)果為:
Acc = 0.795000000000000
Pre = 0.403433476394850
Rec = 0.587500000000000
F = 0.241577608142494
純Pocket-PLA,運(yùn)行次數(shù)的增加并沒有增加Recall召回率币叹,而是取決于每次生成的初始權(quán)值向量W是否能夠訓(xùn)練出較好的模型
產(chǎn)生test測(cè)試集結(jié)果注明:
Model:結(jié)合了規(guī)定迭代次數(shù)的PLA算法與隨機(jī)口袋算法
iterator:100000
alpha:5
validation result
Acc = 0.795000000000000
Pre = 0.403433476394850
Rec = 0.587500000000000
F = 0.241577608142494
優(yōu)化點(diǎn)
1润歉、結(jié)合了規(guī)定迭代次數(shù)的PLA算法與隨機(jī)口袋算法
規(guī)定迭代次數(shù)PLA算法是經(jīng)過若干次不斷的輪詢調(diào)整之后,從初始化權(quán)值W=1颈抚,得到一個(gè)權(quán)值W-PLA踩衩,缺點(diǎn)是循環(huán)很多次才能找到,這對(duì)于實(shí)際使用是開銷很大贩汉,也不知道什么時(shí)候才能找到驱富。
隨機(jī)口袋算法是使用隨機(jī)數(shù)產(chǎn)生一個(gè)權(quán)值,利用這個(gè)初始隨機(jī)的權(quán)值匹舞,經(jīng)過所有樣本更新一次萌朱,得到一個(gè)權(quán)值W-Pocket,判斷該權(quán)值是否使錯(cuò)誤率更小策菜,如果錯(cuò)誤率更小則更新權(quán)值晶疼。缺點(diǎn)是W-Pocket的初始化是隨機(jī)的,不確定性大又憨,可能算了很多次都沒有找出一個(gè)更好的翠霍。
這兩者可以相結(jié)合,首先使用“規(guī)定迭代次數(shù)”的PLA算法得到一個(gè)權(quán)值W-PLA蠢莺,然后把這個(gè)權(quán)值作為口袋算法的初始權(quán)值寒匙,經(jīng)過訓(xùn)練集的更新,記錄結(jié)果躏将。重復(fù)多次锄弱,再使用W-Pocket的權(quán)值作為“規(guī)定迭代次數(shù)”的PLA的初始權(quán)值。這樣可以保證設(shè)置的迭代次數(shù)不用太多祸憋,耗時(shí)不長会宪,口袋算法的不確定性減小。
使用改優(yōu)化后召回率明顯上升蚯窥。
2.使用了一般意義下的F1作為指標(biāo)
用于優(yōu)化口袋算法
為什么選擇用這個(gè)指標(biāo)呢掸鹅?
在本次實(shí)驗(yàn)中塞帐,我認(rèn)為召回率Recall的重要性很大,因?yàn)橛?xùn)練集數(shù)據(jù)分類不平衡巍沙,y=-1的有百分之八十多葵姥,如果只根據(jù)正確率Accuracy來作為評(píng)測(cè)指標(biāo),那這個(gè)算法變得非常簡單句携,把所有的分類都判斷為-1榔幸,那正確率就很高了,完爆了我寫的其他PLA分類器辛辛苦苦算出來的權(quán)值矮嫉。這樣的分類在測(cè)試集中表現(xiàn)有可能會(huì)出現(xiàn)很大的偏差削咆,萬一測(cè)試集里+1居多呢。
本次實(shí)驗(yàn)中召回率是
Recall=(【預(yù)測(cè)為+1且實(shí)際也是+1】)/(【預(yù)測(cè)為+1且實(shí)際為+1】 加上 【預(yù)測(cè)為-1但是實(shí)際是+1】)
表征的特點(diǎn)是敞临,我的分類器态辛,對(duì)于實(shí)際是+1的,到底預(yù)測(cè)對(duì)了多少挺尿。訓(xùn)練集-1居多奏黑,那更應(yīng)該關(guān)注一下+1的標(biāo)簽們。
當(dāng)alpha慢慢調(diào)大编矾,召回率上升熟史,我認(rèn)為這個(gè)參數(shù)達(dá)到了優(yōu)化模型的目的。
思考題
有什么其他方法可以解決數(shù)據(jù)集非線性可分的問題窄俏?
既然用一條直線無法分割非線性可分的數(shù)據(jù)集蹂匹,那只有走曲線救國路線了,提前試了一下用SVM
解釋四個(gè)指標(biāo)的用處和意義凹蜈。
準(zhǔn)確率限寞,它計(jì)算的是對(duì)于給定的測(cè)試數(shù)據(jù)集,分類器正確分類的樣本數(shù)與總樣本數(shù)之比仰坦。
精確率Precision履植,它計(jì)算的是所有"正確被檢索的item(TP)"占所有"實(shí)際被檢索到的(TP+FP)"的比例.
召回率Recall,它計(jì)算的是所有"正確被檢索的item(TP)"占所有"應(yīng)該檢索到的item(TP+FN)"的比例悄晃。
一般來說玫霎,Precision 就是檢索出來的條目中(比如:文檔、網(wǎng)頁等)有多少是準(zhǔn)確的妈橄,Recall就是所有準(zhǔn)確的條目有多少被檢索出來了庶近。
我們當(dāng)然希望檢索的結(jié)果P越高越好,R也越高越好眷蚓,但事實(shí)上這兩者在某些情況下是矛盾的鼻种。比如極端情況下,我們只搜出了一個(gè)結(jié)果溪椎,且是準(zhǔn)確的普舆,那么P就是100%恬口,但是R就很低校读;而如果我們把所有結(jié)果都返回沼侣,那么必然R是100%,但是P很低歉秫。
因此在不同的場合中需要自己判斷希望P比較高還是R比較高蛾洛。如果是做實(shí)驗(yàn)研究,可以繪制Precision-Recall曲線來幫助分析雁芙。
準(zhǔn)確率轧膘,我們的確可以在一些場合,從某種意義上得到一個(gè)分類器是否有效兔甘,但它并不總是能有效的評(píng)價(jià)一個(gè)分類器的工作谎碍。舉個(gè)栗子,google抓取 了argcv 100個(gè)頁面,而它索引中共有10,000,000個(gè)頁面,隨機(jī)抽一個(gè)頁面洞焙,分類下,這是不是argcv的頁面呢?如果以accuracy來判斷我的工 作蟆淀,那我會(huì)把所有的頁面都判斷為"不是argcv的頁面",因?yàn)槲疫@樣效率非常高(return false,一句話),而accuracy已經(jīng)到了99.999%(9,999,900/10,000,000),完爆其它很多分類器辛辛苦苦算的值,而我這個(gè)算法顯然不是需求期待的,那怎么解決呢?這就是precision,recall和f1-measure存在的意義。還有很多判斷分類器是否優(yōu)秀的指標(biāo)澡匪,如AP和mAP(mean Average Precision)和ROC&AUC熔任。