日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Python開發(fā)者寶典:10個有用的機器學(xué)習(xí)實踐!

有時作為數(shù)據(jù)科學(xué)家,我們忘了自己是干什么的。我們主要是開發(fā)者,然后是研究者,最后可能是數(shù)學(xué)家。我們的首要責(zé)任是快速開發(fā)沒有錯誤的解決方案。

為平房等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及平房網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站設(shè)計、成都做網(wǎng)站、平房網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

就因為我們能構(gòu)建模型并不意味著我們就是神,這沒有給我們編寫垃圾代碼的自由。

自一開始,我犯過很多錯誤,想透露一下我認為是機器學(xué)習(xí)工程最常見的技能。我認為,這也是眼下業(yè)界最缺乏的技能。

我稱他們?yōu)椴欢浖臄?shù)據(jù)科學(xué)家,因為他們中很多人都是不是計算機專業(yè)科班出身的工程師。而我本人就是那樣。

如果要聘一位優(yōu)秀的數(shù)據(jù)科學(xué)家和一位優(yōu)秀的機器學(xué)習(xí)工程師,我會聘后者。

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

一旦你開始編寫抽象類,就知道可以如何讓你的代碼庫清晰許多。它們強制執(zhí)行同樣的方法和方法名稱。如果很多人從事同一個項目,每個人會開始采用不同的方法。這會造成嚴重的混亂。

 
 
 
 
  1. import os  
  2. from abc import ABCMeta, abstractmethod  
  3. class DataProcessor(metaclass=ABCMeta):  
  4. """Base processor to be used for all preparation."""  
  5. def __init__(self, input_directory, output_directory):  
  6. self.input_directory = input_directory  
  7. self.output_directory = output_directory  
  8. @abstractmethod  
  9. def read(self):  
  10. """Read raw data."""  
  11. @abstractmethod  
  12. def process(self):  
  13. """Processes raw data. This step should create the raw dataframe with all the required features. Shouldn't implement statistical or text cleaning."""  
  14. @abstractmethod  
  15. def save(self):  
  16. """Saves processed data."""  
  17. class Trainer(metaclass=ABCMeta):  
  18. """Base trainer to be used for all models."""  
  19. def __init__(self, directory):  
  20. self.directory = directory  
  21. self.model_directory = os.path.join(directory, 'models')  
  22. @abstractmethod  
  23. def preprocess(self):  
  24. """This takes the preprocessed data and returns clean data. This is more about statistical or text cleaning."""  
  25. @abstractmethod  
  26. def set_model(self):  
  27. """Define model here."""  
  28. @abstractmethod  
  29. def fit_model(self):  
  30. """This takes the vectorised data and returns a trained model."""  
  31. @abstractmethod  
  32. def generate_metrics(self):  
  33. """Generates metric with trained model and test data.""" 
  34. @abstractmethod  
  35. def save_model(self, model_name):  
  36. """This method saves the model in our required format."""  
  37. class Predict(metaclass=ABCMeta):  
  38. """Base predictor to be used for all models.""" 
  39. def __init__(self, directory):  
  40. self.directory = directory  
  41. self.model_directory = os.path.join(directory, 'models')  
  42. @abstractmethod  
  43. def load_model(self):  
  44. """Load model here."""  
  45. @abstractmethod  
  46. def preprocess(self):  
  47. """This takes the raw data and returns clean data for prediction.""" 
  48. @abstractmethod  
  49. def predict(self):  
  50. """This is used for prediction."""  
  51. class BaseDB(metaclass=ABCMeta): 
  52. """ Base database class to be used for all DB connectors."""  
  53. @abstractmethod  
  54. def get_connection(self):  
  55. """This creates a new DB connection."""  
  56. @abstractmethod  
  57. def close_connection(self):  
  58. """This closes the DB connection."""  

2. 搞定最上面的seed。

試驗的可重現(xiàn)性很重要,而seed是大敵。處理好seed。不然,它會導(dǎo)致神經(jīng)網(wǎng)絡(luò)中訓(xùn)練/測試數(shù)據(jù)的不同分隔和權(quán)重的不同初始化。這會導(dǎo)致結(jié)果不一致。

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

3. 從幾行入手。

如果你的數(shù)據(jù)太龐大,又處在編程的后期階段(比如清理數(shù)據(jù)或建模),就使用nrows避免每次加載龐大數(shù)據(jù)。如果你只想測試代碼、不想實際運行全部代碼,就使用這招。

如果你的本地PC配置不足以處理數(shù)據(jù)大小,這一招很有用,但你喜歡在Jupyter/VS code/Atom上進行本地開發(fā)。

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

4. 預(yù)料失敗(這是成熟開發(fā)者的標志)。

始終檢查數(shù)據(jù)中的NA,因為這些會在以后給你帶來問題。即便你目前的數(shù)據(jù)沒有任何NA,也并不意味著它不會出現(xiàn)在將來的再訓(xùn)練循環(huán)中。所以無論如何要檢查。

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

5. 顯示處理的進度。

你在處理龐大數(shù)據(jù)時,知道要花多少時間、處于整個處理過程中的哪個環(huán)節(jié),絕對讓人安心。

方法1 — tqdm

 
 
 
 
  1. from tqdm import tqdm  
  2. import time  
  3. tqdm.pandas()  
  4. df['col'] = df['col'].progress_apply(lambda x: x**2)  
  5. text = ""  
  6. for char in tqdm(["a", "b", "c", "d"]):  
  7. time.sleep(0.25)  
  8. text = text + char  

方法2 — fastprogress

 
 
 
 
  1. from fastprogress.fastprogress import master_bar, progress_bar  
  2. from time import sleep  
  3. mb = master_bar(range(10))  
  4. for i in mb:  
  5. for j in progress_bar(range(100), parent=mb):  
  6. sleep(0.01)  
  7. mb.child.comment = f'second bar stat'  
  8. mb.first_bar.comment = f'first bar stat'  
  9. mb.write(f'Finished loop {i}.')  

6. Pandas可能很慢。

如果你接觸過pandas,就知道它有時會變得多慢,尤其是執(zhí)行g(shù)roupby操作時。不必絞盡腦汁為提速尋找“出色的”解決方案,只要更改一行代碼,使用modin就行。

 
 
 
 
  1. import modin.pandas as pd 

7. 為函數(shù)計時。

不是所有函數(shù)都是一樣的。

即便全部代碼沒問題,也不意味著你編寫的是出色的代碼。一些軟錯誤實際上會使代碼運行起來比較慢,有必要把它們找出來。使用這個裝飾器來記錄函數(shù)的時間。

 
 
 
 
  1. import time  
  2. def timing(f):  
  3. """Decorator for timing functions  
  4. Usage:  
  5. @timing  
  6. def function(a):  
  7. pass 
  8. """  
  9. @wraps(f)  
  10. def wrapper(*args, **kwargs):  
  11. start = time.time()  
  12. result = f(*args, **kwargs)  
  13. end = time.time()  
  14. print('function:%r took: %2.2f sec' % (f.__name__, end - start)) 
  15. return result  
  16. return wrapper  

8. 別把錢耗費在云上。

沒人喜歡浪費云資源的工程師。

一些試驗可能持續(xù)數(shù)小時。很難跟蹤試驗、云實例用完后關(guān)閉。本人就犯過這種錯誤,也見過有人任由實例運行數(shù)天。

只是在執(zhí)行結(jié)束時調(diào)用該函數(shù),永遠不會有麻煩!

但用try包主代碼,并用except再采用這種方法,那樣如果出現(xiàn)了錯誤,服務(wù)器不會處于繼續(xù)運行的狀態(tài)。是的,我也處理過這種情況。

不妨負責(zé)任一點,別生成二氧化碳了。

 
 
 
 
  1. import os  
  2. def run_command(cmd):  
  3. return os.system(cmd)  
  4. def shutdown(seconds=0, os='linux'):  
  5. """Shutdown system after seconds given. Useful for shutting EC2 to save costs."""  
  6. if os == 'linux':  
  7. run_command('sudo shutdown -h -t sec %s' % seconds)  
  8. elif os == 'windows':  
  9. run_command('shutdown -s -t %s' % seconds)  

9. 創(chuàng)建和保存報告。

建模中某個點之后,所有寶貴的信息只來自錯誤和度量分析。確保為你自己和你的經(jīng)理創(chuàng)建和保存格式完好的報告。

不管怎樣,管理層愛看報告,不是嗎?

 
 
 
 
  1. import json  
  2. import os  
  3. from sklearn.metrics import (accuracy_score, classification_report,  
  4. confusion_matrix, f1_score, fbeta_score)  
  5. def get_metrics(y, y_pred, beta=2, average_method='macro', y_encoder=None):  
  6. if y_encoder:  
  7. y = y_encoder.inverse_transform(y)  
  8. y_pred = y_encoder.inverse_transform(y_pred)  
  9. return {  
  10. 'accuracy': round(accuracy_score(y, y_pred), 4),  
  11. 'f1_score_macro': round(f1_score(y, y_pred, average=average_method), 4),  
  12. 'fbeta_score_macro': round(fbeta_score(y, y_pred, beta, average=average_method), 4),  
  13. 'report': classification_report(y, y_pred, output_dict=True),  
  14. 'report_csv': classification_report(y, y_pred, output_dict=False).replace('\n','\r\n')  
  15. }  
  16. def save_metrics(metrics: dict, model_directory, file_name):  
  17. path = os.path.join(model_directory, file_name + '_report.txt')  
  18. classification_report_to_csv(metrics['report_csv'], path)  
  19. metrics.pop('report_csv')  
  20. path = os.path.join(model_directory, file_name + '_metrics.json')  
  21. json.dump(metrics, open(path, 'w'), indent=4)  

10. 編寫出色的API。

所有結(jié)尾不好的代碼都是不好的。

你的數(shù)據(jù)清理和建??赡茏龅煤芎?,但最后還是會造成大混亂。經(jīng)驗告訴我,許多人不清楚如何編寫優(yōu)秀的API、文檔和服務(wù)器配置。

以下是負載不太高(比如1000/分鐘)的典型的機器學(xué)習(xí)和深度學(xué)習(xí)部署的好方法。

不妨見識這對組合Fastapi + uvicorn

  • 最快:用fastapi編寫API,因為就I/O型操作而言它是速度最快的(https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7),原因在此(https://fastapi.tiangolo.com/benchmarks/)有解釋。
  • 說明文檔:用fastapi編寫API為我們在http:url/docs提供了免費文檔和測試端點→我們更改代碼時,由fastapi自動生成和更新。
  • Workers:使用uvicorn部署API。

運行這些命令使用4個workers來部署。通過負載測試來優(yōu)化workers的數(shù)量。

 
 
 
 
  1. pip install fastapi uvicorn  
  2. uvicorn main:app --workers 4 --host 0.0.0.0 --port 8000  

當前標題:Python開發(fā)者寶典:10個有用的機器學(xué)習(xí)實踐!
當前地址:http://m.5511xx.com/article/coojehe.html