【.com速译】有时候作为数据科学家,我们会忘记自己在做什么。我们主要是开发人员,然后是研究人员,最后可能是数学家。我们的首要职责是快速开发无错误的解决方案。仅仅因为我们可以建立模型并不意味着我们是神,它并没有给我们写废话的自由。从一开始我就犯了很多错误,我想揭示我认为是机器学习工程中最常见的技能。我认为这是目前行业最缺乏的技能。我称他们为不懂软件的数据科学家,因为他们中有很多人是不是计算机专业的工程师。而我自己就是这样。如果我必须聘请一名优秀的数据科学家和一名优秀的机器学习工程师,我会聘请后者。1.学习写抽象类。一旦你开始编写抽象类,看看它们如何使你的代码库更清晰。它们强制执行相同的方法和方法名称。如果很多人在同一个项目上工作,每个人都会开始采取不同的方法。这会导致严重的混乱。importosfromabcimportABCMeta,抽象方法类数据处理器(metaclass=ABCMeta):“”“用于所有准备的基本处理器。”“”def__init__(self,input_directory,output_directory):self.input_directory=input_directoryself.output_directory=output_directory@abstractmethoddefread(self):“”“Readrawdata。”“”@abstractmethoddefprocess(self):"""Processesrawdata.Thisstepshouldcreatetherawdataframewithalltherequiredfeatures.Shouldn'timplementstatisticalortextcleaning."""@abstractmethoddefsave(self):"""Savesprocesseddata.""classTrainer(metaclass=ABCMeta):"""Basetrainertobeusedforallmodels."""def__init__(self,directory):self.directory=directoryself.model_directory=os.path.join(directory,'models')@abstractmethoddefpreprocess(self):"""Thistakesthepreprocesseddataandreturnscleandata.Thisismoreaboutstatisticalortextcleaning."""@abstractmethoddefset_model(self):"""在此处定义模型。"""@abstractmethoddeft_model(self):"""Thistakesthevectoriseddataandreturnsatrainedmodel."""@abstractmethoddefgenerate_metrics(self):"""用经过训练的模型和测试数据生成度量。"""@abstractmethoddefsave_model(self,model_name):"""Thismethodssavesthemodelinourrequiredformat."""classPredict(metaclass=ABCMeta):"""Basepredictortobeusedforallmodels."""def__init__(self,directory):self.directory=directoryself.model_directory=os.path.join(directory),'models')@abstractmethoddefload_model(self):"""Loadmodelhere."""@abstractmethoddefpreprocess(self):"""Thistakestherawdataandreturnscleandataforprediction."""@abstractmethoddefpredict(self):"""这是用于预测。"""classBaseDB(metaclass=ABCMeta):"""BasedatabaseclasstobeusedforallDBconnectors."""@abstractmethoddefget_connection(self):"""ThiscreatesanewDBconnection."""@abstractmethoddefclose_connection(self):"""ThisclosestheDBconnection."""2.获得头号种子实验的可复现性很重要,种子是敌人。注意种子。否则会导致训练/测试数据的不同拆分和神经网络中权重的不同初始化。这将导致结果不一致seed)3.从几行开始,如果你的数据太大,而且你在编程的后期阶段(比如清洗数据或者建模),使用nrows避免每次加载巨大的数据。如果你只是想测试代码并且不想实际运行所有代码,请使用此技巧。如果您的位置,此技巧很有用lPC配置不足以处理数据大小,但你喜欢在Jupyter/VScode/Atom上进行本地开发。df_train=pd.read_csv('train.csv',nrows=1000)4.期望失败(这是成熟开发人员的标志)。始终检查数据中的NA,因为这些会在以后给您带来问题。即使您当前的数据没有任何NA,也不意味着它不会出现在未来的再训练循环中。所以无论如何都要检查。print(len(df))df.isna().sum()df.dropna()print(len(df))5.显示处理进度。当您处理大量数据时,知道您花费了多少时间以及您在流程中所处的位置绝对令人放心。方法1—tqdmfromtqdmimporttqdmimporttimetqdm.pandas()df['col']=df['col'].progress_apply(lambdax:x**2)text=""forcharintqdm(["a","b","c",“d”]):time.sleep(0.25)text=text+char方法2—fastprogressfromfastprogress.fastprogressimportmaster_bar,progress_barfromtimeimportsleepmb=master_bar(range(10))foriinmb:forjinprogress_bar(range(100),parent=mb):sleep(0.01)mb.child.comment=f'secondbarstat'mb.first_bar.comment=f'firstbarstat'mb.write(f'Finishedloop{i}.')6.Pandas可能很慢。如果您使用过pandas,您就会知道它有时会变得多慢,尤其是在执行groupby操作时。与其绞尽脑汁寻找一个“不错”的解决方案来加快速度,只需更改一行代码并使用modin。importmodin.pandasaspd7.定时功能。并非所有功能都生而平等。即使您的所有代码都很好,也不意味着您正在编写出色的代码。一些软错误实际上会使代码运行速度变慢,值得找到它们。使用此装饰器记录函数的时间。importtimedeftiming(f):"""DecoratorfortimingfunctionsUsage:@timingdeffunction(a):pass"""@wraps(f)defwrapper(*args,**kwargs):start=time.time()result=f(*args,**kwargs)end=time.time()print('function:%rtook:%2.2fsec'%(f.__name__,end-start))returnresultreturnwrapper8.不要把钱花在云上。没有人喜欢工程师浪费云资源。有些试验可能会持续几个小时。难以跟踪试验,云实例在耗尽后关闭。我自己也犯过这个错误,而且我已经看到实例运行了好几天。只需在执行结束时调用该函数,您就永远不会遇到麻烦!但是把主要的代码用try包裹起来,用except来使用这个方法,这样如果出现问题,服务器就不会处于继续运行的状态。是的,我也处理过这种情况。还不如负责并停止产生二氧化碳。importosdefrun_command(cmd):returnos.system(cmd)defshutdown(seconds=0,os='linux'):"""Shutdownsystemaftersecondsgiven.UsefulforshuttingEC2tosavecosts."""ifos=='linux':run_command('sudoshutdown-h-tsec%s'%seconds)elifos=='windows':run_command('shutdown-s-t%s'%seconds)9.创建并保存报告。在建模的某个点之后,所有有价值的信息仅来自错误和度量分析。确保为您自己和您的经理创建并保存格式正确的报告。不管怎样,管理层爱看报告,不是吗?=y_encoder.inverse_transform(y)y_pred=y_encoder.inverse_transform(y_pred)return{'accuracy':round(accuracy_score(y,y_pred),4),'f1_score_macro':round(f1_score(y,y_pred,average=average_method),4),'fbeta_score_macro':round(fbeta_score(y,y_pred,beta,average=average_method),4),'report':classification_report(y,y_pred,output_dict=True),'report_csv':classification_report(y,y_pred,output_dict=False).replace('\n','\r\n')}defsave_metrics(metrics:dict,model_directory,file_name):path=os.path.join(model_directory,file_name+'_report.txt')classification_report_to_csv(指标['report_csv'],path)metrics.pop('report_csv')path=os.path.join(model_directory,file_name+'_metrics.json')json.dump(metrics,open(path,'w'),indent=4)10。写出颜色的API。所有结束不好的代码都是不好的。您可能在清理和建模数据方面做得很好,但最终还是一团糟。我从经验中了解到,许多人不知道如何编写好的API、文档和服务器配置。以下是负载不太高(比如1000/分钟)的典型机器学习和深度学习部署的好方法。不妨认识一下这个组合Fastapi+uvicornFastest:用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个工作人员。通过负载测试优化worker数量。pipinstallfastapiuvicornuvicornmain:app--workers4--host0.0.0.0--port8000原标题:Python开发者的10个有用的机器学习实践,作者:PratikBhavsar】
