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