0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

写给开发者的十条机器学习建议

新机器视觉 来源:视学算法 作者:视学算法 2022-12-06 15:59 次阅读

有时候,作为一个数据科学家,我们常常忘记了初心。我们首先是一个开发者,然后才是研究人员,最后才可能是数学家。我们的首要职责是快速找到无 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。
运行这些命令来使用 4 个 worker 部署。可以通过负载测试优化 worker 数量。
1pipinstallfastapiuvicorngunicorn
2gunicorn-w4-kuvicorn.workers.UvicornH11Workermain:app


审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    12

    文章

    8641

    浏览量

    84354
  • API
    API
    +关注

    关注

    2

    文章

    1455

    浏览量

    61439
  • 机器学习
    +关注

    关注

    66

    文章

    8297

    浏览量

    131745

原文标题:写给开发者的 10 条机器学习建议

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【「时间序列与机器学习」阅读体验】+ 简单建议

    这本书以其系统性的框架和深入浅出的讲解,为读者绘制了一幅时间序列分析与机器学习融合应用的宏伟蓝图。作者不仅扎实地构建了时间序列分析的基础知识,更巧妙地展示了机器学习如何在这一领域发挥巨
    发表于 08-12 11:21

    **十条PCB元器件摆放小建议**

    十条PCB元器件摆放小建议 PCB设计中有非常多关于布线线宽、布线叠层、原理图等相关的技术规范。 事实上,关于元器件摆放限制很少,但这并不意味着你可以为所欲为。分享十条PCB元器件摆放小建议
    发表于 03-14 10:39

    源码开放,开发者手机 buff 叠满

    开发者手机开源代码编译指导 编译环境建议: ubuntu20.04 Linux 系统内存:最低 16G Pyhon 3.8 安装必要工具: sudo apt-get update sudo
    发表于 03-04 14:29

    鸿蒙系统优缺点,能否作为开发者选择

    起跑线,都是0基础开始。学习来轻松,未来趋势大。 那么鸿蒙的发展,开发者如何抓住机遇?鸿蒙的开发技术要学习那些呢?下面分享鸿蒙的开发者技术:
    发表于 02-16 21:00

    华为宣布HarmonyOS NEXT鸿蒙星河版开发者预览面向开发者开放申请

    华为宣布HarmonyOS NEXT鸿蒙星河版开发者预览面向开发者开放申请,这意味着鸿蒙生态进入第二阶段,将加速千行百业的应用鸿蒙化。
    的头像 发表于 01-29 16:42 1208次阅读
    华为宣布HarmonyOS NEXT鸿蒙星河版<b class='flag-5'>开发者</b>预览面向<b class='flag-5'>开发者</b>开放申请

    开发者说】开发案例:使用canvas实现图表系列之折线图

    】,即可获得投稿渠道。期待你们的分享~ 由于对HarmonyOS的兴趣与开发需求,我已经打卡学习ArkTS语言28天了。在模拟开发历史项目的时候,会经常需要使用到图表这类样式展示,我决定结合之前
    的头像 发表于 12-13 16:05 457次阅读
    【<b class='flag-5'>开发者</b>说】<b class='flag-5'>开发</b>案例:使用canvas实现图表系列之折线图

    欢迎加入飞腾派开发者社区,感谢每一位开发者

    与此同时,飞腾在电子发烧友论坛构建了在飞腾派开发者社区,期待更多开发者不断加入,积极参与社区贡献,产出优秀的技术内容,让更多开发者可以学习参考!飞腾派
    发表于 12-11 16:11

    2023 DevFest 开发者大会 | 精彩进行时!

    与 Google 员工、GDE 谷歌开发者专家、社区 KOL、行业开发者和问题解决面对面交流的机会。 今年,中国区的 DevFest 2023 系列活动已拉开序幕,在全国 20 多个城市相继举办,其中
    的头像 发表于 11-01 09:25 330次阅读

    开发者福利月】听开发者故事,享节日福利

    代码界拥有特殊意义的 1024 (2 的 10 次方) 寓意着开发者的专业性和勤奋精神 这一群默默无闻 却又好像无所不能的幕后英雄 赋予了数字灵魂 让冰冷的机器拥有了思考与执行的能力 所以今天,我们
    的头像 发表于 10-24 15:45 258次阅读
    【<b class='flag-5'>开发者</b>福利月】听<b class='flag-5'>开发者</b>故事,享节日福利

    PCB元器件摆放的十条小技巧,你都知道吗?

    PCB元器件摆放的十条小技巧,你都知道吗?
    的头像 发表于 10-17 14:52 2242次阅读
    PCB元器件摆放的<b class='flag-5'>十条</b>小技巧,你都知道吗?

    各位开发者期待已久的开源鸿蒙开发者手机已经开放购买啦!!

    各位开发者期待已久的开源鸿蒙开发者手机已经开放购买啦!! “开源鸿蒙开发者手机”,本质上是手机形态的开发板,为广大 OpenHarmony 开发者
    发表于 10-10 18:32

    多元共进|探索社区故事,助力开发者成长

    技术社区中的多元交流 带来丰富的灵感思维 为开发者的发展成长注入不竭的动力 谷歌凭借多种开发者生态项目和社区活动 辅助开发者学习和成长的道路上稳步前行 中国的
    的头像 发表于 09-12 20:30 471次阅读
    多元共进|探索社区故事,助力<b class='flag-5'>开发者</b>成长

    多元共进|整合开发者社区资源,共建繁荣生态

    社区计划的目的是与开发者同在,实现双向对话、互动和参与,帮助开发者获得成功。开发者可以在遍布全球的谷歌开发者社区里与来自不同背景、公司和行业的其他
    的头像 发表于 09-10 19:25 499次阅读
    多元共进|整合<b class='flag-5'>开发者</b>社区资源,共建繁荣生态

    TUYA开发者大会(中山)即将开幕,涂鸦携手全球开发者汇“智”中山

    9月15日,TUYA开发者大会将在中山隆重召开。本次大会以“智汇中山,制造引领”为主题,涂鸦智能将携手全球开发者,以及各类品牌制造商、平台产品服务商、系统集成商、地产商等,共同探讨涂鸦开发者平台
    的头像 发表于 09-08 08:17 534次阅读
    TUYA<b class='flag-5'>开发者</b>大会(中山)即将开幕,涂鸦携手全球<b class='flag-5'>开发者</b>汇“智”中山

    TUYA开发者大会(中山)即将开幕,涂鸦携手全球开发者汇“智”中山

    9月15日,TUYA开发者大会将在中山隆重召开。据悉,本次大会以“智汇中山,制造引领”为主题,全球化IoT开发者平台涂鸦智能(NYSE: TUYA,HKEX: 2391)将携手全球开发者,以及各类
    的头像 发表于 09-07 14:00 391次阅读