半監督式學習有效利用少量標記資料和大量未標記資料提升模型效能,常應用於資料標記成本高昂或資料量龐大的場景。其核心概念是利用標記資料訓練初始模型,再用該模型預測未標記資料的偽標籤,最後結合標記資料和偽標籤資料重新訓練模型。資料增強技術則透過對現有資料進行變換,如新增噪音、縮放、旋轉等,增加訓練資料的多樣性,進而提升模型的泛化能力,避免過擬合。兩種技術結合使用,尤其在標記資料稀缺的回歸任務中,能有效提升模型效能。

監督式學習

在監督式學習中,所有的訓練資料都被標記。

無監督式學習

在無監督式學習中,所有的訓練資料都沒有被標記。

半監督式學習

在半監督式學習中,僅有一小部分資料被標記,絕大多數資料是無標記的。

半監督式學習可以用於生成標記,尤其是在資料標記成本高或資料量大時。以下是半監督式學習的基本步驟:

  1. 收集一小部分標記資料。
  2. 使用標記資料訓練模型。
  3. 使用模型對無標記資料進行預測。
  4. 對預測結果進行評估和最佳化。

半監督式學習可以用於各種應用,例如影像分類、自然語言處理等。以下是半監督式學習的優點:

  • 減少資料標記成本。
  • 提高模型的泛化能力。
  • 可以處理大規模資料。

但是,半監督式學習也有一些挑戰,例如:

  • 需要大量的無標記資料。
  • 需要高質量的標記資料。
  • 需要合適的模型和演算法。

因此,半監督式學習是一種有前途的學習方式,但需要仔細設計和實作。

半監督式機器學習技術:偽標籤法

在處理未標記的資料集時,首先我們會使用一小部分的標記資料集來訓練監督式模型,從而生成額外的偽標記資料集。

第一步:訓練監督式模型

使用小部分的標記資料集來訓練監督式模型,並生成偽標記資料集。

第二步:擴增訓練資料集

使用小部分的標記資料集和第一步生成的偽標記資料集來擴增訓練資料集。

什麼是偽標籤法?

偽標籤法是一種半監督式機器學習技術,透過使用已標記的資料來生成未標記資料的標記。

實驗演示

下載心臟衰竭資料集,並修改資料集以便進行實驗。一部分資料集具有標記,另一部分則無標記。然後,生成未標記資料的偽標記,並將其與原始標記資料集合併,訓練最終模型。

實驗步驟

  1. 匯入必要的庫:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
  1. 下載心臟衰竭資料集:
data = pd.read_csv("heart_failure_dataset.csv", encoding='latin-1')
  1. 分割資料集:
y = data['DEATH_EVENT']  # 輸出變數
x = data.drop('DEATH_EVENT', axis=1)  # 輸入變數
x_train, x_test, y_train, _ = train_test_split(x, y, test_size=0.7)
  1. 訓練模型:
pseudomodel = RandomForestClassifier(n_estimators=10, criterion='entropy', random_state=0)
pseudomodel.fit(x_train, y_train)
  1. 評估模型:
pseudomodel.score(x_train, y_train)
  1. 生成偽標記:
y_new = pseudomodel.predict(x_test)
  1. 合併資料集:
# 合併原始標記資料集和偽標記資料集

圖表翻譯:

  graph LR
    A[原始資料集] -->|分割|> B[標記資料集]
    A -->|分割|> C[未標記資料集]
    B -->|訓練模型|> D[偽標記模型]
    D -->|生成偽標記|> E[偽標記資料集]
    B -->|合併|> E
    E -->|訓練最終模型|> F[最終模型]

內容解密:

在這個實驗中,我們使用了半監督式機器學習技術——偽標籤法,來處理未標記的資料集。首先,我們使用一小部分的標記資料集來訓練監督式模型,從而生成額外的偽標記資料集。然後,我們將原始標記資料集和偽標記資料集合併,訓練最終模型。這種方法可以有效地提高模型的準確性和泛化能力。

機器學習中的半監督式學習和無監督式學習

在機器學習中,半監督式學習和無監督式學習是兩種重要的學習模式。半監督式學習是指使用少量的標記資料和大量的未標記資料進行學習,而無監督式學習是指使用未標記資料進行學習,目的是發現資料中的模式或結構。

半監督式學習

半監督式學習是一種學習模式,使用少量的標記資料和大量的未標記資料進行學習。這種學習模式可以用於處理大量的未標記資料,例如影像、文字等。半監督式學習的目的是使用少量的標記資料來引導模型學習,然後使用大量的未標記資料來改進模型的效能。

例如,在心臟病預測中,半監督式學習可以用於預測患者的心臟病風險。首先,使用少量的標記資料(例如,已知的心臟病患者的資料)來訓練模型,然後使用大量的未標記資料(例如,未知的心臟病患者的資料)來改進模型的效能。

無監督式學習

無監督式學習是一種學習模式,使用未標記資料進行學習,目的是發現資料中的模式或結構。無監督式學習可以用於處理大量的未標記資料,例如客戶分群、影像分類等。

例如,在客戶分群中,無監督式學習可以用於將客戶分成不同的群體,根據客戶的購買行為、收入等特徵。這種學習模式可以幫助企業瞭解客戶的需求和偏好,從而制定有效的營銷策略。

K-means 聚類演算法

K-means 聚類演算法是一種常用的無監督式學習演算法,用於將資料分成不同的群體或聚類。K-means 聚類演算法的目的是找到資料中的模式或結構,然後將資料分成不同的群體。

例如,在成人收入資料集中,K-means 聚類演算法可以用於將資料分成不同的群體,根據收入、教育程度等特徵。這種學習模式可以幫助我們瞭解不同群體的特徵和需求,從而制定有效的政策或策略。

實作 K-means 聚類演算法

以下是使用 Python 實作 K-means 聚類演算法的範例:

from sklearn.cluster import KMeans
import numpy as np

# 載入資料
data = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])

# 初始化 K-means 聚類演算法
kmeans = KMeans(n_clusters=2, init='random', random_state=0)

# 執行 K-means 聚類演算法
kmeans.fit(data)

# 預測聚類結果
labels = kmeans.labels_

print(labels)

這個範例使用 K-means 聚類演算法將資料分成兩個群體,根據收入和教育程度等特徵。結果顯示,資料被分成兩個群體,分別是 [0, 0, 1, 1][1, 1, 0, 0]

K-means 演算法實作與評估

K-means 演算法是一種常用的無監督式學習演算法,主要用於資料分群。以下是使用 K-means 演算法進行資料分群的步驟:

步驟 1:初始化 K-means 模型

from sklearn.cluster import KMeans
import numpy as np

# 初始化 K-means 模型
kmeans = KMeans(n_clusters=3)

在這個步驟中,我們初始化了一個 K-means 模型,指定了分群的數量(n_clusters)。

步驟 2:對資料進行標準化

from sklearn.preprocessing import StandardScaler

# 對資料進行標準化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

在這個步驟中,我們使用 StandardScaler 對資料進行標準化,以確保所有特徵的尺度相同。

步驟 3:執行 K-means 演算法

# 執行 K-means 演算法
kmeans.fit(X_scaled)

在這個步驟中,我們執行了 K-means 演算法,將標準化的資料輸入到模型中。

步驟 4:更新分群中心

while True:
    # 指派資料點到分群
    cluster_labels = kmeans.predict(X_scaled)

    # 計算新的分群中心
    new_centroids = np.array([X_scaled[cluster_labels == i].mean(axis=0) for i in range(n_clusters)])

    # 檢查收斂
    if np.allclose(kmeans.cluster_centers_, new_centroids):
        break

    # 更新分群中心
    kmeans.cluster_centers_ = new_centroids

    # 更新 inertia
    inertia = kmeans.inertia_

在這個步驟中,我們更新了分群中心,直到模型收斂。

步驟 5:計算評估指標(Dunn’s Index)

from sklearn.metrics.pairwise import pairwise_distances
from scipy.spatial.distance import pdist

# 計算分群間距離
intercluster_distances = pairwise_distances(kmeans.cluster_centers_)

# 計算分群內距離
intracluster_distances = np.array([np.max(pdist(X_scaled[cluster_labels == i])) for i in range(n_clusters)])

# 計算 Dunn’s Index
min_intercluster_distances = np.min(intercluster_distances[~np.eye(n_clusters, dtype=bool)])
dunn_index = min_intercluster_distances / np.max(intracluster_distances)

在這個步驟中,我們計算了 Dunn’s Index,該指標用於評估分群的質量。

內容解密:

在上述步驟中,我們使用 K-means 演算法對資料進行分群,並計算了 Dunn’s Index 作為評估指標。K-means 演算法是一種簡單而有效的分群演算法,但它需要事先指定分群的數量。Dunn’s Index 是一個用於評估分群質量的指標,它考慮了分群間距離和分群內距離。

圖表翻譯:

  graph LR
    A[資料] --> B[標準化]
    B --> C[K-means 演算法]
    C --> D[分群中心更新]
    D --> E[收斂檢查]
    E -->|收斂| F[結束]
    E -->|未收斂| D
    F --> G[計算 Dunn’s Index]
    G --> H[評估分群質量]

在這個圖表中,我們展示了 K-means 演算法的流程,從資料標準化到分群中心更新和收斂檢查,最終計算 Dunn’s Index 並評估分群質量。

K-means 演算法與資料標籤

K-means 演算法是一種常用的無監督式學習方法,主要用於將資料分成 K 個聚類。這個演算法的目的是找到每個聚類的中心(centroid),然後將每個資料點分配到最接近的中心。

K-means 演算法步驟

  1. 初始化: 初始化 K 個中心,通常是隨機選擇。
  2. 分配: 將每個資料點分配到最接近的中心。
  3. 更新: 更新每個中心的位置,通常是計算每個聚類的平均值。
  4. 重複: 重複步驟 2 和 3,直到中心位置不再改變。

Dunn 指數

Dunn 指數是一種用於評估 K-means 演算法的指標,計算每個聚類的內部凝聚度和彼此之間的距離。Dunn 指數越大,表示聚類越分散,越容易區分。

K-means 演算法實作

from sklearn.cluster import KMeans
import numpy as np

# 初始化 K-means 演算法
kmeans = KMeans(n_clusters=5)

# 將資料分配到 K 個聚類
kmeans.fit(X)

# 獲取聚類標籤
labels = kmeans.labels_

# 獲取中心位置
centers = kmeans.cluster_centers_

半監督式學習

半監督式學習是一種學習方法,結合了監督式學習和無監督式學習的優點。這種方法可以使用少量的標籤資料和大量的無標籤資料來訓練模型。

資料增強

資料增強是一種用於增加資料多樣性的方法,通常是透過新增噪音或變換資料來實作。

K-means 聚類與半監督式學習

K-means 聚類可以用於半監督式學習中,將無標籤資料分配到不同的聚類,然後使用標籤資料來訓練模型。

Snorkel 庫

Snorkel 庫是一種用於半監督式學習的庫,提供了許多工具和方法來實作半監督式學習。

房價資料的回歸分析

使用 K-means 演算法為房價資料進行標籤分類,以利於回歸分析。透過 Python 程式庫的運用,玄貓將引導您如何為回歸資料生成標籤。同時,您也將掌握解決回歸挑戰的專業知識,確保您的資料驅動專案取得成功。

技術需求

我們將使用加州房價資料集。您可以從 GitHub 下載 housing.csv 檔案,路徑為:Python/tree/main/datasets。另外,需要安裝 Python 3.7+ 和設定以下任一 Python 編輯器:VS Code IDE、Anaconda、Jupyter Notebook 或 Replit。建議您在 GitHub 上跟隨完整程式碼,以便更好地理解本章節。

使用摘要統計生成房價標籤

在本文中,我們將使用小部分已標籤的房價資料的摘要統計來生成房價標籤。這在現實世界的專案中非常有用,特別是當回歸任務中缺乏足夠的標籤資料時。透過玄貓的方法,我們將解碼資料的底層趨勢,量化資料的本質,並利用距離度量來揭示最接近的匹配標籤,賦予未標籤的資料點以其已標籤的對應點的智慧。

首先,讓我們使用 pandas 載入 housing.csv 檔案中的資料:

import pandas as pd

# 載入已標籤的資料
df_labeled = pd.read_csv('housing.csv')

載入資料後,我們使用 groupbydescribe 方法計算每個特徵的摘要統計。這給了我們每個特徵的均值、標準偏差、最小值、最大值和四分位數值:

# 計算每個特徵的摘要統計
summary_stats = df_labeled.groupby('median_house_value').describe()

內容解密:

上述程式碼的作用是使用 groupby 方法將資料按照 median_house_value 進行分組,然後使用 describe 方法計算每個分組中每個特徵的摘要統計。這樣,我們就可以得到每個特徵的均值、標準偏差、最小值、最大值和四分位數值。

圖表翻譯:

  flowchart TD
    A[載入資料] --> B[計算摘要統計]
    B --> C[生成房價標籤]
    C --> D[進行回歸分析]

此圖表描述了從載入資料到進行回歸分析的過程。首先,我們載入資料,然後計算摘要統計,接著生成房價標籤,最後進行回歸分析。

最近鄰近法的實作

最近鄰近法(Nearest Neighbor)是一種基本的機器學習演算法,廣泛用於分類和回歸問題。以下是最近鄰近法的實作步驟:

步驟1:載入未標記資料

首先,我們需要載入未標記的資料。這些資料不包含標籤,我們的目的是根據它們的特徵將它們分類到最接近的類別中。

import pandas as pd

# 載入未標記資料
df_unlabeled = pd.read_csv('housing_unlabeled.csv')

步驟2:計算距離

距離是最近鄰近法的核心概念。距離的計算方法有很多種,例如歐幾裡得距離、曼哈頓距離等。在這裡,我們使用歐幾裡得距離作為例子。歐幾裡得距離的計算公式為: [ d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2} ] 這裡,( (x_1, y_1) ) 和 ( (x_2, y_2) ) 是兩個點在平面上的坐標。

步驟3:迭代未標記資料

我們需要對每一行未標記資料進行迭代,計算它與每個標籤的距離。

for i, row in df_unlabeled.iterrows():
    # 初始化距離字典
    dists = {}
    
    # 迭代每個標籤
    for target in summary_stats.index:
        dist = 0
        
        # 迭代每個特徵
        for col in df_unlabeled.columns:
            if col != 'median_house_value':
                # 計算距離
                dist += (row[col] - summary_stats.loc[target, (col, 'mean')]) ** 2
        
        # 儲存距離
        dists[target] = dist
    
    # 選擇最小距離的標籤
    predicted_target = min(dists, key=dists.get)

步驟4:選擇最小距離的標籤

對於每一行未標記資料,我們計算它與每個標籤的距離之後,選擇最小距離的標籤作為預測標籤。

內容解密:

以上程式碼展示瞭如何使用最近鄰近法實作分類任務。首先,我們載入未標記資料,然後迭代每一行資料,計算它與每個標籤的距離。最後,選擇最小距離的標籤作為預測標籤。這個過程需要對每一行資料進行迭代,因此時間複雜度較高。但是,這種方法簡單易懂,適合小型資料集的分類任務。

圖表翻譯:

  flowchart TD
    A[載入未標記資料] --> B[迭代每一行資料]
    B --> C[計算距離]
    C --> D[選擇最小距離的標籤]
    D --> E[預測標籤]

此圖表展示了最近鄰近法的流程。首先載入未標記資料,然後迭代每一行資料,計算距離,選擇最小距離的標籤,最後預測標籤。

使用半監督式學習標記回歸資料

半監督式學習是一種結合了標記資料和未標記資料來提高預測模型準確性的機器學習方法。在半監督式學習中,少量的標記資料與大量的未標記資料一起用於訓練模型。這種方法的想法是,未標記資料可以提供有關資料中潛在模式的額外資訊,有助於模型學習。

偽標記法

偽標記法是一種半監督式學習技術,使用在標記資料上訓練的模型來預測未標記資料的標記。這些預測的標記被稱為偽標記。然後,模型結合標記資料和偽標記資料來重新訓練和提高模型的準確性。

偽標記法的過程包括以下步驟:

  1. 訓練模型: 使用標記資料訓練一個監督式學習模型。
  2. 預測標記: 使用訓練好的模型預測未標記資料的標記。
  3. 結合資料: 結合標記資料和預測的標記資料,形成一個新的、更大的訓練資料集。
  4. 重新訓練模型: 使用結合的資料重新訓練模型,以提高模型的準確性。
  5. 重複過程: 重複步驟2-4,直到模型收斂。

實作偽標記法

以下是使用Python和scikit-learn庫實作偽標記法的例子:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

# 載入資料
data = pd.read_csv("housing_data.csv")

# 將資料分割為訓練集和測試集
train_data, test_data, train_labels, test_labels = train_test_split(
    data.drop('price', axis=1), data['price'], test_size=0.2)

# 訓練線性回歸模型
regressor = LinearRegression()
regressor.fit(train_data, train_labels)

# 使用訓練好的模型預測未標記資料的標記
predicted_labels = regressor.predict(test_data)

# 結合標記資料和預測的標記資料
combined_data = pd.concat([train_data, test_data])
combined_labels = pd.concat([train_labels, predicted_labels])

# 重新訓練模型
regressor.fit(combined_data, combined_labels)

這個例子展示瞭如何使用偽標記法來提高線性回歸模型的準確性。首先,模型在標記資料上進行訓練,然後使用這個模型預測未標記資料的標記。接著,結合標記資料和預測的標記資料,重新訓練模型以提高準確性。

圖表翻譯:

  flowchart TD
    A[載入資料] --> B[分割資料]
    B --> C[訓練模型]
    C --> D[預測標記]
    D --> E[結合資料]
    E --> F[重新訓練模型]
    F --> G[提高準確性]

圖表翻譯:

此圖表展示了偽標記法的過程。首先,載入資料,然後分割資料為訓練集和測試集。接著,訓練模型,使用模型預測未標記資料的標記,結合標記資料和預測的標記資料,重新訓練模型,以提高模型的準確性。

使用資料增強法生成合成資料

資料增強法是一種用於生成額外標記資料的技術,特別是在標記資料有限的回歸任務中。以下是使用資料增強法生成合成資料的步驟:

  1. 收集標記資料:收集有限的標記資料,用於回歸任務。
  2. 定義資料增強技術:定義一組可以用於生成新資料點的資料增強技術。對於回歸任務,常見的資料增強技術包括新增噪音、縮放和旋轉資料。
  3. 生成增強資料:使用資料增強技術生成新的資料點,從可用的標記資料中。新的資料點將具有根據原始資料點的標記。
  4. 訓練模型:使用增強資料和原始標記資料訓練一個回歸模型。這一步涉及使用監督學習演算法適配模型到合並的資料集中。
  5. 評估模型:評估訓練模型在驗證集上的效能。這一步涉及測試模型預測的準確性在新的、未見的資料上。
  6. 微調模型:根據驗證集上的效能微調模型。這一步涉及調整模型的超引數以提高其在驗證集上的效能。
  7. 測試模型:最後,測試模型在測試集上的效能,以評估其泛化能力。

透過使用資料增強法,可以訓練一個更準確的回歸模型,即使只有有限的標記資料。然而,使用資料增強技術時必須小心,以確保生成的資料是有意義的和代表原始資料分佈的。

在數值資料的背景下,應該關注以下與給定資料集相關且有意義的資料增強技術:

  • 新增噪音:新增隨機噪音到數值特徵和標記,可以模擬資料中的變化和不確定性。
  • 縮放:縮放數值特徵,可以模擬單位或大小的變化。
  • 抖動:引入小的擾動到數值,可以模擬測量錯誤或波動。
  • 異常注入:引入異常,可以幫助模型對極端值更強壯。
  • 隨機排序:隨機排序資料點,可以防止模型學習任何序列相關的偏差。

記住,資料增強技術的選擇應該根據資料集的特徵和要解決的問題。技術應該新增有意義的變化,與資料的性質一致。

現在,讓我們看看如何為房屋價格資料集生成增強資料,以預測標記。讓我們匯入必要的庫,載入房屋價格資料集,並定義噪音、縮放和旋轉資料增強函式,如下所示:

import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split

import random

然後,我們載入儲存在名為 labeled_data.csv 的 CSV 檔案中的標記資料,具有特徵列和一個名為 price 的目標變數列:

# 載入可用的標記資料
labeled_data = pd.read_csv('labeled_data.csv')

…(餘下程式碼)…

資料增強技術:增加噪音和縮放

資料增強是一種用於人工智慧和機器學習的技術,旨在增加訓練資料的多樣性和數量。這可以透過對現有資料進行變換,例如增加噪音或縮放,來實作。以下是使用 Python 實作的兩種資料增強技術:增加噪音和縮放。

增加噪音

增加噪音是一種常見的資料增強技術,透過在資料中新增隨機噪音來增加其多樣性。以下是增加噪音的 Python 程式碼:

import numpy as np
import pandas as pd

# 載入資料
df = pd.read_csv("labeled_data.csv")

# 定義增加噪音的函式
def add_noise(x, std):
    noise = np.random.normal(0, std, len(x))
    return x + noise

# 定義噪音範圍
noise_range = [0.1, 0.2, 0.3]

# 生成增強資料
augmented_data = []
for _, row in df.iterrows():
    for noise in noise_range:
        new_row = row.copy()
        new_row["price"] = add_noise(row["price"], noise)
        augmented_data.append(new_row)

在這個例子中,我們定義了一個 add_noise 函式,該函式在輸入資料中新增隨機噪音。然後,我們定義了一個噪音範圍 noise_range,並使用迴圈生成增強資料。

縮放

縮放是一種資料增強技術,透過將資料乘以一個因子來增加其多樣性。以下是縮放的 Python 程式碼:

# 定義縮放函式
def scale(x, factor):
    return x * factor

# 定義縮放範圍
scale_range = [0.5, 0.75, 1.25, 1.5]

# 生成增強資料
augmented_data = []
for _, row in df.iterrows():
    for factor in scale_range:
        new_row = row.copy()
        new_row["price"] = scale(row["price"], factor)
        augmented_data.append(new_row)

在這個例子中,我們定義了一個 scale 函式,該函式將輸入資料乘以一個因子。然後,我們定義了一個縮放範圍 scale_range,並使用迴圈生成增強資料。

內容解密:

  • add_noise 函式在輸入資料中新增隨機噪音。
  • scale 函式將輸入資料乘以一個因子。
  • noise_rangescale_range 定義了噪音和縮放的範圍。
  • 迴圈生成增強資料,並將其新增到 augmented_data 列表中。

圖表翻譯:

  flowchart TD
    A[載入資料] --> B[定義增加噪音函式]
    B --> C[定義噪音範圍]
    C --> D[生成增強資料]
    D --> E[定義縮放函式]
    E --> F[定義縮放範圍]
    F --> G[生成增強資料]

這個流程圖顯示了資料增強的過程,包括載入資料、定義增加噪音和縮放函式、定義範圍和生成增強資料。

使用資料增強法進行迴歸分析

資料增強法(Data Augmentation)是一種用於增加訓練資料數量和多樣性的技術,常用於深度學習模型的訓練中。以下是使用資料增強法進行迴歸分析的步驟:

從技術架構視角來看,半監督式學習,特別是偽標籤法,巧妙地利用了少量標記資料和大量未標記資料的優勢,為解決標記資料稀缺的機器學習問題提供了一條有效途徑。透過初始模型對未標記資料生成偽標籤,再結合已標記資料重新訓練模型,有效擴充了訓練集,提升了模型的泛化能力。然而,偽標籤的質量直接影響最終模型的效能,因此如何評估和控制偽標籤的準確性是技術上的關鍵挑戰。此外,如何選擇合適的基礎模型以及調校模型引數也至關重要,需要根據具體的資料集和應用場景進行調整。展望未來,隨著深度學習和主動學習等技術的發展,預計半監督式學習將在更多領域得到更廣泛的應用,例如在醫療影像分析、自然語言處理等領域,利用大量的未標記資料提升模型效能,降低標記成本。對於追求資料效率的企業和研究機構而言,深入研究和應用半監督式學習將是提升模型效能和降低成本的關鍵策略。