0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

寫給開發(fā)者的十條機(jī)器學(xué)習(xí)建議

新機(jī)器視覺 ? 來源:視學(xué)算法 ? 作者:視學(xué)算法 ? 2022-12-06 15:59 ? 次閱讀

有時(shí)候,作為一個(gè)數(shù)據(jù)科學(xué)家,我們常常忘記了初心。我們首先是一個(gè)開發(fā)者,然后才是研究人員,最后才可能是數(shù)學(xué)家。我們的首要職責(zé)是快速找到無 bug 的解決方案。

我們能做模型并不意味著我們就是神。這并不是編寫垃圾代碼的理由

自從我開始學(xué)習(xí)機(jī)器學(xué)習(xí)以來,我犯了很多錯(cuò)誤。因此我想把我認(rèn) 機(jī)器學(xué)習(xí)工程中最常用的技能分享出來。在我看來,這也是目前這個(gè)行業(yè)最缺乏的技能。

我稱他們?yōu)椴欢浖臄?shù)據(jù)科學(xué)家,因?yàn)樗麄冎泻艽笠徊糠秩硕紱]有系統(tǒng)地學(xué)習(xí)過計(jì)算機(jī)科學(xué)課程。而我自己也是如此。

如果要選擇雇傭一個(gè)偉大的數(shù)據(jù)科學(xué)家和一個(gè)偉大的機(jī)器學(xué)習(xí)工程師,我會選擇雇傭后者。

下面開始我的分享。

學(xué)習(xí)編寫抽象類

一旦開始編寫抽象類,你就能體會到它給帶來的好處。抽象類強(qiáng)制子類使用相同的方法和方法名稱。許多人在同一個(gè)項(xiàng)目上工作, 如果每個(gè)人去定義不同的方法,這樣做沒有必要也很容易造成混亂。

 1importos
 2fromabcimportABCMeta,abstractmethod
 3
 4
 5classDataProcessor(metaclass=ABCMeta):
 6"""Baseprocessortobeusedforallpreparation."""
 7def__init__(self,input_directory,output_directory):
 8self.input_directory=input_directory
 9self.output_directory=output_directory
10
11@abstractmethod
12defread(self):
13"""Readrawdata."""
14
15@abstractmethod
16defprocess(self):
17"""Processesrawdata.Thisstepshouldcreatetherawdataframewithalltherequiredfeatures.Shouldn'timplementstatisticalortextcleaning."""
18
19@abstractmethod
20defsave(self):
21"""Savesprocesseddata."""
22
23
24classTrainer(metaclass=ABCMeta):
25"""Basetrainertobeusedforallmodels."""
26
27def__init__(self,directory):
28self.directory=directory
29self.model_directory=os.path.join(directory,'models')
30
31@abstractmethod
32defpreprocess(self):
33"""Thistakesthepreprocesseddataandreturnscleandata.Thisismoreaboutstatisticalortextcleaning."""
34
35@abstractmethod
36defset_model(self):
37"""Definemodelhere."""
38
39@abstractmethod
40deffit_model(self):
41"""Thistakesthevectoriseddataandreturnsatrainedmodel."""
42
43@abstractmethod
44defgenerate_metrics(self):
45"""Generatesmetricwithtrainedmodelandtestdata."""
46
47@abstractmethod
48defsave_model(self,model_name):
49"""Thismethodsavesthemodelinourrequiredformat."""
50
51
52classPredict(metaclass=ABCMeta):
53"""Basepredictortobeusedforallmodels."""
54
55def__init__(self,directory):
56self.directory=directory
57self.model_directory=os.path.join(directory,'models')
58
59@abstractmethod
60defload_model(self):
61"""Loadmodelhere."""
62
63@abstractmethod
64defpreprocess(self):
65"""Thistakestherawdataandreturnscleandataforprediction."""
66
67@abstractmethod
68defpredict(self):
69"""Thisisusedforprediction."""
70
71
72classBaseDB(metaclass=ABCMeta):
73"""BasedatabaseclasstobeusedforallDBconnectors."""
74@abstractmethod
75defget_connection(self):
76"""ThiscreatesanewDBconnection."""
77@abstractmethod
78defclose_connection(self):
79"""ThisclosestheDBconnection."""

固定隨機(jī)數(shù)種子

實(shí)驗(yàn)的可重復(fù)性是非常重要的,隨機(jī)數(shù)種子是我們的敵人。要特別注重隨機(jī)數(shù)種子的設(shè)置,否則會導(dǎo)致不同的訓(xùn)練 / 測試數(shù)據(jù)的分裂和神經(jīng)網(wǎng)絡(luò)中不同權(quán)重的初始化。這些最終會導(dǎo)致結(jié)果的不一致。

1defset_seed(args):
2random.seed(args.seed)
3np.random.seed(args.seed)
4torch.manual_seed(args.seed)
5ifargs.n_gpu>0:
6torch.cuda.manual_seed_all(args.seed)

先加載少量數(shù)據(jù)

如果你的數(shù)據(jù)量太大,并且你正在處理比如清理數(shù)據(jù)或建模等后續(xù)編碼時(shí),請使用 `nrows `來避免每次都加載大量數(shù)據(jù)。當(dāng)你只想測試代碼而不是想實(shí)際運(yùn)行整個(gè)程序時(shí),可以使用此方法。

非常適合在你本地電腦配置不足以處理那么大的數(shù)據(jù)量, 但你喜歡用 Jupyter/VS code/Atom 開發(fā)的場景。


																																	
1f_train=pd.read_csv(‘train.csv’,nrows=1000)

預(yù)測失敗 (成熟開發(fā)人員的標(biāo)志)

總是檢查數(shù)據(jù)中的 NA(缺失值),因?yàn)檫@些數(shù)據(jù)可能會造成一些問題。即使你當(dāng)前的數(shù)據(jù)沒有,并不意味著它不會在未來的訓(xùn)練循環(huán)中出現(xiàn)。所以無論如何都要留意這個(gè)問題。


																																	
1print(len(df))
2df.isna().sum()
3df.dropna()
4print(len(df))

顯示處理進(jìn)度

在處理大數(shù)據(jù)時(shí),如果能知道還需要多少時(shí)間可以處理完,能夠了解當(dāng)前的進(jìn)度非常重要。

方案1:tqdm


																																	
 1fromtqdmimporttqdm
 2importtime
 3
 4tqdm.pandas()
 5
 6df['col']=df['col'].progress_apply(lambdax:x**2)
 7
 8text=""
 9forcharintqdm(["a","b","c","d"]):
10time.sleep(0.25)
11text=text+char

方案2:fastprogress


																																	
1fromfastprogress.fastprogressimportmaster_bar,progress_bar
2fromtimeimportsleep
3mb=master_bar(range(10))
4foriinmb:
5forjinprogress_bar(range(100),parent=mb):
6sleep(0.01)
7mb.child.comment=f'secondbarstat'
8mb.first_bar.comment=f'firstbarstat'
9mb.write(f'Finishedloop{i}.')

解決 Pandas 慢的問題

如果你用過 pandas,你就會知道有時(shí)候它的速度有多慢ーー尤其在團(tuán)隊(duì)合作時(shí)。與其絞盡腦汁去尋找加速解決方案,不如通過改變一行代碼來使用 modin。


																																	
1importmodin.pandasaspd

記錄函數(shù)的執(zhí)行時(shí)間

并不是所有的函數(shù)都生來平等。

即使全部代碼都運(yùn)行正常,也并不能意味著你寫出了一手好代碼。一些軟錯(cuò)誤實(shí)際上會使你的代碼變慢,因此有必要找到它們。使用此裝飾器記錄函數(shù)的時(shí)間。

 1importtime
 2
 3deftiming(f):
 4"""Decoratorfortimingfunctions
 5Usage:
 6@timing
 7deffunction(a):
 8pass
 9"""
10
11
12@wraps(f)
13defwrapper(*args,**kwargs):
14start=time.time()
15result=f(*args,**kwargs)
16end=time.time()
17print('function:%rtook:%2.2fsec'%(f.__name__,end-start))
18returnresult
19returnwrapp

																																	

不要在云上燒錢

沒有人喜歡浪費(fèi)云資源的工程師。

我們的一些實(shí)驗(yàn)可能會持續(xù)數(shù)小時(shí)。跟蹤它并在完成后關(guān)閉云實(shí)例是很困難的。我自己也犯過錯(cuò)誤,也看到過有些人會有連續(xù)幾天不關(guān)機(jī)的情況。

這種情況經(jīng)常會發(fā)生在我們周五上班,留下一些東西運(yùn)行,直到周一回來才意識到。

只要在執(zhí)行結(jié)束時(shí)調(diào)用這個(gè)函數(shù),你的屁股就再也不會著火了!

使用 `try` 和 `except` 來包裹 main 函數(shù),一旦發(fā)生異常,服務(wù)器就不會再運(yùn)行。我就處理過類似的案例

讓我們多一點(diǎn)責(zé)任感,低碳環(huán)保從我做起。

 1importos
 2
 3defrun_command(cmd):
 4returnos.system(cmd)
 5
 6defshutdown(seconds=0,os='linux'):
 7"""Shutdownsystemaftersecondsgiven.UsefulforshuttingEC2tosavecosts."""
 8ifos=='linux':
 9run_command('sudoshutdown-h-tsec%s'%seconds)
10elifos=='windows':
11run_command('shutdown-s-t%s'%seconds)

創(chuàng)建和保存報(bào)告

在建模的某個(gè)特定點(diǎn)之后,所有的深刻見解都來自于對誤差和度量的分析。確保為自己和上司創(chuàng)建并保存格式正確的報(bào)告。

不管怎樣,管理層都喜歡報(bào)告,不是嗎?

 1importjson
 2importos
 3
 4fromsklearn.metricsimport(accuracy_score,classification_report,
 5confusion_matrix,f1_score,fbeta_score)
 6
 7defget_metrics(y,y_pred,beta=2,average_method='macro',y_encoder=None):
 8ify_encoder:
 9y=y_encoder.inverse_transform(y)
10y_pred=y_encoder.inverse_transform(y_pred)
11return{
12'accuracy':round(accuracy_score(y,y_pred),4),
13'f1_score_macro':round(f1_score(y,y_pred,average=average_method),4),
14'fbeta_score_macro':round(fbeta_score(y,y_pred,beta,average=average_method),4),
15'report':classification_report(y,y_pred,output_dict=True),
16'report_csv':classification_report(y,y_pred,output_dict=False).replace('
','
')
17}
18
19
20defsave_metrics(metrics:dict,model_directory,file_name):
21path=os.path.join(model_directory,file_name+'_report.txt')
22classification_report_to_csv(metrics['report_csv'],path)
23metrics.pop('report_csv')
24path=os.path.join(model_directory,file_name+'_metrics.json')
25json.dump(metrics,open(path,'w'),indent=4)

寫出一手好 API

結(jié)果不好,一切都不好。

你可以做很好的數(shù)據(jù)清理和建模,但是你仍然可以在最后制造巨大的混亂。通過我與人打交道的經(jīng)驗(yàn)告訴我,許多人不清楚如何編寫好的 api、文檔和服務(wù)器設(shè)置。我將很快寫另一篇關(guān)于這方面的文章,但是先讓我簡要分享一部分。

下面的方法適用于經(jīng)典的機(jī)器學(xué)習(xí) 和 深度學(xué)習(xí)部署,在不太高的負(fù)載下(比如1000 / min)。

見識下這個(gè)組合: Fastapi + uvicorn + gunicorn

  • 最快的ー用 fastapi 編寫 API,因?yàn)?/span>這是最快的,原因參見這篇文章。
  • 文檔ー在 fastapi 中編寫 API 為我們提供了 http: url/docs 上的免費(fèi)文檔和測試端點(diǎn),當(dāng)我們更改代碼時(shí),fastapi 會自動(dòng)生成和更新這些文檔。
  • workerー使用 gunicorn 服務(wù)器部署 API,因?yàn)?gunicorn 具有啟動(dòng)多于1個(gè) worker,而且你應(yīng)該保留至少 2 個(gè)worker。
運(yùn)行這些命令來使用 4 個(gè) worker 部署。可以通過負(fù)載測試優(yōu)化 worker 數(shù)量。
1pipinstallfastapiuvicorngunicorn
2gunicorn-w4-kuvicorn.workers.UvicornH11Workermain:app


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9253

    瀏覽量

    85748
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1507

    瀏覽量

    62217
  • 機(jī)器學(xué)習(xí)

    關(guān)注

    66

    文章

    8428

    瀏覽量

    132837

原文標(biāo)題:寫給開發(fā)者的 10 條機(jī)器學(xué)習(xí)建議

文章出處:【微信號:vision263com,微信公眾號:新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    開發(fā)者的開源鴻蒙故事

    近日,在以“一切為了開發(fā)者”為主題的“2024開放原子開發(fā)者大會暨首屆開源技術(shù)學(xué)術(shù)大會”上,開源鴻蒙5.0 Release版本正式發(fā)布,備受各方關(guān)注。該版本在系統(tǒng)完備度、分布式創(chuàng)新、開發(fā)者體驗(yàn)以及系統(tǒng)穩(wěn)定性等方面均實(shí)現(xiàn)了顯著提升
    的頭像 發(fā)表于 01-06 10:28 ?123次閱讀

    《HarmonyOS第一課》煥新升級,賦能開發(fā)者快速掌握鴻蒙應(yīng)用開發(fā)

    《HarmonyOS第一課》煥新升級,賦能開發(fā)者快速掌握鴻蒙應(yīng)用開發(fā) 隨著HarmonyOS NEXT發(fā)布,鴻蒙生態(tài)日益壯大,廣大開發(fā)者對于系統(tǒng)化學(xué)習(xí)平臺和課程的需求愈發(fā)強(qiáng)烈。近日,華
    發(fā)表于 01-02 14:24

    NVIDIA Jetson Orin Nano開發(fā)者套件的新功能

    生成式 AI 領(lǐng)域正在迅速發(fā)展,每天都有新的大語言模型(LLM)、視覺語言模型(VLM)和視覺語言動(dòng)作模型(VLA)出現(xiàn)。為了在這一充滿變革的時(shí)代保持領(lǐng)先,開發(fā)者需要一個(gè)足夠強(qiáng)大的平臺將云端的最新模型無縫部署到邊緣,從而獲得基于 CUDA 的優(yōu)化推理性能和開放式機(jī)器
    的頭像 發(fā)表于 12-23 12:54 ?244次閱讀
    NVIDIA Jetson Orin Nano<b class='flag-5'>開發(fā)者</b>套件的新功能

    NVIDIA發(fā)布小巧高性價(jià)比的Jetson Orin Nano Super開發(fā)者套件

    Nano Super開發(fā)者套件體積小巧,僅相當(dāng)于一個(gè)手掌大小,但其功能卻異常強(qiáng)大。該套件旨在為商業(yè)AI開發(fā)者、科技愛好以及學(xué)生等各類用戶提供更為強(qiáng)大的生成式AI功能和性能。目前,這款開發(fā)者
    的頭像 發(fā)表于 12-19 11:28 ?479次閱讀

    云端AI開發(fā)者工具怎么用

    云端AI開發(fā)者工具通常包括代碼編輯器、模型訓(xùn)練平臺、自動(dòng)化測試工具、代碼管理工具等。這些工具不僅降低了AI開發(fā)的門檻,還極大地提高了開發(fā)效率和模型性能。下面,AI部落小編為您介紹云端AI開發(fā)者
    的頭像 發(fā)表于 12-05 13:31 ?156次閱讀

    HarmonyOS NEXT應(yīng)用元服務(wù)開發(fā)Intents Kit(意圖框架服務(wù))習(xí)慣推薦方案開發(fā)者測試

    北京時(shí)間保持一致。 點(diǎn)擊桌面的小藝建議卡片。此時(shí)卡片顯示的是“歡迎使用小藝建議”,點(diǎn)擊卡片打開小藝的隱私頁面,并選擇“同意”。如果此前已經(jīng)同意過小藝的隱私協(xié)議,此步驟可以跳過。 打開開發(fā)者調(diào)試模式:進(jìn)入
    發(fā)表于 11-25 17:37

    HarmonyOS NEXT應(yīng)用元服務(wù)開發(fā)Intents Kit(意圖框架服務(wù))事件推薦開發(fā)者測試

    北京時(shí)間保持一致。 點(diǎn)擊桌面的小藝建議卡片。此時(shí)卡片顯示的是“歡迎使用小藝建議”,點(diǎn)擊卡片打開小藝的隱私頁面,并選擇“同意”。如果此前已經(jīng)同意過小藝的隱私協(xié)議,此步驟可以跳過。 打開開發(fā)者調(diào)試模式:進(jìn)入
    發(fā)表于 11-18 17:39

    KaihongOS 4.1.2開發(fā)者預(yù)覽版正式上線,誠邀開發(fā)者免費(fèi)試用!

    深開鴻在2024開放原子開源生態(tài)大會上正式宣布KaihongOS4.1.2開發(fā)者預(yù)覽版全面上線,并向全球開發(fā)者開放免費(fèi)下載。作為KaihongOS不斷創(chuàng)新與發(fā)展的重要里程碑,此次預(yù)覽版為開發(fā)者提供了
    的頭像 發(fā)表于 09-28 08:07 ?364次閱讀
    KaihongOS 4.1.2<b class='flag-5'>開發(fā)者</b>預(yù)覽版正式上線,誠邀<b class='flag-5'>開發(fā)者</b>免費(fèi)試用!

    KaihongOS 4.1.2開發(fā)者預(yù)覽版正式上線,誠邀開發(fā)者免費(fèi)試用!

    今日,深開鴻在2024開放原子開源生態(tài)大會上正式宣布KaihongOS 4.1.2開發(fā)者預(yù)覽版全面上線,并向全球開發(fā)者開放免費(fèi)下載。作為KaihongOS不斷創(chuàng)新與發(fā)展的重要里程碑,此次預(yù)覽版為
    的頭像 發(fā)表于 09-26 15:59 ?488次閱讀

    【「時(shí)間序列與機(jī)器學(xué)習(xí)」閱讀體驗(yàn)】+ 簡單建議

    這本書以其系統(tǒng)性的框架和深入淺出的講解,為讀者繪制了一幅時(shí)間序列分析與機(jī)器學(xué)習(xí)融合應(yīng)用的宏偉藍(lán)圖。作者不僅扎實(shí)地構(gòu)建了時(shí)間序列分析的基礎(chǔ)知識,更巧妙地展示了機(jī)器學(xué)習(xí)如何在這一領(lǐng)域發(fā)揮巨
    發(fā)表于 08-12 11:21

    **十條PCB元器件擺放小建議**

    十條PCB元器件擺放小建議 PCB設(shè)計(jì)中有非常多關(guān)于布線線寬、布線疊層、原理圖等相關(guān)的技術(shù)規(guī)范。 事實(shí)上,關(guān)于元器件擺放限制很少,但這并不意味著你可以為所欲為。分享十條PCB元器件擺放小建議
    發(fā)表于 03-14 10:39

    Android 15的首個(gè)開發(fā)者預(yù)覽版現(xiàn)已發(fā)布

    Android 15 的首個(gè)開發(fā)者預(yù)覽版現(xiàn)已發(fā)布,以便各位開發(fā)者能與我們通力協(xié)作,打造更優(yōu)秀的 Android 平臺。
    的頭像 發(fā)表于 03-12 14:16 ?960次閱讀
    Android 15的首個(gè)<b class='flag-5'>開發(fā)者</b>預(yù)覽版現(xiàn)已發(fā)布

    源碼開放,開發(fā)者手機(jī) buff 疊滿

    開發(fā)者手機(jī)開源代碼編譯指導(dǎo) 編譯環(huán)境建議: ubuntu20.04 Linux 系統(tǒng)內(nèi)存:最低 16G Pyhon 3.8 安裝必要工具: sudo apt-get update sudo
    發(fā)表于 03-04 14:29

    鴻蒙系統(tǒng)優(yōu)缺點(diǎn),能否作為開發(fā)者選擇

    起跑線,都是0基礎(chǔ)開始。學(xué)習(xí)來輕松,未來趨勢大。 那么鴻蒙的發(fā)展,開發(fā)者如何抓住機(jī)遇?鴻蒙的開發(fā)技術(shù)要學(xué)習(xí)那些呢?下面分享鴻蒙的開發(fā)者技術(shù):
    發(fā)表于 02-16 21:00

    華為宣布HarmonyOS NEXT鴻蒙星河版開發(fā)者預(yù)覽面向開發(fā)者開放申請

    華為宣布HarmonyOS NEXT鴻蒙星河版開發(fā)者預(yù)覽面向開發(fā)者開放申請,這意味著鴻蒙生態(tài)進(jìn)入第二階段,將加速千行百業(yè)的應(yīng)用鴻蒙化。
    的頭像 發(fā)表于 01-29 16:42 ?1453次閱讀
    華為宣布HarmonyOS NEXT鴻蒙星河版<b class='flag-5'>開發(fā)者</b>預(yù)覽面向<b class='flag-5'>開發(fā)者</b>開放申請