LangChain 作為一個連線大型語言模型(LLM)和外部資料來源的框架,搭配 OpenAI 強大的 GPT-4 模型,能有效提升資料分析效率。藉由 Pandas DataFrame Agent,使用者可以用自然語言查詢 CSV 資料集,代理人會自動生成並執行 Pandas 和 Python 程式碼,完成資料載入、分析及結果輸出。
LangChain 的 Pandas DataFrame Agent 接收使用者查詢後,會先解讀意圖並分析查詢內容,接著產生執行分析所需的指令。代理人會持續分析工具的回應,並判斷是否符合使用者預期。若不符合,則會調整後續步驟,重複此過程直到取得滿意的結果。這個機制讓非技術人員也能輕鬆獲取資料洞見,加速資料驅動的決策過程,並簡化探索性分析流程。
graph LR A[使用者查詢] --> B{LangChain 代理人}; B -- 解讀意圖 --> C[分析查詢]; C --> D[生成指令]; D --> E[執行分析]; E --> F{結果符合預期?}; F -- Yes --> G[輸出結果]; F -- No --> D;
此流程圖描述 LangChain 代理人處理使用者查詢的流程。代理人接收查詢後,會解讀意圖並分析查詢,接著生成指令並執行分析。代理人會持續檢查分析結果是否符合預期,直到獲得滿意結果後才會輸出。
建立標籤函式與訓練標籤模型
在機器學習的分類任務中,標籤資料至關重要。然而,手動標記資料耗時費力。利用 LLM 和程式設計方法可以有效預測標籤並自動標記資料。透過 LangChain 的範本,可以將表格資料轉換為序列化的文字資料,再利用少數樣本例子進行預測。
import pandas as pd
from snorkel.labeling import labeling_function, PandasLFApplier
from snorkel.labeling.model import LabelModel
# 定義常數
HIGH_INCOME = 1
LOW_INCOME = 0
ABSTAIN = -1
# 載入資料
df = pd.read_csv('income.csv')
# 定義輸入和輸出變數
X = df.drop('income', axis=1)
y = df['income']
@labeling_function()
def age_rule(x):
if 28 <= x['age'] <= 58:
return HIGH_INCOME
else:
return LOW_INCOME
@labeling_function()
def education_rule(x):
if x['education'] in ['bachelor', 'master']:
return HIGH_INCOME
else:
return LOW_INCOME
lfs = [age_rule, education_rule]
applier = PandasLFApplier(lfs=lfs)
L_train = applier.apply(df=X)
label_model = LabelModel(cardinality=2, verbose=True)
label_model.fit(L_train=L_train, n_epochs=500, lr=0.001, log_freq=100)
predicted_labels = label_model.predict(L=L_train)
程式碼示範如何使用 Snorkel 建立和訓練標籤模型。首先定義標籤常數和載入資料,接著定義兩個標籤函式 age_rule
和 education_rule
,分別根據年齡和教育程度判斷收入高低。接著使用 PandasLFApplier
將標籤函式應用到資料集,產生標籤矩陣 L_train
。最後使用 LabelModel
訓練標籤模型,並使用訓練好的模型預測標籤。
graph LR A[載入資料] --> B[定義標籤函式]; B --> C[應用標籤函式]; C --> D[訓練標籤模型]; D --> E[預測標籤];
此流程圖展示了使用 Snorkel 建立和訓練標籤模型的流程,包含載入資料、定義標籤函式、應用標籤函式、訓練標籤模型以及預測標籤等步驟。
使用 Compose 函式庫進行資料標記
Compose 函式庫提供簡潔的 API 進行資料標記。以下範例示範如何使用 Compose 計算客戶在未來五天內的總消費金額:
import composeml as cp
from demo.next_purchase import load_sample
df = load_sample()
def total_purchase_amount(df):
return df['amount'].sum()
label_maker = cp.LabelMaker(
target_dataframe_name="customer_id",
time_index="transaction_time",
labeling_function=total_purchase_amount,
window_size="5d",
)
labels = label_maker.search(
df.sort_values('transaction_time'),
num_examples_per_instance=-1,
gap=1,
verbose=True,
)
labels = labels.threshold(300)
此程式碼片段示範使用 Compose 函式庫進行資料標記。首先載入範例資料和定義 total_purchase_amount
函式計算總消費金額。接著建立 LabelMaker
物件,設定目標資料框、時間索引、標記函式和時間視窗。最後使用 search
方法搜尋並提取標籤,並設定閾值為 300。
graph LR A[載入資料] --> B[定義標記函式]; B --> C[建立 LabelMaker]; C --> D[搜尋標籤]; D --> E[設定閾值];
此流程圖展示了使用 Compose 函式庫進行資料標記的流程,包含載入資料、定義標記函式、建立 LabelMaker、搜尋標籤以及設定閾值等步驟。
半監督式學習
半監督式學習結合少量標記資料和大量未標記資料進行模型訓練,有效降低標記成本。其核心概念是利用未標記資料的結構資訊提升模型泛化能力。常見的半監督式學習方法包括自訓練、協同訓練和圖半監督式學習等。
半監督式學習的優勢在於能有效利用未標記資料提升模型效能,尤其在標記資料取得困難或成本高昂的場景下更具價值。
本文介紹瞭如何使用 LangChain 和 OpenAI 進行資料分析和標籤預測,並探討了標籤函式建立、標籤模型訓練、Compose 函式庫應用以及半監督式學習等關鍵技術,提供實用的程式碼範例和流程圖,讓讀者更深入瞭解這些技術在資料科學領域的應用價值。
互動部分
互動部分包含了一個圖表,展示了變數之間的關聯。這有助於使用者瞭解變數之間的關係和模式。
相關性部分
相關性部分以熱力圖的形式顯示了變數之間的相關性,同時也提供了相關係數的表格形式。熱力圖使用顏色強度來表示值,冷色(如藍色或綠色)表示低值,暖色(如紅色或橙色)表示高值。每個單元格的顏色強度對應於它所代表的值的大小。
缺失值部分
缺失值部分顯示了資料集中總值的數量,並提供了對缺失值的理解。這部分包含兩個標籤:計數圖和矩陣圖。
- 計數圖顯示了每個變數的計數,若所有變數的計數均等於資料集的行數,則表示資料集中沒有缺失值。
- 矩陣圖提供了變數之間的關聯資訊,幫助使用者快速識別資料集中可能存在的缺失值或模式。
使用 LangChain 和 OpenAI 進行資料分析
在這個章節中,我們將探討如何使用 LangChain 和 OpenAI 進行資料分析。LangChain 是一個框架,允許我們將大型語言模型(LLM)與外部資料源連線起來。OpenAI 的 GPT-4 是一個強大的 LLM,可以用於生成人類般的文字。
LangChain Pandas DataFrame Agent
LangChain 的 Pandas DataFrame Agent 是一個可以自動響應自然語言查詢的代理人。使用者可以上傳一個 CSV 資料集,並提出一個查詢,例如「什麼是去年的前三名銷量產品?」代理人會解釋使用者的意圖,並撰寫和執行 Pandas 和 Python 程式碼,以載入資料、分析資料和生成回應。
使用 LangChain 進行資料分析的步驟
- 安裝 LangChain 和 LangChain Experimental 庫。
- 匯入必要的模組,包括 AzureChatOpenAI、Pandas DataFrame Agent 和其他庫。
- 配置 OpenAI 端點和金鑰。
- 載入 CSV 資料到 Pandas DataFrame。
- 例項化 GPT-4 LLM。
- 建立 Pandas DataFrame 代理人,傳遞 GPT-4 例項和 DataFrame。
LangChain Pandas DataFrame Agent 的工作原理
當使用者向 LangChain 的 Pandas DataFrame 代理人提出查詢時,代理人會:
- 接收使用者的查詢。
- 解釋使用者的意圖和分析查詢。
- 生成必要的命令以執行分析的第一步。
- 分析工具的回應,確定是否是使用者想要的結果。
- 如果不是,代理人會分析下一步應該做什麼,並重複此過程。
- 代理人會持續生成命令,直到獲得使用者想要的回應。
使用 LangChain 和 OpenAI 進行資料分析的優點
使用 LangChain 和 OpenAI 進行資料分析可以:
- 將資料分析民主化,允許非技術人員獨立提取資料見解。
- 加快資料驅動的決策過程。
- 簡化探索性分析和創意。
在這個章節中,我們使用 LangChain 和 OpenAI 進行資料分析。LangChain 是一個框架,允許我們將大型語言模型與外部資料源連線起來。OpenAI 的 GPT-4 是一個強大的 LLM,可以用於生成人類般的文字。使用 LangChain 和 OpenAI 進行資料分析可以將資料分析民主化,簡化探索性分析和創意,並加快資料驅動的決策過程。
flowchart TD A[使用者查詢] --> B[LangChain 代理人] B --> C[解釋意圖和分析查詢] C --> D[生成命令] D --> E[分析工具的回應] E --> F[確定結果] F --> G[代理人回應]
這個圖表展示了 LangChain 代理人如何工作。使用者提出查詢,LangChain 代理人解釋意圖和分析查詢,生成命令,分析工具的回應,確定結果,然後代理人回應使用者。這個過程可以重複多次,直到獲得使用者想要的結果。
預測標籤與資料標記
在本章中,我們將探討如何使用大型語言模型(LLMs)和程式設計方法為分類任務中的表格資料進行標籤預測和資料標記。實際應用中,並非所有資料都具有標籤,但為了訓練機器學習模型和微調基礎模型,我們需要準備有標籤的資料。手動標記大量資料或檔案既耗時又昂貴,尤其是在共享私人資料給組織外的眾包團隊時,安全性也成了一大問題。
預測標籤與程式設計
首先,我們來探討如何使用LLMs預測表格資料的標籤。這個過程涉及將資料轉換為序列化的文字資料,然後利用LangChain的範本將資料行轉換為流暢的句子或段落。接下來,我們可以利用這些文字資料作為少數拍攝例子,包括問題和對應的標籤(答案),然後將這些例子送到模型中進行預測。
LangChain範本
LangChain範本允許我們將資料行轉換為自然語言文字。例如,假設我們有一個包含病人ID、年齡、血壓、糖尿病和死亡事件等欄位的表格資料。利用LangChain範本,我們可以將每一行資料轉換為一段描述病人健康狀態的文字。
程式設計方法
除了使用LLMs外,我們還可以使用程式設計方法來標記資料。這涉及建立標籤函式並將其應用於大量未標記的資料以自動標記大型訓練資料集。另一個方法是使用半監督學習來建立偽標籤,K-means聚類則是另一種方法,透過將相似的資料集進行分組並標記這些分組。
Snorkel庫
為了實作程式設計方法,我們需要安裝Snorkel庫,可以使用以下命令:
%pip install snorkel
然後,我們可以下載所需的資料集和Python指令碼。
半監督學習
半監督學習是一種方法,透過使用少量有標籤的資料和大量未標記的資料來訓練模型。這種方法可以節省手動標記大量資料的時間和成本。
K-means聚類
K-means聚類是一種無監督學習演算法,透過將相似的資料點分組在一起形成簇,並將這些簇作為標籤。這種方法可以用於標記具有相似特徵的資料。
資料前處理與標籤函式建立
首先,我們需要載入所需的函式庫和資料。假設我們的資料存放在一個名為 income.csv
的檔案中,我們可以使用 Pandas 來載入資料。
import pandas as pd
# 載入資料
df = pd.read_csv('income.csv')
接下來,我們需要定義輸入和輸出變數。假設我們的目標是預測 income
這一欄位的值,我們可以使用以下程式碼:
# 定義輸入和輸出變數
x = df.iloc[:, :-1]
y = df['income']
標籤函式建立
標籤函式是用來實作標籤模型的規則。為了建立標籤函式,我們需要先定義一些常數和規則。根據提供的資料, 我們可以定義以下規則:
- 年齡規則:如果年齡在 28 到 58 之間,則收入大於 $50K;否則,收入小於 $50K。
- 教育規則:如果教育程度是學士或碩士,則收入大於 $50K;否則,收入小於 $50K。
- 工作時間規則:如果工作時間大於 40 小時,則收入大於 $50K;否則,收入小於 $50K。
- 工作類別規則:如果工作類別是自僱人或聯邦政府,則收入大於 $50K;否則,收入小於 $50K。
根據這些規則,我們可以定義以下常數:
# 定義常數
income_high = 1
income_low = 0
abstain = -1
現在,我們可以建立標籤函式了。標籤函式需要根據規則傳回相應的標籤值。以下是四個標籤函式的範例:
def age_rule(row):
if 28 <= row['age'] <= 58:
return income_high
else:
return income_low
def education_rule(row):
if row['education'] in ['bachelor', 'master']:
return income_high
else:
return income_low
def working_hours_rule(row):
if row['working_hours'] > 40:
return income_high
else:
return income_low
def work_class_rule(row):
if row['work_class'] in ['Self-emp-inc', 'Federal-gov']:
return income_high
else:
return income_low
以上程式碼定義了四個標籤函式,每個函式根據不同的規則傳回相應的標籤值。這些函式可以用來建立標籤模型,以便預測收入是否大於 $50K。
以下是使用 Mermaid 語法繪製的流程圖,展示了標籤函式的邏輯:
flowchart TD A[輸入資料] --> B[年齡規則] B -->|年齡在 28 到 58 之間| C[收入大於 $50K] B -->|年齡不在 28 到 58 之間| D[收入小於 $50K] A --> E[教育規則] E -->|教育程度是學士或碩士| C E -->|教育程度不是學士或碩士| D A --> F[工作時間規則] F -->|工作時間大於 40 小時| C F -->|工作時間不大於 40 小時| D A --> G[工作類別規則] G -->|工作類別是自僱人或聯邦政府| C G -->|工作類別不是自僱人或聯邦政府| D
這個流程圖展示了四個標籤函式的邏輯,根據不同的規則傳回相應的標籤值。
年齡規則函式
年齡規則函式用於檢查一個人的年齡是否大於28歲;如果是,則收入大於$50K。這個函式是使用@labeling_function()
裝飾器定義的。這個裝飾器可以將Python函式轉換為傳回標籤的函式。讓我們將這個裝飾器應用於年齡函式,以根據年齡傳回標籤:
@labeling_function()
def 年齡規則(record):
if record['年齡'] < 28 and record['年齡'] > 58:
return 低收入
elif record['年齡'] > 28 and record['年齡'] < 58:
return 高收入
else:
return 不確定
稍後,我們將使用Pandas LF應用器將這個年齡規則標籤函式應用於未標籤的收入資料集,從而傳回每個觀察值的標籤。
教育規則函式
教育規則函式用於檢查一個人的教育程度是否為學士或碩士;如果是,則收入大於$50K。這個標籤函式是使用@labeling_function()
裝飾器定義的:
@labeling_function()
def 教育規則(record):
if record['教育'] == "學士" or record['教育'] == "碩士":
return 高收入
else:
return 低收入
稍後,我們將使用Pandas LF應用器將這個教育規則標籤函式應用於未標籤的收入資料集,從而傳回每個觀察值的標籤。
每週工作小時規則函式
每週工作小時規則函式用於檢查一個人的每週工作小時是否大於40小時;如果是,則收入大於$50K。這個標籤函式是使用@labeling_function()
裝飾器定義的:
@labeling_function()
def 每週工作小時規則(record):
if record['每週工作小時'] > 40 or record['每週工作小時'] < 60:
return 高收入
這些規則函式是使用@labeling_function()
裝飾器定義的,該裝飾器可以將Python函式轉換為傳回標籤的函式。這些函式可以用於將未標籤的收入資料集轉換為標籤資料集。
flowchart TD A[收入資料集] --> B[年齡規則函式] B --> C[教育規則函式] C --> D[每週工作小時規則函式] D --> E[標籤資料集]
這個流程圖顯示瞭如何使用這些規則函式將未標籤的收入資料集轉換為標籤資料集。
標記函式應用與標籤模型建立
在前面的步驟中,我們已經定義了多個標記函式(labeling functions),用於根據不同的條件為收入資料集賦予標籤。現在,我們將使用 Pandas LF 應用器(Pandas LFApplier)將這些標記函式應用於未標記的收入資料集,以獲得標籤矩陣(label matrix)。
收入標記函式
首先,我們定義了一個根據年齡、教育程度、每週工作小時數和工作類別等條件賦予標籤的函式。例如,根據年齡和教育程度的標記函式可以如下所定義:
@labeling_function()
def age(record):
if record['age'] > 30:
return income_high
else:
return income_low
工作類別標記函式
工作類別標記函式用於檢查個人的工作類別是否大於自僱或聯邦政府;如果是,則收入大於 $50K。這個函式可以如下所定義:
@labeling_function()
def work_class(record):
if record['workclass'] == "Self-emp-inc" or record['workclass'] == "Federal-gov":
return income_high
else:
return income_low
建立標籤模型
現在,我們將使用 Pandas LF 應用器將所有定義的標記函式應用於未標記的收入資料集:
lfs = [age, education, hours_per_week, work_class]
from snorkel.labeling import PandasLFApplier
applier = PandasLFApplier(lfs=lfs)
L_train = applier.apply(df=x)
這裡,L_train
是應用標記函式後傳回的標籤矩陣。對於每個標記函式,將傳回一個標籤(-1、1 或 0)。由於我們建立了四個標記函式,因此每個觀察將傳回四個標籤。標籤矩陣的大小將為 [n*m],其中 n 是觀察數,m 是標記函式的數量,也就是每個觀察的標籤數量。
訓練標籤模型
接下來,我們將使用傳回的標籤矩陣 L_train
訓練一個標籤模型:
from snorkel.labeling.model.label_model import LabelModel
label_model = LabelModel(verbose=False)
label_model.fit(L_train=L_train, n_epochs=1000, seed=100)
預測標籤
最後,我們使用訓練好的標籤模型預測標籤:
predicted_labels = label_model.predict(L_train)
這些預測的標籤可以用於下游任務,例如收入預測或其他相關分析。透過這個過程,我們成功地將標記函式應用於未標記的資料集,並建立了一個標籤模型來預測收入標籤。
使用 Compose 庫進行資料標記
Compose 是一個開源的 Python 庫,用於生成監督式機器學習的標記。它使用 LabelMaker 從歷史資料中建立標記。以下是使用 Compose 庫進行資料標記的步驟:
安裝 Compose 庫
首先,需要安裝 Compose 庫,可以使用 pip 安裝:
pip install composeml
載入示例資料
接下來,載入示例資料:
import composeml as cp
from demo.next_purchase import load_sample
df = load_sample()
定義標記函式
定義一個標記函式,用於計算客戶在未來五天內的總購買金額:
def amount_spent(df):
total = df['amount'].sum()
return total
建立 LabelMaker
建立 LabelMaker 物件,用於生成標記:
label_maker = cp.LabelMaker(
target_dataframe_name="customer_id",
time_index="transaction_time",
labeling_function=amount_spent,
window_size="5d",
)
搜尋和提取標記
搜尋和提取標記:
labels = label_maker.search(
df.sort_values('transaction_time'),
num_examples_per_instance=-1,
gap=1,
verbose=True,
)
轉換標記
轉換標記,設定閾值為 300:
labels = labels.threshold(300)
檢視標記
檢視生成的標記:
labels.head()
這樣,就可以使用 Compose 庫生成監督式機器學習的標記。
半監督式學習
半監督式學習是一種學習方式,介於監督式學習和無監督式學習之間。在半監督式學習中,僅有一小部分資料被標記,絕大多數資料是無標記的。以下是半監督式學習的基本概念:
資料前處理與標籤策略
在機器學習專案中,資料前處理和標籤策略至關重要。本文將探討如何運用程式化標籤函式和半監督式學習方法,有效處理未標記的表格資料,為模型訓練做好準備。
建立標籤函式
標籤函式是根據特定規則為資料賦予標籤的程式碼片段。以下範例示範如何根據年齡、教育程度、每週工時和工作類別等特徵,建立標籤函式來預測收入是否超過 5 萬美元。
from snorkel.labeling import labeling_function
# 定義標籤常數
高收入 = 1
低收入 = 0
不確定 = -1
@labeling_function()
def 年齡規則(record):
if 28 < record['年齡'] < 58:
return 高收入
elif record['年齡'] <= 28 or record['年齡'] >= 58:
return 低收入
else:
return 不確定
@labeling_function()
def 教育規則(record):
高學歷 = ["學士", "碩士", "博士"]
if record['教育'] in 高學歷:
return 高收入
else:
return 低收入
@labeling_function()
def 工時規則(record):
if record['每週工作小時'] > 40:
return 高收入
else:
return 低收入
@labeling_function()
def 工作類別規則(record):
高收入職業 = ["自僱", "聯邦政府"]
if record['工作類別'] in 高收入職業:
return 高收入
else:
return 低收入
上述程式碼定義了四個標籤函式,分別根據年齡、教育程度、每週工時和工作類別來推斷收入水平。@labeling_function()
裝飾器將這些函式轉換為 Snorkel 可用的標籤函式。每個函式會根據輸入資料的特定條件傳回對應的標籤:高收入
、低收入
或 不確定
。
graph LR subgraph 資料 A[年齡] --> B{年齡規則} C[教育] --> D{教育規則} E[工時] --> F{工時規則} G[工作類別] --> H{工作類別規則} end B --> I[標籤] D --> I F --> I H --> I
應用標籤函式與建立標籤模型
接著,使用 PandasLFApplier
將這些標籤函式應用到資料集,並使用 LabelModel
訓練標籤模型。
import pandas as pd
from snorkel.labeling import PandasLFApplier
from snorkel.labeling.model import LabelModel
# 載入資料 (假設資料已存在 income.csv)
df = pd.read_csv('income.csv')
X = df.drop(columns=['收入'])
# 建立標籤函式列表
lfs = [年齡規則, 教育規則, 工時規則, 工作類別規則]
# 應用標籤函式
applier = PandasLFApplier(lfs=lfs)
L_train = applier.apply(df=X)
# 訓練標籤模型
label_model = LabelModel(verbose=True)
label_model.fit(L_train=L_train, n_epochs=1000, seed=100)
# 預測標籤
predicted_labels = label_model.predict(L=L_train)
這段程式碼首先載入資料,並將特徵資料儲存至 X
。接著,將先前定義的標籤函式放入列表 lfs
中。PandasLFApplier
將這些函式應用到資料集 X
,產生標籤矩陣 L_train
。LabelModel
使用 L_train
進行訓練,最後預測資料的標籤。
graph LR A[載入資料] --> B[建立標籤函式列表] B --> C{應用標籤函式} C --> D[訓練標籤模型] D --> E[預測標籤]
半監督式學習:Compose 庫與資料標記
Compose 庫提供更簡潔的方式來進行資料標記,特別適用於時間序列資料。以下範例示範如何使用 Compose 庫預測客戶在未來五天內的消費總額。
import composeml as cp
from demo.next_purchase import load_sample
# 載入範例資料
df = load_sample()
# 定義標記函式
def 消費總額(df):
return df['金額'].sum()
# 建立 LabelMaker
label_maker = cp.LabelMaker(
target_dataframe_name="客戶ID",
time_index="交易時間",
labeling_function=消費總額,
window_size="5d",
)
# 搜尋和提取標籤
labels = label_maker.search(
df.sort_values('交易時間'),
num_examples_per_instance=-1,
gap=1,
verbose=True,
)
# 設定閾值
labels = labels.threshold(300)
# 檢視標籤
print(labels.head())
此程式碼片段首先載入範例資料和 Compose 庫。消費總額
函式計算客戶在指定時間窗內的消費總額。LabelMaker
定義了標籤生成方式,包括目標資料行、時間索引、標籤函式和時間窗大小。search
方法根據設定搜尋並提取標籤,最後設定閾值並顯示標籤資料。
graph LR A[載入資料] --> B[定義標記函式] B --> C[建立 LabelMaker] C --> D{搜尋和提取標籤} D --> E[設定閾值] E --> F[檢視標籤]
資料標記是機器學習的關鍵步驟。本文探討了利用程式化標籤函式和半監督式學習方法來處理未標記資料的策略。Snorkel 庫的標籤函式提供精細的規則控制,而 Compose 庫則簡化了時間序列資料的標記流程。選擇哪種方法取決於資料特性和專案需求。對於複雜的標記任務,結合多種方法往往能提升標記品質和模型效能。展望未來,自動化標記技術將持續發展,降低人工標記成本,並促進更廣泛的機器學習應用。更精細的標籤策略和更強大的標籤模型將是未來研究的重點,以應對日益增長的資料規模和複雜性。