您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    数据迷信家易犯的十大编码错误,你中招了吗?
    时间:2019-05-05 12:04 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    数据迷信家比软件工程师擅长统计,又比统计学家擅长软件工程。听起来牛逼轰轰,理想却是,许少数据迷信家有统计学背景,却没有什么软件工程方面的阅历,因此在编码时容易犯一些复杂的错误。作为一名初级数据迷信家,本文作者总结了他在任务中常见数据迷信家犯的十大错误。

    数据迷信家易犯的十大编码错误,你中招了吗?

    我是一名初级数据迷信家,在 Stackoverflow 的 python 编码中排前 1%,而且还与众多(初级)数据迷信家一同任务。下文列出了我常见到的 10 个错误。

    1. 没有共享代码中援用的数据

    数据迷信需求代码和数据。所以为了让其别人可以复现本人做出来的结果,你需求提供代码中触及的数据。这看起来很复杂,但许多人会遗忘共享代码中需求的数据。

    import pandas as pd 

    df1 = pd.read_csv('file-i-dont-have.csv') # fails 

    do_stuff(df) 

    处置方案:用 d6tpipe 共享代码中的数据文件,或许将数据文件上传到 S3/网页/Google 云等,还可以将数据文件保存到数据库中,以便收件人检索文件(但不要将数据添加到 git 中,这一点前面的内容会讲到)。

    2. 硬编码其别人无法拜访的途径

    和错误 1 相似,假设硬编码其别人无法拜访的途径,他们就没法运转你的代码,而且在很多中央都必需要手动修正途径。Booo!

    import pandas as pd 

    df = pd.read_csv('/path/i-dont/have/data.csv') # fails 

    do_stuff(df) 

    # or  

    impor os 

    os.chdir('c:\\Users\\yourname\\desktop\\python') # fails 

    处置方案:运用相对途径、全局途径配置变量或 d6tpipe,这样其别人就可以随便拜访你的数据了。

    3. 将数据和代码混在一同

    既然数据迷信代码需求数据,为什么不将代码和数据存储在同一个目录中呢?但你运转代码时,这个目录中还会存储图像、报告以及其他渣滓文件。乱成一团!

    ├── data.csv 

    ├── ingest.py 

    ├── other-data.csv 

    ├── output.png 

    ├── report.html 

    └── run.py 

    处置方案:对目录停止分类,比如数据、报告、代码等。参阅 Cookiecutter Data Science 或 d6tflow 项目模板,并用成绩 1 中提到的工具存储以及共享数据。

    Cookiecutter Data Science:https://drivendata.github.io/cookiecutter-data-science/#directory-structure

    d6tflow 项目模板:https://github.com/d6t/d6tflow-template

    4. 用 Git 提交数据

    大少数人如今都会版本控制他们的代码(假设你没有这么做那就是另一个成绩了!)。在共享数据时,能够很容易将数据文件添加到版本控制中。对一些小文件来说这没什么成绩。但 git 无法优化数据,尤其是对大型文件而言。

    git add data.csv 

    处置方案:运用成绩 1 中提到的工具来存储和共享数据。假设你真的需求对数据停止版本控制,请参阅 d6tpipe、DVC 和 Git Large File Storage。

    DVC:https://dvc.org/

    Git Large File Storage:https://git-lfs.github.com/

    5. 写函数而不是 DAG

    数据曾经讨论得够多了,接上去我们谈谈实践的代码。你在学编程时,首先学的就是函数,数据迷信代码主要由一系列线性运转的函数组成。这会引发一些成绩,概略请参阅「4 Reasons Why Your Machine Learning Code is Probably Bad。」

    地址:

    https://towardsdatascience.com/4-reasons-why-your-machine-learning-code-is-probably-bad-c291752e4953

    def process_data(data, parameter): 

        data = do_stuff(data) 

        data.to_pickle('data.pkl') 

    data = pd.read_csv('data.csv') 

    process_data(data) 

    df_train = pd.read_pickle(df_train) 

    model = sklearn.svm.SVC() 

    model.fit(df_train.iloc[:,:-1], df_train['y']) 

    处置方案:与其用线性链接函数,不如写一组有依赖关系的义务。可以用 d6tflow 或许 airflow。

    6. 写 for 循环

    和函数一样,for 循环也是你在学代码时最先学的。这种语句易于了解,但运转很慢且过于冗长,这种状况通常表示你不知道用什么替代向量化。

    x = range(10) 

    avg = sum(x)/len(x); std = math.sqrt(sum((i-avg)**2 for i in x)/len(x)); 

    zscore = [(i-avg)/std for x] 

    # should be: scipy.stats.zscore(x) 

    # or 

    groupavg = [] 

    for i in df['g'].unique(): 

        dfdfg = df[df[g']==i] 

        groupavg.append(dfg['g'].mean()) 

    # should be: df.groupby('g').mean() 

    处置方案:NumPy、SciPy 和 pandas 都有向量化函数,它们可以处置大部分你觉得需求用 for 循环处置的成绩。

    7. 没有写单元测试

    随着数据、参数或许用户输入的改动,你的代码能够会中缀,而你有时分能够没留意到这一点。这就会招致错误的输入,假设有人依据你的输入做决策的话,那么错误的数据就会招致错误的决策!

    处置方案:用 assert 语句反省数据质量。Pandas 也有相反的测试,d6tstack 可以反省数据的获取,d6tjoin 可以反省数据的衔接。反省数据的示例代码如下:

    d6tstack:https://github.com/d6t/d6tstack

    d6tjoin:https://github.com/d6t/d6tjoin/blob/master/examples-prejoin.ipynb

    assert df['id'].unique().shape[0] == len(ids) # have data for all ids? 

    assert df.isna().sum()<0.9 # catch missing values 

    assert df.groupby(['g','date']).size().max() ==1 # no duplicate values/date? 

    assert d6tjoin.utils.PreJoin([df1,df2],['id','date']).is_all_matched() # all ids matched? 

    8. 没有注释代码

    (责任编辑:admin)