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

更新於 發佈於 閱讀時間約 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
33會員
43內容數
歡迎來到《桃花源記》專欄。這裡不僅是一個文字的集合,更是一個探索、夢想和自我發現的空間。在這個專欄中,我們將一同走進那些隱藏在日常生活中的"桃花源"——那些讓我們心動、讓我們反思、讓我們找到內心平靜的時刻和地方
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Karen的沙龍 的其他內容
How to access feature names in a trained XGB model ? 故事是這樣的... 在接手某個專案中,取得了一份已經訓練好的 pickle 檔案記載著 XGBoost model weight ,但因為 feature engineering 的程式碼交
matplotlib 無法顯示中文,看了很多篇教學文都無效 mac 解法可以參考這篇...
在進行開發工作時,可能會使用不同的 Git 帳號做登入和推送的情形,例如: 公司的 Git 帳號和個人的帳號,這樣做的好處是為了確保開發工作能清楚劃分,所以需要做切換帳號的動作,特別是在不同的專案間切換 commit 的對象,因此有了這篇文紀錄這個過程。
網路爬蟲(web crawler),也叫網路蜘蛛(spider) 是一個強大的自動化工具,可以自由瀏覽、擷取訪問網頁的各項資訊,例如:新聞文章、電商商品價格,當專案中需要添加外部數據或進行大量資料收集時,網路爬蟲就是一個非常實用的工具。
上篇我們在安裝 VirtualBox 練習使用虛擬化切割出獨立空間做開發,那除了使用 VM 達到虛擬化外,另一個輕量級的虛擬化技術 - 容器化。 要使用容器,那就不能不認識 Docker
「我只有 Windows 電腦也可以操作 Linux 指令嗎?」 「想試試看其他作業系統,需要移除作業系統再重灌嗎?」 「想了解虛擬化,快來試試看 VirtualBox」 今天就來實作 VirtualBox 安裝 Linux ubuntu 作業系統吧!
How to access feature names in a trained XGB model ? 故事是這樣的... 在接手某個專案中,取得了一份已經訓練好的 pickle 檔案記載著 XGBoost model weight ,但因為 feature engineering 的程式碼交
matplotlib 無法顯示中文,看了很多篇教學文都無效 mac 解法可以參考這篇...
在進行開發工作時,可能會使用不同的 Git 帳號做登入和推送的情形,例如: 公司的 Git 帳號和個人的帳號,這樣做的好處是為了確保開發工作能清楚劃分,所以需要做切換帳號的動作,特別是在不同的專案間切換 commit 的對象,因此有了這篇文紀錄這個過程。
網路爬蟲(web crawler),也叫網路蜘蛛(spider) 是一個強大的自動化工具,可以自由瀏覽、擷取訪問網頁的各項資訊,例如:新聞文章、電商商品價格,當專案中需要添加外部數據或進行大量資料收集時,網路爬蟲就是一個非常實用的工具。
上篇我們在安裝 VirtualBox 練習使用虛擬化切割出獨立空間做開發,那除了使用 VM 達到虛擬化外,另一個輕量級的虛擬化技術 - 容器化。 要使用容器,那就不能不認識 Docker
「我只有 Windows 電腦也可以操作 Linux 指令嗎?」 「想試試看其他作業系統,需要移除作業系統再重灌嗎?」 「想了解虛擬化,快來試試看 VirtualBox」 今天就來實作 VirtualBox 安裝 Linux ubuntu 作業系統吧!
你可能也想看
Google News 追蹤
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
特徵工程是機器學習中的核心技術,通過將原始數據轉換為有意義的特徵,以提升模型的準確性和穩定性。常見的特徵工程方法包括異常值檢測、特徵轉換、特徵縮放、特徵表示、特徵選擇和特徵提取。本文將深入探討這些方法的適用情況及具體實施流程,以幫助讀者有效利用特徵工程來優化機器學習模型表現。
Thumbnail
資料前處理(Data Preprocessing)中的重要角色-缺失值處理。從檢查、刪除到填充缺失值,以及插值法和機器學習算法的應用方法。Pandas 缺失值處理基礎方法、進階填充缺失值、鐵達尼號存活預測資料集的示例和機器學習算法填補缺失值方法的介紹與使用。
Thumbnail
透過簡單的舉例,分享從原始資料到洞察發現的完整過程,包括資料清洗、特徵工程、探索性資料分析,以及如何根據分析結果提出具體建議。
Thumbnail
NVDIA黃仁勳演講有提到分散式運算,我還真的做了分散式運算的研究拿了個碩士,那分散式運算是做什麼的呢?用現在的時代用語”算力”來解釋的話,就是要處理的資料非常大量,但是單一伺服器的算力不足,所以必須聯合好幾台伺服器的算力來一起處理, 而要能夠做分散式運算的前提就是你要有一套可以操作分散式運算
本文介紹了在深度學習中使用Batch Normalization來解決error surface複雜性的問題。通過特徵歸一化來加速收斂速度和訓練順利程度。同時,也提到了在測試階段使用moving average計算平均值和標準差的方法。
本文將介紹batch的定義與其在機器學習中的作用,以及不同batch size 的影響。同時也會講解Momentum動量在機器學習中的重要性。透過本文,您將清楚地瞭解batch、batch size和Momentum動量的概念以及其對機器學習的影響。
Thumbnail
ETL是資料倉儲領域中一個重要的概念,全稱為Extract-Transform-Load,中文可譯為"抽取-轉換-載入"。ETL的作用是將來自不同來源的資料抽取出來,經過清理、轉換、整合等處理後,最終將處理好的資料載入到資料倉儲或其他單一的資料存放區
Thumbnail
題目敘述 題目會給定兩個pandas DataFrame作為輸入,要求我們將兩張資料表,依照原有的順序串接在一起。 題目的原文敘述 測試範例 Example 1: Input: df1 +------------+---------+-----+ | student_id | name
Thumbnail
本文會利用sklearn引入breast_cancer datasets來訓練,在處理數據的部份,特徵工程用兩種方式去做處理,分別是特徵選取與特徵萃取的方式去做比較。 特徵選取的方法中,使用了KNN 分類器來選出最重要的兩個特徵 特徵萃取的方法中,使用了PCA降維
Thumbnail
Sequential Feature Selection(SFS) 用中文來解釋為,逐一特徵選取訓練,找出最重要的特徵,以提高模型的性能和效率 SFS 的一些用途包括: 維度縮減: 在高維度數據中,許多特徵可能是多餘或不重要的,使用 SFS 可以找到最能代表數據的特徵,從而減少計算和記憶體需求
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
特徵工程是機器學習中的核心技術,通過將原始數據轉換為有意義的特徵,以提升模型的準確性和穩定性。常見的特徵工程方法包括異常值檢測、特徵轉換、特徵縮放、特徵表示、特徵選擇和特徵提取。本文將深入探討這些方法的適用情況及具體實施流程,以幫助讀者有效利用特徵工程來優化機器學習模型表現。
Thumbnail
資料前處理(Data Preprocessing)中的重要角色-缺失值處理。從檢查、刪除到填充缺失值,以及插值法和機器學習算法的應用方法。Pandas 缺失值處理基礎方法、進階填充缺失值、鐵達尼號存活預測資料集的示例和機器學習算法填補缺失值方法的介紹與使用。
Thumbnail
透過簡單的舉例,分享從原始資料到洞察發現的完整過程,包括資料清洗、特徵工程、探索性資料分析,以及如何根據分析結果提出具體建議。
Thumbnail
NVDIA黃仁勳演講有提到分散式運算,我還真的做了分散式運算的研究拿了個碩士,那分散式運算是做什麼的呢?用現在的時代用語”算力”來解釋的話,就是要處理的資料非常大量,但是單一伺服器的算力不足,所以必須聯合好幾台伺服器的算力來一起處理, 而要能夠做分散式運算的前提就是你要有一套可以操作分散式運算
本文介紹了在深度學習中使用Batch Normalization來解決error surface複雜性的問題。通過特徵歸一化來加速收斂速度和訓練順利程度。同時,也提到了在測試階段使用moving average計算平均值和標準差的方法。
本文將介紹batch的定義與其在機器學習中的作用,以及不同batch size 的影響。同時也會講解Momentum動量在機器學習中的重要性。透過本文,您將清楚地瞭解batch、batch size和Momentum動量的概念以及其對機器學習的影響。
Thumbnail
ETL是資料倉儲領域中一個重要的概念,全稱為Extract-Transform-Load,中文可譯為"抽取-轉換-載入"。ETL的作用是將來自不同來源的資料抽取出來,經過清理、轉換、整合等處理後,最終將處理好的資料載入到資料倉儲或其他單一的資料存放區
Thumbnail
題目敘述 題目會給定兩個pandas DataFrame作為輸入,要求我們將兩張資料表,依照原有的順序串接在一起。 題目的原文敘述 測試範例 Example 1: Input: df1 +------------+---------+-----+ | student_id | name
Thumbnail
本文會利用sklearn引入breast_cancer datasets來訓練,在處理數據的部份,特徵工程用兩種方式去做處理,分別是特徵選取與特徵萃取的方式去做比較。 特徵選取的方法中,使用了KNN 分類器來選出最重要的兩個特徵 特徵萃取的方法中,使用了PCA降維
Thumbnail
Sequential Feature Selection(SFS) 用中文來解釋為,逐一特徵選取訓練,找出最重要的特徵,以提高模型的性能和效率 SFS 的一些用途包括: 維度縮減: 在高維度數據中,許多特徵可能是多餘或不重要的,使用 SFS 可以找到最能代表數據的特徵,從而減少計算和記憶體需求