機器學習實用技巧:用多進程加速你的特徵工程

更新於 發佈於 閱讀時間約 11 分鐘

在數據科學和機器學習中,特徵工程是提高模型性能的關鍵步驟之一,通過創建新特徵或轉換現有特徵,我們可以更好地捕捉數據中的信息,提高模型的預測能力。然而,當處理大數據集時,特徵工程可能變得耗時,而且若是在研發階段,特徵其實是需要快速迭代去產生並且做後續的實驗,這也是近期遇到的問題,因此想在這篇文章實作多進程的優化。那要執行特徵工程的流程,其實有很多個選擇,在本次文章中,想分享最近實做的一種方法,雖然他不是最好的,但它是可行的,如果有比較建議的方法歡迎分享交流,一起學習成長!

bing image creator

bing image creator

目的

使用Python的多進程功能來加速特徵工程,並將結果存儲在SQLite數據庫中,這可以達到快速產生特徵,並且在RAM資源有限的情況下,可以如預期執行。

主要用到的 python package

  • Pandas:處理數據
  • SQLite:資料庫
  • Multiprocessing:多線程處理

流程

  1. 建立模擬資料
  2. 寫特徵工程 function
  3. multiprocess function 執行

建立模擬資料

num : 表示帳戶號碼,建立100個帳戶

date : 表示交易日期,建立交易日期在 2023-10-20 到 2023-10-30日之間

time : 表示交易時間,一天24 小時內都可以

amount : 這筆交易的金額,金額範圍 1- 1000000

sample 如下:

sample data

sample data

import pandas as pd
import numpy as np
import random
from faker import Faker
from datetime import datetime, timedelta


np.random.seed(0)
random.seed(0)


fake = Faker()
data = pd.DataFrame(columns=['num', 'date', 'time', 'amount'])

account_numbers = [fake.unique.random_number(digits=6) for _ in range(100)]


for _ in range(1000):
acct_num = random.choice(account_numbers)
date = (datetime(2023, 10, 20) + timedelta(days=random.randint(0, 10))).date()
time = fake.time(pattern='%H:%M')
amt = random.randint(1, 1000000)

data = pd.concat([data, pd.DataFrame({'num': [num], 'date': [date], 'time': [time],
'amount': [amount]})], ignore_index=True)


data.to_csv('data/transaction.csv', index=False)


寫特徵工程 function (舉例幾個特徵)

import multiprocessing
import sqlite3
import pandas as pd


def create_db_connection():
return sqlite3.connect('mydatabase.db')


def calculate_average_amount(data, num):

average_amount = data.groupby('num')['amount'].mean().reset_index()
print(average_amount)
return average_amount


def calculate_variance(data, num ):

variance_data = data.groupby('num')['amount'].var().reset_index()
variance_data.rename(columns={'amount': 'amount_variance'}, inplace=True)

return variance_data



def calculate_time_diff(data):
account_data = data.copy()
account_data['time'] = pd.to_datetime(account_data['time'], format='%H:%M')


account_data = account_data.sort_values(by=['date', 'time'])
account_data['time_diff'] = account_data['time'].diff().dt.total_seconds() / 60.0

return account_data[['num', 'time_diff']]


def calculate_average_time_diff(time_df):

average_time_diff = time_df.groupby('num')['time_diff'].mean().reset_index()
average_time_diff.rename(columns={'time_diff': 'time_diff_mean'}, inplace=True)

return average_time_diff

def process_feature(data,num):
print('in function process_feature: ',data.shape)
data = data[data['num'] == num]
ori_df = calculate_average_amount(data, num)
output_df = calculate_variance(data,num )
output_df = ori_df.merge(output_df, on='num')
print(output_df.columns)

time_df = calculate_time_diff(data)
time_df_o = calculate_average_time_diff(time_df)
print(time_df_o.columns)
output_df = output_df.merge(time_df_o, on='num')

return output_df


multi-process 完成

import multiprocessing
import sqlite3
import pandas as pd
from feature import calculate_average_amount, calculate_variance, process_feature
from functools import partial

def create_db_connection():
return sqlite3.connect('feature.db')

def process_acct_num(num, data):

output_df = process_feature(data,num)
conn = create_db_connection()
output_df.to_sql('feature', conn, if_exists='append', index=False)

conn.close()

if __name__ == '__main__':

data = pd.read_csv('./data/transaction.csv')
nums = data['num'].unique()
start_date, end_date = '2023-10-20' , '2023-10-30'

num_processes = multiprocessing.cpu_count()
print(num_processes)
num_processes = num_processes-2

process_acct_num_partial = partial(process_acct_num, data=data)

with multiprocessing.Pool(num_processes) as pool:
pool.map(process_acct_num_partial, nums)


小心得

我們使用 Python 和多進程來進行特徵工程的例子,並將結果存儲在 SQLite 數據庫中。這個例子展示了對於一個交易數據集,如何計算每個帳戶的平均交易金額,特徵可以根據現實的情況擴增,這裡只展示一個框架。

過程中利用了 Python 的 multiprocessing 模塊,有效地利用了多核 CPU 資源,加快了大量數據的處理速度,特別是在處理大型數據集時,使用多進程可以顯著提高效率。

最後,我們將計算完的特徵通過 SQLite 數據庫進行了存儲,這樣不僅便於管理和存取這些數據,也為後續的數據分析和機器學習建模提供了方便。透過這篇文章,記錄下前些日子在資源有限的情況,可以 work 的 solution 。

歡迎交流~分享~一起成長!

留言
avatar-img
留言分享你的想法!
avatar-img
Karen的沙龍
34會員
50內容數
歡迎來到《桃花源記》專欄。這裡不僅是一個文字的集合,更是一個探索、夢想和自我發現的空間。在這個專欄中,我們將一同走進那些隱藏在日常生活中的"桃花源"——那些讓我們心動、讓我們反思、讓我們找到內心平靜的時刻和地方
Karen的沙龍的其他內容
2024/03/06
本文探討了在使用 pandas 處理資料時應注意的幾個關鍵點,以及如何減少因資料型態問題而產生的錯誤,確保資料的原始意義得以保留。主要包括Pandas 資料處理深入解析,尋找CSV之外的數據儲存方案,以及優化資料處理策略。
Thumbnail
2024/03/06
本文探討了在使用 pandas 處理資料時應注意的幾個關鍵點,以及如何減少因資料型態問題而產生的錯誤,確保資料的原始意義得以保留。主要包括Pandas 資料處理深入解析,尋找CSV之外的數據儲存方案,以及優化資料處理策略。
Thumbnail
2023/10/09
1. 問題定義 每一個成功的模型都始於明確的問題定義! 核心思考:你的模型想要達到什麼目的? 例如:是要偵測每一筆交易是否涉及洗錢,還是要從大量資料中找出可能的洗錢關聯戶? 2. 數據檢查 數據是模型的基石,但不是所有數據都是有用的! 核心思考:你的數據夠嗎?時間分佈如何?正負樣本
Thumbnail
2023/10/09
1. 問題定義 每一個成功的模型都始於明確的問題定義! 核心思考:你的模型想要達到什麼目的? 例如:是要偵測每一筆交易是否涉及洗錢,還是要從大量資料中找出可能的洗錢關聯戶? 2. 數據檢查 數據是模型的基石,但不是所有數據都是有用的! 核心思考:你的數據夠嗎?時間分佈如何?正負樣本
Thumbnail
2023/08/15
最近在調整跟優化效能時,又來複習了 Multi-threading 和 Multiprocessing 的概念,在面對大數據時,能夠有效利用多核心處理器的能力,對於提升程式執行效能至關重要。 Python 提供多線程(Multi-threading) 和多進程 (Multiprocessing)
Thumbnail
2023/08/15
最近在調整跟優化效能時,又來複習了 Multi-threading 和 Multiprocessing 的概念,在面對大數據時,能夠有效利用多核心處理器的能力,對於提升程式執行效能至關重要。 Python 提供多線程(Multi-threading) 和多進程 (Multiprocessing)
Thumbnail
看更多
你可能也想看
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
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
當我們在開發一個AI應用服務時, 常常會需要載入大模型, But… 我們總不可能每一次的請求就載入一次模型吧! 這樣太沒有效率了, 也非常的浪費資源, 因此我們通常會希望應用程式啟動時就能夠載入模型, 之後每一次的請求只要讓模型進行運算即可, 那麼在FastAPI的框架中究竟要如何使用呢? 首
Thumbnail
當我們在開發一個AI應用服務時, 常常會需要載入大模型, But… 我們總不可能每一次的請求就載入一次模型吧! 這樣太沒有效率了, 也非常的浪費資源, 因此我們通常會希望應用程式啟動時就能夠載入模型, 之後每一次的請求只要讓模型進行運算即可, 那麼在FastAPI的框架中究竟要如何使用呢? 首
Thumbnail
Stability AI在圖片/影片/聲音生成領域貢獻了不少心力,近期提出了更加高效率的對抗生成蒸餾方法,只需進行一步計算,便能打敗LCM需要4步計算的結果,來看看具體是如何做到的。
Thumbnail
Stability AI在圖片/影片/聲音生成領域貢獻了不少心力,近期提出了更加高效率的對抗生成蒸餾方法,只需進行一步計算,便能打敗LCM需要4步計算的結果,來看看具體是如何做到的。
Thumbnail
今天我們來看一個最近討論度非常高的AI繪圖新技術,一個讓你可以在幾秒鐘內看到成品,不論是訓練還是生成都大大降低了資源成本的技術。※影片中有誤的地方補充在CC字幕,本篇內容也已修正。
Thumbnail
今天我們來看一個最近討論度非常高的AI繪圖新技術,一個讓你可以在幾秒鐘內看到成品,不論是訓練還是生成都大大降低了資源成本的技術。※影片中有誤的地方補充在CC字幕,本篇內容也已修正。
Thumbnail
北京清華大學改進了傳統Stable Diffusion (SD) 文生圖的加速算法,讓SD這項技術,可以在筆電達到即時(Real Time)運算等級,讓我們一起來了解這項技術,期許未來能在各種應用上使用,或是看到源碼也不陌生。
Thumbnail
北京清華大學改進了傳統Stable Diffusion (SD) 文生圖的加速算法,讓SD這項技術,可以在筆電達到即時(Real Time)運算等級,讓我們一起來了解這項技術,期許未來能在各種應用上使用,或是看到源碼也不陌生。
Thumbnail
要檢查兩段長篇文字,內容是否雷同,長久以來困擾著大家,沒有好的嵌入模型,會耗費大量人力,需要對長篇文檔進行人工閱讀然後人工分類。本文除了展示如何能完美的解決這個痛點以外,也提供一些延伸應用思路,學習CP值很高。期待你能從本文取得許多新的應用思路與應用潛力!
Thumbnail
要檢查兩段長篇文字,內容是否雷同,長久以來困擾著大家,沒有好的嵌入模型,會耗費大量人力,需要對長篇文檔進行人工閱讀然後人工分類。本文除了展示如何能完美的解決這個痛點以外,也提供一些延伸應用思路,學習CP值很高。期待你能從本文取得許多新的應用思路與應用潛力!
Thumbnail
在數據科學和機器學習中,特徵工程是提高模型性能的關鍵步驟之一,通過創建新特徵或轉換現有特徵,我們可以更好地捕捉數據中的信息,提高模型的預測能力。然而,當處理大數據集時,特徵工程可能變得耗時,而且若是在研發階段,特徵其實是需要快速迭代去產生並且做後續的實驗,這也是近期遇到的問題,因此想在這篇文章實作多
Thumbnail
在數據科學和機器學習中,特徵工程是提高模型性能的關鍵步驟之一,通過創建新特徵或轉換現有特徵,我們可以更好地捕捉數據中的信息,提高模型的預測能力。然而,當處理大數據集時,特徵工程可能變得耗時,而且若是在研發階段,特徵其實是需要快速迭代去產生並且做後續的實驗,這也是近期遇到的問題,因此想在這篇文章實作多
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