如何運用批次輸入、多處理技術加速特徵工程

更新 發佈閱讀 9 分鐘

How to utilize batch input and multi-processing techniques to accelerate feature engineering?

Image Creator from Microsoft Bing

Image Creator from Microsoft Bing

問題

在進行特徵工程的過程中,我們通常需要處理各種各樣的數據,並轉換它們成有意義的特徵,以供後續的模型訓練和預測使用。然而,當數據集過於龐大,尤其是當記憶體限制造成RAM不足時,這個過程變得困難重重。這不僅影響效能,也可能阻礙我們進行更深入的特徵工程實驗。

解決方案:分割與多處理技術

為了克服這個效能問題,我們需要尋找解決方法,讓特徵工程能在有限的資源下順利進行。以下是我所採取的解決方案:

1. 數據分割與存儲

在進行 feature engineering 之前,我首先將原始數據集進行分割,按照特定的 ID 進行切割,將每個子集分別存儲成 pickle 檔案。這個步驟也須考量後續的feature engineering 內容,這次遇到的處理是以 group by ID 的方式進行,因此在這個步驟也依 ID 進行分割。這樣做的好處不僅有助於減少單次操作時的內存使用量,還能夠提高之後多處理的效能。

2. 批次處理(batch)與多處理(multiprocess)

在分割好數據後,我們使用批次(batch)的方式進行feature engineering。這意味著我們只處理一小部分數據,而不是一次性處理整個資料集。這有助於控制內存的使用,避免RAM不足的問題。此外,我們還運用了多處理(multiprocess)的技術,同時在多個處理單元中執行特徵工程,進一步提高效能。

實作細節

Data

這次選用 kaggle dataset : Bank Transaction Data ,他是一個銀行的交易數據,數據量不大,僅以次作為 sample 以實作後續內容(讀者可以找任何的資料取代,資料在本篇不是重點)。

import pandas as pd 

data_path = './data/bank.xlsx'
df = pd.read_excel(data_path, sheet_name='Sheet1')
df.rename(columns = {'Account No':'ID'}, inplace = True)
df.head(5)
df.head(5)

df.head(5)

數據分割與存儲

我將原始的資料集按照特定的標識(ID)進行分割,並將每個子集分別存儲成pickle檔案。這使得每個子集都可以獨立地載入和處理。

import os

def split_by_id_save_to_pickle(df: pd.DataFrame, output_path:str) -> list:
unique_accounts = df['ID'].unique()
pickle_filename_list = []

for account_id in unique_accounts:
account_data = df[df['ID'] == account_id]
account_id = account_id[:-1]
pickle_filename = f'{account_id}.pickle'

account_data = account_data.reset_index(drop=True)

account_data.to_pickle(os.path.join(output_path,pickle_filename))
pickle_filename_list.append(pickle_filename)

return pickle_filename_list

pickle_filename_list = split_by_id_save_to_pickle(df,'process')


範例 feature engineering

這裡以 “calculate_transaction_percentage“ 計算交易佔該ID的總交易比例,也是只是一個 sample ,可以換任何的 feature engineering 。

並且再用一個 preprocess function 把要做的事情都包起來,從讀取 pickle 到特徵工程以及最後再存回去 pickle。

def calculate_transaction_percentage(data):

data.sort_values(by=['ID', 'DATE'], inplace=True)
data['Accumulated Deposit'] = data.groupby('ID')['DEPOSIT AMT'].cumsum()
data['Transaction Percentage'] = data['DEPOSIT AMT'] / (data['Accumulated Deposit'] )
return data


def preporcess(args):

file_name = args[0]
input_path = args[1]
output_path = args[2]

try:
data = pd.read_pickle(os.path.join(input_path,file_name))
data = calculate_transaction_percentage(data)
data.to_pickle(os.path.join(output_path,file_name))
return f"success: {file_name}"
except Exception as e:
print(e)
return f"error: {file_name}"


多處理 multiprocess

對每個分割後的子集,我使用批次的方式進行特徵工程。這意味著我們每次只處理數據的一部分,從而有效控制了記憶體的使用。同時,我們使用多處理技術,將特徵工程任務分配給多個處理單元,並且同步地進行處理,從而極大地提高了效能。

def concurrent_multi_process(list_:list, function_:Callable, *para):
""" Implement multi-process to speed up process time. Args: Input: list, function output: list of function's output """
args = ((element, *para) for element in list_)
with concurrent.futures.ProcessPoolExecutor() as executor:
result_list = list(tqdm(executor.map(function_, args), total = len(list_)))

return result_list

file_list = concurrent_multi_process(pickle_filename_list,
preporcess,
'process',
'output')

結論

在這篇文章中,我們討論在特徵工程過程中因RAM不足而導致的效能問題。為了解決這個問題,我們引入了數據分割、批次處理和多處理等技術,從而成功地突破了效能瓶頸。這些方法不僅幫助我們克服了記憶體限制,還大幅提高了特徵工程的效能,使我們能夠更深入地進行資料分析和建模工作。希望本篇文章能夠啟發更多的資料科學從業者,針對效能問題尋找更多的解決方案,我們下次見!

留言
avatar-img
留言分享你的想法!
avatar-img
Karen的沙龍
34會員
51內容數
歡迎來到《桃花源記》專欄。這裡不僅是一個文字的集合,更是一個探索、夢想和自我發現的空間。在這個專欄中,我們將一同走進那些隱藏在日常生活中的"桃花源"——那些讓我們心動、讓我們反思、讓我們找到內心平靜的時刻和地方
Karen的沙龍的其他內容
2024/03/06
本文探討了在使用 pandas 處理資料時應注意的幾個關鍵點,以及如何減少因資料型態問題而產生的錯誤,確保資料的原始意義得以保留。主要包括Pandas 資料處理深入解析,尋找CSV之外的數據儲存方案,以及優化資料處理策略。
Thumbnail
2024/03/06
本文探討了在使用 pandas 處理資料時應注意的幾個關鍵點,以及如何減少因資料型態問題而產生的錯誤,確保資料的原始意義得以保留。主要包括Pandas 資料處理深入解析,尋找CSV之外的數據儲存方案,以及優化資料處理策略。
Thumbnail
2023/10/30
在數據科學和機器學習中,特徵工程是提高模型性能的關鍵步驟之一,通過創建新特徵或轉換現有特徵,我們可以更好地捕捉數據中的信息,提高模型的預測能力。然而,當處理大數據集時,特徵工程可能變得耗時,而且若是在研發階段,特徵其實是需要快速迭代去產生並且做後續的實驗,這也是近期遇到的問題,因此想在這篇文章實作多
Thumbnail
2023/10/30
在數據科學和機器學習中,特徵工程是提高模型性能的關鍵步驟之一,通過創建新特徵或轉換現有特徵,我們可以更好地捕捉數據中的信息,提高模型的預測能力。然而,當處理大數據集時,特徵工程可能變得耗時,而且若是在研發階段,特徵其實是需要快速迭代去產生並且做後續的實驗,這也是近期遇到的問題,因此想在這篇文章實作多
Thumbnail
2023/10/09
1. 問題定義 每一個成功的模型都始於明確的問題定義! 核心思考:你的模型想要達到什麼目的? 例如:是要偵測每一筆交易是否涉及洗錢,還是要從大量資料中找出可能的洗錢關聯戶? 2. 數據檢查 數據是模型的基石,但不是所有數據都是有用的! 核心思考:你的數據夠嗎?時間分佈如何?正負樣本
Thumbnail
2023/10/09
1. 問題定義 每一個成功的模型都始於明確的問題定義! 核心思考:你的模型想要達到什麼目的? 例如:是要偵測每一筆交易是否涉及洗錢,還是要從大量資料中找出可能的洗錢關聯戶? 2. 數據檢查 數據是模型的基石,但不是所有數據都是有用的! 核心思考:你的數據夠嗎?時間分佈如何?正負樣本
Thumbnail
看更多
你可能也想看
Thumbnail
在小小的租屋房間裡,透過蝦皮購物平臺採購各種黏土、模型、美甲材料等創作素材,打造專屬黏土小宇宙的療癒過程。文中分享多個蝦皮挖寶地圖,並推薦蝦皮分潤計畫。
Thumbnail
在小小的租屋房間裡,透過蝦皮購物平臺採購各種黏土、模型、美甲材料等創作素材,打造專屬黏土小宇宙的療癒過程。文中分享多個蝦皮挖寶地圖,並推薦蝦皮分潤計畫。
Thumbnail
小蝸和小豬因購物習慣不同常起衝突,直到發現蝦皮分潤計畫,讓小豬的購物愛好產生價值,也讓小蝸開始欣賞另一半的興趣。想增加收入或改善伴侶間的購物觀念差異?讓蝦皮分潤計畫成為你們的神隊友吧!
Thumbnail
小蝸和小豬因購物習慣不同常起衝突,直到發現蝦皮分潤計畫,讓小豬的購物愛好產生價值,也讓小蝸開始欣賞另一半的興趣。想增加收入或改善伴侶間的購物觀念差異?讓蝦皮分潤計畫成為你們的神隊友吧!
Thumbnail
本系列將討論 LLM 時代中,分散 ML workload 的各種方法。作為系列的第一篇,我們將提及 High-level 的概論,譬如分散式訓練的各種切法、Model Parallelism 的相依問題,以及改善 Network Topology 等課題。
Thumbnail
本系列將討論 LLM 時代中,分散 ML workload 的各種方法。作為系列的第一篇,我們將提及 High-level 的概論,譬如分散式訓練的各種切法、Model Parallelism 的相依問題,以及改善 Network Topology 等課題。
Thumbnail
本文將展示使用不同激活函數(ReLU 和 Sigmoid)的效果。 一個簡單的多層感知器(MLP)模型來對 Fashion-MNIST 資料集進行分類。 函數定義 Sigmoid 函數 Sigmoid 函數將輸入壓縮到 0到 1 之間: 特性: 輸出範圍是 (0,1)(0, 1)(0,1
Thumbnail
本文將展示使用不同激活函數(ReLU 和 Sigmoid)的效果。 一個簡單的多層感知器(MLP)模型來對 Fashion-MNIST 資料集進行分類。 函數定義 Sigmoid 函數 Sigmoid 函數將輸入壓縮到 0到 1 之間: 特性: 輸出範圍是 (0,1)(0, 1)(0,1
Thumbnail
本文介紹了self-attention在處理不固定大小輸入值時的應用,並討論瞭如何計算self-attention以及transformer中的multi-head self-attention。此外,文章還探討了在語音辨識和圖片處理中使用self-attention的方法,以及與CNN的比較。
Thumbnail
本文介紹了self-attention在處理不固定大小輸入值時的應用,並討論瞭如何計算self-attention以及transformer中的multi-head self-attention。此外,文章還探討了在語音辨識和圖片處理中使用self-attention的方法,以及與CNN的比較。
Thumbnail
當我們在開發一個AI應用服務時, 常常會需要載入大模型, But… 我們總不可能每一次的請求就載入一次模型吧! 這樣太沒有效率了, 也非常的浪費資源, 因此我們通常會希望應用程式啟動時就能夠載入模型, 之後每一次的請求只要讓模型進行運算即可, 那麼在FastAPI的框架中究竟要如何使用呢? 首
Thumbnail
當我們在開發一個AI應用服務時, 常常會需要載入大模型, But… 我們總不可能每一次的請求就載入一次模型吧! 這樣太沒有效率了, 也非常的浪費資源, 因此我們通常會希望應用程式啟動時就能夠載入模型, 之後每一次的請求只要讓模型進行運算即可, 那麼在FastAPI的框架中究竟要如何使用呢? 首
Thumbnail
Stability AI在圖片/影片/聲音生成領域貢獻了不少心力,近期提出了更加高效率的對抗生成蒸餾方法,只需進行一步計算,便能打敗LCM需要4步計算的結果,來看看具體是如何做到的。
Thumbnail
Stability AI在圖片/影片/聲音生成領域貢獻了不少心力,近期提出了更加高效率的對抗生成蒸餾方法,只需進行一步計算,便能打敗LCM需要4步計算的結果,來看看具體是如何做到的。
Thumbnail
在數據科學和機器學習中,特徵工程是提高模型性能的關鍵步驟之一,通過創建新特徵或轉換現有特徵,我們可以更好地捕捉數據中的信息,提高模型的預測能力。然而,當處理大數據集時,特徵工程可能變得耗時,而且若是在研發階段,特徵其實是需要快速迭代去產生並且做後續的實驗,這也是近期遇到的問題,因此想在這篇文章實作多
Thumbnail
在數據科學和機器學習中,特徵工程是提高模型性能的關鍵步驟之一,通過創建新特徵或轉換現有特徵,我們可以更好地捕捉數據中的信息,提高模型的預測能力。然而,當處理大數據集時,特徵工程可能變得耗時,而且若是在研發階段,特徵其實是需要快速迭代去產生並且做後續的實驗,這也是近期遇到的問題,因此想在這篇文章實作多
Thumbnail
Our mission is to accelerate the development of AI applications 這系列文章是透過蒐集、分享我覺得有意思AI服務、相關文章、影片,期許自己能更了解這世界上正在發生什麼。
Thumbnail
Our mission is to accelerate the development of AI applications 這系列文章是透過蒐集、分享我覺得有意思AI服務、相關文章、影片,期許自己能更了解這世界上正在發生什麼。
Thumbnail
Hi, 我是茶桁。 在前一讲中,我们观察到大型模型的确表现出良好效果。在情感分析任务中,通过使用 OpenAI API 提供的 Embedding,我们得到的结果要比能在单个机器上运行的较小模型(如T5-base)要好得多。然而,我们之前所选择的问题确实有些过于简单。我们将5个不同的评分分成了正面
Thumbnail
Hi, 我是茶桁。 在前一讲中,我们观察到大型模型的确表现出良好效果。在情感分析任务中,通过使用 OpenAI API 提供的 Embedding,我们得到的结果要比能在单个机器上运行的较小模型(如T5-base)要好得多。然而,我们之前所选择的问题确实有些过于简单。我们将5个不同的评分分成了正面
Thumbnail
上一篇章我們有提到「【AI幫幫忙】機器如何識別我們的特徵?關鍵的Named Entity Recognition(NER)技術」, 而NER是NLP自然語言處理的一部分, 而這一個篇章我們會以實作的形式來介紹自然語言處理中非常好用的一套工具「spaCy」,spaCy被廣泛用於各種NLP任務,包括自然
Thumbnail
上一篇章我們有提到「【AI幫幫忙】機器如何識別我們的特徵?關鍵的Named Entity Recognition(NER)技術」, 而NER是NLP自然語言處理的一部分, 而這一個篇章我們會以實作的形式來介紹自然語言處理中非常好用的一套工具「spaCy」,spaCy被廣泛用於各種NLP任務,包括自然
Thumbnail
本文介紹了生成式學習中的兩種策略:「各個擊破」和「一次到位」。這兩種策略在生成速度和品質之間達到平衡。為了提高速度,可以採用"N次到位"的Diffusion Model策略。在語音和影像生成中,可以結合這兩種策略以充分利用優勢。融合策略可以同時確保品質和速度,展現人工智慧的潛力。
Thumbnail
本文介紹了生成式學習中的兩種策略:「各個擊破」和「一次到位」。這兩種策略在生成速度和品質之間達到平衡。為了提高速度,可以採用"N次到位"的Diffusion Model策略。在語音和影像生成中,可以結合這兩種策略以充分利用優勢。融合策略可以同時確保品質和速度,展現人工智慧的潛力。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News