TowardsDataScience 博客中文翻译 2016~2018(一百四十八)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

如何在 6 个月内学会深度学习

原文:https://towardsdatascience.com/how-to-learn-deep-learning-in-6-months-e45e40ef7d48?source=collection_archive---------2-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在大约 6 个月的时间里,很有可能学习、跟随和贡献深度学习的艺术作品。本文详细介绍了实现这一目标的步骤。

先决条件

-你愿意在接下来的 6 个月里每周花 10-20 个小时
-你有一些编程技能。一路上捡 Python 应该很舒服。和云。(假设没有 Python 和云背景)。
-过去的一些数学教育(代数、几何等)。
-接入互联网和电脑。

第一步

我们通过开车来学习开车。而不是通过学习离合器和内燃机的工作原理。至少最初没有。在学习深度学习时,我们会遵循同样的自上而下的方法。

fast.ai 课程— 程序员实用深度学习—第一部分。这需要大约 4-6 周的努力。本课程有一节课是关于在云上运行代码的。谷歌联合实验室有免费的 GPU 访问。从那个开始。其他选项包括 PaperspaceAWSGCPCrestleFloydhub 。所有这些都很棒。不要开始建造你自己的机器。至少现在还没有。

第二步

这是了解一些基本知识的时候了。学习微积分和线性代数。

对于微积分,微积分大图提供了很好的概述。

对于线性代数,Gilbert Strang 在开放课件上的麻省理工课程很惊艳。

一旦做完以上两条,再看深度学习的矩阵演算

第三步

现在是了解深度学习的自下而上方法的时候了。在 Coursera 上完成深度学习专业的全部 5 门课程。你需要付费来给作业评分。但是这种努力是值得的。理想情况下,考虑到你目前为止所获得的背景知识,你应该能够每周完成一门课程。

第四步

“只工作不玩耍,聪明的孩子也变傻”

做一个顶点项目。这是你深入研究深度学习库(例如:Tensorflow、PyTorch、MXNet)并为你喜欢的问题从头实现一个架构的时候。

前三步是了解如何以及在哪里使用深度学习,并获得坚实的基础。这一步是关于从零开始实现一个项目,并在工具的基础上发展一个强大的基础。

第五步

现在快去做ai 的 part II 课程——程序员前沿深度学习。这涵盖了更高级的主题,你将学会阅读最新的研究论文,并从中理解。

每个步骤大约需要 4-6 周的时间。在你开始学习的大约 26 周内,如果你虔诚地遵循以上所有内容,你将在深度学习方面有一个坚实的基础。

接下来去哪里?

参加斯坦福大学的 CS231nCS224d 课程。这两个课程分别对视觉和 NLP 有很大的深度。他们涵盖最新的艺术水平,阅读深度学习书籍。这会巩固你的理解。

快乐深度学习。创造每一天。

如何在低内存上处理 BigData 文件?

原文:https://towardsdatascience.com/how-to-learn-from-bigdata-files-on-low-memory-incremental-learning-d377282d38ff?source=collection_archive---------6-----------------------

关于如何使用 Pandas/Dask 在 Python 中处理大数据文件的演练

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Ruffa Jane Reyes on Unsplash

这是我在Tackle类别的帖子中的一个,可以在我的 github repo 这里找到。

(Edit-31/01/2019)为 BigData 添加了 dask.distributed.LocalCluster 的信息

**(Edit-12/4/2019)——**添加了关于数据集大小缩减和文件类型使用的新章节【尚未完成,但您仍可从中获得应用思路。]

索引

  1. 简介
  2. 列记忆还原(pd。Series.astype()) [:未完成]
  3. 文件类型(减少内存使用) [:未完成]
  4. 数据探索
  5. 预处理
  6. 增量学习(熊猫)
  7. Dask(探索+准备+拟合预测)
  8. 延伸阅读
  9. 参考文献
***NOTE:*** This post goes along with ***Jupyter Notebook*** available in my Repo on Github:[[HowToHandleBigData](https://nbviewer.jupyter.org/github/PuneetGrov3r/MediumPosts/blob/master/Tackle/BigData-IncrementalLearningAndDask.ipynb)]  (with dummy data)
and 
Kaggle:[[HowToHandleBigData](https://www.kaggle.com/puneetgrover/learn-from-bigdata-files-on-low-memory)] (with Kaggle [competition](https://www.kaggle.com/c/ga-customer-revenue-prediction) data)

1.简介 ^

随着数据量呈指数级增长,我们无法在电脑内存中容纳我们的数据,甚至我们的模型。我们都买不起高端组装台式机。

例如,最近的 kaggle 竞赛的数据集无法容纳在 kaggle 内核或 Colab 的 17GB 内存中。它有将近 200 万行,最重要的是,一些列有非常大的 JSON 数据作为字符串。我们应该如何解决这个问题?我们可以向谁求助呢?

增量学习和/或 Dask 来拯救!

你可能已经知道神经网络本质上是增量学习器,所以我们可以在那里解决这个问题。许多sklearn的模型提供了一种叫做partial_fit的方法,使用它我们可以批量建模。一些像XGBoostLightGBM这样的 Boosting 库提供了一种渐进学习的方式来处理大数据。

在这里,我们将研究一些 Boosting 算法提供的增量解决方案。然后我们将在同一个数据集上使用Dask,并使用其模型进行预测。

2.列存储缩减

^

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Lisa H on Unsplash

# I don't know who the original author of this function is,
# but you can use this function to **reduce memory**
# **consumption** **by** **60-70%!****def** *reduce_mem_usage*(df):
    """ 
    iterate through all the columns of a dataframe and 
    modify the data type to reduce memory usage.        
    """
    start_mem = df.memory_usage().sum() / 1024**2
    **print**(('Memory usage of dataframe is {:.2f}' 
                     'MB').format(start_mem))

    **for** col in df.columns:
        col_type = df[col].dtype

        **if** col_type != object:
            c_min = df[col].min()
            c_max = df[col].max()
            **if** str(col_type)[:3] == 'int'**:**
                **if** c_min > np.iinfo(np.int8).min and c_max <\
                  np.iinfo(np.int8).max:
                    df[col] = df[col].astype(np.int8)
                **elif** c_min > np.iinfo(np.int16).min and c_max <\
                   np.iinfo(np.int16).max:
                    df[col] = df[col].astype(np.int16)
                **elif** c_min > np.iinfo(np.int32).min and c_max <\
                   np.iinfo(np.int32).max:
                    df[col] = df[col].astype(np.int32)
                **elif** c_min > np.iinfo(np.int64).min and c_max <\
                   np.iinfo(np.int64).max:
                    df[col] = df[col].astype(np.int64)  
            **else**:
                **if** c_min > np.finfo(np.float16).min and c_max <\
                   np.finfo(np.float16).max:
                    df[col] = df[col].astype(np.float16)
                **elif** c_min > np.finfo(np.float32).min and c_max <\
                   np.finfo(np.float32).max:
                    df[col] = df[col].astype(np.float32)
                **else**:
                    df[col] = df[col].astype(np.float64)
        **else**:
            df[col] = df[col].astype('category') end_mem = df.memory_usage().sum() / 1024**2
    **print**(('Memory usage after optimization is: {:.2f}' 
                              'MB').format(end_mem))
    **print**('Decreased by {:.1f}%'.format(100 * (start_mem - end_mem) 
                                             / start_mem))

    **return** df

坦克

3.文件类型

^

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Kelly Sikkema on Unsplash

HDF5、拼花地板等。

注:如果你不想落入这一节,你可以只看 HDF5。这应该足够了。转到下一部分。

分层数据格式—维基百科 (HDF5)

阿帕奇拼花地板

Hadoop 文件格式:它不再仅仅是 CSV——Kevin Haas(不要在阅读 Hadoop 后被吓跑,您可以只使用 Parquet 格式并通过使用pd.DataFrame.to_parquetpd.DataFrame.read_parquet方法。)

还有,如果你有兴趣: Parquet vs Avro 【无论如何我都会推荐你去看。]

坦克

4.数据探索 ^

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Panos Sakalakis on Unsplash

首先,我们将通过使用以下命令查看前几行来了解我们的数据是什么样子的:

part = pd.read_csv("train.csv.zip", nrows=10)
part.head()

通过这个,你将有关于不同的列是如何构成的,如何处理每个列等的基本信息。列出不同类型的栏目,如numerical_columnsobj_columnsdictionary_columns等。它将保存所有相应的列。

现在,为了研究数据,我们将像这样逐列进行:

**#** For dictionary columns you can do:# 'idx' is index of corresponding column in DataFrame.
# You can find it by using np.where(col==df.columns)for col in dictionary_columns:
    df = pd.read_csv("train.csv.zip", usecols = [idx], converters={col: json.loads})
    column_as_df = json_normalize(df[col])
    # ... plot each column ...
    # ... check if you want to drop any column ... 

您可以将所有列名作为键的字典和应用于它的方法保存在一个列表中,作为该列的管道。你也可以把你的字典保存起来,以备将来使用:

with open("preprocessing_pipeline.pickle", "wb") as fle:
  pickle.dump(preprocessing_pipeline, fle)

如果其中一列对您的内存来说太大,实际上我上面提到的 kaggle 竞赛中的一行就是这种情况。你甚至可以逐步打开一列,并可以做一些基本的事情,如计算平均值,标准差等。手动。或者你也可以用Dask来代替它,用和pandas几乎一样的 API 来计算它们。参见最后一节Dask

5.预处理 ^

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by rawpixel on Unsplash

对于预处理数据,我们将使用我们之前创建的字典,它包含关于我们希望保留哪些列(作为键)以及对每列应用什么方法(作为值)的信息,以创建一个方法。

在增量学习过程中,每一批数据都会调用这个方法。

现在这里要注意的一件事是我们安装了方法(比如 LabelEncoder 的、scalar的等等。)在探索整个数据列的过程中,我们将在这里的每个增量步骤中使用它来转换数据。因为,在每一批中,可能会有一些数据丢失,如果我们使用了不同的标签编码器标量等。对于每一批,这些方法不会给出相同类别的相同结果。这就是为什么我们在探索过程中已经安装了整个列。

以下是预处理数据的方法:

def preprocess(df):
  df.reset_index(drop=True, inplace=True)

  # For dict columns:
  for col in dict_columns:
    col_df = json_normalize(df[col])
    # json.loads during pd.read_csv to convert string to dict.                                
    col_df.columns = [f"{col}.{subcolumn}" for subcolumn in col_df.columns]
    # Select all columns which we selected before.
    selected_columns = [c for c in dictionary.keys() if c in col_df.columns()]
    to_drop = [c for c in col_df.columns if not in selected_columns]

    # Drop all previously unselected columns.
    col_df = col_df.drop(to_drop, axis=1)                                       

    df = df.drop(col, axis=1).merge(col_df, right_index=True, left_index=True)

  # And so on...

  # And then apply all Scalars, LabelEncoder's to all columns selected...

  return df

6.增量学习 ^

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Bruno Nascimento on Unsplash

要使用pandas增量读取数据文件,您必须使用一个参数chunksize,该参数指定一次要读/写的行数。

incremental_dataframe = pd.read_csv("train.csv",
                        chunksize=100000) **#** Number of lines to read.# This method will return a sequential file reader (TextFileReader)
# reading 'chunksize' lines every time. To read file from 
# starting again, you will have to call this method again.

然后你可以使用XGBoost LightGBM对你的数据进行增量训练。对于LightGBM,你必须向它的.train方法传递一个参数keep_training_booster=True,向XGBoost.train方法传递三个参数。

**#** First one necessary for incremental learning:
lgb_params = {
  'keep_training_booster': True,
  'objective': 'regression',
  'verbosity': 100,
}**#** First three are for incremental learning:
xgb_params = {
  'update':'refresh',
  'process_type': 'update',
  'refresh_leaf': True,
  'silent': False,
  }

在每一步中,我们将保存我们的估计值,然后在下一步中将其作为参数传递。

**#** For saving regressor for next use.
lgb_estimator = None
xgb_estimator = Nonefor df in incremental_dataframe:
  df = preprocess(df)

  xtrain, ytrain, xvalid, yvalid = # Split data as you like

  lgb_estimator = lgb.train(lgb_params,
                         **#** Pass partially trained model:
                         init_model=lgb_estimator,
                         train_set=lgb.Dataset(xtrain, ytrain),
                         valid_sets=lgb.Dataset(xvalid, yvalid),
                         num_boost_round=10)

  xgb_model = xgb.train(xgb_params, 
                        dtrain=xgb.DMatrix(xtrain, ytrain),
                        evals=(xgb.DMatrix(xvalid, yvalid),"Valid"),
                        **#** Pass partially trained model:
                        xgb_model = xgb_estimator)

  del df, xtrain, ytrain, xvalid, yvalid
  gc.collect()

CatBoost的增量学习法正在进行中。

为了加快速度,如果您的块仍然足够大,您可以使用Pythonmultiprocessing库函数来并行化您的预处理方法,如下所示:

n_jobs = 4
for df in incremental_dataframe:
  p = Pool(n_jobs)
  f_ = p.map(preprocess, np.array_split(df, n_jobs))
  f_ = pd.concat(f_, axis=0, ignore_index=True)
  p.close()
  p.join()

  # And then your model training ...

关于Python中并行编程的介绍,请在这里阅读我的帖子。

7.达斯克 ^

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Nick Fewings on Unsplash

Dask 有助于以顺序并行的方式利用大数据资源。

关于Dask的介绍,请在这里阅读我的帖子。

您可以在这里以类似的方式应用来自pandas API 的函数。您可以检查是否有这样的空值:

df.isnull().sum().compute()

要缩放列,可以将它们转换为数组,并以类似的方式使用其 Scaler 函数:

rsc = dask_ml.preprocessing.RobustScaler()
result = rsc.fit_transform(X[:,i].reshape(-1, 1)) # for ith column

处理 JSON 或任何其他半结构化数据,如日志文件等。你可以使用DaskBag容器提供的函数。

df[key] = df[dict_col].to_bag().pluck(key).to_dataframe().iloc[:,0]

在预处理之后,你可以使用Dask的一个模型来训练你的数据。

完整代码请阅读 Jupyter 笔记本中的Dask部分,点击这里

**Note:** You should only use Dask in case of Big Data, where it is not able to fit in your memory. Otherwise in-memory learning with pandas and sklearn will be lot faster.**Note: (Local Cluster)**
You can perform almost any BigData related query/tasks with the help of LocalCluster. You can, specifically, use 'memory_limit' parameter to constrict Dask's memory usage to a specific amount. 
Also, at times you might notice that **Dask** is exceeding memory use, even though it is dividing tasks. It could be happening to you because of the function you are trying to use on your **dataset** wants most of your data for processing, and multiprocessing can make things worse as all workers might try to copy **dataset** to memory. This can happen in aggregating cases.In these cases you can use **Dask.distributed.LocalCluster** parameters and pass them to **Client**() to make a **LocalCluster** using cores of your Local machines.**from** dask.distributed **import** Client, LocalCluster
client = **Client**(n_workers=1, threads_per_worker=1, processes=False,
                memory_limit='25GB', scheduler_port=0, 
                silence_logs=False, diagnostics_port=0)
client'scheduler_port=0' and 'diagnostics_port=0' will choose random port number for this particular client. With 'processes=False' **dask**'s client won't copy dataset, which would have happened for every process you might have made.
You can tune your client as per your needs or limitations, and for more info you can look into parameters of **LocalCluster.** You can also use multiple clients on same machine at different ports.

8.延伸阅读 ^

  1. https://www . ka ggle . com/mlisovyi/bigdata-dask-pandas-flat-JSON-trim-data-upd
  2. https://github . com/dmlc/xgboost/issues/3055 # issue comment-359505122
  3. https://www . ka ggle . com/ogrellier/create-extracted-JSON-fields-dataset
  4. https://github . com/Microsoft/light GBM/blob/master/examples/python-guide/advanced _ example . py
  5. 将数据帧内存大小减少约 65% | Kaggle
  6. 机器学习处理大数据文件的 7 种方法——机器学习掌握

9.参考文献 ^

  1. https://www . ka ggle . com/mlisovyi/bigdata-dask-pandas-flat-JSON-trim-data-upd
  2. https://www . ka ggle . com/ogrellier/create-extracted-JSON-fields-dataset
  3. https://gist . github . com/goraj/6 df 8 f 22 a 49534 e 042804 a 299d 81 bf2d 6
  4. https://github.com/dmlc/xgboost/issues/3055
  5. https://github.com/catboost/catboost/issues/464
  6. https://github.com/Microsoft/LightGBM/issues/987
  7. https://gist . github . com/ylogx/53 fef 94 cc 61d 6a 3 e 9 B3 EB 900482 f 41 e 0
Suggestions and reviews are welcome.
Thank you for reading!

签名:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如何学习新的东西

原文:https://towardsdatascience.com/how-to-learn-something-new-27b950f16f33?source=collection_archive---------2-----------------------

最初发表于【lemjosh.tumblr.com】

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来源:

世界在变化,速度之快超乎任何人的想象。许多许多年前是我们生活一部分的东西已经不在这里了,许多今天是我们生活一部分的东西在不久的将来会成为收藏品。对于每一项最新的技术,大约两年后总会有更好的或完全的替代品。有的变化快,有的变化慢,但都是变化的。二十年前,谁会想到我们会拥有像今天这样的 3D 相机、增强现实和超高速通信技术?

因此,我们需要在当今世界保持相关性的一个非常重要的技能是能够快速学习新事物。

去年的这个时候,我正准备在一个我一无所知的领域开始攻读博士学位。我有机械工程的背景,但是我知道我的博士研究需要很多我还不知道的知识。所以从那以后,我一直在积极地学习新的东西。

因此,我写这篇文章,不是作为一个知道的人,而是作为一个正在知道的人。我的学习经历充满了失望,但是最终知道你学到了什么的喜悦超过了这个过程。

在过去的一年里,我一直在学习如何说一种新的语言——日语,关于 Python 和 C++编程、机器学习、计算机视觉、机器人和人工智能。我必须说这是充满挑战但又令人愉快的一年。以下是有助于保持学习和提高的想法。

**1。培养对你所学的东西的兴趣。**学习并不容易,需要付出很多努力和精力,也相当容易累垮。然而,你的兴趣有助于缓解耗费如此多精力和精力的感觉。我演奏萨克斯管和钢琴的水平令人羡慕,所以我有很多想学习简单乐器的人的问题,我总是告诉他们的一件事是,没有一种乐器是简单的,无论它看起来多么简单,而且有时你会卡住,看起来你不会变得更好。然而,在那些时候,是你对所学内容的兴趣帮助你度过难关。

**2。花时间。**这可能是学习任何东西的唯一最重要的因素。你必须花时间在你所学的东西上。我不能过分强调这一点。这是任何领域最优秀的人的一个共同点,他们花费大量的时间来磨练自己的技能。你花的时间越多,你就变得越好。就这么简单!

**3。要知道学习是一个循环。**从我开始研究开始,我就意识到了这个循环;我对某个东西没有概念,我开始学习它,我通常在第一次读到一个新主题时不理解,我又读了一遍,现在我有了更好的理解,我又看了一遍,现在我抓住了它,然后我继续下一件事,重复这个过程。有时候,在我继续前进之前,我会多次重复“走过去”这一步。这有助于我永远不会真正卡住。我重复这个循环越多,我就变得越好。然而,这可能需要很长时间。你可以称之为经验。

4。有时候分心是好事。目前,我平均每周工作 80 个小时,其中大部分时间都在研究一些新东西,这有时真的很烦人。但是,我会放一天假冷静一下,做点别的事情。演奏音乐,去教堂做礼拜,只是睡觉和听音乐,观光,看电影,等等。底线是,我通过做一些完全不同的事情来让自己恢复精神,这不一定是学习。我相信它有助于我保持精力充沛和精神饱满。

在我的一生中,我已经能够亲自学习两种乐器(达到中级熟练程度,没有乐理经验。是的,我玩听觉)、音乐制作(我有一张音乐专辑)、平面设计、视频编辑和 flash 动画、3D 绘图、建模和动画、丝网印刷、第三语言和计算机编程。我还想学更多,也许是第四语言和网页设计。你可以叫我多面手。哈哈!

我认为我喜欢学习新的东西,这给了我信心,我将继续在这个快速变化的世界中发挥作用。

如果你和我一样喜欢这篇文章,喜欢学习,请在评论中分享你的经历或建议。我也可以向你学习。😃

如何成为一名数据科学家(第 1 部分)

原文:https://towardsdatascience.com/how-to-level-up-as-a-data-scientist-part-1-9ea6a775f239?source=collection_archive---------4-----------------------

第 1 部分:表桩

不久前,我写了一篇文章,将方法论作为虚荣的衡量标准。我想表达的观点是,方法是一种手段,而不是目的——学习它们可能是令人愉快的,但作为数据科学家,我们通过解决有价值的问题来谋生。因此,当你考虑技能培养时,你应该专注于那些你需要推动价值的技能。在思考这篇文章时,我意识到做出这样的声明很容易,但很难执行,特别是如果一个人处于职业生涯的早期,还没有建立起许多代表,所以我决定写一篇(一组)附带的文章,提供更多可操作的建议。我的目标是留给你们两样东西:

  • 首先,要理解超越(明显的)技术工具的核心技能,这些技能造就了一名优秀的数据科学家
  • 其次,你可以采取一些具体的步骤来发展或提高这些技能。

这很长,所以我决定把它分成几个部分。在这篇文章中,我将讨论牌桌赌注——你在牌桌上获得一席之地所需的技能,如果你还没有这些技能,你应该首先学习。在随后的文章中,我将涵盖 3 个领域,在这 3 个领域中,强有力的从业者表现出色,并且可以做一些具体的事情来建立这些技能。

桌面木桩

桌桩是基础,其他所有东西都位于其上。它们代表了数据科学家用来为公司创造价值的核心技能。

SQL

不管是好是坏,SQL 是处理数据的通用语言。大多数技术产品都有 sql 数据库支持,甚至那些没有内置 SQL 风格的产品也是如此(例如 Hadoop 的 Hive)。无论如何,由于您要处理的大多数问题的起点都是“获取数据”,而数据通常存储在 SQL 存储中,因此您需要成为这方面的专家。幸运的是,这方面有很多免费资源。我最喜欢的是 Mode 的 SQL 学校

随机变量和条件概率

这是你将使用的主要数学工具,因为它最适合回答诸如“这个东西比那个东西好吗?”或者“我们刚刚做的事情成功了吗?”。大多数人为了在这些问题上取得进展而匆忙采用统计数据。根据我的经验,统计方法有太多的假设,它们在现实世界的问题中往往是非常无用的(一些可以映射到二项式的简单情况是例外),我在大约 10 年的时间里没有真正信任过统计测试的结果。但它们背后的东西——随机变量和产生它们的概率规则——真的很有用,因为你可以用它们来明确你的假设,并运行场景来计算你在数据中的结果实际上有多大可能。所以我建议你在这方面打下坚实的基础,你可以从任何好的教科书或这些卡恩学院的课程中获得关于概率随机变量的知识。

Python 或基于 R 的机器学习和随机建模基础

ML 和随机建模是数据科学家和分析师之间的第一次分离,因为它们是支持规模的工具。我说的“基础”是指,知道有哪些方法可用(例如,树与回归和深度模型),它们的目的是什么(例如,分类与项目),它们如何在高层次上工作(例如,损失最小化、正则化等)。),哪些库实现了它们,如何让那些库产生一个结果,以及如何验证它(例如,AUROC,precision vs. recall,等等)。).

我推荐“从头开始的数据科学”,它贯穿了最常见算法的 python 实现,从基本原理开始。无论你选择什么,确保你使用的是 Python 或者 R,而不是你必须付费的东西(比如 SAS)或者不是代码的东西(比如基于 GUI 的工具,比如 RapidMiner)。这是因为:

  • 免费工具正在胜出。并且免费。就像你不用付钱一样。如果你愿意的话,你可以把钱用在其他事情上,比如咖啡或啤酒。
  • 证据表明代码是软件的最佳抽象。你的目标是能够用软件实现你的解决方案,因为这给了你最大的优势(同时也是作为数据人员最好的职业前景)。

这一步还让你接触到数据栈(python 中的 pandas、numpy、matplotlib、R 中的 dplyr 等),这将有助于你向价值链的上游移动。(作为旁注,我个人在这一步开始提倡 Python 而不是 R。这是因为 Python 为生产环境提供了一条更干净的路径,并且是一种功能齐全的编程语言,也适合于软件开发。由于这一点,Python 正在迅速获得市场份额。在 R 中,您可以是多产的和有价值的,但是要真正扩展 Python 是一个更好的选择。我们稍后将回到这一点。)

以上三方面的专业知识会让你在谈判桌上占有一席之地。它们构成了使您有资格成为替代级数据科学家的核心技能。如果你只有 1 和 2,作为一个分析师,你可以创造很多价值,但是你被阻止了。如果你只有 1 和 3,你基本上是一个技术人员,你的结果不会被信任。如果你只有 2 个和 3 个,你基本上是一个研究员,因为数据需要交给你,你的迭代周期会太慢。所以,如果你错过了以上三件事情中的任何一件,先从这些开始。

所以,一旦你在赌桌上下注,下一步是什么?假设你已经在你的第一份工作上工作了几年,正进入职业生涯中期。你做了一些有趣的工作,有一些胜利,也有一些失败。你准备好升级了。要成为一名高级贡献者,你必须做些什么?在我看来,你应该多做三件事:

  1. 发展系统思维。
  2. 拓展你的创意产生平台。
  3. 多元化和规模化你的分销机制。

我将在后续的文章中详细介绍这些内容。

(想在职业生涯中更上一层楼?在 建立你的技能世界贝叶斯 )

如何成为一名数据科学家(第二部分)

原文:https://towardsdatascience.com/how-to-level-up-as-a-data-scientist-part-2-92eb65aaf1c5?source=collection_archive---------3-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在本系列的第 1 部分中,我确定了三个我认为是数据科学家基本技能的领域:SQL、随机变量/条件概率和 R 或 Python 中的 ML 基础。了解这些领域可以让你在谈判桌上获得一席之地,并让你处于可以开始增值的位置。以此为起点,我们准备进入下一步,解决如何升级的问题。我要解决的第一类问题是开发系统思维

系统: 一组相互联系的事物或部分形成一个复杂的整体,特别是。作为机械装置或互联网络的一部分一起工作的一组事物。

为什么培养系统思维很重要?因为数据不是在真空中产生的。相反,它是由现实世界中正在运行(或被运行)的系统产生的——一个用于搜索互联网的 web 应用程序,一个用于与朋友联系的消息服务,一个用于购买任何你想要的东西的电子商务网站。每种方法产生的数据都是不同的,因为人们在使用每种方法时都试图实现不同的目标。理解一个系统及其相关的背景会引导你找到有用的问题,推动你的实验以验证答案,并能帮助你设计衡量标准来揭示你是否真正成功地实现了你的目标(以及揭示你何时在自欺欺人)。例如,上面列出的每个应用程序的行动要求是不同的。在搜索应用程序中,它是搜索按钮;在消息应用程序中,它是发送按钮;在电子商务应用程序中,它是购买按钮。行动呼吁应该是大还是小?答案十有八九取决于制度。对于搜索或电子商务,我们可能希望它很大,因为我们希望尽可能简单的行动。对于信息服务,我们可能希望它小一点,因为否则它可能会占用太多的屏幕空间,使写信息变得很烦人,这将减少我们产品的使用。因此,如果我们进行一项实验,并生成关于按钮大小与动作的数据,而不考虑我们所处的环境(搜索/电子商务与消息传递),我们什么也学不到。我们的数据没有上下文是没有用的,而上下文来自于生成它的系统。换句话说,理解数据背后的系统有助于你定义什么是“好的”。没有它,你只有数字——没有任何意义的值,你的结论在最好的情况下是没有信息的,在最坏的情况下是无意义的。鉴于此,一个人如何发展系统思维?没有什么比重复更能让你做得更好了,所以我将在下面列出一些练习。目标是让你思考数据是如何存在的,你能从数据中学到什么,以及(最终)你如何利用数据获取价值。我提倡一个三步走的过程:

  1. 通过玩具模型培养对周围世界的理解。这将帮助您了解系统。
  2. 通过建立评估模型的量化框架来培养产品意识。这将帮助您识别系统中的价值层。
  3. 发展观点,做出预测,并让自己对它们负责。这将帮助你确保你在做(1)和(2)时发展的直觉是正确的。

第一步:通过玩具模型来了解你周围的世界

系统思考的第一步是开始注意并试图理解你周围世界的系统。玩具模型是一个很好的工具。对于那些不熟悉的人:

A 玩具模型 是一个刻意简化的模型,去掉了许多细节,以便可以用来简洁地解释一个机构。

它们在物理学中大量用于围绕一个问题建立直觉。通过建立一个你感兴趣的现象的简化版本,你可以学到很多关于它是如何工作的,甚至可以做出有意义的预测。在放射性衰变中有一个很好的例子,当不稳定的原子自发分裂成更轻的元素,同时以辐射的形式释放能量。为了充分描述这个过程,你需要量子力学和量子场论,如果你想精确计算一组特定原子的衰变率和它们释放的能量。然而,第一批研究这个问题的物理学家没有这些可用的工具,他们需要想出更简单的方法。为此,他们建造了一个玩具模型。

  • 他们推断,放射性衰变是一种罕见的事件,因为给定原子在两个特定时间点之间衰变的概率非常低。如果不是这样,我们在地球上观察到的每一种元素都已经衰变到稳定状态,我们永远也不会测量到任何辐射。
  • 这意味着泊松统计支配的过程,它包含一个单一的参数:事件率或过程的半衰期。该参数必须包含整个流程的高级描述,因为没有其他信息可用。
  • 这样他们就有了可以测量的东西:使用辐射探测器,如盖革计数器,在规定的短时间内重复测量击中的次数。从那里可以相对简单地验证计数确实遵循泊松分布,并提取速率参数和半衰期。

这可能看起来很琐碎,但事实证明,这种简单的方法,一旦得到验证,最终成为碳年代测定等方法的基础。这个玩具模型无法解释衰变过程的所有细节,但能够给出一些对地球年龄的最初精确估计!

  • 棒球中的 Sabermetrics ,它将每一次互动建模为一个独立的事件,具有特定结果的给定概率(如击球、保送、出局、跑动等)。),并将每个结果与获胜概率的边际增长联系起来。这就产生了,除了别的以外,保送等同于单打,因为两者都导致非出局事件和一垒上的球员。
  • 有效市场假说,该假说认为股票市场的参与者可以获得完美信息。这就产生了这样一种观点,即市场通常是一起运动的,因此股票的价格变化在任何给定时刻都很可能是随机的。
  • PageRank ,该模型将浏览网页建模为有条件的随机浏览网页,在这种情况下,冲浪者只能访问与他们所在的前一个页面相链接的页面。根据这个模型,我们发现链接最多的页面占据了浏览时间,这意味着它们是给定主题最重要的来源。

这些例子中没有一个在它们试图建模的过程方面是严格准确的,但是都产生了有用的见解。其中的每一个都是通过考虑生成数据的系统可能会是什么样子,并努力理解其含义而构建的。那么你是如何学会这个的呢?我建议的练习是:

  1. 找到你感兴趣的东西。
  2. 假设那件事背后的基本原则。
  3. 对你在(2)中发现的含义进行推理。
  4. 用数据验证。
  5. 重复!

我想举一些例子来帮助你开始:

这样做的次数足够多,你会发现自己分解了遇到的每一个过程,并在比其他人少得多的信息下对事物如何工作有了深刻的理解。但你也会发现这只是一部分。玩具模型将帮助你弄清楚事物是如何工作的,但你可能会开始怀疑这些东西是否应该存在——它们是否正在产生有价值的结果。这就把我们带到了第二步。

第二步:通过建立评估模型的量化框架来培养产品意识

一旦你真正擅长构建玩具模型,你将能够观察任何过程,并能够构建一个描述该过程如何生成数据的模型。然而,它不会告诉你任何关于所述过程的效用。这个过程会产生有用的结果吗?这个结果值多少钱?结果是否证明了成本的合理性?这个过程应该发生吗?要回答这些问题,你必须学会对产生的价值进行推理,而不仅仅是产生的结果。事实上,我上面列出的所有玩具模型都有一个关键的价值金块,这是洞察力的一部分,可以直接转化为有用的收获。

  • sabermetrics 的保送等同于单打的结果意味着它们应该由市场来定价-保送率高的球员应该和那些击球率高但主要击中单打的球员赚得一样多。
  • 有效市场假说产生了“买入市场”策略,而不是选股或积极投资。
  • PageRank 作为 web 搜索的基础,利用了这样一个事实,即在确定网页重要性时,网页之间的连接比它们的内容更能提供信息,这极大地增加了搜索相关性,减少了垃圾邮件。

你可以很清楚地看到,这些玩具模型中的每一个都指向一个非常值得解决的问题,影响了数百万人,产生了数千亿美元的实际价值。任何致力于解决这些问题的人显然都在做正确的事情。他们是怎么知道的?你通常会发现这种选择正确工作的技巧在技术圈被称为“**产品意识”,**这基本上是一种识别哪些问题值得解决以及这些问题的哪些解决方案最有价值的艺术。

擅长这个包括为你正在探索的任何模型、产品或流程开发一个评估框架,其中心是围绕优化的核心指标。

  • 对于 sabermetrics,核心指标是每场胜利的美元数,因为棒球队的目标是利用他们的资源(工资)赢得比赛。事实证明,市场高估了安打,低估了保送,这种低效率被一些小型市场团队用来与那些预算较大的团队有效竞争。并最终被一个大型市场团队(波士顿红袜队)用来赢得冠军。
  • 对于有效市场假说来说,核心指标是财富的增长百分比——在一段时间结束时,你的财富比开始时多了多少。这让投资者转向低负荷共同基金和 ETF,它们在过去 10 年中作为一种资产类别的表现优于对冲基金(特别是在计入费用后)。
  • 对于 PageRank,核心指标是每次点击的搜索次数(我们希望这个值很低,这意味着最好的结果可以很快找到)。PageRank 通过返回最相关的结果对此进行了优化。这使得网络成为一个有用的地方,当然,也形成了有史以来最大的科技公司之一的支柱。

我提倡学习这样做的以下过程:

  1. 选择一个你喜欢使用和熟悉的产品或服务。
  2. 建立一个玩具模型,描述产品如何工作——谁是它的用户,他们如何找到产品,他们如何转换,他们如何参与。
  3. 添加一个描述公司如何产生成本和收入的框架——获取渠道、运营成本和货币化。
  4. 选择一个你喜欢的特性,用你的模型和框架来计算他们从中获得了多少。对他们是否应该拥有该功能有一个看法,或者你需要什么信息来做这个决定。
  5. 对于额外的积分,用一个他们还没有的新功能做同样的事情。
  6. 重复!

这里有几个我非常喜欢的例子,应该可以帮助你开始:

将这个过程运行几次,特别是如果你将步骤(1)和(2)结合起来,可以增强你的产品开发能力。这是很好的准备工作,但不会让你一路走到那一步。这里缺少了一个关键的部分:你怎么知道你是对的?或者,换句话说,你怎么知道你已经变得擅长这个了?

第三步:发展观点,做出预测,并让自己对它们负责

这就把我们带到了步骤(3),开始做预测,最好是在游戏中有一些皮肤。反复经历步骤(1)和(2)会让你对任何事情都有看法。但是目标不仅仅是拥有观点,而是拥有好的观点。实现这一点的唯一方法是添加一个反馈机制。这意味着写下你的观点,用它们做出并跟踪预测,并对自己的观点负责。责任感真的很重要——没有它,你会记住你的成功,忘记你的失败,你不会进步。最终,你会用这个过程为你自己(比如在哪里工作)和你的公司(比如在哪里投资)做出真正困难的决定,所以你真的希望它能产生好的结果。

人们用来赚大钱的观点的例子:

  • 在亚马逊无利可图的时候投资它,但却产生了大量的自由现金流。
  • 在雅虎和 AltaVista 明显赢得市场的时候建立另一个搜索引擎。
  • 在 2008 年崩盘后立即购买房地产或股票。
  • 当允许陌生人睡在你家是一个疯狂的想法时,你就投资了 AirBNB。

你希望你的观点和相关的预测和这些一样好,而责任是实现这一点的关键。一些低风险的问责方式:

  • 通过博客、推文或新信公开你的观点和预测。(体育分析社区通常走这条路。)
  • 基于你的一个观点开始一个副业项目,在那里你创造用户和/或收入。
  • 通过投资来支持你的观点。

我记录下我所有的观点和我用这些观点做出的预测,并试着把一些事情放在后面,这样如果我错了,它会很痛(但不会太痛)。

有几个我是对的(至少到目前为止):

  • 亚马逊和苹果(大约 2004 年)
  • 比特币
  • 湾区房地产邮报 2008

我错过了一些:

  • 微软和谷歌
  • 以太坊
  • Fitbit

我的观点并不总是正确的,但随着时间的推移,我的观点越来越接近正确。但是随着时间的推移,在游戏中有一些责任感和皮肤无疑让我变得更好。由此产生的自信让我在做高风险决策时更加有效。

关键是这最后一步结束了循环——通过强制执行责任反馈步骤,你将了解你是否成功地理解了系统并从中提取了价值。

包扎

如果你做完这些练习,你就会知道如何去做

  1. 识别现实世界中的系统,并通过玩具模型进行分析。
  2. 应用产品意识,通过在你的模型上分层定量评估框架,发现那些系统中哪些代表真正的机会。和
  3. 对你在(1)和(2)中得出的观点和预测负责,以确保你确实产生了好的观点和预测。

到了这里,你就开始为自己增压,准备好在一个非常高的水平上为企业或产品的发展做出贡献。你将为下一步做好准备,学习如何产生你自己的好想法,并让这些创意源源不断。我称之为扩展你的想法产生平台,我们将在第三部分中讨论。

(希望提升你的职业生涯?在 建立你的技能世界贝叶斯 )

如何利用人工智能预测(并防止)客户流失

原文:https://towardsdatascience.com/how-to-leverage-ai-to-predict-and-prevent-customer-churn-f84d653a76fb?source=collection_archive---------6-----------------------

对于任何数字或在线业务来说,赢得客户只是战斗的一半。这也是为了吸引并最终留住客户,以取得长期成功。解决客户流失问题一直是品牌和开发在线用户体验的产品团队面临的最大挑战之一。对大多数人来说,每月 5%的流失率听起来没什么大不了的,但是每年复合计算,你可能会失去将近一半的客户!也就是说,你需要非常努力地工作,才能让你的企业保持目前的规模,而不是萎缩。

没有什么比在众所周知的仓鼠轮上“奔跑”时烧掉你辛苦赚来的资本更糟糕的了

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

…换句话说,努力工作却一事无成。当你有 5%的流失率时,很难想象会有什么增长,你需要稳定下来,保持运转。是时候我们停止猜测客户流失的原因,开始利用一些新的方法来解决这个问题了。

获得一个新客户的成本通常是留住一个现有客户的 5 到 25 倍,这使得最大限度地减少客户流失对任何企业都至关重要。这就是为什么产品经理采取积极主动的方法来留住用户,以最大限度地降低获取成本,并增加长期大规模采用的机会是如此重要。但是任何产品经理都知道,他们将会遇到严重的障碍,从而影响产品的采用和保留。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

问题是,大多数经理传统上采取追溯的方法来解决客户流失。他们会进行调整、变化和调整,然后追溯过去,并对这些变化是否有效进行事后分析。然而,随着人工智能(AI)应用的最新进展,产品经理现在能够更好地预测客户流失,并采取积极措施防止客户流失。

追溯方法的问题是

你已经创建了一个看起来功能良好的产品或应用程序,拥有流畅的用户体验,并在用户获取方面取得了一些初步成功。但过了一段时间,用户开始减少,客户流失,你不太清楚为什么。为了减少流失,设计师、开发人员和产品经理会尝试各种策略来解决这个问题。他们可能会改变颜色,调整字体,移动付费墙,或改变用户界面(UI),然后等待 2-3 周来衡量营业额是否有所改善。根据几周前的保留基准,他们将尝试找出是哪项或哪些更改产生了影响。是一个变化,几个变化,还是变化的总和?

这种循环的中断会扼杀与改进 UX 相关的所有部门的工作流程、生产力和整体效率。这种一次测试一个或两个变更、衡量成功、选择最佳选项,然后进行下一步的 A/B 方法是缓慢、繁琐和低效的。更糟糕的是,即使考虑这样做是正确的,你也需要一次实现一个改变,这可能比你的业务跑道花费更多的时间。

简而言之,这是一种落后的方法,分割了 UX 改进过程,并且经常解决客户流失的根本原因太少,太晚。

人工智能如何主动解决客户流失问题

我们的数据科学家团队已经开发出一种更好、更快、更有效的方法来解决客户流失问题,这种方法利用了机器学习的新进展。我们方法的真正秘诀是以预测的方式利用人工智能。你越能预测客户流失,你就能越好地预防它。通过机器学习模型,你可以了解是什么导致了客户流失。产品经理、开发人员、设计人员和高管都免于猜谜游戏。

预言;预测;预告

第一步是探索阶段,在这个阶段,你要深入研究数据。与点击流或购买数据不同,利用机器学习可以让你筛选大量数据,而不仅仅是一小部分。例如,如果您有一个 100 名用户的列表,按照流失可能性从上到下排列,您可以分析聚类以查看哪些类型的人似乎出现在“极有可能流失”桶中。通过揭示客户的年龄、性别、收入、活动和客户来源等个人资料属性,您将能够更好地预测哪些类型的客户可能会流失(哪些不会)。

诊断

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

机器学习可以带你分析数据,以便分析师能够帮助业务团队了解谁可能会流失,并在用户界面上提出预防性的变化。通过行为分析工具,您可以根据任何属性(行为、支出水平、年龄或群体)对用户进行细分,并采取适当的行动。诊断步骤也是至关重要的,因为你可以量化风险,纠正过程,并采取措施防止未来发生人员流动。

利用人工智能的行动步骤

现在,你已经有效地利用人工智能来开发预测模型,以预测哪些类型的客户很可能流失,下面是一些你可以采取的具体行动,以防止在你的业务或产品的生命周期内流失:

  • 干预 —防止客户流失的最佳方法之一是对可能流失的客户档案的客户生命周期进行干预。通过向用户和您的内部团队发出警报,您可以集中精力采取措施留住重要客户甚至特定的个人。
  • 收购 —客户流失并不总是基于个人资料元素来预测。它还取决于收购渠道(谷歌广告词、社交媒体、内容营销、合作伙伴推荐等)。).基于你的预测分析,你可以只锁定那些拥有最佳留存率和 LTV 的最有利可图的用户,当然,也可以针对这些特定的客户微调你的产品。
  • 体验 —颜色、字体、用户流量和体验的其他部分都是最终影响客户流失的因素。有了人工智能和行为分析,你现在有工具知道在哪里集中精力调整用户体验。

底线是客户流失不能再追溯解决了。如果公司、品牌和产品经理想要有意义地降低流失率,他们需要采取主动的方法。通过利用人工智能生成数据驱动的预测策略,公司可以不再猜测将精力集中在哪里,以实现更健康的 SaaS 业务,甚至获得竞争优势。

如何与数据科学撒谎

原文:https://towardsdatascience.com/how-to-lie-with-data-science-5090f3891d9c?source=collection_archive---------6-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最近,我读了达雷尔·赫夫写的《如何用统计撒谎》一书。这本书谈到了如何利用统计数据让人们得出错误的结论。我发现这是一个令人兴奋的话题,我认为它与数据科学非常相关。这就是为什么我要把“数据科学”版书中的例子展示出来。其中一些是书中的,其他的是我看到的可能发生在现实生活数据科学中的例子。
这篇文章实际上并不是关于如何用数据科学撒谎。相反,它是关于我们如何可能因为没有对管道不同部分的细节给予足够的关注而被愚弄。

图表

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

把自己想象成某个公司的新数据科学家。这家公司已经有一个数据科学团队,他们建立一个模型来预测一些重要的事情。您是一位非常有才华的数据科学家,仅仅一个月后,您就能够将他们的模型准确性提高 3%。难以置信!你想向某人展示你的进步,所以你准备了这张图表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,这看起来不错,但不是很令人印象深刻,你想留下深刻的印象,所以你能做什么(除了进一步改进你的模型)?为了更好地展示同样的数据,你需要做的只是稍微改变一下图表。你需要让它专注于改变。所有这些低于 80%或高于 85%的数字都没有“真正的”需求。所以它看起来像这样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看起来你的模型比旧的要好四倍!当然,聪明的读者会明白到底发生了什么,但这个图表看起来令人印象深刻,许多人会记住这个巨大的差距,而不是确切的数字。

随着时间的推移,我们可以用过程做同样的事情。假设你和你的团队在研究某个模型,最近几周你有了突破,所以你的模型性能提高了 2%,非常好。看起来是这样的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

很难看出变化,实际数字是。同样,也许 2%是一个显著的进步,但在这张图表中,它看起来并不那么好。所以让我们像以前一样改变它:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

同样,这些数字是相同的,但是这张图看起来比上一张好得多。

测量值

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通常,初级数据科学家并没有足够重视使用什么度量标准来度量他们的模型性能。这可能会导致使用一些默认的、大多数时候是错误的度量标准。以准确性为例,在现实生活中(在大多数情况下),这是一个非常糟糕的指标。这是因为现实生活中的大多数问题,数据都是不平衡的。考虑一个预测泰坦尼克号幸存者的模型,这是一个非常受欢迎的 Kaggle 教程。如果我告诉你我建立了一个 61%准确率的模型。好吃吗?很难说。我们没有任何可以与之比较的东西(稍后会详细介绍)。听起来还行。这可能比什么都没有好得多,对吗?让我展示一下我到底做了什么:

predicted = np.zeros(len(test_df))
print accuracy_score(predicted, test_df['Survived'])

没错,我所做的就是预测所有实例的“零”(或“否”)。我能得到这个准确率(61%)仅仅是因为活下来的人比没活下来的人少。还有更极端的情况,数据非常不平衡,在那些情况下,甚至 99%的准确率可能什么都不是。这种极端不平衡数据的一个例子是当我们想要正确地分类一些罕见的疾病时。如果只有 1%的人患有这种疾病,那么每次预测“不”,就会给我们 99%的准确率!

这不仅关系到准确性。当我们阅读一些研究/试验/论文的结果时(或者万一我们发表了我们的结果),我们需要确保所使用的度量标准适合它试图测量的问题。

关于测量,我们需要做的另一件重要的事情是了解结果的好坏。即使我们使用了正确的衡量标准,有时也很难知道它们的好坏。90%的精度对于一个问题来说可能是极好的,但对于其他问题来说则非常糟糕。这就是为什么一个好的实践是创建一个基准。创建一个非常简单的(甚至是随机的)模型,并将其与你/他人的结果进行比较。对于泰坦尼克号问题,我们已经知道,仅仅对每个人说“不”就会给我们 61%的准确率,所以当某个算法给我们 70%的时候,我们可以说这个算法贡献了一些东西,但很可能它可以做得更好。

泄密

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我想谈谈我在数据科学历史中遇到的 3 种漏洞。特征工程/选择泄漏、从属数据泄漏和不可用数据泄漏。

特征工程/选择泄漏:

在大多数情况下,我们需要对我们的数据做一些预处理和/或特征工程,然后再将它推入一些分类器。很多时候使用一些类(Transformer)很容易做到这一点,这里有一个sklearn例子:

X, y = get_some_data()X = SomeFeaturesTransformer().fit_transform(X)X_train, X_test, y_train, y_test = train_test_split(X, y)classifier = SomeClassifier().fit(X_train, y_train)

对于那些不熟悉sklearnpython的人来说:在第一行,我用一些方法得到我的数据。然后我使用SomeFeaturesTransformer类从数据中提取特征。然后,我将数据分为训练和测试,最后训练我的分类器。

你看到这里的漏洞了吗?大多数时候,特征提取/选择是模型的一部分,所以通过在分割之前执行这个步骤,我在测试集上训练我的模型的一部分!一个简单的例子是当我们想要使用一些关于我们特征的统计数据时。例如,我们的特征之一可能是偏离平均值。假设我们有房屋大小-价格预测,我们想使用当前房屋大小与平均房屋大小的差异作为一个特征。通过计算整个数据(而不仅仅是训练集)的平均值,我们将测试集的信息引入到我们的模型中!(数据的平均值是模型的一部分)。在这种情况下,我们可能会在我们的测试集上获得出色的结果,但是当我们在生产中使用这个模型时,它会产生不同/更差的结果。

我们的模型不仅仅是管道末端的分类器。我们需要确保模型的任何部分都不能访问关于测试集的任何信息。

从属数据泄漏:

在我的论文工作中,我建立了一个系统,试图将话语录音分为典型和非典型语音。我有 30 个参与者,15 个句子,每个重复 4 次。所以总共 30154=1800 次录音。这是非常少的数据,所以我想做交叉验证来评估我的算法,而不是仅仅将其分为训练和测试。然而,我需要非常小心,即使没有交叉验证,当我随机选择我的数据的某个百分比作为测试集时,我将(很可能)获得测试集中所有参与者的记录!这意味着我的模型是在将要测试的参与者身上训练的!当然,我的结果会很棒,但我的模型将学会识别不同参与者的不同声音,而不是典型或非典型的讲话!我会得到高分,但实际上,我的模型没什么价值。

正确的方法是在参与者级别拆分数据(或进行交叉验证),即使用 5 名参与者作为测试集,另外 25 名参与者作为训练集。

这种类型的相关数据可能出现在不同的数据集中。另一个例子是当我们试图在工作和候选人之间创建一个匹配算法。我们不想向我们的模型显示将出现在测试集中的作业。我们需要确保模型的所有部分都不会看到来自测试集的任何数据。

不可用数据泄漏:

这是很常见的一个。有时,我们的数据中有一些列在将来对我们来说是不可用的。这里有一个简单的例子:我们想预测用户对我们网站上产品的满意度。我们获得了大量的历史数据,因此我们利用这些数据建立了模型。我们有一个名为 User Satisfaction的字段,它是我们的目标变量。我们取得了优异的成绩,我们很高兴。然而,当我们在生产中使用我们的模型时,它预测绝对没有意义。原来除了一般的用户满意度,用户提供的其他领域。像用户是否对交付、运输、客户支持等满意的字段。这些字段在预测时间中对我们不可用,并且与一般用户满意度非常相关(并且具有预测性)。我们的模型使用它们来预测总体满意度,并且做得非常好,但是当这些字段不可用时(并且我们估算它们),该模型不必做出太多贡献。

机会/运气

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们回到典型-非典型言语问题。正如我所说的,只有 30 名参与者,所以如果我做一个简单的 20%-80%的训练测试分割,我将只有 6 名参与者进行测试。六个参与者非常少。我可能会碰巧对其中的 5 个进行正确的分类。我甚至可以正确地将它们分类,只是因为我很幸运。这将给我 100%的准确性!(或者在只有 5 个正确的情况下为 83%)。它可能看起来很棒,当我发布我的结果时,它会看起来非常令人印象深刻,但事实是这个分数并不重要(甚至不真实)。

如果我们假设有 50%的人有非典型的言论,那么仅仅通过随机猜测,我就有 50%的机会是正确的,这意味着如果我试图猜测 6 名参与者,我会将他们全部正确分类 0.5⁶=0.01 (1%)次。也就是说,100 个随机模型中有 1 个会有 100%的准确率!(100 个中有 3 个会有 83%的准确率)。

这里正确的方法是“留下一个交叉验证”,将所有的参与者作为一个测试。

人类

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将学习算法比作人类是非常诱人的。这在很多医学领域都很常见。但是,对比人类和机器,一点都不琐碎。假设我们有一种算法可以诊断一种罕见的疾病。我们已经看到,对于不平衡的数据,使用准确性作为度量并不是一个好主意。在这种情况下,如果我们使用精确度和召回率来进行模型评估和比较,可能会好得多。我们可以使用某个医生的精确度和召回率,并将其与我们的算法进行比较。然而,在精确度和召回率之间总是有一个权衡,我们并不总是清楚我们更想要什么,高精确度还是高召回率。如果我们的算法得到 60%的准确率和 80%的召回率,医生得到 40%的准确率和 100%的召回率,谁更胜一筹?我们可以说精度更高,因此我们的算法“比人更好”。此外,作为一种算法,我们可以控制这种权衡,我们需要做的只是改变我们的分类阈值,我们可以将精度(或召回)设置为我们希望的点(并看看召回会发生什么)。因此,更好的选择是使用 ROC AUC 得分或“平均精度”进行模型评估。这些指标考虑了精确度-召回率的权衡,并提供了关于我们的模型如何“预测”的更好的指标。人类没有 ROC AUCs,也没有“平均精度”。我们无法在任何一个医生身上控制(大多数情况下)这个门槛。有不同的技术可以为一组人类决策者提供精确回忆曲线,但这些技术几乎从未使用过。关于这一点,这里有一个很棒而且更详细的帖子:

[## 机器真的会打败医生吗?ROC 曲线和绩效指标

医学领域的深度学习研究目前有点像狂野的西部;有时你会找到金子,有时会找到…

lukeoakdenrayner.wordpress.com](https://lukeoakdenrayner.wordpress.com/2017/12/06/do-machines-actually-beat-doctors-roc-curves-and-performance-metrics/)

结论

在这篇文章中,我展示了当我们试图发布一些算法结果或解释其他结果时可能出现的不同陷阱。我认为从中得出的主要观点是“当它看起来好得难以置信时,它很可能是真的”。当我们的模型(或其他模型)看起来出奇的好时,我们必须确保我们的管道中的所有步骤都是正确的。

如何使用 Python、Geopandas 和 Matplotlib 制作 gif 地图

原文:https://towardsdatascience.com/how-to-make-a-gif-map-using-python-geopandas-and-matplotlib-cd8827cefbc8?source=collection_archive---------5-----------------------

不需要 Photoshop:只使用 Python 和命令行制作动画图表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

更新:我增加了一个归一化功能来保持每张地图的彩条图例范围相同。下面和 Github 上的 Jupyter 笔记本中的代码已更新。请看下面关于怪异渲染的注释。

作为一种语言,Python 非常灵活。这使得有时仅用几行代码就可以实现许多不同的可视化。但是现在有了这么多不同的图表网站和软件,为什么还要写代码呢?难道我们就不能用 GUI 上传一个 csv 文件,调整范围,点击导出 png 然后收工吗?

是的。你当然可以。有时,如果您需要快速、一次性的图表或地图,这是最佳选择。但是当你需要制作大量的地图——大量的地图时,使用 Python 的真正力量就发挥出来了。

在本教程中,我将在之前的文章的基础上,讲述如何使用 GeopandasMatplotlib 制作 choropleth 地图。我们将以此为起点,所以如果你想赶上进度,请在这里查看帖子或在 Github 上查看我的 Jupyter 笔记本。

这次我将介绍如何创建一个动画 gif choropleth 来显示地理数据(因为它是一张地图)和随时间的变化。最重要的是,本教程将从头到尾只使用 Python 和一些命令行工具。无需在 Photoshop 中寻找正确的菜单/下拉菜单/窗口。

正如我在之前的教程中提到的,这可能不是所有用例的最佳工作流。但是如果速度、再现性和一致性是你优先考虑的,我认为这是一个好办法。

为什么是 gif 图?

在过去的几年里,gif 图表似乎在社交媒体上变得非常流行。《金融时报》和《经济学人》等出版商花了更多时间来简化和完善他们的数据,即在 Twitter 和 Instagram 等平台上获得更多参与的格式。也许更重要的是,gif 图表允许在静态图表所显示的基础上有一个新的故事层。

这有几种不同的用法:

  • 通过注释或突出显示引导用户浏览同一图表中最重要的点
  • 通过比较显示两个不同的图表
  • 显示相同的图表随时间的变化(这是我将要介绍的内容)

这个列表并不详尽,用例还在继续扩展。总之:移动图表既酷又有用(如果使用正确的话)。

让我们开始映射。

如何制作 gif 图

不必重述之前教程的每一个步骤,以下是你应该开始的:

  1. 在 shapefile 中加载
  2. 加载 csv 格式的数据以进行可视化
  3. 连接两个数据框
  4. 绘制地图并开始设计风格。

现在,我们将使用 Python 中 for()循环的强大功能,使用多个不同的列生成相同的地图。因为我们想显示随时间的变化,我们需要确保我们的数据包含多年的变量。为了便于标记,让我们确保数据的每个列标题都是一个年份数字。

为了遍历列,我们需要一个字符串列表来调用每一列的名称。让我们创建一个包含每列年份的列表变量(格式化为字符串)。让我们也设置一个输出路径,这样我们所有的地图都保存到一个文件夹中。

*# save all the maps in the charts folder*
output_path = 'charts/maps'

*# counter for the for loop*
i = 0

*# list of years (which are the column names at the moment)*
list_of_years = ['200807','200907','201007','201107','201207','201307','201407','201507','201607']

最后,在创建映射之前,我们希望为 vmin 和 max 值设置一个一致的全局变量。这设置了颜色范围的值。如果没有预先设置,Matplotlib 将在每次 for 循环迭代时更改 choropleth 的范围,因此很难看到值是如何随时间增加或减少的。

*# set the min and max range for the choropleth map*
vmin, vmax = 200, 1200

编写 for 循环

一旦开始使用它们,for()循环就相当简单了。for()循环的语法是这样的:

  • 对于 list_of_years 列表中的每一年,运行以下代码。
  • 当列表中的所有年份都完成了代码时,停止循环。

以下是使用上一教程中底图要点的代码:

*# start the for loop to create one map per year*
**for** year **in** list_of_years:

    *# create map,* UDPATE: added plt.Normalize to keep the legend range the same for all maps
    fig = merged1.plot(column=year, cmap='Blues', figsize=(10,10), linewidth=0.8, edgecolor='0.8', vmin=vmin, vmax=vmax,
legend=True, norm=plt.Normalize(vmin=vmin, vmax=vmax))

    *# remove axis of chart*
    fig.axis('off')

    *# add a title*
    fig.set_title('Violent crimes in London', \
              fontdict={'fontsize': '25',
                         'fontweight' : '3'})

    *# this will save the figure as a high-res png in the output path. you can also save as svg if you prefer.*
    filepath = os.path.join(output_path, only_year+'_violence.jpg')
    chart = fig.get_figure()
    chart.savefig(filepath, dpi=300)

如果您运行这段代码并打开刚才设置的输出路径文件夹,您应该会看到许多地图,每张地图都有略微不同的阴影,代表不同年份的数据。但是这可能会让浏览者感到困惑:一旦地图动画化,他们怎么知道年的增量呢?

我们可以在底部设置一个简单的日期范围(2007–2015),但是 for()循环给了我们一个更好的解决方案。因为我们已经将每一列的年份作为字符串保存在变量中,所以我们可以为每个地图添加不同的注释(对应于数据的年份)。

根据我们的 for()循环,变量“year”将是 for 循环每次运行时的列 year。使用这个逻辑,我们可以插入“year”作为 fig.annotate()参数的变量。

现在,每次 for 循环运行时,不同的年份将作为注释插入到地图上。使用相同的逻辑,我们也可以设置文件名以每年开始,这样就很容易找到每年对应的地图。在 for()循环中添加这段代码将会添加一个 year 注释。

*# create an annotation for the year by grabbing the first 4 digits*
    only_year = year[:4] *# position the annotation to the bottom left*
    fig.annotate(only_year,
            xy=(0.1, .225), xycoords='figure fraction',
            horizontalalignment='left', verticalalignment='top',
            fontsize=35)

重新运行代码,您的地图应该会被新的地图所替换,每个地图的左下角都有一个年份注释。如果你从上到下浏览地图,你可以开始对你的 gif 有个大概的了解。

制作 gif

对于最后一步(gif 制作),我们将离开 Python 并打开终端(或您使用的任何命令行编辑器)。导航到您在终端中保存所有文件的目录。

遗憾的是,我找不到让 ImageMagick 将我的 png 地图批量转换成 jpg 格式的方法。我似乎无法让 matplotlib 将我的图表保存为。jpg(得到一个在这个堆栈溢出线程上描述的错误)。所以我找到了一个变通方法,使用一个叫做 sips 的 Mac 程序(教程和讲解者在这里)。但本质上,它是一个命令行工具来批量转换文件。对于非 Mac 用户,我相信也有类似的解决方案!

将这段代码复制/粘贴到您的终端上,将所有的 png 文件转换成 jpg 文件。

for i in *.png; do sips -s format jpeg -s formatOptions 70 "${i}" --out "${i%png}jpg"; done

有许多方法可以制作 gif,但我使用 ImageMagick 有几个原因:

  • 安装和设置相对容易
  • 它允许您在一行代码中设置过渡时间、裁剪大小和文件格式
  • 它超级快

ImageMagick 的文档非常全面。如果你还没有安装它,看看他们的安装和文档页面

要检查是否正确安装了 ImageMagick:

  1. 在终端中,键入:
convert -version

2.如果已经安装了 ImageMagick,将显示带有版本和版权声明的消息。一旦您在系统上安装了 ImageMagick,请导航到包含我们刚刚制作的所有地图的目录。现在我们需要运行一行代码来创建 gif。简而言之,它是这样做的:

  • 转换:获取所有这些文件并进行更改
  • -delay 60 :设置进入下一幅图像之前每幅图像之间经过的时间
  • -循环 0 :设置无限循环
  • <插入所有将被转换的文件名>
  • my_map.gif

下面是在终端中使用的代码:

convert -delay 60 -loop 0 2008_violence.jpg 2009_violence.jpg 2010_violence.jpg 2011_violence.jpg 2012_violence.jpg 2013_violence.jpg 2014_violence.jpg 2015_violence.jpg 2016_violence.jpg new_map_normal.gif

现在检查您创建的新文件“new_map_normal.gif ”,您应该会看到类似这样的内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The gif above still renders as changing color range here on Medium, but the code outputs the correct file and the legend is correct when you view the file on other sites ¯_(ツ)_/¯*. Download it and view in a different programme to see for yourself (and anyone who knows why this might be, let me know!).*

就是这样!我们有一张 gif 图。

当然,现在这开始提出一系列新的问题:为什么近年来颜色变深了?暴力犯罪显著上升了吗?这种格式的 Gif 地图的局限性在于很难看清每个行政区背后的实际数字。

为此,更复杂的组合图可能比在右边包含一个图例更有用(下一次要处理的图例!).然而,作为一种揭示数据背后的故事的方法,使用 gif 地图可以成为更深入分析的一个很好的切入点。另外,你可以把任何一种有时间序列数据的图表转换成 gif 图表——我选择地图是因为它们很酷。

和往常一样,你可以在 Github 上找到复制本教程所需的所有代码(Jupyter 笔记本、shapefiles 和数据)。如果你有任何问题,在推特上找我

感谢阅读!我还出版了一份关于数据可视化、数据科学和技术交叉的每周时事通讯。每一版都包含可供阅读的文章、可供探索的可视化内容、可供分析的数据集以及更多可供学习的教程。你可以在这里 报名。

如何制作人们会真正使用的仪表板

原文:https://towardsdatascience.com/how-to-make-dashboards-that-people-will-actually-use-16c6ec35334a?source=collection_archive---------8-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当今的组织在构建仪表板上花费了大量的金钱和时间。“只要我们有一个令人眼花缭乱的仪表板,我们最终将成为数据驱动的,”他们承诺——但这与事实相去甚远。根据 Logix 的一份 2017 年报告,实际上,只有 45%能够使用 BI 工具的人报告说他们实际上在使用它们。他们提到的最常见的挑战是,仪表盘太难使用了。

不同的人做不同的决定。如果您想要构建仪表板来帮助他们做出更好的决策,您首先必须了解他们如何以及为什么做出这些决策。你可以坐在一个数据宝库上,做出最精美的图表,但如果你不能从噪音中过滤出数据,并以正确的方式呈现正确的数据,那就没有意义了。

在 SocialCops,我们积极尝试避免这种“令人眼花缭乱的仪表板”陷阱。我们的核心价值观之一是“问题第一,解决方案第二”将这转化为现实的一种方式是,我们将 80%的时间集中在解决问题上,然后用 20%的时间设计解决方案(通常是一个仪表板)。我们花在问题陈述上的时间越多,花在实现上的时间就越少,实现就变得越有效。

作为一个在遇到问题时总是跳出来执行的人,这与我一生所知道的事情是如此的违背直觉。但是我为儿童投资基金基金会(CIFF)做的一个项目完全改变了我的想法。随着项目的进行,在处理数据或构建仪表板之前,弄清楚用户和他们正在做的决定是如此重要,这一点变得很明显。

在这篇文章中,我将使用 CIFF 的故事,通过 8 个步骤来讲述我们在如何构建用户会真正使用和喜欢的仪表盘方面的学习。

第一步:文献综述:不仅仅是学术界

绕过文献综述似乎很诱人,但它对构建一个伟大的仪表板至关重要。在进行用户访谈之前,不能跳过作业。文献综述奠定了坚实的基础,有助于你更深入地理解问题陈述。

CIFF 是一个捐助组织,致力于改善发展中国家弱势儿童和青少年的生活。他们在拉贾斯坦邦开展了几个以儿童为中心的项目。他们向我们提出了一个非常有趣的问题陈述——建立一个仪表板,帮助他们深入评估他们的儿童福利项目的实际影响。

当然,我们知道儿童福利,但它实际上意味着什么呢?它是如何定义的?为了给仪表板打下良好的基础,我们广泛查阅了儿童福利文献,使用了我们能找到的所有相关资料——研究论文、期刊和书籍。在此过程中,我们首先做了以下工作:

  • 为儿童定义的年龄段(例如,0-1 岁为婴儿,1-5 岁为儿童)
  • 为本项目定义了“儿童福利”的范围和目标
  • 概述了儿童福利部门,如教育、卫生、营养和犯罪
  • 确定了我们指数的焦点群体——易受伤害和需要立即关注的儿童。

我们还研究了印度和全球的儿童相关指数。这些指数向我们展示了在全球范围内被追踪的重要指标。这也给了我们一些有趣的见解。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Screenshot highlighting the table of contents from our research report for CIFF

例如,一个国家的指数中使用的指标类型因该国的发达程度而异。在像美国这样高度发达的国家,儿童福利指数可能倾向于高等教育、社会保障和教育歧视等指标;而在印度,指标更侧重于消除营养不良、提供高中教育和学校适当的卫生设施。

第二步:总是从用户开始

最好的仪表板始于真正使用它们的人。确定不同的用户组,他们需要解决的问题,以及他们需要从仪表板中得到什么。最好的方法是实地考察和亲自采访;但是,如果这是不可能的,呼吁帮助。

我们的下一步是了解仪表板的用户,他们关心什么,什么信息和见解对他们很重要。于是我们出发去拉贾斯坦邦的首府“粉红之城”实地考察。

由于并非所有用户都有相同的行为或目标,因此必须分析每个用户的个性、角色和职责。我们采访了斋浦尔的不同用户组,然后根据他们需要使用仪表板做出的决策绘制了用户组。举个例子,

  • 首席秘书对拉贾斯坦邦儿童福利的总体状况感兴趣,并将其表现与其他邦进行比较。因此,对他们来说,仪表板需要帮助通知和推动他们的政策和战略。
  • 项目 方案主管需要跟踪他们项目的进度和成果。因此仪表板需要指出他们各自项目中的具体瓶颈,并帮助他们影响实际活动。
  • ****CIFF 和他们的非政府组织伙伴热衷于了解他们在与儿童相关的部门中应该针对的关键优先事项。这将有助于他们资助和设计满足这些优先事项及其触发因素的干预措施。

第三步:首先是问题,而不是数据

从你的仪表板需要回答的问题开始。从关于问题的宽泛问题转移到可操作问题的综合列表,这将为您指出解决方案。这些问题将是你仪表板的核心。

我们没有查看 CIFF 的数据,也没有弄清楚如何展示这些数据,而是接下来查看了 CIFF 的需求(在用户访谈中公布)。CIFF 需要回答什么问题来衡量它的影响?我们回到绘图板,从非常基本的问题开始:“项目在实现其结果方面有多成功?”,“节目的覆盖范围是什么?与印度相比,拉贾斯坦邦的表现如何?“,等等。

然而,我们并没有就此止步。这些问题将有助于 CIFF 了解他们做得如何,但不是他们下一步该做什么。为了使我们的解决方案更加面向行动,我们更进一步:“什么是最脆弱的儿童群体?”,“它们位于哪里?”、“这些领域需要哪些项目和干预措施?”“对他们来说,哪些干预措施最成功?”、“现在的节目在哪里破?”什么外围因素在起作用等等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A screenshot from our dashboard mockup for CIFF that is helping them track various programs and interventions

在这个练习的最后,我们都同意回答这些问题将使每个仪表板用户具备他们需要的洞察力,以了解哪些程序执行得不好,暴露关键的瓶颈,并显示潜在的后续步骤。

第四步:关注北极星指标

将一系列问题整合成一组核心指标或指标,这些指标或指标能让您一目了然地从较高层面了解他们的行业或问题。这有助于用户关注真正重要的东西,而不是被一大堆指标和图表分散注意力。

下一步是找出如何回答这些问题,并以数据驱动的方式揭示实际情况。挑战——儿童福利是一个非常复杂的课题。它包含无数的政策、法律和部门,以及一系列复杂的利益攸关方(政府部门和部委、慈善机构、国家和国际机构等等)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

挑战不仅限于涉及多个不同的利益攸关方。另一个挑战是,我们想要回答的问题不能用一组简单的指标来解释,因为我们的利益相关者以不同的方式理解和衡量它们。此外,儿童福利绝不简单,所以每个问题都不可避免地涉及多个部门。为了解决这一复杂性并将这些问题和部门整合在一起,我们创建了单独的部门指数——每个影响儿童福利的部门一个指数,如教育和营养。然后我们将这些指数合并成一个单一的指数,拉贾斯坦邦的 C 儿童福利指数,它将作为我们单一的、统一的北极星指标。

这一指数将通过把所有部门和发展伙伴的数据整合到一个平台上来创建。因此,它将自动考虑不同项目的不同“定义措施”,并以清晰、简洁的方式呈现它们。这将有助于用户理解拼图中他们自己的部分,并描绘出这些部分是如何与拉贾斯坦邦儿童福利的大图景联系在一起的。

步骤 5:故事板用户将如何做决定

抓住每个用户群,专注于他们需要做出的决定,并为可视化或屏幕创建一个布局,展示他们需要的准确洞察力。逐个用户组地查看,以确保您的仪表板能够满足每个用户的特定需求。在白板或纸上画一个粗略的草图会有很大帮助。

接下来,我们需要为仪表板创建“决策流”,或者用户如何导航仪表板以做出决策。我们的用户研究在我们用故事板列出用户需要做出的决定时派上了用场。在头脑风暴时,我们意识到这三类用户需要三种不同类型的屏幕。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Different screens help users navigate better on the dashboard and make to better decisions

让我举几个例子来说明这到底意味着什么:

  • 教育部长需要跟踪拉贾斯坦邦教育部门的整体表现。对于像他这样的用户,我们设计了一个带有行业指数的概览屏幕,以及地理位置和关键指标的表现。****
  • NHM (国家健康使命)的儿童健康** 项目主管会被 aanganwadi 中心注册人数的下降所激励,所以他需要找出原因并解决任何障碍。对于这组用户,我们设计了测量项目输出(或成果)的屏幕,以及成功获得这些输出所需的输入。**
  • 如果 CIFF 及其伙伴组织了解到导致儿童辍学的因素(例如,童婚、针对儿童的犯罪、疾病等。),他们可以通过他们的项目和投资来解决这些问题。对于他们,我们设计了包含主要 KPI 及其触发指标的屏幕,以显示指标在不同领域之间的关系。

当我们创建这些设计时,我们从用户那里得到了关于定义、数据集等的反馈。定期反馈有助于我们确保仪表板满足他们的需求和要求。我们采纳了他们的建议,并着手解决他们指出的任何问题——这确实为我们节省了大量时间。

第六步:找到可用的数据,以及它的样子

数据范围界定可能很乏味,但知道哪些数据可用以及数据看起来像什么是很重要的。深入研究所有可能的数据系统的结构和指标,以确定最终指标。(如果数据集本身不可用,您可以通过查看用于收集数据的表单来了解它们。)

下一个任务是检查这个仪表板有哪些数据可用。拉贾斯坦邦的政府数据比其他许多邦更先进。然而,它的所有数据系统都存在于私有的筒仓中——没有集成或挂钩使这些数据系统能够相互通信。

我们知道我们必须将这些数据集和系统整合在一起,所以我们首先必须从里到外了解它们。这意味着找到不同政府部门、行业、项目和计划的所有相关数据集。

我们研究了我们发现的每个数据集的特征,例如来源(例如政府机构、民间社会、智库)、数据类型(例如管理信息系统、报告、调查)和格式(例如 Excel、CSV、PDF)。这有助于我们全面了解可用的数据集及其元数据。然后,我们一个接一个地深入研究数据集,了解它们的指标和变量。我们关注他们的粒度(州、地区、街区、村庄、受益人等)。)、分类(按性别、年龄、种姓、地区等)。),以及可用年份连同周期(数据更新的频率)。

创建指数的最大挑战是指数中的指标需要保持一致。如果它们来自不同的数据源,这可能会很棘手。例如,它们需要(1)以必要的粒度出现,(2)在相同的时间段内被记录,以及(3)都被一致地定义。因此,我们做了一些基本的数据清理,以处理缺失值和异常值或方差。

为了完成数据范围界定,我们开始了第二个研究阶段。我们审查了计划和项目目标,最终确定了投入和产出指标清单。此外,我们还进行了实践研究,以制定儿童福利关键绩效指标及其相关指标。

第 7 步:完善北极星指标的方法

下一步是最终确定仪表盘北极星指标的方法。这是应该咨询数据科学家和统计学家的地方。它们可以帮助您了解如何构建一个强大的指数,以及您可以对这些指数进行哪些其他分析。

现在我们已经知道了哪些数据集和指标可用,我们可以为儿童福利指数创建最终的方法。建立一个索引包括创建一个指标列表,并以数学逻辑的方式将它们组合起来。

我们精心挑选了最重要的指标,并对其进行标准化。我们首先给予所有指标同等的权重,因为我们认为所有涉及儿童福利的部门都同样重要。但是,我们计划通过咨询行业专家并使用主成分分析奇异值分解等统计方法进行降维,来提高这些权重。

我们还通过按性别、年龄、种姓和地区等分层因素对指数进行分解,从而完善了指数。我们还建议跨时间计算该指数,以便用户能够了解不同地区的儿童福利如何逐年变化。

第 8 步:为用户反馈和设计迭代构建一个原型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

One of the rough layouts for the visualization of the dashboard before we built the Powerpoint mocks and Invision prototypes

你不需要一个最终的仪表盘来查看你的用户怎么想。即使是一个简单的原型也是在用户反馈和设计迭代之间启动反馈循环的好方法。像 Invision 甚至交互式 PPT 这样的平台就足够了。

一旦我们有了故事板的草图,我们就开始着手创建模型,这是一个实际仪表板外观和功能的表示或原型。然后,我们将原型带给 CIFF 和其他利益相关者,并要求他们使用它。这有助于我们深入了解他们是否能够利用仪表板上的见解做出决定。

这个过程也非常有用,因为它让用户对问题感兴趣,并鼓励他们分享一些非常有价值的反馈。换句话说,模型就像一个底座,帮助他们获得清晰。这些反馈循环一直持续到每个人都确信仪表板是正确的。

这个过程值得花时间吗?

显然,这个仪表板范围和设计过程需要时间。我们需要 8 个步骤来提出以用户为中心的设计,这还没有考虑到未来的数据处理、清理和标准化,建立数据管道,或建立实际的仪表板。

那么这个过程值得吗?我们认为是。

看着数据,找出最好的指标,并以最漂亮的方式将它们可视化,这很诱人,但往往只会导致一个令人眼花缭乱的仪表板,每年只使用一次或两次。相反,瞄准将使用仪表板的人和它最终需要驱动的决策可以帮助你建立一个你的用户永远不会放下的仪表板。

在我们的例子中,这非常重要,因为仪表板本身非常重要。通过这个仪表板,CIFF 和他们的合作伙伴将能够跟踪他们的投资是如何帮助遏制儿童死亡率和营养不良的;政府官员将能够追踪像宝山RJJSY 这样的计划是如何帮助抑制婴儿死亡率和产妇死亡率的;项目主管将能够追踪哪些因素导致了小学教育质量的飙升。如果这个仪表板不容易理解和使用,CIFF 和他们所有的利益相关者将会浪费大量的时间和金钱,而不会更接近他们需要的答案。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A screenshot of from our dashboard mockup that will help CIFF partners identify and address problems based on their projects and investments

此外,我们发现,广泛的范围界定和设计流程有助于我们预见并预防在我们实际创建仪表板时会出现的挑战。例如,广泛的数据范围有助于我们了解最终的仪表板可以包含什么,不可以包含什么。DISE(印度最大的教育数据集)中的大多数指标都有很多分类,但这些分类在其他数据集中是不可用的。如果没有数据范围,我们可能会以不一致的指标或糟糕的索引而告终。

因此,这一范围界定过程有助于我们为这些挑战做好准备,并在它们脱离我们的仪表板之前找出解决它们的方法。这也有助于我们让利益相关者意识到这些挑战,以便他们准备好并愿意在需要时提供额外的帮助或资源。

有兴趣了解更多关于如何确定范围和设计优秀仪表板的信息吗?这里有一些关于设计思维的资源可以帮助你开始:

祝您构建自己的直观、用户友好的仪表板好运!

嘿伙计们,快速个人更新!我们在 Locale.ai 推出了我们的产品,希望您能试用并分享您的反馈。报名链接此处

如何像老板一样做出数据驱动的决策

原文:https://towardsdatascience.com/how-to-make-data-driven-decisions-like-a-boss-fffc088470da?source=collection_archive---------5-----------------------

理论上,理论和实践没有区别。但实际上是有的。― 瑜伽熊

决策可能很难。你每天需要做的决定多得令人不知所措。研究表明,我们一天中做的决定越多,我们做决定的能力就越差(决策疲劳)。有时你会做出非常非常艰难的决定,在这种疲劳中,你很难选择一个选项而不是另一个选项,即使使用了你所拥有的所有数据。

决策理论是逻辑、博弈论和概率的结合,旨在将决策形式化为您更容易解决的结构化问题。很好,但是你为什么要在乎?因为它提供了许多通用的框架和工具,您可以使用它们来确保决策方法的一致性。你越善于使用这些框架和工具,你就越能更好地做决策——你就越不容易被淹没和成为决策疲劳的受害者。

决策理论是一个很大的领域,所以我们将只涵盖你需要开始的基础知识。具体来说,我们将涵盖:

让我们从建模决策开始,使它们更容易评估。

离群值 **监控您的业务数据,并在发生意外变化时通知您。**我们帮助营销/发展&产品团队从他们的业务数据中获取更多价值。 今天安排试玩。

  • Outlier 是 Strata+Hadoop World 2017 观众奖得主。

决策模型

可视化决策

什么是决策?简而言之,这是在许多不同的选项中做出选择,每一个选项都会导致某种预期的结果。你可以用我称之为决策模型的东西来想象一个决策,它实际上只是流程图。您可能在过去使用过流程图来捕捉流程,这正是我们决策过程所需要的!例如,下面是一个非常通用的决策模型:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A simple flow diagram describing decisions

决策模型帮助您获取做出最佳决策所需的所有信息:

  1. 列举所有可能的选择。
  2. 理解每个选择的结果。
  3. 对最终结果的理解。

决策模型使得这三者都很容易可视化。例如,假设我们需要决定是否应该为我们的销售团队再雇用一名销售人员。如果我们雇佣销售人员,短期内会花费一些钱(工资),但可能会在 6 个月内带来更多的销售。该决定可能如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A hypothetical flow evaluating the hire of a sales person

如你所见,决策模型只是一种简单的方法,通过强迫你写下来来确保你理解所有的选择和决策结果。你不会对每个决定都这样做,但对最重要的决定来说,这是一个重要的工具。

接下来,我们将讨论当存在不确定性时如何理解结果,这在现实生活中几乎总是如此!

期望值分析

了解成果

在昨天讨论决策模型时,我们分解了如何考虑决策和可供选择的选项。在许多方面,比你的选择更重要的是这些选择的最终结果。

例如,让我们说你正试图决定你是否应该买一张彩票。我们可以对决策建模如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Flow diagram for expected value analysis

看那里的决定,显然我们应该买票!然而,我们没有捕捉到的是,获胜的概率并不是 100%。事实上,对于大多数彩票来说,中奖的概率非常小。让我们假设赢得彩票的概率是 1 . 75 亿分之一(强力球的典型概率)。那么,我们如何衡量这一潜在结果的价值呢?

期望值是评估受概率(也称为随机变量)影响的结果的一种方式。期望值允许您在量化事件时考虑事件的可能性,并将其与其他不同概率的事件进行比较。

要计算期望值,您需要将事件的概率乘以事件的值。在这种情况下,我们将中奖金额(1 亿美元)乘以中奖概率:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

简单来说,中奖的回报是巨大的,但中奖的机会是微乎其微的,所以买票的预期价值只有 57 美分。

现在,我们可以在决策模型中使用它来明确决策:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在选择很清楚,我们不买票并节省 1 美元比买票损失 0.43 美元要好得多!这就是期望值的力量,在比较选项时,它们允许我们快速而容易地计算概率。

当然,大多数决策将包括许多不同的概率。接下来,我们将讨论多阶段决策,其中一个决策可能导致许多其他决策,并将我们迄今为止讨论的内容汇集在一起,以做出一些实际的决策!

决策树

在生活或商业中,很少有决策是独立的。一个决定导致更多的决定,反过来又导致更多的决定。当你做决定的时候,如果你要做一个最优的选择,你需要考虑那些后来的决定。

决策树是我们之前讨论的决策模型的扩展,它允许您理解相互关联的决策的关系和最终结果。决策模型和决策树的唯一区别在于,在决策树中,一个选择的结果可以是另一个决策!

举个例子,让我们回顾一下我们是否要雇佣一名销售人员的决定。不要把它想成是雇用销售人员的决定,让我们把它想成是现在还是以后雇用销售人员的决定。这将决策变成一棵树,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Taking the decision tree to the next level with dependencies

如果我们现在决定不雇佣销售人员,我们可以选择以后雇佣他们。这既有成本也有收益,现在您已经绘制了决策树,可以开始分析了。

这个简单的例子体现了现实世界决策的许多特征,以及您在构建决策树时应该考虑的事情:

  • 仅仅因为有大量的决策,就可能只有少量的可能结果。在许多真实世界的情况下,任何决策都只有几种可能的结果,这可以大大简化你的过程。通过从首选结果开始回溯,您可以确定最有可能帮助您实现目标的决策路径。
  • 根据我们在第一个决定中所做的选择,其他各种决定要么可用,要么丢失。这是做决定时要考虑的一个重要因素,因为一些选择可能会在未来保留更多选择,从而增加你未来决策的灵活性。
  • 你的决策树的许多分支也将引入不确定性,因为一些决策和结果将依赖于某些概率。在这里,使用期望值是非常强大的,因为您可以计算一个选择的期望值,即使真实的结果是删除了许多决策!

你的决策树越大,就越难处理它可能引入的越来越多的概率。明天,我们将回顾一个有用的工具,来减少这种复杂性,并使这些决定变得稍微容易一些。

模拟决策

赌博可以变好

即使使用了我们本周讨论的工具,仍然很难做出艰难的决定。如果你的决策树有很多不确定性,或者你的期望值很难预测,即使这些框架也没什么帮助。

好消息是你可以作弊!在你真正做出决定之前,你可以把同一个决定重复上千次,看看结果如何。这个过程被称为蒙特卡罗模拟,它使用软件来模拟多次做出相同的决定,并使用您提供的概率来确定结果。通过研究这么多测试的结果,你可以了解最有可能的结果,并将其作为你决策的一部分。

例如,让我们回到是否购买彩票的决定。请记住,门票价格为 1 美元,中奖奖金为 1 亿美元,但中奖几率仅为 1.75 亿分之一。如果同一张彩票也有 1/20 的机会赢得 5 美元,1/50 的机会赢得 20 美元呢?那我们怎么做决定呢?

对于这个简单的例子,我们可以直接计算期望值,但为了好玩,我进行了蒙特卡洛模拟,结果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我进行了 500 次模拟,其中 467 次我一无所获,5 次 15 美元,20 次 16 美元,可悲的是,1 亿美元 0 次。平均结果是赢得 0.79 美元——仍然低于票价!

然而,考虑 500 次模拟中涉及的概率可能不足以得到一致的结果。与任何概率模拟一样,运行的次数越多,结果的分布就越能反映真实的概率,所以要尽可能多运行几次。我再次运行同样的模拟 500 次,得到的平均值是 0.54 美元,这是非常不同的!这凸显了这种方法的危险,因为结果中有太多的可变性,所以你需要使用结果作为指导,而不是事实。

**回顾:**我们已经讲述了决策理论的基础,包括如何可视化决策,以确保您捕捉所有可能的选择和结果(决策模型和树),并考虑结果中的不确定性(期望值)。我希望这能给你一个开始,用一种系统的方式来处理你的决定,这将帮助你做出更好的决定!

离群值 **监控您的业务数据,并在发生意外变化时通知您。**我们帮助营销/发展&产品团队从他们的业务数据中获取更多价值。 今天安排试玩。

  • Outlier 是 Strata+Hadoop World 2017 观众奖得主。

如何利用上下文土匪做出数据驱动的决策

原文:https://towardsdatascience.com/how-to-make-data-driven-decisions-with-contextual-bandits-the-case-for-bayesian-inference-cc2f2913ebec?source=collection_archive---------8-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

贝叶斯推理的案例

2018 年,几乎每个行业都面临着巨大的压力,要做出数据驱动的决策。在强大的机器学习算法时代,这不仅仅是一个好主意;这是生存

但是我们如何应用“预测分析”来做决策呢?那么,如果我们可以预测客户流失或转换的可能性呢?一个好的预测真的能给你的组织带来价值吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据科学是时候成长了

监督学习创造了奇迹,但它从根本上说是有限的。决策的直接优化——最广泛地说,强化学习(RL)领域— 对于大联盟来说已经足够成熟了

我们已经看到了 RL 的一些巨大突破,但是一个可靠的通用解决方案仍然缺乏。

众所周知并且有效解决了的是 RL 的特殊情况,称为上下文强盗问题

什么是语境土匪?很像 RL;你有一系列的决定要做,任务是学习最佳的选择来优化一些奖励。唯一的区别是上下文强盗公式没有状态。

约翰·舒尔曼是 OpenAI 深度增强现实领域的领先研究人员,他在2017 年的演讲中对任何希望在实际环境中应用深度增强现实的人的直接建议是将其作为一个上下文相关的土匪问题。

“通常你可以把(你的问题)近似为一个没有国家的背景强盗问题。对背景强盗问题有了更好的理论理解。”约翰·舒尔曼,OpenAI

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

深度语境强盗来了——而且效果很好

也许被关于深度学习的头条新闻掩盖了,背景强盗问题研究的最新进展在很大程度上被忽视了。deep RL 中有一些令人惊讶的结果,它是优秀的 clickbait,但在野外,我们数据科学家有职业责任关注相关研究

尤为重要的是 2018 谷歌大脑论文深度贝叶斯土匪对决。这篇论文算不上创新,但却是一个里程碑。作者们看了一些最近最有希望的解决方案,并在各种不同的任务上对它们进行了比较。

主要外卖?这些方法中的大多数都能很好地解决各种各样的问题

探索与利用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所有的 RL 问题都面临一个基本的悖论:我们是尝试新事物来寻找更好的解决方案,还是简单地重复我们知道行之有效的行为?这个经典难题被称为探索/利用权衡

大多数关于上下文强盗的研究都集中在用一般的方法解决这个难题上。每个问题都不一样;我们能创造出一种在任何地方都适用的算法吗?

一个简单有效的解决方案被称为ε贪婪策略。ε是超参数;当ε= 0.01 时,我们利用 99%的时间,探索 1%的时间。这个简单有效。我们只需要选择一个运行良好的 epsilon,我们可以找到一个解决方案,同时最大限度地提高性能。

epsilon-greedy 的问题是它需要调优。我们是从高ε开始,然后随着时间降低它吗?我们要选择一个 epsilon 并把它留下吗?

在这里摆弄的真正风险是,当我们调整时,由于次优决策,真正的钱正在损失

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

汤普森取样

真正的解决方案是找到一种算法,自我调节探索利用问题。事实证明,贝叶斯公式给了我们一个可靠的方法来做到这一点。

汤普森取样是一个可以追溯到 1933 年的想法。它给了我们一种聪明探索的方式。汤普森抽样的主要思想是:

“当有疑问时:探索!”—迈克尔·克莱尔,试图解释汤普森抽样。

使用 Thompson 采样可以很容易地解决更简单的情况,即所谓的多臂强盗问题

这个想法很简单:利用我们对每个行动背后的预期回报分布的先验理解,让我们抽取样本并选择 argmax 作为我们选择的行动。这就是汤普森抽样政策:既贪婪又随机。

这个策略的结果是深远的:当我们的模型对一个决定有信心时,它会不断重复那个行为。当它不太自信时,它会探索可能性更高的其他选项。

对多臂土匪很管用。棘手的部分是将它应用到上下文案例中。

汤普森抽样的贝叶斯回归

当我们将背景引入多臂强盗问题时,我们不再能够简单地学习每一个动作的奖励分配。我们需要根据一组特性或者一个环境来决定这个分布。

贝叶斯线性回归为我们提供了一个很好的方法。贝叶斯线性回归不是简单地拟合一个线性回归模型,而是允许我们在预测中加入不确定性。更具体地说,它允许我们将某些结果(比如说,我们的报酬)的预期分布取决于一些特征。这种分布可以从采样,打开了在上下文土匪情况下汤普森采样的大门。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Bayesian regression reward optimization — Maximum Reward is the known-best policy, and cumulative reward is the trained policy. Bayesian LR + Thompson Sampling implicitly optimizes explore-exploit behavior. (Each decision and timestep is the x-axis.)

非线性函数呢?

线性模型是有效的,但是限于给定独立特征的近似线性信号。如果我们需要对非线性函数建模呢?

一种完全有效的方法是从我们的原始特征中设计出一组大致独立的特征。你能做到的。

但是特征工程是老派的。2018 年,我们有神经网络来为我们做这件事。

进入深度学习

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2018 年上下文土匪摊牌论文探索了贝叶斯线性回归解决方案的巧妙适应。简称为神经线性算法,谷歌大脑研究人员应用神经网络来学习一组特征,以馈入贝叶斯线性回归模型。

结果呢?一个在各种任务中表现卓越的模型。这很简单,计算效率高,而且证据就在布丁里。

“…根据对深度网络最后一层提供的表示进行贝叶斯线性回归来做出决策,提供了一种可靠且易于调整的方法。”——Riquelme 等人,谷歌大脑

你可以应用最先进的研究

这种算法是普遍适用的,本质上是简单的。研究人员甚至开源了他们的代码供公众使用。

但直接应用前沿研究可能会令人生畏。

我在 Launchpad 主持一个数据科学家培训会议。AI ,作为培养数据科学人才进入该领域的国际活动的一部分。

教授梯度推进和随机森林很容易,因为开源软件非常用户友好。初露头角的数据科学家只需要导入一些类,她就可以立即开始实验。

因此,当我站在一群受训的数据科学家面前,向他们讲授深层贝叶斯语境强盗时,他们迫不及待地想要尝试。

唯一的问题?他们不能直接从 scitkit-learn 导入。唯一可用的选择,从零开始手工编码实现,当你有最后期限来满足时,并不总是可行的。

太空盗匪诞生

我决定把谷歌大脑的开源代码打包,这样我的学员就可以使用它了。

我没有野心;我从 Tensorflow 开源代码中取出最简单的模型(贝叶斯线性)和最好的模型(神经线性),优化后用于规模化使用,上传到 PyPI

它只需要一个名字。我有很多想法,但我对天文学的热爱和“太空强盗”这个愚蠢的名字吸引了我。 太空盗匪 诞生

目前的版本是 v0.0.9,是一个 alpha 版本,但是它可以工作。一个玩具问题表明,图书馆的模型可以在线学习,也可以从历史数据中学习

这是 Google Brain 的贝叶斯方法的另一个优势:学习不需要直接获取决策政策。这意味着来自任意活动的记录可以用于优化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Space Bandits is able to learn a “soft” decision boundary with Thompson sampling and a Bayesian linear model — only observing rewards given actions

关于报酬设计的一个注记

“我已经开始把 deep RL 想象成一个恶魔,它故意曲解你的奖励,并积极地寻找最懒惰的可能的局部最优解。”— Alex Irpan ,Google,深度强化学习还没起作用

亚历克斯可能说得最好,但任何有机器学习经验的人都不应该对此感到惊讶。

RL 算法,包括上下文土匪,不容易推广。他们只有在别无选择时才会这么做。

在受监督的环境中,这种想法表现为过度适应。当简单地记忆训练数据是一种选择时,为什么要一般化呢?

同样的问题在 RL 里就不那么清楚了。当你的模型找到优化奖励的方法时,是否过度拟合?只有当你的奖励函数有缺陷的时候才会这样。

这一块应该不难,不要想多了。在现实生活中,奖励(通常)是金钱。如果你的模型找到了优化回报的“窍门”,只要回报是利润,你就应该高兴。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A Space Bandits Neural Linear model learns nonlinear decision boundaries. Thompson sampling encourages more exploration closer to “true” decision boundaries, and optimal choices in regions with higher certainty.

部署深度贝叶斯上下文盗匪模型

你没有借口了。该算法已被证明在实践中对广泛的问题有效。您可以通过基于前沿研究的决策优化给同事留下深刻印象。也许最好的是,你可以 pip 安装一个 python 包为你做所有的艰苦工作。

你还在等什么?

如何让设备变得智能

原文:https://towardsdatascience.com/how-to-make-devices-smart-10dff00c2a8c?source=collection_archive---------6-----------------------

使用机器学习算法,亚马逊 Alexa 和 DeviceHive

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在一切都趋于智能的时代,仍然有设备和遗留设备保持不变。他们很好地履行了自己的职责,但如果他们能做得更多呢?

我们考虑了一个简单的电梯连接到由新功能和服务支持的互联网的场景。人们每天都使用电梯。所以,让我们让它更安全、更智能、更可靠。

应用支持

开发新功能总是要花相当多的时间。但是如果你可以通过安装一个新的应用程序把它添加到你的设备上呢?

我们将集成服务打包到 Canonical 的 snap 包中。其架构允许任何开发者创建自己的品牌应用商店,并上传快照进行分发。

一旦设备支持应用程序,它就成为 snap 生态系统的一部分,为该平台提供了大量解决方案。这项技术允许在不改变设备主要功能的情况下向设备添加新的服务。整个演示旨在展示如何轻松完成。

更安全的

为了提高安全性,让电梯更安全,我们使用了机器学习算法。这些算法允许我们跟踪攻击行为、武器、衣服、情绪、健康状况等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Ski-mask detection

通常入侵者在实施抢劫/袭击前会试图隐藏自己的脸。我们以这一事实为出发点,训练机器学习算法来识别人们身上的面具,但不对仅仅持有面具的人做出反应。

一旦检测到滑雪面罩,系统就会触发警报,发送短信,并呼叫安全官员。此外,理论上它可以锁定电梯门,直到警察到来。

来自电梯摄像机的视频流使用 TensorFlow 模型进行分析,该模型被训练来识别滑雪面罩。在肯定识别的情况下,发生警报。

  • 对 RestComm 电话服务器的 API 调用被调用——这触发了预先配置的动作(比如发送文本消息或打电话);在调用时,它也可以提供一些信息。
  • 警报声响起——为了让这成为可能,我们用定制的 DeviceHive 固件刷新了 ESP8266 芯片。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Solution architecture

聪明的

在上一篇文章中,我们讨论了如何将任何基于 Linux 的设备转变为 Amazon Echo 设备。我们在这里也实现了它,为了演示实际的解决方案,我们将 Alexa 与 DeviceHive 集成在一起。

[## 如何将 Alexa 添加到树莓派中

或者任何 Linux 设备

medium.com](https://medium.com/iotforall/how-to-add-alexa-to-a-raspberry-pi-6cedfe15662e)

我们使用 DeviceHive 云解决方案来控制一个 LED 灯条,用于语音命令的可视化演示。主要的挑战是开发一个可以在多种电路板上运行的语音激活解决方案。Ubuntu 为这些主板提供支持,包括 x64 和 ARM 主板,如 Raspberry Pi。

对 Alexa 的每个请求都必须由人类语言触发。因此,我们添加了一个本地语音识别算法来检测’ Alexa '关键字。一旦它听到这个关键词,它就会记录声音,直到语音停止,并将其发送到亚马逊 Alexa 云服务。

为了获得广泛的硬件支持,我们开发了一个基于 Amazon Alexa API 的包。然后,我们将这个应用程序打包到一个规范的 snap 包中,以提供简单的设置和事务性更新。

我们使用 WS2812B LED 灯条作为视觉设备,通过 DeviceHive 固件连接到 ESP8266 芯片。该固件提供与 DeviceHive 服务器的连接,还支持 LED 灯条设备,并提供控制它们的命令。因此,我们完全可以通过从 Alexa Skills 应用程序发送不同的命令来控制 LED 灯条。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Alexa integration architecture diagram

我们创建了一个语音控制电梯系统,led 灯带上的灯代表建筑楼层。

此外,该系统被编程为播放关于在所选楼层可以找到的位置的广告。它还可以回答诸如“这栋楼里最好的餐厅在哪里?”

可靠的

我们通过其 RESTful API 将演示与 Salesforce 物联网云集成,以记录使用统计数据并分析收集的数据。这可用于构建预测性/预防性维护解决方案。

利益

我们开发了一个与现代服务和技术相集成的复杂解决方案,为用户和客户增加了新的价值:

  • 语音识别使语音命令成为物联网生态系统的一部分。该解决方案使用基于 web 的服务,这使得它可以扩展到更大的系统,并且可以轻松地从一个硬件平台迁移到另一个硬件平台。
  • 利用机器学习方法可以提高安全性。
  • 云技术使公司更具创新性,更快地开发商业模式,并在定制解决方案中使用众所周知的高质量产品。
  • Salesforce 物联网云集成可记录和分析使用数据。
  • 作为应用程序添加新特性和功能的能力。

技术

技术栈包括:亚马逊 Web 服务、亚马逊 Alexa、DeviceHive 云服务、DeviceHive 固件、Linux、Python、C、Ubuntu Snaps、Snapcraft、Java、JavaScript、TensorFlow、Restcomm。

DataArt 物联网负责人伊洛宁撰写。

如何让 Goodreads.com 跻身 400 强?

原文:https://towardsdatascience.com/how-to-make-goodreads-com-top-400-list-8e3a26e509bf?source=collection_archive---------2-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我是一个书虫。我一个月读 3-4 本书(仅限非小说类书籍), 80%的句子以“我在某处读到过……”开头

我对书籍的兴趣促使我创办了全球最大的读者和书籍推荐网站goodreads.com,亚马逊于 2013 年收购了该网站。

这个项目的目标是分析 goodreads.com 的前 400 本书的共同特征,并根据书评预测一本书的成功。

刮 Goodreads.com

我从“有史以来最好的书”列表中刮出了这些书。为了获取我的分析所需的所有信息,我必须抓取三个不同的页面模板。

下面是一个页面模板的例子,它列出了我的分析所需的一些元素(用橙色突出显示)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分析

我将我的分析分为三个部分,每个部分由一组问题引导:

  • 写作:
  • 哪种流派在 400 强榜单中最具代表性?
  • 有最佳页数吗?
  • 出版
  • 出版年份重要吗?
  • 预测
  • 评论的数量是成功的预测因素吗?
  • 哪些词,在哪个频率下,可以预测成功?

前两部分的目的是在作者写书之前为他/她提供指导,而最后一部分的目的是预测一本书出版后的成功。

我使用 Python 进行分析,使用 Python 的散景包进行可视化。

1-写作

哪种流派在 400 强榜单中最具代表性?

小说、经典和奇幻是 400 强榜单中最具代表性的类型。请注意,由于一本书可能被归类到多个流派下,因此这些流派之间可能会有重叠。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面的直方图提出了几个问题:

  • 各流派在 400 强榜单中的分布情况如何?比如,小说类书籍主要在前 100 名还是在前 400 名榜单的底部?
  • 如果一本书的体裁是小说、幻想或经典,它更有可能进入前 400 名吗?如果这三种类型在 Goodreads.com 有很高的代表性呢?人们应该预料到一个流派进入前 400 名的可能性与该流派在所有 Goodreads.com 书籍中的流行程度成正比。

400 强榜单内各流派分布

下面的热图回答了第一个问题:它按排名类别显示了前 16 个流派的分布(例如,前 100、前 200 等。).颜色描述了书籍的数量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个有趣的发现:文学体裁不属于三大体裁。然而,它在 100 强名单中占有很高的比例。

引入另一个数据集:我们的控制列表

如上所述,如果我们不能把它和最差的 400 个榜单进行比较,那么前 400 个榜单就毫无意义。可惜没有这样的名单…

在没有“史上最差书籍”榜单的情况下,我随机抽取了 1 万本关于 goodreads.com 的书籍,作为我的“对照”榜单。

免责声明:我后来才知道,goodreads.com 上的确有最差书籍排行榜。

下面的直方图比较了控制列表和最佳书籍列表之间的流派分布。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个有趣的发现:虽然经典作品在 goodreads.com 上的代表性不足,但它在 400 强榜单中却占有很高的比例,这表明读者更有可能投票支持经典作品。

另一方面,小说、幻想和青少年体裁在 goodreads.com 书籍中占有相当大的比例。它们进入前 400 名的可能性高于像古典文学这样代表性不足的流派。

有最佳页数吗?

简而言之,答案是否定的。如下图所示,对照名单和前 400 名名单之间也有类似的趋势。页面数量不是成功的预测因素。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2-发布

出版年份有关系吗?

对于这一部分,我查看了每年排名前 400 的书籍的分布,并调查了一个可能的关联:

  • 每年出版的平均页数
  • 每年售出的图书总数

总计数与平均页数(按出版年份)

排名前 400 的书籍中有很大一部分是在 2003 年至 2006 年间出版的。尽管平均出版页数的一些峰值与排名前 400 的书籍数量的峰值一致,但这两个变量之间没有相关性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有趣的是,控制列表(下图)的趋势与前 400 名列表的趋势不同。尽管很多书是在 2010 年后出版的,但它们在 400 强榜单中的代表性不足。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于那些对细节感兴趣的人来说,下面是 2003 年、2004 年和 2006 年十大畅销书的名单。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

售出图书数量与前 400 名图书数量之比

每年前 400 的图书分布和当年的图书销量有关联吗?如下图所示,情况似乎并非如此。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然而,数据集是有偏差的(如下所述),所以对结果不能全信。

我使用了来自美国人口普查局的数据集,该数据集提供了每年售出的图书数量。该数据集仅包括 1992 年至 2014 年美国书店销售的图书数量。换句话说:

  • 样本量有限(23 年)。
  • 网上销售没有被计算在内,我们预计这意味着本世纪的大量图书销售没有被计算在内。不幸的是,由于没有网上图书销售的官方记录,实际数字无法核实。
  • 它没有报告售出的独特书籍的数量,这意味着我们一年可以卖出 1000 本全部是哈利波特系列的书。

3-预测

评论的数量是成功的预测因素吗?

评论的数量是排名前 400 的指标。我们看到一个明显的趋势,前 100 本书比前 100-200 本书收到的评论更多,而前 100-200 本书收到的评论又比前 200-300 本书多,等等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

***是否应该得出评论越多越好的结论?*或者说评论数量和评分之间的关系是一条最好和最差的书获得更多评论的倒钟形曲线?毕竟,一本普通的书不会引发强烈的情绪(无论是积极的还是消极的);只有最好的和最差的才知道。

控制列表没有证实倒钟形曲线的假设。相反,五星的书得到的评论比四星的书少,而一两星的书几乎得不到任何评论。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

哪些词,在哪个频率下,可以预测成功?

我使用 AFINN 字典开始对评论专栏进行情感分析。

AFINN 方法的输出是一个浮动变量(AFINN 分数),如果大于零,则表示正面情绪,小于零,则表示负面情绪。刻度范围从-5 到+5。

首先测试控制列表上的 AFINN 方法

需要高水平的粒度来识别哪些单词可以预测一本书在 Top 400 列表中的排名。在将 AFINN 方法应用于前 400 名名单之前,我在一个更广泛的名单上检查了它的可靠性,即控制名单。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

AFINN 词典似乎是一个很好的成功预测器(如上图所示)。下一步是看它是否能帮助区分前 100 名和前 300 名的书…

不幸的是,如下图所示, AFINN 词典的粒度不足以预测“有史以来最好的书”名单中的排名(根据定义,所有的书都是成功的)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下面的散点图提供了与箱线图相同的见解,只是我使用了连续变量(得分)而不是离散变量(排名类别),并通过颜色区分了排名类别。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在上面的散点图中,分数没有下降到-1.5 以下,这是有意义的,因为我们不希望“有史以来最好的”书籍有很高的负面情绪分数(即-3,-4 或-5)。然而仍然有少量的预测误差;一些排名前 100 的书有负面情绪得分。

我的情感分析需要一些微调:

  • 没有查看书评的总得分,而是分析了书评中的每个单词,以了解的 AFINN 得分和频率如何预测一本书的排名。
  • *我还查看了另一个库, **Vader 词典,*它提供了更多的粒度。

观察单个的正面和负面词汇,以及它们如何影响一本书的排名

如下图所示,一个单词的出现频率和 goodreads 平均得分之间没有相关性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有趣的是,一些 AFINN 得分较低的词在成功书籍的评论中出现得相当频繁。这是因为 AFINN 词典是用 unigram 特征构建的,其中忽略了语法甚至单词的顺序,这意味着句子“我不喜欢”中的“喜欢”将被正面解释。

查看另一个库——Vader lexicon——以帮助更好地预测分数

我对 AFINN 词典不太满意,决定看看 Vader 词典。它的算法似乎更精细,因为它输出 4 类情感:

  • 阴性:阴性
  • neu:中性
  • 位置:正
  • 复合:复合(即,通过将评论中每个词的化合价分数相加来计算的总分数,根据 Vader 规则进行调整,然后标准化为-1(最极端的负面)和+1(最极端的正面)之间的分数)

我使用配对图来分析以下各项之间的相关性:

  • Vader 正分数(pos)和 goodreads 分数
  • 维德负分数(neg)和古德里德分数
  • 维德复合得分(复合)和古德里德得分

pearson’s r 值为 0.5 或更高的图表显示相关性,为绿色。Pearson r 的范围从-1 到 1,其中:

  • r 为-1 表示变量之间完全负线性关系,
  • r 为 0 表示变量之间没有线性关系,以及
  • r 为 1 表示变量之间完全正线性关系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Vader 中性和阳性分数之间存在负相关,这是有意义的:分数毕竟来自同一个词典。然而,Vader 正负分数之间没有相关性,这令人惊讶。

最后,我感兴趣的变量之间没有关联(例如,Vader 正、负、复合分数与 goodreads 分数)。

会有,应该会有,可能会有

我的分析表明,经典类的书更有可能进入前 400 名榜单

虽然排名前 400 位的书籍大多平均有 300 页,但没有明确的模式表明出版年份或页数。

评论的数量是成功的一个很好的预测指标:越多越好。然而,这无助于区分四星和五星的书籍。也就是说,五星级的书可能比四星级的书卖得好,这不是我分析的一部分。

最后,情感分析部分在预测一本书在排行榜前 400 名中的成功是不成功的。AFINN 和 Vader 方法帮助预测了 goodreads.com 获得高分的可能性。然而一旦一本书进入前 400 名榜单,并且需要高水平的粒度来将其与其他成功的书籍区分开来并预测其排名,这两种方法就不可靠了

如果给我更多的时间和数据,下面是我可以、将要和应该完成的分析的快速列表:

  • 更多关于用户写评论的数据:我希望这些评论包括写评论的人的人口统计数据,以回答一些问题,例如:来自特定城市、特定年龄组或性别的人在评论时更无情吗?
  • ***使用单文法与 n 文法:*情感分析是用单文法特征构建的。这意味着整个文本被分割成单个单词,使单词脱离了上下文,从而降低了检测评论情感的准确性。n-gram 越长(n 越高),需要处理的上下文就越多。我希望我已经知道了基于 n-grams 的词典或者 R 中的 Syuzhet 包,这将我带到下一个要点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 使用 R :总的来说,我觉得对于情感分析部分,R 可能是一种更好的语言。事实上,我开始用 R 编写代码,并为这一部分用 Python 翻译了我的代码。
  • ***每本书的评论数量有限:*我只抓取了一本书的前 30 篇评论,这确实限制了情感分析,并且可能会引入一些偏见(尽管第一篇评论是随机显示的,并且没有按照新近度排序)。
  • 更多见解:我希望我的分析更有成果,尤其是情感分析部分。

如何使用 gif 制作有趣的 Tableau 仪表盘

原文:https://towardsdatascience.com/how-to-make-interesting-tableau-dashboards-using-gifs-182eab5fe354?source=collection_archive---------6-----------------------

可视化可以对我们如何感知不同的事物产生巨大的影响,尤其是数据。将数据以结构化方式排列成表格格式远比非结构化数据好得多;以图表的形式用图形表示数据也比以表格的形式表示数据要好。随着可视化程度的提高,我们对数据及其呈现环境的理解也在提高。

我们举个例子,自己验证一下上面的说法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

试着阅读上面的表格并理解它的意思。

好吧,我来帮你。

因此,该表提供了人均互联网和移动电话使用量的逐年变化趋势。总体趋势是积极的,互联网和移动电话的人均使用量逐年增加。然而,为了更进一步理解这些年来的相对增长,我们必须在分析之前做一些计算并得到一些数字。然而,如果我们以一种更好的视觉格式呈现上述数字,比如说条形图或折线图,那么它可能有助于我们的目的。我们将能够看到这些数字多年来的总体变化,并进一步看到这些年来的相对增长。让我们看看下面的图表,看看有什么不同。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

柱状图为我们提供了人均手机使用数据,而折线图为我们提供了人均互联网使用数据。我可以毫不避讳地说,上图的视觉吸引力比表格中的简单数字好无数倍。上图为我们提供了多方面的见解,其中一些观点如下:

  • 人均移动电话使用量和人均互联网使用量的总体增长
  • 2009 年至 2012 年期间,人均移动电话使用率增长不多;尽管人均互联网使用率几乎一直呈线性增长
  • 人均互联网使用率的增长率远远低于人均移动电话使用率的增长率——这可以从每年的折线图与条形图的位置推断出来。2000 年,线很接近杠顶;而在 2012 年,这条线几乎位于酒吧的中心。

从上面的图表中可以得出许多其他的见解。这就是数据可视化的力量。它的互动性和动态性越强,就越有利于用户从中获得洞察力。

上面两个图表是在 Tableau 中创建的,Tableau 是市场上最先进的数据可视化工具之一。Tableau 帮助我们用简单的拖放方法创建强大的交互式可视化。使用 Tableau,我们将尝试通过将静态图表转换为更具交互性的形式,即通过将它们转换为 gif,将我们的可视化提升到一个新的水平。通过一个简单的播放按钮,用户可以看到所有的条形图和折线图根据时间线移动。我们将举几个例子,了解如何在 Tableau 中创建 gif。

我们将使用标准的 Tableau World Indicators 内置仪表盘作为示例。首先,我们将使用互联网和手机的人均使用数据,并了解如何创建一个 GIF,看看它提供的影响。我们在图 1 和图 2 中看到了两种不同形式的相同数据。要以 GIF 格式显示图表,首先按照标准说明以所需格式创建图表。标准图表可能如下图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,要将标准图像转换成 GIF,你所要做的就是将 Year 字段移动到左上角的 Pages shelf。完成后,你会在右边看到一个页面卡片,上面有一个“播放”按钮。只要点击播放按钮,你就可以制作一个 GIF 了。请看下图中的 pages 卡片。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为,Tableau 的当前版本不提供下载 gif 的灵活性,你将不得不使用第三方工具来录制屏幕。

现在让我们将上面的图片分成三个部分(在不同的年份点),并了解整个 GIF 是如何演变的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图是 GIF 的第一步(年份= 2000)。让我们看看 2005 年的第二步。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来,我们来看一下 Year = 2011 时的图像。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当你按下播放按钮时,图像会一次移动一年。使用右侧的 pages 卡,您可以选择不同的选项,如过渡速度和特定年份。如果您点击“显示历史”旁边的小箭头,将出现如下所示的弹出窗口。使用这个弹出窗口,你可以改变颜色,褪色的酒吧等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此外,如果您不想在图表随年份移动时保留以前的条形,您可以选择“突出显示”选项,而不是“全部”,结果如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,让我们看另一个例子,看看 gif 如何有助于在区域地图上提供一段时间内的指标趋势。我们将使用 Tableau 的内置仪表板——世界指标,但这一次我们将使用不同的数据集——健康指标。

我们将首先为非洲不同国家的平均出生率创建一个静态区域热图。图表如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,将 Year 字段移动到 Pages 窗格,点击 play 按钮,观察不同国家的颜色变化。你会观察到,不同国家的颜色随着平均出生率的变化而变化。阿尔及利亚的情况明显不同。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 2000 年,阿尔及利亚是金黄色的,这表明平均出生率接近 1.1%(看上图中的梯度比例);而在 2012 年,阿尔及利亚的颜色变成了浅绿色,表明平均出生率逐年提高。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后,Tableau 表可以移动到任何 Tableau 仪表板,并在演示文稿中使用。这是 Tableau 提供的一个非常强大的功能,它可以帮助我们以一种非常吸引人和交互的方式呈现数据。

尽管 gif 在创建吸引人的可视化效果方面非常有用,但在使用时还是要小心。它们应该主要用于当你想要呈现一段时间内的变化趋势时,例如:一个国家多年来的 GDP 变化。另一个例子是,如果您想要比较两个或更多国家/地区之间的一个指标,并查看多年来的变化趋势。我们可以在更多的领域看到这种 gif 的应用,你能想到吗?在 Tableau 中创建 gif 时,我们很高兴听到您的观点和经验。

作者简介:

本文由 Perceptive Analytics 供稿。Saneesh Veetil、Sinna Muthiah Meiyappan 和 Chaitanya Sagar 对本文有贡献。

Perceptive Analytics 为电子商务、零售、医疗保健和制药行业提供 Tableau 咨询、数据分析、商业智能和报告服务。我们的客户包括美国和印度的财富 500 强和纽约证券交易所上市公司。

如何利用机器学习来理解社交媒体

原文:https://towardsdatascience.com/how-to-make-sense-of-social-media-using-machine-learning-8a3db1506d03?source=collection_archive---------3-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

社交媒体最初是为个人提供的环境,但品牌很快注意到了个人互动的机会。目前,顶级社交媒体平台也是相关的营销渠道,有时会完全取代电视广告或传单等传统选择。每秒钟,脸书上出现 330 万条新帖子,推特上出现近 50 万条。如果你想记录你的品牌被提及的所有次数,该怎么办?

为了利用社交媒体的力量,创建一个营销计划并相应地分配预算。品牌希望对自己行为的影响、客户的偏好甚至负面评价有清晰的认识。然而,鉴于信息量如此之大,手动操作是不可能的。

克服信息过载

进入机器学习(ML) ,这是一系列算法,使计算机能够识别数据中的模式,并将其分类成簇。这非常适合非结构化数据,因为社交媒体帖子不遵循任何规则。它通常是文本、图像、声音和视频的混合。

这种分析的结果可以给出关于所选用户的可操作的见解。自然语言处理提供了关于社交媒体帖子作者的年龄、性别、位置和偏好的有价值的线索。来自 NLP API 的数据可以帮助基于真实世界的数据而不是统计或有根据的猜测进行客户细分。

为什么要使用机器学习

在社交媒体分析中部署 ML 有几个原因,这是由大数据的 3 比(数量、速度和多样性)决定的。

可攀登的

社交媒体活动的庞大数量需要自动化工具来处理处理活动。即使有专门的社交媒体团队,也不可能跟踪所有渠道和品牌提及。相反,网络抓取工具收集所有可能与品牌相关的帖子,将它们放入一个数据湖中,然后输入到算法中,将它们分割成相关的部分。

文本与语境

搜集阶段依赖于一个关键词,如品牌或产品名称。对于专门的活动,可以使用标签进行搜索,但这仅仅是开始。与为结构化数据设计的简单统计工具相比,使用大数据我们可以实现更多。这些只是统计关键词在对话中出现的次数,并增加更多的过滤级别,如地理位置和性别,而现在我们可以创建图表来显示现有的链接并给出意义。更重要的是不仅要分析焦点词(文本),还要分析它所处的语境。通过 NLP 支持的情感分析,公司可以了解客户对产品的满意程度,以及与积极和消极感觉相关的词语。这类似于人类通过语调相互理解的方式,或者朋友通过即时消息交流的方式。

相关性和权威性

在社交媒体中,识别影响者非常重要,无论他们是个人还是机构,因为他们是网络中的中心节点,与他们建立合作关系可以创造出促进营销的病毒式内容。

斯坦福的一篇文章解释了如何追溯链接,查看每条信息的来源,甚至使用图表跟踪最初帖子的变化。最相关的条目有许多引用,而具有最高权限的内容生成者始终如一地创建相关帖子。

说他们的语言

就在十年前,市场调研是通过调查和焦点小组完成的。机器学习不仅提高了答案的准确性、速度和可靠性,而且它可以结合不同组的预先存在的信息来回答新问题。这有助于在初始测试后缩小选择范围或创建新的行动路线,从而迭代地做出决定。

通过查看社交媒体洞察,营销人员可以了解客户使用产品的新方式,他们购买产品时的感受,甚至新的商业机会。

以前的客户细分技术无法创建用户角色,但现在通过聚类,公司不仅可以发现他们的典型客户是二十出头、受过大学教育和生态学家,而且他们还可以生成听起来像她自己的帖子,达到非常个性化的目标营销水平。

说到语言,由于机器学习算法只是使用了聚类,因此可以用来分析不同的语言,而无需修改底层命令。此外,这些工具非常适合社交媒体分析,在这种环境下,用户有时会混合使用多种语言,尤其是在非英语母语的情况下。例如,文本可以用用户的母语书写,有表情符号,这是通用和流行的英语标签,创建与全球用户联系的更丰富的信息。

电脑不理解

重要的是要明白,计算机处理信息的方式与人类不同,尽管这是人工智能的最终目标。目前,

他们只是创造规则并应用它们,给人以推理的印象。然而,这并不是反对使用机器学习的理由,只是提醒一个程序的能力和一种设定现实预期的方法。

这种限制的可能缺点是,在校准阶段,分析社交媒体帖子需要特别注意,特别是关于元通信,如表情符号和使用讽刺和挖苦。虽然人类可以更容易地发现这一点,但机器可能会将这样的帖子分类到错误的垃圾箱中,并忽略不满意的客户。

从用户到影响者

在社交媒体出现之前,能够影响他人的人数是有限的,通常由电影明星、运动员、医生或专家等高调、高知名度的个人组成。内容创作也仅限于出版社和媒体渠道。通过智能手机民主化,我们每个人都是内容创造者,成为影响者的门槛降低了,因此任何人都可以创建帐户并发表自己的想法。在这种去监管化的环境下,企业不再能控制自己的形象。现在,他们只能观看表演,并确定导致积极市场刺激的行为来鼓励他们。

如何使用 parfit 使 SGD 分类器的性能与逻辑回归一样好

原文:https://towardsdatascience.com/how-to-make-sgd-classifier-perform-as-well-as-logistic-regression-using-parfit-cc10bca2d3c4?source=collection_archive---------1-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于大型数据集,使用 parfit 优化的超参数,我们可以在 LogisticRegression 所用时间的第三分之一内获得与 SGDClassifier 相当的性能。

什么是 SGD 量词?

SGD 分类器使用随机梯度下降实现正则化的线性模型。

那么,什么是随机梯度下降?

随机梯度下降在改变权重时仅考虑 1 个随机点,不同于考虑整个训练数据的梯度下降。因此,在处理大型数据集时,随机梯度下降比梯度下降快得多。Quora 上有一个很好的回答,详细解释了梯度下降和随机梯度下降的区别。

我们已经有了逻辑回归,为什么还要关心 SGD 分类器?

默认情况下,逻辑回归使用梯度下降,因此在较大的数据集上使用 SGD 分类器会更好。你可能想要使用 SGD 分类器的另一个原因是,如果你不能在 RAM 中保存数据集,逻辑回归,在其普通的 sklearn 形式下,将不会工作,但 SGD 仍然会工作。

我们如何让 SGD 分类器表现得和逻辑回归一样好?

默认情况下,SGD 分类器的性能不如逻辑回归。它需要一些超参数调整来完成。

使用par fit**😗*进行超参数优化

Parfit 是一个新的软件包,由我的同事和旧金山大学的 MSAN 学生 Jason Carpenter 编写。该软件包(使用并行处理)允许用户在模型上执行详尽的网格搜索,这使用户能够灵活地指定验证集、评分标准,并可以选择在输入的超参数网格上绘制分数。你可以在媒体上的这篇文章中读到更多关于这个包的信息。

您可能希望使用 parfit 的一个关键原因是,它为您提供了在单独的验证集上评估指标的灵活性,而不像 GridSearchCV 那样使用交叉验证。交叉验证并不是在所有情况下都是好主意。您可能不想使用交叉验证的一个原因是当数据中有时间成分时。例如,在这种情况下,您可能希望使用最近 20%的观察值创建一个验证集。fast.ai 的 Rachel Thomas 写了一篇非常好的博文,关于如何(以及为什么)创建一个好的验证集。

在本文中,我将把验证集的性能作为“模型表现如何”的指标。这里的度量是’ sklearn.metrics.roc_auc_score '。

Logistic 回归拟合:

在这里,我们将使用带有“l2”惩罚的逻辑回归作为我们的基准。对于逻辑回归,我们将调整 1 个超参数 c。

C = 1/λ,其中λ是正则化参数。C 值越小,正则化越强。由于 parfit 并行拟合模型,所以我们可以为 C 提供大范围的参数,而不必太担心寻找最佳模型的开销。

如何使用 parfit:

bestFit 接受以下参数:

  1. 模型:在我们的例子中,输入模型是逻辑回归。请注意,该函数只接受类作为输入,而不接受它的对象。
  2. paramGrid :运行模型的超参数的参数网格对象
  3. X_trainy_trainX_valy_val :训练和验证集
  4. 公制:评估你的模型的公制。
  5. bestScore :返回通过“max”时的最高分。

它不仅返回最佳模型及其最佳分数,还返回所有模型及其所有分数

Hyper Parameter Optimisation for Logistic Regression using parfit

输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

后勤部门花了大约 26 分钟找到最佳模型。这么长的持续时间是为什么使用 SGDClassifier 而不是 LogisticRegression 是个好主意的主要原因之一。对于 C = 0.0001,我们得到的最好的 roc_auc_score 是 0.712。

让我们看看我们的最佳模型 roc_curve:

Code to plot ROC curve

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

AUC curve for Logistic Regression’s best model

SGD 分类器上的部分匹配:

与逻辑回归相同,我们将对 SGD 分类器使用“l2”惩罚。这里需要注意的一个重要的超参数是 n_iter。sklearn 文档中的“n_iter”定义为

通过训练数据的次数(也称为时期)。”

sklearn 中的 n_iter 默认为 None。我们在这里将其设置为足够大的值(1000)。最近添加的 n_iter 的一个替代参数是 max_iter。同样的建议应该适用于 max_iter。

阿尔法超参数有双重用途。它既是一个正则化参数,也是默认时间表下的初始学习率。这意味着,除了正则化逻辑回归系数之外,模型的输出还取决于α和拟合程序执行的历元数(n_iter)之间的相互作用。具体来说,当α变得非常小时,必须增加 n_iter 来补偿缓慢的学习速率。这就是为什么当搜索大范围的α时,指定足够大的 n_iter 更安全(但是更慢),例如 1000。

Hyper Parameter Optimisation for SGD Classifier using parfit

输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

请注意,SGD 分类器只花了 8 分钟就找到了最佳模型,而逻辑回归花了 26 分钟才找到最佳模型。此外,我们在 n_iter = 1000 时运行 SGD 分类器。SGD 分类器在α = 0.1 时给出最佳模型。最佳模型的 roc_auc_score 为 0.712,这与我们从逻辑回归得到的结果相似,精确到小数点后第三位。

现在,让我们看看最佳模型上的 AUC 曲线。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

AUC curve for SGD Classifier’s best model

我们可以看到 AUC 曲线类似于我们在逻辑回归中观察到的曲线。

摘要

就像这样,通过使用 parfit 进行超参数优化,我们能够找到一个 SGD 分类器,它的性能与逻辑回归一样好,但只需要三分之一的时间就可以找到最佳模型。

对于足够大的数据集,最好实现 SGD 分类器而不是 Logistic 分类器,以便在更短的时间内产生相似的结果。

生物: 我目前正在旧金山大学攻读分析(数据科学)硕士学位,并在 Manifold.ai 实习。此前,我曾在惠普企业云部门担任软件存储工程师。

领英:https://www.linkedin.com/in/vpatlolla/

如何让技术资料简洁美观

原文:https://towardsdatascience.com/how-to-make-technical-data-simple-and-beautiful-4724038bb74d?source=collection_archive---------10-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据是任何演示或报告的支撑。它提供了真实的片断,这些片断共同构成了一幅精确的图像。

没有数据,营销人员会根据假设和推测来创建他们的活动,而不是确切地知道他们的客户想要什么。更不用说工程师从一开始就只会建造危险的建筑。甚至消费者也需要数据来知道如何相应地使用他们的新产品。

尽管技术数据无处不在,但它仍被视为冰冷而平淡。以下是一些关于如何通过内容和设计简单而漂亮地传达技术信息的技巧。

相关:关于如何通过数据可视化吸引注意力的专家提示

技术数据需要可视化升级

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有四种学习方式,分别是视觉、听觉、读写和动觉。这意味着我们都以不同的方式理解信息。人们通常有一种主导风格,但他们也需要其他三种风格来吸收新内容的复杂图像。

可视化数据可以结合几乎所有的学习风格,以获得一个全面的方案。T2 1998 年的一项研究发现,人对图像的记忆能力比文字更强。这是因为人们应该一次读一行。另一方面,只要看一眼就能理解图像。作家需要整个页面来描述一个场景。然而,一幅图像可以同时包含所有细节。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

视觉数据不仅仅是图像。它是关于找到一种方法来连接两个在文本中看起来不相关的元素。一旦信息被清楚地分类,视觉元素就可以进来表示内容。一旦他们每个人都有了自己的形式,与他们一起工作就很容易了。

数据解释器可以创建真实的场景,并使用地理定位来找到两个看似陌生的元素之间的联系。地理方位将使你能够找到两点之间的联系,就像人们在几何学中所做的那样。文本不能给你一个空间的解释,数据可以隐藏在背景后面。

例如,架构师使用数据可视化为每个真实元素分配一个可视化的解释。他们画了一条线来代替“墙”这个词。他们没有用“窗户”这个词,而是在墙上画了第二条线。每个元素在设计领域都有自己的诠释,并成为一种符号。

通过将复杂的图像简化为简单的线和点,建筑师可以很容易地发现某些联系。因此,建筑师的工作不仅需要设计技能,还需要广泛的解决问题的能力,我们都知道建筑师的收入。

如何交流技术信息

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

人们通过同化来学习。我们把一个完全未知的概念放在它在这个世界上的正确位置。我们需要理解它的意义以及它与我们已知的事物和概念的关系。例如,当我们学习一门新的语言时,我们将每个单词与现实中的物体或现象同化。

我们的课程越简洁明了,我们学得就越快。我们的人性要求我们在未知背后找到一个逻辑或理由。因此,史前时代把打雷或下雨之类的奇怪自然现象的原因,找到了神的力量。我们都知道这些影响的背后是科学,我们也知道了它与天气的联系。

因此,为了创建易于理解的技术数据表示,我们需要结构。新信息必须符合逻辑。如果没有这个组织,就只会有一些随机的数字和短语。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了简化,您的技术数据需要组织。人们需要一个逻辑的开头、中间和结尾来理解和掌握新的概念。因此,任何清晰的视觉数据都应该尊重五个逻辑结构之一:

  • 位置;
  • 字母表;
  • 年表;
  • 类别;
  • 等级制度。

如果没有这些结构,将会有大量紧凑的无限数据。这个世界运行在复杂的规则和方程上,一个人的一生不足以掌握所有的规则和方程。

但是人们不需要知道所有的事情。通过在逻辑结构中构建一个精确的主题,你向他们感兴趣的主题传递了意义。

如何化简单为有效

简单性和结构本身不足以支持有效的视觉数据。他们需要一个共同目标的帮助。报告的目的是什么?数据为什么问题提供了解决方案?因此,任何技术内容都应致力于以下一个或几个功能:

  • 以可视结构显示数据;
  • 把平面设计仅仅作为达到目的的一种手段,以及理解数据实质的一种手段;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 避免在普通文本中不恰当的短语组合后出现的曲解;当你使用数据而不是文本时,你回避了可能导致多种解释的单词的上下文性质;
  • 提供大量与图形主题相关的重要数字;
  • 为大型数据集提供清晰度;
  • 使用户能够在图形或数字元素之间进行比较;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 激活几个层次的概述,从一个领域的广泛描述到深入的部分;
  • 尊重以下简明目的之一:
  • 装饰(用令人愉快的设计来组织数据,使其更容易消化);
  • 制表(将数据分类成表格形式);
  • 描述(概述数据的背景和来源)或探索(根据收集的数据形成分析的行为;
  • 将统计数据和文字描述整合到图形中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据可视化的类型

既然我们已经介绍了简单性在交流技术信息中的重要性,那么是时候将数据可视化集成到设计精美的图形中了。有许多方法可以赋予数据视觉元素和意义。下面是一个复杂的可视化类型列表,可以用逻辑和精确的图形来组织数据。

1.1D/线性

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这种一维结构可以由我们所知道的物品清单来定义。虽然这是最常用的视觉类型,但它确实缺乏深度。观看者无法执行逻辑关联,其项目之间的联系隐藏在多维主体的缺失之后。

2.2D /平面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是一种综合类型的图形,依赖于地理解释。它的主要目的是综合描述真实区域(如国家、城市或社区)的数据。有几种方法可以释放平面可视化的潜力,甚至可以产生交互式地图

  • 这是一张以颜色或图案分类的地图。它的目标是提供一个总体视图,显示某个特征(如人口密度)在不同地区之间的差异。
  • **图表:**这种类型的地图用土地面积或距离代替某些变量。例如,可以改变地区的大小,以显示与其他地区相比有多少公民。
  • **点分布图:**这种地图表示使用点来表示特定区域内特定因素的存在。一个点代表数据记录的现象的位置。因此,观察某一代理人在整个国家的影响是很方便的。
  • **比例符号图:**与图表样式一样,比例符号的任务是在地图上的精确位置显示现象的正确表示。这些符号可以根据它们的数量改变它们的大小。
  • **等高线图:**这是一种用不同函数的曲线来表示数据的地图。

3.三维/立体

这种类型的可视化为提供了广泛的方法来表示三维记录的数据,三维是长度、宽度和高度。

这是完美的可视化风格,使观众能够理解空间中的联系。很容易找到独特的角度和数据元素的组合,否则在 2D 或 1D 的表现中看不到。

4.暂时的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • **时间线:**时间线尊重年代规律。数据的逻辑发展尊重时间线,使观众能够理解数据的演变。
  • **时间序列:**这是一个可视化列表,其中数据元素在时间或空间维度上接收它们自己的点。通过将它们之间的点按时间顺序连接起来,你就获得了一个描绘某个领域起伏的图形。基于时间序列,专家有足够的数据来准确预测该领域的未来。
  • **甘特图:**其实就是一个关注项目进度的条形图。有一个预先确定的时间段,在该时间段中,由图形表示的工作活动出现在它们发生的精确时刻。甘特图用于记录项目管理的有效性以及其他有用的功能。
  • **流图:**流图有一个中轴,通常是时间线。在这个轴上流动的是某个领域中记录的一些变量。最受欢迎的流图之一是《纽约时报》制作的,用来比较电影票房收入。
  • **桑基图:**数据用箭头表示,根据其影响程度改变大小。
  • **冲积图:**这种可视化技术以时间轴为轴,用水平线根据一个系统的发展历史来改变它们的轨迹。

5.多维的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最复杂的数据可视化提供了最全面的解决方案。很难在多维领域保持相关性。然而,最终结果将把复杂的结构变成简单的图形。

从这里开始,将它们之间的元素联系起来并理解它们如何作为一个整体一起工作就变得非常简单了。

  • **饼状图:**这是一个圆形,有多个切片。每一段代表一个变量。该图简化了几个数值因子之间的定量比例。
  • **直方图:**描述了概率分布的估计。有两个轴通常代表时间和数量。
  • **标签云:**用于突出关键词元数据。这些单位随机显示。它们的规模越大,就越重要。
  • **泡泡云:**酷似标签云。然而,在这种情况下,每个术语都有自己的气泡。但它们的重要性仍由泡沫的大小来衡量。
  • **树形图:**遵循层次规则。每个元素接收自己的矩形,矩形可以有自己的更小的矩形作为子分支。在树状图中,创作者可以使用颜色来标记几个分支之间的某种相似之处。矩形的大小象征着它的尺寸或相对于其他的成功。
  • **散点图:**使用笛卡儿坐标,根据变量的值将它们放置在正确的位置。最终结果看起来像是代表数据的图形表示的点的集合。
  • **面积图:**表示定量数据的逼真图形。使用这种类型,您可以比较几个折线图来衡量它们之间的差异。商务人士用它们来记录某个领域最流行的趋势。
  • **热图:**这是一个矩阵,其中的变量有特定的颜色。颜色编码很精确。例如,红色表示高活动,而黄色表示较低的记录。
  • **平行坐标:**这种可视化技术采用高维几何,通过依赖于几条垂直线的平行线来表示数据。人们将它们用于空中交通管制、数据挖掘、计算机视觉和优化。

总而言之,技术数据的有效性取决于简单性和可视化表示。简单意味着以某种方式组织数据,使其服务于一个单一的目标。

美感和视觉表现对鼓励观众理解数字和其他记录所描述的系统至关重要。一旦用户接受了某个主题的教育,数据就完全达到了目的。

轮到你了

如果你想知道是否需要高级专业知识——甚至是数据科学学位——来创建这些类型的数据可视化,也有大量针对初学者的易于使用的信息设计工具可以帮助你在几分钟内创建交互式图表、图形和信息图。

您可以尝试的一个选项是 Visme,这是一个一体化的可视化内容创建工具。 点击这里 免费试用。

如果你有任何关于如何向非技术受众传达技术信息的信息设计技巧和建议,请在下面的评论区给我们留言。

本帖 原版 最早出现在 Visme 的 视觉学习中心

如何用 Python 制作 Windows 10 吐司通知

原文:https://towardsdatascience.com/how-to-make-windows-10-toast-notifications-with-python-fb3c27ae45b9?source=collection_archive---------1-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Sample Toast Notification

Python!!那是什么?

Python 是一门漂亮的编程语言。它拥有你可能需要的一切。它有一个易于使用的软件包管理器,可以帮助我们建立网络应用程序,桌面应用程序,网络应用程序和基于数据的应用程序。

如果你正在寻找 2018 年学习 Python 的理由,请阅读这篇 Stack Overflow 博文。

[## Python |堆栈溢出的惊人增长

我们最近探讨了富裕国家(被世界银行定义为高收入的国家)如何倾向于访问不同的…

stackoverflow.blog](https://stackoverflow.blog/2017/09/06/incredible-growth-python/) 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

win10toast

作为一名机器学习工程师,我在开源社区消费了很多才华横溢的人构建的包。我很高兴能回馈给这个了不起的社区一个小包裹。

在我的工作中,我习惯于运行需要几个小时的神经网络,所以我会一边看电影一边等它结束。我想有一种简单的方法在脚本运行结束时得到通知,而不是打断我的电影并检查进度。所以我创建了一个包来给我发送 Toast 通知😃

如何入门?

该软件包已经在 Pypi 中发布,可以很容易地与 pip 一起安装。

pip install win10toast

一旦安装完成,你可以尝试一个简单的通知。

from win10toast import ToastNotifier
toaster = ToastNotifier()
toaster.show_toast("Sample Notification","Python is awesome!!!")

有关高级使用说明,请参考文档

如果你喜欢这个包,或者对扩展的源代码感兴趣,请访问我的 GitHub 库。

[## jithurjacob/Windows-10-Toast-通知

显示 Windows 10 Toast 通知的 Python 库

github.com](https://github.com/jithurjacob/Windows-10-Toast-Notifications)

记得给本帖一些👏如果你喜欢的话。关注我了解更多内容:)

我以前的帖子

[## 如何用 VS 代码和 Jupyter 笔记本改善你的工作流程

增强您的数据科学工作流程。Jupyter 笔记本+ VS 代码=💘

towardsdatascience.com](/how-to-improve-your-workflow-with-vs-code-and-jupyter-notebook-f96777f8f1bd)

如何让你的软件开发体验…没有痛苦…

原文:https://towardsdatascience.com/how-to-make-your-software-development-experience-painless-2591ebcc69b6?source=collection_archive---------4-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在各种形式的组织中工作(从面向大型软件开发的小型初创企业到学术实验室),我注意到人们倾向于让自己的生活比实际需要的更艰难。因此,我将利用这篇文章来解释如何让你的软件开发经历不那么痛苦。

作业调度器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果它简单、乏味且令人讨厌地重复,那么你可以自动完成它。如果你是一个 Unix 用户(像大多数程序员一样…我讨厌 Windows…),你将可以访问 cron 作业。cron 软件实用程序是一个基于时间的作业调度程序,在类似 Unix 的计算机操作系统中。建立和维护软件环境的人使用 cron 来安排作业在固定的时间、日期或间隔定期运行。学习 Unix crontab 命令。

自动化测试

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果你一个人或者团队中的多个成员独立地开发同一个代码库,很可能有人会在代码中引入某种形式的 bug。通常的程序是花几个小时追踪整个代码中的微小错误,同时以胎儿的姿势哭泣(如果你还没有哭够,那么你可能不是一个真正的程序员)。就自动化测试而言,有很多选择。单元测试非常普遍。JUnit 面向 Java 用户,而非 ittest 库面向 Python 开发者。然而,在将代码投入生产之前,有些人可能会忘记在团队中正确运行单元测试。为了避免这样的灾难,自动化测试是很重要的。虽然你可以使用 crontab 来运行自动化测试,但我会推荐使用更专业的工具,比如 Jenkins 。Jenkins 允许你安排测试,从版本控制库中挑选特定的分支,如果有问题就发邮件给你,如果你想用沙箱保护你的测试,甚至可以旋转容器图像。

集装箱

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

沙盒是编码的重要组成部分。这可能涉及到为各种应用程序提供不同的环境。它可以简单地将生产环境复制到开发中。这甚至意味着拥有多个不同软件版本的生产环境,以迎合更大的客户群。如果您想到的最佳方法是使用带有虚拟箱的虚拟机,我相信您已经注意到,您要么需要使用完全相同的虚拟机进行多轮测试(糟糕的 DevOps 卫生状况),要么为每次测试重新创建一个干净的虚拟机(根据您的需要,这可能需要近一个小时)。一种更简单的替代方法是在虚拟机上使用容器而不是完整容器。容器只是一个 unix 进程或线程,看起来、闻起来和感觉起来都像 VM。它的优势在于低功耗和低内存消耗(这意味着你可以在几分钟内随意启动或关闭它)。流行的容器化技术包括 Docker (如果你希望只使用一个容器)或 Kubernetes (如果你喜欢为多服务器工作流编排多个容器)。

版本控制

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

想象一下将您的代码推向生产。而且很管用!完美。没有抱怨。随着时间的推移,您会不断添加新功能并开发它。然而,这些特性中的一个给你的代码引入了一个错误,严重扰乱了生产应用程序。您希望您的许多单元测试中的一个能够发现它。然而,仅仅因为一些东西通过了你所有的测试并不意味着它没有错误。这只是意味着它通过了当前编写的所有测试。因为这是生产级代码,所以你没有时间去调试。时间就是金钱,你有愤怒的客户。回到代码工作的时候不是很简单吗???这就是版本控制的用武之地。在敏捷风格的代码开发中,产品在一个不确定的时间周期内保持零碎的开发。对于这样的应用程序,某种形式的版本控制将非常有用。我个人喜欢 Git ,但是 SVN 用户依然存在。Git 可以在所有形式的平台上工作,如 GitHubGitLabBitBucket (每种平台都有自己独特的优缺点)。如果你已经熟悉了 git,可以考虑在 Atlassian 上学习更高级的 Git 教程。我推荐查找的一个高级特性是 Git 子模块,在这里您可以存储多个独立 Git 存储库的特定提交散列,以确保您可以访问一组稳定的依赖项。

设计模式和代码味道

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当人们开始自学程序员时,很多时候我们想的是创建一个简单的应用程序。成功了,完美!下一个受害者!然而,一旦我们试图扩大规模,各种各样的随机问题就开始出现。糟糕的编码实践,缺乏文档和紧密耦合。为了开发一个更加灵活、可重用和可维护的代码库,理解设计模式和代码味道的基础是很重要的。我强烈推荐阅读的一本书是由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 撰写的《设计模式:可重用面向对象软件的元素》。SourceMaking.com 的也是一个非常好的参考网站,提供了 Python、Java 和 c 语言的例子。我已经在以前的博客中提到过一些例子:软件开发设计原则

评论

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后,防止软件开发过程失控的最显而易见的方法是拥有某种程度的文档。虽然拥有多个包含每个微小功能的详细文档并随着代码的发展而更新它们的 pdf 文件是很好的,但这很可能是不实际的。在高节奏和高压力的软件开发环境中,即使是最自律的开发人员也会面临某种程度的不幸。记录代码的最佳方式是在脚本中添加注释。当人们开发脚本时,评论会发生变化。不同的编程语言有特殊的注释规则。作为一名 Python 程序员,我非常依赖 PEP8 。评论很重要的一点是,它应该是显而易见的。如果你需要大量的注释来解释一段简单的代码,很可能你的代码写得不好(一种很常见的代码味道)。把评论当成讲笑话。如果需要解释,不会让任何人发笑。

如何掌握新技能

原文:https://towardsdatascience.com/how-to-master-new-skills-656d42d0e09c?source=collection_archive---------4-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为什么尽量避免电子表格是学习数据科学的最佳方式

学习新技能的最好方法是用它来解决问题。在我以前作为一名航空航天工程学生的生活中,我花了几个小时在 Excel 中编写复杂的公式来做从设计机翼到计算航天器再入角度的一切事情。经过几个小时的努力,我会用平淡无奇的 Excel 图表来展示结果,这些图表主宰了许多幻灯片。确信这不是一个最佳的工作流程,我决定学习 Python,一种常见的编码语言,仅仅是为了避免把我醒着的时间都花在 Excel 上。

在 Al Sweigart 的 的帮助下,用 Python 自动处理枯燥的东西,我学会了足够多的语言,将我在 Excel 中花费的时间减少了 90%。我没有记忆基础知识,而是专注于有效地解决航空航天问题。我很快就完成了作业,当我在课堂上展示 Python 图形时,有人问我使用了哪种神奇的技术。甚至不用尝试,我就获得了一个能把混乱的电子表格转换成清晰图像的人的名声。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The difference between data (left) and knowledge (right)

具有讽刺意味的是,只有当我达到我所在领域的顶峰时,我才决定转向数据科学。当我在美国国家航空航天局做航天工程师实习生时,我周围都是这个国家最聪明的人。然而,这些人的才华受到了严重限制,因为他们最终花了大部分时间钻研现代数据的诅咒:Excel 电子表格。这些人致力于扩展人类对宇宙的知识,实际上是在电子表格中做火箭科学!就在那一刻,我意识到,作为一名帮助人们从数据中理解事物的数据科学家,我会比作为一名航空航天工程师产生更大的影响。

尽管我当时正在执行一项任务,将一颗卫星送入太空(近地小行星侦察任务),但我对这项工作感到沮丧,因为它主要涉及数小时的翻阅数字。通常,这些电子表格已经使用多年,人们相信这些数字,尽管不能理解这些公式。我最终放弃了试图理解电子表格,而是开始使用我所知道的一点点 Python 来自动计算。基于我在学校试图逃离电子表格时获得的有限知识,并使用我从 Stack Overflow 复制和粘贴的一些代码,我能够提高我的工作效率和质量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Not pictured: the millions of lines of Excel behind the ISS

我试探性地向同事们提到有一种更好的方法来完成他们的工作。尽管他们持怀疑态度,但他们已经看到了我的成果,并愿意倾听。在向他们展示了一些我编写简单代码来代替手工编辑电子表格的例子后,他们开始接受这个想法。起初,我为他们编写脚本,这是一项我很乐意承担的任务,因为几行代码就大大减少了我的工作量,但最终他们能够开始编写自己的脚本了。(虽然我确实说服了他们写代码,但几乎都是用 Matlab 甚至 Fortran。有些事情你就是改变不了!)在几周的时间里,我从一名卑微的实习生变成了我所在部门的首席数据顾问。

这个真实的应用程序说明了两个关键点:

  • 新技能是从解决问题中学习的,而不是从理论中学习的
  • 不需要多少知识就能达到有用的结果

与传统的教育模式相反,我们首先开发应用,然后形成理论,而不是相反。内燃机是历史上最有影响力的技术之一,它是由工程师而不是理论家几十年的修补成果。只有在发动机被发明出来之后,发动机工作原理的理论才变得清晰起来。我学习编程和数据科学不是靠记忆数据结构和公式的细节,而是靠写代码解决问题。一路上,我学到了很多本可以在书上读到的基础知识。现在当我学习一种新的机器学习方法时,我会直接将其用于真实数据,而不是研究公式。通过实际操作而不是在页面上看到模型,我可以更好地理解模型是如何工作的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Theory vs Application. Only one actually flies.

人们通常认为他们需要成为某个领域的专家才能做出贡献。这使得他们甚至无法开始学习一项新技术,因为他们认为这项技术需要几年才能派上用场。我在 NASA 的经历为这种误解提供了一个反例。数量有限的正确知识,在这种情况下是数据科学,可能非常有影响力。我没有等到对编码了如指掌,而是应用了我所知道的,并取得了有益的结果。

罗马不是一天建成的,这句老话意味着大型项目需要多年的努力。然而,这里有一个更重要的信息:一个完整的城市不需要在有用之前就建成。即使只有几户人家,一个城市仍然有它的用途。半个罗马比没有罗马好,正如有些知识比没有知识好。每一栋新房子或每一个额外的知识都会在积极的反馈循环中激发更多的成长。关键是在学习过程中不断解决问题,而不是等到掌握了一门学科才使用!

这些想法应该鼓励任何想学习新技能或转换领域的人。如果你认为学习一门技术需要太长时间,或者你对基础感到厌烦,不要担心!简单的东西是乏味的,你最好通过解决问题和学习过程中的基本原理来学习。此外,意识到你可以用有限的正确知识获得有用的结果。解决一些基本问题,并在复杂性增加时根据需要提高技能。

因为我们已经使用了一个陈词滥调,这里有另一个:“种树的最佳时间是 20 年前。第二好的时间是今天。”不要后悔在学校时没有学习编程——或者任何技能——而是想想你将来想知道什么!找出你(或你的同事)需要解决的问题,并开始学习。现在回过头来看,我的数据科学之路并不是一帆风顺的规划出来的,而是通过解决问题,稳步获取工具而进化出来的。现在是自学的最好时机,扩展你技能的最好方法就是开始解决问题!

一如既往,我欢迎反馈和建设性的批评。可以通过 Twitter @koehrsen_will 找到我。

我要感谢 Taylor Koehrsen (PharmD no less!)对她的编辑帮助。

如何从 tf.contrib.learn 估计器过渡到核心 Tensorflow tf?估计量

原文:https://towardsdatascience.com/how-to-move-from-tf-contrib-learn-estimator-to-core-tensorflow-tf-estimator-af07b2d21f34?source=collection_archive---------4-----------------------

我有一堆使用“原始”估计器 API 构建的机器学习模型,在 tf.contrib.learn 中的那个。在 Tensorflow 1.2 中,它的一部分被移到了 core,在 Tensorflow 1.4 中,我需要的剩余部分最终到达了 core Tensorflow。所以,是时候开始迁移到核心评估 API 了。

当 Tensorflow 团队将代码从 contrib 转移到 core 时,他们趁机清理 API。另一种方法是在 contrib 接受之前对所有东西进行昂贵的代码审查,而不仅仅是证明有用的东西。那会减缓创新…

在任何情况下,如果我们发现 contrib 中的一个实验包是有用的,我们应该准备好花一点时间和精力将我们的代码迁移到核心。这通常不仅仅是将包名(例如)从 tf.contrib.learn.Estimator 改为 tf。估计者又收工了。

让我们分四个部分来看看从 tf.contrib.learn 到 tf.estimator 的过程:

  1. 如果您正在将一个固定的估计器(例如,tf.contrib.learn.DNNClassifier)移动到 tf。估计器. dnn 分类器)
  2. 如果您正在移动一个定制的估计器(例如,如果您做了一些类似于我在文本卷积时间序列预测上的博文,因此需要从 tf.contrib.Estimator(model_fn)更改为 tf。估计器(model_fn)。
  3. 如何从代码中移除 tf.contrib.learn.Experiment 和 learn_runner?
  4. 对您的云 ML 引擎脚本的更改

没有变化就不可能有进步

哇哦。变化真大!考虑到这里的巨大变化,你将来使用 contrib 中的类的可能性有多大?你是否认为你宁愿等待尘埃落定,并在它们进入核心后使用它们?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当然,如果你想要一个稳定的 API,你应该坚持使用核心 Tensorflow 中的东西。但是我想你和我一样,相信萧伯纳的格言:不改变就不可能进步,你决定使用 contrib,因为你知道你将来必须做出一些改变。

不过,一切都完了,是时候付出代价了!让我们一个一个地看一下这些变化。

如何移动固定估计量

对固定估计量的更改主要涉及特性列。走这几行:

import tensorflow.contrib.layers as layers
is_male = layers.sparse_column_with_keys('is_male', 
                            keys=['True', 'False'])
age = layers.real_valued_column('mother_age')b_age = layers.bucketized_column(age, np.arange(15,45,1).tolist())crossed = layers.crossed_column([b_age, ...], 200)
embed = layers.embedding_column(crossed, 3)

功能列包和方法名称已更改。以下是替代产品的外观:

import tensorflow.feature_column as fc
is_male = fc.categorical_column_with_vocabulary_list('is_male',                       
                             ['True', 'False'])
age = fc.numeric_column('mother_age')b_age = fc.bucketized_column(age,
                        boundaries=np.arange(15,45,1).tolist())crossed = fc.crossed_column([b_age, ...], 
                        hash_bucket_size=200)
embed = fc.embedding_column(crossed, 3)

在不熟悉这些术语的情况下,关于特性列的 Tensorflow 文档非常有用。改变后的方法名(分类的代替了稀疏的,数字的代替了实数的)得到了字段的特征而不是它们的表示,新的 API 有了更多的灵活性。

一旦您有了特性列,创建评估器仍然是一样的。例如,改变,

tf.contrib.learn.DNNLinearCombinedRegressor

收件人:

tf.estimator.DNNLinearCombinedRegressor

你完了。

但是,您还应该收紧您的服务输入 fn(例如,Tensorflow 将使用这个函数来解析接收到的 JSON,并将其输入到您的模型中)。你可能会有这样的想法:

return tf.contrib.learn.utils.input_fn_utils.InputFnOps(
     features,
     None,
     feature_placeholders)

现在,它将变成:

return tf.estimator.export.ServingInputReceiver(
           features, 
           feature_placeholders)

实际上,没有人需要的第二个参数已经去了它的休息处。

如何移动自定义评估员

在向核心迁移的过程中,定制估算器变得更加灵活和强大。

在您的自定义估算器中,您曾经有一个这样定义的模型函数:

def cnn_model(features, target, mode):
   # stuff ... return tf.contrib.learn.ModelFnOps(
      mode=mode,
      predictions=predictions_dict,
      loss=loss,
      train_op=train_op)

这现在变成了:

def cnn_model(features, labels, mode, params):
    # STUFF if mode == tf.estimator.ModeKeys.TRAIN or mode == tf.estimator.ModeKeys.EVAL:
       eval_metrics = {'acc': tf.metrics.accuracy(tf.argmax(logits,1), labels)}
    else:
       eval_metrics = None   return tf.estimator.EstimatorSpec(
      mode=mode,
      predictions=predictions_dict,
      loss=loss,
      train_op=train_op,
      eval_metric_ops=eval_metrics,
      export_outputs={'classes': tf.estimator.export.PredictOutput(predictions_dict)}
    )

让我们打开它。这些是关键的变化:

  1. 请注意,您现在获得了一个额外的参数。您可以使用它向您的模型传递一个额外的字典。当您使用 Cloud ML 引擎并且想要超参数调整模型参数时,这非常方便。稍后会有更多内容。
  2. 以前是 TF . contrib . learn . mode keys . train 之类的模式现在是 tf.estimator.ModeKeys.TRAIN,这里没什么大不了的。它们映射到的数字还是一样的,所以即使你不改变代码,也不会发生什么疯狂的事情。但是最好清理一下,用核心包。
  3. 你现在返回一个 tf.estimator.EstimatorSpec,而不是返回一个 tf.contrib.learn.ModelFnOps,但是 EstimatorSpec 有一些新的功能。具体来说,您现在可以指定要评估的指标列表。EstimatorSpec 还提供了导出预测字典的不同部分的能力。

模型函数本身被传递到一个估计器中,如下所示:

tf.contrib.learn.Estimator(model_fn=cnn_model,
            model_dir=output_dir),

相反,您将像这样传递它:

training_config=tf.estimator.RunConfig(save_checkpoints_steps=1000)
hparams = parser.parse_args().__dict__tf.estimator.Estimator(model_fn=cnn_model,                                  
    model_dir=output_dir,                               
    config=training_config,                               
    params=hparams),

请注意,我将命令行参数作为 params 传入。这就是上面 cnn_model()的第四个参数——在 Cloud ML Engine 中,这个传递允许我对模型进行超参数调整。

摆脱实验

实验,原谅我的双关语,是一个失败的实验。替换核心 Tensorflow 功能是使用 tf。Estimator.train_and_evaluate()。

您可能有这样的设置:

def make_experiment_fn(output_dir):
  def experiment_fn(output_dir):
     wide, deep = get_wide_deep()
     return tf.contrib.learn.Experiment(
          estimator,    
        train_input_fn=read_dataset('train'),
        eval_input_fn=read_dataset('eval'),
        eval_metrics={
            'rmse': tf.contrib.learn.MetricSpec(
                metric_fn=metrics.streaming_root_mean_squared_error
            )
        },
        train_input_fn=read_dataset('train', PATTERN),
        eval_input_fn=read_dataset('eval', PATTERN),
        export_strategies=[saved_model_export_utils.make_export_strategy(
             serving_input_fn,
             default_output_alternative_key=None,
             exports_to_keep=1
         )],
        train_steps=TRAIN_STEPS
     )
   return experiment_fnlearn_runner.run(make_experiment_fn, output_dir)

这将变成:

train_spec=tf.estimator.TrainSpec(
                         input_fn=read_dataset('train', PATTERN),
                         max_steps=TRAIN_STEPS)
exporter = tf.estimator.LatestExporter('exporter',serving_input_fn)
eval_spec=tf.estimator.EvalSpec(
                         input_fn=read_dataset('eval', PATTERN),
                         steps=None,
                         exporters=exporter)
tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)

本质上,以前调用 learn_runner.run()的地方,现在调用 TF . estimator . train _ and _ evaluate()。您向它传递了 estimator 和 train_spec,它们封装了有关您的训练数据的细节,还传递了 eval_spec,它们对您的评估数据执行相同的操作。导出发生在评估期间,因此您在那里指定您的导出器(LatestExporter 或 FinalExporter)。

请注意,在实验中,您曾经指定 eval_metrics,但是它已经被移到 EstimatorSpec 中(参见上一节,关于定制估计器)。我不清楚如果你使用一个固定的评估器,你如何获得额外的评估指标…幸运的是,我还没有遇到这种需求。

对您的云 ML 引擎脚本的更改

你必须对你的开发环境做什么改变?

嗯,云数据实验室现在带有 Tensorflow 1.4,所以只需启动一个新的实例,并在其中运行您的笔记本电脑。不需要其他更改。

在提交培训作业的 gcloud 命令中,指定 runtime _ version 1.4 而不是 1.2。所以改变:

gcloud ml-engine jobs submit training $JOBNAME \
   ...
   --runtime-version 1.2 \
   ...

收件人:

gcloud ml-engine jobs submit training $JOBNAME \
   ...
   --runtime-version 1.4 \
   ...

contrib 中的 saved_model_export_utils 用于将导出的模型写入名为 Servo 的目录中。嗯,Servo 是构建 Tensorflow 服务的 Google 项目的内部项目代号…该目录现在被称为“exporter”而不是“Servo”。据推测,这是为了防止另一个团队出现并构建更好的东西。因此,如果你有一个脚本:

MODEL_LOCATION=$(gsutil ls gs://${BUCKET}/babyweight/trained_model/export/Servo/ | tail -1)

您将把它改为:

MODEL_LOCATION=$(gsutil ls gs://${BUCKET}/babyweight/trained_model/export/exporter/ | tail -1)

当您部署模型时,请确保指定 Tensorflow 运行时版本:

gcloud ml-engine versions create ${MODEL_VERSION} --model ${MODEL_NAME} --origin ${MODEL_LOCATION} --runtime-version 1.4

其他一切都保持不变。

编码快乐!

如何归一化 TensorFlow 中的特征

原文:https://towardsdatascience.com/how-to-normalize-features-in-tensorflow-5b7b0e3a4177?source=collection_archive---------3-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Karsten Würth (@inf1783) on Unsplash

TL;DR 使用 *tf.estimator* 时,使用 *tf.feature_column.numeric_feature* 中的 *normalizer_fn* 参数,使用相同的参数(均值、标准差等)进行归一化。)进行培训、评估和服务。

def zscore(col):
  mean = 3.04
  std = 1.2
  return (col — mean)/stdfeature_name = ‘total_bedrooms’
normalized_feature = tf.feature_column.numeric_column(
  feature_name,
  normalizer_fn=zscore)

归一化为

神经网络激活通常喜欢它们的输入被标准化。将网络中节点的输入标准化有助于防止所谓的消失(和爆炸)梯度。批量规范化是最全面的规范化方法,但是它会产生额外的成本,并且对于您的问题来说可能是多余的。因此,您可能只想规范化您的输入。

使用tf.estimator API(这是构建 TensorFlow 模型最简单的方法)时,有两种规范化输入的方法:在input_fn内部和创建feature_column时。我将向您展示一个执行阶梯的示例,然后我将向您展示如何使用 ML 引擎训练多个模型。

样板代码:使用 normalizer_fn 参数进行规范化

查看这款笔记本的完整工作示例。

规范化 input_fn 中的允许更大的灵活性(您也可以在这里执行特征工程),但是我发现将normalizer_fntf.feature_column.numeric_column一起使用更优雅。下面是一个基本的例子:

*def zscore(col):
  mean = 3.04
  std = 1.2
  return (col — mean)/std**feature_name = ‘total_bedrooms’
normalized_feature = tf.feature_column.numeric_column(
  feature_name,
  normalizer_fn=zscore)*

下面,我将展示一个端到端的例子,以获取规范化参数,然后规范化我的数据集中的所有数值列。

您应该提前计算训练集的规范化参数。在本例中,我使用 Pandas 来获取每个数字列的平均值和标准差:

或者, TensorFlow Transform 提供了一种标准化输入的可扩展方法,特别适用于大型数据集。查看这里的中的例子。

运行上面的代码后,我们返回每一列的参数:

{‘households’: {‘mean’: 501.34073416222617, ‘std’: 382.81658748493305},
‘housing_median_age’: {‘mean’: 28.5441089402013, ‘std’: 12.610144469735635},
‘median_income’: {‘mean’: 3.8814239564831365, ‘std’: 1.9061255708184284},
‘population’: {‘mean’: 1428.941163410302, ‘std’: 1150.5106244960523},
‘total_bedrooms’: {‘mean’: 539.6057578448787, ‘std’: 418.76075045523334},
‘total_rooms’: {‘mean’: 2642.2929988158676, ‘std’: 2162.649970020439}}

现在,您可以使用上面计算的训练平均值和标准偏差来创建特征列。

NUMERIC_FEATURES = [‘housing_median_age’, ‘total_rooms’, ‘total_bedrooms’, ‘population’, ‘households’, ‘median_income’]feature_columns = create_feature_cols(NUMERIC_FEATURES, use_normalization=True)

最后,您可以使用特性列构建评估器:

model = tf.estimator.DNNRegressor(hidden_units=[10,4], 
                                  model_dir = outdir,
                                  feature_columns = feature_columns)

使用 ML 引擎在云中训练多个模型

归一化是一个超参数,在实践中,评估不同的归一化方案将是有用的。例如,您可能想尝试训练一个模型,只对您的要素进行归一化,并将其与使用批量归一化对隐藏图层的输入进行归一化进行比较。

您可以使用云 ML 引擎并行启动多个实验。这对于较大的数据集尤其有价值,在这种情况下,您希望利用云来扩展模型训练。使用 ML 引擎训练,需要将模型代码打包,创建 task.py 和 model.py 模型文件。参见回购的示例。

最佳实践是首先在本地测试模型包,以确保没有语法或语义错误:

OUTPUT_DIR=’trained_model’
export PYTHONPATH=${PYTHONPATH}:${PWD}/model_code
python -m trainer.task — outdir $OUTPUT_DIR — normalize_input 1

之后,您可以使用“g cloud ML-引擎作业提交培训”向 ML 引擎提交作业:

JOBNAME=my_ml_job_$(date -u +%y%m%d_%H%M%S)
REGION=’us-central1'
BUCKET=’gs://crawles-sandbox’
OUTPUT_DIR=$BUCKET/’housing_trained_model’
PACKAGE_PATH=$PWD/model_code/trainergcloud ml-engine jobs submit training $JOBNAME \
  -- package-path=$PACKAGE_PATH \
  -- module-name=trainer.task \
  -- region=$REGION \
  --staging-bucket=$BUCKET\
  -- scale-tier=BASIC \
  -- runtime-version=1.8 \
  -- \
  -- outdir=$OUTPUT_DIR\
  -- normalize_input=0

在我的例子中,我在训练时计算和不计算特征的 z 值:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如预期的那样,规范化输入提高了最终模型的性能。

就是这样!如果你觉得这篇文章有帮助,请给它一个掌声,这样其他人就可以找到它。

其他资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值