当前位置:揭西新闻 > 历史 > 正文

数据科学家易犯的十大编码错误,你中招博朗扑克加工厂了吗?

2019年07月11日 16:22 来源:天天基金 手机版

核心提示

divblockquotep数据科学家比软件工程师擅长统计,又比统计学家擅长软件工程。听起来牛逼轰轰,事实却是,许多数据科学家有统计学背景,却没有什么软件工程方面的经验,因此在编码时容易犯一些简单的错误。作为一名高级数据科学家,本文作者总结了他在工作中常

o12conv cab,合肥中山医院叶凡,超级搜鬼仪笔趣阁,tube8korea,传奇法师扬威异界,藏宝海湾皮裤,黄小山个人简历,搜牛新闻网,秀文q笔文学,连云港康贝尔精凌岭,ibw24,70 85 48 248,活着就是恶心3,草木不留人,冥婚鬼王选妃,贪睡皇妃,吕锡文的父亲是谁,qq20012官方下载,盗版射雕之完颜康,running man 130203,12306ng org,海比网,钮钴禄伊兰,老婆你站住,yy6080白屏,removebg,奥莉维亚 帕勒莫,burstlyimagecache,驰锐人才网,马申科爆料全套
<div><blockquote><p>数据科学家比软件工程师擅长统计,又比统计学家擅长软件工程。听起来牛逼轰轰,事实却是,许多数据科学家有统计学背景,却没有什么软件工程方面的经验,因此在编码时容易犯一些简单的错误。作为一名高级数据科学家,本文作者总结了他在工作中常见数据科学家犯的十大错误。</p></blockquote><div class="pgc-img"><img src="http://p9.pstatp.com/large/pgc-image/152878b3dedd4738a45342a38a08373c" img_width="800" img_height="452" alt="数据科学家易犯的十大编码错误,你中招了吗?" inline="0"><p class="pgc-img-caption"></p></div><p>我是一名高级数据科学家,在 Stackoverflow 的 python 编码中排前 1%,而且还与众多(初级)数据科学家一起工作。下文列出了我常见到的 10 个错误。</p><p><strong>没有共享代码中引用的数据</strong></p><p>数据科学需要代码和数据。所以为了让其他人能够复现自己做出来的结果,你需要提供代码中涉及的数据。这看起来很简单,但许多人会忘记共享代码中需要的数据。</p><pre>import pandas as pd<br>df1 = pd.read_csv('file-i-dont-have.csv') # fails<br>do_stuff(df)<br></pre><p>解决方案:用 d6tpipe 共享代码中的数据文件,或者将数据文件上传到 S3/网页/Google 云等,还可以将数据文件保存到数据库中,以便收件人检索文件(但不要将数据添加到 git 中,这一点后面的内容会讲到)。</p><p><strong>硬编码其他人无法访问的路径</strong></p><p>和错误 1 类似,如果硬编码其他人无法访问的路径,他们就没法运行你的代码,而且在很多地方都必须要手动修改路径。Booo!</p><pre>import pandas as pd<br>df = pd.read_csv('/path/i-dont/have/data.csv') # fails<br>do_stuff(df)<br># or <br>impor os<br>os.chdir('c:\\Users\\yourname\\desktop\\python') # fails<br></pre><p>解决方案:使用相对路径、全局路径配置变量或 d6tpipe,这样其他人就可以轻易访问你的数据了。</p><p><strong>将数据和代码混在一起</strong></p><p>既然数据科学代码需要数据,为什么不将代码和数据存储在同一个目录中呢?但你运行代码时,这个目录中还会存储图像、报告以及其他垃圾文件。乱成一团!</p><pre>├── data.csv<br>├── ingest.py<br>├── other-data.csv<br>├── output.png<br>├── report.html<br>└── run.py<br></pre><p>解决方案:对目录进行分类,比如数据、报告、代码等。参阅 Cookiecutter Data Science 或 d6tflow 项目模板,并用问题 1 中提到的工具存储以及共享数据。</p><ul><li>Cookiecutter Data Science:https://drivendata.github.io/cookiecutter-data-science/#directory-structure</li><li>d6tflow 项目模板:https://github.com/d6t/d6tflow-template</li></ul><p><strong>用 Git 提交数据</strong></p><p>大多数人现在都会版本控制他们的代码(如果你没有这么做那就是另一个问题了!)。在共享数据时,可能很容易将数据文件添加到版本控制中。对一些小文件来说这没什么问题。但 git 无法优化数据,尤其是对大型文件而言。</p><pre>git add data.csv<br></pre><p>解决方案:使用问题 1 中提到的工具来存储和共享数据。如果你真的需要对数据进行版本控制,请参阅 d6tpipe、DVC 和 Git Large File Storage。</p><ul><li>DVC:https://dvc.org/</li><li>Git Large File Storage:https://git-lfs.github.com/</li></ul><p><strong>写函数而不是 DAG</strong></p><p>数据已经讨论得够多了,接下来我们谈谈实际的代码。你在学编程时,首先学的就是函数,数据科学代码主要由一系列线性运行的函数组成。这会引发一些问题,详情请参阅「4 Reasons Why Your Machine Learning Code is Probably Bad。」</p><ul><li>地址:https://towardsdatascience.com/4-reasons-why-your-machine-learning-code-is-probably-bad-c291752e4953</li></ul><pre>def process_data(data, parameter):<br> data = do_stuff(data)<br> data.to_pickle('data.pkl')<br>data = pd.read_csv('data.csv')<br>process_data(data)<br>df_train = pd.read_pickle(df_train)<br>model = sklearn.svm.SVC()<br>model.fit(df_train.iloc[:,:-1], df_train['y'])<br></pre><p>解决方案:与其用线性链接函数,不如写一组有依赖关系的任务。可以用 d6tflow 或者 airflow。</p><p><strong>写 for 循环</strong></p><p>和函数一样,for 循环也是你在学代码时最先学的。这种语句易于理解,但运行很慢且过于冗长,这种情况通常表示你不知道用什么替代向量化。</p><pre>x = range(10)<br>avg = sum(x)/len(x); std = math.sqrt(sum((i-avg)**2 for i in x)/len(x));<br>zscore = [(i-avg)/std for x]<br># should be: scipy.stats.zscore(x)<br># or<br>groupavg = []<br>for i in df['g'].unique():<br> dfg = df[df[g']==i]<br> groupavg.append(dfg['g'].mean())<br># should be: df.groupby('g').mean()<br></pre><p>解决方案:NumPy、SciPy 和 pandas 都有向量化函数,它们可以处理大部分你觉得需要用 for 循环解决的问题。</p><p><strong>没有写单元测试</strong></p><p>随着数据、参数或者用户输入的改变,你的代码可能会中断,而你有时候可能没注意到这一点。这就会导致错误的输出,如果有人根据你的输出做决策的话,那么错误的数据就会导致错误的决策!</p><p>解决方案:用 assert 语句检查数据质量。Pandas 也有相同的测试,d6tstack 可以检查数据的获取,d6tjoin 可以检查数据的连接。检查数据的示例代码如下:</p><ul><li>d6tstack:https://github.com/d6t/d6tstack</li><li>d6tjoin:https://github.com/d6t/d6tjoin/blob/master/examples-prejoin.ipynb</li></ul><pre>assert df['id'].unique().shape[0] == len(ids) # have data for all ids?<br>assert df.isna().sum()&lt;0.9 # catch missing values<br>assert df.groupby(['g','date']).size().max() ==1 # no duplicate values/date?<br>assert d6tjoin.utils.PreJoin([df1,df2],['id','date']).is_all_matched() # all ids matched?<br></pre><p><strong>没有注释代码</strong></p><p>我明白你急着做分析。于是你把代码拼凑起来得到结果,把结果交给你的客户或者老板。一周之后他们找到你,问你「你能改掉 xyz 吗?」或「你能更新一下结果吗?」。然后你和自己的代码大眼瞪小眼,既不记得你为什么要这么做,也不记得你做过什么。现在想象一下其他人运行这段代码时的心情。</p><pre>def some_complicated_function(data):<br> data = data[data['column']!='wrong']<br> data = data.groupby('date').apply(lambda x: complicated_stuff(x))<br> data = data[data['value']&lt;0.9]<br> return data<br></pre><p>解决方案:即便你已经完成了分析,也要花时间注释一下你做过什么。你会感谢自己的,当然其他人会更加感谢你!这样你看起来会更专业!</p><p><strong>把数据存成 csv 或 pickle</strong></p><p>说回数据,毕竟我们讨论的是数据科学。就像函数和 for 循环一样,CSV 和 pickle 文件也很常用,但它们其实并没有那么好。CSV 不包含模式(schema),所以每个人都必须重新解析数字和日期。Pickle 可以解决这一点,但只能用在 Python 中,而且不能压缩。这两种格式都不适合存储大型数据集。</p><pre>def process_data(data, parameter):<br> data = do_stuff(data)<br> data.to_pickle('data.pkl')<br>data = pd.read_csv('data.csv')<br>process_data(data)<br>df_train = pd.read_pickle(df_train)<br></pre><p>解决方案:用 parquet 或者其他带有数据模式的二进制数据格式,最好还能压缩数据。d6tflow 可以自动将数据输出存储为 parquet,这样你就不用解决这个问题了。</p><ul><li>parquet:https://github.com/dask/fastparquet</li></ul><p><strong>使用 Jupyter notebook</strong></p><p>这个结论还有一些争议——Jupyter notebook 就像 CSV 一样常用。很多人都会用到它们。但这并不能让它们变得更好。Jupyter notebook 助长了上面提到的许多不好的软件工程习惯,特别是:</p><ol><li>你会把所有文件存在一个目录中;</li><li>你写的代码是自上而下运行的,而不是 DAG;</li><li>你不会模块化你的代码;</li><li>代码难以调试;</li><li>代码和输出会混合在一个文件中;</li><li>不能很好地进行版本控制。</li></ol><p>Jupyter notebook 很容易上手,但规模太小。</p><p>解决方案:用 pycharm 和/或 spyder。</p><p><em>原文链接:https://medium.com/m/global-identity?redirectUrl=https%3A%2F%2Ftowardsdatascience.com%2Ftop-10-coding-mistakes-made-by-data-scientists-bb5bc82faaee</em></p></div>
胎记北京华盛最专业,畅想小李飞刀,神偷百变星,牛田洋事件,求佛临淄方言版,刺陵演员表,ddd52,利豪揪痧,华翔路2239号,yanmenzhao,上海茸城女子医院,孟扬海战,恶魔殿下的天使之吻,阿宝的故事演员表,www15iii com,哈票网佛山,色麒麟修真记,高中生新娘第一季,quzhuzhe桔子电影,大雪纷飞歇后语,镜辟天,电狼刷新点,xlueops exe,林大德,梁光烈被限制自由,立鲁足球网,厨王争霸20130305,雏女劫,大无畏金刚劲,四弟太诱人

本文地址:http://www.net2asp.cn/caijing/20190711/14107.html 转载请注明出处!