av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

出色代碼成就機(jī)器學(xué)習(xí):數(shù)據(jù)科學(xué)的軟件工程技巧和優(yōu)秀實(shí)踐

本文轉(zhuǎn)載自公眾號“讀芯術(shù)”(ID:AI_Discovery)。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了茶陵免費(fèi)建站歡迎大家使用!

如果你對數(shù)據(jù)科學(xué)感興趣,那么可能對這個(gè)工作流程很熟悉:通過運(yùn)行Jupyter notebook開啟一個(gè)項(xiàng)目,然后開始編寫python代碼、運(yùn)行復(fù)雜的分析甚至訓(xùn)練模型。隨著notebook文件的函數(shù)、類、圖和日志的大小不斷增長,你會發(fā)現(xiàn)自己面前堆積了巨大的一團(tuán)代碼塊。運(yùn)氣好的話,一切都能順利進(jìn)行。那你真的很厲害!

但是,Jupyter notebook隱藏了一些嚴(yán)重的陷阱,可能會讓代碼變成噩夢。讓我們看看這是如何發(fā)生的,然后討論一下防止這種情況出現(xiàn)的最佳編碼方法。

Jupyter Notebook的問題

通常,如果你想使Jupyter原型開發(fā)更上一層樓,事情結(jié)果可能會不符合你的預(yù)期。這是筆者在使用此工具時(shí)遇到的一些情況,你應(yīng)該也很熟悉:

  • 將所有對象(函數(shù)或類)定義并實(shí)例化后,可維護(hù)性就變得非常困難:即使想對函數(shù)做些小改動,也必須將其放在筆記本中的某個(gè)位置進(jìn)行修復(fù),然后重新運(yùn)行重新編碼。你一定不希望這種事情發(fā)生。將邏輯和處理功能分離在外部腳本中不是更簡單嗎?
  • 由于其交互性和即時(shí)反饋,jupyternotebook促使數(shù)據(jù)科學(xué)家在全局名稱空間中聲明變量,而不是使用函數(shù)。這在python開發(fā)中是不好的做法,它限制了有效的代碼重用。

由于筆記本電腦變成容納所有變量的大型狀態(tài)機(jī),因此也會損害其可重復(fù)性。在這種配置下,必須記住要哪個(gè)結(jié)果被緩存,哪個(gè)結(jié)果沒有被緩存,還必須期望其他用戶遵循你的單元執(zhí)行順序。

  • 筆記本在后臺格式化的方式(JSON對象)使代碼版本控制變得困難。這就是為什么筆者很少看到數(shù)據(jù)科學(xué)家使用GIT提交不同版本的筆記本,或合并分支以實(shí)現(xiàn)特定功能。

因此,團(tuán)隊(duì)協(xié)作變得低效笨拙:團(tuán)隊(duì)成員開始通過電子郵件或Slack交換代碼段和筆記本,回滾到以前的代碼版本成為一場噩夢,文件組織開始變得混亂。這是在沒有正確版本控制的情況下, 使用Jupyter notebook兩到三周后,我在項(xiàng)目中通常看到的內(nèi)容:

 
 
 
 
  1. analysis.ipynb
  2. analysis_COPY(1).ipynb
  3. analysis_COPY(2).ipynb
  4. analysis_FINAL.ipynb
  5. analysis_FINAL_2.ipynb

Jupyter notebook非常適合探索和快速制作原型。它們肯定不是為可重用性或生產(chǎn)用途而設(shè)計(jì)的。如果你使用Jupyter notebook開發(fā)了數(shù)據(jù)處理管道,那么最好的情況是代碼僅按照單元執(zhí)行順序以線性同步方式在筆記本電腦或VM上運(yùn)行。

但這并沒有說明你的代碼在更復(fù)雜的環(huán)境中的行為方式,例如,較大的輸入數(shù)據(jù)集,其他異步并行任務(wù)或分配較少的資源。實(shí)際上我們很難測試筆記本,因?yàn)樗鼈兊男袨橛袝r(shí)是不可預(yù)測的。

作為一個(gè)將大部分時(shí)間花在VSCode上的人,我常常利用功能強(qiáng)大的擴(kuò)展來進(jìn)行代碼添加、樣式格式化、代碼結(jié)構(gòu)、自動完成和代碼庫搜索,因此當(dāng)切換回Jupyter時(shí),筆者不禁感到有些無能為力。與VSCode相比,Jupyter notebook缺少強(qiáng)制執(zhí)行最佳編程實(shí)踐的擴(kuò)展。

好了,抱怨到此為止。筆者真的很喜歡Jupyter,認(rèn)為它對設(shè)計(jì)工作非常有用。你肯定可以用它來引導(dǎo)小項(xiàng)目或快速創(chuàng)建想法原型,但你必須遵循軟件工程的原則。當(dāng)數(shù)據(jù)科學(xué)家使用notebook時(shí),有時(shí)會忽略這些原則,讓我們一起回顧下其中一些吧。

讓代碼再次出色的小技巧

這些技巧是從不同的項(xiàng)目、筆者參加的聚會以及過去合作過的軟件工程師和架構(gòu)師的討論中匯編而來的。注意,以下內(nèi)容皆假設(shè)我們正在編寫python腳本,而不是notebook。

1. 清理代碼

代碼質(zhì)量最重要的維度是清晰,清晰易讀的代碼對于協(xié)作和可維護(hù)性至關(guān)重要。這樣做可以幫你獲得更簡潔的代碼:

使用有意義的描述性和暗示型變量名。例如,如果要聲明一個(gè)關(guān)于屬性(例如年齡)的布爾變量來檢查一個(gè)人是否老了,那么可以使用is_old使其既具有描述性又具有類型信息性。聲明數(shù)據(jù)的方式也是一樣的:讓它具有解釋性。

 
 
 
 
  1. # not good ...
  2. import pandas as pd
  3. df = pd.read_csv(path)# better!transactions = pd.read_csv(path)
  • 避免使用只有你能理解的縮寫和沒有人能忍受的長變量名。
  • 不要直接在代碼中編碼“魔術(shù)數(shù)字”。在變量中定義它們,以便每個(gè)人都能理解它們所指的內(nèi)容。
  •   
      
      
      
    1. # not good ...
    2. optimizer = SGD(0.0045, momentum=True)# better !
    3. learning_rate = 0.0045
    4. optimizer = SGD(learning_rate, momentum=True)
  • 遵循PEP8約定給對象命名:例如,函數(shù)和方法名用小寫字母表示,單詞用下劃線分隔,類名遵循UpperCaseCamelCase約定,常量用大寫字母表示,等等。
  • 使用縮進(jìn)和空格使代碼更加美觀。有一些標(biāo)準(zhǔn)約定,例如“每個(gè)縮進(jìn)使用4個(gè)空格”,“單獨(dú)的節(jié)應(yīng)該有額外的空行”等等。

圖源: prettier.io/

2. 使代碼模塊化

當(dāng)你開始構(gòu)建可以在相同或其他項(xiàng)目中重復(fù)使用的東西時(shí),你必須將代碼組織為邏輯功能和模塊,這有助于構(gòu)建更好的組織和可維護(hù)性。

例如,你正在研究NLP項(xiàng)目,并且你可能具有不同的處理功能來處理文本數(shù)據(jù)(標(biāo)記,剝離URL,修飾詞等)。你可以將所有這些單元放入名為text_processing.py的python模塊中,然后從中導(dǎo)入它們,主程序?qū)⒏p巧。

這是有關(guān)編寫模塊化代碼的一些技巧:

  • 不要自我重復(fù)。盡可能泛化或合并你的代碼。
  • 函數(shù)應(yīng)該用來做一件事。如果一個(gè)函數(shù)執(zhí)行多項(xiàng)操作,則很難被概括。
  • 在函數(shù)中抽象邏輯,但又不要過度設(shè)計(jì),否則最終可能會有太多的模塊。運(yùn)用你的判斷力,如果你沒有經(jīng)驗(yàn),請查看scikit-learn等流行的GitHub存儲庫,并學(xué)習(xí)其編碼風(fēng)格。

3. 重構(gòu)代碼

重構(gòu)旨在重新組織代碼的內(nèi)部結(jié)構(gòu),而不改變其功能,通常是在有效(但仍未完全組織)的代碼版本上完成的。它有助于消除重復(fù)功能,重組文件結(jié)構(gòu),并添加更多抽象。

圖源:unsplash

4. 提高代碼效率

編寫高效的代碼以快速執(zhí)行并消耗更少的內(nèi)存和存儲空間,是軟件開發(fā)中的另一項(xiàng)重要技能。編寫高效的代碼需要多年的經(jīng)驗(yàn),但是以下一些小技巧可以幫助你確定代碼是否運(yùn)行緩慢以及如何提高代碼運(yùn)行速度:

  • 在執(zhí)行任何操作之前,請檢查算法的復(fù)雜性以評估其執(zhí)行時(shí)間。
  • 通過檢查每個(gè)操作的運(yùn)行時(shí)間來檢查腳本可能遇到的瓶頸。
  • 盡可能避免for循環(huán)并使操作向量化,尤其是在使用NumPy或pandas等庫的情況下。
  • 通過使用多處理來利用計(jì)算機(jī)的CPU內(nèi)核。

5. 使用GIT或任何其他版本控制系統(tǒng)

使用GIT + Github幫助我提高了編碼技能,更好地組織了項(xiàng)目。由于我是在與朋友和同事合作時(shí)使用它的,所以我遵守了過去不遵守的標(biāo)準(zhǔn)。

圖源: freecodecamp

無論是在數(shù)據(jù)科學(xué)還是軟件開發(fā)中,使用版本控制系統(tǒng)都有很多好處。

  • 跟蹤你的更改
  • 回滾到任何以前的代碼版本
  • 團(tuán)隊(duì)成員之間通過合并和請求進(jìn)行有效的協(xié)作
  • 提高代碼質(zhì)量
  • 代碼審查
  • 為團(tuán)隊(duì)成員分配任務(wù),并提供“持續(xù)集成”和“持續(xù)交付”掛鉤,以自動構(gòu)建和部署項(xiàng)目。

圖源: Atlassian

6. 測試代碼

如果你要構(gòu)建一個(gè)執(zhí)行一系列操作的數(shù)據(jù)管道,且要確保它能夠按照設(shè)計(jì)的目的執(zhí)行,其中一種方法是編寫可檢查預(yù)期行為的測試。測試可以像檢查函數(shù)的輸出形狀或期望值一樣簡單。

圖源:https://pytest-c-testrunner.re

為功能和模塊編寫測試有很多好處:

  • 它提高了代碼的穩(wěn)定性,并使錯(cuò)誤更容易發(fā)現(xiàn)。
  • 防止意外輸出
  • 有助于檢測邊緣情況
  • 防止將破損的代碼推向生產(chǎn)環(huán)境

7. 使用日志記錄

一旦代碼的第一個(gè)版本運(yùn)行了,你需要監(jiān)察每個(gè)步驟,以了解發(fā)生了什么、跟蹤進(jìn)度或發(fā)現(xiàn)錯(cuò)誤,你可以使用日志記錄。以下是有效使用日志記錄的一些技巧:

  • 根據(jù)要記錄的消息的性質(zhì),使用不同的級別(調(diào)試,信息,警告)。
  • 在日志中提供有用的信息,以幫助解決相關(guān)問題。
 
 
 
 
  1. import logging
  2. logging.basicConfig(filename='example.log',level=logging.DEBUG)
  3. logging.debug('This message should go to the log file')
  4. logging.info('So should this')
  5. logging.warning('And this, too')

圖源:techgig

告別代碼噩夢,這些小技巧要學(xué)起來。


分享文章:出色代碼成就機(jī)器學(xué)習(xí):數(shù)據(jù)科學(xué)的軟件工程技巧和優(yōu)秀實(shí)踐
URL分享:http://uogjgqi.cn/article/cdidhji.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們在微信上24小時(shí)期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流