有时候,作为一个数据科学家,我们常常忘记了初心。我们首先是一个开发者,然后才是研究人员,最后才可能是数学家。我们的首要职责是快速找到无 bug 的解决方案。
我们能做模型并不意味着我们就是神。这并不是编写垃圾代码的理由
自从我开始学习机器学习以来,我犯了很多错误。因此我想把我认 机器学习工程中最常用的技能分享出来。在我看来,这也是目前这个行业最缺乏的技能。
我称他们为不懂软件的数据科学家,因为他们中很大一部分人都没有系统地学习过计算机科学课程。而我自己也是如此。
如果要选择雇佣一个伟大的数据科学家和一个伟大的机器学习工程师,我会选择雇佣后者。
下面开始我的分享。
学习编写抽象类
一旦开始编写抽象类,你就能体会到它给带来的好处。抽象类强制子类使用相同的方法和方法名称。许多人在同一个项目上工作, 如果每个人去定义不同的方法,这样做没有必要也很容易造成混乱。
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."""
固定随机数种子
实验的可重复性是非常重要的,随机数种子是我们的敌人。要特别注重随机数种子的设置,否则会导致不同的训练 / 测试数据的分裂和神经网络中不同权重的初始化。这些最终会导致结果的不一致。
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)
先加载少量数据
如果你的数据量太大,并且你正在处理比如清理数据或建模等后续编码时,请使用 `nrows `来避免每次都加载大量数据。当你只想测试代码而不是想实际运行整个程序时,可以使用此方法。
非常适合在你本地电脑配置不足以处理那么大的数据量, 但你喜欢用 Jupyter/VS code/Atom 开发的场景。
1f_train=pd.read_csv(‘train.csv’,nrows=1000)
预测失败 (成熟开发人员的标志)
总是检查数据中的 NA(缺失值),因为这些数据可能会造成一些问题。即使你当前的数据没有,并不意味着它不会在未来的训练循环中出现。所以无论如何都要留意这个问题。
1print(len(df))
2df.isna().sum()
3df.dropna()
4print(len(df))
显示处理进度
在处理大数据时,如果能知道还需要多少时间可以处理完,能够了解当前的进度非常重要。
方案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,你就会知道有时候它的速度有多慢ーー尤其在团队合作时。与其绞尽脑汁去寻找加速解决方案,不如通过改变一行代码来使用 modin。
1importmodin.pandasaspd
记录函数的执行时间
并不是所有的函数都生来平等。
即使全部代码都运行正常,也并不能意味着你写出了一手好代码。一些软错误实际上会使你的代码变慢,因此有必要找到它们。使用此装饰器记录函数的时间。
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
不要在云上烧钱
没有人喜欢浪费云资源的工程师。
我们的一些实验可能会持续数小时。跟踪它并在完成后关闭云实例是很困难的。我自己也犯过错误,也看到过有些人会有连续几天不关机的情况。
这种情况经常会发生在我们周五上班,留下一些东西运行,直到周一回来才意识到。
只要在执行结束时调用这个函数,你的屁股就再也不会着火了!
使用 `try` 和 `except` 来包裹 main 函数,一旦发生异常,服务器就不会再运行。我就处理过类似的案例
让我们多一点责任感,低碳环保从我做起。
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)
创建和保存报告
在建模的某个特定点之后,所有的深刻见解都来自于对误差和度量的分析。确保为自己和上司创建并保存格式正确的报告。
不管怎样,管理层都喜欢报告,不是吗?
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
结果不好,一切都不好。
你可以做很好的数据清理和建模,但是你仍然可以在最后制造巨大的混乱。通过我与人打交道的经验告诉我,许多人不清楚如何编写好的 api、文档和服务器设置。我将很快写另一篇关于这方面的文章,但是先让我简要分享一部分。
下面的方法适用于经典的机器学习 和 深度学习部署,在不太高的负载下(比如1000 / min)。
见识下这个组合: Fastapi + uvicorn + gunicorn
- 最快的ー用 fastapi 编写 API,因为这是最快的,原因参见这篇文章。
- 文档ー在 fastapi 中编写 API 为我们提供了 http: url/docs 上的免费文档和测试端点,当我们更改代码时,fastapi 会自动生成和更新这些文档。
- workerー使用 gunicorn 服务器部署 API,因为 gunicorn 具有启动多于1个 worker,而且你应该保留至少 2 个worker。
1pipinstallfastapiuvicorngunicorn
2gunicorn-w4-kuvicorn.workers.UvicornH11Workermain:app
审核编辑 :李倩
-
服务器
+关注
关注
12文章
8641浏览量
84354 -
API
+关注
关注
2文章
1455浏览量
61439 -
机器学习
+关注
关注
66文章
8297浏览量
131745
原文标题:写给开发者的 10 条机器学习建议
文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
【「时间序列与机器学习」阅读体验】+ 简单建议
**十条PCB元器件摆放小建议**
源码开放,开发者手机 buff 叠满
鸿蒙系统优缺点,能否作为开发者选择
华为宣布HarmonyOS NEXT鸿蒙星河版开发者预览面向开发者开放申请
![华为宣布HarmonyOS NEXT鸿蒙星河版<b class='flag-5'>开发者</b>预览面向<b class='flag-5'>开发者</b>开放申请](https://file1.elecfans.com/web2/M00/BE/D1/wKgZomW3ZWmAFlVRAAAWanab5Ng944.png)
【开发者说】开发案例:使用canvas实现图表系列之折线图
![【<b class='flag-5'>开发者</b>说】<b class='flag-5'>开发</b>案例:使用canvas实现图表系列之折线图](https://file1.elecfans.com//web2/M00/B6/91/wKgZomV5ZvGAGzrqAABM_95KNDw782.png)
欢迎加入飞腾派开发者社区,感谢每一位开发者!
2023 DevFest 开发者大会 | 精彩进行时!
【开发者福利月】听开发者故事,享节日福利
![【<b class='flag-5'>开发者</b>福利月】听<b class='flag-5'>开发者</b>故事,享节日福利](https://file1.elecfans.com//web2/M00/AB/C3/wKgZomU3dyuACGfsAAJ8p7OEmeY920.jpg)
各位开发者期待已久的开源鸿蒙开发者手机已经开放购买啦!!
多元共进|探索社区故事,助力开发者成长
![多元共进|探索社区故事,助力<b class='flag-5'>开发者</b>成长](https://file1.elecfans.com//web2/M00/A4/1D/wKgaomUAWwSADTxbAADTR0cFGoI913.png)
TUYA开发者大会(中山)即将开幕,涂鸦携手全球开发者汇“智”中山
![TUYA<b class='flag-5'>开发者</b>大会(中山)即将开幕,涂鸦携手全球<b class='flag-5'>开发者</b>汇“智”中山](https://file.elecfans.com/web2/M00/40/04/pYYBAGJrTDSAYdI1AAASTiyZjeQ622.jpg)
评论