域名注冊和網(wǎng)站建設(shè)深圳關(guān)鍵詞優(yōu)化報(bào)價(jià)
前言
本文指的數(shù)據(jù)集為通用數(shù)據(jù)集,并不單是給機(jī)器學(xué)習(xí)領(lǐng)域使用。包含科研和工業(yè)領(lǐng)域需要自己制作數(shù)據(jù)集的。
首先,在制作大型數(shù)據(jù)集時(shí),代碼錯(cuò)誤和數(shù)據(jù)問題可能會非常復(fù)雜。
前期邏輯總是簡單的,庫庫一頓寫,等排查的時(shí)候兩眼無淚。
后期慢慢摸排和檢查的時(shí)候不斷完善代碼,前期代碼主要是完成功能,后期是增加維護(hù)性和檢測性。
這部分工作其實(shí)前期可以考慮進(jìn)去。
以下提供一些血淚經(jīng)驗(yàn)
方法
1. 模塊化設(shè)計(jì)
將代碼分成多個(gè)小模塊或函數(shù),每個(gè)模塊負(fù)責(zé)一個(gè)特定的任務(wù)。這樣更容易定位和修復(fù)問題。
模塊化在最開始拿到需求和實(shí)現(xiàn)思路的時(shí)候估計(jì)還做不到,但代碼寫到一定程度該考慮拆成模塊的就得拆成模塊。不然后期調(diào)試會特別復(fù)雜。
2.單元測試
TDD我是支持的,但同時(shí)寫測試和代碼我是做不到的。所以對我來說都是代碼寫到一定程度再考慮添加單元測試。分為功能測試,計(jì)算測試,還有數(shù)據(jù)樣例測試。
3.日志記錄
需要記錄過程數(shù)據(jù),推薦建立單獨(dú)文件夾,存儲計(jì)算中的過程數(shù)據(jù)。
注意!!! 這個(gè)除了開發(fā)階段非常有用! 后期在程序上線生產(chǎn)環(huán)境后對于幫助排查bug也是非常有幫助的,上線后注意的是控制過程數(shù)據(jù)文件數(shù)量。
如圖,一般建立check_data文件夾或者logs文件夾。
還可以用logging模塊,代碼如圖:
import logginglogging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)def process_data(data):logger.debug("Starting data processing")logger.debug("Data processing completed")
但我個(gè)人傾向自定義log文件。logging模塊的排版雖然整齊,無用字符也太多了。自己單獨(dú)費(fèi)點(diǎn)時(shí)間寫個(gè)表保存。
曬一下,嘿嘿:
4. debug
打斷點(diǎn)逐步調(diào)試?yán)?#xff01;!沒有捷徑可走,加油吧少年!!
5.數(shù)據(jù)驗(yàn)證
在每個(gè)計(jì)算步驟核對計(jì)算結(jié)果確保計(jì)算正確。
6.版本控制
保存每個(gè)能跑的版本。不管是不是shit。
可以用管理工具git也可以手動保存。
7.數(shù)據(jù)抽樣
對數(shù)據(jù)集進(jìn)行抽樣組成小樣本數(shù)據(jù)集代入程序進(jìn)行驗(yàn)證和核對結(jié)果,可以大大減少工作量!
8.自動化測試
編寫自動化測試腳本,定期運(yùn)行這些腳本以檢測新引入的錯(cuò)誤。可以使用CI/CD工具(如Jenkins、GitHub Actions)來實(shí)現(xiàn)這一點(diǎn)。
9.并行處理
將數(shù)據(jù)集切分多個(gè)進(jìn)程進(jìn)行計(jì)算,加快速度同時(shí)也會幫助更快發(fā)現(xiàn)問題!
提供一個(gè)按進(jìn)程數(shù)均分?jǐn)?shù)據(jù)集進(jìn)行計(jì)算的代碼:
from multiprocessing import Process
import timedef func_demo(age,name_list)for name in name_list:print(name,":",age)def func(param1,process_number):# 總輸入xxx_list = [str(i) for i in range(100)]# 統(tǒng)計(jì)任務(wù)數(shù)量number = len(xxx_list) # 計(jì)算平均每個(gè)進(jìn)程需承擔(dān)多少任務(wù)delta = int(number / process_number)p_list = []# 啟動多進(jìn)程for i in range(0, process_number):# 按delta遍歷取需要計(jì)算的任務(wù)。if i == process_number - 1:s = delta * ie = numberelse:s = delta * ie = delta * (i + 1)p = Process(target=calculate_name, args=(param1, xxx_list[s:e]))p.start()p_list.append(p)for p in p_list:p.join()# 測試劃分的對不對
def test_p_delta():number = len(xxx_list)delta = int(number / 4)for i in range(0, 4):if i == 3:s = delta * ie = numberelse:s = delta * ie = delta * (i + 1)print("s:", s, " e:", e)if __name__ == '__main__':age=10process_number = 4func(age,process_number)
10.文檔和注釋
確保代碼有充分的文檔和注釋,后期翻看的時(shí)候,也能快速理解代碼邏輯和數(shù)據(jù)處理過程。
希望對看官有所幫助!!!