sklearn 中的兩個(gè)半監(jiān)督標(biāo)簽傳播算法 LabelPropagation和LabelSpreading
標(biāo)簽傳播算法是一種半監(jiān)督機(jī)器學(xué)習(xí)算法,它將標(biāo)簽分配給以前未標(biāo)記的數(shù)據(jù)點(diǎn)。要在機(jī)器學(xué)習(xí)中使用這種算法,只有一小部分示例具有標(biāo)簽或分類。在算法的建模、擬合和預(yù)測過程中,這些標(biāo)簽被傳播到未標(biāo)記的數(shù)據(jù)點(diǎn)。
LabelPropagation
LabelPropagation是一種在圖中查找社區(qū)的快速算法。它只使用網(wǎng)絡(luò)結(jié)構(gòu)作為指導(dǎo)來檢測這些連接,不需要預(yù)定義的目標(biāo)函數(shù)或關(guān)于群體的先驗(yàn)信息。標(biāo)簽傳播通過在網(wǎng)絡(luò)中傳播標(biāo)簽并基于標(biāo)簽傳播過程形成連接來實(shí)現(xiàn)。
接近的標(biāo)簽通常會(huì)被賦予相同的標(biāo)簽。單個(gè)標(biāo)簽可以在密集連接的節(jié)點(diǎn)組中占主導(dǎo)地位,但在稀疏連接的區(qū)域中會(huì)遇到麻煩。標(biāo)簽將被限制在一個(gè)緊密連接的節(jié)點(diǎn)組中,當(dāng)算法完成時(shí),那些最終具有相同標(biāo)簽的節(jié)點(diǎn)可以被視為同一連接的一部分。該算法使用了圖論,具體如下:-
LabelPropagation算法以下列方式工作:-
- 每個(gè)節(jié)點(diǎn)都使用唯一的標(biāo)簽進(jìn)行初始化。
- 這些標(biāo)簽通過網(wǎng)絡(luò)傳播。
- 在每次傳播迭代中,每個(gè)節(jié)點(diǎn)都會(huì)將其標(biāo)簽更新為最大鄰居數(shù)所屬的標(biāo)簽。
- 當(dāng)每個(gè)節(jié)點(diǎn)具有其鄰居的多數(shù)標(biāo)簽時(shí),標(biāo)簽傳播算法達(dá)到收斂。
- 如果達(dá)到收斂或用戶定義的最大迭代次數(shù),則標(biāo)簽傳播算法停止。
為了演示LabelPropagation算法的工作原理,們使用 Pima Indians 的數(shù)據(jù)集,創(chuàng)建程序時(shí),我導(dǎo)入了運(yùn)行它所需的庫
復(fù)制一份數(shù)據(jù)并且將lable列作為訓(xùn)練目標(biāo)
使用matplotlib可視化:
使用隨機(jī)數(shù)生成器隨機(jī)化數(shù)據(jù)集中70%的標(biāo)簽。然后隨機(jī)標(biāo)簽被分配-1:-
在對數(shù)據(jù)進(jìn)行預(yù)處理之后,定義因變量和自變量,分別為y和X。y變量是最后一列,X變量是剩下的所有部分:-
使用sklearn的LabelPropagation數(shù)來標(biāo)記所有未標(biāo)記的數(shù)據(jù)點(diǎn):-
準(zhǔn)確率為發(fā)現(xiàn)它是76.9%。
下面我們看看另外一個(gè)算法LabelSpreading。
LabelSpreading
LabelSpreading也是一種流行的半監(jiān)督學(xué)習(xí)方法。創(chuàng)建一個(gè)連接訓(xùn)練數(shù)據(jù)集中樣本的圖,并通過圖的邊緣傳播已知的標(biāo)簽來標(biāo)記未標(biāo)記的示例。
LabelSpreading是由 Dengyong Zhou 等人在他們 2003 年題為“Learning with Local and Global Consistency”的論文中提出的的。半監(jiān)督學(xué)習(xí)的關(guān)鍵是一致性的先驗(yàn)假設(shè),這意味著:附近的點(diǎn)可能具有相同的標(biāo)簽,并且同一結(jié)構(gòu)上的點(diǎn)(通常稱為簇流形)很可能具有相同的標(biāo)簽。
LabelSpreading可以認(rèn)為是LabelPropagation的正則化形式。在圖論中,拉普拉斯矩陣是圖的矩陣表示,拉普拉斯矩陣的公式為:
L是拉普拉斯矩陣,D是度矩陣,A是鄰接矩陣。
下面是一個(gè)簡單的無向圖標(biāo)記的例子和它拉普拉斯矩陣的結(jié)果
本文將使用sonar數(shù)據(jù)集演示如何使用sklearn的LabelSpreading函數(shù)。
這里的庫比上面的多,所以簡單解釋一下:
- Numpy執(zhí)行數(shù)值計(jì)算并創(chuàng)建Numpy數(shù)組
- Pandas處理數(shù)據(jù)
- Sklearn執(zhí)行機(jī)器學(xué)習(xí)操作
- Matplotlib和seaborn來可視化數(shù)據(jù),為可視化數(shù)據(jù)提供統(tǒng)計(jì)信息
- Warning,用于忽略程序執(zhí)行期間出現(xiàn)的警告
導(dǎo)入完成后使用pandas將讀入數(shù)據(jù)集:
我使用seaborn創(chuàng)建了熱圖:-
先做一個(gè)就簡單的預(yù)處理,刪除具有高度相關(guān)性的列,這樣將列數(shù)從 61 減少到 58:
然后對數(shù)據(jù)進(jìn)行打亂重排,這樣在打亂的數(shù)據(jù)集中預(yù)測通常更準(zhǔn)確,復(fù)制一個(gè)數(shù)據(jù)集的副本,并將 y_orig 定義為訓(xùn)練目標(biāo):
使用matplotlib來繪制數(shù)據(jù)點(diǎn)的2D散點(diǎn)圖:-
使用隨機(jī)數(shù)生成器隨機(jī)化數(shù)據(jù)集中60%的標(biāo)簽。然后隨機(jī)標(biāo)簽被分配-1:-
在對數(shù)據(jù)進(jìn)行預(yù)處理之后,定義因變量和自變量,分別為y和X。y變量是最后一列,X變量是剩下的所有部分:-
然后使用sklearn的LabelSpreading算法對未標(biāo)記的行進(jìn)行訓(xùn)練和預(yù)測。
使用這種方法,能夠達(dá)到87.98%的準(zhǔn)確率:-
簡單對比
1、labelspreading中含有alpha=0.2,alpha稱為夾緊系數(shù),指的是采用其鄰居的信息而不是其初始標(biāo)簽的相對量,若為0,表示保留初始標(biāo)簽信息,若為1,表示替換所有初始信息;設(shè)置alpha=0.2,意味著始終保留80%的原始標(biāo)簽信息;
2、labelpropagation使用從數(shù)據(jù)中構(gòu)造的原始相似矩陣,不做修改;labelspreading最小化具有正則化特性的損失函數(shù),對噪聲更加穩(wěn)健,迭代了原始圖的修改版,并通過計(jì)算歸一化拉普拉斯矩陣來標(biāo)準(zhǔn)化邊權(quán)重。
3、同時(shí)LabelSpreading非常占用CPU,物理內(nèi)存占用率還好;LabelPropagation 的CPU占用率還好,非常占用物理內(nèi)存,高緯度數(shù)據(jù)可能會(huì)有一些問題。