金沙js0888_首頁(欢迎您)

  • <td id="dgejl"><strike id="dgejl"></strike></td>
        1. Python开发者宝典:10个有用的机器学习实践!

          编译作者: 布加迪 2020-05-29 07:00:00

          Python开发者宝典:10个有用的机器学习实践!

          【51CTO.com快译】

          有时作为数据科学家,我们忘了自己是干什么的。我们主要是开发者,然后是研究者,最后可能是数学家。我们的首要责任是快速开发没有错误的解决方案。

          就因为我们能构建模型并不意味着我们就是神,这没有给我们编写垃圾代码的自由。

          自一开始,我犯过很多错误,想透露一下我认为是机器学习工程最常见的技能。我认为,这也是眼下业界最缺乏的技能。

          我称他们为不懂软件的数据科学家,因为他们中很多人都是不是计算机专业科班出身的工程师。而我本人就是那样。

          如果要聘一位优秀的数据科学家和一位优秀的机器学习工程师,我会聘后者。

          1. 学习编写抽象类。

          一旦你开始编写抽象类,就知道可以如何让你的代码库清晰许多。它们强制执行同样的方法和方法名称。如果很多人从事同一个项目,每个人会开始采用不同的方法。这会造成严重的混乱。

          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。

          试验的可重现性很重要,而seed是大敌。处理好seed。不然,它会导致神经网络中训练/测试数据的不同分隔和权重的不同初始化。这会导致结果不一致。

          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. 从几行入手。

          如果你的数据太庞大,又处在编程的后期阶段(比如清理数据或建模),就使用nrows避免每次加载庞大数据。如果你只想测试代码、不想实际运行全部代码,就使用这招。

          如果你的本地PC配置不足以处理数据大小,这一招很有用,但你喜欢在Jupyter/VS code/Atom上进行本地开发。

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

          4. 预料失败(这是成熟开发者的标志)。

          始终检查数据中的NA,因为这些会在以后给你带来问题。即便你目前的数据没有任何NA,也并不意味着它不会出现在将来的再训练循环中。所以无论如何要检查。

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

          5. 显示处理的进度。

          你在处理庞大数据时,知道要花多少时间、处于整个处理过程中的哪个环节,绝对让人安心。

          方法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,就知道它有时会变得多慢,尤其是执行groupby操作时。不必绞尽脑汁为提速寻找“出色的”解决方案,只要更改一行代码,使用modin就行。

          1. import modin.pandas as pd 

          7. 为函数计时。

          不是所有函数都是一样的。

          即便全部代码没问题,也不意味着你编写的是出色的代码。一些软错误实际上会使代码运行起来比较慢,有必要把它们找出来。使用这个装饰器来记录函数的时间。

          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. 别把钱耗费在云上。

          没人喜欢浪费云资源的工程师。

          一些试验可能持续数小时。很难跟踪试验、云实例用完后关闭。本人就犯过这种错误,也见过有人任由实例运行数天。

          只是在执行结束时调用该函数,永远不会有麻烦!

          但用try包主代码,并用except再采用这种方法,那样如果出现了错误,服务器不会处于继续运行的状态。是的,我也处理过这种情况。

          不妨负责任一点,别生成二氧化碳了。

          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. 创建和保存报告。

          建模中某个点之后,所有宝贵的信息只来自错误和度量分析。确保为你自己和你的经理创建和保存格式完好的报告。

          不管怎样,管理层爱看报告,不是吗?

          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。

          所有结尾不好的代码都是不好的。

          你的数据清理和建模可能做得很好,但最后还是会造成大混乱。经验告诉我,许多人不清楚如何编写优秀的API、文档和服务器配置。

          以下是负载不太高(比如1000/分钟)的典型的机器学习和深度学习部署的好方法。

          不妨见识这对组合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来部署。通过负载测试来优化workers的数量。

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

          Python开发者宝典:10个有用的机器学习实践!

          原文标题:10 Useful Machine Learning Practices For Python Developers,作者:Pratik Bhavsar

          【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

          Python 机器学习 编程语言
          上一篇:可再生能源与机器学习“双重加持”,谷歌成功实现风力预测 下一篇:2020年人工智能(AI)十大趋势应用
          评论
          取消
          暂无评论,快去成为第一个评论的人吧

          更多资讯推荐

          以人工智能促进就业发展

          近年来,人工智能快速发展,成为引领新一轮科技革命与产业变革的核心驱动力,全面深刻地改变着人类的生产和生活方式。我国高度重视人工智能的发展,并将人工智能上升为国家战略。

          吕茵 ·? 12h前
          了解情绪划分:如何使用机器学习来保持积极心态?

          “思考再思考,然后采取行动”,这样的流程是不是听起来很熟悉?大多数人都是这样做的。为了清晰了解情绪的划分,我编写了这个机器学习(ML)程序。

          读芯术 ·? 18h前
          金钱能让人更快乐吗?手把手教你用机器学习找到答案

          本文通过“金钱能让人更快乐吗?”等实操案例带你了解基于实例的学习和基于模型的学习。

          华章科技 ·? 2天前
          机器学习在网络管理中有什么应用前景?

          网络正朝着自动化和智能化的趋势发展,企业对人工智能(AI)和机器学习(ML)的需求日益增长,因为它们能够以程序化的方式识别网络问题,并对复杂的问题进行即时诊断。

          李雪薇 ·? 2天前
          无基础人员转行做机器学习可以吗?

          无基础人员转行做机器学习可以吗?机器学习需要一定数学基础,没有相关的了解需要重新学习。转行机器学习不适用所有人,可不可以转行需要具体结合自身的情况。入门机器学习有一定的门槛要慎重决定。

          吾非鱼 ·? 2天前
          全面的数据科学C/C++机器学习库整理,再也不用百度搜了

          C++是动态负载平衡、自适应缓存、开发大型数据框架和库的理想选择。谷歌的MapReduce,MunGDB,下面列出的大多数深度学习库都是用C++实现的。以超低延迟和极高吞吐量著称的Scylla,使用C++作为Apache Casand and Amazon DynDoDB的替代者进行编码。

          为AI呐喊 ·? 2天前
          十大针对机器学习的文本注释工具与服务,你会选用哪个?

          本文将和您探讨目前十大针对机器学习的文本注释工具与服务。您可以根据自己项目的实际情况,从中做出选择并试用。

          陈峻 ·? 2天前
          缺失何在?当下机器学习教育的短板

          随着机器学习的日益流行,网上出现了越来越多的在线课程,个个都说自己在教“开创AI职业生涯”的必备技能。

          大数据文摘 ·? 2天前
          Copyright?2005-2020 51CTO.COM 版权所有 未经许可 请勿转载
          金沙js0888