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