我的隔离项目:使用 Tensorflow 的实时面罩检测器
检疫项目
在新冠肺炎封锁的最初几天,我决定做一些与疫情有关的项目,这些项目可能会变得有用。有很多伟大的项目使用了疫情的数据,所以我想专注于一些独特的东西。
随着该国开始经历重新开放的各个阶段,口罩已经成为我们日常生活中的一个重要元素,并将继续存在。为了社交或开展业务,需要佩戴口罩(并正确佩戴)。因此,我决定创建一个应用程序,利用摄像头来检测一个人是否戴着面具,以及面具是否被正确使用。
Kaggle,Tensorflow 和合作实验室
在 Kaggle 上导航时,我遇到了一个由带注释的面具图片组成的小数据集。这是一个很好的注解,这是一个完美的起点。
鉴于我对 Tensorflow 对象检测 API 有些熟悉,我决定使用预先训练好的 COCO 数据集模型。这些预先训练的模型对于 COCO 中已经存在的 90 个类别(例如,人类、汽车、狗等)的开箱即用推理非常棒。它们还特别适用于作为初始化新模型以训练全新数据集的基线。
有许多在浏览器中编写和执行 Python 的好方法,比如 AWS SageMake r,但是 Google Colaboratory 提供免费的 GPU 计算,所以我选择使用 Colab 笔记本来运行我的所有培训。后来,我决定升级到专业帐户,以保证我总是有 GPU 和内存可用。
Google 协作配置
不是巧合,卡格尔。Tensorflow 和 Colaboratory 是谷歌的产品。我确信我可以找到类似的 AWS 或微软的产品,但是没有什么比免费的更好。
为训练准备数据集
带有遮罩批注的元数据文件是 XML 文件,包含有关图像的信息和每个元素的边界框信息。他们使用 PASCAL VOC 格式,这是一种常见的结构。
<annotation>
<folder>images</folder>
**<filename>1_13.jpg</filename>** <path>P:\mask_mouth\images\1_13.jpg</path>
<source>
<database>Unknown</database>
</source>
**<size>** <width>918</width>
<height>506</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
**<name>good</name>** <pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
**<bndbox>** <xmin>133</xmin>
<ymin>109</ymin>
<xmax>215</xmax>
<ymax>201</ymax>
</bndbox>
</object>
name
字段包含对象的类。在这个数据集的情况下,三个类名有些混乱:good
代表戴面具的人,bad
代表不戴面具的人,none
代表面具放置不正确。这很傻,但这给我带来了问题,使这个项目花费了更长的时间,因为我使用了不同类名的 labelmap 进行推理。
生成 CSV 文件
需要做一些调整来规范化数据集。有些文件是 png,有些是 jpg,有些没有相应的 XML 文件,反之亦然。在确保它们都是一致的之后,我将它们随机分成训练集和测试集(80/20)。来自 XMLs 的数据然后被导入到一个 CSV 文件中。每行对应一个注释。CSV 列有:filename
、width
、height
、class
、xmin
、ymin
、xmax
、ymax
。
train_xml_df.to_csv(train_path_csv + 'train_labels.csv', index=None)
test_xml_df.to_csv(test_path_csv + 'test_labels.csv', index=None)
生成 TFRecord
TFRecord 是一种存储二进制记录序列的简单格式。所以我的下一步是使用 CSV 创建一个 TFRecord 文件,用于训练网络。为拆分的训练集和测试集分别生成了不同的 TFRecord 文件。
generate_tfrecord(train_csv_file, HOME_DIR, 'train.record', train_path_images)
generate_tfrecord(test_csv_file, HOME_DIR, 'test.record', test_path_images)
培训 TFRecords
在 TFRecords 可用的情况下,下一步是从 Tensorflow 模型动物园中选择一个预训练的模型,并使用它来训练 TFRecords。
在对一些模型进行了一些调查后,我决定使用ssd_inception_v2_coco
,因为它可以很好地平衡速度和平均精度(地图)。
关于 Tensorflow 对象检测 API 的事情是,它不被最新的 2。张量流的 x 个版本。遗留代码不是向后兼容的,所以需要做一些工作来找出可以工作的最佳版本。该过程的一部分是编译协议缓冲区,并确保它们包含在PYTHONPATH
中。堆栈溢出很方便地帮助我解决了必须降级gast(==0.2.2)
和numpy(==1.17.4)
的问题,并避免在训练中途崩溃。
# Testing Object Detection worksfrom tensorflow.contrib import slim
from nets import inception_resnet_v2
from object_detection.builders import model_builder
from object_detection.protos import input_reader_pb2
型号配置
在能够训练之前,我必须用 TFRecords 的参数和文件位置修改ssd_inception_v2_coco
配置文件。每一篇关于物体检测的文章都会详尽地告诉你如何去做。
ssd_inception_v2_coco.config 摘录
拥有可用的 GPU 和 RAM 很有帮助,甚至尝试了大量的步骤。笔记本电脑可以在夜间运行,不会出现大的问题。当有事情发生时,我总是可以从检查点恢复。
python ./models/research/object_detection/**model_main.py** \
--pipeline_config_path={pipeline_fname} \
--model_dir={model_dir} --alsologtostderr \
--num_train_steps={num_steps} --num_eval_steps={num_eval_steps}
培训损失
导出训练好的推理图
一旦训练工作完成,下一步是提取新训练的推理图,该推理图稍后将用于执行对象检测。这可以使用 Tensorflow 对象检测程序来完成。
python object_detection/**export_inference_graph.py** \
--input_type image_tensor --pipeline_config_path {pipeline_fname} \
--trained_checkpoint_prefix {last_model_path} \
--output_directory /content/mask-detection/training/exported_graph
这个过程生成frozen_inference_graph.pb
,它是一个 protobuf 文件,包含图形定义以及模型的所有权重。有了这个文件,我们就可以运行训练好的模型并进行推理。
在一些训练图像中运行检测工作得相当好。
训练图像上的目标检测。
我更进一步,将它转换成一个tflite_graph.pb
文件作为输入,最终得到一个 TensorFlow Lite flatbuffer 格式detect.tflite
python object_detection/**export_tflite_ssd_graph.py** \
--pipeline_config_path={pipeline_fname} \
--trained_checkpoint_prefix={last_model_path} \
--output_directory /content/mask-detection/tflite \
--add_postprocessing_op=true**tflite_convert** --graph_def_file=/content/mask-detection/tflite/tflite_graph.pb \
--output_file=/content/mask-detection/tflite/detect.tflite \
--output_format=TFLITE --input_shapes=1,300,300,3 \
--input_arrays=normalized_input_image_tensor \
--output_arrays ='TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1','TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3' \
--allow_custom_ops --mean_values=128 --std_dev_values=127 \
--change_concat_input_ranges=false --allow_custom_ops
TensorFlow Lite 文件可用于在移动、嵌入式和物联网设备上运行模型。它们支持低延迟和小二进制大小的设备上推断。
在我的下一篇关于在 Raspberry PI 4 上运行 TF Lite 的文章中,请遵循我的中等配置文件。这是这个项目的 Github 库。
我的隔离区,包好了
在新冠肺炎疫情隔离期间,我用 Spotify 的 Python 客户端 SpotiPy 分析了我的音乐收听模式
播放列表’ Kartik 的热门歌曲 Kartik Dhawan 的 Quarantine '的专辑封面。
2020 年初,Spotify 推出了一项名为“wrapped”的功能,为用户提供对其收听历史的分析。作为一个数据和音乐的爱好者,我真的很喜欢在应用程序上了解我的活动!几个月后,冠状病毒疫情迫使世界大部分地区进入强制隔离状态,导致许多人在家工作,与社会隔绝。
在隔离期间,我花了很多时间听音乐,所以我决定在 Spotify 上分析我的收听历史,并创建一个’ Wrapped '来找点乐子!本文涵盖了一些基本的数据工程、分析、可视化,最重要的是一组高质量的曲子。
数据收集
Spotify 为开发者提供了一个名为 SpotiPy 的 python 库。它提供了对 Spotify 庞大音乐数据库上的 API 的访问。除此之外,Spotify 允许用户下载他们拥有的关于您的数据,以遵守欧盟的一般数据保护条例(GDPR)政策。我按照的这些步骤去做。数据文件包括一个流部分,这是我在这个分析中使用的部分。
熊猫数据帧中加载的 JSON 流文件
隔离期间我在 Spotify 上花的时间比平时多吗?
我问自己被困在家里是否影响了我在 Spotify 上的时间。我的直觉是,我比平时流了更多的歌曲,因此在应用程序上花费了更多的时间,我想用一个简单的图表来证明这一点,该图表按周绘制了总的流时间(以毫秒为单位)。
出于分析的目的,我将把 2020 年 3 月 11 日作为我隔离的开始,因为这是我开始在家工作的日期。根据上面的图表,隔离开始后的一周(3 月 16 日至 22 日)是我在 Spotify 上播放时间最多的一周。除了被隔离的一周,其他时间都以高于平均水平的时间进行了播放!很明显,自从隔离开始后,我在 Spotify 上花的时间比平时多。
我从我的流历史中创建了两个数据帧,以根据开始日期(2020 年 3 月 11 日)之前/之后播放的歌曲来识别隔离区中的活动。我合计了隔离数据帧的 ms streamed 列,以获得在 Spotify 上流式播放音频所花费的总时间。
隔离期间,我在 Spotify 上总共花了 12222 分钟
我花时间听了什么?
我花了多少时间听播客和音乐
Spotify 提供的流媒体数据不包括该曲目是播客还是音乐的指标。我通常听的播客大约 20-60 分钟,平均每首歌大约 4 分钟。我找到了所有超过 12 分钟的歌曲的艺术家,并将他们标记为“播客”。
我的流媒体历史中的播客
我是经济播客的忠实粉丝,NPR 的《星球货币》是我最喜欢的一个!),我的一个朋友推荐《变革之风》作为一个很好的调查播客,它是关于中情局参与热门歌曲蝎子以及它如何潜在地导致冷战结束的。这是超级有趣的,看看吧!
按音频类型划分的 MsPlayed 切片
我在 spotify 上花了大约 20%的时间听播客
我发现了多少新的艺术家?
发现新音乐总是一个有趣又耗时的旅程。有了世界上所有的时间和 Spotify 上不同播放列表的访问权限,我开始了我的隔离音乐探索。
当我有一个播放列表在随机播放模式下运行,并且我不喜欢一首歌的前几秒钟,我通常会跳过它。为了避免计算跳过的歌曲,我添加了一个限制,即歌曲必须播放超过 10 秒。然后,我只是统计了隔离数据框中不存在于常规数据框中的艺术家数量。
我发现了 281 位艺术家和 6 个播客
我在播放列表中添加了多少首新曲目?
一个自然的过程是计算出我在我的播放列表中添加了多少首新歌。我在 Spotify 上有 5 个公共播放列表,用于不同的心情/场合。我使用 SpotiPy 的user _ playlistsAPI 来获取我所有的公共播放列表 ID,并将这些 ID 传递给 APIuser _ playlist _ tracks来获取这些播放列表中的所有歌曲,我将一些必要的属性存储在一个数据帧中。
播放列表的随机样本跟踪数据帧
最后,为了与流历史文件保持一致,我在 3 月 11 日之后和 5 月 15 日之前按添加的日期对这些数据进行了切片。
我添加了 89 首歌曲横跨 5 个播放列表
在隔离期间,我的流历史记录中有哪些常见主题?
我问自己,在封锁期间听的歌曲中是否有共同点。SpotiPy 有一个 API,允许用户从音轨返回音频特征。这些音频功能的例子有:
- 可跳性:0-1 之间的一个值,用于判断一个轨道的可跳性
- 能量:0-1 之间的一个值,用来衡量一个轨迹的强度和活跃程度
- 响度:整体响度,单位为分贝。值的范围从-60 到 0
- 语速:测量音轨中有多少是由口语组成的,范围为 0-1
- 声音度:测量音轨是否有声音,范围为 0-1
- 乐器性:预测音轨是否没有人声,范围为 0-1
- 效价:这描述了音轨在音乐上的积极程度。标度 0-1
关于这些属性的更多信息可以在 API 的官方文档中找到这里
该 API 需要一个 track_id 作为参数,所以第一步是为我的隔离流历史中的每个磁道返回一个磁道 id。我使用 SpotiPy search API,在一些正则表达式的帮助下,使用我的流数据中的 trackName 和 artistName 列构建一个查询,以返回我的数据帧中的 songId。
我使用上面代码返回的歌曲 ID 作为audio _ featuresAPI 中的参数,并将元数据保存为我的数据帧的一部分。
问:什么样的剧情最适合把数据可视化在音乐上?
A :小提琴剧情…(咄!)
我在隔离期间的流动历史非常适合跳舞,充满活力,因为毕竟谁不需要一个理由来跳舞,而被困在家里?在我的流历史中,效价图显示的积极因素是均匀分布的。
上述大多数音频特征的头和尾都延伸到了极端,这表明我听的歌曲在乐器、现场或原声方面范围很广。然而,我的大部分流都在所有三个指标的底部。
隔离期间听了高度 可舞和活力的歌曲
我最喜欢的流派是什么?
2019 年 Wrapped 的一个流行特征是“顶级流派”。我发现 SpotiPy 库将流派作为艺术家的一部分,而不是歌曲的一部分,它可以通过艺术家 API 获得。
一个艺术家可以有多种风格。这提出了一个数据工程的挑战,因为在我的基础数据框架中存储流派会引入重复,并且做额外的分析会变得复杂。因此,我决定将艺术家和流派保存在一个单独的数据框中,并将其加入到我的流历史框中,以通过简单的分组方式获得顶级流派。
我遍历我的流媒体历史中所有独特的艺术家,以构建 SpotiPy 搜索查询,然后遍历与艺术家相关的每个流派,并将流派和艺术家的名字添加到 pandas 数据框中。我将此数据框加入到我的艺术家姓名和流派分组的流历史中。结果在下图中!
说唱是我最喜欢的类型。我的前 10 个流派很好地混合了嘻哈子流派(德西、地下、南方)。除了 Hip Hop/Rap,我还听了一些流行音乐、陷阱音乐和独立灵魂音乐!
谁是我的顶级流媒体艺术家?
这是 Spotify 2019 wrapped 中的一个受欢迎的功能。我决定看看我最喜欢的 10 位艺术家。一群简单的熊猫就做到了!
当我在为 TDS 写我的上一篇文章时,我在 YouTube 上发现了的这首 朱 集,我再次迷上了他的音乐。特拉维斯·斯科特是我最喜欢的艺术家已经有一段时间了。威肯推出了一张新专辑, 下班后 在隔离期开始的时候,来点复古的感觉吧!FKJ 是我在隔离期间发现的一位艺术家,他演奏多种乐器,是我听过的最有天赋的艺术家之一。看看他的专辑, 法国猕猴桃汁 !
我最喜欢的歌曲是什么?
综合起来,我想生成一个播放列表,其中包含我在隔离期间的所有热门歌曲,这样我就可以记住这段时间以及帮助我度过这一阶段的歌曲!
我创建了一个数据框,用熊猫分组,按播放次数降序排列,得到我的前 50 首歌曲。我使用了一个函数来获取这些曲目的歌曲 id。我使用user _ playlist _ createAPI 创建了一个播放列表,然后使用user _ playlist _ add _ tracks添加我的分组数据框对象中的所有歌曲。
我包装上的歌曲包括新专辑 drops ( 威肯)、历史上最受欢迎的(足以相信)、复古(加尔文·哈里斯)以及流行文化歌曲,如“sketcher”,这些歌曲在被推荐到 Tik Tok 和“*Bella Ciao”*后迅速走红,这是我在隔离期间碰巧狂看的热门网飞系列《金钱大劫案》的主题曲!
最后,我想对那些把新音乐介绍给我的人大喊一声,你们知道你们是谁!Spotify 是一个如此棒的应用程序;通过让音乐变得容易理解来帮助人们度过困难时期。享受听这些宝石!
这是我的 git 库的链接:
通过在 GitHub 上创建帐户,为 kartikd1/Spotify 开发做出贡献。
github.com](https://github.com/kartikd1/Spotify)
Python 中的随机森林分类器
一次处理分类变量和数值变量的端到端注释
Guillaume Henrotte 在 Unsplash 上拍摄的照片
内容
- 数据预处理(自动处理分类特征和 NAs 的技巧)
- 训练射频分类器
- 评估分类器(准确度、召回率、精确度、ROC AUC、混淆矩阵、绘图)
- 特征重要性
- 通过随机搜索调整超参数
现在让我们开始吧,伙计们!
数据描述
在本文中,我使用的数据集来自我在一家科技公司为一个数据科学职位进行的真实技术测试。你可以在这里获得数据(点击下载 ZIP)。
声明:数据中描述的所有信息都不真实。
这里的exit_status
是响应变量。注意,我们只给出了train.csv
和test.csv
。test.csv
没有exit_status
,即仅用于预测。因此,方法是我们需要将train.csv
分成训练和验证集来训练模型。然后用模型预测test.csv
中的exit_status
。
这是一个典型的数据科学技术测试,您有大约 30 分钟的时间来制作详细的 jupyter 笔记本和结果。
1.数据预处理
import pandas as pd
import numpy as np
import matplotlib.pyplot as pltdata = pd.read_csv('train.csv')
哎呀,我们看到了 NaN,让我们检查一下我们有多少 NaN
检查 NAs
data.isnull().sum()
由于总共有 2600 行,所以这里使用 NAs 的行数相对较少。但是,我在这里没有删除 NAs,因为如果test.csv
数据集也有 NAs,那么删除训练数据中的 NAs 将无法使我们预测有 NAs 的客户的行为。但是,如果test.csv
没有任何 NAs,那么我们可以继续并删除训练数据集中的 NAs。但是让我们先来看看test.csv
test = pd.read_csv('test.csv')
test.isnull().sum()
不出所料,test.csv
中有 NAs。因此,我们将 NAs 视为一个类别,并假设它对响应变量exit_status
有贡献。
将 exit_status
中的是-否替换为 1–0
exit_status_map = {'Yes': 1, 'No': 0}
data['exit_status'] = data['exit_status'].map(exit_status_map)
这一步在后面很有用,因为响应变量必须是一个数字数组才能输入到 RF 分类器中。正如我前面提到的,RF 模型不能读取字符串或任何非数字数据类型。
将数据分为 X 和 y
y = data.pop('exit_status')
X = data.drop('id',axis = 1)
id
列不会给我们的工作增加任何意义,因为它不会影响客户是选择留下还是离开,所以我们应该删除它。
创建培训和验证集
seed = 50 # so that the result is reproducible
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.333, random_state = seed)
现在,是时候让 NA 成为一个类别了。在 Python 中,NaN
被认为是 NAs。编码后,那些NaN
将被忽略。因此,用na
代替NaN
是有用的,它现在是一个叫做‘na’的类别。稍后编码时会考虑到这一点。
X_train = X_train.fillna('na')
X_test = X_test.fillna('na')
创建分类变量列表进行编码
X_train.dtypes
请注意,只有分类变量具有 dtype = object
现在,让我们创建一个分类变量列表
features_to_encode = list(X_train.select_dtypes(include = ['object']).columns) # Or alternatively, features_to_encode = X_train.columns[X_train.dtypes==object].tolist()
为我们创建一个处理分类特征的构造函数
这是我最喜欢的一步,因为通过重新创建这个新的构造函数,当传递到模型中时,我不需要对任何 X 数据帧进行任何转换。 这个构造函数会自动处理分类变量,而不会影响数值变量 。多方便啊!!!
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import make_column_transformercol_trans = make_column_transformer(
(OneHotEncoder(),features_to_encode),
remainder = "passthrough"
)
remainder = 'passthrough'
允许构造器忽略那些不包含在features_to_encode
中的变量。
现在我们的输入准备好了。让我们训练射频分类器。
2.训练射频分类器
让我们首先创建我们的第一个模型。当然可以从rf_classifier = RandomForestClassifier()
开始。然而,大多数情况下,这个基本模型的性能不会很好(至少从我的经验来看,你的可能会有所不同)。所以我总是从下面的一组参数开始,作为我的第一个模型。
from sklearn.ensemble import RandomForestClassifierrf_classifier = RandomForestClassifier(
min_samples_leaf=50,
n_estimators=150,
bootstrap=True,
oob_score=True,
n_jobs=-1,
random_state=seed,
max_features='auto')
我建议总是从模型开始,因为最好使用袋外样本来估计泛化精度。oob 误差估计与通过 k 倍交叉验证获得的误差估计几乎相同。与许多其他非线性估计器不同,随机森林可以适合一个序列,并在此过程中进行交叉验证。
现在,让我们通过使用Pipeline
来组合我们的分类器和我们之前创建的构造器
from sklearn.pipeline import make_pipeline
pipe = make_pipeline(col_trans, rf_classifier)
pipe.fit(X_train, y_train)
pipe
是一个新的黑盒,由 2 个组件组成:1。一个构造函数来处理带有分类变量的输入,并转换成正确的类型。从构造函数接收这些新转换的输入的分类器。
y_pred = pipe.predict(X_test)
3.评估分类器
from sklearn.metrics import accuracy_score, confusion_matrix, precision_score, recall_score, roc_auc_score, roc_curve, f1_score
准确度= (TP + TN) / (TP+TN+FP+FN)
召回= TP / (TP + FN)
精度= TP / (TP + FP)
f1-得分= 2 精度召回/(精度+召回)
在本例中,1 为正,0 为负
我不会解释上面每个术语的意思,因为这篇文章并不是随机森林算法的详细文档。我想我们都知道这些术语的意思。当然,如果你不确定,可以在评论区问我。
准确度(正确分类样本的分数)
accuracy_score(y_test, y_pred)print(f"The accuracy of the model is {round(accuracy_score(y_test,y_pred),3)*100} %")**The accuracy of the model is 91.1%**
进行概率预测
train_probs = pipe.predict_proba(X_train)[:,1]
probs = pipe.predict_proba(X_test)[:, 1]train_predictions = pipe.predict(X_train)
predict_proba(dataframe)[:,1]
给出数据帧中类别标签 1 的预测概率分布。这对于计算 ROC_AUC 分数很重要。你可能会问为什么类的标签是 1 而不是 0。以下是我从 sklearn 文档中得到的内容:
对于y_score
,‘二进制情况…分数必须是标签 大于的类的分数。这就是为什么我们需要得到标签 1 而不是标签 0。
*print(f'Train ROC AUC Score: {roc_auc_score(y_train, train_probs)}')print(f'Test ROC AUC Score: {roc_auc_score(y_test, probs)}') **Train ROC AUC Score: 0.9678578659647703
Test ROC AUC Score: 0.967591183178179***
现在,我们需要绘制 ROC 曲线
*def evaluate_model(y_pred, probs,train_predictions, train_probs): baseline = {} baseline['recall']=recall_score(y_test, [1 for _ in range(len(y_test))]) baseline['precision'] = precision_score(y_test, [1 for _ in range(len(y_test))]) baseline['roc'] = 0.5 results = {} results['recall'] = recall_score(y_test, y_pred) results['precision'] = precision_score(y_test, y_pred) results['roc'] = roc_auc_score(y_test, probs) train_results = {} train_results['recall'] = recall_score(y_train, train_predictions) train_results['precision'] = precision_score(y_train, train_predictions) train_results['roc'] = roc_auc_score(y_train, train_probs) for metric in ['recall', 'precision', 'roc']: print(f'{metric.capitalize()}
Baseline: {round(baseline[metric], 2)}
Test: {round(results[metric], 2)}
Train: {round(train_results[metric], 2)}') **# Calculate false positive rates and true positive rates** base_fpr, base_tpr, _ = roc_curve(y_test, [1 for _ in range(len(y_test))]) model_fpr, model_tpr, _ = roc_curve(y_test, probs) plt.figure(figsize = (8, 6))
plt.rcParams['font.size'] = 16 # Plot both curves plt.plot(base_fpr, base_tpr, 'b', label = 'baseline')
plt.plot(model_fpr, model_tpr, 'r', label = 'model')
plt.legend(); plt.xlabel('False Positive Rate');
plt.ylabel('True Positive Rate'); plt.title('ROC Curves');
plt.show();evaluate_model(y_pred,probs,train_predictions,train_probs) **Recall Baseline: 1.0 Test: 0.92 Train: 0.93
Precision Baseline: 0.48 Test: 0.9 Train: 0.91
Roc Baseline: 0.5 Test: 0.97 Train: 0.97***
结果看起来不错。测试和训练结果之间的差异非常小,表明我们的模型没有过度拟合数据。
混乱矩阵
人们可以简单地输入confusion_matrix(y_test, y_pred)
来得到混淆矩阵。然而,让我们采取更高级的方法。在这里,我创建一个函数来绘制混淆矩阵,这个函数打印并绘制混淆矩阵。(改编自代码来源)
*import itertoolsdef plot_confusion_matrix(cm, classes, normalize = False,
title='Confusion matrix',
cmap=plt.cm.Greens): # can change color plt.figure(figsize = (10, 10))
plt.imshow(cm, interpolation='nearest', cmap=cmap)
plt.title(title, size = 24)
plt.colorbar(aspect=4) tick_marks = np.arange(len(classes))
plt.xticks(tick_marks, classes, rotation=45, size = 14)
plt.yticks(tick_marks, classes, size = 14) fmt = '.2f' if normalize else 'd'
thresh = cm.max() / 2. # Label the plot for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])): plt.text(j, i, format(cm[i, j], fmt),
fontsize = 20,
horizontalalignment="center",
color="white" if cm[i, j] > thresh else "black") plt.grid(None)
plt.tight_layout()
plt.ylabel('True label', size = 18)
plt.xlabel('Predicted label', size = 18) # Let's plot it outcm = confusion_matrix(y_test, y_pred)
plot_confusion_matrix(cm, classes = ['0 - Stay', '1 - Exit'],
title = 'Exit_status Confusion Matrix')*
4.特征重要性
首先,让我们检查模型中有多少个特征重要性值
*print(rf_classifier.feature_importances_)print(f" There are {len(rf_classifier.feature_importances_)} features in total")**[7.41626071e-04 6.12165359e-04 1.42322746e-03 6.93254520e-03 2.93650843e-04 1.96706074e-04 1.85830433e-03 2.67517842e-03 1.02110066e-05 2.99006245e-05 6.15325794e-03 1.66647237e-02 4.49100748e-03 3.37963818e-05 1.87449830e-03 1.00225588e-03 3.72119245e-04 1.39558189e-02 8.28073088e-04 3.41692010e-04 1.71733193e-04 7.60943914e-02 1.09485070e-02 1.78380970e-02 1.63392715e-02 2.93397339e-03 1.46445733e-02 1.34849432e-01 1.33144331e-02 4.42753783e-02 3.13204793e-03 4.97894324e-03 6.17692498e-03 2.70959923e-02 1.61849449e-03 7.57024010e-02 2.31468190e-02 4.66247828e-01]** **There are 38 features in total***
总共有 38 个特征。但是,X_train 只有 15 列。这是因为模型pipe
自动对 X_train 中的分类变量进行编码。例如,X_train 中的gender
列被转换为 2 列Female
和Male
。
因此,为了将特性与从rf_classifier
获得的特性重要性值相匹配,我们需要在编码的 X_train 中获得所有那些对应的列。
问题:
我们只有一个特征重要性数组,但是有分类和数字特征,我们如何知道哪个值属于哪个特征?
还记得我们之前创建的构造函数col_trans
吗?col_trans.fit_transform(X_train)
将给出编码的 X_train。
*# Let's look at the first row
print(col_trans.fit_transform(X_train)[0,:])**[ 0\. 1\. 0\. 0\. 0\. 1\. 1\. 0\. 0\. 1\. 1\. 0\. 0\. 0\. 1\. 0\. 0\. 0\. 1\. 0\. 0\. 1\. 0\. 0\. 1\. 0\. 0\. 1\. 0\. 0\. 0\. 1\. 0\. 1\. 0\. 30\. 74.75 14\. ]**# And the first row of X_train
X_train.iloc[0,:] **gender Male
age >60
dependents No
lifetime 30
phone_services Yes
internet_services 3G
online_streaming Major User
multiple_connections No
premium_plan No
online_protect No
contract_plan Month-to-month
ebill_services Yes
default_payment Online Transfer
monthly_charges 74.75
issues 14
Name: 1258, dtype: object***
对于 X_train,有 3 个数值变量,值分别为 30、70.75 和 14。对于编码的 X_train,这 3 个数值放在所有分类变量之后。这意味着对于rf_classifier.feature_importances_
,首先显示所有编码的分类变量,随后是数值变量
好了,现在我们知道了,让我们创建一个合适的编码 X_train。
*def encode_and_bind(original_dataframe, features_to_encode): dummies = pd.get_dummies(original_dataframe[features_to_encode])
res = pd.concat([dummies, original_dataframe], axis=1)
res = res.drop(features_to_encode, axis=1)
return(res)X_train_encoded = encode_and_bind(X_train, features_to_encode)*
函数encode_and_bind
对分类变量进行编码,然后将它们与原始数据帧相结合。
x _ 火车 _ 编码
酷,现在我们有 38 列,这和之前在rf_classifier.feature_importances_
中显示的 38 个特性完全一样。
*feature_importances = list(zip(X_train_encoded, rf_classifier.feature_importances_))**# Then sort the feature importances by most important first**
feature_importances_ranked = sorted(feature_importances, key = lambda x: x[1], reverse = True)**# Print out the feature and importances** [print('Feature: {:35} Importance: {}'.format(*pair)) for pair in feature_importances_ranked];*
一些特征及其重要性分数(降序)
***# Plot the top 25 feature importance**feature_names_25 = [i[0] for i in feature_importances_ranked[:25]]
y_ticks = np.arange(0, len(feature_names_25))
x_axis = [i[1] for i in feature_importances_ranked[:25]]plt.figure(figsize = (10, 14))
plt.barh(feature_names_25, x_axis) #horizontal barplot
plt.title('Random Forest Feature Importance (Top 25)',
fontdict= {'fontname':'Comic Sans MS','fontsize' : 20})plt.xlabel('Features',fontdict= {'fontsize' : 16})
plt.show()*
5.使用 RandomSearchCV 调整超参数
由于模型性能非常好,具有很高的准确度、精确度和召回率,因此实际上几乎不需要对模型进行调优。但是,如果我们的第一个模型表现不佳,可以采取以下步骤来调整模型。
让我们看看目前使用的参数
*from pprint import pprintprint('Parameters currently in use:\n')
pprint(rf_classifier.get_params())*
现在,我为模型创建了一个参数网格,以便随机挑选和训练,因此命名为随机搜索。
***from sklearn.model_selection import RandomizedSearchCV**n_estimators = [int(x) for x in np.linspace(start = 100, stop = 700, num = 50)]max_features = ['auto', 'log2'] # Number of features to consider at every splitmax_depth = [int(x) for x in np.linspace(10, 110, num = 11)] # Maximum number of levels in treemax_depth.append(None)min_samples_split = [2, 5, 10] # Minimum number of samples required to split a nodemin_samples_leaf = [1, 4, 10] # Minimum number of samples required at each leaf nodebootstrap = [True, False] # Method of selecting samples for training each tree random_grid = {'n_estimators': n_estimators, 'max_features': max_features, 'max_depth': max_depth, 'min_samples_split': min_samples_split, 'min_samples_leaf': min_samples_leaf, 'max_leaf_nodes': [None] + list(np.linspace(10, 50, 500).astype(int)), 'bootstrap': bootstrap}*
现在,我首先创建一个基础模型,然后使用随机网格根据 ROC_AUC 得分选择最佳模型,因此有了scoring = 'roc_auc'
。
***# Create base model to tune**rf = RandomForestClassifier(oob_score=True)**# Create random search model and fit the data**rf_random = RandomizedSearchCV( estimator = rf, param_distributions = random_grid, n_iter = 100, cv = 3, verbose=2, random_state=seed, scoring='roc_auc')rf_random.fit(X_train_encoded, y_train)rf_random.best_params_rf_random.best_params_**{'n_estimators': 206,
'min_samples_split': 5,
'min_samples_leaf': 10,
'max_leaf_nodes': 44,
'max_features': 'auto',
'max_depth': 90,
'bootstrap': True}***
我们将用三重交叉验证进行 100 次迭代。关于参数的更多信息可以在这里找到。
或者,我们可以再次使用pipe
,这样我们就不需要编码数据了
*rf = RandomForestClassifier(oob_score=True, n_jobs=-1)rf_random = RandomizedSearchCV( estimator = rf, param_distributions = random_grid, n_iter = 50, cv = 3, verbose=1, random_state=seed, scoring='roc_auc')pipe_random = make_pipeline(col_trans, rf_random)pipe_random.fit(X_train, y_train)rf_random.best_params_*
请注意,这两种方法给出的答案可能略有不同。这是由于选择参数的随机性。
***# To look at nodes and depths of trees use on average**n_nodes = []max_depths = []for ind_tree in best_model.estimators_: n_nodes.append(ind_tree.tree_.node_count) max_depths.append(ind_tree.tree_.max_depth)print(f'Average number of nodes {int(np.mean(n_nodes))}') print(f'Average maximum depth {int(np.mean(max_depths))}') **Average number of nodes 82
Average maximum depth 9***
评估最佳车型
***# Use the best model after tuning**best_model = rf_random.best_estimator_pipe_best_model = make_pipeline(col_trans, best_model)pipe_best_model.fit(X_train, y_train)y_pred_best_model = pipe_best_model.predict(X_test)*
第 3 节中使用的相同代码可以再次应用于 ROC 和混淆矩阵。
*train_rf_predictions = pipe_best_model.predict(X_train)train_rf_probs = pipe_best_model.predict_proba(X_train)[:, 1]rf_probs = pipe_best_model.predict_proba(X_test)[:, 1]**# Plot ROC curve and check scores**evaluate_model(y_pred_best_model, rf_probs, train_rf_predictions, train_rf_probs)**Recall Baseline: 1.0 Test: 0.94 Train: 0.95
Precision Baseline: 0.48 Test: 0.9 Train: 0.91
Roc Baseline: 0.5 Test: 0.97 Train: 0.98***
这组参数使模型的性能比我们的原始模型稍好一些。差别并不大。这是可以理解的,因为我们的原始模型已经表现得很好,得分更高(准确度、精确度、召回率)。因此,调整一些超参数可能不会给模型带来任何显著的改进。
***# Plot Confusion matrix**plot_confusion_matrix(confusion_matrix(y_test, y_pred_best_model), classes = ['0 - Stay', '1 - Exit'],title = 'Exit_status Confusion Matrix')*
对test.csv
数据使用最佳模型
现在我们有了最好的模型,让我们用它来进行预测,并编译我们的最终答案来提交。
*test = pd.read_csv('test.csv')
test_withoutID = test.copy().drop('id', axis = 1)
test_withoutID = test_withoutID.fillna('na')final_y = pipe_best_model.predict(test_withoutID)
#pipe model only takes in dataframe without ID column. final_report = test
final_report['exit_status'] = final_y
final_report = final_report.loc[:,['id','exit_status']]# Replace 1-0 with Yes-No to make it interpretablefinal_report= final_report.replace(1, 'Yes')
final_report= final_report.replace(0, 'No')*
我们都看到了No
。让我们检查以确保该列中也有Yes
。
*final_report.exit_status.value_counts()**No 701
Yes 638
Name: exit_status, dtype: int64***
好了,我们安全了~
保存并提交文件
*final_report.to_csv('submissions.csv', index=False)*
结论
我希望这也能成为你们有用的参考指南。您可以使用本指南来准备一些技术测试,或者将它作为一个备忘单来复习如何用 Python 实现随机森林分类器。我一定会继续更新,因为我发现了更多有用的函数或技巧,我认为它们可以帮助每个人快速解决许多数据科学问题,而不需要在 StackOverflow 这样的平台上查找,特别是在时间有限的技术测试中。
如果还有其他你认为重要的技巧或功能,请在下面的评论区告诉我。此外,我欢迎任何人的建设性反馈。
谢谢你的阅读。祝您愉快,编程愉快!
我的深度学习阅读清单
为那些希望开始深度学习的人和那些希望填补他们知识空白的人推荐的文献。
这是我推荐的关于深度学习各个方面的资源的精选列表,虽然基于我自己的个人经验,但很大程度上受到了这个 Github 库的启发。我打算随着新论文的出现,或者如果我设法发现一些真正对我有影响的论文,几乎定期地更新这个列表。
这个阅读清单相对来说比较长,我并不宣称已经阅读了每一页上的每一个单词。然而,我坚信发展良好的基础:鉴于深度学习的当前状态有多广阔,如果你从零开始,你必须赶上很多。我的建议是大步前进,在你需要的时候学习你需要的东西;这是必然的,但不是不可克服的!
建立良好的基础
不管你喜不喜欢,深度学习无论是线性代数还是统计,都需要大量的背景知识;你需要一个坚实的基础才能建造一座大厦。前者是理解每一个模型背后的核心机制的一个必要条件,而发展一个良好的线性代数直觉可以让你洞察到一些模型所涉及的一些技巧(例如,内积解码器,inception 架构)。对于一些较简单的任务,例如分类,需要对后者有基本的了解。当我们讨论更复杂的问题时,贝叶斯统计的背景非常有帮助:这些想法构成了概率建模的主干,用于生成模型——基于所学知识创建新数据的模型。
对于线性代数,我其实并不推荐一本数学教材。而是推荐 数学对于量子化学;不要让标题把你搞糊涂了,因为这本已经很短的书的前几章给了你一个快速入门和线性代数性质的很好的参考。量子化学实际上使用了许多与深度学习相同的机制(有许多矩阵乘法和因式分解),所有这些都是为了解决薛定谔方程的近似问题。您将学习如何将概念表达为基函数、投影和求解线性方程。这本书是由多佛出版社出版的,所以买起来非常便宜,而且随身携带也很好!
对于统计学,我一般会避免典型的侧重于假设检验(即p-值)的大学教科书,这在心理学和生物学中可能会很常见。这些想法背后的前提是“频繁主义者”,依我拙见,你最好像贝叶斯统计学家那样思考(尽管不要太害怕被不确定性麻痹)。出于这个原因,我推荐盖尔曼、卡林、斯特恩和鲁宾的 贝叶斯数据分析 ,还有一本更实用的书,麦克雷瑟的 统计再思考:一门贝叶斯课程,示例见 R 和斯坦 。前者特别让你根据可能性来构建任何问题,并提供案例研究来理解贝叶斯统计如何帮助我们解决现实生活中的问题并理解不确定性的作用。
建造房子的框架
有两个具体的资源我会推荐,它们会让你做好准备: 深度学习 由该领域的三位巨头:伊恩·古德菲勒、约舒阿·本吉奥和亚伦·库维尔,以及吴恩达的关于 deeplearning.ai 的课程。前者提供了深度学习基础的极其坚实的基础和理论支撑,而吴恩达的课程更加务实,教你如何从头开始实现这些模型。配合吴恩达课程的好书是弗朗索瓦·乔莱的《用 Python 进行深度学习的》。在这两种情况下,都非常关注 Tensorflow 和 Keras(原因很明显),尽管从深度学习中学习应该为您提供足够的抽象来实现许多基础知识。
本质上,这三种材料的组合足以让你开始摆弄深度学习模型。当然,这确实说起来容易做起来难,因为有大量的阅读,但是你未来的自己会感谢你的!
在这一点上,许多深度学习的最新概念来自学术论文:与许多其他领域不同,几乎所有的材料都是免费的。我们很幸运,机器学习和深度学习研究人员倾向于将大量论文上传到 arXiv 上,这对于其他学科(例如化学、物理等)来说并不真实。).我建议找一些你有兴趣解决的事情,并开始阅读提供这些问题解决方案的论文。例如,如果你正在处理图像,看看卷积模型:AlexNet,LeNet,Inception,举几个例子(按这个顺序)。如果你处理数字/序列数据,看看递归神经网络。这个 Github 库提供了直到几年前的论文集锦,涵盖了许多当前最先进的更具开创性的论文。如果我没有提到其中的一篇论文,它可能会在那个库中。
在接下来的几节中,我将讨论更多具体的应用,这些应用并不总是被系统地报道或者进入主流媒体,但是(我认为)非常酷。这是我对一些文件的一站式商店的想法,它将让你开始一段漫长的旅程。
额外材料: 这篇 arXiv 论文提供了深度学习相当全面的历史概述,可以追溯到 20 世纪初的思想。
特定主题
学习动力和能力
有一件事,我还没有找到很多关于神经网络容量的帖子或文章:这不是一个简单的问题,在这个问题上,文献实际上是非常多样的。虽然大多数人可能会认为这“太理论化”,但通过理解神经网络如何保留 T2 的信息,还是有重要的意义。我发现这个领域非常有趣,因为它无疑为优化问题增加了一个“有机”的成分。
图改编自估算神经网络中的信息流。
自动编码器
自动编码器是一类整洁的模型,试图学习以无监督的方式提取有用的特征。基本要点是编码器模型产生嵌入,解码器模型可以使用该嵌入来再现输入,并且通过这样做,学习将输入的重要部分压缩成小的特征向量。这篇博客文章全面概述了各种自动编码器。
图改编自自动编码变分贝叶斯
- 神经网络中的模块学习,1987 年
- 自动编码变分贝叶斯;变型自动编码器的描述。
- 变分自动编码器简介;VAE 氏症的最新介绍。
- β-VAE:用约束变分框架学习基本视觉概念;变型自动编码器的最新发展。
- 矢量量化变分自动编码器
- 时间差变分自动编码器
虽然变分自动编码器很酷,但它们通常受到一个事实的限制,即在许多(可能是大多数)情况下,对角高斯不能很好地逼近真实的后验概率。规范化流是一种通过一系列可逆转换将简单、易于计算的分布转换为更具表达性的分布的方法。
根据标准化流的变分推断改编的图形
- 流程正常化的变分推理;演示标准化流程的想法。
- 用于密度估计的掩蔽自回归流
- 标准化流程:当前方法的介绍和回顾
概率模型
**贝叶斯数据分析这本书应该为本节提供一个良好的基础:尽管这一节的标题,重点更多的是捕捉模型的不确定性, à la 贝叶斯统计。不确定性量化是理性决策的一个重要组成部分,为政策制定、自动驾驶汽车等等“让人工智能值得信赖”的总体主题增添了新的内容。这一部分并不全面,我打算进一步扩展。
- 改进机器学习模型中的非分布检测;关于估算模型告诉你一个它不知道的答案的可能性的简单方法的博文和论文。
- 神经网络的稳健非分布检测
- 作为贝叶斯近似的辍学:表示深度学习中的模型不确定性;考虑不确定性的最具成本效益的方法——在测试期间保持辍学状态!然而,倾向于低估不确定性。
- 在递归神经网络中基于理论的应用;将上述思想扩展到循环模型。
强化学习
深度学习的热门话题,让神经网络通过试错来自学如何解决问题。这个部分对我来说有点稀疏,但是我很快会填充它。
图改编自通过逆向强化学习的学徒学习
- 通过逆向强化学习的学徒学习;不是深度学习,而是一篇非常好读的论文,它形成了强化学习的基础,没有明确定义的奖励。
- 图像增强就是你所需要的一切:从像素中正则化深度强化学习;最近一篇关于使用简单增强来帮助策略学习任务而不是事件的论文。
- 从失败中逆向强化学习;与其让模型只从完美的专家轨迹中学习,还不如让它们从失败中学习。
- 开放式强化学习健身房;开始进行深度强化学习的好地方。
图形模型
图论是对各种问题建模的一种方式:例如,社会网络、电路和结构化数据,当然还有神经网络。概率图也越来越受欢迎,因为它们可以很容易地理解因果关系。最近,深度学习中的许多主流思想,如卷积和生成模型,在图形神经网络文献中找到了类似的推导。
图改编自变分图自动编码器
- 基于图卷积网络的半监督分类;卷积图网络模型的推导。Kipf 的博文。
- 变分图自动编码器;如题所言。
- 图形神经网络:方法与应用综述;开始学习图形神经网络模型的好地方。
- 拓扑自适应图卷积网络;顶点域中的有效卷积。
- 图卷积神经网络中的池;下采样所必需的,以前不是派生的!
结论
目前,这些是我进行深度学习的资源。我会试着定期更新这篇文章,但是你也应该做你自己的发现!最简单的方法之一就是浏览 ArXiv,找到你感兴趣的论文。考虑到它的广阔性,以及每周都有数十到数百个新发现被报道的事实,我的建议还是要深入细节,因为你需要解决不同的问题。你不可能掌握所有的事情,为了你自己的理智和精神健康,你应该按照自己的速度处理这些文件和新文件!
如果您有任何问题,或者如果您认为我遗漏了什么,我应该将它添加到列表中,请随时联系我!另外,请让我知道这是否对你有所帮助!
我对数据科学项目的思考——哪些可行,哪些不可行
吸取教训,这样你就可以避免同样的错误,更明智地投资你的时间。
在 Unsplash 上由 Brad Neathery 拍摄的照片
在过去的 5 年里,我一直在数据科学领域工作,为公司供应链领域的用户提供服务。我开发了各种仪表板和一些小型数据应用程序。部署的大多数解决方案仍在积极使用,而少数项目在开始时看起来很花哨,很有前途,但却未能扎根。
我思考了项目的本质,在这篇文章中,我想分享为什么我的一些项目成功了,而一些项目失败了的艰难原因。
让我先说说哪些方法行之有效。
- 观察一个业务痛点,然后填补空白 在供应链业务中,一个主要挑战是运营经理需要实时数据来指导他们的运营,几个小时的老化数据被视为无用。每天,分析师都会提取和编辑各种数据,以创建支持业务决策的指标。这些任务是重复的、手动的和不可持续的。我知道我们需要一种不同的方法来解决这个问题。经过一番研究,我开发并部署了一个集成的仪表板,它可以获取实时数据,并具有更丰富的洞察力。此外,仪表板是可重用的。这满足了每天需要快速实时指标的用户的渴望。
- 与流程负责人合作,实现基本任务的自动化 有许多成熟的业务流程,但缺乏创造性的执行方式。财务人员花费数天时间准备半年度预算;工程师每周花几个小时提取各种数据表,以估计仓库中的存储消耗。这些是保持业务运行的基本任务和必须做的活动的例子。工作人员可能不知道有更好的方法来执行任务。有几次,我与用户合作来自动化和简化这个过程。这改变了他们执行任务的方式。合作的结果令人满意,自动化帮助他们提高了工作效率。
- 将分散的数据组织成一个精简的数据库
有几次,我观察到我的同事在他们的电脑上创建了非常有用的数据表,用于特定的分析。在本地维护数据表没有错,我对数据集的潜力感到兴奋。我把数据集从电子表格转换成主流数据库。结果呢?更多的人利用数据集,更多的成功用例被创建。我已经将孤岛和独立形式的数据释放到一个简化的集成数据库中。我的观点是始终关注好的数据,将其转换为更系统、更可扩展的格式。这必然会将范围扩大到更广泛的受众,并且您已经走上了创建更强大的应用程序的正确道路。
另一方面,我并不总是那么幸运。我有几个没有小费的项目。归结起来有以下两个主要原因。
- 花哨的概念,但没有真正的商业案例 有几个项目,我想象它会很酷,没有太多的研究,我开始开发应用程序。在其中一个项目中,我花了三个月的时间开发一个供应链可视化工具。虽然这是真的,我设法让利益相关者惊叹,但从那以后我没有收到他们的回复。也有一些时候,一个商业伙伴向我提出了一个非常酷的概念,我花了几个星期开发原型。我们没能实现原型。事后看来,我已经痛苦地认识到,一个没有坚实的研究基础,主要基于想象的概念往往会失败。有时候,练好策略拖延症,多花点时间听听用户,了解他们的油漆点再急着做开发工作,不失为一个好策略。
- 过度工程化一个解决方案 我刚才说的是要永远听用户的,对吧?不是所有的时间。用户可能会想象一个很酷但不实用的功能。注意这种问。有一个项目,经过 3 天的改善讨论,我得到了一个很长的改进列表,我花了 3 个月来构建所有的功能。输出是一个由 14 个模块组成的集成仪表板,但很快我意识到在这 14 个模块中,用户只主动使用了其中的 5 个!我终于明白,虽然总是倾听用户是对的,但用户可能是错的!他们可能和你一样有“想象”综合症。不要太慷慨地接受一大堆请求,相反,要质疑他们提出的每一个功能。
最终想法: 要创建一个成功的数据科学项目,我经常发现最具挑战性的部分不是在开发阶段,而是在我们是否能够将工作付诸实施,以便目标受众开始采用解决方案。以下是我积累的重要经验。
- 识别业务痛点,然后填补空白
有时,用户不知道有更好的出路。多和他们聊聊,多去竞技场,把手弄脏。 - 利用现有的繁琐业务任务
与所有者合作改进流程。让所有者对解决方案负责,在幕后支持他们。 - 跟随数据
将分散的数据组织到一个更精简的平台通常是一种快速的胜利。数据越丰富,数据越完整越好。 - 不要幻想解决方案
了解用户面临的真正问题。不要因为看起来很酷就急于发展。 - 不要太慷慨地接受所有的请求
探查每一个改进,深入了解需求的根源,关注少数需求。
感谢你的阅读,我希望你会发现这些课程是有用的,并能够帮助你在未来更明智地投资你的时间。
我参加 TensorFlow 开发者认证考试的故事
我参加考试的总体经历,我是如何准备的,如果我不得不再次参加考试,我会做些什么。
克林特·帕特森在 Unsplash 上拍摄的照片
老实说,我不知道 TensorFlow 提供认证考试,直到我看到有人在 Twitter 上发布了关于它的推文。我做了一些研究,以了解更多关于考试的信息,我对自己说:这将是我探索机器学习世界之旅的下一个目标。
在这篇文章里,我想谈谈我参加 TensorFlow 开发者认证考试的亲身经历,以及我是如何备考的。希望这篇文章对近期有兴趣参加考试的各位有所帮助。
现在,在我讲述我的经历之前,有必要先谈谈 TensorFlow 开发人员认证考试到底是什么。
什么是 TensorFlow 开发者认证?
你可能已经知道,谷歌在 2015 年发布了一个名为 TensorFlow 的机器学习应用开源软件库。TensorFlow 是目前最受欢迎的深度学习库之一,它使您能够轻松地大规模构建和部署不同类型的深度学习模型。
TensorFlow 开发人员认证考试允许您展示您使用 TensorFlow 构建各种模型来解决不同类型的机器学习问题的实际技能。如果你看一下这个认证考试的考生手册,你很快就会知道,你将被要求解决与结构化数据或图像和文本等非结构化数据相关的问题。
由于这是一个使用 TensorFlow 的实践考试,因此它假设您已经知道浅层神经网络、深层神经网络、卷积神经网络和序列模型背后的一般概念。在考试期间,你应该用 TensorFlow 实现这些机器学习概念。
考试本身的费用是每次 100 美元,这意味着如果你没有通过考试,你需要为每次考试再次支付考试费。如果第一次考试失败,你可以在第一次考试 14 天后重考。如果你第二次尝试失败了,你需要等两个月才被允许做第三次尝试。
您将有 5 个小时的时间来解决 PyCharm 环境中的不同问题,在您结束考试后,您将通过电子邮件直接收到通知,无论您是否通过考试。如果你通过了考试,你的证书会在几天后发给你,三年后到期。
我为什么要参加认证
作为一个希望不断发展技能来解决不同类型的机器学习问题的人,毫无疑问 TensorFlow 是我经常使用的基本工具之一。
以参加 TensorFlow 开发者考试为主要目标的想法确实激励我不断发展如何利用 TensorFlow 解决机器学习问题的技能。此外,知道考试时会有时间限制,真的会让考试更有挑战性。我越是知道我的目标将会有多么具有挑战性,我就会越努力地为它做准备。
另一个优势是,如果你试图进入人工智能行业,拥有 TensorFlow 认证肯定会给你一个额外的证书,尽管我不能保证仅凭证书就足以让你进入人工智能。你可以在你的简历、LinkedIn 或 GitHub 中分享你的证书。
对考试有帮助的学习材料
现在您已经知道 TensorFlow 开发人员认证考试是什么,并且您可能想在不久的将来参加它。接下来,你可能想知道哪些学习材料会对你准备考试有所帮助。
嗯,这取决于你目前所知道的…
如果你已经知道了深度学习的大致概念,那么 Coursera 上的tensor flow in Practice Specialization就是你准备考试的最好方式。
如果你看一下考生手册中的技能清单,你会找到成功通过认证考试所需的相关技能。一开始看到技能清单可能会感到害怕,但是所有这些技能都包含在 TensorFlow 的实践专业化中。
参加 TensorFlow 实践专业化课程每月需要花费 49 美元,但实际上你可以免费旁听课程,你可以在 Google Colab 上获得学习材料和实用代码。在学习本课程时,尝试自己从头开始重新创建代码以最大化您的学习体验也很重要。
然而,如果你还不熟悉深度学习的一般概念,那么我推荐以下材料,让你在参加 TensorFlow 实践专业化之前快速掌握:
- 吴恩达深度学习专业化
- 用 Scikit-Learn、Keras 和 TensorFlow 进行机器学习,作者是 Aurlien GRon。
- CS231n:斯坦福大学用于视觉识别的卷积神经网络。
- CS224n:斯坦福大学深度学习的自然语言处理。
- Franois Chollet 的《深度学习 Python》,整本书你都可以在线免费阅读。
- 麻省理工 6。S191 深度学习介绍。
这些是我的首选资源,我发现从不同的资源和角度学习深度学习概念是有益的,因为它有助于巩固我的知识。
我发现在考试前你需要学习的另一件非常重要的事情是 TensorFlow 数据集。了解如何使用 tf.datasets 加载数据,更重要的是,了解如何对 tf.datasets 中的数据进行预处理,以便将它们输入到模型中。您可以在 TensorFlow 文档页面中了解更多信息。
我是如何准备考试的
我总共花了大约三周时间准备考试。
在前两周,我从 TensorFlow 的实践专门化中学习了所有材料,并从头开始重新创建了代码。
接下来,因为我们需要在 PyCharm 环境中进行考试,而我以前从未使用过 PyCharm,所以在考试前一周,我花时间学习了更多关于 PyCharm 的知识。我认为,如果您以前使用过 Spyder 等其他 Python IDE,那么熟悉 PyCharm 不会花费您太多时间。
本 TensorFlow 开发者认证文档中解释了安装考试所需 PyCharm 和插件的所有详细步骤。现在如果你想了解更多关于 PyCharm 的功能,那么我推荐以下材料:
在我熟悉了 PyCharm 并检查了所有必要的插件都可以正确安装之后,我在 PyCharm 环境中的 Practice Specialization 中重新创建了 TensorFlow 的代码,以确保运行代码时没有错误。
我参加考试的亲身经历
终于,考试日到了,2020 年 7 月 9 日…
要参加认证考试,您需要做的就是前往 TensorFlow 开发者认证网站的,并点击*“开始考试”*按钮。在那里,您需要提供您的 ID 和支付信息,以及设置您的考试环境。
一旦您完成付款,设置考试环境的所有步骤都将在一份机密的 PDF 文档中详细解释,因此您无需担心。
设置好所有的考试环境后,您可以选择点击*“开始考试”*按钮开始考试。一旦你点击那个按钮,5 个小时的计时器将立即启动,你需要在这段时间内完成不同的任务。
访问 GPU 是完成考试的必要条件吗?
现在你可能会问:你需要访问 GPU 才能完成考试吗?我的回答是:不一定。
我个人只在我的华硕笔记本电脑的 CPU 上训练了所有的模型,所以没有什么复杂的。直到现在我都不知道为什么我在考试的时候没有使用我在 Colab 上的免费 GPU 访问权限,我在考完试后才意识到这一点。但我想我们都经历过。
但这证明了一件事:你虽然没有 GPU,但也可以完成并通过考试。然而,如果你计划在你机器的 CPU 上训练你所有的模型,不要重复我的错误,我会告诉你我的错误是什么。
正如你从候选人手册中已经知道的,你需要在 5 个小时内解决不同的问题,每个问题都会比前一个问题更复杂。
我的错误是我按顺序解决问题,这意味着我先解决最简单的问题,然后再去解决更复杂的问题。这种方法没有错,但当我试图解决更复杂的问题时,我没有太多的时间来训练模型,尽管该模型在计算上比前一个问题更需要训练。
我已经用大约一个半小时完成了所有问题的编码部分,但是还有两个不同的计算密集型模型仍在同时训练。从那以后,基本上就是我的笔记本电脑 CPU 的处理能力和时间之间的竞赛了。
我,在只剩 30 分钟,模特还在训练的时候(来源: GIPHY )
幸运的是,所有的训练都在时间结束前完成了,它们在验证集中表现得非常好,所以一切都很好。
现在我要谈下一点…
如果我再参加一次考试,我会有什么不同的表现
如果我想完全用笔记本电脑的 CPU 来解决整个考试,那么我想先解决比较复杂的问题,然后再解决不太复杂的问题。
在不给出太多问题细节的情况下,包含卷积层以及 LSTM 或 GRU 层的模型当然会比另一个在计算上要求更高。如果你先解决更复杂的问题,那么你就有更多的时间来训练模型。如果复杂的模型没有你预期的那么好,你仍然有时间调整它并重新训练它。模型一训练好,就开始解决更简单的问题。
为了避免 CPU 和考试时间之间的竞争,我还想利用 Colab 免费访问 GPU。你可以用 Colab 解决问题,在那里用 GPU 训练模型,把训练好的模型复制到考试的目录下。任何可以访问 Google Drive 的人都可以免费使用 Colab,如果你想了解更多关于如何设置和使用 Colab 的细节,我推荐你阅读这篇文章。
你怎么知道你通过了考试?
考试结束后不久,您会收到一封电子邮件反馈,告知您是否通过了考试。
然而,你应该已经知道在考试期间你是否会通过。一旦你把每个问题的训练好的模型提交给评分员,你会马上得到反馈。
外卖食品
现在,您已经了解了 TensorFlow 开发者认证考试的所有必要内容,以下是一些要点:
- 如果你已经了解了深度学习的大致概念,那么 Coursera 上的《实践专精》中的 TensorFlow 就是最好的备考学习资料。
- 如果你还不熟悉深度学习的一般概念,那么我上面列出的学习材料将有助于你在参加 TensorFlow 实践专业化之前达到速度。
- 了解 TensorFlow 数据集以及如何对其进行预处理。
- 花点时间熟悉 PyCharm 环境,并尝试在 it 专业实践中重新创建 TensorFlow 的项目,以确保一切都完美运行。
- 如果你计划完全在你机器的 CPU 上完成考试,确保你合理地管理你的时间,先解决复杂的问题,再解决简单的问题。
- 您可以使用 Colab 上的免费 GPU 访问来优化考试期间的工作流程。
而这就是我参加 TensorFlow 开发者认证考试的亲身经历,以及我是如何通过的。我希望这有利于你们中任何一个想在不久的将来参加考试的人。如果你有问题,我很乐意帮助你。
我的 Tableau 仪表盘糟透了——直到我开始先画它们
为什么手绘仪表板可以培养更强的数据可视化技能,并更好地理解图形概念
一个简单的手绘仪表板的例子
我们都有过这样的经历——你正在浏览网页,突然发现一个你根本无法解读的表格或图表。在对它进行短暂的内部判断后,你继续你的一天,甚至忘记了它不久后就存在了。是因为图形实现不当而难以理解吗?有大量的信息吗?也许创作者根本没有做好用手头的数据讲一个故事?如果你不想开发易被遗忘的仪表板,先尝试手绘。
这个故事主要是针对最近的毕业生和那些开始发展这方面技能的人,但我希望任何人都能从中收集一些有用的见解。
该设置
众所周知,数据可视化是一项越来越受欢迎、需求越来越大的技能。在 LinkedIn 上简单搜索“数据可视化”会返回大量结果,通常来自那些希望创建引人注目的仪表板以向利益相关者、董事和客户展示的雇主。
没有比这更好的时间来提高你在这方面的能力了。可悲的是,能够创建准确和引人注目的仪表板是我见过的困扰无数学生和专业人士的事情。很多时候,人们似乎对寻找展示信息的最佳方式并不感兴趣,他们只是在寻找展示信息的任何方式。**
我先举一个例子来说明这个问题有多普遍。几个月前的早上 8 点,我坐在一个闷热的房间里,急于在研究生水平的可视化课程中与我的小组一起展示本学期的最后一个 Tableau 仪表板。我们整个学期都在学习如何有效地将数据传达给观众,然而当一批又一批的人来到我们面前时,每个人都展示了一个比一个更具误导性和设计不当的仪表板。只占 80%的饼状图和不小心实现的布局只是我们所接触到的问题的一小部分(后面还有更多例子)。
你可能不认为这个故事适用于你,但除非你坐下来,在用一些软件建模之前计划好每一个可视化,否则你可能已经成为这些问题的受害者之一。这可能是一件简单的事情,就像找不到一个更好的可视化方法,只差一步之遥。
可视化工具的陷阱
Tableau 之类的数据可视化工具受到人们的喜爱和使用,因为它们可以非常简单地显示大型数据集中的相关性。它们被使用的确切原因也是它们最大的缺陷。
在找到看起来可以接受的东西之前,简单地点击按钮太容易了。
让我们看一些例子。我重新创建了特定仪表板的一部分,这是我在我提到的课程的最终项目中回忆起来的,所有仪表板都与世界各地的新冠肺炎统计数据相关。请记住——这些是来自研究生水平课程的可视化。
每个单独的状态使用单独的一行
在本例中,每个州都绘制在一条单独的线上。这使得几乎不可能区分大部分的州,并导致整体上的草率外观。50 句台词重叠在一起很容易让观众不知所措,这一点很明显。令人失望的是,类似的图表在公共仪表盘上司空见惯,在各地年轻专业人士的投资组合中也随处可见。
另一个常见问题是这样的显示:
重叠的球体使得理解与每个数据点相关的地理区域变得困难
在本例中,数据最好用简单的热图来表示。使用热图不仅可以让你看到潜在的州边界,还可以使用阴影代替不同的球体大小。
热图可视化是显示区域数据的巧妙方式
再一次,这看起来像是曾经解释过的显而易见的事情,但是这是许多人挣扎的事情。创建合适的可视化的门槛比大多数人认为的要低得多。
那为什么人们最终会有这样的可视化效果呢?主要有两个原因。
Tableau 等数据可视化软件提供了可视化选定变量的建议。
推荐功能是一把双刃剑。它们可能非常方便和有用,但也可能阻止你找到更引人注目的图形。我经常看到我的同行使用推荐的图表,并表示“嘿,这给了我一个我可以使用的解决方案!”以为他们的工作已经完成了。他们没有意识到,工作不是找到解决方案,而是找到最佳解决方案**。**
第二个原因是,人们可能不太了解某种类型的图形或图表应该在什么情况下使用。
数据可视化软件在通知或促进学习方面作用不大,并且依赖于你已经知道何时使用某些类型的图表。
这会导致许多问题——折线图代替条形图,饼图相加不到 100%,等等。
谢天谢地,有一个简单的方法可以提高你在这两方面的技能。
成功素描
手绘仪表板有几个主要原因。
花时间手绘一个可视化需要你思考你实际上在做什么。
参考前面的例子,你会在彼此的上面手绘 50 条线吗?不。人类是懒惰的——你会很快停下来,对自己说:“嘿,如果不可能区分超过 2 或 3 条不同的线,那么这样做有什么意义。”同样,参照前面的第二个例子,你会在每个州周围画一个大圈来代表该州的新冠肺炎病例数吗?难道你不想找一种更简单的方式来表达你的信息吗?
只画了三个圆,很明显哪个图形更好理解。
就像我已经说过的,一旦解释清楚,这似乎是显而易见的,但是很多人都在为此而挣扎。整个研究生水平的课程之所以存在是为了教授人们这些技能,是因为它们并不像人们想象的那样显而易见。
手绘图表让常识占上风。手绘视觉效果的每一个细节都倾注了心血。
绘制可视化图形需要你思考 为什么 你要以某种方式建模。它迫使你对每一行、每一笔和每一处删除都进行思考。我可以整天坐在我的桌面上点击按钮,直到一些可接受的可视化出现,但是坐下来画画是最简单的方式来实际 思考 我想要如何可视化一些东西。正如我前面说过的,创建合适的可视化的门槛比你可能认为的要低得多。
此外,你不需要成为一名艺术家或做任何复杂的事情来从中受益。一些最简单的图表在你的会议或演示中可能是最有效的。
为了让广大观众理解,简单是王道。
让我们回顾一下之前关于小组陈述的趣闻。当我们正在决定在最后的报告中加入什么内容时,图书馆的网络突然中断了。这给我们留下了一个空白的白板,一些干擦记号笔,和我们的数据变量的笔记。
以下是一些例子:
勾勒出部分仪表板
我怎么强调都不为过——你不需要设计任何花哨的东西,这就是 Tableau 这样的工具存在的原因。即使你确实想拥有比铅笔素描更好的东西,也没有什么能阻止你加载一个预装的绘图应用程序,并制作一个看起来更整洁的显示器。你看到这一页最上面的图形了吗?用 MS Paint 大概花了 3 分钟。
手绘可视化可以帮助培养批判性思维和思考技能
当你画东西的时候,你有意识地对你正在做的事情做出决定。为什么我在这里使用条形图?为什么在那里使用散点图?我是否应该寻找另一种方法来可视化这些信息?这些是你应该问自己的问题。即使你不在乎答案,股东和雇主也需要准确、易懂的信息来推动商业决策。
绘制图表需要你有意识地对自己进行推理为什么你正在做出具体的决定,以及在每个选项之间进行权衡。这里的线图会不会太混乱了?我是否需要一个饼图来提供信息,或者我可以简单地在不同的区域添加一个百分比标签?能够思考你为什么要做决定是一项至关重要的技能,它适用于生活的每一个方面。
结论
当今的劳动力越来越需要数据可视化技能。
由于缺乏关于何时实现某些表或图的知识,人们很难进行数据可视化。
手绘图表有助于促进更强的数据可视化和批判性思维技能,因为它需要你有意识地坐下来思考你建模的一切。
如果你认为它有什么有趣的,不正确的,或者误导的——请随意回复,我可以修正它或者重新思考我的逻辑。我非常感谢那些花时间完整阅读这篇文章的人。
我的时间序列工具包
我选择的时间序列分析模型
说到时间序列预测,我坚信模型越简单越好。
然而,并非所有的时间序列都是一样的。一些时间序列具有明确的趋势,例如,我们经常在经济数据中看到这种趋势:
资料来源:美联储经济数据
其他的则显示出更稳定的模式,例如每月的航空乘客人数:
资料来源:旧金山公开数据
时间序列模型的选择在很大程度上取决于所处理的时间序列的类型。以下是我遇到的一些最有用的时间序列模型。
1.ARIMA
以我的经验来看,ARIMA 在建模有强烈趋势的时间序列时最有用。该模型还擅长模拟季节性模式。
我们举个例子。
假设我们希望对一段时间内每月的航空乘客数量进行建模。原始数据来源于三藩市公开数据。
这样的时间序列将有一个季节性的组成部分(例如,假日季节往往有较高的乘客人数)以及一个趋势的证据,当序列分解如下所示。
资料来源:RStudio
使用 ARIMA 模型的目的是捕捉趋势以及说明时间序列中固有的季节性。
为此,可以使用 R 中的 auto.arima 函数,该函数可以为模型选择最合适的 p,d,q 坐标以及适当的季节分量。
对于上述示例,就最低 BIC 而言,表现最佳的模型如下:
Series: passengernumbers
ARIMA(1,0,0)(0,1,1)[12]Coefficients:
ar1 sma1
0.7794 -0.5001
s.e. 0.0609 0.0840sigma^2 estimated as 585834: log likelihood=-831.27
AIC=1668.54 AICc=1668.78 BIC=1676.44
这是预测的图像。
资料来源:RStudio
我们可以看到,ARIMA 是充分预测的季节模式系列。就模型性能而言,RMSE(均方根误差)和 MFE(平均预测误差)如下:
- RMSE: 698
- MFE: -115
给定验证集内每月平均 8,799 名乘客,记录的误差与平均值相比非常小,表明该模型在预测航空乘客数量方面表现良好。
2.先知
让我们再来看一下空中乘客的例子,但是这次使用的是脸书的先知。Prophet 是一个时间序列工具,允许根据附加模型进行预测,尤其适用于具有强烈季节性趋势的数据。
航空乘客数据集似乎符合这个要求,所以让我们来看看这个模型与 ARIMA 相比表现如何。
在本例中,Prophet 可用于确定航空乘客数量的长期趋势,以及全年的季节性波动:
来源:Jupyter 笔记本输出
prophet_basic = Prophet()
prophet_basic.fit(train_dataset)
标准的 Prophet 模型可以自动选择趋势和季节成分,尽管这些也可以由用户手动配置。
Prophet 的一个特别有用的组件是包含了变点,或者时间序列中的重大结构突变。
来源:Jupyter 笔记本输出
通过反复试验,显示了 4 个变点来最小化 MFE 和 RMSE:
pro_change= Prophet(n_changepoints=4)
forecast = pro_change.fit(train_dataset).predict(future)
fig= pro_change.plot(forecast);
a = add_changepoints_to_plot(fig.gca(), pro_change, forecast)
RMSE 和 MAE 现在可以计算如下:
>>> from sklearn.metrics import mean_squared_error
>>> from math import sqrt
>>> mse = mean_squared_error(passenger_test, yhat14)
>>> rmse = sqrt(mse)
>>> print('RMSE: %f' % rmse)RMSE: 524.263928>>> forecast_error = (passenger_test-yhat14)
>>> forecast_error
>>> mean_forecast_error = np.mean(forecast_error)
>>> mean_forecast_error71.58326743881493
Prophet 的 RMSE 和 MFE 均低于使用 ARIMA 获得的结果,表明该模型在预测每月航空乘客人数方面表现更好。
3.张量流概率
在新冠肺炎事件之后,许多时间序列预测被证明是错误的,因为它们是在错误的假设下做出的。
越来越多的人开始认识到,能够产生一系列预测的时间序列模型可以得到更实际的应用,因为它们允许对未来可能发生的事情进行“情景分析”。
例如,使用上述航空乘客数据建立的 ARIMA 模型不可能预测到新冠肺炎导致的乘客数量的急剧下降。
然而,使用更多最近的航空乘客数据,让我们看看使用张量流概率建立的模型会如何表现:
来源:张量流概率
虽然该模型没有预测到最终发生的急剧下降,但我们确实看到该模型预测乘客数量将下降到低于 150,000 。使用这种模型可以进行更多的“假设”系列预测,例如,航空公司可以预测特定机场的每月乘客人数,并注意到乘客人数可能比平时低得多,这可以为公司管理资源(例如机队利用率)提供信息。
具体来说,张量流概率使用后验分布的假设进行预测,后验分布由先验分布(先验数据)和似然函数组成。
来源:图片由作者创建
作为参考,此处举例说明的示例使用了 TensorFlow Probability tutorial 中的结构化时间序列建模的模板,其原作者(版权 2019 tensor flow 作者)已经在 Apache 2.0 许可下提供了该模板。
结论
时间序列分析是关于使用适合数据的模型进行可靠的预测。对于具有确定趋势和季节性成分的数据,根据我的经验,这些模型工作得相当好。
希望你发现了上面这篇有用的文章,欢迎在评论区留下任何问题或反馈。
免责声明:本文是在“原样”的基础上编写的,没有任何担保。本文旨在提供数据科学概念的概述,不应以任何方式解释为专业建议。
我的 2019 年十大深度 RL 论文
引人入胜的一年的主要趋势和亮点
2019 年是深度强化学习(DRL)研究的一年,也是我作为该领域博士生的第一年。像每个博士新手一样,我不得不花大量时间阅读论文,实现可爱的想法&对大问题有所感悟。在这篇博文中,我想分享我在 2019 年文献中的一些亮点。
为了让这篇文章更有条理,我决定将论文分成 5 个主要类别,并选出一个冠军和一个亚军。事不宜迟,以下是我 2019 年的十大 DRL 论文。
免责声明:我没有阅读 2019 年以来的每一篇 DRL 论文(这将是相当大的挑战)。相反,我试图提取一些关键的叙事以及让我兴奋的故事。这就是我的个人十大——如果我错过了你最喜欢的论文,请告诉我!🤖🌏🧠
第一类:大型项目
Deep RL(例如 ATARI DQNs、AlphaGo/Zero)在 2019 年之前取得的大多数突破性成就都是在具有有限行动空间、完全可观察状态空间以及适度信用分配时间尺度的领域中取得的。部分可观测性、长时间尺度以及广阔的行动空间仍然是虚幻的。另一方面,2019 年证明,我们还远远没有达到将函数近似与基于奖励的目标优化相结合的极限。诸如《雷神之锤 3》/【夺旗】、《星际争霸 2》、《Dota 2》以及《机器人手操纵》这样的挑战仅仅凸显了现代 DRL 有能力应对的令人兴奋的新领域的一个子集。我试图根据科学贡献来选择第一类的获奖者,而不仅仅是现有算法的大规模扩展。每个人——只要有足够的计算能力——都可以用疯狂的批量进行 PPO。
🏆- DeepMind 的 AlphaStar (Vinyals 等人,2019)
“大规模 DRL 项目”类别的第一名是……”(插入一只手拿着麦克风笨拙地打开信封)+🥁:·deep mind 的 AlphaStar 项目,由 Oriol Vinyals 领导。在阅读《自然》杂志的论文时,我意识到这个项目在很大程度上是基于用于处理《雷神之锤 3》的 FTW 设置:将分布式 IMPALA 演员-学习者设置与诱导结构化探索的强大先验结合起来。
FTW 使用基于两个 LSTMs 的时间尺度层次的先验,而 AlphaStar 使用人类演示。专家演示用于通过监督最小化 KL 目标来预先训练代理的策略&提供有效的调整,以确保代理的探索行为不会被星际争霸的维数灾难淹没。但这绝对不是全部。科学贡献包括一个独特版本的优先虚构自我游戏(又名联盟)、一个带有指针网络的自回归分解策略、上行策略更新(UPGO——结构化动作空间的 V-trace 偏离策略重要性采样校正的演变)以及分散连接(一种特殊的嵌入形式,可保持地图层中实体的空间一致性)。就个人而言,我真的很欣赏 DeepMind,尤其是 Oriol Vinyals 对星际社区的关注。科幻小说常常使我们的认知偏向于认为 ML 是一场军备竞赛。但是它是人类为了提高我们的生活质量而创造的。
2️⃣ - OpenAI 的‘魔方求解’(open ai,2019)
众所周知,深度学习能够解决需要提取和处理高级特征的任务。另一方面,低水平的灵巧性,一种对我们来说如此自然的能力,为当前的系统提供了一个主要挑战。至少我们是这么认为的。OpenAI 的灵巧性努力中我最喜欢的贡献是自动域随机化(ADR ):在机器人任务上训练深度 RL 代理的一个关键挑战是将在模拟中学到的知识转移到物理机器人上。模拟器仅捕获现实世界中有限的一组机制&精确模拟摩擦需要计算时间。昂贵的时间&可以用于在环境中产生更多(但有噪声的)转换。已经提出了域随机化以获得稳健的策略。不是用一组生成环境的超参数在单个环境中训练代理,而是在大量不同的配置中训练代理。 ADR 旨在设计一个环境复杂的课程,以最大化学习进度。通过根据代理的学习进度自动增加/减少可能的环境配置的范围,ADR 为代理提供了一个伪自然的课程。令人惊讶的是,这(以及基于 PPO-LSTM-GAE 的政策)引发了一种元学习形式,而这种形式似乎还没有达到其全部能力(截至本文发表之时)。Twitter 上有很多关于“解决”这个词的讨论。该算法没有端到端地“完全”了解解决立方体&的正确移动顺序,然后进行所需的灵巧操作。但老实说,哪一个更令人印象深刻:在疯狂的回报稀疏的情况下进行手动操作,还是学习一个相当短的符号变换序列?Woj Zaremba 在 NeurIPS 2019 的“学习可转移技能”研讨会上提到,他们花了一天时间与 DRL &一起“解决立方体”,这表明完全端到端地完成整个哑谜是可能的。令人印象深刻。
第二类:基于模型的 RL
虽然前两个项目令人兴奋地展示了 DRL 的潜力,但它们的样本效率低得离谱。我不想知道电费,OpenAI & DeepMind 要交。好消息是,有人通过在潜在空间产生幻觉来提高样本(但不一定是计算)的效率。传统上,基于模型的 RL 一直在努力学习高维状态空间的动力学。通常,许多模型容量不得不“浪费”在状态空间的不相关部分(例如,ATARI 帧的最外部像素),这很少与成功相关。最近,有多种在抽象空间进行规划/想象的提议(例如,一个抽象 MDP )。这是我最喜欢的两种方法:
MuZero 提供了从 AlphaGo/AlphaZero 项目中移除约束的下一次迭代。具体来说,它克服了过渡动态的认可。因此,通用 MCTS +函数逼近工具箱对更通用的问题设置开放,例如基于视觉的问题(例如 ATARI)。
该问题被简化为预测奖励、价值和政策的回归,以及将观察映射到抽象空间的表示函数 h 的学习,动态函数 g 以及政策和价值预测器 f 。然后可以通过在给定嵌入观察的潜在空间中展开确定性动力学模型来进行规划。与之前一样,下一个动作是根据 MCTS 展示&与访问计数成比例的采样来选择的。使用 BPTT &对整个架构进行端到端训练,在低样本状态下,其性能优于 AlphaGo 和 ATARI 基线。有趣的是,能够模拟奖励、价值观政策似乎是有效计划所需要的。作者表示,潜在空间的规划也开启了 MCTS 在随机转变环境中的应用——如果你问我,我会觉得相当令人兴奋。
2️⃣ - 梦想家(又名。星球 2.0;哈夫纳等人,2019)
另一方面,梦想家提供了对连续行动空间的原则性扩展,能够基于高维视觉输入驯服长期任务。表征学习问题被分解为迭代学习表征、转换和奖励模型。通过使用想象的轨迹训练基于行动者-批评者的策略,整个优化过程是交错的。梦想家通过世界模型的想象轨迹传播学习状态值的“分析”梯度来学习。更具体地说,多步回报的随机梯度通过使用重新参数化技巧的神经网络预测被有效地传播。该方法在 DeepMind 控制套件中进行了评估,能够基于 64 x 64 x 3 维视觉输入控制行为。最后,作者还比较了不同的表征学习方法(奖励预测、像素重构&对比估计/观察重构),并表明像素重构通常优于对比估计。
第三类:多代理 RL
代理超越了简单的中央控制模式。我们的日常生活充满了需要预测和心理理论的情况。我们不断假设其他人的反应,并根据最近的证据重新调整我们的信念。通过梯度下降的简单独立优化容易陷入局部最优。这在一个由两个特工甘训练的简单社会中已经变得很明显了。联合学习导致了环境中一种形式的非平稳性,这是多智能体 RL (MARL)的核心挑战。两篇精选的 MARL 论文强调了两个中心点:从经典的集中训练+分散控制范式走向社会奖励塑造&自我游戏的规模化使用和意想不到的结果:
🏆- 【社会影响】作为内在动机(Jaques et al .,2019)
虽然传统的内在动机方法通常是临时的和人工定义的,但本文引入了一个因果概念,即通过由有影响力的行为产生的伪奖励来实现社会授权。关键的想法是奖励导致其他代理行为相对较大变化的行为。
因此,影响的概念是基于一种反事实的评估:如果我在这种情况下采取不同的行动,另一个代理人的行动会如何改变。边际和其他代理人的行动条件政策之间的 KL 差异可以被视为社会影响的一个衡量标准。作者在一组连续的社会困境中测试了提出的内在动机公式,并为增强的紧急协调提供了证据。此外,当允许向量值通信时,社会影响奖励成形导致信息&稀疏通信协议。最后,他们通过让代理学习预测彼此的行为,一种心理理论的软版本,来摆脱对其他代理策略的集中访问。
2️⃣ - 自动课程&紧急工具使用(OpenAI,2019)
严格来说,OpenAI 的这项工作可能不会被视为一个纯粹的泥灰文件。有一个基于 A3C-PPO-LSTM-GAE 的中央控制器,而不是学习一组分散的控制器。尽管如此,训练是通过多智能体自我游戏和你能想象到的最简单的奖励来进行的:在多智能体捉迷藏游戏中生存。作者展示了这样一个简单的奖励结构如何与自我游戏相结合,可以导致比内在动机更有效的自我监督技能习得。用作者的话说:
“当一个新的成功策略或突变出现时,它会改变邻近代理需要解决的隐含任务分配,并产生新的适应压力。”
这种自主课程的出现和显性策略的区分最终导致了意想不到的解决方案(比如在物体上冲浪)。代理人经历了 6 个不同阶段的主导策略,其中的转变是基于与环境中的工具的相互作用。由于基于团队的奖励,隐藏者学会了分工。最后,关于大规模实施的一些有趣的观察:
- 在 MARL 中训练中央控制器时,大批量是非常重要的。它们不仅显著地稳定了学习,而且允许更大的学习速率和更大的时期。
- 根据对所有代理的状态观察来调节评论家,能够向行动者提供更强有力的反馈信号。这是洛等人(2017) 在马-DDPG 的论文中已经做出的观察。
第四类:学习动力
深度学习中的学习动力仍远未被理解。与监督学习不同,在监督学习中,训练数据在某种程度上是给定的,并被视为 IID(独立且同分布),RL 需要一个代理来生成他们自己的训练数据。这可能导致显著的不稳定性(例如致命三和弦),这是任何玩弄 dqn 的人都会经历的。仍然有一些围绕新发现的重大理论突破(如神经正切核)。动态类别的两个获奖者强调了基于记忆的元学习(比 RL 更普遍)以及基于策略的 RL 的基本特征:
🏆——非交错元学习者动力学(Rabinowitz,2019)
最近,在理解深度学习的学习动力学方面有了一些进展&随机梯度下降。其中包括关于交错任务发现的发现(如 Saxe et al .,2013;拉哈曼等人,2018 。理解元学习的动力学(例如,王等,2016 ) &另一方面,外环和内环学习之间的关系仍然是虚幻的。本文试图解决这一问题。
作者从经验上证明了元学习内环经历了非常不同的动态。**元学习者不是顺序地发现任务结构,而是同时学习整个任务。**这让人想起贝叶斯最优推理&为元学习&经验贝叶斯之间的联系提供了证据。因此,外部学习循环对应于在内部循环期间学习用于快速适应的最佳先验。每当系统的实际学习行为很重要时(例如,课程学习、安全探索以及人在回路中的应用),这些发现都很重要。最后,它可能有助于我们设计出允许快速适应的学习信号。
2️⃣ - 射线干涉(Schaul et al .,2019)
光线干扰是在(多目标)深度 RL 中观察到的一种现象,当学习动力学通过一系列平台时。这些学习曲线步骤的转变与交错的发现相关联(&忘却!)和路径是由学习和数据生成的耦合引起的,这种耦合是由于政策上的展开而产生的,因此是一种干扰。这限制了代理一次学习一件事,而对单个上下文的并行学习将是有益的。作者推导出一个分析关系的动力系统,并显示了鞍点过渡的联系。实证验证是在情境强盗上进行的。我很想知道在经典的基于策略的连续控制任务中,干扰问题有多严重。此外,我个人对这可能与基于群体的训练(PBT)等进化方法的关系感到特别兴奋。作者指出,PBT 可以抵御这种有害的政策影响。PBT 不是训练单个代理,而是并行训练具有不同超参数的群体。因此,合奏可以产生多种多样的体验,这些体验可以通过群体成员的多样性来克服高原。
第五类:合成和先验
获得有效且快速适应的代理的一种方法是知情的先验。代理可以依赖先前以先验分布形式提取的知识,而不是基于非信息知识库进行学习,但是如何获得这样的知识呢?下面两篇论文提出了两种不同的方法:同时学习目标不可知的默认策略&学习能够表示大量专家行为的密集嵌入空间。
🏆-KL-正则化 RL 中的信息不对称(Galashov et al .,2019)
作者提供了一种在学习问题中利用重复结构的方法。更具体地,默认策略的学习是通过限制默认策略接收的状态信息(例如,外部对本体感受)来实施的。KL 正则化的预期回报目标然后可以被重写,使得计算代理的策略和接收部分输入的默认策略之间的差异。然后,通过在代理策略的梯度下降更新(标准 KL 目标-正则化)和默认策略(给定代理策略轨迹的监督学习-提取)之间交替进行优化。
在几个实验中表明,这可能会导致在稀疏奖励环境中的可重用行为。通常 DeepMindLab 的大动作空间是被一个人类的先验(或者偏见)缩小了。作者表明,这可以通过学习一个约束行动空间的默认策略来规避&从而降低探索问题的复杂性。可以表明,存在各种连接到信息瓶颈的想法,以及学习生成模型使用变分 EM 算法。
2️⃣ - NPMP:神经概率运动原语(Merel et al .,2019)
少击学习一直被认为是智力的关键。这需要大量的归纳&我们人类一直在这样做。实现这种灵活性的一种机制是子程序的模块化重用。因此,在电机控制文献中,已经讨论了一组可以有效重组和整形的电机原语/默认值。在今天帖子的最后一篇论文中,Merel 等人(2019)将这种直觉投射到深度概率模型领域。作者介绍了一种具有潜在变化瓶颈的自动编码器架构,以在潜在嵌入空间中提取大量专家策略。重要的是,专家策略不是任意的预先训练的 RL 代理,而是 2 秒钟的动作捕捉数据片段**。他们的主要目标是提取不仅能够对行为的关键维度进行编码,而且在执行过程中也容易回忆起来的表征。该模型归结为一个状态条件行动序列的自回归潜变量模型。给定当前历史和一个小的前瞻片段,模型必须预测实现这种转换的动作(也称为逆模型)。因此,该动作可以被认为是未来轨迹和过去潜在状态之间的瓶颈。考虑到这样一个强大的“运动原语”嵌入,我们仍然需要获得学生策略。Merel 等人(2019 年)反对行为克隆的观点,因为这往往导致样本效率低下或不稳健。相反,他们将专家概念化为围绕单一名义轨迹的非线性反馈控制器。然后,他们记录每个动作-状态对的雅可比矩阵,并优化扰动目标,这类似于一种去噪自动编码器。他们的实验表明,这能够提取 2707 个专家&执行有效的一次性转移,从而产生平滑的行为。**
结论
总而言之,2019 年凸显了深度 RL 在以前无法想象的维度中的巨大潜力。突出显示的大型项目仍然远非样本高效。但是这些问题正在被当前寻找有效的归纳偏差、先验和基于模型的方法所解决。
我对 2020 年即将到来的事情感到兴奋&我相信这是一个在这个领域工作的绝佳时机。存在重大问题,但一个人所能产生的影响也是相当大的。没有比现在更好的生活时机了。
原载于 2020 年 1 月 14 日https://roberttlange . github . io。**
我设计熊猫数据框架的 4 大功能
为什么你需要设计你的熊猫数据框架,以及如何去做
paweczerwi ski 在 Unsplash 上的照片
熊猫数据框架是数据科学家分析数据时最常用的对象。虽然主要功能只是放置数据并进行分析,但我们仍然可以为多种目的设计数据框的样式;即对于呈现数据或更好的美观。
让我们以一个数据集为例。我会使用 seaborn 提供的“行星”数据进行学习。
#Importing the modules
import pandas as pd
import seaborn as sns#Loading the dataset
planets = sns.load_dataset('planets')#Showing 10 first row in the planets data
planets.head()
我们可以像下面这样设计我们以前的熊猫数据框。
它现在看起来很丰富多彩,因为我把所有的东西都放在里面,但我会把我最喜欢的一些东西分解开来。这里有 4 个函数来设计我在日常工作中经常使用的熊猫数据框对象。
“虽然主要功能只是放置数据并进行分析,但我们仍然可以为多种目的设计数据框的样式;即为了呈现数据或更好的美感
1。隐藏功能
有时当你做分析并向他人展示结果时,你只想展示最重要的方面。我知道当我向非技术人员展示我的数据框时,问题通常是关于他们默认数字中的索引,例如“这是什么数字?”。出于这个原因,我们可以尝试用下面的代码隐藏索引。
#Using hide_index() from the style function
planets.head(10).style.hide_index()
就这样,我们隐藏了我们的索引。这是一件简单的事情,但在工作环境中,我知道有时会成为一个问题。只是多了一个成为问题的栏目。
此外,我们可以尝试用链接方法隐藏不必要的列。假设我不想显示“方法”和“年份”列,那么我们可以用下面的代码编写它。
#Using hide_columns to hide the unnecesary columnsplanets.head(10).style.hide_index().hide_columns(['method','year'])
2。高亮功能
有时,我们希望展示我们的数据框架,只突出显示重要的数字,例如最高数字**。在这种情况下,我们可以使用内置方法,用下面的代码突出显示它。**
#Highlight the maximum number for each columnplanets.head(10).style.highlight_max(color = 'yellow')
在上面的数据框中,我们用黄色突出显示了每列中的最大数量。如果您想突出显示最小数字而不是**,我们可以使用下面的代码。**
planets.head(10).style.highlight_min(color = 'lightblue')
如果你想连锁,我们也可以这样做。
#Highlight the minimum number with lightblue color and the maximum number with yellow colorplanets.head(10).style.highlight_max(color='yellow').highlight_min(color = 'lightblue')
实际上,您可以突出显示每一行中的最小或最大数量,而不是每一列。我在下面的代码中展示了它。****
#Adding Axis = 1 to change the direction from column to rowplanets.head(10).style.highlight_max(color = 'yellow', axis =1)
正如我们所看到的,现在改变轴是没有用的,因为它没有突出任何重要的信息。在每一列彼此差别不大的情况下,它会更有用。
另外,我们可以用下面的代码突出显示空值。****
**#Higlight the null valueplanets.head(10).style.highlight_null(null_color = 'red')**
3。渐变功能
在展示您的数据时,我们也可以使用所有信息作为展示数据的主要方式。我经常用一种背景颜色来显示数据,以突出哪个数字在较低的区域,哪个数字在较高的区域。让我们通过下面的代码来使用这个例子。
**#Gradient background color for the numerical columnsplanets.head(10).style.background_gradient(cmap = 'Blues')**
使用 background_gradient 函数,我们可以将数据框着色为渐变。颜色取决于 cmap 参数,该参数从 matplotlib 库中接受颜色图。
我们也可以使用条形图作为我们的渐变背景色。让我在下面的例子中展示一下。
**#Sort the values by the year column then creating a bar chart as the backgroundplanets.head(10).sort_values(by = 'year').style.bar(color= 'lightblue')**
正如我们在上面看到的,我们现在用一种不同于 background_gradient 函数的方式从最低到最高高亮显示数字。我们还可以看到,由于排序函数的原因,索引是无序的;正如我在上面的文章中告诉你的那样,最好隐藏索引。
4。自定义功能
如果您希望对数据框的样式有更具体的要求,您实际上可以这样做。我们可以将样式函数传递给以下方法之一:
Styler.applymap
:元素方面Styler.apply
:列/行/表格方式
这两种方法都采用一个函数(和一些其他的关键字参数),并以某种方式将我们的函数应用于数据帧。假设我有一个阈值,任何低于 20 的数字都应该被涂成红色。我们可以通过使用下面的代码来实现。
**#Create the function to color the numerical value into red colordef color_below_20_red(value):
if type(value) == type(''):
return 'color:black'
else:
color = 'red' if value <= 20 else 'black'
return 'color: {}'.format(color)#We apply the function to all the element in the data frame by using the applymap functionplanets.head(10).style.applymap(color_below_20_red)**
就像这样,每一个小于或等于 20 的数字都会被涂成红色,其余的都是黑色。
结论
我已经展示了在设计我们的数据框时要使用的前 4 个函数;隐藏功能。我们可以设计数据框的样式来展示我们的数据,或者只是为了更好的美观。如果您想了解更多关于我们如何设计数据框样式的信息,您可以在此处阅读。
如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的简讯。
如果您没有订阅为中型会员,请考虑通过我的介绍订阅。
我的 5 大熊猫数据操作功能
作为数据科学家,了解您的熊猫图书馆功能库
沙哈达特·拉赫曼在 Unsplash 上拍摄的照片
作为一名使用 Python 作为主要语言的数据科学家,我们知道熊猫图书馆在我们的日常生活中是不可分割的。从你开始使用 Python 学习数据科学直到你的职业生涯,了解熊猫提供的每一件小事都不会伤害你。虽然,有一些函数我比其他的更经常使用来操作我的数据。
请注意,DataFrame 和 Series 函数甚至会在应用数据操作函数之前使用,所以我不会解释这些函数。
以下是我在日常工作中经常使用的 5 个熊猫功能。
熊猫功能
根据你工作的需要,有许多熊猫的功能是有用的,尽管有些可能比其他的用得更多。在这里,为了向您展示我经常使用的函数,我将使用 seaborn 模块(可视化库,但我只使用它来获取数据)中的 mpg 数据集。
import pandas as pd
import seaborn as snsmpg = sns.load_dataset('mpg')
来自 seaborn 模块的 mpg 数据集
现在,让我们进入要点。
1.交叉表
crosstab 是一个熊猫函数,用于计算两个(或更多)因素的交叉列表。如果你不知道什么是交叉列表,让我用一个例子给你看。
pd.crosstab(index = mpg['origin'], columns = mpg['model_year'])
双因素交叉列表示例
以上是交叉列表的一个例子。数据本身仍然是 DataFrame 对象。我们从数据集的类别变量中指定表的索引和列;在我的例子中,我使用“origin”和“model_year”类别变量。默认情况下,crosstab 函数会计算因子的频率,并显示在交叉表中。虽然,我们可以通过引入另一个因素来改变它,这个因素通常是一个连续变量。
pd.crosstab(index = mpg['origin'], columns = mpg['model_year'], values = mpg['mpg'], aggfunc = 'mean')
以连续变量为另一因素的交叉制表
上面,如果我们将“mpg”变量添加到值中,并将 aggfunc 参数设置为“mean ”,我们将获得交叉列表,其中“mpg”的平均值由类别分隔。它类似于我们称之为数据透视表的熊猫函数 pivot_table 可以实现类似的结果。
2.切口
Pandas cut 函数用于将连续值宁滨成离散区间。当我们需要对连续值进行分段和分类时,我们使用 cut。你不知道宁滨是什么;是把连续值放入某个范围区间的过程。最好用直方图来描述。
mpg['mpg'].hist()
直方图示例
这里,我们将连续值输入到某个范围间隔中,并创建箱。每个条形显示落入这些区间的值,条形越高,频率越大。
范围间隔取决于箱的数量。例如,如果我们有一个最小值为 10、最大值为 45 的连续变量,并且我们想要创建 10 个区间,那么范围间隔将是**(最大-最小)/区间**。这意味着(45–10)/10 = 3.5。因此,第一个容器将由 10 到 13.5 之间的连续值填充,依此类推。
这个函数对于从连续变量到分类变量也很有用。例如,cut 函数可以将年龄转换为年龄范围组。让我们用一个数据集例子来展示这个函数。
pd.cut(x = mpg['mpg'], bins = 4, labels = [1,2,3,4])
在上面的函数中,我将 bins 参数设置为 4,因为我希望获得 4 个类别,标签设置为 1、2、3 和 4。cut 函数的输出将是一个包含所有连续值的序列,这些连续值已被入库并转换为可接受的类别。这是我将它放入数据框后的样子。
mpg['mpg_bin'] = pd.cut(x = mpg['mpg'], bins = 4, labels = [1,2,3,4])
mpg[['mpg', 'mpg_bin']]
3.qcut
在熊猫身上,我们有 cut 功能,我们也有 qcut 功能。与 cut 函数类似,我们将宁滨作为连续变量,但在 qcut 函数中,基于等级或基于样本分位数,仓位大小将相等。分位数基本上是一种以相等方式划分连续值的除法技术。例如,如果我们将连续值分为 4 部分;它将被称为四分位数,如下所示。
让我用一个代码示例向您展示。
pd.qcut(x = mpg['mpg'], q = 4, labels = [1,2,3,4])
以上是 qcut 函数的输出。这里我将 q 参数输入为 4,将连续值分成四分位数,并用 1、2、3 和 4 标记它们。与 cut 函数相比,结果是不同的,因为它们的计算已经不同。让我也把它放到数据框中,这样我们就可以看到结果的不同。
mpg['mpg_qcut'] = pd.qcut(x = mpg['mpg'], q = 4, labels = [1,2,3,4])
mpg[['mpg', 'mpg_bin','mpg_qcut']]
4。get_dummies
该函数用于通过对分类变量进行一次热编码,将分类变量转换为数字变量。对于不知道 One-Hot-Encode 是什么的人来说,这是一个从我们的分类变量创建新列的过程,其中每个类别都成为一个新列,值为 0 或 1 (0 表示不存在,1 表示存在)。
为什么我们要把分类变量转换成数值变量?这是因为许多统计技术或机器学习方程只接受数值而不是类别值。
让我用一个代码示例向您展示我所说的内容。
上面是 mpg 数据集中的“原点”变量。它是具有 3 个基数的分类变量(“美国”、“欧洲”和“日本”)。这里我将使用 get_dummies 函数对这个变量进行一次热编码。
origin_dummies = pd.get_dummies(mpg['origin'])
origin_dummies
就像这样,我们已经得到了 3 个新列,每个类别成为一个新列,值为 0 或 1。
5.串联
我最常用的数据操作函数是 concat 函数。这个函数就像它所调用的那样;它串联起来。但是,这个函数连接了什么呢?它连接 pandas 对象(系列或数据帧)。让我给你看一个例子。比方说,我只想让“mpg”列显示我刚才创建的 origin_dummies 变量。
pd.concat(objs = [mpg['mpg'], origin_dummies], axis = 1)
使用 concat 函数,我只是将两个 pandas 对象(系列和数据帧)组合成一个数据帧。在函数中,我将轴参数指定为 1,因为我想组合熊猫对象,使列看起来像并排粘在一起。这个轴参数只接受 2 个东西;0 或 1。根据您想要连接 pandas 对象的方式,如果您想要像堆叠对象一样连接 Pandas 对象(像添加新行一样连接对象),请将它设置为 0;如果您想要对象相对于索引并排,请将它设置为 1。
如果我们将轴设为 0,会发生以下情况。
pd.concat([mpg['mpg'], origin_dummies], axis = 0)
我们现在可以看到,我们的数据框中有 796 行和许多 NaN 对象。发生这种情况是因为我们连接了 Pandas 对象,但是当我们设置它时,我们堆叠了该对象,不是所有的列名都存在于任一对象中,所以它用 NaN 值填充了先前不存在的列。
结论
这篇文章向你展示了我经常使用的前 5 个熊猫的数据操作功能。这些功能是:
- 交叉表
- 切口
- qcut
- 获取 _ 假人
- 串联
希望有帮助!
如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的简讯。
如果您没有订阅为中等会员,请考虑通过我的介绍订阅。
我的五大数据科学可视化工具
以及如何为您的受众选择合适的工具
罗伯特·卡茨基在 Unsplash 上的照片
还记得很多年前我刚开始职业生涯的时候,团队里的标准可视化工具是 Excel 图表。我们花了很多时间进行手工处理,没有多少时间来寻找见解或提出建议。在过去的十年中,我们已经看到了无数现代工具在数据可视化方面的兴起。科技已经取得了长足的进步。
在本文中,我将首先列出我的 5 大数据科学可视化工具,然后根据您的受众解释何时使用它们。
1.擅长
Excel 在任何地方都被每个人使用。我从未遇到过没有使用过 Excel 的分析专家。信不信由你,即使在今天,一些数据科学家仍在日常工作中主要使用 Excel。
Excel 的好处是显而易见的:它无处不在。如果你想和某人分享一份工作,你永远不需要担心他们是否能打开文件。
此外,像在这里或那里调整数字这样的特别任务非常容易。一切都很透明。你可以清楚地看到每个细胞在做什么。
因为这两个优势,相信 Excel 在可预见的未来还是有它的一席之地的。
2.(舞台上由人扮的)静态画面
我大约在 7 年前开始使用 Tableau。我们必须为它建立一个商业案例,因为它不是免费的。它值这个价钱吗?肯定!
以下是我在 Tableau 中可以轻松完成但在 Excel 中无法完成的一些事情:
- 想到一个想法,并立即在几个拖放动作和几个点击中将其可视化。
- 将变量级别分组(例如,将年龄变量分为 0-18、19-25…组),并将结果立即反映在所有图表中。如果您在 Excel 中有很多图表,您会喜欢这个特性。
- 动画。如果使用得当,这些图表可以传递静态图表所不能传递的强有力的信息。
Tableau 还有很多其他特色。例如,您可以构建交互式仪表板,并让许多其他用户可以使用它们。这就是你如何减少 BI 团队的工作量,让人们自给自足,而不是每次有小事情需要改变时就来找你帮忙。
对我来说,主要的用例是探索性的数据分析。在我看来,在这方面没有什么比 Tableau 更好的了。
为了了解 Tableau 能够提供什么,这里是我最近为冠状病毒爆发制作的数据可视化:
确诊病例——Mainland China 境外
medium.com](https://medium.com/@zemingyu/state-of-the-coronavirus-outbreak-in-10-charts-and-key-findings-721f62c08a9e)
3.功率 BI
在很多方面,Power BI 与 Tableau 相似。我可能有偏见,但是用了一段时间后,我发现在某些领域用户体验不如 Tableau。
例如,如果你想对图表中的一个变量重新排序,你需要创建一个自定义的顺序,这将在下面的教程中通过 11 个截图来解释。在 Tableau 中,这可以通过拖放在 1 到 2 个步骤中完成,为您节省大量时间。
在你开始研究 Power BI 中任何太酷的东西之前,有必要先了解一个理想的传说。当使用 Power BI 来…
www.seerinteractive.com](https://www.seerinteractive.com/blog/reorder-powerbi-legend/)
话虽如此,我认为 Power BI 在仪表板方面做得更好,最重要的是,有一个免费的桌面版本(它不允许与您的团队协作,但对于一个用户来说往往足够好)。
如果您没有预算,但仍想提高效率,Power BI 就是答案。
4.Plotly
如果你懂 R 或 Python,你可以从 Plotly 提供的丰富的交互式图表中获益。你可以在 Tableau 中制作的大多数图表都可以在 Plotly 中复制。
你可能想知道:
“如果我有 Tableau 或 Power BI,为什么我需要 Plotly”?
答案是可扩展性。
假设您正在按季度监控保险投资组合的业务组合。有 20 个不同的分类变量,包括地区、产品、性别等。
假设你很熟练,每张图表需要你 2 分钟来完成。也就是 2*20=40 分钟。
使用 Python 和 Plotly 做这件事是不同的。你可能需要花 10 分钟为你的第一个图表写代码。(是的,编程比拖放更难!)
接下来,花 5 分钟编写一个循环,为 20 个变量中的每一个创建一个图表。总共是 10 + 5 = 15 分钟。
有了循环的的好处,工作量的增长远小于 20 倍。此外,您现在可以保存代码并在将来的项目中重用它。
我通常在 Jupyter 笔记本上使用 Plotly,这样我就可以和同事们分享了。
5.破折号
假设你已经建立了一个机器学习模型来预测每份保单的盈利能力。您希望公司的每个保险商在日常工作中使用该模型,而不是将它放在硬盘上积灰。为此,您可以构建一个基于 Dash 的 web 应用程序。
这里有另一个你可以用 Dash 构建的例子:利用历史终极格斗冠军赛(UFC)的比赛结果,陈柏宇构建了一个机器学习模型来预测未来的比赛结果。Jason 没有止步于此,而是将模型部署给所有人使用。
[## UFC MMA 预测器
编辑描述
ufcmmapredictor.herokuapp.com](https://ufcmmapredictor.herokuapp.com/)
注:如果你喜欢 R 胜于 Python,你应该试试 R Shiny 。
如何为您的受众选择合适的工具
看过 5 大可视化工具后,你可能会想在每个用例中使用最先进的解决方案( Dash )。
这就像看到了深度学习的预测能力,你可能会忍不住把其他所有技术都扔进垃圾箱,把深度学习用于你做的每个项目。
这是一个非常糟糕的方法。
我们需要考虑我们的受众,定制我们的可视化方法来满足他们的需求。把他们分成几个不同的组可能会有帮助。
第一组高级管理人员
这些人是组织的关键决策者。他们没有很多时间。他们更关心见解和建议,而不是技术细节。他们的大脑总是在寻找这些问题的答案:
发生什么事了?
为什么会这样?
我们应该做什么,我在冒什么风险?
对他们来说,我认为最好的可视化方法是把几张幻灯片放在一起,直接回答这些问题。
您可以使用 Tableau 或 Plotly 甚至 Excel 来创建图表。没关系。重要的是你需要直接简洁地回答关键问题。否则,你的观众将会脱离,这意味着你的努力没有转化为行动,被浪费了。
第二组操作人员
这些人使用你的工具。让我们看看保险行业的一些例子:
- 对于承保人来说,你可以建立一个交互式仪表板,这样他们就可以评估他们承保的每一项商业地产风险。
- 对于索赔调查人员,您可以构建一个交互式欺诈评分 web 应用程序,为高风险索赔提供警告。
在保险行业之外,你可能会有自行车共享平台的维修人员,他们在交互式仪表盘上回复,找到附近的坏自行车,进行收集和检查。
关于工具,如果您的组织已经投资了 Power BI 或 Tableau,那么遵循现有的方法是有意义的。
如果你想从头开始构建一些东西,并充分利用其灵活性,你可以使用 Dash。
第 3 组分析专家
对于这一群人,我更喜欢用 Jupyter 笔记本来交付 Plotly 图形。
我喜欢它们,因为我可以轻松地提供可重复的分析。包括代码、输出和图表在内的一切都在一个地方,这使得人们很容易进行同行评审。
对于简单的特别分析,我也广泛使用 Tableau 和 Excel。
第四组其他利益相关者
虽然上述 3 个群体通常代表最重要的利益相关者,但偶尔您可能会遇到不属于这些群体的利益相关者。
如果他们是技术人员,你可以遵循与第三组相同的方法。如果是非技术类的,Excel、Tableau 或者 Power BI 可能是不错的选择。只要确保你的观众能接触到软件并知道如何使用它。
结论
我们已经看到了数据科学五大可视化工具的优缺点。
没有哪一种工具能主宰所有其他工具。但是,对于给定的受众,有些工具比其他工具更合适。
作为数据科学家,我们花了很多时间研究数据和构建模型,但我们花了足够的时间考虑我们的利益相关者吗?他们是谁?他们的技术能力如何?我们如何以最吸引他们的方式交付结果?
为了释放数据科学的全部力量,我们需要尽最大努力将数据驱动的建议转化为现实世界的行动——无论是让产品线更有利可图,还是捕捉更多欺诈案件或实现收入最大化。
要做到这一点,我们必须从仔细研究我们的受众开始,选择最适合他们的传播方式。
我对疫情时代求职的两点看法
办公时间
最近,经过 5 个月的求职,我在亚马逊找到了一个 ML SDE II 的角色(是的!5 个月!所以振作起来!).这篇文章的唯一目的是给你希望,提示和工具,为自己找到一个好的。我知道这很难,但这是可能的。我有一个,你也会有!
我会建议一种更符合人体工程学的姿势和更少的咖啡因 [## 我作为数据工程师学到的 6 个最佳实践
以及作为数据科学家如何应用它们
towardsdatascience.com](/6-best-practices-i-learned-as-a-data-engineer-9d3ad512f5aa) [## 数据科学家如何像数据工程师一样解决 ETL 问题
常见原因及其处理方法
towardsdatascience.com](/how-to-troubleshoot-etl-issues-like-a-data-engineer-d761f7d361d4)
我非常规的数据科学和分析之旅
利用你现有的技能。
图片来自皮克斯拜
你好。我叫安吉拉。我从 2013 年开始从事数据科学和分析领域的工作。我在这个领域的道路相当不寻常,但是,我仍然在这里取得了成功,并且每天都在继续大步前进。我想与你分享我是如何选择这个领域的,并展示我的技能是如何与我现在的位置相辅相成的。
如果你有兴趣在数据科学和分析领域工作,你的多学科技能可以作为你的优势。我坚信,数据科学和分析领域将随着技能、人员和背景的多样化而蓬勃发展。随着我们日益成为一个数据驱动的社会,我们需要不同的技能来共同解决不同的问题。学习技能,练习手艺,加入我们吧。
让我们从头开始…
图片来自 Pixabay 的 Fathromi Ramdlon
本科
犯罪学
很久以前(2005-2008 年),我是新墨西哥大学犯罪学的本科生。在学习期间,我学习了社会学和犯罪、越轨行为之间的联系,并用手进行统计计算。在我的顶点课上,我们用 SPSS 分析了犯罪数据——这是我第一次真正接触数据分析,远在数据分析流行之前。我选择犯罪学是因为我被这段时间流行的过多的犯罪调查节目所吸引。我确信我想成为一名联邦调查局特工或调查员。我一点也不知道,我最终会成为一名数据调查员!
💡获得/发展的技能:
- 批判性思维
- 求知欲
- 数据分析
- 统计分析
- 耐心(对过程、自己和他人)
- 考虑他人(我学会了考虑他人观点的基本原则,在研究中,有时观点不同。)
研究生教育
公共管理
犯罪学毕业后,我决定立即在新墨西哥大学攻读公共管理硕士学位。我觉得这个学位会很有意思,是进入公共部门工作的一个开端。这个项目是我第一次真正接触到评估同行评议的期刊文章、分析数据、与他人合作以及发表演讲。强调团队合作和大量的小组项目。在攻读学位期间,我选修了与法律、社会学、人力资源和预算相关的各种课程。我不是一个有天赋的演说家,这是我至今仍需要努力的地方。但很高兴我有这样的经历。
💡获得/发展的技能:
- 团队合作
- 评估同行评审期刊和信息
- 数据分析
- 公开演讲
- 主动倾听
- 恭敬的辩论
- 撰写有效的文档
信息技术
完成公共管理教育后,我搬到了南加州。我觉得我想探索技术领域的职业生涯。在此期间,我开始从事技术性更强的工作,因为对这些技能的需求越来越强烈。我听到越来越多关于数据分析和 python 编程能力的说法。经过一番思考和反思,我开始在 Azusa 太平洋大学攻读信息技术学位。那时我住在南加州,我真的很喜欢梓太平洋的小校园。在这个学位项目中,我学到了与计算和工程相关的各种技能,但没有具体到数据科学或分析。这个学位是我对技术感兴趣的催化剂。这是我第一次真正开始钻研技术,在与我职业生涯中工作过的技术团队类似的团队中工作,并学习坚持的艺术。我的代码已经失败过很多次,或者我根本不知道某个问题的答案。我参加了一个软件工程课程,在课程中我们团队设计了一个智能冰箱……就像现在可以买到的类型。你在课堂上能想到的东西真是太神奇了。看起来我们已经错过了与三星或 LG 的职业生涯,哈哈。
💡获得/发展的技能:
- 编程技巧(Java、Visual Basic、SQL)
- 技术意识
- 技术团队
- 数据库设计
- 创意
生物医学信息学
当我获得信息技术硕士学位后,我开始收到数据分析师的工作邀请。老实说,我不知道这是一个职业领域,但它似乎很吸引人,所以我尝试了一下😊。我的第一个角色是一家耐用医疗设备供应商。然后,我从加州搬了出来,开始在一家专注于肿瘤数据的初创公司担任健康数据分析师。我从未如此热爱一份工作,起床后精力充沛地去工作。我喜欢数据和你可以用它做的一切。我还发现我是一个冷酷的书呆子,对此我没有意见👍。正是在这段时间里,我知道这是我想从事的职业,我将继续深造。我申请了罗格斯大学生物医学信息学博士项目,并被录取。我快毕业了。*请注意,罗格斯大学不再提供博士项目。以下是我在博士项目的旅程中所学到和获得的技能。
💡获得/发展的技能:
- 临床数据分析
- 临床研究
- 流行病学
- 机器学习
- 临床操作
数据科学和分析的自学
图片来自 Pixabay 的 StartupStockPhotos
自创业以来,我一直在几家医疗保健集团从事数据分析工作,并了解到“分析”并不一定有一个标准,因为每个公司对它的定义都不一样。我在临床和技术环境中都工作过,发现通常有一些知识是我所缺乏的。我没有感到不安全和“情绪激动”,而是决定为此做点什么。鉴于我的背景是非传统的,我想更多地了解这个领域,成为一名更有效的专业人士。以下是我所做的,并且一直持续到今天:
- 我开始自学 python 编程。在创业初期,python 是我们的首选语言。开始编写功能代码很容易。
- 我开始在 Udemy 和 Coursera 上学习课程,只是为了让自己熟悉别人眼中的数据科学。我在 Coursera 上参加了吴恩达的机器学习课程。我开始看奥莱利的书系列,封面是动物,lol。我特别喜欢韦斯·麦金尼写的这本书。
- 开始在数据集上练习我新获得的技能,并建立作品组合。
- 我一直在通过演讲会练习我的公开演讲能力。
- 我刚刚完成了 Data Science Dojo 的训练营,我强烈推荐他们。该计划对我理解如何实施解决方案以及将我的知识应用到现实世界的场景中至关重要。我还学会了如何调整模型。
我对数据的热爱和对学习的热情仍在继续。只要有机会,我就会抓住学习的机会。我似乎总能学到新东西。我已经接受了我不可能知道所有的事情,因此,我是一个终生学习者。
我的技能+数据科学
图片由 Gerd Altmann 从 Pixabay 拍摄
我学到的是,这个领域远不止数据分析、算法和编程。人们普遍不言而喻地期望与人有效合作,交流你的结果,并在工作场所保持愉快。如果一个优秀的数据科学家/分析师不善于沟通,他们将会受到阻碍。以下是我在整个学术生涯中学到的技巧,这些技巧对我在这个领域的个人旅程非常有用。
——在开始分析之前,对我们收到的信息和数据进行辨别和判断是非常重要的。我们的目标是全面评估我们现有的数据,以及这些数据对于我们试图回答的问题是否可以接受。
领域知识——我主要在医疗保健行业工作,所以这在那些环境中很有帮助。
求知欲——对数据保持好奇并提出问题是构建最具商业影响力的有效解决方案的关键。
——数据科学和分析中有一种创造性和艺术性的元素。在向利益相关方展示结果时,有效的数据故事讲述(包括数据可视化工具和吸引受众的沟通)将改变游戏规则。
数据分析——分析数据以理解如何衍生商业价值的能力是一项关键的、绝对必要的技能。
团队合作——这是一项绝对需要掌握和发展的技能。独自工作而没有任何其他人类互动的可能性相当低。你绝对需要能够与他人合作。
统计分析——这是一项关键技能,取决于分析的角色和类型。融入数据科学的角色需要牢固掌握概念。
公开演讲——向决策者展示结果和建议的能力是任何数据角色的一个心照不宣的期望。花些时间了解你的听众,并根据他们的需求定制你的演讲。
编程技能——这是这个领域内必不可少的技能。有几种语言是通用的:Python,R,SQL。也有一些工作场所需要精通 SAS、C++、Java 等,但除了我提到的常用语言之外,我个人没有什么经验。
写作——我的写作量因角色而异,但无论是电子邮件、文档还是白皮书,我都需要在每个角色中写作。我很感激我的本科和研究生教育给了我这个机会。
最后
我进入这个领域的道路是非传统的,但我在这个过程中学到的一切对我作为一名专业人士的发展都很有用。技术技能是必要的,但不是唯一必要的技能!
非常需要各种背景的数据专业人员。有一个普遍的信念,只有拥有一定学位的个人才能在这个领域茁壮成长;现实情况是,随着数据问题变得越来越多样化,解决上述问题的工作人员也需要多样化。不是每个人都以同样的方式处理同样的问题,因此在多元化的团队中工作是有好处的。请忽略任何关于“如何识别假数据科学家”、“谁应该成为数据科学家”以及其他恶作剧的文章。
你对数据有热情吗?你想在这个领域工作吗?学习入门所必需的技能:编程、统计、沟通、领域知识(取决于你对哪个特定领域感兴趣),并开始用数据集练习。请注意,这个领域也需要与他人合作。建立一个作品集。学会利用你的技能来产生商业影响。这个领域需要时间、耐心和练习。没有一定的人能做这项工作。你决定你能带来什么价值。球在你的球场上。干杯!
联系我
随时联系 Linkedin 。
人工智能研究科学家的四种特质之我见
职业,人工智能研究,经验
根据我和几个博士毕业生在一家初创企业工作的经验
纽约公共图书馆拍摄于 Unsplash
大家好!终于又可以写文章了。我想写几个想法。之前,我想写另一个关于深度学习的有趣项目。不幸的是,这个计划被搁置了,因为我有其他事情要做。在我自由之后,我忘记了这个项目,并决定放弃它。然后,突然想写一下自己的科研生涯经历。因此,我给你这篇文章。
在这篇文章中,我想分享我在工作中所学到的东西。告诉你,我是 Kata.ai 的人工智能研究科学家。我的工作是用机器学习来解决一些自然语言处理的问题。我已经做了一年的人工智能(AI)研究员,之前我的工作不是研究员。我会说,我在这个职业生涯中相对较新。
基于我的经验,强调人工智能的研究环境,我想分享基于我在我的研究团队工作的经验的研究员特质。这个团队由几名博士毕业生组成。我想给你们概述一下研究人员的一些特质。概述是基于我的观点,刚刚踏上研究员生涯。我希望它能为对此感兴趣的人提供一些见解。
批判性思维
我认为这种特质对于一个想成为研究者的人来说是必要的。正如你所看到的,这个职业的工作是研究一些东西,发现一些东西,如基于研究结果的洞察力。原因是我们需要确保发现是有效的。换句话说,我们想让人们相信我们的结果是实质性的。
我对我们如何进行批判性思考的一种态度是怀疑主义。这很违反直觉,对吧?在解决问题时,我们通常需要乐观,但在这里,我们使用怀疑态度。是关于什么的?
怀疑论在这里意味着我们怀疑一个研究结果。例如,当我们发现某篇论文说这篇论文的发现很有希望时,我们会在心里问自己:“这是真的吗?我不认为这种方法对 B 有效。
这种思维模式可以提供一种新的研究思路。你可以验证你怀疑的说法,如果这是真的,这可能是一个新的研究项目想要解决。
在我去研究团队之前,我是一个认为当那篇论文有很酷的直觉和方法,并且受欢迎是很棒的人。感谢我的团队,我可以阐明这种心态。这并不是说我对任何论文都完全持怀疑态度,但至少我的大脑中有“好得不真实”的陈述,尤其是当我读到一些声称一切都很棒的东西时。
弗朗西斯科·冈萨雷斯在 Unsplash 上拍摄的照片
我有一个读学士学位的朋友在 NLP 做了一个研究项目。由于不熟悉,他决定请一位博士生做他的导师。他的导师给了他一篇论文,里面有一个很有前途的方法。导师建议我的朋友在他的项目中使用论文的方法。他决定相信他的导师给的研究论文。不幸的是,在项目结束时,他没能用论文的方法创造出一个好的模型,因此他在这门学科上得了一个很差的分数。一年后,他意识到论文是垃圾。
从上面的故事来看,如果我的朋友具有批判性思维特质,他就可以避免糟糕的成绩。对论文好不好持怀疑态度可以拯救你。尽管如此,怀疑主义并不意味着我们总是消极地看待事物,而是客观地评估我们关注的对象。
好奇心
随着研究成为研究人员的日常任务,好奇心,在我看来,必须存在于任何研究人员的心态。有了好奇心,我们可以丰富研究发现。因此,使结果更有见地被消化。
当我们(我的研究团队)被给予一个问题时,我们讨论如何解决这个问题的几个想法。讨论是需要研究者的好奇心的事件之一。我们制定了几个假设,认为几种方法可能值得尝试解决这个问题。
在我的团队中,当我们回答一个研究问题时,通常不会以此结束。这也是需要好奇心的地方。具体来说,在我们完成了一个问题的实现和实验之后,我们需要分析结果。通常,在分析结果时,他们会突然想到几个问题来探索与结果相关的其他事情。例如,对于一个专注于深度学习的人工智能研究人员来说,当他开发出一个新的架构模型来给出显著的结果时,他可能会忍不住质疑它的好性。其中一个方法是做一个消融研究,他可以做实验,看看当新模型的一部分不存在时,质量是否会下降。带着好奇心,它可以丰富对发现的分析,这可能会进一步说服读者。
总而言之,好奇心进一步加强了研究工作。在我看来,研究工作的结果,其中之一是由团队的好奇心塑造的。当给予足够的好奇心时,它会输出一个有见地的发现。
艰苦的
道格·图尼森在 Unsplash 上拍摄的照片
并不是所有的研究实验都能得到想要的结果,因为研究人员会去研究未知的东西。所以,当一个研究结果给出可怕的结果时,要强硬。
以我的经验来说,我经历过很多失败的实验。首先,我很不幸地知道我的实验毫无结果。但是,后来,我意识到失败是一个教训,可以让我成为一个更好的研究者。失败的经历告诉了我今后需要避免的错误。杀不死你的会让你变得更强,对吗?
所以,是的,通过接受你的失败,它会让你成长。然而,当一个研究项目失败时,并不意味着所有的工作都是徒劳的。你可以在研究论文里写你失败的原因。对于任何想研究解决类似问题的人来说,这也是一种洞察力。不幸的是,每个人都如此专注于一个’成功的研究成果,而不是一个失败的。在我看来,我认为一个失败的故事比成功的故事更有价值,它可以警告某人不要再犯。尽管如此,书面报告需要彻底强调失败的原因才有价值。
所以,不要让研究实验给出不好的结果。学习并从中前进!
系统作家
照片由 Aaron Burden 在 Unsplash 上拍摄
实验之后,我们会有一个发现或者一些我们引以为豪的研究。那么下一步是什么?是的,把结果告诉大家它的酷!
书面报告是告诉大家的渠道之一。在我的团队中,我们经常以报告的形式写一篇研究论文。这是我们的媒体之一,在这里我们向外界传达我们的发现。
当我们与人交谈时,我们知道我们需要确保我们的信息能够被理解。然后,当我们想说服某人我们的观点是可靠的,我们需要给出一些合理的论据。这和我们如何写报告是一样的。我们需要系统地写一份合理且易于理解的报告,以使我们的发现是有成效的。然后,我们的文章越有洞察力,越容易理解,越多的人会认可我们的研究。
我在这里学到,当我们写论文时,我们需要写一个故事来系统地联系我们的发现。我们需要把动机、背景、实验结果和分析联系起来,才能做出报告。我们认为这会让我们的读者满意并喜欢我们的作品。
良好的…其实主要是为了通过审稿人对提交论文的判断😆。
结论
在这篇文章中,我给出了几个研究人员的特质,这些特质是我基于与一个人工智能研究团队合作的经历而感受到的。他们是批判性思维、好奇心、坚韧和系统化的作家。每个特征都有利于他们更好地完成研究项目。
说实话,看了一个博士毕业的 AI 研究员是怎么工作的,我离一个完全意义上的研究员还很远。但是我喜欢和他们一起工作,尤其是在讨论如何解决问题的时候。我从他们身上学到了很多,尤其是他们处理问题的方式。
编后记
感谢您阅读我的文章😃。下一次,我想写一些关于人工智能的技术。请给我一些力量来写我的下一篇文章。
一如既往,
我欢迎任何可以提高我自己和这篇文章的反馈。我正在学习写作,学习变得更好。我感谢任何让我变得更好的反馈。
在我的下一篇文章中再见!
来源: Pixabay 带 Pixabay 牌照
我 2077 年的 Visual Studio 代码
让我们谈谈代码——Visual Studio 代码
来源:谷歌图片
来自未来的代码编辑器!
从崇高的文本和原子中迁移出来后,我可以说我不后悔我的决定!这是我迄今为止最喜欢的编辑器,也是开发者的终极体验,包括透明度在内的许多功能都已解锁! 我会写在 Linux 上设置它,但你可以在任何平台上设置 。
V S 代码使用Electron作为其基础,这使其能够跨平台并在 macOS、Windows 和 Linux 上工作。它是使用node . js构建的,完全支持任何 JavaScript 开发者。
我的主题
这是我最喜欢自定义字体的两个主题!
(灵感来自赛博朋克)——我的最爱!
我的个人
monokai(vs code 附带的内置主题)
我的个人
我的字体
firico(组合 Fira 代码 和Pacifico为斜体)
这是我用于编程的字体设置。它使用 Fira 代码作为默认字体,Pacifico 代码作为斜体。由于 Fira 代码,它也有字体连字。
定制
定制字体(例如调整其中一种字体的大小)最简单的方法是使用 FontForge。只要打开**”。ttf"** 文件,编辑后导出回 “ttf” 。你只需要确保你没有编辑任何元数据,否则字体将无法工作。
什么是斜体?
许多编辑器/ide(如 VSCode)对某些表达式(通常是关键字或类型)采用所选字体的斜体样式。这种字体用另一种字体:Pacifico 替换了 Fira 代码的默认斜体样式,所以我们基本上是“欺骗”了程序。
在 VSCode 表达式中,斜体样式是由你的主题控制的,但是你可以在**的【editor . token color customizations】**下的 settings.json 中进行更改和定制。
这是我的配置:
图标主题
素材图标主题
材料-用户界面启发的文件图标,一个文件图标的替代品。
降价支持
一体降价
所有你需要写 Markdown(键盘快捷键,目录,自动预览,等等)。
奖金!(生产力工具)
1.八叉树【浏览器扩展】
浏览器扩展(Chrome、Firefox、Opera 和 Safari)在 GitHub 上显示代码树。对于探索项目源代码来说太棒了,而不必将每个存储库都拉到您的机器上。
2. OctoLinker 【浏览器扩展】
使用 OctoLinker 浏览器扩展高效浏览 GitHub.com 的项目。非常适合查看 JS/Node/Ruby/Python 源代码。
3.设置同步
使用 GitHub Gist 在多台机器上同步设置、代码片段、主题、文件图标、启动、按键绑定、工作区和扩展。
4. GitHub 黑暗主题【浏览器扩展】
还有吗?请在评论中告诉我!
在 Twitter 上关注我— @TheTweetofSKR ,查看我的其他帖子!
我的大数据工程之路
我是如何把事情搞砸,最终走上正确的道路
伊恩·施耐德在 Unsplash 上拍摄的照片
自从我的大数据工程师职业生涯开始以来,这是一次相当大的冒险。与典型的道路相比,我的开始是不同的。作为一名应届毕业生,我只拥有学术研究背景和热情的态度。但这还不够,这几年我过得很艰难。
在生活中,当你知道应该避免什么时,事情会变得简单得多。我没那么幸运,但我已经从错误中吸取了教训。我的文化中有这样一句话: “你不能选择你的工作,但它会选择你” 。就我的情况来说,这多少有些道理。我当初没有选择大数据工程。
在生活中,当你知道应该避免什么时,事情会变得简单得多
我犯了很多错误,选择了很多错误的道路,把我的信仰交到了一些错误的人手中。但我很高兴我今天的位置,我愿意倾吐我的心声,让你知道我在成为大数据工程师之前有多傻。没什么好吹嘘的,只是我的故事和你能从中得到什么。
Web 开发是一个开端
我渴望找到一份工作,任何工作。我在大学的时候做过一些计算机编程之类的事情。作为一名移民,获得一份工作是我在外国定居的方式。我对自己的技术能力和专业沟通技巧都没有信心。
尽管如此,我还是像其他人一样开始了我的过程:我在发送我的求职申请。我拿起电话,穿好衣服,去参加我人生中第一次正式面试。事情很艰难。人们拒绝了我,而不是给我回电话。这并没有让我失去应有的动力,但我开始怀疑自己。
我很沮丧。我开始将我的求职范围扩大到与我的学习稍微相关的领域。我最初想找一份数据科学家或机器学习工程师的工作。但是由于我在战场上毫无经验,这听起来像是一个不可能完成的任务。希望有一家初创公司接受了我的网站开发申请。和我的同龄人相比,我的工资很低,但我没有犹豫一秒钟。我需要一份工作,我接受了提供的工作。
这是我的第一个错误。不要误解我。工作很好,每个人都很友好,任务也不复杂。它只是不符合我的期望,一旦我离开学校,我会做什么。
我以为我会在机器学习模型上破解一些奇特的算法。实际上,我在建立与概率和统计学习无关的网站。我对 web 开发职业本身没有任何冒犯。我们不仅仅是天生一对。
我开始懈怠工作。我没有和上级想办法,而是选择了别的:另谋高就。我知道这听起来很糟糕。我只干了几个月,但单调的工作日快把我累垮了。我很害怕,很羞愧,也很困惑,不敢和任何人说话。我背着每个人做了一些快速采访,我找到了另一份工作。
新工作是关于数据挖掘、大数据、机器学习,你能想到的每一个关键词。不用说,我被宣传要马上开始新工作。我试图面无表情地告诉我的经理,我想辞职。他没有感到震惊,这让我感到震惊。不管怎么说,我们发现这张纸很好用。我得到了两天的休假通知。我想不出一个欢送会的理由,因为不是每个人都知道我的存在。
在我第一份工作的最后一天,我不得不和一个我很亲近的同事说再见。我说:“我必须去”。她很惊讶:“什么意思?你要去哪里?”。我不擅长说再见,所以我很直接:“我要辞职了”。她从惊讶到愤怒,然后有点怜悯。
太残酷了。我没有以专业和情感的方式恰当地处理这项工作。是我的无知和天真改变了我的决定。我的下一个希望寄托在下一份有前途的工作上。但我不知道事情开始变得更糟。
***What you can learn:***- You don't have to accept any offers just because it's the only choice. You'll end up regret for it most of the time.
- Communication is the key.
- The grass might be greener on the other side, but it's merely a matter of perspective.
机器学习还是炒作
我没有时间后悔我的退出决定,因为我很高兴能开始下一次冒险。在这份新工作中,他们给我安排了一个新项目,从技术上来说,这个项目没有人做过。这些新项目可能会有很多问题。它们通常含糊不清,缺乏技术规范,结果很糟糕。
至于我的这个项目,这三个都有。他们向我承诺了数据挖掘和机器学习应用,但没有什么可以申请的。没有数据,没有软件架构,没有技术眼光。我一整天都在参加人们争论而不是工作的会议。我看不到任何地方可以把我的技术能力用在我目前的职位上。
来自 Pexels 的 Andrea Piacquadio 的照片
我的经理让人无法忍受。在某个时候,他给我一些无关紧要的任务,只是为了让我忙起来,因为他也不知道我们要去哪里。那时我意识到,大多数公司声称要用机器学习和大数据来改变世界,但实际上并不具备适当的专业知识。
我在公司呆了一段时间。主要是因为我想让我在这个国家的居留合法化。我忘了说,自从我开始职业生涯以来,我从未停止过自学。尤其是度过困难时期,你最好做好准备。我已经跳到了每一条建议上,关于如何跟上最新的趋势,以及哪些技能是我应该最关注的。
我的最终道路仍然模糊不清。我尽可能以最普通的方式增强了我的投资组合。这是初级工程师的常见错误。但这是难以避免的。当你没有尝试过每一个选项时,你不会知道你想做什么。后来有一天,我和我的雇主再也无法忍受对方了。我们说了再见,但关系不太好。
直到今天我都恨我自己。我让一些流行语进入了我追求扎实的工程职业的道路。我发誓再也不会以貌取人了。就这一次,运气站在我这边。这一次,我将进入一个新世界:大数据领域。
***What you can learn:***- Don't believe on what you hear companies say, but on what you see they do.
- Buzzwords are real, and don't fall into traps.
我是如何在不知情的情况下接受大数据的
还记得理查德·布兰森说过:
如果有人给你提供了一个绝佳的机会,而你不确定你能做到,那就答应吧——然后再学习如何去做。
这可能听起来很老套,但对我来说曾经是真的。当我得到一份成为大数据开发人员的工作邀请时,我遇到了大数据。他们和我开诚布公地谈了一些我不胜任的工作要求。幸运的是,他们问我是否准备好进入一个不确定的大数据世界。Scala 或 Hadoop 生态系统之类的东西对我来说很遥远,但我说是的。这不是一个自信的“是”,而是“是的,我能做到!”,而是一个到底能出什么差错“是的”。
然后,我在大数据世界的冒险开始了。我首先浏览了一些关于 Hadoop 和 Spark 的书籍,这是当时大数据领域最重要的两个概念。我设法理解了他们的架构和技术背景,但是如果不使用它,很难掌握这些工具。当我在工作中等待足够长的时间来学习时,我开始向大数据的神秘领域前进。
进入大数据世界是什么感觉。照片由 Ashley Batz 在 Unsplash 拍摄
起初,我惊讶于数据并没有像小数据那样以普通的方式表现。这个领域的规则很特别,我必须去适应它。但是当我了解事情的运作方式后,我意识到大数据并没有什么特别的。我告诉自己:“它只是大而已。作为一名工程师,我们只是使用工具按原样处理大数据,不多也不少”。天哪,那时候我完全错了。
请允许我引用我的母语中的另一句谚语
井底之蛙以井的周长来看待世界。
我就是那只青蛙。我以为大数据那么小,我都能看懂。我忘记了我处于大数据领域的边缘,我的旅程才刚刚开始。大数据工程不仅仅是利用工具来大规模处理数据,还包括我们如何处理这种宝贵的资源,从而为业务决策和面向客户的演示带来价值。
***What you can learn:***- You can start woking professionally on a field without minimal experience, but that doesn't exists everywhere. Be prepared.
- Be humble. What you know today might be obsolete tomorrow.
结论
我已经列出了我的错误,这样你就不会再犯了。一个专业的职业道路是漫长的,僵化的,有些乏味的。有了经验,我们进步得更快,同时也避免了前人所犯的错误。我希望当轮到你的时候,旅程将同样充满冒险,充满挑战,并在结束时硕果累累。直到那时,快乐学习!
我的名字叫 Nam Nguyen,我写的主要是关于大数据的文章。享受你的阅读?请在 Medium 和 Twitter 上关注我,了解更多更新。