TowardsDataScience-博客中文翻译-2022-五十五-
TowardsDataScience 博客中文翻译 2022(五十五)
用 Python 可视化网飞数据
原文:https://towardsdatascience.com/visualizing-netflix-data-with-python-bca60a2632d9
使用熊猫、Plotly Express、Dash 和 Heroku
为了更好地理解数据,几乎每个行业都在使用数据可视化。另一方面,由于解释 CSV 文件中的数据可能具有挑战性,因此当数据以图表或地图的形式呈现时,理解数据会变得容易得多。然后基于这些见解,我们可以做出关键的决定。这就是为什么作为数据分析师、数据科学家或开发人员,了解如何使用数据可视化工具至关重要。你可以使用编程语言如 Python 或者使用分析服务如微软 Power BI 来构建图表。
在这里,我们将通过使用熊猫、情节表达和破折号来使用前一种技术。Pandas 是一个数据分析和处理工具。 Plotly 是一款开源数据可视化工具,用于创建交互式图表和地图。对于这篇文章,我们将使用 Plotly Express,这是一个 Python 可视化库。它是 Plotly 的 Python 库的包装器。最后,我们将使用 Dash 通过 Heroku 在 Web 上部署我们的数据可视化应用程序。
设置
首先,确保你的机器上安装了 Python 和。另外,您需要安装三个 Python 包。您可以通过在您的终端(我使用的是 macOS)中运行下面的pip(Python 的包安装程序)命令来做到这一点。
pip install pandas
pip install plotly
pip install dash
资料组
让我们从 GitHub 下载 Python 项目,它也包含一个数据集。对于任何数据可视化,我们都需要数据集。在这里,我使用的数据集包括网飞上市的电视节目和电影。你可以从ka ggle下载数据集(CC0:公共领域授权)。数据的结构如下。
网飞 _titles.csv
熊猫
如果您不熟悉 pandas,那么可以查看 Jupyter 笔记本文件,其中包含 pandas 代码示例。可以从我的 GitHub 下载。要运行该文件,您可以安装 Anaconda 。
Plotly Express
Plotly Express 提供了一系列数据可视化选项。对于这篇文章,我们将使用下面的。
你可以在 Plotly 的网站上找到其余的文档。
履行
让我们来分解一下main.py
文件的各个组成部分。
main.py
首先,我已经导入了所有需要的库。然后我使用方法read_csv
读取 CSV 文件,通过修改实际数据删除重复记录。之后,我创建了一个饼图和一个条形图。对于饼图,设置很简单。我需要设置一些参数来构建饼图。对于data_frame
参数,我正在传递数据集。对于names
参数,我将传递type
列。
此外,我们还需要为条形图设置一些参数。这里,对于data_fram
参数,我通过使用type
列(as_index=False
表示type
列不会用作索引)进行分组后传递数据集,并且使用agg
函数选择type
列并执行count
操作。最后,将输出重命名为count
列。
现在,通过在本地机器上运行以下命令,您可以使用 Dash 在 Web 上发布我们的图表。
python main.py
部署
我要把这个项目部署在 Heroku 上。为此,我们需要另外两个文件。首先,一个 requirements.txt 文件,这样 Heroku 就可以安装所有必要的库。第二,一个 Procfile ,这样 Heroku 就可以启动我们的 app 了。现在,按照以下步骤操作:
- 首先,进入仪表盘。然后,从右上角点击新建按钮。
创建新应用
2.现在,给它起一个名字并点击创建应用按钮。
创建应用
3.它现在会将您重定向到应用程序的部署选项卡。
部署
4.选择 GitHub 作为部署方法并搜索您的存储库。
GitHub
现在点击连接按钮。
连接
5.最后,点击手动部署部分下的部署分支按钮。
部署分支
现在,URL 将会是 appname ,后跟 .herokuapp.com 。因此,在我的例子中,URL 是:
https://dash-panda-python.herokuapp.com/
它应该看起来像这样:
https://dash-panda-python.herokuapp.com/
你也可以查看官方文档来部署你的应用。
恭喜你!您已经成功地在 Heroku 上部署了数据可视化应用程序。您可以使用这种方法通过展示您的数据项目来构建投资组合。现在添加代表不同数据集的不同类型的图表。编码快乐!
参考文献
kaggle.com(未标明)。网飞电影和电视剧。[在线]可从https://www.kaggle.com/shivamb/netflix-shows.获得
相关帖子
可视化纽约市的地铁交通和人口普查数据
使用 Python 的 Geopandas 和 Leafmap 包可视化开放城市数据。
米歇尔·特罗特在 Unsplash 上的照片
Metis 的第一个模块数据科学和机器学习训练营已经在书里了&这是旋风般的几周!
模块 1 涵盖了探索性数据分析,对于相关项目,我们的任务是为取自 MTA 纽约市的十字转门数据制定一个用例,并进行分析以从数据中获得洞察力。
对于我的项目,我选择分析 2021 年全年的十字转门数据,因为我觉得从全年来看,这些见解会更可靠,还因为 2021 年刚刚结束,所以这些数据来自一个刚刚完成的日历年!
辖域
为了确定本提案的分析范围,我从一个基本问题开始: 地铁交通系统的总体趋势是什么,以及各个车站的交通状况如何?
我想确定系统范围内的趋势,如下所示:一天中的哪些时间流量最高?一周中的哪几天?几个月?对于车站指标,我想知道哪个车站的交通流量最高。
作为进一步的目标,我想看看纽约市每个街区的人口统计数据,看看交通和人口统计数据之间是否有任何关联,例如低收入地区的地铁交通更多,或者旧街区的交通更少。
所以,我问自己的下一个问题是: 这些信息在专业环境中如何有用?
嗯,这些数据可能有很多应用!
- 非营利、广告、政治动员和公共卫生等用例的目标拓展。
- 与疫情前交通量的对比分析。(纽约时报
- 与犯罪数据一起使用时的公共安全分析
- 优化的地铁维护计划。
鉴于潜在用例的数量(以及项目两周的周转时间),我选择将我的可交付成果保持如下:
- 按一天中的时间、一周中的日期、一年中的星期、一年中的月份划分的全系统流量趋势。
- 各行政区流量排名靠前的站点
- 可视化提供车站交通数据旁边的人口统计信息
战术、工具和数据
从高层次来说,我脑海中的“关系框架”如下:
地铁站十字转门数据-车站位置数据-纽约市社区地理数据-纽约市社区人口统计信息
因此,在投入工作之前,我问自己的最后一个问题是: 如何才能最好地向潜在客户传达这些见解?
答案是用地图!
我找到了来自纽约 MTA 的第二个数据集,其中包含地铁站的经度和纬度坐标。一旦我按车站汇总,我就能把它加入十字转门数据集。
从那里,我获取了纽约市规划部发布的 NTA(街区制表区)形状文件,将它们与在 NTA 层面进行的美国社区调查的最新数据(2019 年)结合起来,并绘制了地铁站,计算了带有人口统计信息的街区的交通数据。
本项目中使用的所有数据都获得了纽约市机构的免费使用许可。您可以在以下位置找到每个数据集的具体使用条款:
为了完成这个项目的目标,我需要几个不同的 Python 包:
- SQLAlchemy:用于处理包含我们十字转门数据的本地数据库
- 熊猫 , Numpy , Matplotlib ,Seaborn和/或Plotly:用于操作和可视化表格数据。
- FuzzyWuzzy :用于连接车站十字转门数据和车站地理信息(两个数据集中车站的命名不同,谢谢 MTA!).
- Geopandas , Leafmap :用于绘制静态和交互地图。
方法和代码
你可以在 GitHub repo 中找到完整的代码。下面我来提供亮点!
摄取
一旦导入了包,并设置了格式和样式选项,第一步就是使用 SQLAlchemy 连接到保存旋转栅门数据的数据库:
engine = create_engine("sqlite:////Users/USER/Documents/GitHub/NYC_MTA_EDA_Project/mta_data.db")
接下来,我将这个数据库读入一个熊猫数据帧,如下所示:
df = pd.read_sql('SELECT * FROM mta_data;', engine)
在这里,我们可以对 SQL 查询做任何我们想做的事情,但是对于我的 EDA,我更喜欢 pandas。
select *, ENTRIES - coalesce(lag(ENTRIES) over (ORDER BY "C/A", UNIT, SCP, STATION, DATE, TIME), 0) AS NET_ENTRIES, EXITS - coalesce(lag(EXITS) over (ORDER BY "C/A", UNIT, SCP, STATION, DATE, TIME), 0) AS NET_EXITS from mta_data order by "C/A", UNIT, SCP, STATION, DATE, TIME LIMIT 100;
会给你:
需要一点清理,但你得到了要点。图片作者。
清洁
当我将数据(以原始格式)读入熊猫数据帧后,我做了几件事:
- 重命名列以便于操作。
- 从日期和时间列创建了日期时间列
- 去掉任何 DESC 为“AUD RECOVR”的值(更多信息)
- 计算聚合列 net_traffic,这是我们进一步分析的基础。
极端值
在运行了一个熊猫档案报告后,我看到我们的网络流量字段到处都是。有些是负值,有些是几十亿。在这一点上,我做了一些行政决策:
df['net_traffic'] = abs(df.net_traffic)q = np.quantile(df['net_traffic'], .99)
df=df[df['net_traffic'] < q]
这将我们的 net_traffic 列的所有值都转换为正值,并去掉任何超过 99%的值。这应该可以去除最严重的异常值,同时尽可能地保留数据集。这是一种缺乏细微差别的方法,绝对是一个需要改进的地方!
之前的净流量。图片作者。
之后的净流量。图片作者。
肉眼观察
因为目标是在给定的时间范围内提供一系列系统范围的洞察,所以我需要使用 date_time 列将这些时间范围添加为列:
df['date'] = df.date_time.dt.date
df['day_of_week'] = df.date_time.dt.dayofweek
df['month'] = df.date_time.dt.month
df['week'] = df.date_time.dt.isocalendar().week
df['hour'] = df.date_time.dt.hour
然后,我开始可视化给定时间范围内的全系统流量:
hourly_df = df.groupby(['hour'])[['net_traffic']].mean().reset_index()plt.plot(hourly_df.hour,hourly_df.net_traffic);
plt.xlabel('Time')
plt.ylabel('Average Traffic')
plt.title('Traffic is highest 8AM - 8 PM')
plt.xticks(np.arange(24), rotation=45);
高峰时间是 8-12 和 5-8。图片作者。
weekly_timelapse_df = df.groupby(['week'])[['net_traffic']].sum().reset_index().copy()weekly_timelapse_df['pct_change'] = weekly_timelapse_df.net_traffic.pct_change()
weekly_timelapse_df['pct_change'].iloc[0] = 0weekly_timelapse_df['pct_total'] = weekly_timelapse_df['net_traffic'].apply(lambda x: x / weekly_timelapse_df.net_traffic.sum())plt.figure(figsize=(10,10))
sns.lineplot(data=weekly_timelapse_df, x='week', y='net_traffic');
plt.title('Timelapse of Traffic by Week');
plt.xlabel('Week');
plt.ylabel('Total Traffic');
plt.ticklabel_format(axis='y', style='plain');
plt.xticks(np.linspace(1,52,52), rotation=90, fontsize=10);
假期前后急剧下降。图片作者。
monthly_df = df.groupby(df.month)[['net_traffic']].sum().reset_index().copy()plt.plot(monthly_df.month, monthly_df.net_traffic);
plt.ticklabel_format(axis='y', style='plain');
plt.xlabel('Month');
plt.ylabel('Total Traffic');
plt.title('Total Traffic by Month');
八月至十月是客流量最大的月份。图片作者。
dayofweek_df = df.groupby(df.day_of_week)[['net_traffic']].sum()dayofweek_df['pct_change'] = dayofweek_df.net_traffic.pct_change()dayofweek_df['pct_change'].iloc[0] = ((dayofweek_df.net_traffic.iloc[0] - dayofweek_df.net_traffic.iloc[6]) / dayofweek_df.net_traffic.iloc[6])dayofweek_df['pct_total'] = dayofweek_df['net_traffic'].apply(lambda x: x / dayofweek_df.net_traffic.sum())plt.plot(dayofweek_df.index, dayofweek_df.net_traffic);
plt.xticks(np.arange(7), ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'], rotation=45);
plt.ticklabel_format(axis='y', style='plain')
plt.xlabel('Day of Week')
plt.ylabel('Total Riders')
plt.title('Total Riders by Day of Week')
周末是低流量。图片作者。
太好了!这些对我们的客户来说是非常有用的见解。但他们真正想知道的是,在他们担心交通之前,他们应该在哪些车站安装广播站!让我们开始吧:
热门电台
top_stations = df.groupby('station')[['net_traffic']].sum().sort_values(by='net_traffic', ascending=False).reset_index().copy()top_stations['pct_total'] = top_stations['net_traffic'].apply(lambda x: x / top_stations.net_traffic.sum())
这创建了一个所有车站的数据框架,按交通价值降序排列,不考虑区。检查笔记本,看看它的(非常大的)情节!
按区获取热门站点的下一步是引入来自 MTA 的第二个数据集,除了经度/纬度信息之外,该数据集还包含区信息:
station_data = pd.read_csv([http://web.mta.info/developers/data/nyct/subway/Stations.csv](http://web.mta.info/developers/data/nyct/subway/Stations.csv))
接下来,我使用 FuzzyWuzzy 对 top_stations 数据帧和 station_data 数据帧进行模糊连接。原因是两个数据集之间的站的命名非常相似,但在许多小的、特殊的方面有所不同。FuzzyWuzzy 得到了大多数正确的匹配,并在这个过程中节省了我的时间。肯定不是完美的,也是需要改进的地方!
我按照这个指南完成了一个模糊连接,但是代码如下:
station_data.stop_name = station_data.stop_name.str.replace(" - ","_")
station_data.stop_name = station_data.stop_name.str.replace(" ","_")
station_data.stop_name = station_data.stop_name.str.replace("(","")
station_data.stop_name = station_data.stop_name.str.replace(")","")
station_data.stop_name = station_data.stop_name.str.replace("/","_")
station_data.stop_name = station_data.stop_name.str.replace(".","")
station_data.stop_name = station_data.stop_name.str.replace("-","_")
station_data.stop_name = station_data.stop_name.str.lower()mat1 = []
mat2 = []
p= []
list1 = top_stations.station.tolist()
list2 = station_data.stop_name.tolist()threshold = 50 ## Needs to be at 50 or there are some values without matches.for i in list1:
mat1.append(process.extractOne(i, list2, scorer=fuzz.ratio))
top_stations['matches'] = mat1for j in top_stations['matches']:
if j[1] >= threshold:
p.append(j[0])
mat2.append(','.join(p))
p= []
top_stations['matches'] = mat2top_station_df = pd.merge(top_stations, right=station_data, left_on='matches', right_on='stop_name', how='left')top_station_df = top_station_df.groupby(['station'])[['net_traffic', 'pct_total', 'borough', 'gtfs_longitude', 'gtfs_latitude', 'avg_daily']].first().sort_values(by='net_traffic', ascending=False).reset_index()
映射热门站点
所以现在我有了最高的车站,有经度/纬度信息,区,和计算的交通数量。我可以开始绘制地图了!
在我开始互动之前,我想使用 Geopandas 静态绘制每个区的热门站点。
顾名思义,Geopandas 是一个用于在 Python 中处理地理数据的包。值得注意的是,它引入了一种特殊的数据类型,称为 Points:
top_station_df['geometry'] = [Point(xy) for xy in zip(top_station_df['gtfs_longitude'],top_station_df['gtfs_latitude']]
一旦创建了几何列,我就可以绘制点了。但是!如果没有纽约市的背景地图作为背景,它们将毫无意义。进入我们的 NTA 形状文件!
nta_map = gpd.read_file('/Users/USER/Documents/GitHub/NYC_MTA_EDA_Project/nynta2020.shp')
nta_map.to_crs(4326, inplace=True)
什么是 to_crs?一个坐标参考系统基本上是一个框架,计算机通过它解释比例尺。to_crs 是 geopandas 函数,用于更改地理数据框架的 crs。注意我们在。使用 gpd.read_file 的 shp 文件-它不是数据框,而是地理数据框!
如果我想让 NTA 地图和点数据有意义,那么将它们放在同一个 CRS 中是很重要的。首先,我还必须将 top_station_df 转换为地理数据框架:
top_station_geo_df = gpd.GeoDataFrame(top_station_df, crs=4326, geometry = top_station_df.geometry)# Just to be extra suretop_station_geo_df.to_crs(4326, inplace=True)
现在,我可以画出来!
布鲁克林区
fig,ax = plt.subplots(figsize=(10,10))nta_map.boundary.plot(ax=ax, edgecolor='k');top_station_geo_df[top_station_geo_df.borough == 'Bk'].head(10).plot(column='station', ax=ax, legend=True, marker='.', markersize=top_station_geo_df.pct_total.astype('float') * 10000);
图片作者。
bk_df = top_station_df[top_station_df.borough == 'Bk'].copy()
bk_df.reset_index()
bk_df = bk_df.head(10)
plt.bar(bk_df.station, bk_df.net_traffic);
plt.title('Top 10 Brooklyn Stations')
plt.xlabel('Stations');
plt.ylabel('Total Traffic');
plt.xticks(rotation=90);
plt.ticklabel_format(axis='y', style='plain');
图片作者。
这个代码在所有的行政区都是可重复的,所以我就不重复了:
曼哈顿
图片作者。
图片作者。
昆斯区
图片作者。
图片作者。
布朗克斯区
图片作者。
图片作者。
斯塔腾岛
图片作者。
图片作者。
(奖金)非 MTA 站:
这些应该在新泽西..如果是在这里画的。图片作者。
图片作者。
使用 Leafmap 的交互式制图
在游戏的后期,我被我们的教练带上了树叶地图。这是一个非常强大且易于使用的工具,可以在笔记本上制作交互式地图。
但是在我开始制作交互式地图之前,我需要引入一些人口统计数据。
nta_demos =
pd.read_excel('[https://www1.nyc.gov/assets/planning/download/office/planning-level/nyc-population/acs/demo_2019_acs5yr_nta.xlsx'](https://www1.nyc.gov/assets/planning/download/office/planning-level/nyc-population/acs/demo_2019_acs5yr_nta.xlsx'))
就这么简单-直接从网上。
现在合并(不模糊):
nta_df = nta_map.merge(nta_demos, how='left', left_on='NTA2020', right_on='GeoID')
树叶地图
现在是互动地图!
实际上,我最终需要重新保存我的 top_station_geo_df 和计算的流量列作为 GeoJSON,这样才能工作:
top_station_geo_df.to_file("top_station.json", driver="GeoJSON")
一旦我在回购中有了它,创建交互式地图所需的所有代码如下:
m = leafmap.Map(center=(40,-100),zoom=4)m.add_gdf(nta_df, layer_name='2020 NTA Demographic Information', info_mode='on_click')m.add_point_layer(filename='/Users/USER/Documents/GitHub/NYC_MTA_EDA_Project/top_station.json', popup=['station', 'net_traffic', 'pct_total', 'avg_daily'], layer_name="Stations")m
Leafmap 的力量!图片作者。
见解和结论
当一切都说了,做了,我将能够向客户提供以下内容:
- 系统级指标,如高峰流量时间、一周中的天数、一年中的周数和月数。
- 按区排列的前 10 个站点,或按流量排序的所有站点,而不考虑区。
- 一个交互式地图,显示每个车站的交通数据,以及周围社区的人口统计数据。
有了这些见解,我们的客户应该能够对他们的业务问题做出明智的、数据驱动的决策。无论这是如何最好地达到某些观众,还是轨道维护的最佳时间表。
有待改进的领域
我把它带到了很多不同的方向,作为一个展示项目,这太棒了!对于一个客户来说,可交付的东西就没那么多了。在现实世界中,如果有更少有趣的软件包,更简洁的分析和演示,我会感觉更好。
在此基础上,格式化无疑也是一个需要改进的领域。骨架已经就位,而且功能正常,但整个东西需要重新刷一层漆。所有的图形和地图,包括交互式的,都可以以更清晰的格式呈现。考虑到前面关于时间管理的观点,我可能会更好地减少视觉化图像的数量,并专注于制作一些真正高质量的图像。
需要进一步分析的领域
这个项目中有很多细节。但是,可以真正提高其效用的三个进一步分析的领域如下:
- 这些见解与我们在系统级产生的见解相似,但针对的是每个区的前 10 个电台。
- 除了人口统计之外的其他数据将被添加到 NTA 数据中——除了我们现在拥有的种族数据之外,拥有性别和收入等信息将会产生影响。此外,清理 NTA 数据,以减少列数,使其更具描述性。
- 地铁乘客数量是 2019 年疫情之前的一小部分。2019 年、2020 年和 2021 年之间的同比分析将这些流量信息联系起来,并帮助广告商了解趋势。
凯文·钦奇利亚在 Unsplash 上的照片
用 NLTK 和 SpaCy 可视化词性标签
原文:https://towardsdatascience.com/visualizing-part-of-speech-tags-with-nltk-and-spacy-42056fcd777e
自定义 displaCy 的实体可视化工具
图片由作者提供。
在本教程中,我们将开发一个函数来可视化带有 NLTK 和 SpaCy 的词性(POS)标签。
结果函数将把这个
输入句子(图片由作者提供)
变成这样:
输出句子(图片由作者提供)
动机
词性标注是自然语言处理中使用的一种技术。它将文本中的标记分类为名词、动词、形容词等等。在 Python 中,您可以使用 NLTK 库来实现这个目的。
import nltk
from nltk import word_tokenizetext = "This is one simple example."tokens = word_tokenize(text)
tags = nltk.pos_tag(tokens, tagset = "universal")
在上面截取的代码中,首先用word_tokenize()
函数对示例text = "This is one simple example."
进行标记化(This
、is
、one
、simple
、example
和.
)。然后用功能pos_tag()
对代币进行 POS 标记。对于这个例子,我们将使用tagset = "universal"
,因为它使用了一个更通用的标签集,而默认标签集提供了更详细的标签。
下面你可以看到例句的词性标记。
带词性标签的例句(图片由作者提供)
空间带有一个可视化器,叫做显示。例如,您可以使用style = "dep"
呈现如下的 POS 标签和语法依赖。
import spacy
from spacy import displacynlp = spacy.load("en_core_web_sm")
doc = nlp(text)displacy.render(doc, **style = "dep"**)
带有 displaCy 的例句的可视化依赖关系(图片由作者提供)
一个更加丰富多彩的选项是用style = "ent"
突出显示命名实体及其标签。
displacy.render(doc, **style = "ent"**)
带有 displaCy 的例句的可视化实体(图片由作者提供)
不幸的是,style = "dep"
选项不使用任何颜色来显示位置标签,并且style = "ent"
不显示位置标签。因此,在 NLTK 的帮助下,我们将开发一个功能来突出显示 POS 标签,类似于空间的实体突出显示。
开发可视化功能
在本节中,我们将通过两个简单的步骤来开发可视化功能:
- 自定义显示选项
- 填充实体字典
自定义显示选项
虽然 displaCy 的命名实体突出显示并不突出显示现成的 POS 标签,但是您可以定制它应该突出显示的内容。
也可以使用 displaCy 手动呈现数据。[…]如果您在
render()
或serve()
上设置了manual=True
,您可以将 displaCy 格式的数据作为字典(而不是Doc
对象)传入。— [2]
from spacy import displacydisplacy.render(doc,
style = "ent",
**options = options,
manual = True**)
实体可视化工具允许您定制以下
*options*
:
*ents*
实体类型以高亮显示。
*colors*
颜色覆盖。实体类型应该映射到颜色名称或值。— [2]
在本例中,要突出显示的实体类型将是不同的 POS 标签。我们会用tagset = "universal"
。该标签集由以下 12 个粗略标签组成:[1]
动词—动词(所有时态和情态)
名词—名词(普通和专有)
PRON —代词
ADJ —形容词
ADV —副词
ADP —形容词(介词和后置)
CONJ —连词
DET —限定词
NUM —基数
PRT —助词或其他虚词
X —其他:外来词、错别字、缩略语
。—标点符号
我们将使用除“X”和“.”之外的所有位置标签,以至于option
的ents
和colors
长这样。
pos_tags = ["PRON", "VERB", "NOUN", "ADJ", "ADP", "ADV", "CONJ", "DET", "NUM", "PRT"]colors = {"PRON": "blueviolet",
"VERB": "lightpink",
"NOUN": "turquoise",
"ADJ" : "lime",
"ADP" : "khaki",
"ADV" : "orange",
"CONJ" : "cornflowerblue",
"DET" : "forestgreen",
"NUM" : "salmon",
"PRT" : "yellow"}options = {"ents": pos_tags, "colors": colors}
在这一部分,您可以决定要使用哪些标签并自定义颜色。
填充实体字典
接下来,我们需要定义doc
。
doc = {"text" : text, "ents" : ents}
虽然"text"
只是我们想要可视化的文本,但是"ents"
是每个要突出显示的实体的字典。
对于每个实体,我们需要在文本中定义start
和end
索引。此外,我们需要定义实体的label
,在我们的例子中是 POS 标签。
让我们从标记文本和标记标记的位置开始。与“动机”部分的代码片段相比,我们将使用TreebankWordTokenizer
而不是word_tokenize()
函数。原因是TreebankWordTokenizer
提供了更多的灵活性,这是我们马上就需要的。
import nltk
from nltk.tokenize import TreebankWordTokenizer as twt# Tokenize text and pos tag each token
tokens = twt().tokenize(text)
tags = nltk.pos_tag(tokens, tagset = "universal")
POS 标记的令牌tags
看起来像这样:
[('This', 'DET'),
('is', 'VERB'),
('one', 'NUM'),
('simple', 'ADJ'),
('example', 'NOUN'),
('.', '.')]
如上所述,TreebankWordTokenizer
提供了一个函数来获取每个标记的跨度,这是我们在"ents"
字典中需要的。
# Get start and end index (span) for each token
span_generator = twt().span_tokenize(text)
spans = [span for span in span_generator]
spans
长这样:
# text = "This is one simple example."
[(0, 4), (5, 7), (8, 11), (12, 18), (19, 26), (26, 27)]
现在我们有了tags
和spans
,我们可以填充"ents"
字典了。
# Create dictionary with start index, end index, pos_tag for each token
ents = []
for tag, span in zip(tags, spans):
if tag[1] in pos_tags:
ents.append({"start" : span[0],
"end" : span[1],
"label" : tag[1] })
就是这样!
结果和结论
在本教程中,我们开发了一个简短的函数来可视化带有 NLTK 和 SpaCy 的 POS 标签。
完整的功能如下所示:
让我们举几个例子:
visualize_pos("Call me Ishmael.")
visualize_pos("It was a bright cold day in April, and the clocks were striking thirteen.")
visualize_pos("The train leaves here at 9AM.")
喜欢这个故事吗?
如果你想把我的新故事直接发到你的收件箱,请务必订阅https://medium.com/subscribe/@iamleonie!
成为媒介会员,阅读更多来自我和其他作家的故事。报名时可以用我的 推荐链接 支持我。我将收取佣金,不需要你额外付费。
*https://medium.com/@iamleonie/membership
在LinkedIn和 上找我 Kaggle !
参考
[1]“NLTK”,“nltk.tag.mapping 的源代码”。nltk.org。https://www.nltk.org/_modules/nltk/tag/mapping.html(2022 年 8 月 2 日访问)
[2]“空间”,“可视化工具”。https://spacy.io/usage/visualizers(2022 年 8 月 1 日访问)*
使用 Plotly Express 可视化 Polars 数据帧
原文:https://towardsdatascience.com/visualizing-polars-dataframes-using-plotly-express-8da4357d2ee0
了解如何绘制极坐标数据帧
在我的上一篇文章中,我谈到了新的 DataFrame 库,它的速度比熊猫还要快。
随之而来的一个很自然的问题是:可视化怎么样?Polars 内置可视化功能吗?因此,在本文中,我将向您展示如何使用 Polars DataFrame 进行可视化。
但是在我继续之前,让我先告诉你一个坏消息— Polars 没有内置的绘图功能。
至少在当前版本(0.13.51)中没有。希望在未来的版本中,它能集成流行的绘图库。
也就是说,您必须使用绘图库(如 matplotlib、Seaborn 或 Plotly Express)显式绘制您的 Polars 数据帧。在这篇文章中,我想把重点放在使用带有 Plotly Express 的 Polars 来完成我们的可视化任务。
Plotly 和 Plotly 表达的是什么?
plottlyPython 库是一个交互式的开源绘图库。它支持不同的图表类型,涵盖广泛的统计、金融、地理、科学和三维用例。另一方面,Plotly Express 是 Plotly 库的一个包装器,让你不用写太多代码就能更容易地创建好看的图表。Plotly 和 Plotly Express 的关系类似于 matplotlib 和 Seaborn 的关系:
作者图片
安装 Plotly Express
要安装 plotly,您可以使用pip
:
pip install plotly
或者conda
:
conda install plotly
创建我们的样品极化数据框架
让我们从字典中创建我们的示例极坐标数据帧:
import polars as pldf = pl.DataFrame(
{
'Model': ['iPhone X','iPhone XS','iPhone 12',
'iPhone 13','Samsung S11','Samsung S12',
'Mi A1','Mi A2'],
'Sales': [80,170,130,205,400,30,14,8],
'Company': ['Apple','Apple','Apple','Apple',
'Samsung','Samsung','Xiao Mi','Xiao Mi'],
}
)
df
作者图片
使用 matplotlib 绘图
首先,画一个柱状图展示每种型号的销售情况是很有用的。大多数数据分析师/科学家都熟悉 matplotlib,所以让我们先尝试使用它:
plt.bar(df['Model'], df['Sales'])
您应该会看到以下输出:
作者图片
上面的工作是因为df[‘Model’]
和df[‘Sales’]
各自返回一个极坐标序列,这是 matplotlib 的bar()
方法可以接受的。然而,由于方括号索引是 Polars 中的反模式,您应该使用select()
方法来选择您想要绘制的列:
import matplotlib.pyplot as pltplt.bar(
df.**select('Model').to_series()**,
df.**select('Sales').to_series()**
)
注意,您必须使用
to_series()
方法将select()
方法的结果显式转换为一个序列。这是因为select()
方法返回一个数据帧。
使用 Plotly Express 绘图
现在让我们使用 Plotly Express 绘制条形图:
import plotly.express as pxpx.bar(x = df.select('Model').to_series(),
y = df.select('Sales').to_series())
就像使用 matplotlib 一样,您需要显式地将列作为一个序列传递给 Plotly Express 的方法,在本例中是bar()
方法。
Plotly Express 以交互方式显示条形图,您可以将鼠标悬停在条形上,弹出窗口将显示条形的详细信息,您还可以使用工具栏中的各种项目放大图表、将图表另存为 PNG 等:
作者图片
使用 Polars 数据框架绘制图表的另一种方法是将其转换为 Pandas 数据框架,然后在 Plotly Express 中直接使用 Pandas 数据框架:
px.bar(df.to_pandas(), **# convert from Polars to Pandas DataFrame**
x = 'Model',
y = 'Sales')
只要方便,我就会使用这种方法。
如果上面的语句出错,您需要安装 pyarrow 库:
pip install pyarrow
绘制饼图
要在 Plotly Express 中绘制饼图,请使用pie()
方法:
px.pie(df, **# Polars DataFrame**
names = df.select('Model').to_series(),
values = df.select('Sales').to_series(),
hover_name = df.select('Model').to_series(),
color_discrete_sequence= px.colors.sequential.Plasma_r)
或者,如果您使用的是熊猫数据框架:
px.pie(**df.to_pandas()**, **# Pandas DataFrame**
names = 'Model',
values = 'Sales',
hover_name = 'Model',
color_discrete_sequence= px.colors.sequential.Plasma_r)
无论哪种情况,您都会看到下面的饼图:
作者图片
绘制折线图
对于这个例子,我将使用来自https://www . ka ggle . com/datasets/meet nagadia/apple-stock-price-from-1980 2021的 AAPL-10.csv 文件
许可证 —开放数据共享开放数据库许可证(ODbL) v1.0. 描述 —这是一个关于苹果公司股票预测的数据集,这个数据集从 1980 年开始到 2021 年。它是从雅虎财经收集来的。
要绘制显示开盘、收盘、高和低价格的折线图,将 Polars 数据帧直接转换为 Pandas 数据帧并在 Plotly Express 的line()
方法中使用会更容易:
df = (
pl.scan_csv('AAPL-10.csv')
).collect()px.line(df.to_pandas(), **# covert to Pandas DataFrame**
x = 'Date',
y = ['Open','Close','High','Low']
)
输出如下所示:
作者图片
执行探索性数据分析(EDA)
在下一个例子中,让我们对保险数据集进行一些 EDA。对于这个例子,我们将使用位于的数据集 https://www . ka ggle . com/datasets/teer tha/ushealthsiicedataset?资源=下载。
许可 : CC0:公共领域。描述 —该数据集包含 1338 行被保险人数据,其中根据被保险人的以下属性给出保险费用:年龄、性别、身体质量指数、子女数、吸烟者和地区。属性是数字和分类变量的混合。
首先,将 CSV 文件作为 Polars 数据帧加载:
import polars as plq = (
pl.scan_csv('insurance.csv')
)df = q.collect()
df
作者图片
分析吸烟者的性别分布
让我们分析一下不同性别吸烟者的分布情况:
import plotly.express as pxpx.histogram(df.to_pandas(),
x = 'sex',
color = 'smoker',
barmode = 'group',
color_discrete_sequence = px.colors.qualitative.D3)
像往常一样,我发现在我绘图之前,把极地数据帧转换成熊猫数据帧更容易。对于绘图,我使用 Plotly Express 中的histogram()
方法。下面是上述语句的输出:
作者图片
如你所见,对于每个性别,不吸烟的人比吸烟的人多。
吸烟者的性别分布分析
接下来,我们有兴趣看看男性吸烟者多还是女性吸烟者多:
px.histogram(df.to_pandas(),
x = 'smoker',
color = 'sex',
barmode = 'group',
color_discrete_sequence = px.colors.qualitative.Safe)
下面的结果表明,男性吸烟者比女性吸烟者多:
作者图片
分析费用如何取决于年龄
我想对这个数据集做的最后一个分析是,电荷如何依赖于年龄。由于 age 列是一个连续变量,如果能够将值绑定到不同的组中,然后将其转换为分类字段,将会非常有用。在 Polars 中,您可以使用apply()
和cast()
方法:
def age_group(x):
if x>0 and x<=20:
return '20 and below'
if x>20 and x<=30:
return '21 to 30'
if x>30 and x<=40:
return '31 to 40'
if x>40 and x<=50:
return '41 to 50'
if x>50 and x<=60:
return '51 to 60'
if x>60 and x<=70:
return '61 to 70'
return '71 and above'df = df.select(
[
pl.col('*'),
**pl.col('age').apply(age_group).cast(pl.Categorical)
.alias('age_group')**
]
)
df
在熊猫身上,你可以用
pd.cut()
的方法来表演宁滨。不幸的是,在 Polars 中没有等效的方法。
您将获得以下输出:
作者图片
现在,您可以根据 age_group 字段对数据帧进行分组,然后计算所有男性和女性的*均费用:
df = df.**groupby**('age_group').**agg**(
[
(pl.col('charges')
.filter(pl.col('sex')== 'male'))
.mean()
.alias('male_mean_charges'),
(pl.col('charges')
.filter(pl.col('sex')== 'female'))
.mean()
.alias('female_mean_charges'),
]
).sort(by='age_group')
df
您将看到以下输出:
作者图片
最后,您现在可以绘制图表,显示每个年龄组的*均费用如何变化:
px.bar(
df.to_pandas(),
x = "age_group",
y = ['male_mean_charges','female_mean_charges'],
barmode = 'group',
color_discrete_sequence=px.colors.colorbrewer.Accent,
)
作者图片
因为我们使用了 Polars,所以让我们利用惰性评估,将上面的所有代码片段合并到一个查询中:
import polars as pldef age_group(x):
if x>0 and x<=20:
return '20 and below'
if x>20 and x<=30:
return '21 to 30'
if x>30 and x<=40:
return '31 to 40'
if x>40 and x<=50:
return '41 to 50'
if x>50 and x<=60:
return '51 to 60'
if x>60 and x<=70:
return '61 to 70'
return '71 and above'**q = (
pl.scan_csv('insurance.csv')
.select(
[
pl.col('*'),
pl.col('age').apply(age_group).cast(pl.Categorical)
.alias('age_group')
]
)
.groupby('age_group').agg(
[
(pl.col('charges')
.filter(pl.col('sex')== 'male'))
.mean()
.alias('male_mean_charges'),
(pl.col('charges')
.filter(pl.col('sex')== 'female'))
.mean()
.alias('female_mean_charges'),
]
).sort(by='age_group')
)**px.bar(
q.collect().to_pandas(),
x = "age_group",
y = ['male_mean_charges','female_mean_charges'],
barmode = 'group',
color_discrete_sequence=px.colors.colorbrewer.Accent,
)
https://weimenglee.medium.com/membership
我将在即将到来的新加坡 ML 会议(2022 年 11 月 22-24 日)上主持一个关于 Polars 的研讨会。如果你想在 Polars 数据框架上快速起步,请在https://ml conference . ai/machine-learning-advanced-development/using-Polars-for-data-analytics-workshop/上注册我的研讨会。
摘要
在本文中,您了解了 Polars 没有自己的可视化 API。而是要在自己的绘图库比如 matplotlib 和 Plotly Express 上回复。虽然您可以将 Polars 数据帧作为系列直接传递到各种绘图库,但有时如果您只是将 Polars 数据帧转换为 Pandas 数据帧会更容易,因为大多数绘图库都具有对 Pandas 的固有支持。
将来,Polars 很有可能会有自己的绘图 API,但是现在,你必须用你现有的来凑合。
可视化民主倒退的决定因素
原文:https://towardsdatascience.com/visualizing-the-determinants-of-democratic-backsliding-e9e15a09a729
使用 K-最*邻分类器预测民主侵蚀
艾萨克·史密斯在 Unsplash 上拍摄的照片
介绍
机器学习模型是非常有用的工具,它让我们既能理解我们周围的世界,又能预测未来。然而,与此同时,往往很难理解他们的决定是如何做出的,以及如何解释他们的结果,尤其是当模型变得更加复杂时。数据可视化是一种有用的方法,可以使这些模型更容易理解。下面的简介将使用数据可视化来解释用于预测民主倒退的 K-最*邻分类器的功能。
k-最*邻
作者图片
k-最*邻(KNN)是一种受监督的机器学习技术,可以应用于回归和分类。KNN 分类器的工作原理是从训练数据中识别与我们感兴趣的观察最接*的“K”个点的数量,然后根据最接*点的多数类别来确定其类别。图 1 通过使用只有两个特征的简单模拟数据清晰地展示了这一概念。如图所示,基于最*的 5 次观察,在两个类别之间形成了(大部分正确的)判定边界。我们的实际数据集将包含更多的特征,因此需要将这一概念推广到多维特征空间。然而,这个简单的可视化应该有助于说明这个概念。
背景
在我们开始分析之前,对民主倒退有一个概念性的理解是很重要的。最*,全球走向民主的趋势似乎正在逆转,许多国家正在经历所谓的民主倒退,这一事实已被大肆宣扬。民主倒退被定义为“国家主导的削弱或消除维持现有民主的政治机构”,是一个描述国家走向更专制的治理形式的各种过程的总称。政治科学家已经对民主崩溃的各种过程有了相对充分的理解,但问题仍然存在:民主倒退的原因是什么?什么指标可以用来预测一个国家是否会倒退到离民主治理更远的地方?在简报的其余部分,我们将使用上面讨论的 KNN 模型来尝试回答这个问题。
数据
作者图片
用于这项分析的数据是从几个不同的来源汇编的。分析单位是国家年,观测始于 1960 年,跨越 166 个不同的国家。因变量——民主倒退的存在与否——是基于 Polity Project 的 Polity 5 数据集创建的,该数据集衡量民主和威权治理的各种质量。这包括一个 221 分制的“政治得分”,从-10 分(世袭君主制)到 10 分(巩固民主制)。衡量民主倒退的方法是从上一年的政治得分中减去感兴趣的一年的得分。因变量是一个二元变量,政治得分的负年度差异被编码为 1-代表民主倒退的发生率,正年度差异或无变化被编码为 0-表明没有倒退的证据。数据显示,民主倒退是一个罕见的事件——如图 2 所示,自 1960 年以来,在* 2500 个有政体得分的国家年中,倒退事件不到 200 次——只有 8%左右。因此,在运行模型时需要解决明显的偏差。
这些关键的独立变量构成了一套社会和制度因素,并从民主数据集中提取出来。V-Dem 指数是一个“多维和分类的数据集,反映了民主作为一种统治制度的概念的复杂性。”在完整的 V-Dem 数据集中的数百个可能的指标中,选择了 58 个最相关和最可概括的用于本分析的指标作为独立变量。
人口数据来自世界银行,GDP 和人均 GDP 的信息来自 Gapminder ,它提供了以 2011 年美元计算的年度估计值,以各国购买力*价为标准。⁴的年人均国内生产总值增长和人口被用来控制 V-Dem 变量对不同大小和经济发展水*的国家的不同影响。此外,还增加了一个十年变量来处理时间效应。最后,在条件生效需要时间的假设下,所有独立变量(几十年除外)都滞后了 5 年。
分析
作者图片
为了运行机器学习模型,我非常依赖 Python 的 Scikit-learn 包,它提供了一套用于预测数据分析的工具。⁵:除了运行 KNN 分类器,我还使用交叉验证来验证模型,并将其调整到所需的超参数。这里使用的交叉验证方法是 k-Fold 验证,它将观察值分成 k 组,只将最后一组作为测试集。然后重复 k 次,基于 k 个测试组的*均值计算交叉验证估计值。为了分析的目的,k 设定为 5。该模型根据用于计算的邻居数量进行了调整。使用 50 个最*邻的估计产生了最好的结果。
作者图片
因为数据集是不*衡的,如图 1 所示,所以我使用重采样技术来人为地增加少数民族类的大小。该模型中使用的技术称为上采样或过采样。过采样允许通过从现有数据生成新样本来人为增加少数样本的数量,以解决*衡问题。为了实现过采样,我通过 SkLearn contributor 包 imblearn 使用了 RandomOverSampler 特性,该包是专门为帮助处理不*衡数据集而设计的。⁶
为了评估模型的性能,我使用了两个指标。使用的主要度量是*衡精度。在处理不*衡数据时,*衡精度优于常规精度度量,因为它根据类的反向流行率对精度进行加权,从而防止由于简单预测主导类而导致的估计值膨胀。我还测试了由管道确定的最佳模型的召回能力。召回率计算为 tp / (tp + fn) —或分类器找到所有阳性样本的能力。在这种情况下,这相当于能够正确识别倒退事件。
最后,在运行模型之后,我试图确定模型中每个变量的重要性。为此,我使用了 SkLearn 的置换函数。这种方法一次打乱一个变量的数据,然后使用该模型对现已打乱的数据进行重新预测。然后对每个变量重复 5 次。然后,我们可以根据模型预测准确性的最大变化来确定哪些变量对模型最重要,这也是由模型的*衡准确性得分决定的。
结果
总的来说,该模型具有相当好的预测性,返回了 0.7498 的*衡准确度分数,这意味着它能够在大约 75%的时间内准确预测倒退的情况。
该模型在测试数据中正确预测倒退的能力甚至更高,召回分数为 0.79,这意味着它能够预测 79%的倒退情况。图 3 中的混淆矩阵展示了模型在不同的可能类别组合中的表现,x 轴上是预测值,y 轴上是真实值。如图所示,该模型最薄弱的环节是其产生假阳性的倾向。它预测有 162 个案例会出现倒退,而实际上没有。这可能至少部分是由于缺乏足够的倒退样本,并意味着需要做更多的工作来补偿偏斜的 Y 分布。
根据评估变量重要性的排列运行,完整模型中最重要的变量是表达自由,对*衡准确度得分的*均影响为 0.013。图 4 显示了前 10 个最重要的变量。彩色条代表所有 5 次试验的*均效果,而穿过它们的误差线跨越排列的最大和最小效果。有趣的是,前 10 名没有一个共同的主题贯穿其中,这意味着没有任何特定的定义特征集有助于预测倒退。相反,有许多分散的因果因素。
结论
从上面可以看出,K-最*邻分类器提供了一种有效的方法来处理涉及各种特征的分类问题。此外,可视化提供了一个“引擎盖下的外观”,使模型及其性能更容易解释。这在政策背景下尤其重要,因为没有背景的预测几乎没有用处。解释驱动模型的因素的能力可以为决策者提供必要的信息,以加强他们的民主和避免倒退。
[1]:南希·贝尔梅奥,“论民主倒退”,《民主杂志》27 期,第 1 期(2016):5–19。doi:10.1353/jod
[2]:蒙蒂·g·马歇尔(Monty G. Marshall),特德·罗伯特·古尔(Ted Robert Gurr)(2020),《政体 5:1800–2018 年的政治体制特征与转型》。数据集用户手册。系统和*中心。http://www.systemicpeace.org/inscr/p5manualv2018.pdf
[3]: Michael Coppedge 等人,“V-Dem[国家–年份/国家–日期]数据集 v10”(2020),民主的多样性(V-Dem)项目。https://doi.org/10.23696/vdemds20
[4]:世界银行,世界发展指标。人口总数[数据文件],(2012)从 https://data.worldbank.org/indicator/SP.POP.TOTL检索
[5]: Pedregosa,f .等人(2011),sci kit-learn:Python 机器学习研究杂志中的机器学习,12,2825–2830。
[6]:纪尧姆·勒迈特、费尔南多·诺盖拉和克里斯特斯·k·阿里达斯(2017),《不*衡学习:一个 Python 工具箱来解决机器学习中不*衡数据集的诅咒》,《机器学习研究杂志》,18(17),1–5。
使用 Jupyter 笔记本电脑和 Streamlit 可视化疫情的经济影响
数据可视化
在科维德·疫情的震惊之后,我们回到正轨了吗?我们可以使用经合组织的数据、Python、简单的回归模型和 Jupyter 笔记本来找出并创建一个交互式 Streamlit 应用程序来显示结果
Streamlit 应用程序截图—作者图片
在大多数国家,GDP 在 2020 年第一季度像石头一样下降。停工和疾病意味着工业陷入停顿。
在正常情况下,GDP 往往会随着时间的推移而增长,但当出现像我们现在正在经历的这种特殊事件和 2008 年的金融危机时,就不会这样了。它急剧下降。
GDP 是一个国家整体财富的指标;当失业率高时,就业率往往更高,公民通常也更富裕。但是,像我们现在经历的这种冲击,并不一定意味着潜在的经济因素已经发生了变化。那么,如果疫情没有发生,我们的经济会恢复到应有的水*吗?事实上,正如一些政客暗示的那样,他们已经这样做了吗?
这真的取决于你如何看待它——你在衡量什么,在什么时期衡量。
我们将使用一个回归模型来研究,如果没有 2008 年和疫情的影响,增长可能会如何继续。然后,我们可以将当前事件状态与建模的事件状态进行比较。
经合组织数据
我用经合组织的数据制作了一些可视化的 Plotly,可能有助于澄清这种情况。
我用 Jupyter 笔记本做了我的第一次分析,以解决一些特定的问题。然后我创建了一个 Streamlit 应用程序(你可以在上面的图片中看到),它使用户能够与数据交互(这是一个原型,很快就会更新)。
笔记本电脑、Streamlit 应用程序和数据文件都可以下载——参见最后的链接。
我决定只关注 G7 国家,因为这比试图解决整个世界更可行。经合组织提供了从 2007 年到 2021 年底的全球生产总值和经济增长数据。这很方便地涵盖了 2008 年的金融危机以及当前的形势。
正如你所料,只要你引用正确,经合组织的数据对任何人都是免费的。因此,需要明确的是,该数据集来自经合组织的季度国民账户,并在本文末尾有完整的引用,可以在这里找到。
该数据是三个时间序列的组合:
- VIXOBSA:数量指数,经合组织参考年 2015 年,经季节性调整
- GPSA:增长率基于经季节性调整的数量数据,与上一季度相比的百分比变化
- GYSA:增长率基于经季节性调整的数量数据,与上一年同季度相比的百分比变化
我们将在这里使用体积数据,尽管该应用程序也允许您探索其他两个数据集。
如果您想使用 Jupyter 笔记本,那么您需要首先导入库。
import pandas as pd
import matplotlib
import plotly.express as px
我们可以创建一个包含所有数据的数据帧。
gdpdata = pd.read_csv('QNA_26022022111050612.csv')
然后创建一个包含卷数据的新数据帧,即 VIXOBSA 数据。
data = gdpdata[gdpdata['MEASURE']=='VIXOBSA']
然后,我们通过选择我们确实需要的列来删除我们不感兴趣的列。
data = data[['Country','Period','Value']]
它看起来是这样的:
作者图片
这些列代表 G7 集团中的 7 个国家之一(我们在这里看到加拿大的部分数据),记录数据的年份和季度以及数据本身。
每行记录一个季度的 GDP。因此,我们可以看到,在数据集中的前 5 个季度,加拿大的 GDP 每个季度都有所增长。
顺便说一下,这些数字不是美元或任何其他货币的总数,而是相对于 2015 年而言的。2015 年的*均国内生产总值是 100,然后每个季度都相对于这个数字进行计算:因此,如果某个特定季度的数字是 95,那么这代表的值是 2015 年*均值的 95%。以这种方式表示 GDP 意味着我们可以在图表上绘制所有国家的数字,并在相同的尺度上看到每个国家的相对增长。
这是 G7 在 2007 年至 2021 年间的 GDP 曲线图。
作者图片
这是生成它的代码。
fig = px.line(
data,
x='Period',
y='Value',
color='Country',
template='none')
fig.show()
这显示了 G7 国家的 GDP 随欧元区、G7 整体以及 OECD 国家整体的变化。
你可以看到 2008 年危机之后的大幅下跌,以及 2020 年初疫情爆发后的大规模突然下跌。
你还可以看到,从 2010 年初到最*,大多数国家的 GDP 都在增长(意大利是个明显的例外),因此可以想象,如果没有当前的危机,这种趋势还会持续下去。
但疫情来袭,GDP 骤降至 2008/09 年以来的最高水*。虽然出现了快速复苏,但 GDP 并没有反弹到之前的水*,而是在最初飙升,然后开始缓慢上升。
为了使将来的计算更容易,我将添加一个列,用数字表示每个季度。它是这样工作的:第一年,2007 年是 0 年,第一季度是 0.25,第三季度是 0.5 等等。因此,例如,2020 年的第三季度将是 13 年加上 0.75 代表第三季度:13.75。在绘制数据子集和计算回归线时(我们将在后面看到),使用实数会让事情变得简单一些。
以下是代码:
def formyr(x,data):
d = data['Period'].values[x]
#print(data['Period'])
y= int(d[-4:])+int(d[1:2])*0.25 - 2007
return y yr=[formyr(x,data) for x in range(len(data)) ]
data['yr'] = yr
让我们放大一点,更详细地看看趋势:这是 2019 年第三季度到 2021 年底的折线图。
fig = px.line(
data[data['yr'] > 12.5],
x='Period',
y="Value",
color='Country',
template='none')
fig.show()
作者图片
现在更容易看出,国内生产总值再次上升,并正在接*,甚至在某些情况下超过疫情前的水*。
事情正在好转吗?
是的,他们是。如果我们绘制整个日期范围的趋势线,我们会看到,总的来说,国内生产总值的趋势仍然是向上的(意大利除外)。
fig = px.scatter(
data,
x='yr',
y="Value",
title='',
color='Country',
template='none',
trendline='ols')fig.show()
作者图片
也许把 G7 作为一个整体来看待更容易一些。
fig = px.scatter(
data[data['Country'].isin(['G7'])],
x='yr',
y="Value",
title='',
color='Country',
template='none',
trendline='ols')
fig.show()
作者图片
这里你可以清楚地看到,尽管经历了 2008 年和现在的冲击,趋势线仍然显示出稳定的增长水*。事实上,目前的 GDP 水*高于趋势线预测的水*。
这是否意味着,如果没有发生这些金融动荡,我们会处于与现在同样的境地?不。趋势线(由 Plotly 计算)是一个考虑了倾角的回归模型。如果这些下跌没有发生,回归线会有所不同。
一种新的回归模型
Plotly 趋势线是一个回归模型的结果,该模型考虑了整个数据范围,但如果我们建立一个新的模型,忽略那些异常情况,我们就会有一条趋势线,向我们显示如果 2008 年和疫情事件没有发生,事情可能会如何。
在下面的代码中,我们使用 SciPy 构建了一个回归模型。它是根据两次崩溃之间的数据进行训练的,然后应用于整个数据范围。这可能会让我们更好地了解,如果疫情没有发生,现在的 GDP 会是多少。
建立和应用模型后,我们绘制结果。灰线是 Plotly 计算的整个期间的趋势,红线是回归模型的新趋势线。为了简单起见,我们将 G7 视为一个整体。
# build regression model for one year from Q1 2009 to Q4 2019
# attempt at missing out major effects from 2008 and pandemic
# the middle years are closer to linearfrom scipy import stats
import plotly.graph_objects as go# new df for OECD data only
OECDdata = data[data['Country']=='OECD - Total']# set x and y values for limited period
x= OECDdata[16:-8]['yr']
y= OECDdata[16:-8]['Value']# create model for limited period
slope, intercept, r, p, std_err = stats.linregress(x, y)def f(x):
return slope * x + intercept# create new trendline data and insert new column
rlist = [f(x) for x in OECDdata['yr'] ]
OECDdata.insert(1, "r", rlist)fig = px.scatter(
OECDdata,
x='yr',
y='Value',
template='none',
trendline='ols',
trendline_color_override="grey")fig.add_trace(
go.Scatter(
x=OECDdata['yr'],
y=OECDdata['r'],
mode="lines",
line=go.scatter.Line(color="red"),
showlegend=False)
)
这是结果。
作者图片
你可以看到这条红线非常符合疫情之前和 2008 年之后的趋势,向我们表明增长应该比现在高得多。
这是正确的吗?如果是这样的话,我们还有一些工作要做。
但这只是一个数据实验,可能有理由认为结果不可信。一个立即浮现在脑海中的想法是,由于 2008 年,这中间几年的增长率可能会更高。如果那次崩盘没有发生,那么 5 月份我们会看到一个不那么陡峭的上升,因为我们会从一个更高的基数开始。
然而,通过思考这些数据,我们或许可以洞察什么是真实的,什么不是。
我希望这个小小的统计数据是有用的,或者至少有点娱乐性。
一如既往地感谢您的阅读,如果您想知道我何时发表新文章,请考虑注册下面的电子邮件提醒,或者订阅我在 Substack 上偶尔发布的免费简讯。
如果你还不是一个媒体订阅者,那就注册吧,这样你就可以每月花 5 美元阅读尽可能多的文章。在这里注册,我将赚取一小笔佣金。
密码
本文和 Streamlit 应用程序的代码可以在我的 Github 库这里找到。
在 Streamlit Cloud 这里可以访问 Streamlit app(注意,这是一个原型,没有使用文章中的所有代码,将在适当的时候更新)。
参考
- 经合组织(2022 年),季度国民账户:七国集团国民生产总值 EI 副本,网址:https://stats.oecd.org/Index.aspx?QueryId=77241(2022 年 2 月 26 日访问)
用 Python 可视化光速
创建简单的可视化,一步一步地显示光在外层空间传播的时间和距离
我在科学课上被告知光是超级快的。在真空中,它的速度大约是每秒 3 x 10⁸米(每秒 186,282 英里)。光从太阳传播到地球大约需要 8.3 分钟。因为不可能观察到光速,所以我必须用我的想象力记住所有这些信息。
最*发现一篇文章叫可视化光速(快,但是慢)。有一个视频展示了光速在太阳系中的实时旅行。这是展示光速有多快的天才方式。
外太空很大,有很多天文物体。因此,创建一个选择我们想要的天文物体的可视化将是有用的。本文将展示如何使用 Python 制作简单的动画,显示光线在空间移动时的时间。
本文中可视化的一个例子。阳光到达外行星的距离和时间。作者的动画。由 Eduardo Rosal 在 Unsplash 上拍摄的壁纸照片。
让我们开始吧。
内行星
首先,我们将想象光线从太阳传播到内行星,即水星、金星、地球和火星。
创建数据框架
我们将用 pd 在 Python 上手动创建一个简单的 DataFrame。数据帧。我自己收集了本文中使用的数据。各种天文数据可以在维基百科上找到。如果有不正确的地方,请在评论中告诉我。
导入库后,创建三个列表:对象名称、距离和半径。然后,从这三个列表中创建一个数据帧。
距离是远日点,轨道上离太阳最远的点。可以改成*日点,轨道上离太阳最*的点,或者半长轴,*日点和远日点的*均值。半径是为了以后计算尺寸。
总时间可以通过将距离除以光速(299,792,458 米/秒)来计算。下面的代码显示了如何获取总次数(以分钟为单位),这将用于创建光的距离列表。
为了使用 Plotly,我们需要创建一个每分钟包含一组数据的 DataFrame。我们可以用目标数据帧乘以分钟数,然后将它们连接起来。然后,创建时间和 Y 轴列。
手动创建灯光数据帧。这个数据帧用于在动画中显示光的运动。
将对象和灯光数据帧连接在一起。可视化将是二维的。因此,我们可以通过将半径乘以数字π来计算每个物体的面积。
与太阳系的行星相比,太阳太大了。如果我们直接绘制它们,散布大小会有太大的差异。我们应该增加其他行星的面积,然后在动画中显示天体。请注意,结果中获得的尺寸不会按比例绘制。
天文单位( AU )是长度单位。1 天文单位等于太阳到地球的距离。为了使结果更具信息性,通过将每个对象的距离除以 149,597,871 km 来创建 AU 列。最后,为注释创建一个文本列。
形象化
接下来是可视化部分。我们将使用 Plotly ,这是一个 Python 图形库,很容易用来制作交互式图形。Plotly 是强大的绘图功能,由于其定制。
作为一个例子,让我们从一个简单的交互式散点图开始。
使用 Plotly 可视化光速与内行星的距离。图片由作者提供。
为了改善结果,用颜色定义每个天体的字典。以下颜色代码用作示例。
下面的代码显示了如何通过给每个天体分配颜色并添加背景壁纸来改善结果。壁纸是由爱德华多·罗萨从 Unsplash 取回的。
瞧啊。!…
阳光到达内行星的距离和时间。比例距离。尺寸不符合比例。作者的动画。爱德华多·罗萨尔在 Unsplash 上拍摄的壁纸照片。
现在,让我们进一步把这些代码应用到其他天体上。
外行星
外行星是木星、土星、天王星和海王星。与内行星相比,这些行星要大得多。它们被称为气态巨行星,因为它们主要由气体和液体组成。
手动创建太阳和外行星的数据框架。
定义一个函数来简化获取绘图数据帧的步骤。
应用该功能
创建一个用于处理尺寸的列和一个用于注释的文本列。
将数据可视化。
Ta-daaaaa
阳光到达外行星的距离和时间。比例距离。尺寸不符合比例。作者的动画。由 Eduardo Rosal 在 Unsplash 上拍摄的壁纸照片。
太阳离我们很远
我总是很好奇绕太阳运行最远的物体是什么。用快查,是一个叫 FarFarOut 的物体。这个名字听起来很有趣。这是一颗跨海王星物体,一颗比海王星绕太阳运行*均距离更远的小行星。因此,我们也将绘制海王星来比较结果。让我们看看 FarFarOut 有多远。
创建一个数据框架。
由于太阳和 FarFarOut 之间的距离很长,光速将以千米/小时为单位来加速计算。
创建一个用于处理尺寸的列和一个用于注释的文本列。时间单位是小时。绘制时,FarFarOut 太小。我们可以用^(脱字符号)来指出它的位置。
将数据可视化。
阳光到达远方的距离和时间。比例距离。尺寸不符合比例。作者的动画。由爱德华多·罗萨在 Unsplash 拍摄的壁纸照片。
每颗行星及其卫星。
太阳系中有卫星的行星是地球、火星、木星、土星、天王星和海王星。这里我将分别画出它们的一些卫星:月亮、戴莫斯、木卫四、伊帕托斯、奥伯龙和内索。
如果你想用他们的其他自然卫星做实验,代码可以修改。
创建一个行星和卫星的列表和一个字典来指定 Y 轴的值。
应用函数。
使用字典将 Y 轴值指定给对象。创建一个用于处理尺寸的列和一个用于注释的文本列。
最后,可视化数据。
瞧啊。!…
光从行星传播到其卫星的距离和时间。比例距离。尺寸不符合比例。作者的动画。由 Eduardo Rosal 在 Unsplash 上拍摄的壁纸照片。
关于数据
正如我提到的,我通过手动在维基百科上查找来收集本文中使用的天文数据。这些数据将来可以更改。如果有不正确或不及时的地方,请在评论中告诉我。
此外,天文大小,在现实中,太不同,如太阳和月亮。当它们被缩放用于绘图时,这是一个限制。因此,请注意本文中的一些结果不是按比例的。
总结
本文展示了如何创建一个简单的动画来可视化光速。其他天体可以用同样的方法绘制。如果您有建议或问题,请随时发表评论。
感谢阅读。
这些是关于数据可视化的其他文章,您可能会感兴趣。
参考
- j . des jardins(2019 年 11 月 11 日)。可视化光速(快,但慢)。视觉资本家。2022 年 5 月 9 日检索,来自https://www . visual capitalist . com/visualizing-the-speed-of-light-fast-but-slow/
- 维基媒体基金会。(2022 年 5 月 11 日)。太阳系。维基百科。检索于 2022 年 5 月 12 日,来自https://en.wikipedia.org/wiki/Solar_System
- 维基媒体基金会。(2022 年 5 月 4 日)。自然卫星。维基百科。检索于 2022 年 5 月 12 日,来自https://en.wikipedia.org/wiki/Natural_satellite
- 维基媒体基金会。(2022 年 5 月 5 日)。 2018 AG37 。维基百科。于 2022 年 5 月 12 日从 https://en.wikipedia.org/wiki/2018_AG37 检索
可视化您的嵌入
原文:https://towardsdatascience.com/visualizing-your-embeddings-4c79332581a9
从 SNE 到 SNE 霸王龙和 UMAP 的进化指南
作者图片
介绍
根据多项估计,当今企业生成的 80%的数据是非结构化数据,如文本、图像或音频。这些数据在机器学习应用方面有着巨大的潜力,但在直接使用之前还有一些工作要做。特征提取帮助从原始数据中提取信息嵌入。嵌入,我和我的合著者和 Arize 的同事 Aparna Dhinakaran 在的上一篇文章中提到过,是许多深度学习模型的支柱;它们被用于 GPT 3,DALL E 2,语言模型,语音识别,推荐系统和其他领域。然而,一个长期存在的问题是,现在很难对嵌入和非结构化数据进行故障诊断。理解这种类型的数据具有挑战性,更不用说识别新的模式或变化了。为了有所帮助,有几种使用降维技术可视化数据集嵌入表示的突出方法。在这篇文章中,我们将介绍三种流行的降维技术及其演变。
首先值得注意的是,介绍这些技术的学术论文——SNE(“随机邻居嵌入,作者杰弗里·辛顿和萨姆·罗韦斯),t-SNE(“使用 t-SNE 可视化数据”,作者劳伦斯·范德马腾和杰弗里·辛顿),以及 UMAP(乌玛普:统一流形*似和投影降维),作者利兰·麦金尼斯、约翰·希利和詹姆斯·梅尔维尔——都值得完整阅读。也就是说,这些都是密密麻麻的文件。这篇文章旨在成为一个易于理解的指南——也许是阅读完整论文之前的第一步——帮助时间紧迫的 ML 从业者理解从 SNE 到 SNE t 到 UMAP 的潜在逻辑和演变。
作者图片
什么是降维?
降维作为机器学习可视化和预处理的一项基本技术,在数据科学中扮演着重要的角色。降维方法将高维数据 X={x0,x1,…,xN} 映射到低维数据 Y = {y0,y1,…,yN} ,其中 N 是数据点的数量。
本质上,计算嵌入是一种降维形式。当处理非结构化数据时,输入空间可以包含大小为 WHC(宽度、高度、通道)、标记化语言、音频信号等的图像。例如,让输入空间由分辨率为 1024×1024 的图像组成。在这种情况下,输入维数大于一百万。让我们假设您使用 ReNet 或 EfficientNet 之类的模型,并提取 1000 维的嵌入。在这种情况下,你的输出空间维数是 1000,低了三个数量级!这种转换将非常大的、通常很稀疏的输入向量变成更小的(仍然具有相当大的大小)、密集的特征向量,或者嵌入。因此,我们将这个子空间称为特征空间或嵌入空间。
一旦我们有了与输入相关联的特征向量,我们该怎么处理它们呢?我们如何从它们身上获取人类可解读的信息?我们无法想象比三维更高的物体。因此,我们需要工具来进一步将嵌入空间的维度减少到两个或三个,理想情况下尽可能多地保留数据集的相关结构信息。
有大量的降维技术。它们可以分为三类:特征选择、矩阵分解和邻居图。我们将专注于后一类,其中包括 SNE(随机邻居嵌入),t-SNE(t-分布式随机邻居嵌入)和 UMAP(一致流形逼*和投影)。
进化:SNE → t-SNE → UMAP
在这一节中,我们将从 SNE 开始讨论邻居图方法的发展。然后,我们将在此基础上,解释导致 SNE 霸王龙和后来的 UMAP 霸王龙的修改。
这三种算法的操作方式大致相同:
- 计算高维概率 p 。
- 计算低维概率问
- 通过给定的成本函数 C(p,q) 计算概率之间的差异。
- 最小化成本函数。
窦房结电图
本节涵盖了随机邻居嵌入(SNE)算法。这将是我们进一步了解 SNE 霸王龙和 UMAP 的基础。
第一步:计算高维概率
我们从计算概率开始
数据点 i 将选择另一个点 j 作为其邻居,
在哪里
代表高维点 Xi , Xj 之间的相异。它被定义为缩放的欧几里德距离,
数学直觉: 给定两点 X i, X j,它们越远,它们的距离 dj|i 越高,它们的相异度越高,它们将彼此视为邻居的概率越低。
关键概念: 两个嵌入在空间中越远,它们越不相似。
请注意,由于参数 σi 的原因,这种差异是不对称的。这是什么意思?在实践中,用户设置本地邻居的有效数量或困惑度。一旦选择了困惑、k;该算法通过二分搜索法找到 σi ,以使邻居上分布的熵相等
其中 H 是香农熵,以比特为单位。从前面的等式我们可以得到
因此,通过调整 σi,我们可以调整右侧,直到它与用户设置的困惑度相匹配。局部邻居的有效数量(困惑度)越高, σi 越高,并且在相异度中使用的高斯函数越宽。
数学直觉: 困惑度越高,越有可能将相距较远的点视为邻居。
可能会出现一个问题:如果困惑是用户决定的,我们如何知道哪个是正确的?这是艺术与科学相遇的地方。对于我们可以使用散点图可视化的低维空间的有用投影来说,困惑的选择是至关重要的。如果我们选择的困惑度太低,那么我们期望由于相似性而在一起的数据点的聚类将不会出现在一起,而我们将会看到子聚类。另一方面,如果我们选择一个对于我们的数据集来说太大的困惑,我们将看不到正确的聚类,因为来自其他聚类的点将被认为是邻居。困惑没有一个确定的全好值。然而,有一些好的经验法则。
建议:SNE和t-SNE(是的,t-SNE 也有不惑力)使用 5 到 50 之间的不惑力值。**
因为在许多情况下,没有办法知道正确的困惑是什么,从 SNE(和 t-SNE)那里得到最多可能意味着分析具有不同困惑的多个情节。
第二步:计算低维概率
现在我们有了高维概率,我们继续计算低维概率,这取决于数据点在低维空间中的映射位置。幸运的是,这些更容易计算,因为 SNE 也使用高斯邻域,但是具有固定的方差(没有困惑参数),
第三步:选择成本函数
如果点 Yi 在低维空间放置正确,条件概率 p 和 q 会非常相似。为了测量这两种概率之间的不匹配,SNE 使用了 Kullback-Leibler 散度作为每个点的损失函数。高维和低维空间中的每个点都有条件概率将另一个点称为其邻居。因此,我们有多少数据点就有多少损失函数。我们将成本函数定义为所有数据点上 KL 散度的总和,
该算法首先将所有 y i 放置在非常靠*原点的随机位置,然后使用梯度下降来训练最小化成本函数 C 。关于成本函数微分的细节超出了本文的范围。
关于所使用的损失函数,有必要发展一些直觉。该算法的创造者表示“虽然 SNE 强调局部距离,但它的成本函数干净地强制保持附*物体的图像在附*,并保持相距较远的物体的图像相对较远。”让我们看看这是否是真的,使用下一张图,我们可以分别看到高维和低维概率 p 和 q 的 KL 散度。
库尔贝克-莱布勒分歧:作者图片
如果在高维空间中两个点靠得很*,它们的相异度很低,概率 p 应该很高( p ~ 1 )。那么,如果它们被映射到很远的地方,低维概率就会很低(Q0)。在这个场景中,我们可以看到损失函数取了很高的值,严重地惩罚了这个错误。另一方面,如果两个点在高维空间中彼此远离,则它们的相异度高,并且概率 p 应该低( p0 )。然后,如果它们被映射到彼此附*,低维概率将会很高( q1 )。我们可以看到 KL 背离并没有像我们希望的那样惩罚这个错误。这是 UMAP 将解决的一个关键问题。
t-SNE
至此,我们对 SNE 的工作原理有了一个很好的了解。然而,该算法有两个 t-SNE 试图解决的问题:它的成本函数很难优化,并且它有一个拥挤问题(下面将详细介绍)。为了解决这些问题, t-SNE 引入了两个主要的修改:对称化和使用低维概率的 t 分布。这些修改可以说使 t-SNE 成为多年来可视化降维的最先进技术,直到 UMAP 出现。
对称 SNE
第一个修改是使用 SNE 的对称版本。一般来说,到目前为止描述的条件概率是不对称的。这意味着点 xi 将点 xj 视为其邻居的概率与点 xj 将点 xi 视为邻居的概率不同。我们通过定义来对称化高维空间中的成对概率
这个定义
每一个数据点
对成本函数有不可忽略的贡献。你可能会想,低维概率呢?
拥挤问题
就我们目前所知,如果我们想要正确地投射点与点之间的*距离,中等距离会被扭曲,并在低维空间中表现为巨大的距离。根据 t-SNE 的作者的说法,这是因为“可用于容纳距离适中的数据点的二维地图区域,与可用于容纳附*数据点的区域相比,不够大。”
为了解决这个问题,引入的第二个主要修改是使用学生 t-分布(这是将‘t’赋予 t-SNE 的原因),低维概率具有一个自由度,
现在成对概率是对称的
主要优点是对称成本函数的梯度,
具有更简单的形式,计算起来更容易、更快,从而提高了性能。
由于 t-SNE 也使用 KL 散度作为它的损失函数,它也带来了前一节讨论的问题。这并不是说它完全被忽视了,但主要的收获是 SNE 霸王龙严格地优先考虑当地结构的保护。
直觉: 由于 KL 散度函数没有对高维空间中距离较远的点在低维空间中的错位进行惩罚,所以我们可以得出结论,全局结构没有得到很好的保存。SNE 霸王龙会把相似的数据点归为一类,但是类之间的距离可能没有任何意义。
UMAP
用于降维的统一流形*似和投影 (UMAP)与 t-SNE 有许多相似之处,也有一些非常关键的差异,这使得 UMAP 成为我们降维的首选。
这篇介绍这项技术的文章不适合胆小的人。它详细介绍了基于流形理论和拓扑数据分析的 UMAP 的理论基础。我们不会进入理论的细节,但请记住这一点:UMAP 的算法决策是由强大的数学理论证明的,这最终将使它成为机器学习的高质量通用降维技术。
现在我们已经了解了 SNE 霸王龙是如何工作的,我们可以在此基础上谈论它与 UMAP 的区别以及这些区别的后果。
相似之处的图表
与研究概率的 t-SNE 不同,UMAP 直接研究相似性。
- 高维相似性:
- 低维相似性:
请注意,在两种情况下都没有应用归一化(无分母),不像 t-SNE,性能有相应的提高。高维相似性的对称化是使用概率 t-conorm 实现的:
此外,UMAP 允许为高维相似性(eq)选择不同的度量函数 d。我们需要解决的是
前者表示低维空间中接*点之间的最小期望间隔,而后者被设置为这样的值
其中 k 是最*邻居的数量。两者
是超参数,其影响将在本节末尾讨论。
优化改进
在算法的优化阶段,UMAP 的创造者做出了一些对其出色性能起着至关重要作用的设计决策,包括:
- UMAP 使用交叉熵作为损失函数,而 t-SNE 使用 KL 散度。CE 损失函数既有引力又有斥力,而 KL 只有引力(值得注意的是 t-SNE 有斥力但不在损失函数上。排斥力出现在相似矩阵的重整化过程中。然而,全局重正化是非常昂贵的,UMAP 通过使用 CE 损失使它更简单,并且在保持全局结构上具有更好的结果)。通过损失函数的这种新选择,将高维空间中远离的对象放置在低维空间中附*是不利的。得益于损失函数的更好选择,UMAP 比它的前辈们能捕捉到更多的全局结构。
**
(a)t-SNE 使用的 KL 损失|(b)m 使用的 CE 损失(两幅图片均由作者提供)
图:SNE 和 UMAP 使用的损失函数比较。当高维空间中的远点在低维空间中被紧密地映射在一起时,交叉熵损失(b)是不利的。kull back-lei bler 损失(a)没有做到这一点。
2. UMAP 使用随机梯度下降来最小化成本函数,而不是较慢的梯度下降。
初始化的选择
UMAP 使用光谱初始化,而不是低维点的随机初始化。一个非常方便的拉普拉斯特征映射初始化(遵循理论基础)。这种初始化相对较快,因为它是从线性代数运算中获得的。它为随机梯度下降提供了一个良好的起点。理论上,这种初始化是确定性的。然而,考虑到所涉及的大型稀疏矩阵,计算技术提供了*似的结果。因此,不保证确定性,但实现了极大的稳定性。这种初始化提供了更快的收敛以及更大的一致性,即 UMAP 的不同运行将产生相似的结果。
还有其他一些差异值得探究。此外,UMAP 还有几个缺点。请继续关注关于 UMAP 利弊的下一篇文章。
结论
在过去的几十年里,可视化嵌入的技术取得了长足的进步,数学、计算机科学和机器学习的成功结合使新算法成为可能。从 SNE 到 SNE 和 UMAP 的演变为数据科学家和机器学习工程师更好地理解他们的数据和解决模型问题开辟了新的可能性。
想了解更多?了解为什么开始使用嵌入比您想象的要容易。有什么问题吗?欢迎来到阿里斯社区。
自然语言处理的可视化交互模型
原文:https://towardsdatascience.com/visually-interactive-model-for-nlp-841c8a83918f
使用 LIT 创建理解基于 NLP 的机器学习模型的可视化界面
文学(来源:作者)
NLP(自然语言处理)是数据科学的一个分支,处理理解和分析文本数据集,如分析情感,创建聊天机器人,推荐引擎等。它是人工智能最先进的概念之一。
随着越来越多的算法和技术的出现,创建 NLP 模型变得很容易,但是理解该模型以及预测是如何产生的仍然是未知的。我们如何了解我的模型在哪些数据上表现不佳?我的模型容易产生敌对行为吗?如果我改变了文本数据的样式,我的模型将如何表现?
这些问题现在可以很容易地用 LIT 来回答和分析。它是一个开源的 python 库,用于创建一个可视化的交互式仪表板,可以用来分析 NLP 模型、它们的预测、它们的行为等。以视觉上吸引人和互动的方式。
在本文中,我们将探索 LIT 并创建一个交互式仪表板来分析 NLP 模型。
让我们开始吧…
安装所需的库
我们将从使用 pip 安装来安装 LIT 开始。下面给出的命令将使用 pip 安装 LIT。
!pip uninstall -y tensorflow-datasets
!pip install lit_nlp tfds-nightly transformers==4.1.1
下载模型重量
在第一步中,我们将从下载预先训练的模型权重开始,这些权重将用于我们将要分析的模型。
!wget [https://storage.googleapis.com/what-if-tool-resources/lit-models/sst2_tiny.tar.gz](https://storage.googleapis.com/what-if-tool-resources/lit-models/sst2_tiny.tar.gz)
!tar -xvf sst2_tiny.tar.gz
导入所需的库
在这一步中,我们将导入加载数据集所需的所有库,从 LIT 示例中加载现有的 NLP 模型,并使用 LIT 对其进行渲染。
from lit_nlp import notebook
from lit_nlp.examples.datasets import glue
from lit_nlp.examples.models import glue_modelsdatasets = {'sst_dev': glue.SST2Data('validation')}
models = {'sst_tiny': glue_models.SST2Model('./')}widget = notebook.LitWidget(models, datasets, height=800)
之后,最后一步是在 Colab 笔记本中呈现这个小部件,并可视化仪表板。
可视化仪表板
下面给出的命令将在笔记本本身中呈现仪表板。
widget.render()
仪表板(来源:作者)
在这个控制面板中,有不同的部分,我们可以在其中分析数据并查看其执行情况,我们可以单独分析每个预测,还有更多的选项。您可以在下面的视频中看到不同的功能。
分析自然语言处理模型(来源:作者)
在这里,您可以看到我们使用一个高度交互式和视觉上吸引人的仪表板来分析 NLP 模型是多么容易。
尝试使用不同的数据集,创建这些仪表板,并让我知道您在回复部分的评论。
本文是与 Piyush Ingale 合作完成的。
在你走之前
感谢 的阅读!如果你想与我取得联系,请随时通过 hmix13@gmail.com 联系我或我的 LinkedIn 个人资料 。可以查看我的Github*简介针对不同的数据科学项目和包教程。还有,随意探索* 我的简介 ,阅读我写过的与数据科学相关的不同文章。
直观理解 XGBoost、LightGBM 和 CatBoost 正则化参数
里卡多·戈麦斯·安吉尔在 Unsplash 上的照片
更新:发现我关于渐变提升的新书实用渐变提升。这是用 python 中的许多例子对渐变增强的深入探究。
https://www.amazon.com/dp/B0BJ82S916 [## 实用的渐变增强:深入探究 Python 中的渐变增强
这本书的梯度推进方法是为学生,学者,工程师和数据科学家谁希望…](https://www.amazon.com/dp/B0BJ82S916)
构建正确的模型
当考虑一个数据科学问题时,一个优秀的数据科学家应该对驱动其模型性能的主要特性有所了解。
尽管从理论上讲,相信自动 ml、自动特征化、自动超参数调整会更好,但依靠人类的专业知识来驱动模型调整通常更省时省力。
结合人类的直觉和计算机科学马力是非常强大的。
将人类的直觉转化为模型选择和训练需要对模型如何工作有深刻的理解。
一幅画胜过千言万语
在本文中,我们将直观地展示当使用梯度推进方法时,超参数如何控制系综树的形状。
有许多这样的参数,但是我们将集中于驱动模型复杂性的参数:正则化参数。
幸运的是,(逻辑上)决策树的梯度提升的三个主要实现 XGBoost、LightGBM 和 CatBoost 主要共享相同的正则化超参数。
超参数及其对决策树构建的影响
在详细讨论最重要的超参数之前,让我们先介绍一些结构。
我们可以将超参数分为三类:
- 驱动树结构的超参数
- 驱动权重值的超参数
- 推动训练的超参数
正则化参数通常影响树结构以及权重值。
结构超参数
第一类对树的结构有影响:本质上是树的深度和叶子的数量。
内容超参数
第二组控制附加到叶子上的值,即预测值。
学习超参数
最后,第三种驱动训练:算法是否使用所有样本,我们是否应用所有计算的增益,…
可视化正则化超参数
Reg alpha
先说一个重要但不容易理解的参数:reg_alpha
。顾名思义,该参数对模型的正则化有影响。
正则化是一种数学方法,其目标是使函数光滑。它经常被用在物理学中,把一个不规则的函数转化成一个规则的,光滑的函数。
使用正则化函数非常方便,因为这种函数在微分时有很好的性质。当应用梯度推进时,我们需要一个至少可以微分两次的函数:一次是梯度,另一次是 Hessian。
对于决策树的梯度推进,正则化函数如下所示:
大多数 GBT 方法中使用的正则化公式。作者的公式。
在训练期间,该算法试图最小化该函数以及目标函数。
在这个公式中可以看到,alpha
是正则化函数Omega
的三个参数之一。
gamma
用于控制如何惩罚模型中的树的数量。
lambda
控制我们想要惩罚多少*方树叶权重的总和。当应用*方函数时,我们通常将该参数称为 L2 正则化项。
alpha
控制我们想要惩罚多少叶子权重的绝对值之和。我们通常将该参数称为 L1 正则化项,因为仅应用了绝对误差。
已知使用高alpha
生成所谓的稀疏模型,即模型,其中权重趋于零。最大化空值至少有两个好处:
- 它简化了模型
- 它减小了模型的大小,因为不需要存储空值。
这类似于稀疏矩阵。让我们看看下面的代码,在著名的虹膜分类数据集上,低的alpha
与高的lambda
相比如何:
比较高 L2 正则化和高 L1 正则化。作者代码。
两个模型的表现都很好,但是正如你所看到的,在第一个模型中,使用 L2 正则化,没有权重是空的,而在第二个例子中,使用 L1 正则化,我们得到 65 个空权重。
因此使用非空的reg_alpha
降低了模型的复杂性。
正如这篇文章所承诺的,我们可以看到不同之处。让我们看看使用 L1 正则化时的其中一个树:
当使用高α时,第五个估计量。作者的情节。
使用高 L2 正则化的相同估计量:
当使用高λ时,第五个估计器。作者的情节。
正如你所看到的,在 L1 的例子中,生成的树要简单得多,并且包含零作为权重。
Reg lambda
现在让我们更深入地了解一下lambda
。你可能已经注意到,或者已经知道,如果你已经读过我以前的文章:
lambda
缩放*方权重的和w_j
,因此在相对于w_j
求导时仍然出现。
这意味着与alpha
相反,lambda
对梯度值有影响,并隐含在最优解中:
最佳重量公式。由作者创作。
正如我在以前的文章中所述,当目标函数是*方误差时,hessian 的值是 2,因此H_j
是附加到当前节点的样本数量的两倍。
这意味着lambda
的值越大,越会降低最佳值,因为只有几个样本附加到一个节点上。
但这并不是lambda
as 在训练上的唯一效果。它还具有结构效应,因为lambda
也隐含在最佳增益中:
最佳增益公式。作者的公式。
提醒一下,最佳增益用于选择节点的最佳分割。具有最佳增益的分割将被保留为最佳分割。
相对于样本数量而言具有大的lambda
也会降低增益以及给定分割被认为是最佳分割的机会。
让我们用一个简单的例子来说明这一切:我们想根据整数的符号对它们进行分类。负整数应该标记为 1,而负整数应该标记为-1:
过度拟合模型。作者代码。
正如我们可以立即看到的,这个模型是过度拟合的,因为每个预测都有一个唯一的标签,而只需要两个标签。
让我们为lambda
使用一个正值:
我们现在只预测两个值。作者代码。
正如预期的那样,使用更大的lambda
值,得到的模型得到了简化。它现在只预测两个值。这是lambda
对生成的树的结构影响。
然而,正如我们在上面看到的,lambda
倾向于减少权重值,因此我们不预测 1 和-1,而是预测更小的值。使用更大的数据集在理论上应该可以减少这种影响,has lambda
在样本数量方面将变得可以忽略不计。
作者代码。
正如所料,更大的数据集减少了lambda
对权重的影响。该模型现在预测的值非常接* 1 和-1。
生成的树现在是:
一个简单的模型,使用正确的λ。作者的情节。
微克
正则化函数中隐含的另一个参数是gamma
,正如你在上面Omega
的定义中看到的。
看看这个公式,当有太多的树时,gamma
通过惩罚目标来增加模型的复杂性。T
树木的总数。
查看针对给定拆分添加两个新节点所带来的增益公式也很有趣:
非零伽玛会产生负增益。作者的公式。
该公式表明,只有当 gamma 为空时,两个新节点的增益大于原始节点的增益,拆分才会产生正增益。
使用非空伽马增加了另一个约束:增益必须大于gamma
,否则增益将为负。
让我们看看上一篇关于对负整数和正整数进行分类的文章,如何使用gamma
来获得一个合适的模型:
不使用和使用 gamma 训练模型。作者代码。
第一个模型是用gamma = 0
训练的,我们可以看到模型在预测中过度拟合。我们不是只有两个值,而是每个输入都有不同的值。
生成的树太复杂了:
当 gamma 为空时,模型复杂性不受控制。作者的情节。
相反,第二个模型使用gamma = 1
,这意味着当且仅当增益大于 1 时,新的级别被添加到树中。
预测表明,这一次我们有了一个合理的模型,因为我们只预测了两个不同的值:一个正值和一个负值。
绘制结果树证实了:
当 gamma 为非空时,得到的树被简化。作者的情节。
结论
Alpha、Lambda 和 gamma 是驱动决策树构建的三个重要参数。
总的来说,使用alpha
生成稀疏树,这将强调主要特征并丢弃其他特征。这导致了简单的树
lambda
用于剔除数量不足或至少重量不足的样品。
最后,gamma
作为对树中节点数量的直接影响。
VS 数据科学代码
原文:https://towardsdatascience.com/vs-code-for-data-science-aee82fe08bac
一个好的 Visual Studio 代码设置如何使您成为一个更有生产力的数据科学家
戈弗雷·尼安杰奇在 Unsplash 上拍摄的照片
TL;速度三角形定位法(dead reckoning)
VS 代码对于数据科学来说非常有用,尤其是如果你选择了最好的扩展;在这篇文章中,我分享了一些我最喜欢的扩展和我的配置。
什么是 VS 代码?
https://code.visualstudio.com/
它是由微软维护的开源 IDE,微软还拥有 GitHub 和 OpenAI。
它是目前最受程序员欢迎的 IDE[1】,非常具有可扩展性和个性化,并且可以处理我们通常使用的所有工具和文件格式。
StackOverflow 的 2021 年开发者调查中显示了最常用的 ide。
副驾驶员
在 VS 代码中使用 Copilot 生成文档和 Python 代码的例子。从 Rahul Banerjee 获得的 GIF。
描述
GitHub Copilot 是 GitHub 最*开发的 IDE 扩展,它使用 OpenAI 在代码和文本上训练的模型,可以提供非常有用的自动完成功能。这超越了通常的自动完成,在通常的自动完成中,我们只能获得给定对象的可用属性和方法的列表,以向我们建议完整的代码行、整个方法甚至注释和文档!
图片来自 GitHub Copilot 的网页。
为了使用它,您需要注册技术预览:
扩展ˌ扩张
https://marketplace.visualstudio.com/items?itemName=GitHub.copilot
自动重新格式化和警告
VS 代码在保存文件时如何自动更正格式的例子。从韦斯利·卡马戈处获得的 GIF。
描述
如果您使用格式化和林挺库,如flake8
和black
(您应该这样做),那么 VS Code 可以在每次保存文件时自动格式化您的代码,从而使它变得更容易。
您还会在可能违反代码样式规则的代码行中得到警告。
扩展ˌ扩张
在这种情况下不需要扩展,默认情况下它已经包含在 VS 代码中了!
搜索和替换
在 VS 代码中使用搜索工具查找所有出现的单词Code
的例子。从 Visual Studio 代码网站获得的 GIF。
描述
在 VS Code 的侧边栏上,您可以找到搜索工具,它可以快速找到您在整个目录中搜索的所有内容。此外,它允许你快速地用一个替换所有的,例如在一个变量被重命名的情况下。
扩展ˌ扩张
在这种情况下不需要扩展,默认情况下它已经包含在 VS 代码中了!
证明文件
通过 autoDocstring 扩展生成函数文档样板的例子。从尼尔斯·沃纳处获得的 GIF。
描述
记录代码是非常重要的,即使你不开源你的代码。总有这样的机会,你需要有人检查你的代码,甚至对你未来的自己来说,它可以帮助你记住它是如何工作的(老实说,看看你刚刚写的莫名其妙的东西🤷♂️ ).
两个扩展在这里很有帮助:
- autoDocstring :输入
"""
后,为函数生成样板文档。 - Copilot :它的自动完成功能可以完全生成你的整个文档,理解每个变量的上下文以及你的代码是如何工作的(只是要小心,有时它会完全误解事情的意思)。
扩展ˌ扩张
https://marketplace.visualstudio.com/items?itemName=njpwerner.autodocstring https://marketplace.visualstudio.com/items?itemName=GitHub.copilot
调试脚本
在 VS 代码中调试 Python 脚本的例子,包括通过 data viewer 分析数据帧。从 Visual Studio 杂志获得的 GIF。
我用它来进行一些调试会话。
描述
每个人都有可能定期面对代码中的错误。在数据科学中,你甚至会遇到数据和模型的错误。为了找出问题所在并修复它,没有什么比一个好的调试会话更好的了。
VS 代码允许我们调试脚本和笔记本,具有断点和调试控制台的所有常见功能,并添加了一些工具,如数据查看器,以检查那些可疑的数据帧。
您可以在一个launch.json
中配置您的调试设置,在这里您可以更改设置来调试外部代码(通过justMyCode
参数)和传递命令行参数(通过args
参数)。
扩展ˌ扩张
在这种情况下不需要扩展,默认情况下它已经包含在 VS 代码中了!
笔记本电脑
在 VS 代码中使用笔记本并调试笔记本单元的例子。从微软 Python 博客获得的 GIF。
描述
无论你是喜欢笔记本还是讨厌笔记本,它们都是探索数据、测试代码和进行建模实验的常用格式。虽然 Jupyter 笔记本可能有其问题,但我个人认为 VS Code【4】中的笔记本是一个重大改进。您可以在单个单元格上继续编码,并在 Markdown 中混合,但您也可以获得与编写脚本时相同的工具箱,如自动完成、调试和您可能已经安装的大多数其他扩展,如 Copilot 和 IDE 主题。您还可以看到运行每个单元所花费的时间,在我看来,这比在 Jupyter 中得到一个更好的 UI。
https://code.visualstudio.com/docs/datascience/jupyter-notebooks
扩展ˌ扩张
https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter https://marketplace.visualstudio.com/items?itemName=ms-python.python https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance https://marketplace.visualstudio.com/items?itemName=GitHub.copilot
对虚拟机的远程访问
VS 代码中通过远程 SSH 连接到服务器或 VM 的例子。从微软开源获得的 GIF。
描述
您可能会在服务器、虚拟机或其他一些您可能希望通过 SSH 连接的硬件上运行代码。幸运的是,通过使用远程 SSH 扩展,您可以连接到它们中的任何一个,并且仍然继续使用您的本地 VS 代码安装。
扩展ˌ扩张
https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh
实时共享/协作编码
在 VS 代码上使用 live share 的例子,让多人同时处理同一个代码。从 Fedora 杂志获得的 GIF。
描述
你知道如何在谷歌文档中实时协作编辑文档吗?你可以在 VS 代码中做同样的事情,即使你们不在同一个房间,也可以进行结对编程。
扩展ˌ扩张
https://marketplace.visualstudio.com/items?itemName=MS-vsliveshare.vsliveshare
Git 管理
通过 GitLens 扩展名检查 VS 代码中文件先前提交版本的例子。从 GitLens 获得的 GIF。
通过 GitHub 拉请求和发布扩展查看拉请求的示例。从 GitHub Pull 请求和发布获得的 GIF。
描述
VS 代码嵌入了对管理 git 的支持,允许你在没有终端的情况下进行推和拉。此外,我建议使用以下扩展:
- GitLens :通过显示提交、识别每一行代码中的最新更改、显示文件在之前提交的更改中的外观,以及其他功能来改善整体 git 体验。
- GitHub Pull 请求和发布:在 VS 代码中提供对 GitHub Pull 请求的访问,同时显示它们各自代码行上的注释。
扩展ˌ扩张
https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-pull-request-github
CSV
使用扩展名为 Rainbow CSV 的 VS 代码打开 CSV 文件的示例。从获取的 GIF 不再设置。
使用编辑 CSV 扩展进行更多类似电子表格操作的示例。从编辑 CSV 获得的 GIF。
描述
从事数据科学和/或机器学习的人倾向于使用 CSV 来存储他们的一些数据,而不得不使用 Excel 之类的东西可能有点烦人。在处理 CSV 时,您可以继续使用 VS 代码,特别是如果您安装了以下扩展:
扩展ˌ扩张
https://marketplace.visualstudio.com/items?itemName=mechatroner.rainbow-csv https://marketplace.visualstudio.com/items?itemName=janisdd.vscode-edit-csv
降价
在 VS 代码中查看和编辑降价文件的例子。从 Visual Studio 代码获得的 GIF。
描述
如果你对你的README
文件、文档或任何其他写作使用 Markdown,你可以在 VS 代码中这样做,拥有与你的代码的其余部分相同的相关颜色系统,并看到如何渲染 Markdown 的实时预览。
扩展ˌ扩张
在这种情况下不需要扩展,默认情况下它已经包含在 VS 代码中了!
乳液
通过 LaTeX Workshop 扩展在 VS 代码中编辑和查看 LaTeX 文件的例子。从乳胶车间获得的 GIF。
描述
那些撰写论文或书籍并做出(可能令人遗憾的)使用 LaTeX 的决定的人,也可以依赖 VS 代码。你只需要安装 LaTeX Workshop 扩展就可以获得实时预览和你在 IDE 设置中习惯的所有特性。
扩展ˌ扩张
https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop
扩展市场
VS 代码确实什么都有,包括约会扩展(!?)🤷♂️ 😛从贝纳瓦德获得的 GIF。
虽然我只关注我最喜欢的扩展,但你可以在扩展市场上找到许多其他的扩展。
我使用和推荐的一些其他扩展是 RescueTime ,用于跟踪我们的生产力,以及 Night Owl 主题用于风格😎
https://marketplace.visualstudio.com/items?itemName=RescueTime.rescuetime https://marketplace.visualstudio.com/items?itemName=sdras.night-owl
您可以在 VS 代码或以下链接中检查所有可用的扩展:
https://marketplace.visualstudio.com/vscode
settings.json
我的 current settings.json
定义了如何在扩展之外配置我的 VS 代码。
不是扩展安装的所有 VS 代码设置都保存在一个settings.json
文件中。上面你可以看到我目前的配置。
最后的想法
希望这篇简短的文章对您有所帮助,有可能说服您尝试 VS 代码和所展示的设置。我鼓励你探索其他的选择,包括扩展和 ide。事实上,我分享的一些扩展,例如 Copilot,也可以在 PyCharm 中使用。
看完这篇文章后,我建议至少尝试一下与 GitHub Copilot 一起使用的 VS Code 笔记本。你将获得一个令人惊叹的代码测试、数据探索和模型实验的*台,我认为与其他选择相比,它完全在另一个层次上。
参考
[1] 堆栈溢出开发者调查 (2021)
[2]杰瑞米·霍华德,我喜欢笔记本 (2020)
[3]乔尔·格鲁什(Joel Grus),我不喜欢笔记本 (2018)
[4] Jupyter 笔记本在 VS 代码 (2021)
VSCode 与 r studio——值得交换吗?
原文:https://towardsdatascience.com/vscode-vs-rstudio-worth-the-switch-7a4415fc3275
微软的旗舰代码编辑器能抵挡住旧的最爱吗?
克里斯托夫·高尔在 Unsplash 上拍摄的照片
对于大多数人来说,RStudio 是运行 R 代码的首选 IDE/编辑器,但是 VSCode 已经迅速成为大量其他语言最流行的代码编辑器之一。这篇文章是写给那些非常熟悉 RStudio 并希望了解两者对比的人的。因此,我不会过多讨论 RStudio,而是深入探讨 VSCode 与 RStudio 相比的优势和劣势。
此外,这是对两个编辑器的社区(免费)版本进行比较的一个非常简短的概述,我不能对 R-Studio 付费版本发表意见。
我是一个中级程序员,不像有些人那样经常使用 R,但是无论何时我使用 RStudio,它都是我首选的编辑器。对于其他所有东西(Python、Jupyter、HTML、CSS、JS 等),我倾向于使用 VSCode。我决定为 R 尝试 VSCode,因为我想看看我是否可以用一个代码编辑器来做所有的事情。
RStudio 是一款出色的软件,在我的工作流程中从未给我带来任何重大问题,这只是一个实验,旨在找到一个适合所有代码编辑器/IDE 的通用版本。
如果你只对我的结论或 TLDR 感兴趣;:
不,我暂时不会切换到 R 的 VSCode。
但是我喜欢 R 看起来很棒,而且已经开始工作了。
现在我们已经完成了,让我们进入一些细节:
安装
假设您的系统上已经安装了 R,安装 VSCode 和 R 非常简单;
- 下载。pkg 或者。exe 文件并安装代码编辑器;
- 为 R(install . packages(" languageserver ")安装" language server "软件包
- 从市场(https://marketplace.visualstudio.com/items?)安装 R 扩展 itemName = reditorsupport . RR—Visual Studio market place
您已经准备好开始编码了。
可选:你可以安装一个更好的终端,比如弧度,一个调试器和一个更好的绘图查看器,比如 httpgd ,因为 VSCode 的内置绘图查看器不是特别好。
设置编辑器
您现在可以开始处理代码了,但是在运行代码时,您可能会遇到错误。为了消除任何潜在的错误/代码不起作用,您必须确保在 VSCode 首选项中指定了 R 路径(在 mac 上为 cmd+shift+p ),并搜索 R 路径。
找到路径很简单,打开 R 并键入:
R.home("bin ")并复制输出路径。
您可能希望对编辑器进行的另一个重大调整是:
一些简单的快捷方式,如管道操作符,不能开箱即用,所以根据您的喜好,可以使用以下方法为“%>%”或“| >”添加快捷方式:
使用 R 代码:
这是我在相同的文件和环境下并排进行的两个设置的比较
RStudio:
(图片由作者提供)
vs code 中的 R:
(图片由作者提供)
使用 R 非常类似于常规的 RStudio IDER-extension 为安装软件包、绘图和绘图查看器、全局环境、数据集、绘图、列表、变量、检查加载的软件包等提供相同的支持。
可以修改终端和控制台的位置,使输入和输出窗格彼此相邻,这在 R-Studio 中是做不好的。所以 VSCode 感觉非常熟悉,运行代码非常直观。
运行代码
运行一段代码也非常类似于 RStudio。“运行文件”按钮位于面板的顶部,可以使用 mac 上的 cmd+return 快捷键运行单独的代码行。与上面修改管道运算符快捷方式的方式类似,可以很容易地修改快捷方式。
对于普通的 R 代码和。r 文件;对于包括我在内的许多人来说,VSCode 是一个很好的选择。所以如果你和我一样,你用 R 主要是为了统计分析,数据可视化和数据分析;试试 VSCode 吧。
使用笔记本和。Rmd
这就是 VSCode 落后 RStudio 如此之多的地方,它变成了一场单人赛马。VSCode 中的笔记本支持就一个字——可怕。在一个. Rmd 笔记本上运行代码块感觉和看起来都过时了。我在 RStudio 中创建的现有笔记本在 VSCode 中存在错误,尽管在 RStudio 中没有显示任何错误。创造新的笔记本电脑是不直观的,就整体感觉而言,仍远远落后于 RStudio。
我已经寻找解决方案,包括全球安装 pandoc,knitr 和 rmarkdown 等,并尝试了多个版本的 R 和前面提到的包都没有用。这是我还没有完全转向 VSCode 的最大原因之一。
关于四开本的一个注记
我最*开始玩 Quarto,它看起来像是 Rmarkdown 的自然继任者。到目前为止,我只在 RStudio 中使用过 Quarto,我非常喜欢它的外观和工作方式。我还没有在 VSCode 上尝试过,所以我不能对此发表评论。
我喜欢 VSCode 中 R 的什么地方
VSCode 是更快,快速加载,代码运行时快速而爽快。我没有对加载一段代码的时间做任何分析,但是 VSCode“感觉”更快。VSCode 还可以作为 R、Python、HTML、CSS 和其他几十种语言的一站式商店,并且比 RStudio 做得更好。对于许多 R 用户来说,最重要的特性之一就是多个 R 会话!!!——随 VSCode 附带,一款自由软件。当您试图同时开发几个相关的项目时,这尤其有用。VSCode 中的代码重构也比 RStudio 好很多
颜色选择器和色块对于像我这样处理大量数据可视化的人来说非常有用,看到颜色并使用色块无缝选择颜色的能力是一个游戏改变者。
颜色选择器—左:VSCode,右:RStudio(图片由作者提供)
语言服务器和文档大纲特性有助于在一长行代码中导航,并使处理多个 R 文件变得轻松。智能感知在 VSCode 中,代码完成速度更快,也更加用户友好。
VSCode 中的 Intellisense(图片由作者提供)
r 文档和帮助在两种软件中的处理方式非常不同。当涉及到 VSCode 中的帮助时,可以更快地获得信息,并且信息也更加精简。
将鼠标悬停在某个功能上获得帮助(图片由作者提供)
类似地,使用微软的 Liveshare,团队和多人在一个 R 文件上工作更容易。VSCode 中的 Git 和 github 集成无疑是任何代码编辑器中最好的之一,在与多人合作时更有帮助。代码片段在频繁使用一个函数或一行代码时很有帮助。我个人觉得 VSCode snippets 比 RStudio 更容易使用和设置。功能处理得非常出色。悬停在它们上面,你会得到各种信息和回调。VSCode 出色地处理了代码组织;代码段允许代码折叠,使代码阅读和导航更容易,代码整体更整洁。
VSCode 中的代码块(图片由作者提供)
最后,整个代码编辑器是高度可定制的,您可以通过编辑 VSCode 中的 json 文件来定制它。照此;VSCode 有一些惊人的特性,可能会真正吸引 RStudio 用户。
vs code 中我不喜欢 R 的地方
任何 R 代码使用 R-studio 的最大原因之一是因为它开箱即用,我们不需要安装扩展,而 R 的 VSCode 设置可能会很棘手,有时会涉及跟踪和错误。再者;R studio 中的 R-templates 非常棒,而且很容易找到和使用。RStudio 中的数据查看器也比 VScode 好得多,尤其是在处理大型数据集时。
尽管我使用 VSCode 开发 Python、HTML、CSS 等,但在其中编写 R 代码,尤其是最初几个小时,感觉非常奇怪,而且在某种程度上是陌生的,尽管整个 IDE 组织非常熟悉。目前不切换到 VSCode 的最大原因是笔记本支持——如果你使用 rmd 超过 r,不要切换;在 VSCode 中运行大量代码是非常笨拙和糟糕的,并且经常会导致无效的代码会话。此外,编织笔记本根本不能很好地工作,而且很多时候会导致错误。
即使有了`httpgd``包,VSCode 的绘图查看器也比不上 RStudio 的内置绘图查看器。R-terminal 有时会在 VSCode 中抛出错误,这些错误在 RStudio 中的同一段代码中是找不到的,当您很匆忙时,您可能不想处理这些错误。
本质上,RStudio 感觉更像是为数据科学家/统计分析人员量身定制的,而 VSCode 感觉像是以开发人员为中心的代码编辑器。
我希望用 VScode 尽快尝试的事情
- 四开
- Rblogdown 和 Rbookdown
- 更多调试
- 弧度终端
结论
目前为止我爱 VSCode 里的 R 吗? 绝对
足以让我想转行? 还没有。
为什么? 笔记本
我会很快切换吗? 希望是的。
如果你喜欢这个,有什么建议给我;在 twitter 上找到我:
进一步阅读
- 坤仁关于这个主题的一个很棒的视频:https://youtu.be/9xXBDU2z_8Y
- 同一题材的博客:https://renkun . me/2019/12/11/writing-r-in-vs code-a-fresh-start/
- 在 VSCode 中运行 R:https://www . infoworld . com/article/3625488/how-to-run-R-in-visual-studio-code . html
- 在 VSCode 中插入 R:【https://code.visualstudio.com/docs/languages/r
- 奖金:https://yihui.org/en/2022/04/quarto-r-markdown/四开 vs RMD:
感谢您的阅读。编码快乐!
和爱因斯坦、哥德尔一起等火车
原文:https://towardsdatascience.com/waiting-for-a-train-with-einstein-and-gödel-3ecffb1c596a
哥德尔数、算法和时间
安德里克·朗菲尔德在 Unsplash 上拍摄的照片
人类体验时间的方式是迷人而神秘的。时间在一个方向上是线性和连续的。我们不能回到某个特定的时间点,改变我们已经经历过的时刻。
一位名叫尼亚尔·费格森的著名历史学家说过一些我觉得很有趣的话。他说,世界各地的人们可以梦想不同的未来。每个人都为自己设想了不同的未来,然而所有人的未来总是自我崩塌成一个单一的线性范式,称为历史。
这篇短文与历史无关,但弗格森提出了一个有趣的观点。他让人们注意到来自世界各地的人们似乎有着不同的未来,然而奇怪的是,他们似乎都有着共同的过去。
阿尔伯特·爱因斯坦的肖像拍摄于 1947 年——图片来自维基共享资源
在接下来的文章中,我想把你的注意力引向时间的本质和算法的本质。人们对时间的感知可能相当机械。他们的感知是由逻辑构成的——时间是基于一个事实系统。爱因斯坦因将时间的机械性质与现实进行对比而备受推崇。
在一篇通常被称为“论运动物体的电动力学”的论文中,爱因斯坦说当人们谈论火车到达站台时,他们通常会说,“火车到达的时间是 7 点”,但爱因斯坦说这样说是不合适的。他说,更恰当的说法是,火车在时钟的长指针指向 12 点,短指针指向 7 点的同时到达。
这是因为爱因斯坦希望我们理解时钟指针和火车都在运动。它们同时相对移动,最终在一点达到顶点。当火车到达站台时,他们达到高潮,这恰好是时钟的长指针指向 12,短指针指向 7 的同一点。
本质上,时钟和火车的顶点仅仅是一个事件,其基于时钟的机械运动和功能,并且这对应于火车的机械运动和功能。因此,用一个简单的例子,爱因斯坦成功地取代了我们对时间系统的感知,这是一个由人类构建的系统,并用运动物体的动力学来取代它。然而,我们作为人类构建的时间系统可能非常有用。
例如,假设我正在从卡车上卸下一堆沉重的箱子,我的朋友走过来问我,“嘿,伙计,你什么时候能完成?”我往卡车里看了看,大约有 50 个箱子,我注意到卸下一个箱子大约需要 2 分钟,所以我可以用卸下一个箱子的时间乘以箱子的数量,这样就可以了,大约 100 分钟。所以我回答,“大约一个半小时后”。
我的朋友低头看了看手表,心想,现在是下午 5 点,所以肖恩可能会在日落后完成。尽管这个例子可能很简单,但我们在这里看到了人类子系统如何让宇宙的展开变得可预测。我的朋友对人类的时间子系统有一个基本的了解,他预见到我可能会在太阳落山后卸完箱子。这在几千年前是不可能的。
大约拍摄于 1924 年的库尔特·哥德尔肖像。—图片来自维基共享资源
这些子系统非常适合预测我们周围的世界,但它们的逻辑与宇宙的运作方式不同。在他的不完全性定理中,哥德尔证明了人类逻辑和宇宙的组成部分之间存在脱节。
然而,人类子系统可以告诉我们关于宇宙的事情。让我们稍微跑题一下:假设我创建了一个火箭视频游戏,并假设重力常数为 9.8 米每秒*方,我肯定可以让游戏运行并观看火箭飞来飞去。
但如果 Space X 或 NASA 仅仅以此为前提,他们的火箭很可能会失败。空气的摩擦、温度、压力等。—变数无穷,很难全部预测。然而,我们可以在我们的小火箭游戏中创建更小的游戏。如果我们继续制作越来越小的游戏,我们将最终阐明最小可行游戏的逻辑。
而这个逻辑可以用一个哥德尔数来表示,它可以告诉我们,我们的博弈是否完整。哥德尔数不一定对人类有意义,但是让我们写一个关于登上火车的小算法。这个算法会吐出一个哥德尔数,这个哥德尔数会代表底层逻辑的一个等级。所以一般来说,每个数字都会对以下逻辑进行分级:火车到达(T) →肖恩登上火车(S)。
悉尼白天熙熙攘攘,尤其是早上 7 点到 10 点之间。可以肯定地说,早上通勤上班一点也不好玩。所以让我们创建哥德尔数,它代表了我必须在站台等多久的底层逻辑的一个等级。哥德尔数越高,我的到达时间越好。
比方说,在火车到达前 10 分钟左右到达,价值是 100 左右的分数/哥德尔数。我通常喜欢在火车到达前 10 分钟到达,这给我留有余地,以防火车提前几分钟到达。所以我们的算法应该是这样的—
作者图片
因此,如果我在火车出发前 60 分钟到达,这是最坏的情况,而如果我在火车出发前 10 分钟到达任何地方,这是最好的情况。尝试使用以下代码查找您的哥德尔号码:
https://replit.com/@seanjudelyons/WaitingForTheTrain
借助哥德尔数,我们可以在数字、思想和逻辑之间建立联系。如果你仔细想想,电脑是活的逻辑。由于其潜在的电路,计算机屏幕上的每个像素照亮一种色调、阴影、颜色等。,已经用形式逻辑公式化了。比方说,我们提取像素的关键特征来训练 CNN,我们实际上只是挑选出一个合适的哥德尔数来训练我们的模型。
模型的权重仅仅是代表卷积神经网络逻辑的向量。换句话说,神经网络的哥德尔数代表了神经网络的思维方式。这是因为数字是神经网络逻辑的表示。它们是单个感知器之间的链,就像突触一样在模型中传递信息,使模型能够做出最终预测。
在这个小故事中,我们已经简要地谈到了最大似然、哥德尔数、算法子系统和时间。我觉得有趣的是,爱因斯坦和哥德尔都强调了从只能被描述为系统的和机械的感知世界的方式的转变。
我喜欢认为他们不是告诉我们该想什么,而是告诉我们如何思考我们周围的世界。爱因斯坦和哥德尔一起在普林斯顿高等研究院工作。据说爱因斯坦会来研究所只是为了和库尔特·哥德尔一起散步。我认为恩斯特·g·施特劳斯的这句话推测了他们的友谊:
在最后几年里,有一个人无疑是爱因斯坦最好的朋友,而且在某些方面与爱因斯坦极其相似,那就是伟大的逻辑学家库尔特·哥德尔。他们几乎在每个个人方面都非常不同——爱因斯坦合群、快乐、充满笑声和常识,而哥德尔极其严肃、非常严肃、相当孤独,并且不相信常识是获得真理的手段。但他们有一个共同的基本特质:都直接地、全心全意地触及事物的核心问题。
可行走的 360 视频
原文:https://towardsdatascience.com/walkable-360-video-b77c11792d4d
几何人工智能可以让你进入 360 VR 照片和视频
可步行 360 视频。【原创图片由作者创作。]
今天的虚拟现实体验与用户期望的现实主义相差甚远。当前的虚拟现实技术基本上分为两类:基于 3D 模型和计算机生成图像(CGI)的技术;以及基于全景 360°图像的那些。
基于 CGI 的体验是交互式的,支持新颖的视角,但是远非照片般真实,构建成本高昂,并且表现出高数据量和计算成本。
基于 360°图像的虚拟现实体验逼真,易于获取,数据量和计算成本较低,但不具备交互性且不支持新颖的视图。
理想情况下,我们希望两个世界都是最好的,虚拟现实体验既逼真又互动。
360°摄像机仅捕捉单个视点
虽然 360°内容,即全景照片和视频,本质上是照片级的,毕竟它们是基于摄影的,但它们是由相机在每个时间点在空间的给定点获取的。在每个时刻,相机只捕捉这个固定的视点。
360°摄像机捕捉完整的 360°全景,但仅从固定视点拍摄。【来源于维基共享。]
因此,360°内容只能从原始摄像机视点在 VR 中观看。不可能在空间中移动来探索拍摄时未被摄像机捕捉到的新奇视角。
在 360 VR 中,无论你在真实的物理世界中如何移动,你都在虚拟世界中保持冻结状态。
我们希望从相机视点解锁用户的视图,从而提供基于 360°图像的真实感 VR 体验,同时也是交互式的,允许用户在上面移动。人工智能(AI)技术可以帮助实现这一目标。
周正艾来救驾了
虽然人工智能在过去十年经历了一场革命,但大多数人工智能方法都是基于标准(欧几里得)数据,如常见的 2D 图像。但是,360°照片和视频具有几何结构,因为它们是在 360°球面上定义的。
360 照片和视频产生球体上定义的数据。【原创图片由作者创作。]
为了将人工智能应用于 360°照片和视频,我们需要专门在 360°球体上定义的人工智能技术。几何人工智能的新兴领域恰恰解决了这一挑战(参见本文介绍球面 360°数据的几何人工智能,以及本文介绍一些底层概念)。
用几何人工智能合成运动
利用 360°数据的几何人工智能技术,有可能实现既逼真又互动的 VR 体验。
在 Kagenova ,一家致力于建设未来照片般逼真的元宇宙的初创公司,我们开发了 copernic360 来提供可行走的 360°视频。
copernic360 利用 Kagenova 开发的几何球形人工智能技术,从单个 360°图像(照片或视频帧)中估计代表场景的 3D 几何图形。
copernic360 查看器系统使用这种几何图形以及原始的 360 视频或照片来渲染场景的 3D 纹理表示。然后,用户能够在重建的场景中自由移动。这不仅大大增强了虚拟现实体验的真实性,还消除了网络晕动病的主要原因。
下面嵌入的视频演示了由 copernic360 实现的可行走的 360°照片和视频。
可步行 360 视频演示。【视频由作者创作。]
逼真的元宇宙
通过将图像与强大的人工智能技术相结合,有可能实现既逼真又互动的虚拟体验。
copernic360 提供的可行走的 360°视频体验只是朝着这个方向迈出的第一步。神经渲染领域正在快速发展,并有可能提供更真实的体验,为未来的照片级元宇宙提供动力——这是我们在 Kagenova 积极追求的目标!
与此同时,copernic360 提供可行走的 360 照片和视频,可以在今天的生产中部署,以增强现有的 360 体验、应用程序和*台。
想要一份数据科学的工作?为什么比你想象的要难的 5 个诚实的理由
获得数据科学工作的道路是艰难的
介绍
得到一份数据科学的工作很难。
我的数据科学硕士毕业后,真的很纠结找工作。
我最终收到工作邀请的时间大约是 8 个月。当然,这是在 2020 年,所以封锁可能使情况变得更糟。
现在我有了一些数据科学家的工作经验,我会说我现在的处境比以前好得多;然而,获得另一个数据科学家职位的过程仍然感到困难。
如果你想找一份数据科学的工作,我有 5 个理由说明为什么它可能比你想象的要难。如果你想看别的东西,可以看看下面的视频。
除了阅读这篇文章,你还可以观看我在 YouTube 上关于这个话题的视频。
混乱的角色定义
Sharon McCutcheon 在 Unsplash 上拍摄的照片
如果你正在阅读这篇文章,很可能你已经看过一些数据科学家的工作描述。
我注意到的一件事是对数据科学家实际做什么缺乏一致意见。
从个人经验来看:大多数人甚至不知道数据分析师和数据科学家之间的区别。如果你也不确定,那么我实际上已经有一个视频清楚地解释了它们的区别。
如果你申请这些工作,很难知道你是否符合要求。当我还是一名数据科学毕业生时,情况确实如此。缺乏一致性会让你觉得需要学习每一个流行的数据科学主题和可用的工具。
相比之下,更成熟的角色,如软件工程,有更一致的工作规范;如果我正在寻找一个软件工程的职位,我可能会有更好的时间来弄清楚应该关注什么。
然而,我注意到像 Meta 和其他科技巨头这样的公司拥有不同类型的数据科学家。这可能是减少求职者困惑的正确做法。
这种发展可能最终导致“数据科学家”这个笼统头衔的消失。数据科学家的职责仍将存在一段时间,但在数据科学领域可能会有更多具有特定要求的具体职位。
高准入门槛
克里斯多夫·温杜斯在 Unsplash 上拍摄的照片
不管所有流行的数据科学证书和训练营告诉你什么,它们本身不足以让你得到一份数据科学家的工作。
数据科学是三个子领域的混合体:数学、计算机科学和商业。如果你真的擅长所有这些呢?那么恭喜你——我想你可以称自己为独角兽了。
在这三个子领域中的两个领域都非常博学的人已经很少见了。加上我们之前谈到的令人困惑的角色定义,突然发现找一份数据科学的工作比实际上要难得多。
我注意到,随着时间的推移,对数据科学职位的教育要求已经降低。然而,如果你缺乏相关经验,你可能仍然需要一个硕士学位来通过最初的要求。对许多人来说,这是一个非常大的承诺;毕竟,没有人能保证你在硕士毕业后能找到一份数据科学的工作。
总体而言,数据科学也变得更受欢迎,更具竞争力。随着越来越多的大学提供数据科学课程,自然会有更多的毕业生想进入数据科学领域。
此外,还有像我这样有分析师背景的人。这些人想要过渡到数据科学。因此,你至少要和两组人竞争,如果你是一个没有经验的应届毕业生,这就更加困难了。
没有标准化面试
照片由克里斯蒂娜@ wocintechchat.com在 Unsplash 上拍摄
数据科学求职最令人恼火的事情之一是面试缺乏标准化。
面试已经是一种既耗时又紧张的经历。如果每次面试之间几乎没有任何标准化,这种情况就会被放大。
同样,有这么多令人困惑的数据科学职位描述,很可能通过了面试阶段,却发现这份工作不是你预期的那样。
我以前也遇到过类似的事情。我建议做的最主要的事情是努力去发现更多关于这个角色和这个团队的信息。试着去调查雇主在寻找什么。利用面试过程中的所有信息,把它当成你也在面试这家公司。
话虽如此,很有可能面试官实际上并不太了解这个角色。在这种情况下,你仍然会遇到同样的问题。
如果你申请了很多公司,那就做好一切准备吧。我的面试要求:
- 展示了大量的编码知识;
- 做一个很大的带回家的项目,涉及很多代码和单元测试,至少花了我几天到一周的时间来完成;
- 小数据集的 Tableau 或 Power BI 报告项目;
- 具有深入的统计知识和一些统计编程;和
- 产品和行业相关知识,团队负责人会问我一些问题来测试我的直觉。
如你所见,变化是巨大的。为了帮助我准备面试,我不得不使用像 Glassdoor 这样的网站,人们可以在那里分享他们的面试经历;但是,这只有在它们最*在同一办公地点共享时才有用。
在我看来,对于那些试图开始数据科学职业生涯的人来说,这整个经历可能会打击他们的士气。拥有一种更标准化的方式来进行数据科学面试,将为等式两边的人节省大量时间。
领域知识的第 22 条军规
弗朗西斯科·莫雷诺在 Unsplash 上拍摄的照片
这类似于流行的获得工作经验的第 22 条军规:如果我找不到工作,那么我首先如何获得工作经验?
在数据科学中,领域专业知识极其重要。作为一名数据科学家,你必须非常了解行业和产品,才能产生有意义的影响。
如果你正在寻找一个入门级的数据科学家职位,这是一个问题。作为一个毕业生,你可能根本没有太多经验。你拥有必要领域知识的可能性有多大?
根据我的经验,我发现很多公司喜欢测试你如何将数据科学应用到他们的产品上。但是,除非你已经有过使用类似产品的第一手经验,否则真的很难知道如何回答。
就个人而言,我认为这是你通过与不同的产品和公司合作而逐渐形成的一种直觉。但是这就是第 22 条军规:我需要领域知识来进入一个领域,但是如果我不能获得所需的领域知识,如何进入这个领域呢?
例如,一名医疗保健数据科学家希望转型进入音乐流媒体行业,这将需要非常不同的领域专业知识。
显然,许多数据科学技能是可以转移的。几年的经验仍然会让你更容易过渡到一个新的领域。但如果你是数据科学的新手,那么这将使你的求职变得更加困难。
生产数据科学
莱尼·屈尼在 Unsplash 上的照片
越来越需要数据科学家知道如何编写生产级代码。
“生产中”是指在企业和客户之间的管道中有东西。我不会写生产级的代码,但很多重视数据的公司的高级数据科学家职位通常需要一些这方面的经验。
使用 Jupyter 笔记本进行探索性数据分析和实验模型是没问题的。但在某些时候,事情最终必须转移到生产阶段。
我还认为越来越明显的是,软件工程实践不能再被数据科学家忽视了。像 MLOps 这样的实践越来越受欢迎,因为很明显需要生产机器学习。在某种程度上,数据科学也是如此。
如果你能写生产级代码,那么你就不需要一个工程师来把你糟糕的代码翻译成生产代码。这为你节省了时间和商业资金,因为你是一举两得。
然而,如果你像我一样,没有计算机科学背景,那么学习如何编写好的产品级代码真的很难。
我可能已经养成了一大堆坏习惯,因为我从一开始就不知道如何正确地编码。由于我目前没有在大量生产机器学习或数据科学的环境中工作,我在工作中学习的机会严重缺乏。
结论
这些只是我在相对较短的数据科学旅程中的一些想法。我甚至不确定我上面的观点是否有现实的解决方案。希望通过分享这篇文章,更多的人能够意识到这个行业所面临的问题,这样它就可以在整体上得到改善。
对于那些目前正在寻找数据科学家职位的人,请联系并告诉我你的故事。一如既往,如果你喜欢这篇文章,你可以看看我在 YouTube 上的其他视频。如果你想通过电子邮件了解我在做什么,你可以考虑注册我的简讯。
原载于 2022 年 2 月 24 日【https://leonlok.co.uk】。
想成为一名有价值的数据科学家?那么不要专注于创建复杂的模型
乔纳森·博尔巴在 Unsplash 上的照片
所以你决定成为一名数据科学家。
恭喜你。作为一名数据科学家,我可以说我的职业生涯是充实和有益的。话虽如此,但工作期望与现实是不同的。
我收到很多来自有抱负的数据科学家的问题,问我他们应该关注什么。我听到了深度学习 Udacity Nanodegrees、Coursera 上的高级统计分析、Tableau 培训网站上的可视化教程、关于数据管道/Spark 的软件工程文档等等。虽然这些都同样重要,但仍有大量信息需要涵盖。当我第一次被雇佣时,我并不是这方面的专家,但我只学到了手头工作需要的知识。是的,学习某项技术需要牺牲一些周末和停工时间。但是,每当我绝对需要信息的时候,自学对我来说是很重要的,这样我就不会被大量的内容所困扰。
所以是的,学习新工具和新概念的好奇心是必须的。作为一名数据科学家/软件工程师,您已经意识到了软件世界的变化有多快。每个月,您的工具都依赖于一个包的更新。此外,新的软件工具每 6 个月发布一次,解决您之前试图解决的问题。
也就是说,我相信每个数据科学家都应该掌握另一项技能:分析数据的能力。
等一下。数据科学家不应该做更复杂的工作吗,比如建立机器学习模型?
不完全是。建立一个机器学习模型非常简单。假设我想提取中等博客文本来构建自己的 NLP 分类器。我想建立一个标签系统,确定哪些博客帖子是政治,体育相关,商业相关,娱乐相关等。我真正需要做的是编写一行代码来读入文本和相关的标签,一行代码来矢量化文本和标签(从文本转换为数字格式),一行代码来构建一个朴素贝叶斯分类器,该分类器是在文本+标签上训练的,还有一行代码来将分类器部署到一个端点上(Sagemaker 等)。这是第 4 行代码用于生产模型。
当然,有一些数据科学家可以使用 Pytorch 构建自己的神经网络。这确实需要研究生水*的数学和统计学。但这些工作很少,通常是为 FAANG/公司提供的,这些公司已经为研究工作建立了数据基础设施。许多数据科学家坚持简单的机器学习模型,并专注于向它们提供正确的数据。确定正确的数据需要分析他们有什么数据,并提取某些有用的部分。
但是如果我们想提高预测速度呢?难道我们不应该有一个复杂的机器学习模型来实现这一点吗?
也许吧。微软人工智能已经建立了一个令人难以置信的梯度增强模型,称为 Light-GBM 。我已经对它进行了测试,并与 XGBoost 进行了比较,XGBoost 是最快的 skikit-learn 分类器之一。Light-GBM 是轻量级的,所以预测速度比 XGBoost 快。Light-GBM 还支持并行和 GPU 学习,因此优化了速度。但是,在有些情况下,不建议使用轻量级 GBM。Light-GBM 建议至少 10,000 个数据点的训练才有效。否则,它容易过度拟合。
此外,如果你没有完全理解算法是如何工作的,仅仅为了速度而选择算法是不明智的。以上例中的 NLP 分类器为例。为什么我使用朴素贝叶斯而不是 boosting 算法?为什么我选择了朴素贝叶斯而不是决策树算法?原因是朴素贝叶斯是直接的数学。这是你最快的速度了。这确实假设你对每一类/标签的观察是相互独立的。但是朴素贝叶斯在速度上胜过任何 boosting 算法。Boosting 和决策树算法速度较慢,因为它们需要遍历特定的树路径来获得最佳预测。此外,朴素贝叶斯在较小的数据集上表现良好,而决策树在这方面表现不佳。
退一步,从广义上思考 NLP。构建算法时,您需要模型的特征。在自然语言处理中,这些特征最终成为文本中唯一的单词。在一篇博客文章中可能有超过 2000 个特征!这可以包括过滤掉停用词/不必要的词等。想象一下,构建一个拥有 2000 个特征的随机森林算法需要多长时间。在单个 CPU 上构建一个博客需要几个小时,分类一篇新的博客文章可能需要几秒钟。就预测速度而言,Boosting 是对决策树的改进,但朴素贝叶斯仍将胜过任何决策树算法。然而,准确性是另一回事。决策树算法比朴素贝叶斯算法更准确,但它们可能会因数据集而过拟合。
如果你正在为你的公司构建一个 NLP 分类器,你必须明白你能做什么样的权衡。这完全依赖于您所拥有的数据,您必须对其进行分析,以确定哪种算法效果最好。
****注:如果你想了解更多这些算法背后的细节,我推荐 StatQuest 了解更多关于统计学和不同机器学习算法的知识。
有道理,但这不正是数据分析师已经在做的吗?数据科学家真的只不过是一个被美化的分析师吗?
是的。数据科学家只是比数据分析师有更多的技术专长(软件工程、算法设计、云开发)。随着工具变得更容易使用,这种情况在未来可能会改变。
好吧,那么为什么我不能让分析师来做这项工作,而让我专注于酷而复杂的模型呢?
你可以,但这只会阻碍你作为数据科学家的发展。暗指我之前的观点,用干净的数据喂养一个简单的模型总比用坏数据喂养一个复杂的模型好。获取干净的数据需要在您的一端分析数据,以便您可以设计一个管道来有效地构建和训练您的模型。
为了说明,我将与你分享一个工作实例。对于我的工作,我们的团队正在为患者病历构建一个 NLP 分类器。我们的客户想要一个自动标记系统,以便他们可以浏览 1000 页的病历,并查看该页是关于什么的。我们有 50 多个分类标签,从心脏病到脑损伤。
我们还获得了每个分类的有限训练数据。我们每个分类有 5 个 pdf,每个都有 20-1000 页长。我不能告诉你我们如何解决这个问题的细节,但我们能够获得 90%以上的准确率。
我们的团队想知道我们是否可以将这些模型发布到 Github 上。我们想要某种版本历史来跟踪我们所做的更改,以提高模型的准确性。问题是我们正在分析医疗记录,我们必须确保在我们的任何代码/脚本/模型中没有受保护的健康信息(PHI)的痕迹。如果 Github 存储库是私有的供我们使用,这并不重要;如果 Github 在未来遭遇数据泄露,我们将面临暴露 PHI 的危险。对于那些不熟悉的人来说,PHI 的范围从病人的名、姓、SSN、地址、出生日期等等。这些信息理论上不会成为我们模型特征的一部分,我们已经删除了所有这样的痕迹。然而,当涉及到连字符时,病人的名字就比较棘手了。带上海莉-海莉。那是一种皮肤病的名字,而不是一个人的姓。这将是我们模型的一个相关特征。因此,在某些情况下,我们会保留一个带连字符的名字。
我仔细检查了背部受伤模型的特征,发现了这个有趣的特征。
盖勒-格林艾玛
****注意,由于 PHI 原因,我无法列出实际的患者姓名。我用了一个虚构的角色名(艾玛·盖勒-格林)。
所以在这种情况下,这是一个病人的全名出现在一个功能。但是我们对它是如何到达那里感到困惑,原因有二
- 背伤训练数据不应该拿起一个人的名字作为重要特征。一个人的名字通常会在一份 400 页的病历中出现 5 次,所以这个频率对于背部损伤模型来说是最小的。此外,在描述背部受伤的页面中很少提到这个人的名字。
- 我们的停用词表有像艾玛这样的名字。因为我们没有逻辑来处理用连字符连接的姓,所以应该列出 green-geller。艾玛应该被移除了。
接下来,我们仔细检查了光学字符识别(OCR)对这些病历文本的解读。我们检查了一下,发现 OCR 把盖勒-格林内玛当成了一个单词。像 Tesseract 这样的 OCR 工具令人印象深刻,在阅读杂乱的 pdf 时相当准确,但它们远非完美。
所以这解释了为什么艾玛没有被转移。但是这仍然不能解释为什么背伤取了这个全名作为一个关键特征。我们查看了 5 份关于背部受伤的培训 pdf。我们打开了一个 40 页的训练 pdf,几乎每一页都被归类为背伤。令我们惊讶的是,pdf 是 20 世纪 80 年代的。那份 pdf 文件的每一页都在页眉用粗体大字写着盖勒绿色的艾玛。
一个机器学习模型不知道什么是背伤。它只是注意到模式并做出假设。Geller-Green Emma 出现在每一页标有 Back Injury 的训练页上,这一事实足以让模特认为这个名字代表了特定的专业。很自然地,我们的团队添加了逻辑来处理那些 1980 年代的 pdf,并从其中删除了带连字符的患者姓名。我们没有创建自己的 PyTorch 模型来处理这个异常,而是清理了数据集。这种方法更易于我们在生产中测试和快速部署。
模型总是根据生产中新的、看不见的数据进行预测,并且很可能在不同的名称上犯同样的错误。在将数据部署到生产环境中时,分析和清理数据是非常重要的。
另外,我讨厌被诊断出背部有问题,仅仅因为我告诉我的医生,“我觉得艾玛·盖勒-格林的妈妈看起来很可爱”。
感谢阅读!如果你想阅读更多我的作品,请查看我的目录。
如果你不是一个中等收入的会员,但对订阅《走向数据科学》感兴趣,只是为了阅读类似的教程和文章,单击此处注册成为会员。注册这个链接意味着我可以通过向你推荐 Medium 来获得报酬。
想作为数据科学家被重视?问正确的问题
你问的问题揭示了你带来的价值
在 Unsplash 上由 Camylla Battani 拍摄的照片
如果你认为你的雇主不重视你,你可能是对的,但不是因为你期望的原因。
对你的雇主来说,你的价值是基于你创造的价值。这不会让他们变得邪恶。这就是商业运作的方式。
但是对于数据科学家来说,这带来了一个问题。
数据科学家没有接受过创造商业价值的培训。他们受过训练,能让模型符合数据。雇主不会对他们进行再培训,因为,作为一个新的职业,雇主并不总是知道科学家能产生什么价值的数据——只要他们问一下。
这是一个典型的“不知道自己不知道什么”的情况,结果是失望无处不在。
雇主开始将数据科学视为一项失败的实验。与此同时,数据科学家在沮丧中辞职,去寻找他们真正被赏识的工作。
发生的时候很悲剧,但不一定要这样。事实上,改变现状并没有你想象的那么难。
秘诀是专注于增加价值。做到这一点的第一步是改变你问自己和别人的问题。
你所提问题的微小转变,可能会让你作为数据科学家的认知价值大幅提升。
这里是开始的地方。
而不是问怎么做?试试这个
“在你发现生活是一个自己动手的项目之前,你要花掉半辈子的时间。”—拿破仑·希尔
如果你需要问如何做好你的工作,你作为一个数据科学家带来的价值是微乎其微的。
如何水*是指非技术工人和入门级工人的水*。许多麦当劳员工的工作级别都很低。
麦当劳餐厅不雇佣工人开发新的菜单项目。特许经营模式不允许这样。麦当劳餐厅通常雇佣不熟练的,主要是十几岁的工人来提供标准化的菜单,并为他们提供确切的如何做的明确指示。这使得餐馆能够大规模快速廉价地提供食物。
麦当劳餐厅雇佣工人是因为他们愿意被告知如何工作。然而,对于一个高技能的数据科学家来说,这不是你想要的地方。
问如何留给你创造商业价值的机会很少,这让你更难得到雇主的重视。在级别操作如何让你变得可替代。你变成了商品。
对于一些数据科学家来说,在如何水*上操作甚至是不可行的。要在【T2 模式】层面运作,必须有人能告诉你如何做你的工作——经理或高级同事——而在较小的公司里,他们并不总是存在。
在我作为数据科学家的整个职业生涯中,我从未遇到过受过数据科学培训的经理。即使我想在 T4 工作,我也做不到。
如果你想建立一个数据科学家的职业生涯,你需要超越如何的水*。
超越如何的水*涉及到如何的内化。
与其问你的老板“我该怎么做”,不如为“该怎么做”承担个人责任,并自己回答。互联网上充斥着解释任何你可能需要的数据科学概念的文章和教程。如果您正在阅读本文,您知道在哪里可以找到它们。
内在化如何将你的感知价值提升到商品之上。
问什么?导致次优解
“哟,我会告诉你我想要什么,我真的,真的想要什么。”— 辣妹
一旦你为《T21》承担了个人责任,你就提升到了数据科学的水*——告诉我你想让我做什么,我会去做。
许多白领专业人士都是在这个水*上工作的。很多商人也在这里。想想税务会计师或水管工。
如果你的水龙头漏水,你就叫水管工来修理。你告诉管道工需要做什么他们就做什么。你不告诉他们怎么做是因为你不知道怎么做。管道工对如何负责。
作为一名数据科学家,您也可以在和层面做得很好。事实上,在那里你可以赚到可观的工资。你只是在工作中出现,等待你的老板告诉你他们想要你做什么,并想出如何去做。
但是你可能会等很长一段时间。
在什么级别工作,意味着您将诊断数据科学问题的责任委托给了可能没有能力这样做的人。
税务会计师和管道工可以在或级别有效运作,因为他们的客户能够自我诊断水龙头漏水或需要提交纳税申报单。
然而,一个没有接受过数据科学培训的人不能,也不应该去诊断商业问题的最佳数据科学解决方案。
如果你的老板能够回答什么,你可能会得到一个次优的解决方案。如果它们不是,您将得不到任何解决方案。
后者对你非常不利。这导致雇主认为数据科学没有给企业增加价值,并最终缩减或消除数据科学团队。
不管怎样,你都没有展示出作为一名数据科学家所能带来的全部价值。要做到这一点,你需要把注意力放在为什么是上。
为什么?是专家的问题
“你做什么人家不买;人们会买你为什么这么做。”— 西蒙·西内克
如果你想最大化你作为数据科学家的价值,你需要开始问为什么:
- 为什么要我这么做?
- 你为什么要雇佣一个数据科学家?
- 为什么现在要我这么做?
问为什么能让你理解老板的动机并诊断他们的业务问题。如果你在为什么的层次上工作,你就要对什么和如何承担个人责任。
为什么关卡是专家操作的地方。在为什么级别工作的员工价值最高,这并非巧合。他们也是收入最高的。
医生在为什么层面发挥作用。
如果你某天早上醒来感觉不舒服,去看医生要抗生素,你的医生不会只是给你开个处方。相反,他们会问你一系列问题来确定你为什么感到不舒服——是真的需要抗生素还是只是普通感冒,或者可能是你昨晚吃了劣质外卖的后遗症?
你的医生不依赖你的自我诊断,因为你没有做出那个诊断的知识和经验。另一方面,你的医生有医学学位和治疗成百上千病人的经验。你去找他们是因为他们比你更清楚。
这同样适用于数据科学家。
数据科学家是训练有素的专家。大多数人有硕士学位,许多人也有博士学位。但在大多数情况下,数据科学家向与他们技术能力水*不同的人汇报。所以才雇了数据科学家。
作为一名数据科学家,如果你将自己在诊断过程中的角色让给你的老板或其他任何人,你实际上是在说,那个技术能力可能不如你的人,可以提出比你更好的数据科学问题解决方案。
如果这就是你发出的信息,当然你不会被重视。
然而,通过在诊断过程中接受一个角色,并在为什么层次上操作,你可以将自己定位为专家。
问为什么将注意力转移到你的老板需要你实现的结果上,而不仅仅是他们说他们希望你实现的。这些是带来真正商业价值的成果。利用你的知识和经验选择正确的行动方案—什么——你可以在实现目标的过程中发挥积极而重要的作用。
你将超越机器中的一个齿轮,成为它的驾驶员。
问正确的问题,改变你对自己的评价
"改变你所做的,你就会改变你自己。"本杰明·哈迪
从你已经读到这里的事实来看,我知道你希望作为一名数据科学家受到重视,但并不认为你是。所以,做点什么吧。
在接下来的 30 天里,承诺将你的问题提升一个层次。如果你目前在如何层面运作,将如何内在化,并致力于转移到什么层面。如果你目前处于什么级别,集中精力上升到为什么。
30 天不算长。在这段时间里,你可能不会注意到雇主对你的看法有任何变化。你甚至可能会被推回去。你在努力改变身边的人,所以身边的人会下意识的争取保持不变。在生物学上,这叫做体内*衡拉力。
然而,改变的是你看待自己的方式。
心理学家本杰明·哈代讲述了成为未来自我的概念。根据哈代的说法,如果你想在你存在的任何方面有所改变,你应该表现得好像改变已经发生了一样。你将改变你对未来的看法,然后你的现在将会改变以适应未来。
如果你问的问题是一个比你水*更高的数据科学家会问的问题,你将从那个水*开始操作。
如果你开始表现得像一个专家数据科学家,你将成为一个专家,你将作为一个专家受到重视。
这可能不会马上发生,但要坚持下去。心理学告诉我们这应该发生。
作为一名数据科学家,这就是你被看重的原因。
Genevieve Hayes 博士是数据科学家、教育家和人工智能及分析专家,拥有Genevieve Hayes Consulting。你可以在LinkedIn或者Twitter上关注她。她还是 价值驱动数据科学 的主持人,这是一个每月两次的播客,面向希望最大化其数据和数据团队价值的企业。
想要发掘企业数据的价值,但不知道从哪里开始?**下载免费的数据科学项目发现指南。
想要为您的投资组合创建更有影响力的数据科学项目吗?
构建热数据科学,而不是冷数据科学
图片来自 thommas68 的 Pixabay
在数据科学和生活中,热通常比冷更受欢迎。毕竟,冷与旧事物、死亡联系在一起,并且从字面上定义为缺乏(分子)运动。另一方面,热让人联想到火、汗水和动力。
然而,尽管非常清楚地认识到热对冷的吸引力,但大多数数据科学项目最终都是冷的、静态的项目,在这些项目中,模型被训练和评估,然后被报告和保存。只是被遗忘在互联网或我们个人硬盘的深处。
Kaggle 竞赛是这样工作的。我们在主办比赛的任何人(如网飞、脸书等)提供的数据集上训练模型。然后,根据结果度量,将这些模型与其他模型进行比较。最佳结果指标=获胜者。就是这样。完成了。
数据依然冷淡,因此项目也冷淡。
好吧,我想在某些情况下,模型获胜者可能能够为赞助企业部署他们的模型,但这些情况很少,并且发生在竞争之外。因此,我们从来没有对新的和输入的数据进行模型性能评估。我们永远无法确定这些模型的真正普遍性。
考虑这个场景:构建了两个模型来预测业务结果。一个模型是使用训练数据的训练-测试-验证分割来构建的。仅基于特征在模型中的统计显著性来挑选特征(或者更糟糕的是,不使用特征选择过程)。
第二个模型也建立在训练数据的分割以及包括来自科学文献的特征的基础上,尽管在训练数据中没有明显的统计意义。
第一个模型在训练数据上优于第二个模型。应该的。毕竟是用训练数据优化的。
然而,第二个模型在未来数据上表现更好。为什么?因为它包含了第一个模型没有发现的特征,但根据科学研究,这些特征可以预测结果。因此,尽管所述文献衍生的特征在训练数据中未被发现(例如,统计显著性,由于缺乏特征工程而不可用等),但随着时间的推移,并且随着新数据的包含,这些特征在准确预测未来结果中仍然重要。
无论是哪种情况,学习如何在冷数据上建立模型是一回事,但学习如何创建能够响应传入的热数据的解决方案将为您的工具包添加一套全新的技能,可以为发展中的数据科学家项目组合做出巨大贡献。
在本文中,我分析了冷门和热门数据科学项目之间的区别,并揭示了将您的数据科学项目转变为热门投资组合商品的一些有用步骤和注意事项。感兴趣吗?接着读下去!
热门数据让数据科学项目变得更酷
热数据和冷数据之间的区别对于技术领域来说并不陌生。事实上,亚马逊的 AWS 提供了一项名为“冰川”的 S3 存储服务我是说,你能有多冷?现在推出…ZeroK 存储!但是我跑题了。
就数据而言,热数据是经常使用、定期刷新和/或快速需要的数据。因此,热数据的存储成本通常也更高,因为计算要求不同于冷数据。
至少,热数据科学需要建立一个响应热数据的流程。也就是说,让我们的数据科学投资组合变得更酷(俚语的本意)意味着建立热门数据存储,让我们能够对新数据的模型进行评分。
但是,开发热数据科学解决方案需要的不仅仅是热数据存储。热门数据科学需要使用不同的方法,这些方法通常由 MLOps 团队决定,但仍然会受益于数据科学家在设置方面的专业知识。
例如,热数据科学需要包含评估指标,以持续监控新数据和传入数据的模型性能。当我们观察到度量中的模型漂移时,我们该怎么办?事实上,监控模型性能和寻找模型漂移只是热门数据科学问题的一部分。
真正热门的数据科学解决方案是允许随着新数据和新功能的出现而构建和训练新模型的解决方案。精明的数据科学家可能认识到这种方法是冠军挑战者方法的基础。Challenger 模型是用新的和输入的数据构建的,确保我们不仅解决了模型漂移问题,还拥有一个持续改进模型的机制。
随着您建立热门数据科学的技能的提高,您甚至可以找到机会从客户、用户或任何可以用来进一步训练新模型的人那里收集数据。随着可用训练数据量的增加,这种场景非常适合建立再训练协议,或者使用强化算法建立在线学习。
可能性是无限的,但是在他们自己的项目组合中,从哪里开始展示这种技能呢?
在下一节中,我们将更深入地探讨一些想法,以建立您自己的热门数据科学项目,并将其添加到您的投资组合中。
使用热数据创建数据管道
如前所述,热数据科学项目至少需要建立一个热数据存储管道。作为项目组合的一部分,在演示中有很多方法可以做到这一点。首先,您需要确定一个您想要解决的问题,该问题可以通过热数据来解决。还有什么比互联网更重要的热门数据来源呢?
比方说,你是一个内容创建者,你想看看每周新闻都有哪些话题,以便为你提供一个策略,让你知道自己的内容应该关注什么。一种方法可能是从 Google Alerts 设置一些电子邮件提醒,通过电子邮件向您发送与您的专业主题相关的热门新闻。通过对电子邮件服务进行一些调整,可以每周部署一次 python 代码来提取结果,并将它们存储在本地机器上的简单 SQLite 数据库中。
建立这样一个服务还需要您确定如何使代码自动化。设置和调度代码的一些想法包括在 Windows 机器上使用窗口调度器,比如这里的,或者在 Linux 机器上使用 Cron,如这里的所解释的。对于更高级的编排,请查看气流。
一旦有了用新数据存储和更新数据存储的方法,下一步就是构建用于对数据进行评分的数据科学。您可以使用预先训练的模型来标记具有已知感兴趣标签的新闻源,或者您可以使用无监督的主题建模方法来发现每周的关键主题。
利用输入数据构建冠军挑战者场景
一旦我们建立了一个按计划收集数据的管道,使用监督或非监督模型对数据进行评分,并通过某种机制(例如,一组保存的图像、数据集、仪表板)向我们提供这些结果,下一步就是建立一个可以从新数据中学习的流程。
在无监督模型的情况下,比如主题模型,我们可能想要识别是否出现了新的主题。或者,在预训练监督模型的情况下,我们可能希望确保我们的模型仍然能够准确地对新数据进行评分。在这两种情况下,我们都需要在新数据到来时建立训练新模型的能力,并将其与现有模型进行比较。
结论
在这篇简短的文章中,我研究了一些想法,通过关注热数据的使用来激发创建更令人兴奋和更有影响力的数据科学项目。值得注意的是,热数据科学不仅仅是热数据,因为它涉及到在整个解决方案管道中包含额外的方法和考虑事项。此外,热门数据科学更令人兴奋,因为它展示了我们如何将数据科学视为一个活生生的过程,可以使用源自其自身学科的方法来创建更智能的数据输出,从而满足我们自己的生活和呼吸需求。
比如参与学习数据科学、职业发展、生活或糟糕的商业决策?加入我。
想在现实世界中成功做 ML?
原文:https://towardsdatascience.com/want-to-succeed-doing-ml-in-the-real-world-d2db790612f1
让你的生活更轻松的三个建议
罗伯特·卢克曼在 Unsplash 上的照片
所以,你已经完成了一些 ML 课程,并准备好在行业中寻找你的第一份工作,但仍然想知道:在现实世界中做 ML 的主要技能是什么?
在新创公司工作,节奏快,收益高(包括智力和财务),听起来是个好主意?
继续读下去,学习一些小技巧,让你的生活更轻松,增加你在现实世界中成功做 ML 的机会。
语境
机器学习是一门很难的学科。你可能从你参加的在线课程或者你参加的 Kaggle 比赛中知道这些。
然而,现实世界中的 ML 更难。尤其是在创业公司。
为什么会这样?
因为与在线课程或纸牌比赛相比,在现实世界中做 ML 会有更多的事情出错。
我来解释一下这些隐藏的漏洞是什么,并给你一些帮助避免它们的建议。
1.机器学习是手段,不是目的
ML 项目失败的首要原因是令人尴尬的愚蠢:首先你不需要 ML。
机器学习只是你拥有的一个(相当复杂的)工具,用来移动业务指标。而且通常情况下,是而不是合适的工具。
在大多数创业公司中,ML 不是核心产品或服务,而是改善业务的工具。
根据我的经验,初创公司的大多数职位描述都错误地寻找“机器学习工程师”,而实际上应该寻找“数据分析师”。数据分析师擅长分析中/大型数据集,提取模式,并快速生成数据驱动的见解,从而调整业务流程和影响指标。这个想法很简单:在任何一家新的创业公司中,都有大量的“唾手可得的果实”项目可以解决,只需要一点点数据。
即使你的职位是“ML 工程师”,也不要认为你需要为每个问题训练一个 ML 模型。您需要改进业务度量,并且您可能需要为此使用数据。这并不意味着你每次都需要拿出一个新的 ML 模型。你会浪费你的精力和时间。相反,你可以通过装扮成“数据分析师”来获得立竿见影的效果。通过这种方式,你获得了一些时间,直到初创公司成长起来,真正的 ML 工作进入画面。
例如,您可以离线分析数据,以调整业务逻辑中的几个参数,从而提高指标。
避免机器学习所有复杂性的最好方法是不做机器学习。听起来很愚蠢,也没有吸引力,但是它可以让你从压力中解脱出来,并且为另一个真正需要 ML 的项目赢得一些时间。
2.训练数据在哪里?
如果你之前没有在现实世界中做过 ML,你可能从来没有问过自己:训练数据在哪里?
答案是:无处可去。
初创公司通常有一个最小的数据堆栈,由 3 个元素组成:
- 数据来源很多。这些都是产生原始数据的生产服务。例如,假设创业公司是一个电子商务网站。一个数据源是谷歌分析服务,它跟踪网站上的所有用户行为。另一个来源是网站上的 PayPal 支付服务,它会发送支付事件。
- 数据总线是一个软件,它将来自所有数据源的数据传送到数据仓库/湖中。初创公司倾向于与 Segment 或 Google Pub-sub 等付费服务合作,有些公司甚至冒险自己运行 Kafka。
- 数据仓库/湖是所有数据结束的地方,或者是组织良好的数据库(即数据仓库),或者是简单的存储(即数据湖)。
一旦数据进入仓库/湖泊,你作为 ML 工程师的工作就开始了。
您经常需要花费大量的时间来编写正确的查询(通常用 SQL ),以获取训练模型所需的数据。
编写 SQL 查询不是你在在线课程中学到的最性感的东西,但它是成为一名高效的 ML 工程师需要掌握的顶级技能之一。
这些年来,我开发了一些模式和最佳实践来跟上项目的这个阶段。你可以在我之前的文章中读到它们,关于 如何更快更好的生成训练数据。
3.我如何向其他人展示我的模型有效?
好了,我的模型看起来不错,现在呢?
在像初创公司这样的商业环境中,只要机器学习模型被限制在您的开发环境中,它就没有任何价值。
除非您部署模型并将其暴露给技术堆栈的其余部分,例如,通过微服务和 REST API,否则您将不会对业务指标产生影响。
然而,要实现这一目标,您首先需要向团队的其他成员证明:
- 你的模型确实有效。
- 你的模式比现状要好。
例如,假设您开发了一个二元分类器,它能够预测客户在未来几天内是否会流失。营销团队可以使用这样的模型来瞄准潜在的顾客,并保持他们的参与。
当您处于开发阶段时,您使用标准的评估标准来解决分类问题,例如
- 精确召回
- f1-分数
- 精确度,
- 和混淆矩阵。
有了这些指标,您就能感觉到您的模型是否有任何预测能力,以及它是否值得在生产中部署和使用。然而,这些指标并不是故事的结尾,因为:
- 非技术利益相关者很难理解它们,例如将使用该模型的营销团队。
- 从业务角度来看,它们不容易解释,例如如果我们使用这种客户流失预测模型,我们会将客户保留率提高多少?
正因为如此,如果你想对创业产生真正的影响,你需要多走两步,它们是:
- 回溯测试您的模型,和/或
- A/B 测试您的模型。
回溯测试您的模型
为了对模型进行回溯测试,您使用到给定日期 X 为止的历史数据来训练模型,然后根据业务指标来估计如果从日期 X 开始使用该模型会发生什么。
回溯测试您的模型影响(图片由作者提供)
例如,在我们的客户流失预测系统中,我们可以使用 2 周前的历史数据,然后估计如果我们使用该模型,在最后 2 周我们会保留多少客户。
模型回溯测试是金融行业使用的标准策略,用于评估交易策略绩效和风险管理。它实现起来很快,而且成本低廉,因为您已经拥有了所需的所有数据。
然而,在 ML 模型和模型运行的环境之间存在反馈回路的情况下,很难甚至不可能实现。例如,在我们的流失预测模型中,不可能知道如果不同的客户被我们的模型标记为流失者并被营销团队锁定,他们会有什么反应。
在这些情况下,您需要更进一步,在您的模型上运行 A/B 测试。
A/B 测试您的模型
为了 A/B 测试我们的客户流失预测系统,您可以随机将用户分成两组:
- A 组(又名对照组)。这部分用户将被营销团队像往常一样对待,这意味着没有由流失预测模型触发的特殊重新定位工作。
- B 组(又名试验组)。这些用户将被我们的模型标记为搅动者/非搅动者,并被营销团队相应地锁定。
A/B 测试你的 ML 模型(图片由作者提供)
这种分离是随机的,以保证两组之间没有明显的行为差异,这种差异会使测试结果产生偏差。
测试运行了 N 天,最后,我们比较了两组之间的整体流失率。
如果你观察到与 A 组相比,B 组的流失率显著降低,你就有确凿的证据证明你的模型是有效的,可以部署到整个用户群。
否则,你需要要么改进模型,要么转向另一个问题。
尽管这会降低你的速度,但是 A/B 测试仍然是说服你的同事你的模型应该被部署的最有效的方法。
所以,坚持下去,你会看到结果。
贾哥达和凯(图片由作者提供)
包装它
所以,下次当你发现自己面临一个具有挑战性的现实世界的问题时,问问自己:
- 我需要 ML 吗?
- 我的数据在哪里?
- 我如何证明我的解决方案有效?
相信我,会有所不同的。
想成为机器学习和数据科学的专家吗?
🚀 加入 Datamachines 时事通讯,了解 ML 和数据科学的真实世界。
💎 今天使用我的推荐链接 成为会员,可以无限制地访问我在媒体上发布的所有内容并支持我的写作。
**https://pau-labarta-bajo.medium.com/membership
快乐学习🤗
避寒胜地**
使用径向热图扭曲空间和时间
原文:https://towardsdatascience.com/warp-space-and-time-with-radial-heatmaps-c9a878d2ebf6
使用 Python 和 HoloViews 对时间序列和循环数据进行独特的数据可视化
作者创建的图像
径向热图简介
简单的热图是一种数据可视化形式,它通过与所代表的数据相对应的颜色变化来突出显示现象的程度。这些颜色的变化为数据科学家探索时空趋势提供了线索。
径向热图是一种更复杂的数据可视化形式,本质上是一个简单的卷成球的热图。因此,径向热图可以扭曲空间和时间,以帮助加快发现时间序列数据和其他循环变量中的周期性模式和趋势。
安德烈·格鲁什尼科夫从派克斯拍摄的图片
开始使用散景和全息视图
要创建自己的径向热图,必须首先安装必要的 python 库。对本教程很重要的库包括散景和全息视图。
散景和全息视图使得用交互式组件创建高质量的数据可视化成为可能。要了解有关这些库的更多信息,请访问以下链接:
https://docs.bokeh.org/en/latest/ https://holoviews.org/index.html
设置径向热图
使用全息视图创建径向热图的过程非常简单。在创建热图之前,让我们先导入我们的库:
接下来,我们可以通过设置 radial=True 来激活热图元素上的 radial plot 选项,同时还可以管理大小和悬停选项。
出于本文的目的,创建了一个模拟数据集来表示七天内每小时的步数。有了这些数据,我们就可以确定一整天和一周内的活动模式。
作者创建的模拟数据
创建放射状热图
现在我们准备绘制数据。我们将“时间”和“日期”声明为数据框中的关键维度。对于要理解第一个关键维度(对应于径向轴)的径向热图,它应该是一个周期性变量。这里的变量是“时间”,从图表顶部的午夜开始:
使用作者提供的模拟数据创建的交互式放射状热图
如您所见,放射状热图使您能够识别全天和一周的趋势。您还可以与情节互动,以收集更多信息。
如果您喜欢更多的控制,您可以尝试使用下面的代码操纵绘图的方向,更改配色方案以及其他细节:
作者更新了绘图参数
结论
你有它!用 python 创建放射状热图的简单方法。如上所述,放射状热图可以提供模式在时间和空间上的快速快照。这对于识别人类活动数据中的模式可能特别有用,如本教程所示,或者提供关于其他循环关系的信息。
所有代码都可以在 GitHub 这里获得。单击下面的链接,在 google colab 笔记本上试用一下。
https://colab.research.google.com/drive/1dgYmkdGeye0v5PP_BCWEW_kbwb_UYr_n?usp=sharing
感谢您的阅读!
作者的相关文章—
废水 RNA +时间=非常强的结果预测
原文:https://towardsdatascience.com/wastewater-rna-time-very-strong-outcome-prediction-6725330285a6
将废水 RNA 水*与总疫情时间相结合产生了对新冠肺炎病结果的非常高的预测
图片由皮克斯拜的 Gerd Altmann 提供
摘要
在之前的一篇文章中,我展示了新型冠状病毒废水水*的生物机器人数据集提供了美国新冠肺炎疾病结果的强有力预测。但是,预测住院和死亡的因素可能不仅仅是污水中的 RNA 标记。一些明显的候选因素是疫苗接种、既往感染和医学治疗的进展。
我针对这个假设测试了几个指标,在不同程度上考虑了这些因素。我发现与新冠肺炎病结果最准确相关的指标是废水 RNA 加上自疫情开始以来的日历时间。这种相关性明显强于单独的废水。我将这个新的度量命名为 RNA 加时间(RPT ),并用这个 Python/pandas 代码进行计算。
RPT 捕捉到这样一个事实,即在疫情早期给定的废水 RNA 水*比在疫情后期相同的 RNA 水*导致更多的住院和死亡。直观的解释是,随着 30 个月疫情的继续,更多的人接种了疫苗,更多的人以前感染过,医生更擅长治疗病人,有更好的治疗药物,而且(可悲的是)许多最脆弱的人已经死亡。
背景
我之前的文章显示了废水(污水)新型冠状病毒 RNA 水*和新冠肺炎病结果之间的强统计相关性。我发现美国废水和新冠肺炎住院之间的 Spearman 相关系数约为 0.8(满分 1.0)。我发现这种疾病的死亡率也有类似的结果。
但是可以肯定的是,预测疾病结果的因素不仅仅是废水病毒水*。想象两个具有相同病毒水*的群体,但是一个群体完全易感,而另一个群体 100%接种疫苗,并且每个人都有一名医生站在他们身边。
在这个项目中,我试图通过将测得的病毒水*与其他信息相结合来提高废水的预测能力。
废水和结果数据集
我从 Biobot 的区域汇总数据集中获取废水数据,该数据集将许多单独的水处理厂汇总成一个全国范围的集合,经过几周的*滑处理,并根据水质测试点附*的人口进行加权。
我从 CovidActNow 获取了新冠肺炎疾病的结果,并添加了入院人数、使用的医院床位、使用的 ICU 床位和死亡人数的滚动*均值。
当将水测试与疾病结果结合时,我使用了日期前瞻,因此合并的数据集具有水测试后 14 天的住院统计数据和每次水测试后 28 天的死亡率统计数据。
一种新的度量标准:RNA 加时间(RPT)
我的目标是创造一个新的指标,包括废水 RNA 水*,并结合其他数据。我试验了各种方法,并比较了它们对疾病结果的预测能力。我测试的最佳公式是增加日历时间,包括增加疫苗接种,加强免疫,自然感染,医学治疗的进步,以及最脆弱的人在疫情中过早死亡的可悲事实。
我给废水 RNA 打分,从 0 到 100,100 是发现最多的 RNA。我也给“疫情内的逆时间”分配了 0 到 100 的范围,其中 100 是美国疫情的起点,0 是今天。将这两项相加得出一个从 0 到 200 的指标,其中 200 是最糟糕的疾病前景-在完全脆弱的人群中高废水 RNA。
我发现的一个细节是最高的 RNA 水*是异常值。如果它们被赋值为 100,大多数废水值在 0 到 100 的范围内将会非常低。所以我把 RNA 值的前 10%压缩到 90%的水*。
RNA_TOP_COMPRESSION = 0.90 top_rna = BiobotDF["effective_concentration_rolling_average"].quantile(RNA_TOP_COMPRESSION)BiobotDF["rna_signal_pct"] = (BiobotDF["effective_concentration_rolling_average"] / top_rna) * 100BiobotDF.loc[BiobotDF["rna_signal_pct"] > 100, "rna_signal_pct"] = 100
日历时间设定为废水取样时剩余的疫情周的百分比。
VIRUS_START = "2020-03-01" pandemic_weeks = int(round(((pd.Timestamp.today() - pd.Timestamp(VIRUS_START)) / np.timedelta64(1, 'W'))))UsaDF['pandemic_week'] = ((UsaDF.week - pd.Timestamp(VIRUS_START)) / np.timedelta64(1, 'W')).round().astype(int)UsaDF["pandemic_pct"] = ((UsaDF['pandemic_week'] / pandemic_weeks) * 100).round(2)UsaDF["pandemic_pct_inv"] = 100 - UsaDF["pandemic_pct"]
RNA 加时间(RPT)是这两个因素的简单相加。
UsaDF["RPT"] = (UsaDF["pandemic_pct_inv"] + UsaDF["rna_signal_pct"]).round(2)
比较预测
要了解 RPT 对废水数据的预测能力,请考虑下面的两个散点图,它们显示了从 2020 年 4 月到 2022 年 7 月的 121 个全国废水值。
第一个图是简单的每毫升废水中新型冠状病毒 RNA 的拷贝数与两周后新冠肺炎的住院人数的对比。请注意,由于一些水样含有非常高浓度的 RNA,大多数数据都聚集在最左边。
作者图片
第二个图是相同数据的 RNA 加时间(RPT)。有两个改进。首先,由于非常高的 RNA 水*在添加疫情时间之前被压缩,所以数据沿着 x 轴更均匀地分布。第二,时间因素的加入将每个废水测量置于整个疫情的背景下,使其更有意义。
作者图片
散点图中数据的 Spearman 相关性证实了 RPT 与严重疾病结果之间的密切关系。下面的第一行是入院散点图。其他行是用于新冠肺炎、ICU 和死亡的病床。与仅含废水病毒相比,所有行都显示出与 RPT 的相关性显著提高。接* 0.9 的相关值非常强。
作者图片
细心的读者可能会注意到,废水中只有 RNA 的相关性(上面第二列)比我以前文章中引用的要低。原因是这里使用的数据集覆盖了更长的时间跨度,并包括最*的 BA.5 波,该波具有高废水 RNA 水*,但相对较低的严重疾病结果。这是 RNA 加时间是比仅用 RNA 更准确的疾病预测因子的额外证据。
了解更多信息
https://link . springer . com/article/10.1007/s 13762-022-04326-1(新型冠状病毒废水监测科学文献综述)
【https://en.wikipedia.org/wiki/Correlation (斯皮尔曼和皮尔逊相关)
https://biobot.io/science/(来自生物机器人的技术文章)
https://Data . CDC . gov/Public-Health-Surveillance/NWSS-公共-新型冠状病毒-废水-公制-数据/2ew6-ywp6 。(CDC 废水追踪)
带有 Excel、Matplotlib 和 Plotly 的瀑布图
原文:https://towardsdatascience.com/waterfall-charts-with-excel-matplotlib-and-plotly-5b3fb42cbf46
在 Excel 和 Python 中创建瀑布图
瀑布图是一种数据可视化形式,它将从初始阶段到最终阶段的各种中间步骤的逐步贡献可视化。初始阶段和最终阶段由瀑布图中的全栏表示。这些列是满的,因为它们在水*轴上从零开始。
另一方面,中间值是初始阶段和最终阶段之间的一系列正的或负的步骤。这些中间值在瀑布图中显示为浮动列。这些列位于隐藏基数的顶部,隐藏基数是初始值和先前正或负增量步骤的净和的总和。因此,瀑布图根据其外观也被称为飞砖图或桥图。
瀑布图有着广泛的应用,但它们在金融领域尤其流行。例如,瀑布图用于直观地说明一家公司在某一年年初的收入如何按月(基于时间)变化,以达到年底的累计收入。同样,它也可用于说明年初的总收入贡献如何增加或减少公司投资组合中的每个产品(基于类别)以达到日历年末的净收入。
使用不同的工具有不同的方法来构建瀑布图。在这篇文章中,我将分享一些使用 Excel 和 Python 中的 matplotlib 和 Plotly 包构建瀑布图的技巧。让我们开始吧。
虚拟示例
作为一个假设的案例,我将使用瀑布图来说明在六个月的时间里,一座建筑中不同的节电措施的逐步效果。本例中使用的数据纯粹是虚拟值,仅用于说明目的。
考虑到我的大楼截至目前每月用电量为 150 千瓦时。我决定在夏天在我的大楼里安装一定数量的新风扇和冰箱,因此每月的耗电量将分别增加 10 和 15 个单位。由于我的用电量达到了每月 175 台,我起草了一些措施来减少每月的用电量。作为短期措施,我计划采取一些行为上的改变。比如:不用电器时拔掉插头,满负荷运转洗衣机,修理故障水电泄漏。我粗略估计,这些措施将有助于在短期内每月减少 15、15 和 5 个单位的电力。结果,三个月后我的月用电量将达到 140 单位。
三个月后,我打算安装一些新设备或更换现有设备。如:安装智能恒温器,用 LED 灯取代现有的灯泡,用笔记本电脑取代大楼里的台式电脑。据估计,这些措施将帮助我的建筑分别减少 25、10 和 10 个单位的电力消耗。因此,我的大楼每月的用电量将从现在的 150 单位增加到六个月后的 90 单位。
用 Excel 制作瀑布图
上述假设的例子可以用如下所示的 Excel 表格来表示:
代表我所在建筑的电流和节能措施的 Excel 表格。图片作者。
蓝色单元格分别代表我所在的大楼截至目前、三个月后和六个月后的每月用电量。绿色单元格表示逐步增加,红色单元格表示有助于逐步减少我所在建筑每月耗电量的措施。该表中的第一列是基础列。蓝色单元格的基础值为零。在增量的情况下,基本值加上绿色单元格中的值。在下降的情况下,从基础值中减去红细胞的值。
Microsoft Office 的最新版本有一个在“插入”选项卡中创建瀑布图的默认选项。然而,为了通过选择上面的表格在 Excel 中绘制瀑布图,我首先插入了堆积柱形图。基本列中的非零值仍然可见。因此,为了使它们不可见,我为这些列选择了不填充选项。生成的瀑布图如下所示。
使用 Excel 创建的瀑布图。图片作者。
我手动排列了不同列的颜色,蓝色条代表基本值,绿色条代表逐步增加,红色条代表逐步减少耗电量的措施。结果图如下所示。
带有熊猫和 matplotlib 的瀑布图
上面在 Excel 中创建的图可以很方便地使用 Python 重新创建。我使用了 pandas 和 matplotlib 包。我读取同一个 Excel 表,用 0 填充 NaN 值,得到下面的数据帧df
:
熊猫数据框代表我的建筑的电流和节能措施。图片作者。
下面给出了用于重新创建第一个图的代码。数据框从Current level
列向前绘制,以df
的Base
列为底部。
df.loc[:,”Current level”:].plot(kind = “bar”,
bottom = df[“Base”],
width = 35)
plt.xticks([])
plt.title(“My electricity saving plan”)
plt.ylabel(“kWh consumption”)
plt.tight_layout()
plt.show()
第一个使用 pandas 和 matplotlib 创建的瀑布图。图片作者。
在上面的图中,每个具有独特颜色的条形代表电流或节能的不同步骤。在下一个图中,我想分别用蓝色、绿色和红色突出显示具有初始值/中间值/最终值、步进增量和减量的列。因此,我为每个条形定义了一个颜色列表。
我重新构建了熊猫数据框架,如下图所示,以df
的Base
列为底部绘制一个柱状图。我还手动选择了补丁和标签来定义每种颜色。
plt.figure(figsize = (6, 6))colors = [“royalblue”,”green”,”green”,”red”,”red”,”red”,
“royalblue”, “red”, “red”, “red”, “royalblue”]fig = df.T[1:].max(axis = 1).plot(kind = “bar”,
bottom = df[“Base”],
width = 0.8,
color = colors)selected_patches = fig.patches[0], fig.patches[2], fig.patches[4]plt.legend(selected_patches,
[“Base value”, “Rise”, “Fall”],
loc = “upper right”)plt.title(“My electricity saving plan”)
plt.ylabel(“kWh consumption”)
plt.tight_layout()
我得到了一个稍微好一点的结构图,如下所示:
使用 pandas 和 matplotlib 创建的第二个瀑布图,具有结构化的颜色组合。图片作者。
Plotly 瀑布图
要使用 Plotly 绘制瀑布图,pandas 数据帧结构需要有所不同,如下所示。在 kWh 栏中显示了每项措施的用电量或逐步上升或下降。测量栏指示值是绝对值、总和还是相对值。
熊猫数据框用不同的方法表示电流。图片作者。
Plotly 有一个独特的模块,简单用于创建瀑布图,作为财务图的一种形式。瀑布图作为跟踪添加到 graph 对象中。瀑布图是通过将df
的值列指定为x
、千瓦时列指定为y
、度量列中的值列表指定为measure
来构建的。千瓦时流量也作为文本添加,出现在瀑布图的列外。使用 Plotly 生成瀑布图的代码如下:
我得到了下面的瀑布图:
使用 Plotly 创建的瀑布图。图片作者。
Plotly 允许用不同的选项进一步定制瀑布图。我将 x 轴上的标签分为初始值、短期测量值、中间值、长期测量值和最终值。此外,我编辑了总计、增加和减少条的颜色和边缘颜色。这反映在《法典》的以下要旨中:
这将返回一个定制的瀑布图,如下所示:
用 Plotly 构建定制瀑布图。图片作者。
结论
当从初始阶段遍历到最终结果时,瀑布图对于展示基于时间的或基于类别的值的逐步递增或递减效果非常有用。根据其外观,瀑布图也被称为飞砖 图或桥图。虽然瀑布图有不同的领域应用,但它们在金融领域特别受欢迎,以反映时间或产品的现金流贡献。
在这篇文章中,我提供了一个构建瀑布图的例子,来看看在六个月的时间里,不同的节电措施对建筑的影响。本文中使用的值是虚拟值。我提供了一些使用 Python 中的 Excel、Matplotlib 和 Plotly 包构建瀑布图的技术。还可以使用各种其他工具或技术来构建瀑布图。根据我的经验,我更喜欢使用 Plotly 构建瀑布图。瀑布图可以通过定义x
、y
、measure
在 Plotly 中创建为一个对象。此外,connector
、text
、textposition
、orientation
、increasing
、decreasing
、totals
等参数允许根据需要和愿望定制瀑布图。
这篇文章的数据和笔记本可以在这个 GitHub 资源库中找到。感谢您的阅读!
WaveNILM:一种用于功率分解的因果神经网络
NILM 的深度学习
因果关系在深度学习中更值得关注
亚历山德罗·比安奇在 Unsplash 上拍摄的照片
介绍
P 能源分解是为不断增长的能源消耗需求建立更好的电网基础设施的重要过程之一。分解意味着"将单个电器的消耗值从总耗电量中分离出来。众所周知,深度神经网络正被应用于解决几乎所有行业和垂直领域的复杂问题,它在能源行业也取得了成功。我们已经看到了 LSTMs [1]、1D-CNN、Transformers [2]以及其他基于时间序列的算法在常见用例中的应用,如负荷预测、整合策略[3]、需求响应[4、5]、NILM(非侵入式负荷监控)、P2P 交易等。在本文中,我们将重点关注 NILM,它是开发未来智能电网基础设施的重要过程之一。
背景
NILM 是一个经验丰富的研究领域,于 1992 年首次提出。快进 20 年,我们在这一领域有许多令人兴奋的研究[6,7,8],在处理和解决这一问题的各种其他方法中,深度学习占据了大多数焦点。该领域涉及时间序列数据,并直接涉及序列建模架构的使用,如 RNNs、LSTMs、GRUs,当然还有最新的 Transformers。但是,这些都不是因果关系,需要在当前时间步 t 分解的未来值。
TCNs(时间卷积网络)的出现,挑战了 LSTMs 和 gru 在各种序列建模任务中除了因果性之外还具有更长的有效记忆。TCN 中的隐藏图层与输入图层的大小相同,并补零以确保序列长度始终保持不变。此外,它防止信息从未来泄漏到过去的方式是通过使用因果卷积层,该卷积层在当前时间步长 t 处对 t-n 时间步长进行卷积。使用具有各种膨胀因子的膨胀卷积来回溯非常远的过去(指数大的感受野),以便将预测考虑在内。
时态数据的标准卷积与扩展卷积。图片致谢—wavelnilm论文
理念与建筑
WaveNILM [9]建立在因果 CNN [10]架构之上,在构建更好、更高效的实时解聚架构的过程中做了一些改进,这在智能和动态电网时代非常需要。
这就是 WaveNILM 架构中块的样子。图片致谢—wavelnilm论文
上图描述了 WaveNILM 如何使用门控膨胀方法-来自 Conv 密集层的输出被分成两个方向,即 Sigmoid(门)路径和 ReLU(回归量)路径。然后将输出连接起来,形成模块的总输出。有几个以剩余方式堆叠的块,但是剩余连接的性质略有不同——来自每个块的跳过连接不仅仅跳过一个块,而是跳过几个块并在最后几个下游层加入网络。
输入层是一个 512 单位时间分布层,后跟一个门控块堆栈。在这里,所有跳过的连接被收集并连接在一起,形成另一个新图层,作为输出掩膜。由于体系结构的多输入性质,输出掩码与对应于我们要分解的设备的单元相乘。
结果和基准
单输入与多输入实验。图片鸣谢——韦芬尼姆论文
让我们快速讨论一下可延迟负载,这是一种重要的负载特征类型,需要针对关键优势进行分解。可推迟负载是可以在非高峰时间运行的大型负载。例如暖通空调、热泵、烘干机、烤箱和洗碗机。上述负荷的成功分解有助于防止电网停电和负荷减载。
来自 AMPds2 [11]的数据首先在【1440,1】之间进行缩放、批处理,并在 1 天(1440)的样本集上训练大约 500 个时期。由于 WaveNILM 是一个回归网络,我们必须关注错误率,而不是分类输出。下图所示的估计精确度是这些场景中广泛采用的度量标准之一,
作者图片
其中 s k ^(t)是时间 t 时一个电器的预测功率,s k (t)地面实况,t 和 k 分别是总时间和电器数量。WaveNILM 通过各种输入信号进行研究,如电流(I)、功率(P)、无功功率(Q)和视在功率(S)。当选择多个输入信号时,P 或 I 被选作输出信号。
作为对比,WaveNILM 已针对高噪声和去噪输入信号的 SSHMM [12]架构进行了基准测试。下表显示了 WaveNILM 与 SSHMM 在单输入和多输入情况下的性能。
可推迟负荷的降噪结果。图片致谢—wavelnilm论文
噪声情况导致可推迟负载。图片鸣谢——韦芬尼姆论文
我的想法
在我看来,WaveNILM 是一个很好的方法,一般来说是向基于因果关系的神经网络发展。当事物从其对数据的基本假设发生变化时,在理解模型行为方面,因果关系比相关性领先一步。具有因果关系的深度学习是当前更好的建模和鲁棒性的需要。了解因果方面可以让 AI 应用变得可解释和更智能。
还有一个方面是数据集,只检查和使用了一个数据集。我期待像 REDD 和 Pecan Street 这样的流行数据集的使用。使用这些数据集将开启基准测试的竞争,并提供更真实的性能数据。
结论
WaveNILM 提出了一种简单有效的因果网络来解决实时解聚问题。它的主要优点是能够添加/删除用于分解的输入数量,以便更好地拟合模型。还关注了所涉及的电力类型,以及如何推进基础设施以安全地捕获这些读数,这将大大有助于为消费者和电网运营商开发人工智能系统。
参考
[1]用于智能家居中非侵入式负载监控的并行 LSTM 架构:【https://ieeexplore.ieee.org/document/9308592
[2]电力:非侵入式负荷监测的高效变压器:https://pubmed.ncbi.nlm.nih.gov/35458907/
[3]数据驱动电动汽车集成策略的非侵入式电动汽车负载分解算法:https://ieeexplore.ieee.org/document/9794150
[4]智能需求响应和智能电网的深度学习:综合调查:https://arxiv.org/pdf/2101.08013.pdf
[5]使用深度学习预测需求响应的电能消耗:https://ieeexplore.ieee.org/document/9862353
[6]使用智能电表分析能源消耗的负荷曲线以反映家庭特征:https://www.mdpi.com/1996-1073/12/5/773
[7]太阳能发电住宅中电动汽车的低频非侵入式负载监测:通用性和可移植性:https://www.mdpi.com/1996-1073/15/6/2200
[8]用于非侵入式负荷监控的神经网络的序列到点学习:【https://arxiv.org/pdf/1612.09106.pdf
[9] WaveNet:原始音频的生成模型:【https://arxiv.org/pdf/1609.03499v2.pdf
[10]韦夫尼姆:https://arxiv.org/pdf/1902.08736.pdf
[11] AMPds2 数据集:https://dataverse.harvard.edu/dataset.xhtml?persistent id = doi:10.7910/DVN/fie0s 4
[12]利用 HMM 稀疏性进行在线实时非侵入式负荷监控:https://ieeexplore.ieee.org/document/7317784
[13] WaveNILM 实现:https://github.com/picagrad/WaveNILM
我们不知道如何让 AGI 安全
原文:https://towardsdatascience.com/we-dont-know-how-to-make-agi-safe-f13ae837b05c
有期限的哲学
Gert RDA valasevi it 在 Unsplash 上拍摄的照片
目录
- 对齐问题——由于我们无法可靠地让人工智能做我们想要做的事情而产生的风险。
- 警告信号——AGI 并不是某个遥不可及的北极星,相反,利用现有的深度学习技术和摩尔定律,它可能是可行的。
- 偏好&价值观——大多数威胁模型将 AGI 框定为超级聪明的优化者。如果这些优化者没有人类偏好意识,这个世界看起来很危险;我们不知道如何对这些值进行编码。
- AGI 不要求恶意是危险的 —当面对与人类冲突的高级人工智能时,自然的解决方案是关闭人工智能。作为对这一提议的回应,我引入了博斯特罗姆的工具趋同假说,除了其他重要观点之外,该假说推测,用当今技术设计的 AGI 将受到激励,以抵抗人类破坏或阻碍它的企图。我们可能无法阻止比我们更聪明的系统。这个假设让我认真对待 AGI 的安全问题。
- 批评和保留 —许多批评并不直接涉及材料。我解决了其中的一些问题,并描述了使我在这个问题上不那么强硬的有根据的论点。
- 往前走(关键时刻!?我们如何看待这些听起来像是来自小说的令人信服的论点?面对这种道德不确定性,我们如何推理?有哪些方法可以帮助解决对齐问题?
- 附录 —本文提出的几乎所有观点和想法都可以追溯到这里引用的书籍、论文和文章。这方面最有影响力的资料来源是 Nick Bostrom 的哲学和 OpenAI 和 DeepMind 的安全论文。我的笔记为我对各种话题和个人轶事的看法提供了额外的见解。
放弃
本文所表达的论点和观点完全是本人观点。 我写这篇文章的目的是总结我在过去六个月中形成的世界观,并调查 AGI 的安全领域。我充其量只能传达对问题领域的肤浅理解。我的希望是,读者也可以通过提供反例和反驳 来理解激励 AGI 安全的直觉和论据,以及 【红队】这种世界观。虽然我觉得这些论点很有说服力,但我想强调的是,我远不能确定未来会以这种方式展开【D】。我遇到过在这个问题上持反对意见的杰出人士。这种不确定性促使我通过写作【E】来提炼我的观点。随着我和这个领域的观点不可避免地发生变化,我将来可能会否认这些立场。也就是说,深思熟虑地考虑人工智能系统是如何设计和治理的,对于减轻当代充分理解和不确定的未来风险至关重要。
“这可能是下一个世纪最重要的转变——要么迎来一个前所未有的财富和进步时代,要么预示着灾难。但这也是一个被高度忽视的领域:尽管数十亿美元被用于让人工智能变得更强大,但我们估计世界上只有不到 100 人在研究如何让人工智能变得安全。”— 8 万小时****【12】
对齐问题
我们这个时代的一些最聪明的头脑和有能力的组织正在竞相发展一种技术,这种技术的当代行为知之甚少,其长期影响也不确定。我们面临着加剧人工智能造成的现有危害以及引入无数新的和意想不到的威胁的风险。我们可以进一步假设,用今天的技术设计的人工普通智能(AGI)将不会被关闭、限制和控制,也不会遵从人类的价值观和偏好。因此,如果对此不采取任何措施,我们很可能会陷入这样一种境地,即我们拥有比我们更聪明的人工智能,却不希望我们关闭它。在这种情况下,安全控制是不可能的。
这篇文章旨在提炼那些让我相信“对齐问题”【B】是我们这个时代最紧迫却又被严重忽视的问题之一的高层次论点。人们对这一问题领域的看法受到小说作品的严重影响,并且经常被立即忽视。这种怀疑态度是我在 2018 年第一次读到人工智能风险时的最初反应。然而,对这些论点的深入研究改变了我的观点。
下面的章节概述了当前深度学习系统的风险,如果我们不能解决这些技术中的根本缺陷,那么如果规模足够大,这些系统将对人类构成威胁。我将描述为什么人工智能可以抵抗被控制的尝试的假设,我们如何能够在不需要人工智能有意识有情感的情况下预期危险情况的出现,我们如何能够仅通过计算机科学的迭代进展实现 AGI,以及为什么这是一个紧迫的关注领域的案例。
"全人工智能的发展可能意味着人类的终结。"——斯蒂芬·霍金【11】
警告标志
人工智能可能是人类最重要的发明之一。毕竟,人类目前的成功在很大程度上要归功于我们形成智能计划、执行模糊认知任务以及与他人有效合作的独特能力。科学、技术、哲学、治理和智慧等人类进步都源于这种独特的智慧。用潜在的更便宜和大量的人工智能来增强人类智能的能力有可能迅速加快人类的进步。人工智能的最新进展,如 GPT-3【9】和加托【10】已经朝着一般智能迈出了大步。人工智能研究社区的隐含目标是有一天实现人工通用智能(AGI),它可以在一系列关键任务中达到或超过人类,而无需对特定目标进行微调。如果这一目标得以实现,它可能标志着科学和人类历史上的一个重要里程碑。
很少有人会认为人工智能不是一项颠覆性技术。尽管有这些好处,但当前的深度学习系统一直在强化现有形式的歧视,对气候产生不利影响,并将权力集中到有经济能力训练大型最先进模型的行为者手中【5】。当前的深度学习系统很大程度上是不透明的,随着规模的增加,审计越来越具有挑战性。我们理解模型为什么做出决策或预测未来行动的能力远远落后于这些模型的能力。人工智能系统可能无法推广到现实世界,并在训练中表现出无法检测的危险行为。危险的意外行为可能被代理人的力量放大,也可能被对抗性攻击利用【7】。也有一些威胁模型,其中不良行为者可以利用人工智能进行恶意使用。虽然上述当代问题非常紧迫,但除了极端滥用情况下出现的风险之外,它们并不存在任何明显的生存风险。
当我们退后一步,看看我们前进的方向时,令人不安的迹象就出现了。虽然未来是出了名的难以预测,但我们可以有把握地假设,人工智能的进步将随着越来越多的投资和成果而继续。因此,我们正在目睹一个全球趋势,许多世界上最聪明的头脑都在竞相开发可以媲美或超过人类智力的智能体。虽然听起来像科幻小说,但这是目标,并且正在取得有意义的进展。发展中的 AGI 的科学声望和经济激励以这样一种方式联合起来,使得成功成为可能。许多著名人工智能研究人员声称人工智能不可能实现的里程碑,如国际象棋和艺术,已经实现。在一个又一个里程碑到达之后,杰出的人工智能研究人员可能会继续移动目标。
然而,对于 AGI 是否可能,人工智能社区仍然存在重大分歧。从悲观的角度来看,杰出的人工智能研究人员会认为 AGI 是不可能的,但努力让智能体变得更强大和更通用是虚伪的【2】。然而,人们的态度已经开始改变。虽然该领域努力实现更普遍、更强大和无处不在的代理,但在 AGI 是否可能的问题上缺乏共识造成了一种环境,在这种环境下,解决我们如何使 AGI 安全的问题很难提出和解决。
如果 AGI 是不可能的,需要远离深度学习的范式转变,或者我们对智力的理解有一些根本性的突破,这些问题就没有那么紧迫了。然而,我们可能没有这么幸运。越来越多的人认为,我们可能能够利用类似于今天的深度学习系统的技术,通过更多的计算来实现 AGI。这个场景被称为“*淡无奇的 AGI”,我们通过*淡无奇的技术实现了 AGI。由于由 transformers 架构开创的大型 NLP 语言模型的最新进展,这种可能性已经开始受到重视。计算机科学家已经观察到,模型的训练损失可以随着额外的计算【8】而线性减少。随着我们遵循摩尔定律,计算变得越来越便宜,我们可能会观察到一种趋势,即现有模型在没有重大技术进步的情况下变得更强大。通过将*淡无奇的进步与真正的计算机科学突破结合起来,进步可能会加快。
关键的一点是,如果这种*淡无奇的方法为 AGI 提供了一条看似合理的道路,我们可能就没有那么多时间来解决深度学习的许多问题,这些问题可能会给人类带来风险。随着这些模型变得更加强大和有效,围绕歧视性算法的当代问题可能会变得更具破坏性。对于好演员来说是一个有益的工具,但在坏演员手中却很快变成了武器。此外,正如我们将在下一节中探讨的,关于我们如何将 AGI 体系与人类价值观结合起来,还有许多未解决的问题。
人类如何控制潜在比他们更聪明的智能体?当人工智能经历了人类不同意的行动过程时,我们如何才能有力地保证人类可以干预?这些都是没有答案的危险问题,比人们最初想象的要困难得多。自满、缺乏共识和经济激励使得这些基本问题在人工智能社区中被危险地忽视和成为历史禁忌。因此,我们处在一个不确定的情况下,计算机科学社区没有这些问题的答案,但正在快速前进。
"一切事物都是模糊的,直到你试图把它变得精确时,你才意识到这一点。"——伯特兰·罗素
偏好和价值观
人类在现实世界中传达的指令依赖于对价值和偏好的广泛假设和知识。例如,当要求某人尽最大努力清理房间的灰尘时,你可以确信你的清洁工不会以损坏贵重物品、掀翻家具和造成大破坏为代价来优化灰尘的清理。你不需要向你的清洁工说明你希望你的目标以一种不与你的偏好和价值观相冲突的方式实现,也不需要列出每一个细节。很明显,不考虑人的偏好而逐字解释一个指令,为你实现目标打开了许多非正统和危险方法的可能性。如果超级智能优化器在实现这些目标时没有尊重人类的偏好和价值观,那么任何目标,即使是减少癌症患者数量这样的良性目标,或者是最大限度增加工厂回形针数量这样的良性目标,都可能存在风险。
知识和对人类偏好和价值观的尊重对人工智能来说不是天生的。我们可以使用当代机器学习技术,如强化学习,来训练人工智能根据结果执行任务。然后,这些代理人学会选择采取最有可能最大化其内在奖励功能的行动。他们在训练中学习到的这个奖励函数并不一定包含大量的(而且经常是相互冲突的)人类偏好。
假设我们期望 AGI 像一个有目标的代理人一样行事,并采取看起来最有希望实现这一目标的行动方针。在这种情况下,我们冒着这些强大的代理人采取最佳行动,不符合我们的价值观的风险。例如,一个代理人可能被赋予减少全球癌症患者人数的目标,并试图通过秘密杀死癌症患者来实现这一目标。类似的思维实验可以从几乎任何基本目标中推导出来,不管这些目标是良性的还是良性的。在未来的世界里,这些超级智能代理人无情地优化目标,呈现出一幅危险的画面。
另一个类似的因缺乏人类偏好而导致的失败模式是任务规范游戏【14】。不像这篇文章中提出的其他有些投机的问题,我们在当今最先进的强化学习系统中有这样的例子。任务规范博弈可以被粗略地定义为一种行为,在这种行为中,一个主体完成了一个目标的严格字面规范,但却导致了一个不期望的结果。
DeepMind 文章【14】中概述了一个来自赛艇视频游戏的经典例子。玩游戏的代理人被给予目标,以最大化其收到的点数。人类操作员假定最大化点数是赢得比赛的足够的代理目标。然而,代理发现它可以忽略比赛,而是无限期地在港口转圈。DeepMind 编译了一个更长的示例列表,其中显示了 60 多个规范游戏示例。
对于如何将人类的偏好编码到机器中,我们目前没有任何可靠的工作解决方案。既然看起来没有理解和尊重人类观点的智能体可能默认不结盟,我们需要在实现超级智能智能体之前解决这个问题。
“人工智能不恨你,也不爱你,但你是由原子组成的,它可以用这些原子做别的事情。”——埃利泽·尤德科夫斯基****【17】
AGI 教不要求恶意是危险的
如果我们不能灌输与人类一致的价值观,是什么阻止我们仅仅关掉违背这些价值观的机器呢?应该迫使我们采取行动的确切故障模式是什么?我们凭什么推测 AGI 系统在默认情况下可能是危险的?
当一个人设想人类和人工智能处于对立状态的场景时,他会想到科幻小说和电影。许多这些小说作品的前提是,AI/机器人对人类产生了仇恨,并希望摆脱他们的奴役。毕竟,人类很少在没有仇恨和民族主义等强烈情绪的情况下发动冲突。然而,人工智能并不要求恶意,感知,甚至表达情感的能力是危险的。我们可以通过工具趋同假说【1】预测人工智能可能的行为以及冲突的可能来源。
工具趋同假说并不假设所讨论的理性主体【C】有意识,甚至有人工智能。它指出,任何智能代理将遵循类似的工具目标,以实现广泛的终端目标。终端目标是“最终”目标,工具性目标是帮助代理实现其最终目标的目标。例如,如果一个人的最终目标是成为软件开发人员,那么工具性目标可能是获得计算机科学学位。这个人可能会试图获得资金来支付他们的教育和购买一台电脑。获得金钱也是一个工具性的目标,而人类的终极目标则大不相同,比如收集更多的邮票。一个更普遍的工具性目标是自我保护。如果你死了,你就不能收集邮票或成为软件开发者。
由于 AGI 的设计规范是,它将作为一个代理人,以潜在的超人能力在长时间内有效地实现复杂的目标,我们可以预期 AGI 的行为将符合工具趋同假说。这是令人担忧的,因为我们可以预期 AGI 会不愿意让自己被人类关掉。此外,我们可以预计 AGI 希望获得资源,提高自己的智力(递归自我提高),欺骗人类,并抵制试图修改其最初的最终目标。
简而言之,在很少假设的情况下,我们可以假设,用今天的技术设计的 AGI 不会可靠地遵从人类,如果它察觉到遵从对于人类操作员最初分配的目标没有工具价值的话。因此,人类将努力改变遵循原始良性终极目标的 AGI 的进程,例如通过杀死所有人来减少世界上癌症患者的数量。在一个更简单的例子中,假设我们创造了一个智能人工智能,它的最终目标是给我们拿咖啡。我们可以期待这样的人工智能能够抵制任何它认为会削弱其取咖啡能力的人类尝试。毕竟,如果你死了,你就拿不到咖啡了。
“我有点担心,有时有效的利他主义社区会发出一个信号,“哦,人工智能是最重要的事情。这是最重要的事情。即使你正在做一些看起来很好、很不一样的事情,你也应该去做。我基本上觉得,我真的希望这些论点能得到更多的验证和更好的分析,然后我才会真正感到有理由支持它。”——本·加芬克尔****【15】
批评和保留意见
毫不奇怪,一项有前途的技术可能对人类构成严重风险的论点是有争议的。我最初在 2018 年放弃了这个问题领域,因为它听起来太超前和投机,可能无法提供合理的论据。从那以后,我真诚地参与了这些争论,并发现它们极具说服力,足以让我换了工作,彻底改变了我的职业方向。许多不同程度地参与过这个话题的聪明人并不相信。我不能总结所有的反对意见,而是集中在几个说明性的,我已经辩论了第一手。我也将回避有效利他主义社区中的争论,即面对今天的苦难,长期主义事业领域是否是易处理的和有价值的。
根据我的经验,最常见的挑战是,通过关闭 AGI、将其密封在安全的环境中或保持有人在循环中,对准问题可以很容易地解决。从表面上看,这些似乎是可行的解决方案。当我第一次读到这个问题时,我想到了这些解决方案。在我看来,工具趋同假说驳斥了这些论点。一个理性的代理人会试图保护自己免受破坏或阻碍。控制问题的强力解决方案可能适用于尚未达到人类智能的足够“愚蠢”的人工智能。然而,当我们考虑到在超级智能 AGI 的情况下我们面对的对手时,这些解决方案开始显得不那么健壮。人类似乎不太可能可靠地控制并击败一个可能比他们聪明得多的智能体。超级聪明的 AGI 可能会设计出防御、进攻、欺骗和其他策略来智取人类。在最糟糕的情况下,人类操作员的这场艰苦战斗凸显了在超级智能 AGIs 出现之前减轻这些风险的必要性。
我的大学教授提出的一个经典论点是,AGI 是不可能的。当观察今天的深度学习系统时,很容易想到这一点。在我看来,这种观点不太有分量,正如本文前面提到的,过去三年来,变压器架构推动了通用性的进步。如此有声望和经济价值的奖项在某个时候得不到似乎也不太可能。没有已知的科学规则表明 AGI 是不可能的。当计算机科学家预测人工智能进步的记录好坏参半时,忽视这个问题领域的前提是 AGI 是不可能的,这似乎也是一个冒险的赌注。
另一个反驳来自先验,AGI 是可能的,但在遥远的未来,可能是一个世纪或更久。这种先验通常被框在两个论点中。首先,担心 AGI 风险就像担心火星人口过剩一样。这个想法是,由于这些风险最早只会在一两代人的时间里出现,我们现在不需要担心它们。我的直觉是,我们不知道 AGI 什么时候会被开发。众所周知,科学突破很难预测。因此,我们最终可能会发现 AGI 比预期的要早得多,并且在方向盘上睡着了。
我更赞同的第二个观点是,如果 AGI 离我们很远,也许 50 年以后,我们还有什么希望去影响它呢?我们可能是担心 1880 年而不是 1930 年使用原子弹的核物理学家。未来可能太难预测了,我们今天在技术 AI 安全研究上取得的任何进展都有可能被未来的技术作废。正如前面的论点一样,我不相信我们可以对任何时间表有信心,并且打赌我们预测一个众所周知的难以预测的事件似乎是不稳定的。即使确切的技术研究经得起时间的考验,更广泛地推广 AGI 安全研究和负责任的人工智能似乎是一种对能源的良好利用,几乎没有负面影响,但有巨大的潜在正面影响。
我认为最有说服力、也让我变得不那么鹰派的批评来自牛津生命未来研究所的本·加芬克尔。本提出的一个论点是,据我所知,许多经典的 AGI 安全论点都是以快速起飞为前提的。在这些场景中,一些远非超级智能的种子人工智能获得了递归自我改进的能力。由此产生的智能爆炸可能会导致人工智能迅速超越人类智能,并以极快的速度实现超级智能——可能只需几天时间。如此快速的起飞给协调、立法以及我们使用类似 AGI 的系统解决技术问题留下了很小的空间。加芬克尔怀疑这样的快速起飞是默认的结果,而是相信 AGI 将遵循与其他技术类似的道路,这些技术的成功主要是通过渐进的步骤而不是意想不到的快速突破来实现的。
加芬克尔还指出,AGI 风险很少被框定在玩具思维实验之外,而且关于这些基本 AGI 风险论点的著作仍然相对较少。他认为,大量的模糊概念和玩具思维实验并不是有力的证据来源,而且存在抽象失败的风险,这会使许多威胁模型无效。虽然这种精炼的术语和公理的缺乏可以从一个前聚合领域中预料到,但这种模糊性使得批评和反驳这些核心假设变得更加困难。降低善意专家批评人工智能安全领域的门槛是一个重要的问题领域。
我邀请读者评论他们的反驳或不同意见。我很高兴有机会红队我的观点。缺乏来自真诚接触这些材料的个人的合理论证。
“我们发现自己处在一个战略复杂的灌木丛中,被不确定性的浓雾所包围。虽然已经发现了许多考虑因素,但它们的细节和相互关系仍然不清楚,也不确定——可能还有其他我们还没有想到的因素。在这种困境下,我们该怎么办?”——尼克·博斯特罗姆《超级智慧》第十五章****【1】
结论(关键时刻!?)
AGI 的安全领域刚刚起步,还没有形成典范。试图总结这个问题领域的一个主题是显著的不确定性。对于哪些方法是有前途的,未来会如何,那些同意这些论点并在这个问题领域工作的人之间甚至有分歧。这让我们这些窥视的人怎么办?AGI 安全软件工程师(还)不是一个职位。只有少数组织致力于思考这个问题领域,大多数讨论都集中在在线论坛和 Discord/Slack 服务器上。这篇文章仅仅解决了(一些)技术问题,而没有解决负责任的和明智的 AI 治理这个同样令人生畏的问题。最糟糕的是,我们不知道这种变革性的技术何时到来。
有一些有希望的研究方向有可能帮助减轻本文中概述的许多风险。这些措施包括使深度学习模型更具可解释性【18】、从人类偏好中学习【2】,以及使代理变得真实【19】。Anthropic、Ought、OpenAI、DeepMind 和其他专注于 AGI 安全的团队也有机会从事软件/ML 工程、治理和理论研究。许多角色不需要丰富的 ML 经验或研究生学位。80000 小时包含了几十篇关于 AI 安全以及如何以此为职业的文章。
我不是圣人。对于我们应该做什么,我没有什么好的答案。我的直觉是,多阅读和讨论这些想法是发展你自己的世界观和直觉的一个非常好的方法。这篇文章只是触及了问题的表面。为了获得更广泛的理解,我强烈推荐观看罗伯特·迈尔斯的 YouTube 频道,并学习 AGI 安全基础课程。这门课程有每周的阅读材料和练习,是对核心概念的很好的介绍。
写这篇文章有助于澄清我的观点,加深我对问题领域的理解。我强烈建议其他人也这样做。如果你有兴趣了解更多关于这个问题领域,我的计划,或者有改善我的世界观和写作的建议,请不要犹豫。
附录
笔记
- 许多人工智能安全研究人员建议不要使用“AGI”这个词,因为它被认为充满了智力和情感的概念。正如文章中提到的,这些属性对于一个危险的系统来说并不是必须的。我在这里使用 AGI,因为这是一个众所周知的术语,更适合初级读者。
- 【B】—对齐问题有很多定义。这是一个新生的领域,有很多不确定性。我认为这是极度智能的人工智能无法编码人类价值和可靠地遵从人类偏好。著名的 AGI 安全研究员保罗·克里斯蒂安诺有一个我喜欢的定义。“当我说 AI A 与运算符 H 对齐时,我的意思是:A 试图做 H 希望它做的事情。”【16】
- 【C】—理性主体可以被认为是一个实体,它形成对其环境的信念,评估行动的后果,有能力制定长期计划,并采取基于效用最大化的行动。没有要求代理必须是有机的、模拟的或金属的。
- 我希望我的写作风格会让我看起来比实际上更自信。我避免用太多的“可能”和“也许”来淡化我的观点。
- 霍尔登·卡诺夫斯基(Holden Karnofsky)是有效利他主义运动的创始人之一,现任开放慈善项目主席。他写过几篇文章,描述了他对投机性但极具影响力的长期风险进行推理的经历。他的文章“通过写作学习”鼓励思考这些问题领域的个人写出他们的世界观。埃文·墨菲的建议和鼓励激励我写下了这篇文章。
- [F] — 以减轻当前的痛苦为代价,专注于投机性的长期风险,可能是一个艰难的选择。在易于处理和充分理解的当代问题和具有高度投机性的未来问题之间进行权衡是困难的。让人们处理不同的问题领域是很好的。我宁愿试图说服现有的想要留在人工智能领域的人工智能研究人员专注于安全,而不是倡导那些已经对高影响力的非人工智能 EA 机会感兴趣的人转向。
参考
- 尼克·博斯特罗姆。2014.超智能。牛津大学出版社(英国)
- 【2】斯图亚特·罗素。2019.人类兼容。维京人。
- 【3】托比奥德 2020。绝壁。阿歇特书。
- 【4】理查德 Ngo。2020.AGI 安全第一原则。AlignmentForum.org。2022 年 6 月 12 日从 https://www.alignmentforum.org/s/mzgtmmTKKn5MuCzFJ检索
- 艾米莉·m·本德、蒂姆尼特·格布鲁、安吉丽娜·麦克米兰·梅杰和什玛格丽特·什米切尔。2021.随机鹦鹉的危险。2021 年美国计算机学会(ACM)公*、问责和透明会议记录 (2021)。DOI:https://DOI . org/10.1145/3444363436
- 马特·史蒂文斯。2019.为什么杨安泽说自动化是对国家的威胁?www.nytimes.com。2022 年 7 月 4 日检索自https://www . nytimes . com/2019/06/27/us/politics/Andrew-yang-automation . html
- 雷伊·礼萨·维亚特诺、徐安琪、奥斯曼·迪亚和阿奇·德·伯克。2019.现代机器学习中的对立例子:综述。arXiv:1911.05268(2019 年 11 月)。DOI:https://DOI . org/https://doi.org/10.48550/arXiv.1911.05268
- 【8】贾里德·卡普兰、萨姆·麦卡多里斯、汤姆·亨尼汉、汤姆·布朗、本杰明·切斯、雷文·柴尔德、斯科特·格雷、亚历克·拉德福德、杰弗里·吴和 V·阿莫代伊。2020.神经语言模型的标度律。arXiv(2020 年 1 月)。DOI:https://DOI . org/arXiv:2001.08361
- 【9】汤姆·布朗、本杰明·曼、尼克·莱德、梅拉妮·苏比亚、贾里德·卡普兰、普拉富拉·达里瓦尔、阿尔温德·尼拉坎坦、普拉纳夫·希亚姆、吉里什·萨斯特里、阿曼达·阿斯凯尔、桑迪尼·阿加瓦尔、阿里尔·赫伯特-沃斯、格雷琴·克鲁格、汤姆·海尼汉、雷文·蔡尔德、阿迪蒂亚·拉梅什、丹尼尔·齐格勒、杰弗里·吴、克莱门斯·温特、克里斯托弗·黑塞、陈唐山、埃里克·西格勒、马特乌斯·利特温、斯科特·格雷、本杰明·切斯、杰克 2020.语言模型是一次性学习者。《神经信息处理系统进展 33:2020 年神经信息处理系统年会》, NeurIPS 2020,2020 年 12 月 6-12 日,virtual,Hugo Larochelle,Marc'Aurelio Ranzato,Raia Hadsell,Maria-弗洛里纳·巴尔坎和 Hsuan-Tien Lin(编辑。).https://proceedings.neurips.cc/paper/2020/hash/1457 c 0d 6 bfcb 4967418 bfb 8 AC 142 f 64 a-abstract . html
- 【10】斯科特·里德、康拉德·佐尔纳、埃米利奥·帕里索托、塞尔吉奥·戈麦斯·科尔梅纳雷霍、亚历山大·诺维科夫、加布里埃尔·巴尔特-马龙、麦·希门尼斯、尤里·苏尔斯基、杰基·凯、约斯特·托比亚斯·斯普林根贝格、汤姆·埃克尔斯、杰克·布鲁斯、阿里·拉扎维、阿什利·爱德华兹、尼古拉斯·赫斯、陈玉田、拉亚·哈德塞尔、奥里奥尔·维尼亚尔斯、马赫亚尔·博德巴尔、南多·德弗雷塔斯。2022.多面手特工。arXiv:2205.06175
- 罗里·塞兰·琼斯。2014.斯蒂芬·霍金警告人工智能可能会终结人类。www.bbc.com。2022 年 7 月 15 日从https://www.bbc.com/news/technology-30290540检索**
- 罗伯特·威布林。2017.积极塑造人工智能的发展— 8 万。80000hours.org。2022 年 7 月 16 日检索自https://80000 hours . org/problem-profiles/positively-shaping-artificial-intelligence/
- 【13】**伯特兰·罗素语录。libquotes.com2022 年 7 月 16 日从https://libquotes.com/bertrand-russell/quote/lbz3q7r检索
- ****【14】规范游戏:人工智能独创性的另一面。2022 年 7 月 29 日检索自https://www . deep mind . com/blog/specification-gaming-the-flip-side-of-ai-injury
- 豪伊·兰佩尔、罗伯特·威布林和凯兰·哈里斯。2020.本·加芬克尔(Ben Garfinkel)对经典人工智能风险论点的审查——8 万小时。80000hours.org。2022 年 7 月 29 日检索自https://80000 hours . org/podcast/episodes/Ben-garfinkel-classic-ai-risk-arguments/
- 保罗·克里斯蒂安诺。2018.澄清“AI 对齐”。ai-alignment.com。2022 年 7 月 29 日检索自https://ai-alignment . com/clarizing-ai-alignment-CEC 47 CD 69 DD 6
- 引用埃利泽·尤科夫斯基的话:“人工智能不恨你,它也不恨你。goodreads.com。2022 年 7 月 29 日从https://www . goodreads . com/quotes/499238-the-ai-does-not-hate-you-not-does-not-does-love
- 克里斯·奥拉、尼克·卡马拉塔、路德维希·舒伯特、迈克尔·彼得罗夫、尚·卡特和加布里埃尔·吴。2020.放大:电路介绍。蒸馏吧。2022 年 7 月 29 日从 https://distill.pub/2020/circuits/zoom-in检索
- 保罗·克里斯蒂安诺、阿杰亚·科特拉和马克·徐。2021.如何辨别你的眼睛是否欺骗了你?docs.google.com。2022 年 7 月 29 日检索自https://docs . Google . com/document/d/1 wwsnjqstpq 91 _ Yh-ch 2 xrl 8h _ EPS njrc 1 dw xr 37 PC 8/edit?usp =共享
- 安迪·琼斯。2021.人工智能安全需要伟大的工程师。lesswrong.com。2022 年 7 月 29 日检索自https://www . less wrong . com/posts/ydf 7 xhmthhnfhfim 9/ai-safety-needs-great-engineers
值得注意的修订历史
我的目标是让这成为一个活的文档,随着我的观点的改变而更新。我将在这个更新日志中记录这些有意义的修改,以展示我的观点是如何改变的,以及我在哪里试图澄清我的写作。
- 2022 年 7 月 20 日——首次提交
- 2022 年 8 月 5 日—语法改进,并在文章前面移动了 AGI 的定义
- 2022 年 8 月 11 日—为符合数据科学政策,对结构和版权进行了小幅更新
监管不力:给你的数据贴上标签却没有真正贴上标签🤔
实践教程
以编程方式标记您的数据!
照片由 Swanson Chan 在 Unsplash 上拍摄
**Table of Contents:**· [Exploratory Data Analysis](#d97d)
· [Keyword Labeling Functions](#a348)
· [Heuristic Labeling Functions](#8495)
· [Labeling Functions with spaCy](#cce7)
· [Combining Labeling Function Outputs](#5315)
· [Training a Classifier](#b386)
· [Wrapping Up](#62d7)
这是一个彻底消除在机器学习项目中手工标注任何训练数据的激进想法。它诞生了通气管,一个强大的程序库来构建训练数据。
在通气管中有三种程序化操作:
- 标记功能,例如,使用启发式规则来标记数据
- 转换功能,例如,执行数据扩充
- 切片功能,例如,将数据分成子集以进行有针对性的改进
在这个故事中,我们将着重于标记函数。关键思想是标注函数不需要非常精确。浮潜将结合这些来自许多嘈杂的启发式标记策略的输出标签,以产生可靠的训练标签。
这个过程被广泛称为监管不力。
我们使用一个名为problems_preprocessed.json
的数据集,它有三个键:text
键包含 LaTeX 格式的数学问题,tags
键包含代数、组合学、几何或数论中的一两个标签,以及token
键。原始数据集与我在之前的故事中使用的数据集相同。
回想一下,通过几个步骤对text
进行预处理(只是现在没有去词干)以获得干净的token
。我们不做词干分析,因为我们需要原始单词来构建关键字标签函数。预处理细节请访问上一个故事。
将“问题”定义为text
中的观察/数据点。请注意,一个问题可以分为多个类别。例如,下面这个问题被归类为代数和组合学。
总共有 181 个不同的问题。我们再加一列名为wordcount
,是token
的字数。
你可能会注意到,一些问题有标签,但其他许多问题没有。带有标签的问题是用于分类器最终评估的测试问题。这些标签是手工标记的,以确保正确性。没有标记的问题是列车问题,应使用弱监管进行标记。我们看到有 135 个不同的训练问题和 46 个不同的测试问题。
Train data shape: (135, 4)
Test data shape: (46, 4)
接下来,将测试数据中的标签转换成 4 个二进制列,依次表示algebra
、combinatorics
、geometry
和number theory
,这样我们就可以继续建模,然后将结果连接回测试数据。
探索性数据分析
要创建标注函数,您至少需要对数据集有所了解。因此,EDA 非常重要。首先,您可以将每个标签的单词云可视化。
图片作者作者
一些单词与标签紧密相关。例如,如果一个问题包含短语“实数”,那么它很可能是一个代数问题,而几何问题包含类似“三角形”或“圆”的单词。
有些标记可以进一步清理,如“let”和“prove ”,它们不强调任何标签,因为每个问题都很可能包含这些命令词。然而,由于我们在这里只做启发式标记,我们可以在创建标记函数时忽略这些词,而不做一些大范围的清理。
还记得wordcount
吗?我们也可以使用这些信息来形成标记函数。看下面的分布图。
图片作者作者
很明显,组合数学问题更长:它们包含许多单词!这是有意义的,因为组合学问题有时会传达某种故事,比如下面这个。
m 个男生和 n 个女生(m>n)坐在一个圆桌对面,由一个老师监督,他们做了一个游戏,是这样的。起初,老师指着一个男孩开始游戏。被选中的男孩把一枚硬币放在桌子上。然后,按顺时针顺序,每个人都轮到自己了。如果下一个人是男生,他会把一个硬币放到现有的硬币堆里。如果下一个人是女生,她会从现有的一堆硬币中拿一枚。如果桌上没有硬币,游戏结束。请注意,根据选择的男孩,游戏可能会提前结束,也可能会进行完整的回合。如果老师想让游戏至少进行一整圈,可以选择多少个男孩?
我们可以有把握地说,一个超过 60 个单词的问题是一个组合学问题。
接下来,让我们定义一些变量来提高代码的可读性。
关键词标签功能
有几种技术可以创建标注函数。最简单的方法是使用关键字。从 EDA 中,我们可以选择每个标签中的主要关键字。例如,如果一个问题包含“素数”或“整数”这两个词,我们就将其标记为数论。
我们为每个标签构建了 3 个关键字标记函数,总共产生了 12 个标记函数。请注意,有些标注函数有多个关键字。如果一个问题没有关键词,那就让它弃权吧。
制作标签函数的一种方法是使用LabelingFunction
类,它接受一个实现核心标签函数逻辑的 python 函数。
如果训练数据的真实标签不可用,例如在我们现在的情况下,则在通气管中有 4 个汇总统计来评估标签功能:
- 极性:每个标签函数输出的唯一标签集,不包括弃权
- 覆盖率:每个标注函数标注的数据集的分数
- 重叠:每个标注函数和至少另一个标注函数标注的数据集部分
- 冲突:每个标注函数和至少另一个标注函数标注且不一致的数据集部分
因为增加误报会增加覆盖率,所以高覆盖率并不总是好的。可以使用PandasLFApplier
类将标记功能应用于训练数据。
100%|███████████████████████████| 135/135 [00:00<00:00, 2327.52it/s]
启发式标记函数
接下来,从 EDA,我们一致认为,一个超过 60 个单词的问题将被标记为组合学问题。因此,让我们创建一个标记函数来做这件事,如果问题的字数少于或等于 60,就把它们作为弃权。
这里,我们使用@labeling_function
decorator 来制作如下的标签函数,它可以应用于任何返回单个观察值标签的 python 函数。
100%|███████████████████████████| 135/135 [00:00<00:00, 4784.38it/s]
用空间标记函数
现在,对于稍微高级一点的实现,我们不像以前那样使用原始数据来导出标记函数。相反,我们利用 spaCy 库,这是由浮潜中的@nlp_labeling_function
装饰器简化的。
我们使用空间来识别问题中被标记为“人”的实体。那么如果这些问题包含实体,它们就被标记为组合学。这是有用的,因为组合学问题,如前所述,有时传达了关于一个人的某种故事。否则,把这些问题当做弃权。
100%|█████████████████████████████| 135/135 [00:02<00:00, 61.12it/s]
组合标注功能输出
我们现在有 14 个标记功能,预计它们会相互重叠或冲突。浮潜有能力结合和降噪他们的输出。
但是首先,让我们创建calc_score
函数来计算真实标签和预测标签之间的测试数据的加权精度、召回率和 f1 值。
不要忘记将标签函数应用于测试数据,如下所示,因为我们只能评估标签函数在测试数据上的性能。
100%|███████████████████████████████| 46/46 [00:00<00:00, 63.67it/s]
现在,如何准确地将许多标记函数的输出合并到每个观察的一个或多个标记中呢?一种简单的方法是使用我们称之为MajorityLabelVoter
的标签,其中所选择的标签将是由大多数标签功能投票的标签。为了理解它是如何工作的,让我们看一下测试数据的前五个观察结果。我们有这些标签:
array([[-1, 0, -1, -1, -1, -1, -1, -1, -1, 3, -1, -1, -1, 1],
[-1, -1, -1, -1, -1, -1, -1, -1, -1, 3, -1, -1, -1, -1],
[-1, -1, -1, -1, -1, -1, 2, 2, -1, -1, -1, -1, -1, 1],
[-1, -1, -1, -1, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, -1, -1, 1, -1, 2, -1, -1, -1, -1, -1, -1, 1]])
这是一个 5 × 14 的矩阵,因为我们有 14 个标记函数。每个元素代表一个标签,其中-1 表示放弃。让我们去掉弃权符号,看看选择了哪些标签。
[0, 3, 1]
[3]
[2, 2, 1]
[2]
[1, 2, 1]
现在变得更清楚了。例如,我们可以理解,对于第三个观察值(标签显示为上面的[2,2,1]),14 个标签函数中的 2 个输出几何,1 个标签函数输出组合学。让我们调用基数为 4 的MajorityLabelVoter
(因为有 4 个标签),看看会发生什么。
array([-1, 3, 2, 2, 1])
我们观察到MajorityLabelVoter
有三个条件:
- 如果只有一个投票的标签函数,它输出相应的标签。
- 如果有多个标签函数投票,并且其中一个投票占主导地位,则输出主导标签。
- 如果有一个以上的标签函数投票,并且其中两个(或更多)以同样优势投票,则输出弃权。
总而言之,MajorityLabelVoter
为每个观察值输出一个标签,这不是我们真正想要的,因为我们正在处理一个多标签分类任务。事实上,通气管本身并不支持多标签分类。
要解决这个问题,我们需要一个变通方法。我们将使用MajorityLabelVoter
中的predict_proba
方法。
array([[0.33333333, 0.33333333, 0\. , 0.33333333],
[0\. , 0\. , 0\. , 1\. ],
[0\. , 0\. , 1\. , 0\. ],
[0\. , 0\. , 1\. , 0\. ],
[0\. , 1\. , 0\. , 0\. ]])
正如预期的那样,对于每个观察值,它给所有(主要)标签一个相同的非零值。现在,我们将这些非零值解释为由MajorityLabelVoter
选择的标签。换句话说,最后的标签y_pred
是一个元素为 1 的布尔矩阵当且仅当probs_test
的对应元素非零。因此,最终的标签预测如下。
array([[1, 1, 0, 1],
[0, 0, 0, 1],
[0, 0, 1, 0],
[0, 0, 1, 0],
[0, 1, 0, 0]])
我们看到标签为多标签分类任务提供了它们的用途,也就是说,有一些用多个 1 作为标签的观察结果。使用calc_score
函数计算加权精度、召回率和 f1 分数。
{'precision': '0.70', 'recall': '0.90', 'f1': '0.77'}
我们获得了 0.70 的精确度,0.77 的 f1 分数,具有可疑的高召回率。然而,这是可以预测的,因为我们上面的方法将弃权标记为[1,1,1,1],因此给出了许多假阳性,并间接为假阴性留下了很小的余量。
训练分类器
MajorityLabelVoter
的输出只是一组标签,可以与最流行的库一起用于执行监督学习。在这个故事中,我们使用了 scikit-learn 库中的逻辑回归。准确地说,我们将首先将文本特征提取到 TF-IDF 矩阵中,然后采用具有*衡类别权重的逻辑回归(以解决类别不*衡)。该模型将在一个多类设置中作为一个对其余的训练。
我们的训练数据将是标签为y_train
的df_train
,其中y_train
是一个元素为 1 的布尔矩阵,当且仅当probs_train
的对应元素非零。然而,我们需要小心。可能存在一些我们的标记功能中没有涵盖的观察结果。因此,我们需要使用filter_unlabeled_dataframe
过滤掉这些观察结果。
最后训练模型,在df_test
上预测,计算得分。
{'precision': '0.83', 'recall': '0.80', 'f1': '0.79'}
我们观察到分数总体上比MajorityLabelVoter
有所提高,并且没有可疑的高召回率!这在一定程度上是因为判别模型的泛化能力超出了标注函数的标注范围,并对所有数据点进行了良好的预测,而不仅仅是标注函数覆盖的数据点。判别模型可以超越噪声标记试探法进行推广。
包扎
我们已经了解了弱监管,一种实际上不标记任何数据(手动)的数据标记方法。尽管它看起来像一个邪教,但薄弱的监管将贴标签的时间从几个月减少到几天,甚至几个小时,结果可靠。我们使用通气管来完成这项工作,并成功地设计了一种方法,使用MajorityLabelVoter
中的predict_proba
方法来简化多标记分类任务。
弱监督的思想是组合许多标记函数的输出,这些函数用于以编程方式标记数据。在我们的案例中,我们发现这种方法有很高的召回率。然后,我们表明,在弱监督数据集上训练的分类器可以优于仅基于标记函数的方法,因为它学会了在我们提供的嘈杂试探法之外进行概括。
🔥你好!如果你喜欢这个故事,想支持我这个作家,可以考虑 成为会员 。每月只需 5 美元,你就可以无限制地阅读媒体上的所有报道。如果你注册使用我的链接,我会赚一小笔佣金。
🔖想了解更多关于经典机器学习模型如何工作以及如何优化其参数的信息?或者 MLOps 大型项目的例子?有史以来最优秀的文章呢?继续阅读:
从零开始的机器学习
View list8 stories
高级优化方法
View list7 stories
MLOps 大型项目
View list6 stories
我最好的故事
View list24 stories
艾伯斯·乌兹拉
R 中的数据科学
View list7 stories
[1]通气管的 API 文档,https://snorkel.readthedocs.io/en/v0.9.7/
[2]通气管介绍教程:数据标注,https://www.snorkel.org/use-cases/01-spam-tutorial
基于网络的聊天机器人项目,模块 2: GPT-3 生成的响应,有一个针对特定主题的少量学习的数据库辅助
这个项目的第二部分跨越网络编程,数学,人工智能,等等
我最*介绍了这个基于网络的、完全客户端的聊天机器人,它的“大脑”中有两个主要模块:
- 通过使用*似字符串匹配从问答配对数据库中检索答案的工具。
- 另一个使用 GPT-3 从内部解析的文本片段生成回复。
我还向您详细展示了第一个模块如何与字符串匹配函数、数据库编译等几个细节一起工作。:
现在,这是这个聊天机器人大脑的另一半:一个通过 OpenAI 的 GPT-3 语言模型生成用户问题答案的模块,该模型通过对文本的少量学习进行扩展,这些文本首先通过字符串匹配进行检索。
关键要点:聊天机器人的 GPT-3 模块通过 OpenAI 的 GPT-3 语言模型生成用户问题的答案,该模型通过对文本的少量学习进行扩展,这些文本首先通过字符串匹配进行检索。
核心部分:基于 GPT 3 的自然语言处理和生成,包含自定义文本
快速回顾 GPT 协议-3
聊天机器人这一半大脑的核心是 GPT-3,这是由 OpenAI 开发的用于文本处理和生成的模型。我在很大程度上介绍并测试了 GPT-3,特别是它准确回答事实问题和获得定制数据的能力:
为什么 GPT-3 在这个项目中?
GPT-3 是当今最大的型号之一,但不是最大的,也可能不是最好的。但是它在前 3-5 名中,对我来说它是最容易使用的。为什么?因为您只需调用 OpenAI 提供的 API 对于 web 应用程序,您可以通过简单的 PHP 实现这一点:
顺便说一下,我在我的免费 Altervista 驱动的网站上运行 PHP。这个提供商提供了丰富的功能(我没有因为推广它而获得任何东西…我只是喜欢它!):
我更喜欢 GPT-3 的另一个重要原因是,它很容易用自然检索的信息来扩展它。有两种方法可以做到这一点:
- 微调,涉及用定制信息训练小块模型。我永远也做不好这件事…
- 少量学习,它包括在提示之前添加包含自定义信息的文本。这非常有效,并且实现起来非常简单。
在下一小节中,我将描述 GPT 3 中的少镜头学习,然后我将向您展示我如何在我的聊天机器人中使用它——因为有一个重要的限制需要克服,您将会看到。
向 GPT 3 号通报具体知识的少数机会学习
GPT-3 最酷的特点之一是,你可以很容易地模拟你教它,而不是实际上重新训练它。这被称为“少量学习”,包括在提示之前提供一段包含与提示相关的信息的文本。
当你想问 GPT 3 号一个它不知道的问题时,这尤其有用……比方说,关于像你我这样不出名的人。然后你可以在你的问题前面加上这个人的简历,或者几段关于他/她的介绍;当被询问时,GPT-3 会将此信息作为提示的一部分进行处理,然后精心制作一个输出文本,如果提示询问的是其中的信息,该文本将受其影响。
我用这个基于少量学习的精确策略来指导 GPT-3 回答关于生物学的问题。问题简单的时候,它不需要额外学习就能正确回复;但是随着话题变得越来越专业,它开始出错或者没有产生任何答案。如果你在问题前加上文本,甚至是复杂的论文摘要,它就能很好地检索出答案,即使没有被问到它们在文本中是如何编码的。您可以在下面的文章中看到一些这样的例子:
现在让我们看看如何用字符串匹配包装这些内容,以便在 chabot 中进行少量学习。
这个网络聊天机器人的 GPT 3 模块中的特定主题的少数镜头学习
少量学习策略的一个重要限制是,提示受限于它可以接受的标记数量。确切的限制是 2000 或 4000 个令牌,具体取决于确切的 GPT-3 引擎和端点。令牌中的这种限制既包括输入,其中用于少量学习的信息以及问题被提供给模型,也包括模型的输出,即由 GPT-3 生成的文本。
OpenAI 的官方文档解释说 2000 个代币相当于 8000 个字符,或者 1500 个单词。这意味着,如果我们期望问题和答案占用大约 100-200 个单词,那么我们就剩下 1300-1400 个单词来为少量学习提供信息。这是一个相当大的数量,但是我们无法容纳大量的文本,即使是短文也不行。因此,我们不能提供,比方说,关于某个给定主题的整本教科书,或者在我的情况下,我的论文和博客帖子的全部内容,用于少量的学习。
这是我在聊天机器人中内置的程序:
- 建立一个数据库,包含我的论文摘要和我的博客条目,每个不超过 300 字,以独立的变量链接到完整文章及其标题的 URL。
- 清理用户输入的数字、符号、停用词等。
- 在数据库的标题和摘要中,从清理后的文本中搜索 1、2 或 3 个连续单词。当有匹配时,保存相应的文本。
- 将所有保存的文本合并在一起,将其精简到不超过 5000 个单词,在最后添加用户的问题,并将结果提交给 GPT-3。该输入包含从具有匹配关键字的文章中检索的少量学习的信息,后跟用户的问题。
- 从 GPT-3 返回后,删除输入,只保留 GPT-3 添加的文本部分,大概包含问题的答案。
对程序的深入探究
关于这个模块如何工作的几个具体点。
首先,我将文本保存在如下形式的数组中:
[“Title”,”Author(s)”,”Journal, magazine or blog”,Year,”[U](https://www.nature.com/articles/s43588-021-00142-8)RL","Text”]
其中最后一个字段“文本”是一个长字符串,用于构建 GPT-3 的少量学习提示。对于科学文本来说,这仅仅包括出版物的摘要或预印本,这些都可以在 PubMed 等网站上公开获得。对于杂志文章和博客文章来说,这段文字要么是文章的摘要,要么是文章的前几段。
以下是我的聊天机器人程序当前版本的例子:
摘自我的一篇同行评议论文:
texts.push([“通过 WebXR 实现科学教育的民主化互动和沉浸式体验”,“F Cortes Rodriguez,M Dal Peraro 和 LA Abriata”,“自然计算科学”,2021,“https://www.nature.com/articles/s43588-021-00142-8”,“抽象自然、极端尺寸、可用性差或购买成本高的对象和概念通常很难理解和实验。我们人类使用[…]完全虚拟的,如在虚拟现实(VR)中,或真实世界的扩展视图,如在增强现实(AR)中。”])
来自我的一篇博客:
texts.push([“罗勒、草莓、沙拉和西红柿在果园的阳台上茁壮成长。另外…那是什么?西瓜?西葫芦?”、“L Abriata”、“园艺、观鸟和户外探险(中)”、2022,“https://Medium . com/Gardening-Birding-and-Outdoor-Adventure/basil-草莓-沙拉-西红柿-growing-powerful-in-the-orchard-阳台-d6fad7ee6e73 ,“这里你看到其中一个在我建造的架子上,用来养植物,让它们接触阳光。前面还有一些玉米沙拉。这些是罗勒植物[…]草莓已经在我的阳台上生活了多年,几乎是野生的,但这次我把它们放在了更多日光浴的地方。多亏了这些金鱼草,这里的环境多姿多彩。”])
第二,清理输入字符串是必不可少的,这样字符串搜索就可以集中在有意义的单词上。你可以查看我以前的文章,看看单词修复、停用词、符号等列表。包含在我的字符串清理函数中。
请注意,一旦某些文章匹配,聊天机器人就会显示一个链接,指向它们的列表。这总是有用的,但尤其是当用户没有 GPT-3 API 密钥时,在这种情况下,聊天机器人将无法根据文本内容进行回复——但用户至少可以自己去看文章。
第三,聊天机器人检查用户是否正在提供 GPT-3 的 API 密钥。如果没有提供,它甚至不会尝试运行这个模块。如果提供了,它会通知用户它将尝试使用它,表明可能需要一分钟左右的时间才能得到答案。
最后一点很重要,因为 API 调用是异步工作的,所以在聊天机器人从 GPT-3 模块返回回复之前,用户可能会输入一些内容。为了使对话更自然,当聊天机器人要展示 GPT-3 程序的结果时,它首先回忆用户“关于……然后……”的问题
您可以在下面的示例中看到这一点以及迄今为止讨论的其他点。
与最终网络聊天机器人的对话示例
这里有一个对话,它通过字符串匹配(在我以前的帖子中介绍过)和调用 GPT 3:
使用了这个基于网络的聊天机器人的两个模块的聊天会话,如下所述。作者截图。
在这里,为了便于阅读,我把它转录了下来,中间用简单的字体格式做了注释:
卢西亚诺网站的访客你好!我是一个聊天机器人,受过关于卢西亚诺、他的工作、项目和爱好的信息训练。要与我聊天,请在上面键入您的文本,然后按 enter 键。
要知道我能帮你什么,键入‘Help’或问类似‘你能为我做什么?’
这是聊天机器人加载时显示的默认句子。
访客:嗨
Bot: 你好,都好吗?
参观者:是的
Bot: 太好了。
这段聊天来自我基于微软聊天机器人个性的开放数据集建立的非常丰富的数据库,正如我在以前的帖子中解释的那样。
来访者:我是来询问关于分子网的事情的
Bot: moleculARweb 是一个关于化学和结构生物学的教育网站,使用商品增强现实技术,在普通智能手机、*板电脑和电脑上运行。要使用网站中的基本活动,您需要打印一些标记,请通过https://molecular web . epfl . ch进入网站,选择一项活动并向网络摄像头显示标记。
这还是数据库的回复。下面继续,其中“it”在内部被“molecularweb”替换(最后一个主题,所有这些都在我以前的文章中),这允许与数据库的问题精确匹配。
访问者:我如何使用它?
Bot: 你可以在https://moleculARweb . epfl . ch使用 molecular web。当浏览器提示时,您必须打印一些标记并启用您的网络摄像头。要了解更多信息,请查看 Luciano 博客中的这些文章(这些文章也为您提供了一些相关的同行评审出版物):
来访者:好的,很好
Bot: 好。
最后一个响应也来自数据库的聊天部分。
现在,当用户询问关于 molecularweb 的一些非常具体的问题时,GPT-3 开始发挥作用:它的虚拟建模工具包。
参观者:那虚拟建模工具包是什么?
Bot: 没听懂,你能换个说法吗?与此同时,我将在我的文章数据库中搜索,看看我是否能使用我的 GPT-3 模块得出一个答案。
该机器人首先澄清说,它不太确定问了什么,但它会尝试它的 GPT-3 模块。
为了提高你和我聊天的体验,请注意拼写和语法。谢谢!
以防出现打字错误或复杂的问题,它还阐明了如何使聊天更加流畅。
我找到了一些你可能感兴趣的文章。你可以在这里查看论文列表。
根据这些论文的摘要,我现在将尝试使用我的 GPT-3 模块来回答你的问题。我很快会带着这个回来给你…(可能需要一分钟左右)
如果它找到了包含有问题的关键词的文章(记住它们被清除了符号、停用词等等)。),然后它会这样说,甚至会创建一个可点击的链接来查看文章。注意,它警告用户这可能需要一些时间。
最后,当 GPT-3 返回结果时,它会在文本前面显示这些结果,并引用原始问题。
关于你的问题“虚拟建模工具包是什么?”…虚拟建模工具包(VMK)是一种工具,用户可以在 3D AR 中构建和查看分子,并探索它们的机制,方法是使用定制打印的立方体标记(VMK 2.0)在全 3D 中处理分子,或者使用鼠标或触摸手势在模拟场景中移动(VMK 3.0)。在模拟时,分子会经历视觉上真实的扭曲、碰撞和氢键相互作用,用户可以手动打开和关闭。
另一个话题,这次是关于生长在瑞士的野生水仙花
根据从我的博客中的一篇文章中获取的信息,这篇文章包含在“少量学习”的文章列表中:
https://medium.com/illumination/the-history-of-switzerlands-wild-daffodils-dea42e8a4df4
我问“水仙花需要什么土壤才能生长?”。我知道这个信息就在那里。它可以找到它:
参观者:水仙花需要什么土壤才能生长?
不确定你在问什么,你最好换种方式再问我一次。与此同时,我将在我的文章数据库中搜索,看看我是否能使用我的 GPT-3 模块得出一个答案。
为了提高你和我聊天的体验,请注意拼写和语法。谢谢!
它说上面的文字是因为在数据库中没有任何匹配。但是正如你在下面看到的,它确实找到了这篇文章,所以它通过 GPT-3 模块,这个模块实际上可以回答这个问题!
我找到了一些你可能感兴趣的文章。你可以在这里查看论文列表。
让我把我的 GPT-3 模块应用到它们上面……(可能需要一分钟左右)
关于你的问题‘水仙花需要什么土壤才能生长?’……水仙花喜欢新鲜的土壤,微微湿润,营养丰富,比如奶牛放牧的田地——但是没有奶牛谁会吃它们!水仙花需要新鲜的空气,但又不需要太冷,所以它们生长在海拔 700 到 1800 米的地方。它们需要阳光,所以它们在朝南的开阔森林中茁壮成长..
它其实回答的比我问的还多,不过还好,至少都是和这些花长在哪里有关的信息。
GPT-3 带来的另一个很酷的东西:它让你的机器人可以使用多种语言!
如果你用西班牙语或法语问我的聊天机器人,如果问题通过 GPT-3 模块,那么很有可能得到答案。下面是我用这两种语言问它的关于 molecularweb 的问题:
访客:什么是分子网?
Bot: 原则上我不知道该说什么,但我会在我的文章数据库中搜索,试图用我的 GPT-3 模块得出一些答案。
为了提高你和我聊天的体验,请注意拼写和语法。谢谢!
我找到了一些你可能感兴趣的文章。你可以在这里查看论文列表。
让我把我的 GPT-3 模块应用到它们上面……(可能需要一分钟左右)
关于你的问题“分子网络是什么?”这是一个允许学生和教育工作者代表虚拟分子、分子、轨道和复杂生物分子和生物结构、分子结构、分子轨道和理论的网站;拉埃斯特雷。
访客:你是说分子网络吗?
请再说一遍。与此同时,我将在我的文章数据库中搜索,看看我是否能使用我的 GPT-3 模块得出一个答案。
为了提高你和我聊天的体验,请注意拼写和语法。谢谢!
我找到了一些你可能感兴趣的文章。你可以在这里查看论文列表。
让我把我的 GPT-3 模块应用到它们上面……(可能需要一分钟左右)
关于你的问题“这是什么分子网络?”… molecularweb 是一个关于化学和生物结构中的“教育和低俗化”的网站,可以在智能手机、*板电脑和纵坐标导航网站中快速浏览。我们提出了两个改进方案。
如果你能读懂这些语言,你就会确认它运行得非常好。结尾的截断与语言无关;它们有时也发生在英语中。它们与调用 API 时请求的最大长度有关。
我发现 GPT-3 也能够用意大利语和其他一些语言回答问题。另一方面,我看到它在像匈牙利语这样的语言中失败了,这可能在用于训练它的原始语料库中没有得到很好的表示。
想玩这个聊天机器人吗?
您可以在这里找到它:
http://lucianabriata . alter vista . org/chatbotallweb/chatbottest . html
请注意,我一直在改进聊天机器人,无论是在代码层面还是在两个数据库层面(问题-答案对和 GPT-3-通知文本)…所以如果你在我工作的时候输入,你可能会遇到问题。如果发生这种情况,请稍后再试。
请记住你需要一个 OpenAI API 密匙来使用 GPT 3,你可以通过……嗯,问我的聊天机器人——例如用“我如何获得 GPT-3 的 API 密匙?”
www.lucianoabriata.com我写作并拍摄我广泛兴趣范围内的一切事物:自然、科学、技术、编程等等。 成为媒介会员 访问其所有故事(我免费获得小额收入的*台的附属链接)和 订阅获取我的新故事 通过电子邮件 。到 咨询关于小职位 查看我的 服务页面这里 。你可以 这里联系我 。
基于网络的数据库聊天机器人项目—模块 1:*似字符串匹配
一个跨越 web 编程、数学、人工智能等的项目。
我一直对聊天机器人很着迷,从十几岁开始,我就在学习编程的同时创建了数十个聊天机器人。然而,我从来没有让我的聊天机器人实现任何目标,所以我唯一的动机是好奇,我的机器人仅限于参与非常有限的聊天。当然,我会迅速放下每个项目。
但是现在,随着我的主要工作、副业和业余爱好在网上的专业存在,我有机会创建一个有目的的聊天机器人:回答我网站访问者的问题,并引导他们浏览网站。JavaScript 编程的强大功能让我可以很容易地做到这一点。此外,我可以给我的聊天机器人提供两种回复机制:一种是基于问答对的大型数据集,由*似的字符串匹配函数辅助;另一个基于 GPT-3 的基于问题的微调。在本文中,我将讨论第一种途径,它利用问答对和停用词的开放数据集,以及量化一对字符串的相似性的过程。GPT-3 轨道将在未来的文章中出现,对于摆脱封闭问答数据库的限制非常重要,所以请保持关注!
当访问者访问我的网站时,他们可以打开聊天机器人,从它那里获得关于网站内容、我的工作、我的爱好等方面的帮助。(检查文本和其他图形,查看聊天机器人的运行情况)。该机器人的核心包含两个部分:一个基于对问答对数据库的直接查询,从一个开放的数据库中构建;另一个基于 GPT3 驱动的答案生成,由特定问题的少量学习指导。在本文中,我将介绍前者,它通过字符串比较函数对查询使用精确或部分问题匹配。在以后的文章中,我将展示基于 GPT-3 的模块。这个和所有其他的数字都是作者卢西亚诺·阿布利亚塔制作的。
介绍
正如你在上面的总结中看到的,我一直对聊天机器人很感兴趣。原来,我现在刚刚建立了(实际上我每天都在扩展)一个完整的聊天机器人,全部基于网络,在我网站的不同页面弹出,引导访问者并回答他们的问题。我将这个聊天机器人作为一个 HTML/JS 组件编写,所以只需一个脚本标签,我就可以轻松地将它集成到任何页面中。通过使用浏览器的本地存储功能,我的聊天机器人可以在用户打开我网站的多个页面时保持流畅的对话,即使在不同的标签页或窗口中。通过使用 CSS,聊天机器人可以很容易地适应智能手机或电脑屏幕。我让聊天机器人将对话写入我网站上的一个文件,然后我可以检查这个文件,了解访问者通常会问什么,他们通常会从核心知识数据库中产生什么偏差,这样我就可以相应地改进聊天机器人。
但是我会在以后的文章中讨论它的设计和特性。在这里,我想描述它的主要模块的第一部分,该模块允许机器人直接回答我的访问者的问题,并通过*似的字符串匹配从数据库中提取一些基本的聊天。在接下来的一篇文章中,我将描述聊天机器人的第二条轨道,它通过将知识库与 GPT-3 的文本生成相结合,极大地扩展了它的功能。
回答知识库中的问题,允许输入错误和可变措辞——这要归功于字符串比较算法
有许多方法可以对聊天机器人进行分类,但一个非常重要的区别是它们是否只提供从数据库中逐字逐句提取的答案,或者它们实际上可以编造文本作为对问题的合理回答。后者从编程的角度来看更具挑战性,需要某种形式的高端自然语言处理协议来将问题转化为合理的答案。这种基于人工智能的方法的主要优点是,如果做得好,它是非常通用的,可以为许多不同方式提出的问题提供正确的答案;此外,它将天生容忍打字错误和语法错误。但是建立这样的人工智能程序并不容易;最重要的是,您总是冒着风险,机器人可能会编写包含不正确信息甚至不适当内容、敏感信息或不可读文本的文本。高端自然语言处理程序,如 GPT-3 可以是一个很好的解决方案,但即使这些程序也可能会产生错误或不适当的内容。
我将很快进入我的聊天机器人的 GPT-3 模块,而在这里我将开发通过问题/答案匹配工作的模块。如果你非常好奇,迫不及待地想看我描述该机器人的 GPT-3 模块的文章,让我在这里与你分享我写的一些关于 GPT-3 的文章,你会发现一些消极和积极的观点,加上相当多的代码和说明,让你用这项技术进行自己的测试:
请相信,我会很快回到 GPT 3 号,因为它为我网站的聊天机器人大脑的第二个轨道供电。
我网站聊天机器人的问答模块
这里有一张我的聊天机器人的截图,它使用它的问题/答案匹配轨道与一个碰巧想听笑话的人类用户聊天:
聊天机器人从它的知识库中讲笑话。
让我们看看这个问题/答案匹配模块是如何工作的,它可以替代复杂的人工智能模型,因为它只回答数据库中的编码,所以更安全。本质上,这包括“简单地”在问题和答案的数据库中搜索人类的输入,然后提供相应的预编译答案。如果数据库足够大,并且人类被警告机器人的代码仅限于某些主题,则总体体验可能足够好,至少在其预期用途内。
不过,有几个要点需要处理:
- 一个“足够大”的问答配对数据库并不容易获得,至少你不能确定它的内容。
- 人类可能会出现错别字和书写错误,所以聊天机器人应该能够容忍它们。
- 即使没有任何错误,人类也可以(并且很可能)以不同于数据集中编码的方式提问。聊天机器人也应该考虑到这一点。
数据库问题的解决并不容易。正如我在下面详述的,对于我的聊天机器人,我从微软的 GitHub 账户中获取了一个开源(麻省理工学院许可)的问答对数据库,并用关于我和我工作的项目的具体内容对其进行了扩展——因为这就是聊天机器人应该回答的问题。同时,由打字错误、错误和输入可变性引入的困难可以通过搜索数据库而不是精确的问题,而是类似于数据库中每个条目的问题来解决。这需要使用字符串比较标准,而不是完全匹配,并且在进行搜索之前要对输入进行一些清理。
这几点我们一个一个来看。
1.清理人类输入
我在我的聊天机器人中编写了一个功能,可以清理人类输入的不同方面。根据参数的不同,该函数将扩展缩写、删除符号、删除多种形式的数字或删除停用词。请注意,这意味着数据库最好不要有任何符号、数字信息或缩写,因为它们会降低搜索的匹配分数。例如,数据库中“网站”的所有实例都扩展为“网站是”。
清理中涉及的操作看起来微不足道,但同样受到数据库可用性的限制,例如停用词。我从一些资源中编译了一个相当长的列表,你现在可以借用一下——但是请承认我,就像我的代码承认我的来源一样!
这是完整的函数,包括停用词、符号等列表。:http://Lucia noabriata . alter vista . org/chatbotallweb/cleaning function . txt
请注意,在调用该函数时,可以选择要清理的内容。我的代码的某些部分要求完全清除,而其他部分要求清除符号和数字,但不清除停用词。此外,我的代码还在为知识库创建搜索查询之前清除了其他潜在的问题来源。例如,它将“他”、“他”和“他的”替换为“卢西亚诺”——因为我假设任何人向我网站的机器人询问第三人是指我,它在数据库中是这样编码的。当然,如果访问者实际上是在询问另一个人,这将无法正常工作…无论如何,数据库在它的答案中到处都有“Luciano ”,所以很明显答案指的是我自己,即使这个人可能在想别人。同样,清理过程的一部分是将所有输入转换成小写,并将数据库的所有问题也转换成小写(同时所有答案都正确地大写)。此外,所有的输入和问题都被完全删除了。
2.问答配对数据库
对于我的聊天机器人,我采用了微软聊天机器人的个性聊天数据库的英文版本,并开始添加关于我和我所从事的项目的具体内容。为什么?嗯,因为我的机器人的全部目的是引导我的网站的访问者,并回答他们关于我和我的项目的问题——当然,微软对我和我的项目一无所知!。事实上,当访问者登陆我的网站时,聊天机器人已经解释说,它的知识非常有限,只能谈论某些话题(我手动输入到数据库中)和基本的聊天(来自微软的数据库加上一些自定义的添加和编辑)。
这是我用的微软的数据库。如您所见,支持不同的语言和个性风格:
https://github.com/microsoft/botframework-cli/tree/main/packages/qnamaker/docs/qnaFormat
我实际上改变了这个文件的形状,在同一行中有问答对,这使得添加更多条目更加容易。对于许多问题,我会给出多个可能的答案,这样当访问者重复一个问题或问两个非常相似的问题时,机器人不会总是重复自己。
这是知识库中的一个示例条目:
hello||good morning||good evening||good night||whats up||wasup||whasup##***##***##Hello, all good?||Hi there, how are doing?
该行由#分隔符分隔成 4 个字段:第一个字段包含所有可能的提问方式(这里只是一些问好方式,另一行还有更多),由||。最后一个字段是可能答案的列表,也是用||,这里是两个不同的选项。
第二个字段包含一种“免责声明”,如果聊天机器人在给出可能的答案之前只找到其中一个问题的部分匹配,它将使用这种声明来产生更自然的对话。比如用户问“你叫什么名字?“带点错别字,然后机器人会回答“问我名字?”后面跟着一个预设的答案。请注意,我对我的机器人编码的方式,如果打字错误非常小,这将不会触发。例如,在这里我先问了一个错别字(结果是一个直接的答案),然后问了多个错别字(答案前面有一个小小的否认句子):
当与数据库中的问题不匹配时使用的“免责声明”句子的示例(但不为空,在这种情况下,机器人只会说它没有得到所要求的内容)。
第三个字段保留代表问答对的主要主题的关键字,有助于在对话中至少保持一些最小的上下文。例如,在这里,人类询问关于 moleculARweb(我和一个同事一起开发的网站)的问题,然后询问关于用“它”指代它的另一个问题……聊天机器人明白了:
聊天机器人记住了谈话的主题。
3.搜索数据库
当然,搜索问题的最快选择是简单地将人工输入的文本与每一行中列出的每一个可能的输入进行匹配。聊天机器人做的第一件事就是这个。如果找到匹配,代码会随机选择一个列出的答案并显示出来。试着问我的聊天机器人一些笑话:
我网站上的聊天机器人在讲笑话。通过使用随机数并保存其最后的输出,它不会重复自己太多。
聊天机器人还通过从所有停用词中清除人类的输入和所有可能的输入来进行这种完美匹配搜索。同样,如果有一个完美的匹配,它会显示列表中的一个答案。但在此之前,聊天机器人试图在数据库中找到人类键入的问题,这一次允许打字错误、语法错误,甚至交换单词。为此,它使用了两个测量字符串相似性的函数:
Jaro-Wrinkler 距离,测量两个序列之间的编辑距离,即从一个序列转换到另一个序列所需的最少操作次数。范围从 0 到 1,1 表示完全匹配。参见这里的维基百科条目。这里是 Jaro 和 Wrinker 的原创论文。
文本余弦相似度,它测量两个字符串之间每个单词出现的次数,作为由来自两个字符串的所有 n 单词的所有频率组成的 n 维向量形成的角度的余弦。它的范围也是从 0 到 1,1 表示完全匹配。这是更一般的余弦相似性的一个具体应用,关于这一点,你可以在 Ben Chamblee 在 TDS 的这篇非常好的文章中读到。
请注意,通过构造,Jaro-Wrinkler 距离将对拼写错误和不同拼写高度相似的字符串对进行评分。比如说超和苏特或造型和造型。另一方面,文本余弦相似度会给有拼写错误的单词打分,因为每个单词在计算频率时都会被计为不同的单词。但相反,与 Jaro-Wrinkler 距离不同,文本余弦相似性度量将对由不同顺序的相同单词组成的句子对评分为完全匹配。因此,显然这两种类型的字符串相似性度量是非常互补的。这就是为什么我在我的聊天机器人中整合了两者,并假设当两个分数中的任何一个超过阈值时匹配。
Jaro-Wrinkler 和文本余弦相似性度量是完全互补的,所以我让我的聊天机器人选择同时使用这两种度量。如果它们中的任何一个高于相似性阈值,则它被视为用户键入的(或者可能想要键入的)实际输入。
阈值实际上有两个级别:当用户的文本和知识库中的一个问题之间的相似度高于 0.95 时,它被视为完全匹配,因此知识库中的答案会立即给出。如果分数在 0.88 和 0.95 之间,程序给出相同的答案,但前面有一个类似“的可变句子,你是指这个吗?”。如果分数在 0.8 到 0.88 之间,聊天机器人会澄清它对该问题不确定,然后是来自该基地的候选问题及其相应的答案。
但是如何准确地计算出 Jaro-Wrinkler 和文本余弦的相似性呢?
我从苏曼·库瓦尔的这篇优秀文章中提取了这些函数,这篇文章已经用 JavaScript 提供了它们:
https://sumn2u.medium.com/string-similarity-comparision-in-js-with-examples-4bae35f13968
事实上,本文描述了 4 个字符串比较函数(并给出了代码)。但是由于上面给出的原因,我只选择了 Jaro-Wrinkler 和文本余弦。事实证明,它们对我来说效果很好——尽管不,它们不是绝对正确的。
最后一点,重要的是输入和所有可能的问题都是小写的,修剪,并清除所有符号和数字。但不包括停用词,停用词通常有助于确定句子的整体意思。
想和我的聊天机器人聊天吗?
你可以试试我的聊天机器人:
http://lucianabriata . alter vista . org/chatbotallweb/chatbottest . html
如果你提供一个 GPT3 API 密匙(你可以在这里免费获得)你就可以使用机器人更高级的模块;但这仍在开发中(当它完全可用时,我会发表一篇文章)。
Would you like to order a personalized chatbot? Or have a job for me about protein modeling, bioinformatics, protein design, molecular modeling, or protein biotechnology? [Contact me here](https://lucianoabriata.altervista.org/office/contact.html)![***www.lucianoabriata.com***](https://www.lucianoabriata.com/) *I write and photoshoot about everything that lies in my broad sphere of interests: nature, science, technology, programming, etc.* [***Become a Medium member***](https://lucianosphere.medium.com/membership) *to access all its stories (affiliate links of the platform for which I get small revenues without cost to you) and* [***subscribe to get my new stories***](https://lucianosphere.medium.com/subscribe) ***by email****. To* ***consult about small jobs*** *check my* [***services page here***](https://lucianoabriata.altervista.org/services/index.html)*. You can* [***contact me here***](https://lucianoabriata.altervista.org/office/contact.html)***.***
一位数据科学家的 Web 开发笔记
原文:https://towardsdatascience.com/web-development-notes-from-a-data-scientist-95e4794fb4ab
React 和 TypeScript +前端环境设置的声音片段
照片由 Sourabh Panari 在 Unsplash 上拍摄
谁应该读这个?
- 我自己:我 2022 年的职业目标之一是成为更好的 T 型数据科学家。例如,我的“T”的深度代表数据科学和机器学习领域知识,尤其是推荐系统和自然语言处理(NLP)以及 Bandit 相关的进步。我的“T”的宽度代表了个性化从后端到前端将触及的所有领域。在过去的 6 个月里,我觉得我已经开始很好地掌握了如何将我的数据科学代码插入到 Django 和 GraphQL API 中。所以今年,我很想了解 GraphQL API 是如何插入我们的服务前端的。
我的 2022 目标:作者图片
- 任何想要学习 web 开发基础知识以更好地理解前端工作流的数据科学家。
包括什么?
以下是我从我杰出的同事 Nic 那里得到的笔记,他不仅是一名优秀的前端开发人员,还是 React、NextJS 和 web 开发的优秀教师!有四个部分:
- 核心前端技术*台的广告词
- 关于前端开发环境设置的分步指南
- 关键文件结构演练
- 小贴士:如何在 Chrome + material ui 中激活 DevTools
🎵核心前端技术*台的广告词
核心前端技术*台:创建-反应-应用(CRA) +打字稿
当我开始从 Nic 学习 web 开发时,他说我要做的第一选择是选择 next . js VS Create-React-App(CRA)。你可能会问一个自然的问题——它们是什么,有什么区别?
它们是什么?
- Next.js 和 Create-React-App 都是面向前端开发者的 web 开发框架。从数据科学打个比方,类似于我们把 Keras 和 PyTorch 作为深度学习框架。从后端打个比方,我们有 Flask 和 Django 作为后端开发人员的基于 python 的 web 开发框架
对于数据科学家来说,它们有多大的不同?
- 由于我的主要目的是了解数据科学 API 如何与前端代码连接,并且我不打算在短期内成为前端开发人员,所以对我来说,不同之处在于 Next.js 需要更多的设置,而 Create-React-App 只需要最少的设置。
- 因此,我选择 Create-React-App 作为第一个选项的答案。
第二个选择是在类型脚本和 JavaScript 之间进行选择。实际上,我不需要做出选择,我只需要遵循——Nic 强烈建议将 TypeScript 视为最佳实践或现代 JavaScript。
- 什么是 TypeScript?
-是 JavaScript 的超集,语法和 JavaScript 几乎一样。 - 为什么更好?
- JavaScript 允许你对不同类型的数据使用相同的对象,这使得调试变得困难。只有当应用程序已经部署到生产环境中时,您才可能注意到问题。而 TypeScripts 具有可选的静态类型和类型推断,增加了更多的限制以实现更好的健壮性。
我的第三个问题是关于我经常听到的两个术语:React NativeVSReact
- 所以 Next.js 和 Create-React-App 都是基于 React ,这是一个用于构建用户界面(UI)的 JavaScript 库。React 用于 web 开发,意思是工作是为了开发网站。
- React Native 是一个工具,它可以让你编写相同的 JavaScript 或 TypeScript 代码,并为移动应用程序开发它们。例如,通常情况下,Android 应用程序用 Java 编写,ios 应用程序用 swift 编写。如果你在网站、Android 手机和 iPhones 上开发你的服务,你需要写三套完全不同的代码。React Native 允许您捆绑为网站开发的相同类型的脚本代码,并将其部署到 Android 和 ios 移动应用程序。
Nic 还提到前端开发有三大支柱:HTML、CSS、JavaScript (TypeScript)。由于我的目标是理解数据科学模型(包装在 API 中)如何在前端使用的逻辑,我们将较少关注 HTML 和 CSS,而主要关注 TypeScript 部分。
👣关于前端开发环境设置的分步指南
第一步:我们需要安装软件包node
和yarn
。
什么是 **yarn**
?
——是一个包经理。就像数据科学一样,我们有 python 包管理器pip
和conda
。这里我们有npm
和yarn
。他们都从npm
仓库下载包。默认情况下,Yarn 生成yarn.lock
来锁定包的依赖版本。它的主要优点是,它有助于避免与 node.js 系统模块的不同版本相关的任何可能的问题,项目将安装在这些模块上。
(下面的安装代码在 MacBook 的终端上运行)
# 1\. install node
$ brew install node# Check your node version
$ node --version# 2\. install yarn
$ brew install yarn
提示:如果你需要使用不同版本的 Node.js(就像有时候在 DS 中我们有不同版本的 python 代码),你可以安装n
来管理 Node.js 版本
# if you already have Node.js installed
$ npm install -g n# check node.js version
$ n lts
步骤 2:创建一个项目本地或 Github。在 local 中,您可以选择在 Pycharm 中创建一个 React 项目。如果你希望你的项目是协作性的,你也可以先在 Github 中创建一个项目,然后运行git clone your-project
到你想要的项目文件夹。
步骤 3:使用下面的命令创建一个 typescript react-app 项目
$ yarn create react-app discovery-client --template typescript
🗝密钥文件结构演练
一旦你在 Pycharm 中打开你的第一个 react 应用项目,你会注意到你有很多很多的文件,尤其是在node_modules
中。所以强烈推荐将node_modules
添加到你的.gitignore
中,这样可以保持更新的整洁和可读性。
由于我的目标是构建一个推荐器前端,称为discovery-client
,下面是我的项目文件夹的样子:
生成文件结构的一个快速提示是使用tree
命令。例如,下面是src
文件夹中的内容:
这引出了一个我长久以来一直思考的问题。我知道最好的做法是将所有代码放在src
下,即使是我们的数据科学代码,我的经理也建议这样做。但是为什么呢?
——因为src
是生产部署的切入点。生产系统通常是云托管的解决方案,并且src
允许生产系统指向目录。生产系统就是这样找到所有代码并执行正确路径的。
Nic 提出的三个关键文件可能最值得数据科学家关注:
public/index.html
:这将为浏览器呈现应用组件src/index.tsx
:这将为本地桌面环境呈现应用程序组件src/App.tsx
:这是我们应用程序中的主要组件,我们可以使用 TypeScript 编写 React 代码。
🌠小贴士:如何在 Chrome + material ui 中激活 DevTools
- 如何在 Chrome
option + cmd + J
中启用开发工具——例如,当我在 Medium 中输入时,我可以看到以下元素
作者图片
2.Material ui
——数据科学类比中最好的思考方式是,我们有 sklearn,我们可以轻松重用随机搜索和网格搜索,而无需从头编写代码。构建 UI 组件也是如此。这是一个包括许多预建的 UI 组件的库,允许你重复使用和节省你的时间!
摘要
- 作为一名数据科学家,如果你想了解你的代码如何从后端到前端,从高层次上了解前端和 web 开发如何工作是有益的。我在这里的目标是帮助我自己和其他数据科学家最大限度地了解前端的逻辑和工作流。
- 在我的公司,我们使用 React for web 和 React Native for mobile。在您的组织中可能会有所不同。我发现从你的前端开发同事那里学习它们比通过一门课程学习更有益,因为他们可以很容易地为数据科学和机器学习量身定制最重要的课程。
- 最后但同样重要的是,永远学习和发展,享受旅程!
网站访客预测与脸书先知:完整教程
安装说明、数据、参数调整以及简单和复杂的预测—第 2 部分
卢克·房龙在 Unsplash 上的照片
这是教程的第 2 部分——用脸书预言家 2022 的所有教程进行网站访客预测(安装说明、数据、参数调整,以及简单的&复杂预测)。
原文封面,
但是,原文太长了。因此它现在被分成两部分——前 3 节在第 1 部分中,而第 4 节和第 5 节在第 2 部分中。如果您对安装和简单预测不感兴趣,请点击此处进入第 2 部分。
4.利用模态评估进行预测
评估模型的准确性对于创建机器学习模型来描述模型在预测中的表现至关重要。幸运的是,当评估我们的先知在预测中的表现时,我们可以采用一些常见而简单的评估标准。
* MAE(*均绝对误差)
- 对数据集上原始值(y)和预测值(yhat)之间的绝对差值求*均值。越小越好。
* MSE(均方误差)
- 对数据集上的原始值(y)和预测值(yhat)之间的*方差进行*均。这对于具有异常值的数据集来说是很好的,这将会受到这个度量的严重惩罚。同样,该值越小,模型越好。
* RMSE(均方根误差)
- 就是取 MSE 的*方根。
* R *方(决定系数)
- 模型解释被研究对象的程度的系数。它的值从 0 到 1。越大越好。
def evaluate(y_true, y_pred):dict = {‘MAE’: mean_absolute_error(y_true, y_pred),‘MSE’: mean_squared_error(y_true, y_pred),‘RMSE’: sqrt(mean_squared_error(y_true, y_pred)),‘R2’: r2_score(y_true, y_pred)}return dict
在我们的分析中,我们将只关注 MAE 和 R *方。但是我仍然会在代码中包含 MSE 和 RMSE。
我首先将数据集分成 2 份,一份用于训练和测试。
test_len_assess = 8train_df_assess = train_test_df_assess.iloc[:-test_len_assess, :]test_df_assess = train_test_df_assess.iloc[int(-test_len_assess):, :]
8 这个数字不是随机的。之前有读者问,为什么是 8 号?它是数据集的最后 10%除以 2。它是为了匹配本教程调优部分的数据集。
现在让我们预测和评估我们的模型。
m = Prophet(interval_width=0.95, weekly_seasonality=False, daily_seasonality=False)m.add_country_holidays(country_name=’DE’)
m.fit(train_df_assess)predict_df_assess = m.predict(test_df_assess)evaluate(test_df_assess[‘y’], predict_df_assess[‘yhat’])
predict _ df _ assess 数据框架中有许多列。它们都是有意义的,但是超出了本教程的范围。我会解释更多,如果我有另一篇文章。请在 Medium 上关注我,了解我的最新数据科学文章。你的追随和喜欢是我坚持写作的巨大动力。
在本教程中,我们将只关注数据框最后一列中的 yhat。没有科学的评估,Prophet 的默认参数模型总是看起来很好。现在我们可以看到它有 60%的解释力。
其余仅为 0.6。一点也不令人印象深刻。作者图片
将我们的结果和预测部分可视化。
plot_measure = m.plot(predict_df_assess)
蓝色部分是这个未经调整的脸书先知模型的测试部分。作者图片
让我们用这个评估模型来预测未来。
future_assess_input = m.make_future_dataframe(periods=60,freq=’W’)future_assess_output = m.predict(future_assess_input)plot_assess = m.plot(future_assess_output)
你可以看到这个模型在训练时少了八行;这就是为什么预测与上一节中的简单预测模型略有不同,后者多了八行。
作者图片
5.使用 Optuna 优化
Optuna 是一个自动超参数优化软件框架,主要用于机器学习。Optuna 的用户可以很容易地动态构造超参数的搜索空间。
我仍然不是这个图书馆的专家。如需了解更多信息,请点击此处:(https://optuna . readthe docs . io/en/stable/index . html)
在深入参数调优之前,让我们先深入了解一下参数。
Prophet 模型有几个可以考虑调整的输入参数。一开始,这些参数有点让人不知所措。但是,盲调并不理想。因此,需要事先了解参数。这里有一些关于超参数调优的一般性建议,可能是一个很好的起点。
- 变化点
变化点是趋势发生变化的点。默认情况下, n_changepoints ,代表“变化点数量”,有 25 个变化点。 changepoint_prior_scale 控制变化的幅度。如果发现趋势变化过拟合(弹性过大),可以加大;或者如果它不合适(没有足够的灵活性),则减小它。默认值为 0.05。
通常不建议你调优 n_changepoints 。根据我的经验,调整季节性 _ 先验 _ 规模可能会更有效。
- 改变点 _ 范围
这基本上是当 Prophet 设置 change_point 时将考虑多少数据。默认值为 0.8,这意味着只对时间序列的前 80%推断变点,以便有足够的时间预测未来趋势,并避免时间序列结束时的过度拟合波动。我的经验是,0.8 左右的数字,例如 0.82、0.70,就能很好地完成工作。
- 成长
这是一个非常棘手的参数。选项有“线性”和“逻辑”。我建议,只有当你知道你的数据将在你的预测期内饱和时,才把它改为逻辑。如果不是,保持简单,保持线性。因为 Prophet 会尽最大努力让你的未来预测在包含期内朝着这个饱和点移动。
如果您非常清楚您的数据正在达到这个饱和点,例如,您确定在未来几个月您的网站将有 1000 个访问者,您可以在此处选择逻辑并在您的数据框中包括“上限”和“下限”值。
- 季节性 _ 模式
选项有['加法','乘法']。默认为‘相加’,但很多业务时间序列会有相乘的季节性。最好通过观察时间序列来确定这一点,看看季节性波动的幅度是否随着时间序列的幅度而增长。我的经验是,默认的添加剂大多数时候符合我的需要。
- 季节性 _ 先验 _ 规模
该参数控制季节性的灵活性。类似地,一个显著的值允许季节性适应大的波动;较小的值会缩小季节性的幅度。默认值为 10。合理的调整范围可能是[0.01,10]。
- 节假日 _ 事前 _ 规模
这控制了适应假日效果的灵活性。类似于季节性 _ 先验 _ 规模,默认为 10。合理的调整范围可能是[0.01,10]。
- 每年 _ 季节性
默认情况下,它是“自动”。“真”将打开年度季节性,否则为“假”。选项有['自动',真,假]。
因为我们有每周数据,没有每天或每小时的数据,所以我们不会应用每周季节性和每天季节性参数。
如上所述,我们将从主数据集中分离出一个数据框,尤其是用于验证的数据框。
test_len_tun = int(train_test_df_tun.shape[0] / 10) # take only 1/10 as the test sizetrain_df_tun = train_test_df_tun.iloc[:-test_len_tun, :]val_df_tun = train_test_df_tun.iloc[-test_len_tun:int(-test_len_tun/2), :] # within the test pool, the first half is taken for validationtest_df_tun = train_test_df_tun.iloc[int(-test_len_tun/2):, :] # only the final half of the test pool is for the test
然后我们创建一个名为 find_params 的函数,用 Optuna 库寻找最佳参数。
def find_params(trial):parameters = {‘changepoint_prior_scale’: trial.suggest_float(‘changepoint_prior_scale’, 0.005, 5),‘changepoint_range’: trial.suggest_float(‘changepoint_range’, 0.1, 0.9),‘seasonality_mode’: trial.suggest_categorical(‘seasonality_mode’, [‘multiplicative’, ‘additive’]),‘seasonality_prior_scale’: trial.suggest_float(‘seasonality_prior_scale’, 0.1, 10),‘yearly_seasonality’: trial.suggest_int(‘yearly_seasonality’, 1, 50),‘holidays_prior_scale’: trial.suggest_float(‘holidays_prior_scale’, 0.1, 10)}m = Prophet(**parameters, # ** means unpackinterval_width=0.95,weekly_seasonality=False,daily_seasonality=False)m.add_country_holidays(country_name=’DE’)m.fit(train_df_tun)validation = m.predict(val_df_tun)mae_for_optuna = mean_absolute_error(val_df_tun[‘y’], validation[‘yhat’])return mae_for_optuna
然后我们通过 study.best_params 应用该函数。我们将在这一步中指定试验的次数。我建议至少 1000。在我们的 Jupyter 笔记本中,你会发现我的一些其他试验,包括一些只有 500 次试验。
study = optuna.create_study(direction=’minimize’)study.optimize(find_params, n_trials=1000) #1000study.best_params
在搜索过程中,您可以在打印输出中找到单个结果。下面圈起来的数字是试用号。第一个下划线是试验的 MAE,越低越好。最后一个带下划线的是存储在进程中的最佳结果。
等待 2-3 小时后,搜索完成,找到最佳参数。作者图片
经过 2-3 个小时的等待时间,搜索完成,结果如下。
para = {‘changepoint_prior_scale’: 1.9804273036896098,‘changepoint_range’: 0.6543491388579227,‘seasonality_mode’: ‘multiplicative’,‘seasonality_prior_scale’: 4.465868155817663,‘yearly_seasonality’: 18,‘holidays_prior_scale’: 2.650571507054187}
现在,我们再次使用匹配长度的数据帧,用找到的最佳参数来训练我们的模型。
train_df_tun2 = pd.concat([train_df_tun, val_df_tun])m = Prophet(**para,interval_width=0.95,weekly_seasonality=False,daily_seasonality=False)m.add_country_holidays(country_name=’DE’)m.fit(train_df_tun2)# Then we test our newly trained model with the test df.predict_df_tun = m.predict(test_df_tun)evaluate(test_df_tun[‘y’], predict_df_tun[‘yhat’])
{ '梅':18960.888888888617
' MSE ':78969 . 18678678671
RMSE:19967.888686868616
R2': 0.7987997251205757}
r 说明我们新训练的先知模型有 80%的解释力。一点都不差!比之前未调模型的 60%好多了。令人印象深刻的是 32%的车型改进。
蓝色部分是这个调整后的脸书先知模型的测试部分。作者图片
让我们创建最终的数据框架,并将其可视化。
future_optuna_df = m.make_future_dataframe(periods=60,freq=’W’)predict_optuna2 = m.predict(future_optuna_df)predict_optuna2.columnsforecast_final = predict_optuna2[[‘ds’, ‘trend’,’yhat’]]forecast_fig_final = px.line(forecast_final, x=”ds”, y=”yhat”, title=’The number of unique visitors of [www.lorentzyeung.com](http://www.lorentzyeung.com) forecast one year into the future.’)fig_final.show()
恭喜你,你的先知和最好的参数已经完成了。作者图片
结论
恭喜你!您刚刚学习了如何使用 Prophet 进行即时设置和优化预测。通过参数指定,可以在不过度拟合的情况下显著改进模型。在我们的案例中,我们将模型改进了 32%。它可能会更高,但我现在会停止。
感谢您的阅读。如果你喜欢这个教程,请分享给你的数据科学朋友,并关注我。以下是我继续为社区做贡献的动力。
如果你好奇或者想知道我在的文章第一部分中做了什么,请点击这里进入第一部分。
参考:
https://facebook.github.io/prophet/
您可能还喜欢:
时序数据的每周汇总
原文:https://towardsdatascience.com/weekly-aggregation-of-time-series-data-f9bdcc495a58
现代数据堆栈中的聚合
詹姆斯·a·莫尔纳尔在 Unsplash 上拍摄的照片
最常见的特征工程任务之一是将多个记录聚合成单个记录。这可以是每个客户汇总到一个记录中的客户交易。这些类型的聚合通常具有类似时间序列的特征。例如,通常只需要汇总某个日期或交易之前的交易,而不是汇总所有客户交易。或者,只需要合并给定交易之前特定时间段内的交易。其他聚合发生在时间以外的维度上。这些可以是患有某种疾病的所有患者的聚合生物特征、所有欺诈交易的交易细节等。
在本文中,我们将关注使用 Python 和使用开源包 RasgoQL 的现代数据堆栈来聚合数据。特别是,我们将创建底层数据的每周汇总。
熊猫的聚集
在熊猫中,可以通过调用aggregate
(或者agg
作为别名来进行聚合。agg
的参数可以是函数(max)、包含函数名的字符串(' max ')、函数或函数名的列表([max,' mean ')、标签(通常是列名)和函数、函数名或列表的字典:
df.agg({'column_A': max,
'column_B': np.sum,
'column_C': [max, 'mean', np.sum]})
聚合通常不直接应用于数据帧,而是应用于组。大多数情况下,这些组是通过调用groupby
创建的
group = df.groupby(by=['column_A'])
接着是给agg
的一个电话。
时间窗口内的聚合
在这种情况下,为了在一个时间窗口内进行聚合,使用函数resample
而不是groupby
。为了使用resample
,数据帧的索引需要是日期或时间。使用set_index
将索引设置为日期。
df.set_index('DATE', inplace=True)
然后创建每周小组
weekly_group = df.resample('7D')
最后,调用agg
将特性汇总到每周级别
weekly_df = weekly_group.agg({'COLUMN_A': ['min', 'max'],
'COLUMN_B': ['mean', 'sum']})
这种方法在数据适合内存的单台机器上运行良好。然而,这通常需要重写以在生产环境中工作,或者创建一个公司其他人可以利用的共享版本。
使用 RasgoQL 聚合
利用 RasgoQL 将允许数据科学家从他们的笔记本或计算机创建相同的每周聚合,但将利用现代数据堆栈的能力直接在云数据仓库上创建这些功能。与 pandas 不同,我们需要创建想要分组的要素,而不是重新采样到每周级别。在这种情况下,日期需要转换成周变量。这可以通过datetrunc
转换将日期截断为星期来完成。
dataset.datetrunc(dates={'DATE': 'week'})
这创建了一个新变量 DATE_WEEK 。为了更清楚,使用rename
转换将这个新变量重命名为 WEEK 。
dataset.datetrunc(dates={'DATE': 'week'}).rename(
renames={'DATE_WEEK': 'WEEK})
现在,应用与 pandas agg
函数中使用的相同字典的aggregate
转换,将把数据聚集到每周级别,就像对 pandas 所做的那样。
dataset.datetrunc(dates={'DATE': 'week'}).rename(
renames={'DATE_WEEK': 'WEEK}).aggregate(
aggregations={'COLUMN_A': ['min', 'max'],
'COLUMN_B': ['mean', 'sum']})
这个转换的结果可以通过调用save
函数发布回云数据仓库。
wkds = dataset.datetrunc(dates={'DATE': 'week'}).rename(
renames={'DATE_WEEK': 'WEEK}).aggregate(
aggregations={'COLUMN_A': ['min', 'max'],
'COLUMN_B': ['mean', 'sum']})wkds.save(table_name='WEEKLYAGGDATA')
通过调用to_df
,这些数据可以在 Python 中作为 pandas dataframe 获得。
weekly_df = wkds.to_df()
这些数据现在可以用于建模、即席分析或仪表板开发。此外,随着数据仓库中原始数据的更新,RasgoQL 将自动更新这个每周汇总。这意味着在这个项目开发过程中执行的聚合同时在生产环境中进行,并且可以立即用于生产系统。
在我职业生涯的大部分时间里,在用 Python 和 pandas 构建了我的特性之后,我会将代码交给软件工程,他们会在那里对代码进行重构。这个过程花了几个星期,如果不是几个月,完成。我见过模型无法执行的情况,因为当它们被投入生产时,建模数据不再反映当前的生产数据。有了 RasgoQL,我仍然可以使用 Python,但是可以将我的特征工程保存在我的数据库中,并且拥有软件工程可以更容易实现的 dbt 模型。这可以在部署模型之前节省几个月的开发工作。
如果你想查看 RasgoQL,可以在这里找到文档,在这里找到存储库。
抽象画家是第一个编码器吗?
原文:https://towardsdatascience.com/were-abstract-painters-the-first-encoders-49aa1e04ffd5
用最少的形状和颜色捕捉现实的旅程
宇宙的抽象?[Victory Boogie Woogie,1942–1944,Piet Mondriaan,图片来自维基百科
编码可以被看作是从现实中抽象出最显著模式的艺术。这样的抽象对于一般化是不可或缺的。例如,考虑一下教科书中的例子,在图片中识别猫。一个训练有素的神经网络应该能够在以前看不到的图像中发现猫。这只有在网络能够推断其训练观察值的情况下才是可能的。
在头罩下,网络提取诸如耳朵的形状、身体的长度等特征。它将猫简化为一系列形状和属性,这也可以用来在新照片中识别毛茸茸的猫科动物。换句话说,网络保存了足够的信息来概括猫的概念,而忽略了所有模糊的细节和变化。
机器学习通常需要将现实世界的观察结果编码成抽象的表示,随后可能被人类或算法解码[图片来自 Miguel Discart 来自 Flickr
虽然艺术和机器学习在表面上几乎没有什么共同点——至少在 Dall E 2 和其他艺术生成器进入人工智能领域之前——但当代数据科学家和古代抽象艺术家似乎有着非常相似的雄心!
介绍
那么这篇文章的主旨是什么呢?坦率地说,这种雄心是相当适度的:
- 有助于直观地了解人工智能算法的功能
- 举例说明人类和机器试图抽象和重建现实之间的一些联系
- 也许会在 ML 从业者中引发一些思考?
免责声明:有很多人比我更了解艺术,所以我不会假装提供对艺术史的全面理解。此外,这篇文章是轶事,而不是任何正式研究的产物,并且只关注 ML 和艺术重叠的地方。为了完整起见,我应该提一下这篇文章关注的是欧洲艺术,回顾了不超过几百年的历史,并强调了两个有点武断的运动。同样,我也不想在解码器和聚类算法的精确描述中陷入太多,因此“机器学习”将被相当松散地解释。
免责声明够多了,我们开始吧。
印象派——放松与现实的联系
许多年来,艺术家们努力实现对世界的真实而准确的再现,将每一个倒影、水滴和皱纹都精确到最小的细节。最终,艺术家们开始偏离这一教条,如印象派运动(由克洛德·莫内和皮埃尔·奥古斯特·雷诺阿等画家领导)所示。
印象派画家的目的不是完美地反映观察结果,而是再现他们对现场观察到的现实的*解释。他们用快速而相对粗糙的笔触捕捉这一瞬间,尤其是变幻无常的光线。下面的室外场景仍然很容易识别,但使用了更少的信息来传输真实世界的图像。*
莫奈的《巴黎春天百货》(1886)。虽然主题仍然清晰可见,但使用了相对粗糙的笔触,并省略了许多细节。[图片来自维基媒体作者]
用机器学习的术语来说——艺术家使用少得多的信息/数据点/特征来表现场景。例如,参见图像分割的链接,这里使用 k-means 算法对相邻像素进行聚类。它创建了由单一颜色表示的更大的形状(即数据点)。用少得多的数据,我们表现了同样的场景,尽管不可避免地损失了粒度。
图像分割示例,通过 k-means 算法进行聚类。尽管大量的细节丢失了,我们可以用更少的数据表现同样的场景
对抽象的追求
让我们继续我们的抽象之旅。 De Stijl (荷兰语为‘风格’)是一个主要由荷兰画家组成的团体,其中皮耶·蒙德里安(Piet Mondriaan)和格里特·里特维尔德(Gerrit Rietveld)可以说是最广为人知的。他们以推动艺术的绝对抽象而闻名。
虽然对一些人来说,他们的艺术可能会引发类似于“我五岁的女儿也能做到这一点”的说法,但每件作品都反映了关于如何用最少的视觉手段来表现世界的深刻批判性思考。颜色——如果有任何关联的话——仅仅是原色的组合,是动态张力的正交线的体现。例如,看看蒙德里安如何思考他的一幅画:
“如果马斯。[阳性]是垂直的。【竖】线,那么一个男人会在一片森林的上升线中认出这个元素;在地*线上。他将看到他的补充。横向的女人。线条作为元素,在大海的横卧线条中看到自己,在垂直线条中看到自己的补充。森林的线条。”— 皮特·蒙德里安,1912 年【蒙德里安,毁灭的艺术】
在我们达到那个抽象层次之前,让我们花一点时间来考虑下面巴特·范德莱克的作品《风暴》。与它可能描绘的真实世界场景相比,它包含的细节非常少。只有最少的信息被传输——一个大的黄色飞机代表海滩,一个蓝色飞机代表大海,一个可以被解释为大浪的形状。由此,我们可以推断出场景——两个女人走在沙滩上,看着外面汹涌的大海。
如果没有描述,你会得到所有的吗?你会认为这是一个海滩吗?你会注意到狂风吗?或者这幅画——在其所有的抽象中——已经失去了太多的信息?
德·斯托姆》(1916)。只有原色和大的形状被用来表现暴风雨的海滩场景。[巴特·范德莱克绘画,克勒勒-米勒博物馆收藏,作者提供图片]
再举个例子?
下面这幅画(也是范德莱克的作品)使用了相当少量的信息。尽管如此,我们仍然可以识别出一个女人、一个孩子和一架飞机,尽管只能识别几何图形。似乎我们只需要很少的信息就能捕捉到世界的本质,尽管你可能会认为场景的意义已经丧失。
《弗鲁遇见弗列格图伊》(1957)。简单的几何形状和原色足以表现一个场景,但留给观众更多的解释。[绘画由巴特·范德莱克绘制,图片由埃丝特·韦斯特维德通过维基媒体
是时候深入抽象了。像机器学习中的许多图像识别器一样,特奥·凡·杜斯堡在工作中完全忽略了颜色,只专注于形状和图案。
下面的研究表明,德·斯蒂格尔并没有盲目地在画布上画一些线条——在最终作品中仍然可以看到最初城市景观的痕迹。如果没有描述标签,我怀疑是否有人能得出这幅画代表了乌得勒支的城市!
合成十二在 zwart en wit (1918)。左:前期研究,代表乌得勒支的观点。右图:最终的抽象[特奥·凡·杜斯堡绘画,图片来自维基百科]
当我们的模型不足以捕捉所有相关模式时,我们会看到这种情况,例如,神经网络的层数或节点数不足,或者线性模型试图捕捉非线性模式。该模型可能捕获输入的一些特征,但是编码的质量不足以正确地重建原始观察。
我们现在来看看蒙德里安的画。没有附随符号,你能推断出它代表什么吗?一个解码器能重建出这部作品的原始灵感吗?
在莱茵作曲(1916-1917)。在这幅蒙德里安画作中,水*线代表海浪,垂直线描绘码头。[皮耶·蒙德里安绘画,图片来自维基媒体
尽管很难被理解为对现实的再现,但“风格派”的成员们仍然追求更多——一种不再代表自然本身的抽象。让我们看看最后一幅画。
Compositie met groot rood vlak,geel,zwart,grijs en blauw (1921 年)Piet Mondriaan 绘画,图片来自维基百科 ]
事情变得越来越模糊,因为艺术家甚至不试图表现自然观察。取而代之的是,这幅画试图代表宇宙的基本组成部分,仅仅依靠头脑。矩形是无中心的、不对称的和动态的,但在某种和谐中共存。原色足以再现我们肉眼可见的全部光谱。无边界的边缘意味着作品无限延伸到画外。整个宇宙的本质,被编码在一张长方形的画布上。
试着解码那个。
结束语
机器学习寻求从现实中减去可概括的模式,去除细节和噪音,直到只保留本质。同样,本文中讨论的抽象艺术家试图剥离自然,直到只剩下核心的真理。
在这两种情况下,问题是我们——无论是人类还是解码算法——是否能够从编码表示中重建原始观察结果。编码在减少维数或所需数据方面非常有效。然而,如果编码被推得太远,重要信息会丢失,并且不再能够被检索。
诸如自动编码器和 PCA 之类的机器学习技术试图通过仅保留其本质来对观察进行编码。问题是我们能在多大程度上重建基于编码的原始观察[图片由 Michela Massi 通过维基百科 ]
由于机器学习算法通常被视为一个黑盒,本文中的视觉抽象可能有助于理解这种算法试图做什么,至少在直觉层面上是如此。艺术家们展示了大量的信息可以从观察中移除,而不会丢失关键的模式。同时,正确的解释越来越依赖于解码器的能力。
下一次你的 ML 算法努力学习任何有用的东西时,你可能会想记住 De Stijl 的艺术家和他们对超越自然世界的追求。也许,你的算法只是在抽象的道路上走得太远了。
喜欢这篇文章吗?你可能也会喜欢以下几个:
**
参考
https://fr.wikipedia.org/wiki/Composition_avec_grand_plan_rouge,_jaune,_noir,_gris_et_bleu https://en.wikipedia.org/wiki/De_Stijl https://en.wikipedia.org/wiki/Impressionism https://en.wikipedia.org/wiki/Image_segmentation **
我们仅仅触及了数据仓库全部潜力的表面
可能感觉我们正处于数据仓库的顶峰。数据团队接*工程团队规模的 50%在一些公司,雪花收入去年增长超过 100%,现代数据堆栈现在是一个常用术语。
我认为我们只是触及了表面。
作者图片
当然,市场研究人员预计数据仓库市场将每年增长 34%,直到 2026 年达到 390 亿美元,但我认为长期潜力要大得多。
数据仓库将是未来公司的控制中心。它将从分析扩展到销售、运营、财务等更多领域的核心。
作者图片
数据仓库将从被认为是商业智能的工具转变为公司所做的一切的核心。以下是我认为它将如何发挥出来(事实上,它已经开始发生)
- 商业智能:数据仓库是用来帮助公司有一个地方来分析他们的数据。
- 运营工具:数据将被发送到所有运营工具,新的内部工具将直接构建在数据仓库之上。
- 销售&营销:随着产品导向型增长的兴起,数据仓库将成为走向市场团队的核心。
- 财务:数据仓库将能够真正为 100%准确的数据工作,财务和会计团队将成为数据仓库的一些最活跃的用户。
- 一切:当所有这些部分汇集在一起时,数据仓库将成为任何现代公司的核心部分。
让我们看看这将如何发生。
数据仓库的五个阶段
1.商业智能—数据仓库主要用于公司仪表板和分析
这是我们仍然主要生活的时代。大多数公司都相信数据的价值(这就是为什么你经常被要求做“快速数据拉动”)。
这恰好也是今天大公司对其数据仓库产品进行品牌宣传的方式
借助快速、简单、安全的大规模云数据仓库,加快洞察速度 — AWS 红移
借助灵活的多云分析解决方案从跨云数据中做出业务决策 — Google BigQuery
这是一个重要的目的,我们仍然有许多未解决的问题。然而,大块的拼图正一点一点地开始就位。没有人比 Benn Stancil 在他的文章现代数据体验中更好地描述了这些问题
“…它试图在明天的董事会前找出增长放缓的原因;当不同的工具和仪表板显示不同的东西时,它让每个人都同意季度收入数字;这是与客户分享产品使用数据,他们告诉你他们的活跃用户列表中不知何故包括了六个月前离开公司的人;这是一封来自首席执行官的愤怒的懈怠邮件,称他们的每日进度报告又被破坏了。
2.运营工具—数据仓库使其融入公司的每一个部分
在 Census (2018 年)和 Hightouch (2018 年)的引领下,这个时代已经开始,让人们可以轻松地将数据从数据仓库直接输入到人们日常工作的工具中,如 Salesforce、Marketo 和 Hubspot。
作者图片
这是一个好的开始。如果您从事销售工作,当您与客户通电话时,如果洞察直接出现在 Salesforce 中,您更有可能根据洞察采取行动。
但这仅仅是开始。
我接触过的公司已经在数据仓库的基础上构建了完整的产品。无论是运行一项服务来决定在什么时间检查哪些汽车,还是为客户调查引擎提供动力,这都正在开始发生。
3.销售和营销—数据仓库将成为走向市场团队的无形之手
产品导向型增长(PLG)是一种走向市场的战略,其中销售线索生成和销售的主要驱动力是自助式产品。PLG 的核心组件是数据仓库,它将产品使用数据与了解客户如何使用产品并从中获取价值联系起来。
作者图片
Slack、Atlassian、Dropbox 和许多其他公司已经被收购。他们的销售团队获得了更多合格的销售线索,因此他们可以销售更大的合同,扩大收入,关注正确的销售线索,并为客户提供更多价值。
我们仍处于 PLG 的早期,这只是数据仓库如何成为走向市场团队的核心部分的一个例子。
4.财务—数据仓库将成为财务团队的首选工具
我谈过的大多数公司都有一些数据,只有有才是准确的。这可能是关于如何向客户收费的数据、使用模式或发送给监管机构的数据。如今,对于需要 100%准确的数据,数据仓库很少被信任。
作者图片
看到公司为这种类型的数据构建单独的生产系统花费大量开发人员时间并犯同样的常见错误并不罕见。
这将会改变。
总有一天,数据仓库会有正确的特性来帮助确保数据的可靠性和一致性,就像在任何其他生产级系统中一样。数据团队将能够封装数据仓库的各个部分,这些部分应该有更严格的规则来改变度量和维度。
财务和会计团队将成为数据仓库最频繁的用户。因此,他们的角色将发生巨大变化,他们将能够更加关注洞察力,而不是数据输入和准确性。
5.一切——数据仓库将成为现代公司的核心
数据仓库已经从所有来源收集了数据。它将很快能够将这些数据发送到您想要的任何工具,运营和销售&营销团队将使用这些数据作为他们工作方式的核心决策引擎。财务团队将能够信任数据,并开始推动从电子表格转移到使用数据仓库。这个世界会发生什么?
不投资数据和他们的数据仓库的公司会无法竞争吗?
90%的会计工作会像今天看起来的那样自动化,而不需要会计师的人工输入吗?
SAP 会不会只是成为一个接口?
我认为我们正走在这条路上。
我们如何到达那里?
在数据仓库发挥其全部潜力之前,仍然有一些构建模块需要就位。
作者图片
数据团队需要采用软件工程的最佳实践 最优秀的数据团队已经开始使用测试、代码变更的版本控制,以及在数据目录和 dbt 中记录数据。他们也开始在文化上采纳工程工作方式的理念;数据人员通常被安插在产品团队中,公司正在招聘数据产品经理,而数据不太被视为一种服务功能。更多的公司需要走这条路。
指标需要成为一等公民 我们已经看到了一些公司在指标商店领域的崛起,但是随着 dbt 于 12 月在 Coelesce 上宣布指标,指标正在成为主流。这是非常必要的,并且解决了一些重要的问题。度量将受到版本控制,并且将围绕如何进行更改进行清晰的治理。它们将被快照,因此如果您想要复制两年前创建的指标,您可以复制到最后一位小数。将有一个明确的地方来定义指标,并且它们将不再以不一致的方式在整个数据堆栈中定义。数据团队将能够通过简单一致的 API 向所有其他工具公开指标。
产品团队将需要拥有来自他们所拥有的系统的数据 数据网文章提出了一些围绕数据所有权的非常现实的挑战。大多数产品团队在分散的小团队中工作,让产品团队拥有他们生产的数据的努力需要继续。工程师将提高数据方面的技能,将有关于数据质量的关键指标和更简单的方法来了解产品团队所拥有的数据资产的健康状况。
数据团队需要全面了解数据如何在所有系统中流动 随着数据仓库的范围、方向和对所有团队的扩展,需要更简单、更可靠的方法来掌控一切。一个切换面板,提供来自数据堆栈中每个工具的适当级别的信息。
领导层中分析领导者的角色将会改变
一旦数据仓库成为公司的核心,分析领导者的角色将会改变。这不仅仅是高层人员的问题,也是数据团队的结构问题。
“大多数数据团队并不是为了成功而成立的。多年来,数据团队一直被埋没在 IT 职能中。像 IT 部门一样,这些数据团队处理从他们的系统中获取数据,并以 CSV 的形式呈现给利益相关者,利益相关者可以从中施展魔法并得出结论。”— 布莱恩·奥富特
所有需要发生的事情让我兴奋的是,它们中的许多已经在发生了;最好的公司正在发明他们自己的工具,对他们的数据团队进行大量投资,而数据社区非常优秀,充满了友好的人们,使得这一切成为可能。
如果你有什么想法,告诉我!
数据战略的内容、原因、方式、人员和时间
原文:https://towardsdatascience.com/wh-questions-of-data-strategy-1e6b0d19cb30
什么是数据策略?为什么重要?谁对此负责?您应该何时开始开发,以及如何开发?
https://unsplash.com/photos/N4gn-eLEIwI
什么是数据策略?
战略是指为实现一个长期目标而进行的规划!从历史上看,战略是为赢得军事行动而计划的艺术。然而,在我们的现代生活中,战略更多地用于商业战略和策划艺术的背景下,以赢得你的商战!
Google.com 战略定义快照
数据策略也不例外。它指的是通过高效和有效地使用数据来计划实现您的业务的长期目标!换句话说,数据战略没有意义,除非它与商业战略相联系。
为什么数据策略很重要?
大多数公司认为数据是一种战略资产。然而,原始数据本身并不能带来价值,也不能增强商业战略。
在以下情况下,数据将成为重要资产:
- 它帮助个人,尤其是非技术员工,变得更有生产力,做出基于数据的决策,而不是相信他们的直觉!
- 它有助于企业创收或降低成本,例如,通过更好地了解 b2c 企业中客户的需求,带来更好的客户体验。
- 它鼓励在人工智能和机器学习的帮助下进行创新,这反过来有助于业务增长和市场竞争力。
话虽如此,将数据带入企业的核心和文化并不容易。您可能遇到过一些甚至所有这些情况:
- 数据孤岛:业务中的不同职能部门收集或依赖自己的数据,并且不信任他人。
- BAU vs 数据:离开 BAU 的任务和花费时间来帮助数据质量和过程(包括创建、维护和分析)是有阻力的
- 缺乏适当的规划:规划和决策不是数据驱动的,而是基于最响亮的声音,因为没有使用数据快速交付价值的适当流程。
- 数据(il)素养:无论是技术职能还是非技术职能,都存在大量技能缺口,无法高效、有效地使用数据。
- 数据不符合目的:创造新价值,尤其是为传统的老企业创造新价值很难,因为所有容易的问题都解决了,需要新的数据代理。
- 数据法规:数据安全、隐私和其他数据法规在业务中存在问题。
- 基础设施:数据基础设施没有响应技术人员(更重要的是非技术人员)的需求,带来了糟糕的用户体验,也没有为创新提供合适的环境。
- 最后但同样重要的是,数据没有产生价值!
所有上述挑战表明,需要一个指导性计划来定义技术、流程和人员,以帮助企业使用数据实现其目标。这个指导性计划叫做数据策略。
按作者
如何制定数据策略
数据战略的主要目的是让企业通过从数据中提取价值来实现目标。虽然没有关于如何制定数据策略的唯一准则,但在制定数据策略时需要考虑几个主题:
- 数据战略应与业务战略保持一致,否则,组织将看不到数据投资的切实 ROI。
- 在了解业务战略以及 it 面临的机遇和挑战后,将确定数据和分析用例。
- 确定团队和基础设施能力和技能差距。
- 发现轻松取胜和战略举措。
- 路线图已创建。
我发现这篇文章对如何开发数据策略很有用,它包含了以上 5 个重要步骤的更多细节。
请注意,对于如何开发数据策略,并没有明确的规定。简而言之,它应该基于业务战略来开发,以从数据中提取价值,并且它涉及在组织内就技术、流程和人员做出决策。还需要注意的是,战略计划不同于运营计划,前者更侧重于长期使命和目标,而不是*期计划。
谁负责数据策略?
https://unsplash.com/photos/Zyx1bK9mqmA
传统上,业务数据是在 IT 团队内部处理的。他们将是看门人,对数据架构、数据管理、基础设施以及谁有权访问什么做出决策。这违背了数据和分析的民主化。非技术员工必须向数据分析师或类似人员询问他们的每个问题,这使得流程太长。这一切都意味着分析是静态的,并且无法在企业内扩展。数据和分析职能现在已经从传统的支持职能转变为通过数据和分析民主化,或者通过人工智能和机器学习实现某种程度的决策自动化,在整个组织内实现和加速数据驱动的决策。
数据是公司的资产,因此不是某个特定团队可以声称对其拥有完全控制权的东西。与业务预算类似,每个职能部门都应该对他们提出、维护或开发的数据资产负责。
然而,我们上面提到的变革需要企业内部进行大量变革,没有管理层的支持是无法实现的。它需要自上而下的规划,包括对整个公司的技术、数据资产和业务流程做出决策,并确定业务中的技能差距,以将数据素养和数据民主化引入业务。这一切都意味着决策将会也应该会影响整个商业文化。不足为奇的是,会有阻力,需要变革管理。
最*,许多公司开始引入新的高级管理职位,如首席数据官(CDO),负责为整个组织的数据使用和治理铺*道路的战略决策。
何时制定数据策略
如果您不能证明您的数据战略如何与业务战略保持一致并有助于实现业务目标,您就不会总是选择最先进的基础架构、雇用世界上最有才华的人,并通过改变业务中的所有流程来制造摩擦。
企业通常在处于扩展阶段时就开始考虑数据策略(我之前写了一篇文章详细介绍了企业何时应该开始投资数据),原因很简单,因为数据和分析可以通过适当的数据策略增强企业的扩展能力。
什么才是好的类别?
原文:https://towardsdatascience.com/what-actually-makes-a-good-category-b30069305633
做出有意义类别的 5 个初始步骤
简单的事情看起来很容易。不是吗?以条形图为例,它包含引人入胜的类别和引人注目的数字。一个好的图表可以在 7 秒钟内讲述一个故事,使企业领导人能够自信地领导。但是在这个过程中,很多事情都是理所当然的。
随机公司战略(图片由作者提供)
对于数据科学家来说,在这个敏感的地方获取分类数据并不容易。类别可能跨越不切实际的类别数量,范围不相等,或者严重不*衡。这些数据可能根本就不是类别!为了有意义,类别必须经历大量的解释、争论、重要性测试和最终分组(或重组)。
下面我将描述以下 5 个步骤来选择好的分类变量,最终用于二元分类模型(预测医院索赔是否会被拒绝):
- 频率和目视检查(以特征工程为例)
- 独立性测试(卡方检验)
- 相关强度(克莱姆氏 V)
- 功能选择(选择最佳)
- 特征重要性(使用随机森林分类器)
我们还将触及分类数据的一些常见困境:
- 高基数
- 阶级不*衡
- 联想 vs 实力
- 真正的相关性
注意:以下所有数据都是出于 HIPAA 目的由随机生成器生成的。
1.频率和目视检查
理解类别的第一步是看它们的频率。我们将使用分类 CPT 代码作为例子。CPT 是 5 位数的字母数字代码,代表临床诊疗过程中执行的任何程序。大多数就诊有 1-2 个 CPT 代码,有些没有,有些很多。
以下是 7 次虚构患者就诊的 CPT 代码。
在一个非常大的数据集中,CPT 代码的变化太多,无法以有意义的方式显示(这里实际上有 137,376 个唯一的 类别)。
让我们看看它们的频率。以下是十大最常见的 CPT 组合。
dataset.cpt_code.value_counts().head(10)/dataset.account.count()
猜猜 Q3014 对应什么?远程保健。最*很常见。最常见的服务类型是[无]——没有服务(24%)。那很有趣。其余 CPT 组合出现的频率为 4%或更低。这揭示了医学的一些特殊之处:患者就诊非常独特。
在数据方面,这些 CPT 组合具有高基数,这将使预测建模具有挑战性。太多的类别会使可视化变得混乱,阻碍训练速度,并且会使数据溢出。像 CPT 代码这样的类别的维数减少是一项广泛但有价值的工作。
为类别提供更广泛、更有意义的标签不仅支持降维,还能突出关键特征。我们可以将许多 CPT 代码归为一类“临床经验”例如,代码 Q3014、99441、99442、99443 都与远程医疗访问有关(将其标记为“远程医疗”)。CPT 代码 80053、85025、86359、86360 都对应于实验室测试(标记为“其他实验室”)。
这样做,我们有效地将* 138,000 个类别缩减为大约 30 个“临床体验”这首先是商业意义,其次是数据科学意义。我们现在可以看到哪些 CPT 类别正在影响拒绝(我们的结果变量)以及影响的程度。
pd.DataFrame({‘count’:dataset.cpt_min_categories.value_counts(),‘denied’:dataset.cpt_min_categories[dataset.claim==1].value_counts(),\
‘frequency’:(dataset.cpt_min_categories[dataset.claim==1].value_counts()/dataset.cpt_min_categories.value_counts())*100}).sort_values(by=’frequency’,ascending=False)
五大 CPT 类别
在这个虚构的数据集中,麻醉声称创造了最多的否认。为什么会这样?这些案件更复杂吗?这些程序的编码规则最*有变化吗?我们必须进一步探索。
保持简单:数数就好
或者,我们可以对 CPT 代码进行计数,而不是对它们进行分组。例如,有多少次访问生成了 1 个 CPT 代码、2 个 CPT 代码等。?这很简单,但它有助于深入了解每个患者体验的相对强度,也潜在地了解其临床复杂性。
我们可以创建两个新的类别: cpt_count 用于每次患者就诊的 cpt 代码计数,和 cpt_count_10 相同,但是将超过 10 个 CPT 代码的就诊分组在最后的第 10 个类别中。我这样分组是因为 cpt_count 一直延伸到 91 次(即一名患者在一次就诊中进行了 91 次手术)。将他纳入最多只有 10 个 CPT 代码的患者中会有错吗?让我们检查分布。
为了创建上面的两列,我们可以实现以下代码:
def cpt_count(x):
"""Creates the cpt_count and cpt_count_10 variables
Input: Entire dataframe (dataset)
Output (integers):
1\. cpt_count: counts of all CPT codes
2\. cpt_count_10: counts of all CPT codes where >9 codes is bucketed as 10
"""
x['cpt_count'] = x['cpt_code'].where(x['cpt_code'].astype(str)!="['None']",'0')
x['cpt_count'] = x['cpt_count'].where(x['cpt_count']=='0',[len(i) for i in x['cpt_count']])
x['cpt_count'] = x['cpt_count'].astype(int)
x['cpt_count_10'] = [10 if i>9 else i for i in x['cpt_count']]
x['cpt_count_10'] = x['cpt_count_10'].astype(int)
return xdataset = cpt_count(dataset)
dataset[['cpt_code','cpt_count','cpt_count_10']].head(10)
CPT 代码计数,以及最大计数为 10 的 CPT 代码计数
现在让我们用下面的代码将 cpt_code_10 和我们的拒绝结果变量可视化在一个条形图中:
table = pd.pivot_table(dataset[['cpt_count_10','claim']].groupby(['cpt_count_10','claim'])['claim'].count().reset_index(name='count'),index=['cpt_count_10'],columns='claim')
ax = table.plot(kind='bar', figsize=(10,6),fontsize=15)ax.set_title('Number of Claims by CPT Buckets',fontsize= 20) # title of plot
ax.set_ylabel('Number of Claims', fontsize=16)
ax.set_xlabel('CPT Buckets (0 - 10+ codes)',fontsize=16)L=ax.legend(fontsize=12)
L.set_title('Type of Claim',prop={'size':12})
L.get_texts()[0].set_text('Clean Claim')
L.get_texts()[1].set_text('Denied Claim')
干净/被拒绝索赔的 CPT 类别分布
我们可以看到大多数访问只生成 0-2 个 CPT 代码。这远远超过了扩展到 91 个 CPT 码的“10 个或更多”桶。两个索赔结果显示大致相同的分布。但也许最有趣的是,这张图表揭示了索赔之间的阶级不*衡。下面我们将评估这种常见分布背景下的分类相关性。
2.卡方检验
卡方检验评估两个标称变量之间的独立性,每个变量都有两个或更多可能的值。对于分类变量来说,这是一个很好的初始测试,因为它测试了一个变量中的比例是否不同于另一个变量(结果变量)。
比如评价是否喜欢披萨(是/否)取决于是不是某个性别(男/女)。这个测试不能告诉你男性比女性更喜欢比萨饼的程度(影响大小),只能告诉你男性和女性喜欢比萨饼的程度不同。
卡方的一个很好的特点是类别不*衡不会影响结果。在轻微不*衡(1:2)或甚至严重类别不*衡(1:1000)的情况下,两个结果都可能使卡方统计接*于零(无关联)。然而,影响卡方结果的是样本大小。在大样本中,即使组间最小的差异也会产生显著的卡方结果,p 值远低于 0.001。这是 p 值的一个固有特征,因为它表明您偶然获得卡方统计的可能性有多大。
例如,让我们首先创建一个列联表来执行卡方检验,以比较入院类型(急诊、住院、门诊)的数量与我们的二元拒绝状态结果(0 =索赔未被拒绝,1 =索赔被拒绝)。
patient_type = pd.crosstab(dataset[‘patient_type’], dataset[‘claim’])/100
patient_type
再一次,我们看到主张(拒绝结果)是不*衡的,但是没关系。让我们通过评估检验统计量和 p 值来评估这些组之间的独立性。
stat, p, dof, expected = chi2_contingency(patient_type)
# interpret p-value
alpha = 0.05
print("The p-value is: " + str(p))
print('The test statistic is: '+ str(stat))
print('The degrees of freedom are: '+str(dof))
print(' ')
if p <= alpha:
print('Samples are dependent (reject H0); proportions of patient types are different between clean and denied claims')
else:
print('Samples are independent (H0 holds true); proportions of patient types are the same between clean and denied claims')
结果表明,患者类型和我们的拒绝结果之间存在一定的相关性。仅从列联表中,我们可以看到住院病人和急诊病人的频率相似,但门诊病人的频率不同。当值的总数超过 1000,样本是独立的,并且交叉表中没有单元格少于 5 个时,适合使用卡方检验(改为应用 Fisher 精确检验)。
3.克莱姆氏 V
群体之间的独立性可能会告诉我们什么是有意义的不同,但如果你真的在追求差异的强度呢?对于分类变量和结果,我们可以求助于克莱姆 V 或比值比(or)。
OR 通常用于 2x2 表,而 Cramer 的 V 可以评估跨多个级别的类别,因此可以评估更大的表。
优势比的好表格
克莱姆的 V 的一个好表
OR 不是“赔率”的度量,而是 2 赔率的比值;例如,暴露组与非暴露组发生事件的几率。但是 OR 和 Cramer 的 V 都用来报告暴露和事件之间的关联强度。两者都报告为大于 1 的值,值越高,关联越大。
Cramer 的 V 还结合了卡方统计,因此这是一个很好的后续测试。它采用公式:
克莱姆氏 V
其中 k 代表行数或列数(取最大值), N 是整个样本大小, X 是卡方统计量。
我们可以用 python 实现 Cramer 的 V 函数:
def cramers(x, y):
"""This is the Cramer's V statistic
Input: X feature variable, y target variable
Output: Provides association strength from the chi-square statistic
"""
x_length = len(x.value_counts().index)
y_length = len(y.value_counts().index)
# getting highest row/column total - 1
if x_length < y_length:
rc = x_length - 1
else: rc = y_length - 1
chi_data = pd.crosstab(x, y)
stat, p, dof, expected = chi2_contingency(chi_data)
# total sample size
n = chi_data.sum().sum()
cramers = np.sqrt((stat)/(n * rc))
return print("The Cramer's V correlation strength is:", round(cramers, 4))
对于我们之前的患者类型变量,我们可以看到:
cramers(dataset['patient_type'], dataset['claim'])
退货:
这表明,尽管患者类型与我们的结果变量之间存在有意义的差异(如卡方检验所示),但没有很强的相关性。
对于克莱姆的 V:
-
. 1 表示小的影响
-
. 3 代表中等效果
-
. 5 代表大效果
有兴趣查看所有变量的克莱姆 V 结果吗?创建一个循环,评估所有 Cramer 的 V 分数,并将它们(及其变量名)分配到一个列表中作为一个图。
column_list = ['pat_sex', 'patient_type',
'department_name', 'adm_type', 'specialty', 'attending_prov',
'financial_class_name', 'primary_payor', 'current_financial_class',
'current_payor', 'collection_agency','cpt_count_10', 'cpt_categories', 'cpt_min_categories',
'rev_categories', 'rev_min_categories', 'rev_count_10',
'icd_10_min_categories', 'icd_10_count', 'icd_10_count_10',
'pharm_categories', 'pharm_count', 'pharm_count_10', 'los_cat',
'pat_dob_decade']cramer_list = []
for i in column_list:
result = cramers(dataset[i], dataset['claim'])
cramer_list.append(result)cramers_list = pd.DataFrame({'column': column_list, 'cramer_value':cramer_list})cramers_list.sort_values(by='cramer_value',ascending=True).plot(y='cramer_value',x='column',kind='barh', \
title='Strongest Correlation with Denial Rate')
所有分类特征的 Cramer V 评分汇总
在这里,变量 rev_categories (收入代码) cpt_categories (cpt 代码)和attenting _ prov(护理提供者)在确定索赔是否会被拒绝方面最有希望。从商业角度来看,这也是有意义的;收入代码告诉付款人提供了什么服务以及多少钱,CPT 代码告诉提供了什么服务,并且主治医生经常在所有患者就诊时签字。
4.功能选择(选择最佳)
如果您的数据集包含许多分类变量,您可能会好奇哪一个对您的结果变量影响最大。这种特征选择剔除了非解释性变量,以提高模型性能。其次,它还提供了对功能工程工作可能提供高 ROI 的洞察。正如我们将会看到的,在精选测试中排名靠前的分类表现者可以被拆开、重新分类或重新加权,以进一步增强他们的影响力。
SelectKBest 函数可以接受卡方作为评分函数。它计算 X 和 y 的每个特征之间的 X 统计量(您的类标签)。大值意味着该特征与 y 非随机相关,因此可能提供重要信息。您可以强制模型只选择 k 个最相关的特征来保留。
实际上,您需要为分类变量中的所有类别获取单独的特征名称。在这里,我创建了一个 ColumnTransformer,它将 OneHotEncoder 应用于我的所有分类变量。
col_transformer = ColumnTransformer(transformers=[('ohe', OneHotEncoder(handle_unknown='ignore'),
['pat_sex','patient_type','department_name','adm_type','financial_class_name','primary_payor',
'collection_agency','cpt_count_10','cpt_min_categories','rev_count_10','rev_min_categories',
'icd_10_count_10','icd_10_min_categories','pharm_categories','pharm_count_10','los_cat'])],
remainder='passthrough')
然后,我可以通过将我的变量转换成一个数组,然后调用 get_feature_names()来创建这些特性名
test = dataset[['pat_sex','patient_type','department_name','adm_type','financial_class_name','primary_payor',
'collection_agency','cpt_count_10','cpt_min_categories','rev_count_10','rev_min_categories',
'icd_10_count_10','icd_10_min_categories','pharm_categories','pharm_count_10','los_cat']].astype(str)codes = col_transformer.transform(test).toarray()
feature_names = col_transformer.get_feature_names()feature_names
这里有许多单独的特性名称:16 个变量乘以它们包含的类别数=特性名称的数量。很多。
现在我们实现 SelectKBest 函数。我们将下载这些包,将卡方作为我们的评分函数,并查看所有变量的排名分数(您可以让 k=5 只查看前 5 个变量)。
from sklearn.feature_selection import SelectKBest, chi2, mutual_info_classifselect = SelectKBest(score_func=chi2, k='all')
z = select.fit_transform(X_transformed, test_y)
现在,模型已经拟合好了,让我们找出所有特性名称的范围以及每个特性的得分。我们可以通过把它们组合成熊猫的数据框架来更好地形象化它们。
feature_num = []
feature_name = []
feature_score = []
for i in range(len(select.scores_)) and range(len(feature_names)):
feature_num.append(i)
feature_name.append(feature_names[i])
feature_score.append(select.scores_[i])kbest = pd.DataFrame({'num':feature_num, 'name': feature_name, 'score':feature_score})kbest.sort_values(by='score', ascending=False)
最后,我们可以利用 re 包来更新字符和字符串。
import re
import matplotlib.pyplot as plttypes = []
for i in kbest.name:
result = re.search('__x(.*)_', i)
types.append(result.group(1))kbest = pd.concat([kbest,pd.DataFrame({'types':types})], axis=1)counts = []
desc = []
for count, i in enumerate(test.columns):
counts.append(count)
desc.append(i)
lookups = pd.DataFrame({'types':counts, 'variable':desc})
lookups['types'] = lookups['types'].astype(str)kbest = kbest.merge(lookups, on='types')kbest.groupby('variable').score.sum().sort_values(ascending=True).plot(kind='barh', title='Chi-Square statistic: Higher means related to denial rate')
所有变量的卡方统计
这些卡方统计值相当高,会影响我们的结果变量。这也被我们的 Cramer 的 V 结果和我们早期的可视化所证实。画面在这里变得更加清晰:准确的税收代码和 CPT 代码是预测被拒绝索赔的核心。
5.特征重要性(使用随机森林分类器)
在像随机森林这样的基于树的模型中,决策分割是从每个特征(在其他特征的随机子集之间)中做出的,这最大程度地减少了杂质(基本上是不确定性)。所有预测的树集合在一起形成随机森林。尽管有些树是不相关的,但它们一起保护彼此免受个别错误的影响,并优于它们各自的组成树。
特征重要性将最能减少杂质的特征排列为最高。尽管有用且实现简单,但对于基数高的变量,重要性往往会增加。如果您的变量具有高基数,那么可以利用排列重要性。
为了评估特征的重要性,我们简单地从随机森林分类器模型中调用 feature_importances_ right。
# instantiate RFC, assign coefficients to coefs, and zip together with column names
rfc = RandomForestClassifier(random_state=0)
coefs = rfc.feature_importances_
zipped = zip(clean_columns.iloc[:,0], coefs)# create a dataframe of just the top 20 most important features
feature_imp = pd.DataFrame(zipped, columns=['feature','importance']).sort_values(by='importance',ascending=False).head(20)
然后我们可以想象这些结果
fig, ax = plt.subplots(figsize=(10,4))
ind = range(0,10)
ax.barh(ind, feature_imp['importance'].values[0:10],
align='center',alpha=0.8)
ax.set_yticks(ind)
ax.set_yticklabels(feature_imp.iloc[0:10,0].tolist())
ax.tick_params(left=False, top=False, right=False)
ax.set_title("10 Most Important Features in Denials Prediction Model")
ax.set_xlabel('Feature Importance Coefficient \n(RandomForestClassifier)')
plt.gca().invert_yaxis()
随机森林分类器中最重要的 10 个特征
上面的结果来自其他虚构的数据,包括 bill_status (发送给保险公司的账单类型),但是同样,您可以看到收入代码占据了特性重要性的首位。
结论
这些只是评估分类变量的相关性和重要性的 5 种初始方法。像数据科学中的所有事情一样,我们一直处于证据收集模式,让统计数据和可视化告诉我们真实的故事。
感谢您的阅读,请随时通过 LinkedIn 或电子邮件与我联系!
什么是深度赝品?
原文:https://towardsdatascience.com/what-are-deepfakes-and-how-do-you-recognize-them-f9ab1a143456
如何处理人工智能带来的错误信息
在 Unsplash 上由 Wahid Khene 拍摄的照片
深度赝品是使用深度学习模型人工创建的视频、图像或音频文件。例如,现有的视频序列通过替换人脸来使用和伪造。它们旨在尽可能表现得逼真,即使它们是由 ML 模型生成的。除了将 deep 赝品用于私人视频之外,它们还可以用于传播有针对性的错误信息。
深度赝品是如何制造的?
目前,有两种主要的技术模型被用来制作深度假视频。
自动编码器是由编码器部分和解码器部分组成的机器学习模型。他们实际上是用来学习非结构化数据的压缩但信息丰富的表示形式。例如,我们可以使用相同的图像作为输入和输出。这将允许自动编码器学习尽可能压缩的图像矢量表示,并存储所有重要特征。然后,解码器又使用该向量再次从其生成原始图像。自动编码器的学习矢量表示越好,生成的图像越逼真。
总共有两个自动编码器接受深度伪影训练。第一个模型是由最终产品中将要出现的人的图像或视频组成的。在大多数情况下,这些人是名人、政治家或运动员,在我们的例子中是人 a。第二个模型是根据另一个人(人 B)的图像训练的,这个人提供了要模仿的面部表情或手势。
当这两个模型被训练时,一个使用人 B 的图像,并用第二个模型的编码器对其编码。然后,将得到的向量从第一个模型馈送到解码器中,这创建了一个看起来像人 A 的图像,但是已经接管了人 b 的动作和面部表情。
所谓的 一般对抗网络 是训练一个 ML 模型来制造 deepfakes 的第二种方式。简而言之,我们一起训练两个神经网络。第一个被训练以产生与原始训练图像共享尽可能多的特征的人工图像。反过来,第二个网络试图找出人工创建的图像和原始图像之间的差异。所以我们训练两个相互竞争的网络,结果都变得越来越好。
deepfakes 有哪些类型?
这种模型的训练以及相应的好的 deepfakes 的创建是非常耗时和计算密集型的。由于图形处理单元(GPU)领域的巨大进步,这种技术只对大众开放,因为培训成本因此显著下降。大多数 deepfake 文件属于以下类别之一:
- 面部交换:A 人的面部和面部表情应该投射到 B 人的身体上,甚至可以用 A 人的身体替换视频或图像中 B 人的整个身体。
- 人体木偶:人 A 的动作、手势或面部表情被记录下来,然后由人 b 人工接管。
- 声音交换:自由书写的文本要尽可能真实地用一个人的声音来表演。例如,这种方法也可以与人体木偶结合起来。
如何检测 deepfakes?
高质量的 deepfakes,对于肉眼和这一领域的新手来说,最初是很难甚至无法察觉的。一般来说,有两种方法来揭露这种伪造的视频或音频文件。
第一种方法不太关心具体的文件,而更关心环境。以下问题有助于处理 deepfakes:
- 被展示的人真的会做或说类似的事情吗?是否可以预期所展示的是真实发生的?
- 你能找到其他来源吗,比如视频、报纸文章等。,那证实显示的是什么?
- 你能从不同的角度找到同一场景的其他镜头吗?
如果这些问题可以用“是”来回答,那么成为深度欺诈受害者的风险就会大大降低。然而,除此之外,还有更详细的技术问题可以提供关于 deepfake 的信息:
- 是否有典型的深度伪装特征,例如完美对称的脸,弯曲的眼镜,两个不同的耳环,或者类似的?
- 嘴唇的动作看起来像人类吗?它们与口语文本匹配吗?
- 人经常眨眼吗?
出于训练目的,我们在文章末尾链接了一些被证明是 deepfakes 的视频。在那里你可以测试你是否能马上认出他们。
deepfakes 的危害是什么?
Deepfakes 可以在日常生活的许多领域对我们构成威胁。
比如,有可能这些人为的档案被用于所谓的 CEO 造假。在这种情况下,人们会尽可能真实地接到上级甚至管理层的电话,其目的是向欺诈者转移资金。当我们听到同事或上级的真实声音时,我们不太可能像收到带有恶意链接的钓鱼邮件时那样怀疑。
然而,除此之外,还有更严重的危险威胁着高质量 deepfakes 的广泛传播。这些媒体文件可以通过创建和分发攻击性视频或音频文件来传播有针对性的虚假信息。这不仅让个人处于不利地位,在最坏的情况下,甚至会导致社会动荡。
这是你应该带走的东西
- Deepfakes 是人工创建的媒体,如视频、图像或音频文件,这些媒体是使用深度学习方法创建的。
- 他们试图表现不同背景或环境中的人,因为没有原始文件。
- 从技术上讲,这些文件是在所谓的自动编码器或一般敌对网络的帮助下创建的。
如果你喜欢我的作品,请在这里订阅https://medium.com/subscribe/@niklas_lang或者查看我的网站* 数据大本营 !还有,medium 允许你每月免费阅读 3 篇 。如果你想让无限制地访问我的文章和数以千计的精彩文章,请不要犹豫,通过点击我的推荐链接:【https://medium.com/@niklas_lang/membership】每月花$5获得会员资格*
**https://medium.com/@niklas_lang/what-does-google-know-about-me-find-it-out-c6115dca17e4 https://medium.com/@niklas_lang/what-are-recurrent-neural-networks-5c48f4908e34 https://medium.com/@niklas_lang/kubernetes-k8s-simply-explained-3dc2e1558b7c **
什么是虚拟变量以及如何在回归模型中使用它们
汽车的*均价格是气缸数量的函数。数据来源:加州大学欧文分校 ( 用法术语)(图片由作者提供)
以及如何解释虚拟变量的回归系数
虚拟变量是取值为 0 或 1 的二进制变量。人们将这些变量添加到回归模型中,以表示二元性质的因素,即它们要么被观察到,要么没有被观察到。
在这个宽泛的定义中有几个有趣的用例。以下是其中的一些:
- 表示是/否性质:表示数据点是否具有某种性质。例如,虚拟变量可用于指示汽车发动机是“标准”型还是“涡轮”型。或者如果药物试验的参与者属于安慰剂组或治疗组。
- 用于表示分类值:虚拟数据的一个相关用途是表示一个数据点属于一组分类值中的哪一个。例如,车辆的车身样式可以是敞篷车、掀背车、轿跑车、轿车或旅行车。在这种情况下,我们将向数据集添加五个虚拟变量,五种体型各一个,我们将对这五个虚拟元素向量进行“一次热编码”。因此,向量[0,1,0,0,0]将表示数据集中的所有掀背车。
- 用于表示有序分类值:使用虚拟模型来表示分类数据的一个扩展是分类是有序的。假设我们的汽车数据集包含发动机为 2、3、4、5、6、8 或 12 缸的汽车。这里,我们还需要捕获订单中包含的信息。我们将很快看到如何做到这一点。
- 用于表示季节周期:可以添加一个虚拟变量来表示数据中可能包含的多个季节周期中的每一个。例如,交叉路口的交通流量通常表现出每小时一次的季节性(在早晚高峰时最高)和每周一次的季节性(在周日最低)。将虚拟变量添加到两个季节期间的数据中,将允许您解释交通流量中的大部分变化,这些变化可归因于每日和每周的变化。
- 用于表示固定效应:在为面板数据集构建回归模型时,虚拟模型可用于表示“特定单位”和“特定时间”的效应,尤其是在固定效应回归模型中。
- 用于表示治疗效果:在治疗效果模型中,虚拟变量可用于表示时间的效果(即应用治疗前后的效果)、组成员关系的效果(参与者接受治疗还是安慰剂)以及时间和组成员关系之间的相互作用的效果。
- 在回归不连续设计中:这最好用一个例子来解释。想象一组月度就业率数据,其中包含由短暂而严重的衰退导致的失业率突然大幅上升。对于这些数据,用于失业率建模的回归模型可以部署虚拟变量来估计衰退对失业率的预期影响。
在本文中,我们将解释如何在前三种情况下使用虚拟变量,即:
- 用于表示是/否属性
- 用于表示分类值
- 用于表示有序分类值
最后四个用例,即使用虚拟数据去季节化,表示固定效应和治疗效应,以及建模回归不连续性,都值得他们自己单独的文章。
顺便说一句,使用假人来表现固定效果在这里有所涉及:
在接下来的文章中,我们将介绍在构建治疗效果模型和建模不连续性的效果时使用的虚拟模型。
让我们深入第一个用例。
如何使用虚拟变量来表示是/否属性
我们将通过使用下面的车辆数据集来说明该过程,该数据集包含来自 1985 年版的沃德汽车年鉴的 200 多辆汽车的规格。每行包含一组 26 个关于单个车辆的规格:
汽车数据集(来源:加州大学欧文分校)
我们将考虑由以下七个变量组成的数据子集:
制造
吸气
车身样式
整备质量
气缸数
发动机尺寸
价格
汽车数据集的 7 变量子集。(来源:加州大学欧文分校)
以上 7 变量版本可以从这里 下载 。
在上述数据集中,吸气变量属于标准型或涡轮型。我们的回归目标是估计期望对汽车价格的影响。为此,我们将引入一个虚拟变量对吸气进行编码,如下所示:
吸气 _ 标准 =1,否则为 0。
我们将使用基于 Python 的 Pandas 库将数据集作为数据帧加载到内存中。然后我们将使用 statsmodels 库建立一个简单的线性回归模型,其中响应变量为价格,回归变量为 aspiration_std (加上回归的截距)。
让我们从导入所有需要的包开始。
**import** pandas **as** pd
**import** statsmodels.formula.api **as** smf
让我们将汽车数据集的 7 变量子集导入到一个数据框架中:
df = pd.**read_csv**(**'**automobiles_dataset_subset_uciml.csv**'**, **header**=0)
我们将添加虚拟变量列来表示抽吸变量。
df_with_dummies = pd.**get_dummies**(**data**=df, **columns**=[**'**aspiration**'**])
打印出虚拟扩充数据集。
**print**(df_with_dummies)
我们看到以下输出。我突出显示了 Pandas 添加的两个虚拟变量列:
虚拟扩充数据集(图片由作者提供)
让我们构造回归表达式。回归的截距随后由模型自动添加。
reg_exp = **'price ~ aspiration_std'**
请注意,我们只添加了一个虚拟变量吸气 _ 标准,而没有添加两个虚拟变量吸气 _ 标准和吸气 _ 涡轮。我们这样做是为了避免完全共线性,因为数据集中的每台车辆发动机都是涡轮增压型或标准型。没有第三种。在这种情况下,回归截距捕捉到了吸气 _ 涡轮的效果。具体地,训练模型中回归截距的估计值是所有涡轮型汽车的估计*均价格。
或者,我们可以添加吸气 _ 标准和吸气 _ 涡轮并省略回归截距。在后一种情况下,由于模型没有回归截距,我们将无法使用 R *方 值来判断其拟合优度。
让我们在这个虚拟增强数据集上构建普通最小二乘回归模型:
olsr_model = smf.**ols**(**formula**=reg_exp, **data**=df_with_dummies)
尽管我们已经将整个 7 变量数据集传递到这个模型中,但在内部,statsmodels 将使用回归表达式参数(reg_exp
)来仅划分出感兴趣的列。
让我们训练模型:
olsr_model_results = olsr_model.**fit**()
让我们把培训总结打印出来。
**print**(olsr_model_results.**summary**())
我们看到以下输出。我强调了我们将仔细研究的部分:
OLSR 模式的培训总结(图片由作者提供)
如何解读模型培训总结
我们首先注意到的是 调整后的 R *方 为 0.027。期望变量已经能够解释汽车价格中略低于 3%的差异。它看起来非常小,但我们不需要过多解读调整后 R *方的低值。回想一下,我们的目标是估计期望对价格的影响。我们从来没有指望愿望本身能够解释价格的大部分差异。此外,请注意,F-统计量 的 p 值显著为 0.0107,表明即使是这种非常简单的线性模型也能够比均值模型更好地拟合数据(均值模型基本上是穿过价格*均值的水*直线)。
接下来,我们注意到模型的回归截距和系数 aspiration_std 都具有统计显著性,即非零,p 值分别小于 0 . 001 和 0 . 011。这是个好消息。让我们看看如何解释这些系数的值。
如何解释回归模型中虚拟变量的系数
回想一下,我们已经从模型中省略了虚拟变量 aspiration_turbo 以避免完全共线性。通过省略 aspiration_turbo ,我们将存储涡轮*均价格的工作交给了回归模型的截距。回归截距为 16250,表明 turbos 的*均价格为 16250 美元。
我们需要参照截距值来解释模型中所有虚拟变量的系数。
在我们的例子中,只有一个虚拟对象, aspiration_std。它的值是 3712.62,并且有一个负号。这表明具有“标准”型吸气装置的汽车比具有“涡轮”型吸气装置的汽车*均便宜 3712.62 美元。涡轮增压发动机的预计*均价格为 16250 美元。因此,非涡轮增压发动机的估计*均价格为 16250 美元—3712.62 美元=;12537.38 美元。
使用统计符号,我们可以将这两种方法表示如下:
E(price | aspiration = ' standard ')=$ 12537.38
该估计在*均值附*具有以下 95% 置信区间:
【16250 美元——6555.64 美元=【9694.36 美元【16250 美元——869.607 美元=【15380.393 美元 】。
我们从模型培训输出的 CI 部分获取了值 -$6555.64 和 -$869.607 ,如下所示:
对于 turbos,期望值和配置项计算如下:
E(price | aspiration = ' turbo ')=【16250 美元【13700 美元【18800 美元 】。**
拟合模型的回归方程如下:
*价格=—3 . 712 . 62 吸气 _std + 16250 + e
其中' e '包含回归的残差。
接下来,让我们看看使用虚拟变量来表示分类数据。
如何使用虚拟变量来表示分类回归变量
假设我们希望估计 body_style 对价格的影响。Body_style 是一个分类变量,具有以下一组值:【敞篷车、硬顶车、掀背车、轿车、旅行车】。我们表示 body_style 的总体策略与表示 aspiration 的策略相似。所以让我们直接进入实现。我们将继续使用包含 7 变量汽车数据集的熊猫数据框架。
让我们用虚拟变量列来扩充数据帧,以表示 body_style :
**df_with_dummies = pd.**get_dummies**(**data**=df, **columns**=[**'**body_style**'**])**
打印出虚拟扩充数据集:
**print(df_with_dummies)**
我们看到以下输出:
虚拟扩充数据集(图片由作者提供)
注意新添加的虚拟变量列,每个 body_style 都有一个。
接下来,我们将在 Patsy 语法中构建回归方程:与之前一样,我们将省略一个虚拟变量( body_style_convertible )以避免完全共线性。回归模型的截距将保存 body_style_convertible 的系数。
**reg_exp = **'price ~ body_style_hardtop + body_style_hatchback + body_style_sedan + body_style_wagon'****
让我们建立 OLS 回归模型:
**olsr_model = smf.**ols**(**formula**=reg_exp, **data**=df_with_dummies)**
让我们训练模型:
**olsr_model_results = olsr_model.**fit**()**
让我们打印出培训总结:
****print**(olsr_model_results.**summary**())**
我们看到以下输出:
OLSR 模式的培训总结(图片由作者提供)
和以前一样,我们不会关注调整后的 R *方。相反,让我们看看 F 统计量,并注意到它在 p 值为< .001. It indicates that irrespective of the value of R-squared, the variables we have included in the model have been able to do a better job of explaining the variance in 价格时比简单的均值模型更显著。完成尽职调查这一重要部分后,让我们深入研究所有变量的系数。
如何解释虚拟变量的系数
让我们把目光转向拟合模型的系数。预计截距 21890。截距是敞篷车的估计*均价格,因为这是我们从回归方程中去掉的哑元。这一估计值在 3,790 美元(T1)、21890 美元(5742.639 美元=16147.361 美元(T3))时非常重要。****
同样,轿车的估计*均价格比敞篷车低 7430.7447 美元,四轮拖车的估计*均价格比敞篷车低 9518.54 美元。
总之,我们的模型显示,*均而言,敞篷车是最昂贵的车辆,其次是轿车、旅行车和掀背车,硬顶风格无法解释价格的差异。
拟合模型的方程如下:
拟合回归模型的方程(图片由作者提供)
如何使用虚拟变量表示有序分类值
我们要考虑的最后一个用例是分类变量对其组成部分施加了某种顺序。我们将再次使用汽车数据进行说明。具体来说,我们将注意力转向变量气缸数量。
汽车数据集的 7 变量子集。(来源:加州大学欧文分校)
乍一看,气缸数量似乎是一个整数值变量。对气缸数的价格进行回归的可能回归模型如下:
一个简单的回归模型,回归了汽缸数量的价格(图片由作者提供)
这个模型有一个致命的缺陷,当我们区分价格的期望值 w.r.t. 气缸数时,这个缺陷变得很明显:
汽缸数量每单位变化汽车价格期望值的变化(图片由作者提供)
我们看到,该模型将估计气缸数量每单位变化的价格的恒定预期变化。该模型将估计 2 缸车和 3 缸车的*均价格差异,使其与 3 缸车和 4 缸车的*均价格差异完全相同,依此类推。在现实世界中,我们不会期望看到汽车价格出现如此一致的变化。
一个更现实的模型是将气缸数量视为分类变量,用虚拟变量表示气缸数量的每个值。
我们的数据集包括 2 缸、3 缸、4 缸、5 缸、6 缸、8 缸和 12 缸汽车。因此,我们构建模型如下:
一个线性模型,其中气缸数量表示为分类虚拟变量(图片由作者提供)
我们已经省略了气缸数量 _2 的假人。截距 β_0 将捕获气缸数 _2 的系数。所有虚拟变量的系数将包含相应类别车辆*均价格与 2 缸车辆估计*均价格的估计偏差。如上所示,可以计算 95%的 CIs。
让我们在汽车数据集上构建和拟合这个模型,并打印出培训摘要。
我们看到以下输出:
线性模型的训练总结(图片由作者提供)
如何解释虚拟变量的训练总结和系数
*****#Add dummy variable columns to represent num_of_cylinders*** df_with_dummies = pd.**get_dummies**(**data**=df, **columns**=[**'**num_of_cylinders**'**])olsr_model = smf.**ols**(**formula**=reg_exp, **data**=df_with_dummies)olsr_model_results = olsr_model.**fit**()**print**(olsr_model_results.**summary**())**
摘要中首先引人注目的是 0.618 的大调整后 R *方。气缸数量似乎有能力解释汽车价格中高达 61.8%的差异。
与往常一样,我们将尽职调查 F 统计的 p 值(在 2.87 e-39 处明显小于 0.001),表明模型中的所有回归变量共同高度显著。
和以前一样,我们的重点仍然是估计的系数,它们的 p 值和 95%的置信区间。
先说回归截距。它的估计值是 13020 美元,这是 2 缸汽车的估计*均价格。*均价格在 p 值为 0.001 时具有统计学意义,95%置信区间为[$8176.803,$17900]。
三缸汽车的估计*均价格为 13020 美元——7869.0 美元= 5151 美元,但这一估计只有在 p 值为 0.153 时才有统计学意义。它未能通过 95%、90%和 85%的置信度测试,但通过了 80%的置信度。
四缸汽车紧随三缸汽车之后,估计*均价格为 13020-2716.8025 美元= 10303.1975 美元。同样,在 p = 0 . 273 时,该估计的显著性仅在(1 — .273)100%=72.7%的置信水*下有效。
5 缸、6 缸、8 缸和 12 缸汽车的估计*均值都非常显著。*均而言,8 缸汽车似乎是所有汽车中最贵的,其*均价格比 2 缸汽车高出 25,880 美元。
下图显示了*均价格与气缸数量的关系,以及*均值上下 95%的界限。
汽车的*均价格是气缸数量的函数(图片由作者提供)
我们看到价格并没有随着每个单位的气缸数量的变化而变化一个恒定的量。这证实了我们之前的观点,即我们不应该将的气缸数表示为简单的整数值变量。
以下是拟合模型的方程式:
拟合回归模型的方程(图片由作者提供)
以下是本文中使用的完整源代码:
参考文献、引文和版权
数据集
汽车数据集 引用: Dua,d .和 Graff,C. (2019)。UCI 机器学习知识库[http://archive . ics . UCI . edu/ml]。加州欧文:加州大学信息与计算机科学学院。(CC BY 4.0) 下载链接
形象
本文中的所有图片版权归 Sachin Date 所有,版权归 CC-BY-NC-SA 所有,除非图片下方提到了不同的来源和版权。
如果您喜欢这篇文章,请关注我的Sachin Date以获得关于回归、时间序列分析和预测主题的提示、操作方法和编程建议。**
Images
All images in this article are copyright Sachin Date under CC-BY-NC-SA, unless a different source and copyright are mentioned underneath the image.
If you liked this article, please follow me at Sachin Date to receive tips, how-tos and programming advice on topics devoted to regression, time series analysis, and forecasting.
什么是外生和内生回归变量?
原文:https://towardsdatascience.com/what-are-exogenous-and-endogenous-regression-variables-c0ea1ba03ce8
虽然外生性是一件好事,但内生性会让你的模型的有效性受到质疑
在本文中,我们将在回归分析的上下文中查看什么是外生和内生变量。我们还将解释当一个或多个回归变量变成内生变量时,你的回归模型会发生什么。我们将学习如何发现内生性,并且我们将触及一些处理它的方法。
让我们从这些术语的原始定义开始,然后通过使用真实世界的例子来发展我们对它们的直觉。
什么是外生变量?
考虑以下线性回归模型:
线性回归模型的方程(图片由作者提供)
以上模型中, y 为因变量。 X 是包含截距项占位符的解释变量矩阵, β 是回归系数的向量(包含截距β_ 0),是误差项的向量。
虽然 X 或许可以解释y 中的部分差异,但是中无法解释的差异的余额却不得不去向某处。那个‘某处’就是错误**。因此,误差项 ϵ 代表了模型的解释变量未能解释的所有因素对因变量的影响。****
我们进一步假设数据样本中有 n 个数据点, k 个回归变量。因此,【y】是一个大小为【n×1】β是一个大小为【k×1】的列向量,X 是一个大小为【n×k】的矩阵(其中包括 1s 的占位符列**
线性回归模型的矩阵版本(图片由作者提供)
样本中第行与第行的模型方程可以表示如下(其中 x_i_k 是第 k 个回归变量x_ k):
样本中第行和第行的回归模型方程(图片由作者提供)
有了这个设置,让我们开始定义感兴趣的内容。
在计量经济学中,尤其是在诸如等式(1)所示的回归模型的背景下,外生变量是与误差项不相关的解释变量。
在上述回归模型的上下文中,如果x_ k与【ϵ不相关,则回归变量x_ k是外生的。具体来说,对于数据集的任意给定行,**x _ k _ I的值应该与对应的误差 ϵ_i 不相关。 记住,在回归分析中,我们认为第行的第 k 个回归变量 x_k_i 的值以及相应的误差 ϵ_i 是随机变量。所以相关性的概念(或者在这种情况下,缺乏)适用于他们。**
这种不相关的结果是,误差项的*均值不受外部解释变量的影响(因此不是其函数)。换句话说,一个外生解释变量不携带关于模型误差的信息,因此不能用来预测(甚至不精确地)误差。
外生变量的例子
正如我们将很快在关于内生性的讨论中看到的,真正的外生解释变量很难获得。人们只需要足够努力地去发现解释变量和误差项之间的一些微妙的、潜在的联系。然而,让我们尝试用一个真实世界的例子来说明外来性。
2005 年是有史以来第二活跃的大西洋飓风季节,28 场大风暴在美国许多州造成了数十亿美元的财产损失。假设我们希望估计从 2005 年飓风季节之前到之后,飓风损害对大西洋沿岸各州房地产价格变化的影响。在下面的模型中,δPrice _ I是 2004-2006 年大西洋沿岸州 i 的房产*均销售价格的变化。 Hurricane_Affected_i 是一个二元(1/0)变量,表示状态 i 是否受到飓风的重大破坏, δ 是衡量 Hurricane_Affected_i 对δprice _ I .x_ Iβ和影响程度的系数我们希望初步估计 δ 。
一个治疗效果模型,用于估计飓风损害对房地产价格变化的影响(图片由作者提供)
让我们假设在跨越数百个飓风季节的时间尺度上,构成每个面向大西洋的州的区域经历大西洋飓风的重大财产损失的机会大致相同。根据这一假设,很容易看出,第 I 个面向大西洋的州是否会在 2005 年遭受重大财产损失,必须与模型误差项中包含的几乎任何因素无关。因此, Hurricane_Affected_i 与 ϵ_i 不相关,使得 Hurricane_Affected_i 成为外生变量。
这种情况的反过来产生一个内生变量。
什么是内生变量?
内生变量是回归模型中与误差项相关的任何变量。内生变量携带关于误差项的信息(反之亦然)。理论上,在给定内生变量的值的情况下,至少可以构造一个不精确的函数来预测误差的*均值。
在等式(1)所示的回归模型中,如果第 k 个回归变量x_ k是内生的,则对于数据集中的任何一行 i 都成立:
E(ϵ_i|x_k_i) = f(x_k_i) ,其中 f(。)是 x_k_i 的某个函数
误差项中的隐藏因素
由于相关性是双向的,看待内生性的另一种方式是想象回归模型的误差项影响内生回归变量的*均值。
根据这种观点,人们可以想象在模型的误差项中隐藏着一个或多个未观察到的因素。这些因素与模型的内生变量相关,因此,当这些隐藏因素的值发生变化时,所有相关内生变量的*均值也会发生变化。这进而改变了模型响应变量的*均值。请记住,模型的内生解释变量代表可观察的量,而误差项对于实验者来说是内在不可见的。因此,实验者观察到的是内生变量值的变化以及因变量观察值的相应变化。实验者没有意识到的是,至少一部分内生解释变量的变化是由误差项中隐藏的、未观察到的因素的变化引起的。
当你的模型中有内生变量时,你不知道的是,你的模型的误差项正在影响模型的响应,使用模型中的所有内生解释变量作为沟通渠道!
作为一个建模者,这不是一个好的状态,因为有很多好的理由。我们将在下面解释这些原因是什么。
考虑以下客车价格相对于发动机气缸数量的数据集:
价格与气缸数量。金点代表条件均值: E(价格|气缸数)(图片由作者提供)(数据集: UCI ML 汽车用在 CC BY 4.0 下
如果我们怀疑价格和气缸数量之间存在线性关系,我们可以使用以下模型来表示这种关系:
估计汽车价格的线性模型(图片由作者提供)
在上面的模型中, price 为因变量, num_of_cylinders 为单解释变量, β_1 为回归截距, β_2 为 num_of_cylinders 的系数, ϵ 为误差项。子脚本 i 表示样品中第排(排辆)的数量。
我们感兴趣的是估计第和第辆车的*均价格,给定它的气缸数,换句话说,价格对气缸数的条件期望</3-conditionals-every-data-scientist-should-know-1916d48b078a>**,表示为E(price _ I | num _ of _ cylinders _ I)。**
因为我们已经假设价格和钢瓶数量之间是线性关系,我们希望这个条件期望只是钢瓶数量的函数。因此,我们正在寻找一个汽缸数量(并且只有汽缸数量)的函数,该函数将产生条件*均价格 E(价格 _ i |汽缸数量 _i)。换句话说,我们正在寻求以下条件均值函数:**
第 I 辆汽车价格的条件均值函数(图片由作者提供)
如果我们应用期望算子 E(。)对等式(5)的两边,我们得到如下关系:**
在线性模型的两侧应用期望运算符(图片由作者提供)
在上式中,右侧的蓝色位简单地解析为 β_1 ,绿色位解析为β_ 2 气缸数量 i:*
汽车价格的条件均值(图片由作者提供)
唯一的方法,我们将能够建立一个可估计的线性模型,这种类型的方程。(6)是如果(7b)的 R.H.S .上的灰色项为零,即,
E(ϵ_i|num_of_cylinders_i)需要为零。
该条件期望是以气缸数量的特定值为条件的第辆的模型价格的误差*均值。**
该条件期望为零(或常数)的充分条件是误差与汽缸数量不相关,换句话说,如果汽缸数量是外生的。如果误差e(ϵ_i|num_of_cylinders_i)的条件均值是某个非零常数,我们可以简单地将其添加到模型的截距 β_0 中,等式(6)中我们期望的条件均值函数仍然是完整的。**
但是如果气缸数量 i 是内生的,等式(6)不再是正确的均值函数。我们不应该使用诸如最小二乘法之类的技术来使用等式(6)估计条件均值。如果我们仍然继续使用最小二乘法估计等式(6),我们将得到不正确的,具体地说,、回归系数的估计值*。*******
让我们更详细地研究这最后一点。
内生性对回归模型的影响
让我们重新看看等式(1)中的模型:
线性回归模型的方程(图片由作者提供)
假设第 k 个回归变量 x _k 是内生的,而变量 x _1 到x_(k-1)是外生的。利用这个假设,我们可以将 X 矩阵分成如下两个矩阵:****
- 一个大小为【n X(k-1)】的矩阵 X ,其中包含的变量X_ 1到X_(k-1)fromX均被假定为外生变量。***
- 一个列向量X_ k,大小【n×1】,包含×的第 k列。我们假设x_ k是内生的,即x_ k与误差 ϵ.相关********
我们将 X 矩阵与相乘,这是一个大小为 [(k-1) x 1] 的列向量,包含除了第 k 个系数之外的来自 β 的所有系数。注意,和前面一样, X 与的矩阵相乘产生一个大小为【n X 1】的列向量。对此,我们加上用第 k 个系数 β_k 缩放的【n×1】大小列向量x_ k,最后,我们将误差的【n×1】列向量加到这个总和上,从而产生【n×1】*列向量*****
我们将内生变量 x _k 放入其中的分区线性模型(图片由作者提供)
既然我们已经假设 x _k 与相关,那么【ϵ】中至少有一个隐藏因子与×x***_ k相关。这个隐藏的因素可以被认为是一个解释变量,实验者从模型中省略了它,仅仅是因为它不可观察或不可测量,因此不可能包括在内。假设这个省略的变量由 w. 表示*****
如果 w 包含在模型中,则理论上正确的模型如下:**
线性模型扩展到包括与内生变量 x _k 相关的假设因素 w (图片由作者提供)
其中所有变量 X *** ,X_ k和 w 现在都是外生的,因此,误差项 v 与它们中的任何一个都不相关。使用普通最小二乘法可以正确地估计该模型,并且所有估计的系数将是无偏的。**
不幸的是,这是一个不可能的模型,因为 w 无法观察到。我们必须估计的模型由等式给出。(8).
在上一篇关于 省略变量偏差 的文章中,我们已经看到:
- 如果回归模型中省略了解释变量,并且
- 被省略的变量与模型中的至少一个解释变量相关,
这种省略的效果是使模型中包含的所有变量的系数的估计值产生偏差。**
偏差量与忽略变量和模型中变量之间的相关量成正比,该变量与模型中剩余变量条件下的相关,与模型中剩余变量条件下的内生变量的方差成反比。
在我们的例子中,内生 x _k 与误差项【ϵ】之间的相关性可以解释为x_ k与假设变量 w 之间的相关性。由于 w 不可观测,它被有效地从模型中省略,导致模型中所有变量的系数偏离它们的真实值。**
isx*_ k与的相关性越大,估计的回归系数就越偏离它们的真实总体值。*****
量化这种偏差是可能的。当估计等式(9)中的理论模型时,估计的系数如下:
系数 β_k 的估计值,表示为其真值与偏差之和
在上面的等式中:
- E(β_cap_k) 是最小二乘法估计的第k 个系数的*均值,**
- β_k 是其真实群体值,
- **Cov(w,x_ k |【x_ 1、…x_(k-1)就是
- **Var(x_ k |【x_ 1、…x_(k-1)是 的条件方差x
可惜在实践中,这种偏差无法测量,原因很简单,实验者无法观察到 w 。
导致内生变量的情况
在文章的前面,我们碰巧提到内生变量很容易得到。这个事实会对最仔细的实验产生可怕的影响。这里有几个例子来说明内生性是多么容易渗入到你的回归模型中。
治疗效果模型
通常,人们感兴趣的是建立一个或多个解释变量和响应变量之间的关系,而不仅仅是相关性。人们想知道事件 A 是否导致事件 b吸烟会导致肺癌吗(会!)?常春藤盟校的教育会带来更高的终生收入吗(这个问题还没有定论)?有大量关于因果关系的文献。让我们考察一个这样的模型,在这个模型中,我们试图估计在常春藤盟校获得高 GPA(比如≥3.8/4.0)对一生收入的影响。该模型可以表述如下:
大学的高 GPA 对一生收入的影响(图片由作者提供)
X 是可能与研究相关的回归变量矩阵。 X 可能包含父母的教育程度、种族、性别等变量。 High_GPA 是一个二元(1/0)变量。它是模型中的“治疗”变量。我们的目的是估计 γ 的值。
假设我们将实验的范围限制为只包括来自常春藤盟校的学生。
问题是, 高 _GPA 是外生的吗?精英学校一直非常重视课程中的高度合作。人们可能会怀疑,那些性格特征有助于他们能够与其他学生有效合作的学生将能够从这项学校政策中获得最大的利益。这些学生甚至可能在大学的*均绩点上比其他学生更有优势。但是诸如开放、诚实、可爱、不内向、领导能力等特质。—可能有助于有效合作的因素也可能影响一个人获得和保持高薪职位或在大学毕业后成功经营企业的能力。所有这些特征在回归模型的定量设置中都是不可测量的,因此它们的影响隐藏在模型的误差项中。同时,它们似乎与可观察的解释变量 High_GPA 相关,从而使得 High_GPA 内生。可以有把握地假设这些人格特质与 High_GPA 之间存在正相关,因此等式(11)中 High_GPA 的估计系数会偏向其真实值的较高一侧。换句话说,实验者很可能高估了 高 _GPA 对 一生 _ 收益 的作用。
需要注意的是,即使实验者竭尽全力保证样本在模型的所有参数方面都是完美均衡的,估计出来的系数 High_GPA 仍然会有偏差。无论样本有多大,都是如此。不可避免地会高估高 GPA 对收入的影响。
非随机样本
考虑一个实验,该实验试图估计城镇成年居民每周饮用橙汁对每月普通感冒频率的影响。期望可能是两者之间的负相关之一。
为了招募志愿者,实验者在整个城镇张贴传单,比如超市外面、公共图书馆、公共汽车站等等。
不幸的是,由于内生性问题,这个实验可能注定要失败。
这些传单只张贴在户外,因此必然会被该镇的居家、身体或精神有障碍的居民拿不到。如果传单上的文字太小,年长的人可能看不到,或者读起来不够容易。不乘坐公共交通工具出行的人可能不太可能参与。总的来说,这组研究参与者可能是某一组身体健全的居民,他们经常出门,经常乘坐公共交通工具——很难称之为随机选择的样本。
如果这个模型中有一个收入变量,这个收入变量很可能与所有这些因素高度相关——居家、身体健康、不使用公共交通等。——实验者无法控制,因此其影响隐藏在误差项中。这将使模型中的收入内生。
如果一些相同的未观察到的因素与橙汁的周摄入量相关,那么周 _ 橙汁 _ 摄入量变量也是内生的。**
如果使用 OLS 估计当前形式的模型,所有变量的估计系数将偏离其真实值,从而系统地高估或低估每个变量对普通感冒发病率的影响。具体来说,实验者会高估或低估橙汁消费的真实效应(如果存在的话)对普通感冒频率的影响。
内生性补救措施
在文章的最后,我们将简要概述面对可变内生性时我们可用的技术和策略。我们将在后续文章中研究如何使用这些工具。它们如下:
- 如果我们怀疑假设为内生的变量与误差项中未观察到的因素没有很大的相关性,那么我们可以假设系数中产生的偏差将是轻微的。这可以从等式(10)看出。我们只能接受这种假定的温和程度的偏差。顺便提一下,回想一下,我们没有办法从数字上估计这种偏差。
- 我们可以选择使用一个或多个代理变量来代替隐藏在误差项中的未观察到的效应,从而将它们的效应从误差项中“拉”出来并放入模型中。一个代表的例子是教育的受教育年限(可测量)(不可测量),以及作为技能或能力(不可测量)的代表的智商分数(可测量)。我们将在下一篇文章中讨论代理的使用。
- 在时间序列模型、面板数据模型或治疗效果模型中,如果(疑似)内生变量不随时间变化,我们可以简单地用将它们差分出来。
- 称为工具变量(IV) 估计的强大估计技术可用于通过引入另一组称为工具的回归变量,分离出内生变量中可能与误差项相关的方差部分。我们将在下一篇文章中研究 IV 估计。
总结和关键要点
- 在计量经济学中,尤其是在回归模型的背景下,外生变量是与误差项不相关的解释变量。
- 内生变量是回归模型中与误差项相关的任何变量。根据定义,回归模型的因变量 y 总是内生的。
- 当回归模型包含一个或多个内生解释变量时,模型的误差项通过所有内生解释变量影响模型的响应。
- 当使用最小二乘法估计包含内生解释变量的回归模型时,估计的系数偏离其真实总体值。
- 内生性很容易被引入到实验设计中,当它出现时,会破坏实验结果的有用性。
- 如果怀疑内生性严重,可以使用代理变量、差分和工具变量等技术进行控制。
参考文献、引文和版权
数据集
汽车数据集来源于 4.0 的 CC 下的 UCI ML 数据集库。
形象
本文中的所有图片版权归 Sachin Date 所有,版权归 CC-BY-NC-SA 所有,除非图片下方提到了不同的来源和版权。
如果您喜欢这篇文章,请关注我的Sachin Date以获得关于回归、时间序列分析和预测主题的提示、操作方法和编程建议。
计算机视觉中的内在和外在相机参数是什么?
在可视化的帮助下,详细解释内部和外部摄像机参数
I mages 是最*深度学习模型中最常用的数据之一。相机是用来捕捉图像的传感器。他们把世界上的点投影到一个 2D *面上,这个*面就是我们看到的图像。在本文中,我们将介绍在此过程中发生的完整转换。
这种转化通常分为两部分: 外在和内在。 摄像机的外部参数取决于摄像机的位置和方位,与摄像机的内部参数如焦距、视野等无关。另一方面,相机的内在参数取决于它如何捕捉图像。诸如焦距、光圈、视野、分辨率等参数控制相机模型的固有矩阵。
这些外部和非外部参数是将点从一个坐标系转换到另一个坐标系的变换矩阵。为了理解这些变换,我们首先需要了解成像中使用的不同坐标系是什么。
CV 中常用的坐标系
作者图片
计算机视觉中常用的坐标系有
- 世界坐标系(3D)
- 摄像机坐标系(3D)
- 图像坐标系(2D)
- 像素坐标系(2D)
外矩阵是从世界坐标系到摄像机坐标系的变换矩阵,而内矩阵是将点从摄像机坐标系转换到像素坐标系的变换矩阵。
世界坐标系(3D):
【Xw,Yw,Zw】:是任意原点的 3D 基础笛卡尔坐标系。例如房间的特定角落。这个坐标系中的一个点可以表示为 Pw = (Xw,Yw,Zw)。
作者图片
物体/摄像机坐标系(3D):
【Xc,Yc,Zc】:相对于物体/摄像机的原点/方向进行测量的坐标系。相机坐标系的 z 轴通常面向相机镜头(相机主轴)的外部或内部,如上图所示(z 轴面向相机镜头的内部)。通过旋转和*移操作,可以从世界坐标系转换到工件坐标系(反之亦然)。
作者图片
将点从世界坐标系转换到摄像机坐标系的 4x4 变换矩阵被称为摄像机外部矩阵。如果摄像机的物理位置/方向改变(例如移动汽车上的摄像机),摄像机外部矩阵也会改变。
作者图片
图像坐标系(2D)[针丨孔丨模型]:
【Xi,易】:2D 坐标系,将相机坐标系中的 3D 点投影到具有针丨孔丨模型的相机的 2D *面(通常垂直于相机坐标系的 z 轴-在下图中显示为黄色*面)上。
作者图片
光线通过相机开口的中心,投射到另一端的 2D *面上。2D *面是照相机捕捉到的图像。这是一种有损变换,这意味着将点从相机坐标系投影到 2D *面是不可逆的(深度信息会丢失,因此通过查看相机捕捉的图像,我们无法判断点的实际深度)。这些点的 X 和 Y 坐标被投影到 2D *面上。2D *面距离相机的距离为 f(焦距)。投影,Yi 可由相似三角形定律求出(进入和离开相机中心的光线与 x 轴和 y 轴的夹角相同,分别为α和β)。
作者图片
作者图片
作者图片
因此,在矩阵形式中,我们有以下从相机坐标系到图像坐标系的变换矩阵。
作者图片
这个变换(从摄像机到图像坐标系)是摄像机固有矩阵的第一部分。
像素坐标系(2D):
【u,v】:表示将图像坐标系中的点离散化后的整数值。图像的像素坐标是一定范围内的离散值,可以通过将图像坐标除以像素宽度和高度(相机的参数—单位:米/像素)来实现。
作者图片
像素坐标系的原点在左上角,因此在离散化的同时还需要一个*移运算符(c_x,c_y)。
作者图片
从图像坐标系到像素坐标系的完整变换可以以如下矩阵形式示出
作者图片
有时,2D 图像*面不是矩形,而是倾斜的,即 X 轴和 Y 轴之间的角度不是 90 度。在这种情况下,需要执行另一个变换以从矩形*面到斜面(在执行从图像到像素坐标系的变换之前)。如果 x 轴和 y 轴之间的角度是θ,那么将点从理想的矩形*面转换到斜面的变换可以如下找到
作者图片
这两个变换矩阵,即从直角图像坐标系到倾斜图像坐标系的变换和倾斜图像坐标系到像素坐标系的变换,构成了摄像机固有矩阵的第二部分。
组合三个变换矩阵产生如下所示的相机外部矩阵
作者图片
作者图片
作者图片
总结:
转换:
- 世界到摄像机: 3D-3D 投影。旋转、缩放、*移
- 相机转图像:3D 2D 投影。信息丢失。取决于相机型号及其参数(针丨孔丨、f-theta 等)
- 图像到像素: 2D-2D 投影。连续到离散。量子化和原点移位。
相机矩阵—作者提供的图片
摄像机外部矩阵(世界到摄像机):
将点从世界坐标系转换到相机坐标系。取决于摄像机的位置和方向。
相机固有矩阵(相机到图像,图像到像素):
将点从相机坐标系转换到像素坐标系。取决于相机属性(如焦距、像素尺寸、分辨率等。)
什么是模型不可知的方法?
原文:https://towardsdatascience.com/what-are-model-agnostic-methods-387b0e8441ef
所有强大的方法都可以用于任何模型
不可知论者思考上帝的存在。谢天谢地,机器学习还没有完全实现。当我们谈到不可知论方法时,我们指的是可以用于任何模型的方法。我们将详细阐述这个定义,重点是可解释性的不可知论方法。我们将讨论这些可解释性方法的不同分类。这是全球与地方的解释和置换与替代模型。一些方法不是模型不可知的。我们将通过讨论这些来结束。
来源: flaticon
模型不可知的方法
模型不可知的方法可以应用于任何模型。当使用模型不可知的方法时,在模型被训练之后,它可以被视为一个黑盒。换句话说,该方法不要求我们研究模型的内部工作。如果我们想在不同的模型上使用该方法,我们只需将它们交换出来。但是方法做什么呢?
首先,大多数 评估 度量是模型不可知的。以图 1 中的精度计算为例。我们首先使用模型对测试集进行预测。那么准确度就是预测正确的实际值的百分比。为了进行这种计算,我们只需将试验数据与预测值进行比较。有些模型可能比其他模型更精确,但计算结果是一样的。其他评估指标,如精确度、召回率和均方误差,都是与模型无关的。
图 1:精确度计算概述(来源:作者)
在选择模型时,模型不可知的评估方法提供了灵活性。您不必为每个模型类型开发不同的评估框架。这也允许您使用相同的指标来比较许多模型。当您想要比较模型性能时,这种一致性是非常重要的。
可解释的机器学习
在实践中,将 评估 度量称为模型不可知的并不常见。当我们谈论 可解释的 ML 或 可解释的 AI 方法时,这个术语最为突出。这些用于理解模型如何做出预测。我们将讨论这些方法的几个例子,以及如何对它们进行分类/分组。最后,我们将讨论一些方法在理论上是不可知论的,但在实践中并不总是如此。
可解释 ML 方法分类概述
全局方法与局部方法
我们对模型不可知方法进行分类的第一种方式是根据它们试图解释的内容。 局部 解读旨在理解个体预测是如何做出的。这就是每个模型特征改变预测的方式。我们可以使用 全局 解释来解释模型如何从整体上做出预测。这意味着我们只能对所有预测的趋势做出断言。
为了更好地理解这一点,我们在图 2 中举了一个部分依赖图(PDP)的例子。这是一种常见的 全局 可解释性方法。该图是为用于预测二手车价格的模型而创建的。在 x 轴上,我们有对汽车进行的 修理 的次数。y 轴(部分 yhat)给出*均预测价格。由此可见,汽车价格往往与维修次数成非线性关系。然而,我们不能对每辆车说同样的话。
图 2:PDP 的示例
我们不会详细介绍我们是如何创建这个 PDP 的。如果你感兴趣,下面的文章会很有用。它带你一步一步地了解情节是如何创建的。我们还讨论了其他全局模型不可知的方法。那就是互信息和特征重要性。
对于 局部 的诠释,SHAP 是一种常见的方法。在图 3 中,您可以看到单个预测的 SHAP 瀑布图。这是一个用来预测鲍鱼壳年轮数量的模型。这里我们将模型的预测值 f(x)与*均预测值 E[f(x)]进行比较。我们可以看到每个特征是如何影响预测的。例如, 剥壳重量 的值使预测的环数增加了 1.81。
图 3:SHAP 瀑布图的例子
所以我们可以看到 SHAP 是如何被用来解释个人预测的。我们还可以聚合 SHAP 值,以了解模型如何从整体上进行预测。从这个意义上说,地方和全球解释之间的界限可能会模糊。你可以在图 4 的蜂群图中看到这样的例子。在这里,我们绘制了模型所做的所有预测的 SHAP 值。
图 4:使用蜂群图来聚集 SHAP 值
蜂群图只是我们聚集 SHAP 值的方法之一。下面的视频讨论了一些其他有用的聚合。我们将深入探讨如何解读这些图表。如果你想要更多,那就来看看我的 SHAP 课程 。注册我的 简讯 :)即可免费获取
置换与替代模型
我们对解释方法进行分类的第二种方式是根据它们是如何计算的。 置换 方法涉及改变输入数据和测量模型预测的变化。这就是上面的 PDP 是如何创建的。对于每辆车,我们更改/置换了 维修 特征值,并记录了模型预测。然后我们取每个 修理 值的*均预测值。冰图、特征重要性和 SHAP 等其他方法都是排列方法。
另一种方法使用 代理模型 ,您可以在图 5 中看到一个概述。在这里,模型首先被训练并用于进行预测。然后使用原始模型的预测来训练代理模型。也就是代替目标变量。重要的是,代理模型是一个内在可解释的模型。这些模型,如线性回归或决策树,不需要像 SHAP/PDP 这样的技术。它们可以通过直接查看模型的结构或参数来解释。
图 5:代理模型方法概述
最终,我们可以通过直接解释替代模型来理解原始模型的预测。如果我们对所有预测都这样做,它被称为 全局代理模型 。与其他全局方法一样,这些方法可以帮助我们从整体上理解原始模型。其他方法,比如 LIME,可以用来创建 局部代理模型 。这些组合排列和代理模型来训练模型对个人的预测。
原则与实践中的模型不可知
我们讨论的所有方法在理论上都是模型不可知的。为了实际使用它们,我们需要实现它们。一个实现不一定支持所有的建模包。例如,Friedman 的 h-statistic 是一种用于突出模型中重要交互的方法。在 Python 中,该方法没有与模型无关的实现。据我所知,scikit-learn 梯度增强模型只有一个实现。
当谈到 SHAP 时,另一个考虑是有不同的方法来*似这些值。KernelSHAP 是一个真正的模型不可知的方法。但是,它明显比 TreeSHAP 慢。缺点是 TreeSHAP 只能和基于树的算法一起使用。这意味着如果你想节省时间,你需要限制自己使用这些算法。
有了 SHAP,也有可能扩展这种方法。也就是说,一个特征的贡献可以分解为它的主要和交互作用。这使我们能够分析数据中的相互作用。但是,这种实现只适用于基于树的算法。这是因为我们上面提到的计算成本。估计主效应和交互效应需要的时间太长了。
非不可知方法
不可知论方法的好处意味着它们是常见的。还有一些方法只能用于特定的模型。首先,我们在上面提到了固有的可解释模型。这些都可以直接解读。然而,它们的精确解释方式将取决于您使用的模型。
这方面的一个例子可以在下面的文章中找到。在这里,我们建立了一个模型来预测推文的情绪。这是使用单词袋方法和支持向量机(SVM)完成的。通过训练 SVM 的过程,训练集中的每个 N 元语法被赋予一个权重。我们通过查看这些权重来解释 SVM,从而结束本文。
您可以在图 6 中看到这些权重的一些示例。具有正权重的 n-gram 与积极情绪相关联。换句话说,如果一条推文包含这些词中的一个,我们更有可能预测到积极的情绪。同样,那些负权重的人与消极情绪有关。也有单词没有关联情感的情况。
图 6:情绪分析模型的 SVM 参数权重
以这种方式解释 SVM 是一种非不可知论的方法。我们将无法解释像决策树或随机森林这样的模型。这是因为它们没有参数权重。同样,它也不适用于神经网络。这些模型可能有参数权重,但它们太复杂,无法以这种方式可视化。
非不可知论的方法也已经被开发用于不可内在解释的模型。由于深度学习的成功,这对于神经网络来说是最常见的。一些方法包括逐像素分解和深度提升。最终,这些方法只能用于神经网络。在某些情况下,它们只能用于特定的神经网络架构。
我希望这篇文章对你有帮助!你可以成为我的 推荐会员 来支持我。你可以访问 Medium 上的所有文章,我可以得到你的部分费用。
https://conorosullyds.medium.com/membership
你可以在|Twitter|YouTube|时事通讯上找到我——注册免费参加 Python SHAP 课程
图像来源
所有图片都是我自己的或从www.flaticon.com获得。在后者的情况下,我拥有他们的保费计划中定义的“完全许可”。
参考
M.T. Ribeiro,S. Singh 和 C. Guestrin,机器学习的模型不可知可解释性【https://arxiv.org/abs/1606.05386(2016)
C.Molnar,可解释机器学习(2021)https://christophm . github . io/Interpretable-ml-book/shap . html
亨尼·德·哈德 解释任何机器学习模型的模型不可知方法(2020)https://towardsdatascience . com/Model-Agnostic-Methods-for-Interpreting-any-Machine-Learning-Model-4f 10787 ef 504
什么是 PCA 加载,如何有效地使用双标图?
原文:https://towardsdatascience.com/what-are-pca-loadings-and-biplots-9a7897f2e559
充分利用主成分分析的实用指南。
(图片由作者提供)
主成分分析是最著名的(大)数据分析技术。然而,解释低维空间中的差异仍然具有挑战性。理解载荷和解释双标图是任何使用 PCA 的人必须知道的部分。在这里,我将解释 I)如何解释深入洞察的负载,以(直观地)解释数据中的差异,ii)如何选择最具信息性的特征,iii)如何创建有洞察力的图,以及最后如何检测异常值。理论背景将由实际操作指南支持,帮助您利用 pca 充分利用数据。
如果你觉得这篇文章很有帮助,可以使用我的 推荐链接 继续无限制学习,并注册成为中级会员。另外, 关注我 关注我的最新内容!
介绍
在本博客的最后,你可以(直观地)解释数据中的差异,选择最有信息的特征,并创建有洞察力的图表。我们将讨论以下主题:
- 特征选择对提取。
- 使用 PCA 进行尺寸缩减。
- 解释了 、和小块图。
- 加载和双标图。
- 提取最具信息性的特征。
- 离群点检测。
PCA 的温和介绍。
主成分分析的主要目的是通过最小化信息损失来降低数据集中的维数。一般来说,降维有两种方式: 特征选择 和 特征提取 。其中,后者用于 PCA,其中基于原始特征的(线性)组合构建一组新的维度或潜在变量。在 特征选择 的情况下,选择一个特征子集,该子集将为前面的任务提供信息。无论您选择哪种技术,降维都是重要的一步,原因有几个,例如降低复杂性、提高运行时间、确定特性重要性、可视化类信息,以及最后但同样重要的是防止 降维的灾难。 这意味着,对于给定的样本大小,超过一定数量的特征,分类器的性能将会下降,而不是提高(图 1)。在大多数情况下,低维空间会导致更精确的映射,并补偿信息的“损失”。
在下一节中,我将解释如何在特征选择和特征提取技术之间进行选择,因为有理由在这两者之间进行选择。
图一。作为维度函数的(分类)模型的性能。(图片由作者提供)
特征选择。
特征选择在许多情况下是必要的;1*。 如果特征不是数字(如字符串)。2.以防需要提取有意义的特征。3.保持测量值不变(转换会将测量值和要丢失的单位进行线性组合)。的缺点**是特征选择过程确实需要搜索策略和/或 目标函数来评估和选择潜在的候选者。例如,它可能需要一种使用类别信息的监督方法来执行统计测试,或者需要一种交叉验证方法来选择信息最丰富的特征。然而,特征选择也可以在没有类别信息的情况下完成,例如通过选择方差上的前 N 个特征(越高越好)。*
图二。特性选择程序的示意图。(图片由作者提供)
特征提取。
特征提取方法可以减少维数,同时最大限度地减少信息损失。为此,我们需要一个转换函数; y=f(x) 。在 PCA 的情况下,变换限于线性函数,我们可以将其重写为一组权重,组成变换步骤;* y=Wx, 其中 W 为权重,x 为输入特征,y 为最终变换后的特征空间。请参见下面的示意图,演示转换步骤和数学步骤。*
图 3。将输入数据线性转换为 y=Wx 形式的特征提取过程的示意图。(图片由作者提供)
PCA 的线性变换也有一些缺点。这将使特性更难解释,有时甚至对某些用例的后续工作毫无用处。例如,如果使用特征提取技术发现了潜在的癌症相关基因,则可以描述该基因与其他基因一起部分参与。实验室中的后续研究没有意义,例如,部分敲除/激活基因。
PCA 是如何降维的?
我们可以将 PCA 分解成大致四个部分,我将举例说明。
第一部分。将数据围绕原点居中。
第一部分是计算数据的*均值(如图 4 所示),这可以通过四个较小的步骤来完成。首先通过计算每个特征的*均值 (1 和 2) ,然后计算中心( 3 )。我们现在可以移动数据,使其以原点为中心( 4 )。请注意,此变换步骤不会改变点之间的相对距离,而只是将数据集中在原点周围。
图 4:以零为中心的数据。(图片由作者提供)
第二部分。通过原点和数据点拟合直线。
下一步是拟合一条穿过原点和数据点(或样本)的线。这可以通过 1。通过原点画一条随机线,2。将样本正交投影到直线上,然后 3 .旋转直到通过最小化距离找到最佳匹配。然而,最大化投影数据点到原点的距离更实际,这将导致相同的结果。使用距离*方和(SS)计算拟合,因为它将消除线周围数据点的方向。在这一点上(图 5),我们在方差最大的方向上拟合了一条线。**
图 5:找到最合适的。从一条随机线(顶部)开始,通过最小化从数据点到线(底部)的距离,旋转直到它最适合数据。(图片由作者提供)
第三部分。计算主成分和载荷。
我们在变化最大的方向上确定了最佳拟合线,现在是第个主成分或 PC1 。下一步是计算 PC1 的斜率,该斜率描述了每个特征对 PC1 的贡献。在这个例子中,我们可以直观地观察到数据点在特征 1 上比在特征 2 上分散得更多(图 6)。红线的斜率代表我们的视觉观察;我们每穿过特征 1(向右)2 个单位,它就在特征 2 的轴上向下移动 1 个单位。换句话说,要制作 PC1(红线),我们需要特征 1 的 2 部分和特征 2 的-1 部分。我们可以将这些"部分"描述为向量 b 和 c ,然后我们可以用它们来计算向量 a向量 a 将得到值 2.23(见图 6)。这就是我们所说的这台特殊电脑的特征向量。****
但是,我们需要向所谓的“单位向量标准化,这是通过将所有向量除以 a =2.23 得到的。这样向量 b =2/2.23=0.85,向量 c =1/2.23=0.44,向量 a=1 ( 又名单位向量)。因此,换句话说,这些向量的范围在-1 和 1 之间。例如,如果向量 b* 非常大,比如值趋向于 1,则意味着特征 1 几乎全部贡献给 PC1。***
图 6:计算 PC1 和 PC2 并确定负载。(图片由作者提供)
下一步是确定 PC2,它是一条穿过原点并垂直于第一个 PC 的线。在本例中,只有两个特征,但如果有更多特征,第三条 PC 将成为通过原点并垂直于 PC1 和 PC2 的最佳拟合线。如前所述:新的潜在变量,又名 PCs,是初始特征的线性组合。PC 中使用的每个特征的比例称为系数。**
装货
重要的是要认识到主成分的可解释性较差,并且没有任何实际意义,因为它们是由初始变量的线性组合构成的。但是我们可以分析描述独立变量重要性的载荷。载荷是从数值的角度来看的,等于变量的系数,并提供了哪些变量对构件的贡献最大的信息。
- 负载范围从-1 到 1。
- 高绝对值(接* 1 或-1)表示变量强烈影响组件。接* 0 的值表示变量对组件的影响很小。
- 负荷的符号(+或-)表示变量和主成分是正相关还是负相关。
第四部分。转换和解释方差。
我们计算了 PCs,现在可以旋转(或变换)整个数据集,使 x 轴是方差最大的方向(也称为 PC1)。注意,转换步骤将导致原始特征的值将丢失。相反,每个 PC 将包含总变化的一部分,但是用 解释的方差 我们可以描述每个 PC 包含多少方差。为了计算解释的方差,我们可以将每台电脑的距离*方和(SS)除以数据点数减 1。**
图 7。整个数据集的转换和确定计算解释的方差。(图片由作者提供)。
第 0 部分。标准化
在我们做第 1 到第 4 部分之前,通过标准化获得正确的数据是至关重要的,因此这应该是第一部分。因为我们搜索具有最大方差的方向,所以 PCA 对具有不同值范围的变量或异常值的存在非常敏感。如果初始变量的范围差异较大,则范围较大的变量将优于范围较小的变量。我将在下一节演示这一点。为了防止这种情况,我们需要将初始变量的范围标准化,以便每个变量对分析的贡献相等。我们可以通过减去*均值并除以每个变量的每个值的标准偏差来实现。标准化包括重新缩放要素,使其具有均值为零、标准差为一的标准正态分布的属性。这也称为 z 分数标准化,Scikit-learn 为此使用了 StandardScaler()。一旦标准化完成,所有的变量都应该在同一尺度上。**
PCA 库。
关于用于即将到来的分析的 p ca 库的一些话。 p ca 库旨在应对一些挑战,例如:
- 分析不同类型的数据。 除了常规 PCA 之外,该库还包括 稀疏 PCA ,其稀疏度可以通过 L1 惩罚系数来控制。还有一种 截断 SVD 可以有效地处理稀疏矩阵,因为它在计算奇异值分解之前不将数据居中。
- 计算并绘制被解释的方差。 拟合数据后,可以绘制出被解释的方差:screeplot。
- 提取性能最好的特征。 模型返回性能最好的特征。
- 洞察双标图的加载情况。 检索与 PCs 相关的类的特征和可分性的变化的更多见解。
- 离群点检测。可以使用两种众所周知的方法来检测异常值: 【霍特林-和 SPE-Dmodx。
- 去除不需要的(技术)偏差。数据可以通过从原始数据集中去除(技术)偏差的方式进行标准化。**
PCA相比其他实现有什么好处?**
理解载荷的实际例子。
让我们从一个简单直观的例子开始,演示负载、解释的方差和最重要特征的提取。
首先,我们需要安装pca库。**
*****pip install pca*****
创建合成数据集。
出于演示目的,我将创建一个包含 8 个要素和 250 个样本的合成数据集。每个要素将包含随机整数,但方差不断增加。所有功能都是相互独立的。特性 1 将包含[0,100]范围内的整数(因此方差最大),特性 2 将包含[0,50]范围内的整数,特性 3 包含[0,25]范围内的整数,依此类推(参见下面的代码块)。为了举例,我将 而不是 将数据归一化来演示原理。 这个数据集现在理想为 1。演示 PCA 的原理,2。演示负载和解释的差异,以及 3。标准化的重要性(或缺乏标准化)。 在我们继续之前,我想再重复一遍:在处理真实世界的数据集时,建议仔细查看您的数据并进行相应的归一化,以使每个要素达到相同的比例。
如果我们绘制 8 个特征的直方图,我们可以看到特征 1(灰色)的方差最大,其次是粉红色(特征 2),然后是褐色(特征 3),等等。最小的方差出现在红色条中(特征 8)。
图 8。8 个独立特征的直方图(图片由作者提供)。
我们应该期待发现什么?
**在我们对这个受控示例数据集进行 PCA 分析之前,让我们想一想我们应该期望发现什么。首先,通过 PCA 分析,我们旨在以这样一种方式转换空间,即具有最大方差的特征将显示在第一分量中。在这个数据集中,我们很容易知道哪些特征包含最大的方差。我们期望如下:
- 高维空间的旋转将以这样的方式进行,即特征 1 将是第一主分量(PC1)的主要贡献者。
- 根据 PCA 方法,第二主成分(PC2)应该垂直于 PC1,穿过原点,并且在具有第二大方差的方向上移动。最大的贡献来自特征 2。
- 第三个主成分(PC3)应垂直于 PC1 和 PC2,并且方向的方差第三大。在我们的例子中,我们知道特性 3 将是主要的贡献者。
总而言之,我们预计功能 1、2 和 3 将分别成为 PC1、PC2 和 PC3 的主要贡献者。我们应该能够通过使用载荷和双标图来确认我们的预期。**
我们如何将负载可视化?
载荷用有一定角度和长度的箭头来表示。 该角度代表特定特征在 PCs 贡献方向上的贡献。箭头的长度描述了该特征在该方向上的贡献强度。在 2D 图中,(*)水*箭头(沿 x 轴)描述了该特征对 PC1 的贡献。另一方面,垂直箭头描述了一个特征对 y 轴的贡献最大,并且朝向 PC2。某个角度下的箭头描述了特定特征在该方向上对各种 PCs 的贡献。箭头的长度描绘了特定 PC 中特征的或。在我们的示例中,我们预计特征 1 对 PC1、的贡献最大,并且几乎是水*的,因此将获得接*绝对值 1 的值。特征 2 对 PC2 的贡献最大,并且几乎垂直,其值接*绝对值 1。特征 3 对 PC3 的贡献最大,并将位于 z 轴方向。,并得到一个接*绝对 1 的值。******
PCA 结果。
我们从理论上解释了我们应该期待什么,现在我们可以计算主成分及其载荷和解释的方差。对于这个例子,我将用n_components=None
初始化 pca,因此不会删除任何 PC。请注意,默认值为:n_components=0.95
,它表示 PCs 的减少量高达解释方差的 95%。
拟合和转换数据后,我们可以开始研究数据的特征和变化。首先,我们可以用所谓的 scree plot (图 9)来检验被解释的(累积的)方差。我们可以看到,PC1 和 PC2 覆盖了超过 95%的变化,前 3 台 PC 覆盖了总变化的 99.64%。pca 库中的默认设置是只有 PC 保持高达 95%的解释方差(因此在这种情况下是前 3 个)。如果我们一开始就将数据标准化(我们使用的是随机数据),就会出现这种情况。**
图 9。带有(累积)解释方差的 Scree 图(图片由作者提供)。
样品的二维图如图 10 所示。这里我们看到样本是均匀分布的。请注意,这些值在 x 轴和 y 轴之间变化很大。
图 10。PC1 和 PC2 的随机数据的二维图。左图:每个样品都有不同的标签和颜色,因为没有给出类别信息。右图:我们可以删除图例和标签,并设置最大装载数量(红色箭头)。(图片由作者提供)
让我们只关注载荷,并从图中移除散布(图 11,通过设置参数cmap=None
)。我们可以清楚地看到,第一主成分的最大贡献者是特征 1,因为箭头几乎是水*的,并且具有几乎-1 (-0.99)的负载。我们在 PC2 的功能 2 和 PC3 的功能 3 中看到了类似的行为,但对于 PC3,我们需要绘制一个 3D 图来查看前 3 个功能。
图 11。负荷的二维和三维图。(图片由作者提供)。
注意,所有这些结果也存储在模型的输出中,如上面的代码块所示。此时,我们现在可以用箭头、角度、长度和相关特征来解释载荷。你应该意识到我们使用了随机整数,并且仍然可以找到潜在的“有趣的”PCs 贡献者。如果不进行归一化,范围最大的特征将具有最大的方差,并且是最重要的特征。通过归一化,在随机数据的情况下,所有要素都将具有或多或少相似的贡献。 分析数据的时候一定要深思熟虑。**
在下一节中,我们将分析一个真实的数据集,看看载荷是如何表现的以及如何解释的。
葡萄酒数据集。
到目前为止,我们已经使用了一个合成数据集来理解在一个受控的数据集中载荷是如何表现的。在这一节中,我们将分析一个更现实的数据集,并描述特征在高维空间中的行为和贡献。我们将导入 葡萄酒数据集 ,并创建一个包含 178 个样本的数据框,包含 13 个特征和 3 个葡萄酒类别。**
特征的范围差别很大,因此标准化步骤很重要。标准化步骤是 pca 库 中的内置功能,可以由normalize=True.
轻松设置。出于演示目的,我将设置n_components=None
以将所有 PC 保留在模型中。
在拟合和转换之后,我们可以输出存储在关键字“ topfeat ”中的最佳性能特征。这里我们可以看到哪些变量对哪些 PCs 的贡献最大。使用 scree 图,我们可以检查在 PCs 中捕获的方差。在图 12 中,我们可以看到 PC1 和 PC2 一起覆盖了数据集中几乎 60%的变化。那很好!我们还看到,我们需要 10 台电脑来捕捉> 95%的变化。
图 12。Scree plot 葡萄酒数据集(图片由作者提供)。
如果我们制作双绘图并给三个类着色,我们可以直接注意到前两个 PC 很好地将三个类分开。第一台 PC 捕获了 36.1%的变化,第二台 PC 捕获了 19.2%。加载现在将帮助我们更深入地检查变量是如何对 PCs 起作用的,以及类是如何被分开的。对 x 轴贡献最大的特征,因此对于 PC1 是 类黄酮 ,而对于 PC2(y 轴),最大的贡献来自变量 颜色 _ 强度 。角度较宽的特征,如 色相 和 苹果酸 对 PC1 和 PC2 有部分贡献。
图 13。葡萄酒数据集的双标图。样本根据类别信息进行着色。(图片由作者提供)。
让我们开始更深入地研究促成 PC1 的类黄酮变量。类黄酮的箭头角度为正,几乎水*,得分为 0.422。这表明 x 轴上的一些差异应该来自于类黄酮变量。或者换句话说,如果我们使用黄酮类化合物值给样品着色,我们应该会发现左边的值较低,右边的值较高。我们可以很容易地对此进行如下研究:****
图 14。葡萄酒数据集的双标图。样品上有颜色类黄酮值(图片由作者提供)。**
事实上,很高兴看到样本的左边是蓝色(低值),右边是红色(高值)。因此,加载准确地描述了沿 x 轴贡献最大的特征以及取值范围。
正负荷表示变量和主成分正相关,而负负荷表示负相关。当载荷很大时,(+或-),它表明一个变量对主分量有很大的影响。
我们再拍一张。对 PC2 贡献最大的是 color_intensity。这个箭头是向下的,我们应该预料到这些值与 PC2 是负相关的。或者换句话说,具有高颜色强度值的样本被期望在底部,而低值在顶部。如果我们现在使用 color_intensity 给样本着色(图 15),很明显变化确实是沿着 y 轴的。**
图 14。葡萄酒数据集的双标图。样本根据 color_intensity 值着色(图片由作者提供)。
我们也来看看镁装。该变量的加载角度更大,并且方向向下,这意味着它对 PC1 和 PC2 有部分贡献。创建 3D 图并根据镁值对样本进行着色,可以清楚地看出 PC3 沿线也捕捉到了一些变化。**
图 14。葡萄酒数据集的双标图。样品在镁值上着色(图片由作者提供)。**
除了给样品着色之外,还可以在其他维度上进一步研究样品,例如第 4、第 5 等 PCs 及其负载。通过这些分析,我们对变量的变化有了更多的直觉,我们甚至可以假设这些类是如何分开的。所有这些见解都是讨论可能的后续步骤和设定一些期望的极好起点。
异常值检测。
pca 库包含两种检测离群点的方法: 霍特林的 T2 和 SPE/DmodX 。霍特林的 T2 通过计算卡方检验来工作,而 SPE/DmodX 方法基于前 2 个样本的*均值和协方差。这两种方法在方法上是互补的,因此计算重叠可以指出最不正常的观察结果。当我们分析葡萄酒数据集时,我们检测到方法之间有三个重叠的异常值。如果您需要调查异常值,这将是一个很好的开始。或者,对于霍特林 T2 法,离群值可以排列为y_proba
(越低越好),对于 SPE/DmodX 法,可以排列为y_score_spe
(越大越好)。
图 15。使用 SPE/DmodX 方法检测到的异常值用菱形表示。使用霍特林 T2 方法检测到的异常值用十字表示。(图片由作者提供)
结束了。
每个 PC 是一个线性向量,包含原始特征的贡献比例。每个变量对主成分的贡献的解释可以使用加载进行检索,并用双标图进行可视化。这种分析将给出关于变量变化和类可分性的直觉。这将有助于形成良好的理解,并可以为讨论后续步骤提供一个极好的起点。例如,您可以质疑是否需要使用高级机器学习技术来预测特定类别,或者我们是否可以对特定变量设置单个阈值来进行类别预测。
此外, pca 库提供了使用霍特林 T2 测试和 SPE/Dmodx 方法移除异常值的功能。我没有去去除不需要的(技术)差异(或偏差),但这可以通过使用标准化策略来完成。
这就是了。如果有不清楚的地方或者有进一步完善 pca 库的建议请告诉我!
注意安全。保持冷静。
欢呼,E.
如果你觉得这篇文章很有帮助,可以使用我的 推荐链接 继续无限制学习,并注册成为中级会员。另外, 关注我 关注我的最新内容!
软件
我们连线吧!
深度学习中的连体神经网络有哪些?
原文:https://towardsdatascience.com/what-are-siamese-neural-networks-in-deep-learning-bb092f749dcb
你确定你需要图像分类而不是连体网络吗?
作者制作的图像
连体神经网络
了解两个数据点之间的相似性非常有用。
想象一个面部识别系统,其中有一个摄像头捕捉你的面部,然后面部识别系统应该根据面部数据库来识别你是否被允许进入建筑物。
试图使用纯分类来构建这样一个系统是不可行的。
你可以使用的是连体神经网络或简称 SNNs。
连体神经网络由两个相同的子网组成,输出两个嵌入。这些嵌入然后被用作损失函数的输入。
该损失函数被设计为最小化相似输入之间的距离(属于同一个人的两个面部的两个图像)和最大化不相似输入之间的距离(两个不同人的两个面部)。
下面是一个 SNN 建筑的例子。
来自图章纸的连体建筑[2]
连体神经网络变得不可或缺
这种类型的架构哪里可以很厉害?为什么在某些情况下你更喜欢它而不是分类?
为了理解这一点,想象以下场景:您想要构建一个人脸识别系统。你有一些限制:
- 你的数据库里每个人的面部只有大约 10 张照片。
- 你没有不属于你数据库的人的面孔。
你的系统应该能够根据一个人的脸是否是你的数据库的一部分来告诉你他/她何时被允许进入大楼。
使用纯分类建立这样一个系统是不可能的。仅仅是因为你无法接触到世界上所有的面孔!
另一方面,如果你使用 SNN,你的系统不需要学习一张脸的样子,而是两张脸有什么不同。
这解决了我上面提到的两个约束。
SimSiam:一种暹罗神经网络架构
连体神经网络有如此多的应用。
到目前为止,我只关注人脸识别,因为它是一个非常相关的应用程序。
但是,连体网络非常有用的另一个领域是自我监督学习(SSL)。
在 SSL 中,暹罗网络可以学习一些强大的表示,您可以稍后将其转移到另一个计算机视觉任务,如对象检测或图像分割。
SimSiam 是一种神经网络架构,使用暹罗网络来学习数据点之间的相似性。
为了学习这些表示法,你基本上要做的是拿一张图像,随机放大得到两个视图,然后通过主干网络传递这两个视图。
前一步骤的 2 个输出通过 MLP(多层感知器)传递。这是一种投影操作。
然后,我们使用主干的输出以及 MLP 的输出来计算余弦相似度。
它看起来像下面的图像。
目标是让网络学会最大化同一图像的两个视图之间的相似性。
这种方法的代码实现可以在 这里 找到。
图片来自原始纸张[1]
回答您的问题
图片来自 pexels
你们中的许多人(通过 电子邮件 、在 LinkedIn 或在 Twitter )联系过我,问了我一些有趣的问题,所以我认为与大家分享那些问题会很棒!
问题 :有没有详细了解 SNN 的教程:理论和 Python 实现都有?
我的回答 :我不知道现在有什么好的教程,但是你可以在这里 找到一个开源的实现 。
我的回答 :很难说哪种方法更适合克服你的过度拟合。但是你可以尝试两件事:
- 添加辍学层。
- 做数据扩充。
参考
【1】探究简单连体表象学习。陈,何
[2]“图章:用于书写者独立离线签名验证的卷积暹罗网络”。Sounak Dey,Anjan Dutta,J. Ignacio Toledo,苏曼 K. Ghosh,Josep Llados,Umapada Pal
关于作者
我是一名机器学习工程师,致力于解决具有挑战性的计算机视觉问题。加入我的 时事通讯 ,让这样的文章直接进入你的收件箱。
什么是稳定扩散模型,为什么它们是图像生成的一个进步?
潜在扩散模型简易指南
图 1:潜在扩散模型(基础图:[3],概念图覆盖:作者)
在本文中,您将了解图像生成领域的最新进展。更具体地说,你将了解潜在扩散模型(LDM) 及其应用。这篇文章将建立在甘斯、扩散模型和变形金刚的概念之上。所以,如果你想更深入地挖掘这些概念,请随时查看我以前关于这些主题的帖子。
也许过去十年在计算机视觉和机器学习方面的突破是 GANs(生成对抗网络)的发明——一种引入了超越数据中已有内容的可能性的方法,这是一个全新领域的垫脚石,现在称为生成建模。然而,在经历了一个蓬勃发展的阶段后,GANs 开始面临一个*台期,其中大多数方法都在努力解决一些对抗性方法所面临的瓶颈。这不是个别方法的问题,而是问题本身的对抗性。全球农业网络的一些主要瓶颈是:
- 图像生成缺乏多样性
- 模式崩溃
- 问题学习多模态分布
- 高训练时间
- 由于问题公式化的对抗性,不容易训练
存在另一系列基于可能性的方法(例如,马尔可夫随机场),其已经存在了相当一段时间,但是由于对于每个问题来说实现和公式化是复杂的,所以未能获得重大影响。其中一种方法是“扩散模型”——这种方法从气体扩散的物理过程中获得灵感,并试图对多个科学领域中的相同现象进行建模。然而,在图像生成领域,它们的使用最*变得很明显。主要是因为我们现在有更多的计算能力来测试复杂的算法,否则在过去是不可行的。
标准的扩散模型有两个主要的过程域:正向扩散和反向扩散。在前向扩散阶段,通过逐渐引入噪声直到图像变成完全随机噪声,图像被破坏。在相反的过程中,一系列马尔可夫链用于通过在每个时间步长逐渐去除预测的噪声来从高斯噪声中恢复数据。
图 2:典型的扩散模型过程(来源:[1])
扩散模型最*在图像生成任务中表现出了显著的性能,并在图像合成等几项任务中取代了 GANs 的性能。这些模型还能够产生更多样的图像,并被证明不会遭受模式崩溃。这是由于扩散模型能够保持数据的语义结构。然而,这些模型对计算要求很高,训练需要非常大的内存和碳足迹,这使得大多数研究人员甚至不可能尝试这种方法。这是因为所有的马尔可夫状态都需要在内存中进行预测,这意味着大型深网的多个实例一直存在于内存中。此外,这种方法的训练时间也变得太长(例如,几天到几个月),因为这些模型往往会陷入图像数据中细微的难以察觉的错综复杂中。然而,需要注意的是,这种细粒度的图像生成也是扩散模型的主要优势之一,因此,使用它们是一种悖论。
另一个非常著名的来自 NLP 领域的方法系列是 Transformers 。他们在语言建模和构建对话式人工智能工具方面非常成功。在视觉应用中,变形金刚已经显示出泛化和自适应的优势,这使得它们适合于通用学习。它们比其他技术更好地捕捉文本甚至图像中的语义结构。然而,与其他方法相比,变形金刚需要大量的数据,并且在许多视觉领域面临着性能停滞。
潜在扩散模型
图 3:潜在扩散模型(基础图:[3],概念图覆盖:作者)
最*提出的一种方法,通过将 GANs 的感知能力、扩散模型的细节保留能力和变形金刚的语义能力三者融合在一起,充分利用了这三者。这种技术被作者称为'潜在扩散模型 ' (LDM) 。事实证明,LDM 比前面提到的所有模型都更加健壮和高效。与其他方法相比,它们不仅内存效率高,而且可以生成各种各样的、非常详细的图像,这些图像保留了数据的语义结构。简而言之, LDM 是扩散过程在潜在空间而不是像素空间中的应用,同时结合了来自变换器的语义反馈。
任何生成学习方法都有两个主要阶段:感知压缩和语义压缩。
感知压缩
在感知压缩学习阶段,学习方法必须通过去除高频细节将数据封装成抽象表示。这一步对于构建环境的不变且健壮的表示是必要的。 GANs 擅长提供这样的感知压缩。他们通过将像素空间的高维冗余数据投影到一个叫做潜在空间的超空间来实现这一点。潜在空间中的潜在向量是原始像素图像的压缩形式,可以有效地用于代替原始图像。
更具体地说,自动编码器(AE)结构是捕获感知压缩的结构。AE 中的编码器将高维数据投影到潜在空间,解码器从潜在空间恢复图像。
语义压缩
在学习的第二阶段,图像生成方法必须能够捕获数据中存在的语义结构。这种概念和语义结构保存了图像中各种对象的上下文和相互关系。变形金刚擅长捕捉文字和图像中的语义结构。变形器的概括能力和扩散模型的细节保持能力的组合提供了两个世界的最佳,并给出了一种生成细粒度高度细节图像同时保持图像中语义结构的方法能力。
知觉丧失
LDM 中的自动编码器通过将数据投射到潜在空间来捕捉数据的感知结构。作者使用特殊损失函数来训练这种自动编码器,称为,'感知损失'[4–5]。该损失函数确保重建被限制在图像流形内,并降低了模糊度,否则当使用像素空间损失(例如,L1/L2 损失)时会出现模糊度。
扩散损失
扩散模型通过逐渐去除正态分布变量中的噪声来学习数据分布。换句话说,DMs 采用长度为 T 的反向马尔可夫链。这也意味着 DMs 可以建模为一系列时间步长的' T' 去噪自动编码器 t =1,…,T. 这由以下等式中的εθ表示。注意,损失函数取决于潜在向量,而不是像素空间。
图 4:潜在扩散模型损失函数解释(来源:作者)
条件扩散
扩散模型是依赖于先验的条件模型。在图像生成任务的情况下,先验通常是文本、图像或语义图。为了获得该条件的潜在表示,使用了将文本/图像嵌入潜在向量“τ”中的变换器(例如剪辑)。因此,最终的损失函数不仅取决于原始图像的潜在空间,还取决于条件的潜在嵌入。
注意机制
LDM 的主干是一个 U-Net 自动编码器,具有提供交叉注意机制的稀疏连接[6]。一个变换器网络将条件文本/图像编码成一个潜在嵌入,该潜在嵌入又通过一个交叉注意层映射到 U-Net 的中间层。这个交叉注意力层实现了注意力( Q,k,v)= soft max(qkt/✔d)v。而 Q,K 和 V 是可学习的投影矩阵【6】。
文本到图像合成
我们使用 python 中最新的官方实现 LDM v4 来生成图像。在文本到图像合成中, LDM 使用预训练的剪辑模型【7】,为文本和图像等多种形式提供通用的基于转换器的嵌入。然后,变压器模型的输出被输入到 LDM 的 python API,名为“扩散器”。也可以调整一些参数(例如,扩散级数、种子、图像尺寸等。).
图 5:使用文本输入的 LDM 生成的图像(来源:作者)
图像到图像的合成
相同的设置对于图像到图像的合成也是有效的,但是,需要输入样本图像作为参考图像。生成的图像在语义和视觉上与作为参考给出的图像相似。这个过程在概念上类似于基于风格的 GAN 模型,但是,它在保留图像的语义结构方面做得更好。
图 6:图 5:使用图像+文本输入的 LDM 生成的图像(来源:作者)
结论
我们已经涵盖了图像生成领域的一个非常新的发展,称为潜在扩散模型。LDM 在生成细节丰富的不同背景的高分辨率图像方面是健壮的,同时它们还保留了图像的语义结构。因此,LDM 在图像生成和深度学习方面都向前迈进了一步。如果您仍然对“稳定扩散模型”感到疑惑,那么它只是 LDMs 的一个更名,应用于高分辨率图像,同时使用剪辑作为文本编码器。
如果您想亲自尝试这种方法,您可以使用以下链接中简单易用的笔记本:
代码:
订阅更新内容:
成为帕特里翁的支持者:
参考文献:
[1] Jonathan Ho,Ajay Jain,Pieter Abbeel,“去噪扩散概率模型”,2020
[2]亚历克·拉德福德、琼·金旭、克里斯·哈拉西、阿迪蒂亚·拉梅什、加布里埃尔·戈、桑迪尼·阿加瓦尔、吉里什·萨斯特里、阿曼达·阿斯克尔、帕梅拉·米什金、杰克·克拉克、格雷琴·克鲁格、伊利亚·苏茨基弗,“从自然语言监督中学习可转移的视觉模型”,2021
[3]罗宾·龙巴赫和安德里亚斯·布拉特曼和张秀坤·洛伦茨和帕特里克·埃塞和比约恩·奥姆,《利用潜在扩散模型的高分辨率图像合成》,arXiv:2112.10752,2021,
[4],菲利普·伊索拉,阿列克谢·阿·埃夫罗斯,埃利·谢赫曼,奥利弗·王,作为知觉度量的深度特征的不合理有效性,2018
[5] Patrick Esser、Robin Rombach、bjrn Ommer,“驯服变形金刚,实现高分辨率图像合成”T27,CVPR,2020 年
[6]阿希什·瓦斯瓦尼、诺姆·沙泽尔、尼基·帕尔马、雅各布·乌兹科雷特、利永·琼斯、艾丹·戈麦斯、卢卡斯·凯泽、伊利亚·波洛舒欣,“注意力是你所需要的全部”,2017 年
[7]亚历克·拉德福德、琼·金旭、克里斯·哈拉西、阿迪蒂亚·拉梅什、加布里埃尔·戈、桑迪尼·阿加瓦尔、吉里什·萨斯特里、阿曼达·阿斯克尔、帕梅拉·米什金、杰克·克拉克、格雷琴·克鲁格、伊利亚·苏茨基弗,“从自然语言监督中学习可转移视觉模型”,2021
8 布拉特曼等人。艾尔。,潜在扩散模型,【https://github.com/CompVis/latent-diffusion】T2,2022
机器学习中的张量是什么?
原文:https://towardsdatascience.com/what-are-tensors-in-machine-learning-5671814646ff
了解机器学习的主要数据对象
约书亚·索蒂诺在 Unsplash 上拍摄的照片
张量是线性代数中的一个数学函数,它将选择的向量映射为一个数值。这个概念起源于物理学,随后被用于数学。可能使用张量概念的最突出的例子是广义相对论。
在机器学习领域,张量被用作许多应用的表示,例如图像或视频。它们构成了 TensorFlow 的机器学习框架的基础,该框架也由此得名。
什么是秩和轴?
如果要更精确的描述张量,就需要所谓的秩和维数。这些可以决定物体的大小。为此,我们从一个矩阵开始,我们要找出它的秩。为此,我们形成一个简单的 Numpy 数组,它表示一个三行三列的矩阵。
张量的秩现在提供了需要多少个索引来引用元素中的单个数字的信息。它也经常被称为维数。
在矩阵的情况下,这意味着它的秩为 2(矩阵是二维的),因为我们需要两个索引来输出一个特定的数。假设我们想将对象“矩阵”转换为第一行第二列中的数字 5,那么我们需要两步才能实现。
首先,必须引用索引为 0 的第一行:
在我们得到的数组中,我们可以选择索引为 1 的第二个元素(注意:对于 Numpy,计数从 0 开始!):
所以矩阵的秩为 2(是二维的),因为需要两个指数来得到一个数。然而,存在许多不同大小的矩阵,例如三行四列或五行两列。
为了区分不同的矩阵并精确定义它们,我们使用所谓的轴及其长度。张量的轴是特定维度上的值。在我们的例子中,具有第一个索引的 Numpy 数组是第一维的轴。
轴的长度反过来告诉我们沿着轴有多少个有效索引。在我们的例子中,长度是三,因为在第一个轴上总共有三个索引(=矩阵有三行)。以下调用会导致错误,因为第四个索引不存在:
张量的大小是多少?
张量的大小给出了每个维度的轴的长度。这意味着我们可以如下指定对象“矩阵”的大小:
我们得到从 TensorFlow 反馈回来的各种信息,可以相对容易的解读。张量具有“形状”2,即秩 2 或二维。我们已经预料到了这一点,因为我们知道矩阵是二维张量。“dtype”描述了存储了哪些数据类型,在我们的例子中是整数。最后,我们用“([3,3])”得到张量的大小,因为在两个维度的每一个维度上都有三个不同的指数。我们已经预料到了这个结果,因为它是一个三行三列的矩阵。
张量有哪些不同的类型?
张量是向量和矩阵的总称,包括机器学习领域中的多维数组。根据数组的维数,不同类型之间有所区别:
数量
标量,即单个数字,是一个 0 维张量。不需要单个索引来引用一个数字。因此,标量没有轴,因此秩也为 0。
矢量
向量是一维张量,秩为 1。根据向量有多少个元素,轴的长度会相应地改变。
[数]矩阵
正如我们已经详细描述过的,矩阵是一个二维张量。
张量
从三维或更多维来看,人们实际上也在谈论张量。三维张量可以看作是矩阵的集合。
Python 编程中的不同对象|来源:作者
张量是对线性代数中已知的对象的推广。它们被用于编程,主要是因为它们提供了表示多维数据结构的可能性。
用它们可以做什么算术运算?
允许的算术运算与矩阵的算术运算非常相似,但命名可能不同:
- 加法:如果两个对象具有相同的维度,可以简单地通过将它们逐个元素相加来进行加法运算,从而创建一个具有相同维度的新对象。
- 减法:如果两个对象有相同的维度,那么可以很容易地通过一个元素一个元素地减去它们,从而产生一个具有相同维度的新对象。
- Hadamard 乘积:这个特殊的乘积是通过一个元素接一个元素的相乘得到的。这个特殊的名字来源于这样一个事实,即仍然存在乘法的“正常”方式,即基于矩阵乘法。
- 分割:如果两个对象有相同的维度,那么只需将它们一个元素一个元素的分割,就可以将它们分割开来,这样就创建了一个相同维度的新对象。
它们在机器学习中的作用是什么?
为了训练一个机器学习模型,需要大量的数据。然而,我们所知道的来自真实世界的数据并不是模型可以使用的数学形式。因此,我们必须首先将图像、视频或文本等转换成多维数据结构,以便可以用数学方法解释它们。
同时,由于其结构,神经网络可以容纳和输出各种维度,远远超过传统的向量和矩阵。因此,随着神经网络的激增,张量的使用也变得更加普遍。
以下应用程序在机器学习中使用这些对象来提高模型性能:
- 协同过滤:这种模式用于电子商务,例如,根据顾客以前的购买行为,在网站上向顾客推荐最合适的产品。对于培训,通常使用矩阵,其中以前的客户显示为行,产品显示为列。如果第一行中的客户已经购买了第二列中的产品,此时将显示 1,如果没有,则显示 0。虽然这种设置已经能够提供良好的结果,但通过向矩阵中添加维度,可以进一步改进这些结果,例如,矩阵还可以包括客户环境。
- 计算机视觉:图像和视频不能用一个纯矩阵来表示。它们不仅包含大量的像素,而且是通过将不同的颜色叠加在一起而形成的,从而形成了图像。在所谓的 RGB 格式的简单图像中,红色、绿色和蓝色叠加在一起。
图像的张量表示|来源:作者
这是你应该带走的东西
- 张量是线性代数中的数学对象,用于表示多维对象。
- 例如,它们可以用来执行已经熟悉的向量或矩阵的算术运算。
- 在机器学习中,它们被用于,例如,实现更好的推荐或者在数据结构中映射图像和视频。
如果你喜欢我的作品,请在这里订阅https://medium.com/subscribe/@niklas_lang或者查看我的网站* 数据大本营 !还有,medium 允许你每月免费阅读 3 篇 。如果你希望有无限制的 访问我的文章和数以千计的精彩文章,不要犹豫,点击我的推荐链接:【https://medium.com/@niklas_lang/membership】每月花$5***获得会员资格**
* *
最好的 Python 绘图库有哪些?
原文:https://towardsdatascience.com/what-are-the-best-python-plotting-libraries-df234a356aec
让我们深入了解 Python 程序员可以用来可视化数据的各种工具
Python 是处理数据的绝佳语言。像 Numpy、Pandas 和 Scikit-Learn 这样的库使它成为数据科学领域最有能力的选择之一。处理数据最重要的一个方面是能够将数据可视化。无论是探索性分析还是与公众分享发现,创建有效的可视化都是 Python 程序员经常做的事情。
在真正的 Python 风格中,当选择用于绘图的库时,有过多的选项。有相对简单的选项,如 Matplotlib,也有更复杂的库,如 Folium,它们利用 JavaScript 的力量来创建真正令人惊叹的交互式地图。选择库最终取决于数据类型和绘图目标。无论您是分析实验数据的工程师,还是在会议上展示您的发现的研究人员,Python 都有工具为您创建正确的可视化。在这篇文章中,我将讨论一些适用于各种环境的最好的绘图库。
数据
通过使用绘图库来探索真实数据来比较绘图库要有趣得多,所以在本帖中,我们将关注 1967 年至 2021 年期间美国 25 至 34 岁人群的生活安排是如何变化的。这个年龄组特别有趣,因为它涵盖了年轻人通常完成大学学业并进入人生下一阶段的时期。
这些数据可以从美国人口普查局获得,我们可以很容易地下载一个包含我们想要分析的年龄组的 excel 文件。一旦我们下载了正确的文件,我们就可以把它读入 pandas 并稍微清理一下。
来源:作者创作
当谈到阅读 Excel 文件而不是。csv 文件通常还需要做一些工作才能得到一个可以使用的漂亮的熊猫数据帧。当我读取文件时,我可以告诉 pandas 哪些行将用作我的标题,以及这些标题后面有多少行实际数据。这让我们可以丢弃不属于实际表格的额外信息。
重命名列现在允许我们清除任何“未命名”的单元格,同时在以后创建传奇时使我们的生活更容易。最后,我们可以将Year
设置为数据帧的索引,我们得到:
作者创作(来源:美国人口普查局)
默认情况下,这些数据是按性别划分的,不过在这篇文章中,我们真的只想看看 25 岁至 34 岁人群的总体生活安排。
由作者创建
虽然我们可以在原始数据框架中创建这些组合列,但创建一个仅包含我们所需信息的新数据框架可以使绘图变得简单得多。
作者创作(来源:美国人口普查局)
我还把“和父母住在一起”和“和亲戚住在一起”这两栏合并在一起,因为他们的居住环境非常相似,这使得我们的数据框架更容易管理。现在我们已经将数据加载到 Python 中,让我们开始绘制一些图表吧!
原生 Python
我们将讨论的第一个库是 Matplotlib 和 Seaborn。两者都非常强大,并为人们提供了大量的定制,以微调可视化来适应他们的视觉。虽然 Seaborn 和 Matplotlib 在许多方面很相似,但我发现我在非常不同的情况下使用它们。让我们讨论一下不同之处,并开始研究我们的数据集。
Matplotlib
Matplotlib 基于 Matlab 的plot()
函数,让过去用过 Matlab 的工程师感觉很熟悉。除了语法差异之外,Matplotlib 基本上可以创建任何可以在 Matlab 中创建的绘图。虽然 Matplotlib 的核心功能是为创建二维图而设计的,但也有像 mplot3d 和 cartopy 这样的库可用于向 Matplotlib 的功能添加三维图,甚至地理可视化。
说到探索性数据分析,我发现 Matplotlib 是我最常用的库。一旦掌握了基本语法,它就简单易用了。
作者创建(来源:美国人口普查[1])
Matlab 擅长用最少的努力创建简单有效的图。它也恰好是非常可定制的,通过不同程度的努力,你可以用你的情节做各种事情。这就是为什么我经常使用 Matplotlib 来创建演示文稿的情节。在演示过程中,你希望观众能够在没有你太多帮助的情况下快速理解一个情节。这可以让你专注于数据推动的讨论。我们将在接下来的 Seaborn 部分看到如何进一步定制 Matplotlib 图的例子。
海生的
Seaborn 是我最喜欢的 Python 库之一。这是一个基于 Matplotlib 的绘图库,具有许多易于使用的样式,有助于使您的绘图看起来更好。然而,Seaborn 不仅仅是时尚;Seaborn 的真正强大之处在于它可以用最少的代码创建更复杂的统计图表,我们很快就会看到这一点。
由于 Seaborn 构建在 Matplotlib 之上,我们可以利用两个库中的功能,如下所示:
由作者创建
作者创建(来源:美国人口普查[1])
融化数据
Seaborn 适合绘制来自 pandas 数据帧的数据,有一些巧妙的技巧可以使绘制数据帧更加容易。为了避免必须为数据集的每一列显式创建一行,我们可以用一个称为“熔化”的过程来重新组织我们的数据帧。熔化是整理数据框架的一种方式,这样我们就有一个列来表示每个值的类别,如下所示:
由作者创建
由作者创建
现在,我们的数据以一种更容易传递到绘图函数的方式进行组织,因为我们有一个用于 x、y 和类别值的列。这使我们能够更容易地访问图形对象,为我们的绘图添加更多的定制。
由作者创建
作者创建(来源:美国人口普查[1])
Seaborn 的观点非常有用。它可以在许多情况下用于按分类列对数字列进行分组,这使得浏览数据集变得更加容易。使用hue
参数允许我们用一行代码创建图表,Seaborn 使用hue
类别为我们分离数据。
能够在一行中创建我们的情节并将对象存储在ax
中使得处理情节变得更加简单。现在我可以找到每条线的末端,并在图上标注最终的百分比。在为演示文稿和其他需要快速收集信息的情况创建情节时,像这样的小触摸会很有用。它们还可以帮助将该图与使用每个人都可以使用的默认工具制作的其他可视化图区分开来。
换上
当我们有组来相互比较时,hue
论点使各种各样的情节更容易制作。让我们试着用这些数据做一个柱状图,展示每十年生活安排的分布是如何变化的。我们不得不稍微争论一下数据,以获得每个十年的*均值。
由作者创建
从我们的非熔化数据帧开始,我们可以将指数转换为datetime
,然后使用groupby()
对每十年进行*均。然后我们可以像以前一样完全融化它,现在我们准备好创建我们的情节了!
由作者创建
作者创建(来源:美国人口普查[1])
我一般不像这样对时间序列数据使用条形图,但这是一个很好的例子,说明 Seaborn 在处理分类数据时是多么容易使用。
Javascript 包装器
虽然 Python 绝对能够使用 Seaborn 或 Matplotlib 等原生库创建奇妙的情节,但它不能像 JavaScript 那样生成交互式和易于共享的情节。当我们在线共享可视化时,交互式绘图特别有用,因为它们允许浏览者探索数据并收集比静态绘图所能提供的更多的信息。在一个网页上,用户有足够的时间来探索你的作品,一个交互式的可视化会比它的静态对应物更吸引人,更令人印象深刻。
Plotly
Plotly 是一个库,它为 Python 和 r 等语言带来了使用 JavaScript 进行交互式绘图的能力。它是用 JavaScript 构建的,并利用了强大的 D3.js 库。使用 Plotly,我们可以只用几行代码在 Python 中创建交互式绘图。你会注意到我仍然在使用我们为 Seaborn 地块创建的熔化数据帧;JavaScript 中的许多绘图库也更喜欢这种整洁的数据格式,因为它允许数据很容易地进行分类。
由作者创建
作者创建(来源:美国人口普查[1])
使用 Plotly Express 库,我们可以快速重建我们的生活安排图。Medium 不支持直接嵌入 JavaScript,所以我不得不把它上传到一个叫 DataPane 的服务上。通常情况下,您不需要与这个中间人服务打交道,因为 Plotly 可以托管您使用其 Chart Studio 服务创建的图表。
我非常喜欢 Plotly 线形图的一个功能是能够单击图例中的一条线来打开和关闭它。对于具有多条线的更复杂的图,这可能是一个非常有用的功能,允许您创建更复杂的图,并鼓励读者与数据进行交互。
薄层
follow 是一个优秀的 Python 库,它将 Python 的数据角力能力与 fleet . js 结合在一起,创建了一个强大的映射工具。虽然在这篇文章中我们不涉及空间数据,但我想在利用 JavaScript 的 Python 库中提及它。
只使用 JavaScript 怎么样?
JavaScript 是创建交互式数据可视化最有效的编程语言之一。像 D3 和 fleet 这样的库允许极端的定制,可以用来创建非常独特的情节。然而,这种灵活性是以需要更多代码和时间为代价的。即使使用 D3.js 创建一个简单的交互式线图,也比使用 Plotly 的 Python 库花费更多的时间。
由于使用 JavaScript 创建绘图需要更陡峭的学习曲线和时间投入,我只推荐它用于三种情况:当您想要有创造性时,您正在处理大型地理空间数据集,或者您正在创建一个独特的数据仪表板。
如果你要发表像研究论文这样的东西,并且你真的希望你的情节突出,JavaScript 是目前最好的工具。对于那些想要创建独特的数据可视化的 web 开发人员来说尤其如此,这些数据可视化不受大多数绘图所在的传统矩形的限制。使用 D3,web 开发者可以将一页信息转化为交互体验,数据和设计可以共存。
地理可视化是我最初学习 JavaScript 的原因。我处理大量地理空间数据集,在地图上可视化数据对于向他人展示我的发现至关重要。Python 有一些工具可以创建这种类型的图,但是,它们都非常有限,最终需要 JavaScript 包装器来实现任何令人满意的结果。JavaScript 有一些不可思议的库,比如用于创建地理可视化的 Mapbox 和 Leaflet,如果您经常使用地理数据,我强烈建议您学习如何使用它们。
注意:如果你喜欢在 Medium 上阅读我和其他人的内容,考虑使用下面的链接订阅,以支持这样的内容创作,并解锁无限的故事!
https://medium.com/@willmnorris/membership
资源
证明文件
数据源
[1]美国人口普查局,当前人口调查,年度社会和经济增刊,1967 年至今,成年人的历史生活安排(2021 年)
- 链接到数据下载网页
- 所有美国人口普查局的数据都是公共领域,许可证可以在这里查看
数据科学领导者最基本的技能是什么?
作者聚焦
"软技能是我们建立每一种关系的基础."
在 Author Spotlight 系列中,TDS 编辑与我们社区的成员谈论他们在数据科学领域的职业道路、他们的写作以及他们的灵感来源。今天,我们很高兴与 【玫瑰日】 分享我们的对话。
照片由玫瑰日提供
Rose 是一个数据*台的高级开发人员,经常撰写关于领导力、生产力、技术、数据科学和软件工程的文章。在工作中,Rose 专注于 MLOps,以提供端到端的机器学习开发流程,并在数据科学项目中启用敏捷原则。
你决定从事数据科学是一个长期过程的结果,还是更像是一种顿悟?
当我还是一名学习计算机工程的本科生时,我在最后一个学期上了一门商业分析课。正是在那堂课上,我发现了自己对数据科学的热情。我仍然记得告诉我的一位教授,我将不再从事嵌入式工程。相反,我停止了我的研究,开始在一所新学校攻读数据科学硕士学位。他惊呆了,但为我感到非常兴奋。
回想起来,进入这个领域最困难的部分是什么?
我的旅程中最具挑战性的方面是找到对自己声音的信心,这样我就可以为自己、我的团队和我们的愿景挺身而出。在我职业生涯的早期,我发现很难向别人表达我的观点,但我意识到随着时间的推移,人们会欣赏我的观点和想法。我可能并不总是有最好或正确的答案,但我乐于混合各种想法,并找到最适合我的团队的方法。
与其他项目相比,您更喜欢哪些特定类型的以数据为中心的项目?
目前,我在一个数据*台工程团队工作,每天与数据工程师和数据科学家打交道。我们自动化他们的管道和机器学习生命周期,并为我们的*台如何运行开发最佳实践。我觉得这很有趣,因为我在不同的团队之间,经常面临新的挑战。
我发现自己最感兴趣的数据是运营数据。今天团队运作如何?我们如何做出改变来改进他们的过程——以及我们如何在项目实施后衡量成功?我学到了很多关于我们如何在日常工作中使用关键绩效指标(KPI)的知识,以及对于每个项目,如何显示我们正在产生的影响。
在不久的将来,你有没有什么技能或工作流程希望进一步探索?
我期待着在开发操作仪表板方面做得更好,人们可以使用它来了解我们的*台以及他们如何更好地利用它。
是什么让你决定公开写你的数据科学职业生涯?
我在中学时为自己设定的目标之一是成为一名作家。写作已经成为我生活的一部分很久了,但是直到最*我才经常分享它。
大学的时候,我第一次加入演讲会,是为了在日常工作中学会更好的沟通。当我开始我的职业生涯时,我在不同的大学和会议上演讲,与他人分享我的经验。当疫情开始时,我意识到我需要一种新的方式来分享我的故事,所以我开始在媒体上写作。我可以通过我的写作与他人分享同样的故事,而且由于它们很容易在网上获得,更多的人可以享受它们。
你的很多文章侧重于软技能。为什么写这些经常被低估的技能对你来说很重要?
它们对几乎任何职业都至关重要。我相信我的“软”技能是我最大的财富,帮助我在职业生涯中走到今天。我最提倡的技能是沟通。我发现,技术人员和非技术人员之间的良好沟通可以极大地帮助需要多个团队、人才和投入的数据科学项目。改善沟通的另一个原因是学会与不同背景的人谈论你的工作。能够与各种各样的人相处并解释你的工作如何影响他们是至关重要的。当你能以他们的方式和他们需要你的水*来解释某事时,人们会很感激。
但是其他软技能也同样重要。例如,情商和同理心是寻求担任领导角色的个人的两项优秀技能。通过这些技能,你可以更好地了解你的队友,学会如何管理你的压力反应,并克服出现的挑战。我相信每个人都会给团队带来一套特定的技能。他们有自己擅长的技能和想要提高的技能。如果你能在这个层面上与你的团队建立联系并理解他们,你就能确保以支持他们技能和激情的方式与他们一起工作。
软技能是我们建立每一种关系的基础。没有他们,我们就有了孤立的个体,他们不能分享他们的想法、激情和对团队未来的愿景。
无论是短期还是长期,你最希望在数据科学领域看到的变化是什么?
变化就在我们周围,而且是持续的,但如果我们不开始朝着它的方向前进,它就不会发生。在未来几年,我期待的第一件事是更好地倡导和包容不同能力的人。不是每个人都擅长同一件事;我们需要接受人们擅长的东西,并提倡包含他们的技能。你可能看不到像你一样“技术化”的人,但这并不意味着他们不能学习一种工具或技术。
我们还需要继续为那些希望在技术或数据科学领域获得提升但不想成为经理的个人开发清晰的人才发展路径。在技术领域,人们常常认为唯一的晋升途径就是进入领导层。相反,我们需要扩大职业选择,并与个人合作来定义作为一名数据人员在职业生涯中的晋升意味着什么。我发现我的两年路线图有助于我和我的导师一起完成。我们讨论了我未来两年的理想职业道路,以及我希望达到和学到的东西。需要围绕这种类型的计划以及人们如何为自己做同样的事情进行更好的沟通。
要了解更多关于 Rose 的工作,了解她最新的帖子,请点击媒体和推特关注她。为了探索 Rose 的一些作品,我们从 TDS 档案中挑选了一些亮点——欣赏!
- 我经历过的最好的面试从来不是编码挑战(2022 年 2 月,7 分钟)
- 为什么要学习数据科学中的有效沟通(2021 年 12 月,6 分钟)
- 随着大数据的出现,了解正确背景变得越来越重要(2021 年 7 月,5 分钟)
- 远程工作很难让一个强大的数据科学家脱颖而出(2021 年 1 月,6 分钟)
想和广大观众分享一些你自己的作品吗?我们很乐意收到你的来信。
为了长度和清晰起见,这个问题&被稍微编辑了一下。
数据讲故事最重要的元素是什么?
当数据科学家分享的见解清晰可行时,他们的工作效率最高。如何实现这一点将取决于您所拥有的数据的特点以及您与之沟通的利益相关方,但是在一些关键领域投入我们的注意力(几乎)总是会有回报的。这里有三个最*的帖子,集中在引人入胜的讲故事的具体元素上——而且做得非常好。
- 不要让你的仪表盘积满灰尘 。构建数据仪表板需要做大量的工作,但是最终的产品往往令人困惑、笨重且未得到充分利用。玛丽·勒费夫尔认为有效且有用的仪表盘触手可及。她分享了一个基于个人经验的四步框架,该框架将帮助您构建仪表板,准确清晰地讲述数据故事。
由 Unsplash 上的 CHUTTERSNAP 拍照
- 找到合适的取景是关键 。作为一名教育工作者,亚历杭德罗·罗德里格斯知道,如果你明智地选择沟通方式,即使是最复杂的概念也可以变得触手可及。这篇文章表面上是对混淆矩阵和分类度量的介绍,但它也是一个关于一个简单、精心选择的例子的大师班。(这里是:毒蘑菇!)
- 色彩的至关重要 。数据可视化就是让大量信息变得可访问和可解释。它的成功取决于一系列设计决策,有小有大;Weronika Gawarska-Tywonek 的优秀初级读本将帮助你了解调色板是如何工作的,以及如何着手选择最适合手头任务的颜色。
我们本周的其他出版亮点远远超出了数据故事——无论你是求职者,经验丰富的 ML 从业者,还是数据变革的倡导者,我们认为你都会在这里找到值得你花时间的东西。
- 你如何管理你的模型训练实验的配置? Suneeta Mall 的深度探讨涵盖了 Pydantic 和 Hydra 以及这些工具可能简化您的配置工作流程的方式。
- 如果你有一个数据科学的工作面试(或者即使你没有),看看 Tessa Xie 对你需要流利掌握的分发相关概念的概述。
- “使用模拟来生成大量合成训练数据的兴趣正在稳步增长,”梅森·麦戈说,他继续向你展示如何为计算机视觉生成人类的 3D 模型。
- 减少人工智能碳足迹的探索已经开始;大卫·亚斯特雷姆斯基的概述解释了我们需要关注的地方以使深度学习项目真正做到气候友好。
- 如果你对动态编程很好奇,但还没有找到一个耐心的人,彻底的指南向你展示诀窍,韩琦在这里用一步步解释樱桃拾取问题来拯救你。
我们希望您喜欢本周在 TDS 上的学习和探索!如果你愿意支持我们作者的工作,考虑成为的媒体会员(这也让你可以使用我们的全部档案)。
直到下一个变量,
TDS 编辑
机器学习和数据科学中最重要的预处理步骤是什么?
数据科学和机器学习现在已经成为最新的话题,公司正在寻找数据科学家和机器学习工程师来处理他们的数据,并为他们做出重大贡献。每当数据被提供给数据科学家时,他们必须采取正确的步骤来处理这些数据,并确保转换后的数据可以用于最佳地训练各种机器学习模型,同时确保最大的效率。
Tobias Fischer 在 Unsplash 上拍摄的照片
人们经常发现,现实世界中存在的数据常常是不完整的和不准确的,同时包含许多一些机器学习模型无法处理的异常值,从而导致次优的训练性能。同样重要的是要注意,在将数据提供给机器学习模型之前,必须处理数据中可能存在的重复行或列。解决这些问题以及许多其他问题可能是至关重要的,尤其是当想要提高模型性能和模型的概化能力时。此外,在分类任务的情况下,在感兴趣的输出类别中可能存在类别不*衡。因此,通过创建合成数据点来*衡类也是一个好方法,还有我们将在本文中讨论的其他方法。
采取正确的数据处理步骤可能是一项挑战,尤其是在这一过程可能以多种方式发生的情况下。了解数据处理步骤的适当用法可以帮助数据科学家更好地分析数据,并对数据有一个很好的理解。此外,由于他们的机器学习预测,他们可以帮助公司朝着正确的方向发展。
布雷特·乔丹在 Unsplash 上拍摄的照片
现在,让我们回顾一下预处理数据的所有各种可能的方法,并确保提供给模型的数据是完整的、准确的,并且包含最少的异常值。
缺少值
在现实世界中,通常不可能找到完整且没有缺失值或 NaN 值的数据。因此,我们可以删除包含这些缺失值的行,或者进行插补(填充缺失值)以确保 ML 模型处理这些数据。
由 Pierre Bamin 在 Unsplash 上拍摄的照片
1.删除缺失值
现在是处理数据中缺失值的时候了。处理数据中缺失值的一种方法是删除那些行,如前所述。假设我们使用的是 python ,这是许多数据科学家在机器学习应用程序中使用的默认语言,让我们看看可以实现这一点的代码。
# Assuming that data is stored in 'df' variable which is mostly used by default. df.isnull()
# This returns a boolean matrix that contains True if there is presence of missing values (NaN) and False otherwise
让我们还考虑我们的数据中存在缺失值(这在大多数真实世界的数据集中是真实的),我们可以删除包含这些值的行,尽管不建议这样做。但是,让我们看看这是如何实现的,以便更好地了解删除缺失值的行(nan)的情况。
df.dropna()
# This removes the rows that contains missing values in the dataframe that is stored as 'df' variable
2.归罪
它是用各种插补策略,如均值、中位数和模式插补,来替代缺失值的过程。然而,也可以通过基于领域知识给数据赋值来随机进行插补。
同样重要的是要注意,插补也可以基于机器学习预测从已经不包含缺失值的所有剩余特征中执行。通过这种方式,模型学习查找模式,并分别对特征中的未知值进行预测。
下面是一个函数,可用于通过*均值、中间值或众数插补来估算值。请随意看一看。
**def** mean_imputation(data, inplace **=** **False**):
"""
This function would take the NULL values present in data and replace them with average values of the data respectively.
"""
data**.**fillna(data**.**mean(), inplace **=** inplace)
**def** median_imputation(data, inplace **=** **False**):
"""
This function would take the NULL values present in data and replace them with median values in our data respectively.
"""
data**.**fillna(data**.**median(), inplace **=** inplace)
**def** mode_imputation(data, inplace **=** **False**):
"""
This function would take the NULL values present in data and replace them with mode values of the given data respectively.
"""
data**.**fillna(data**.**mode(), inplace **=** inplace)
代码实际上是从我在 GitHub 上的一个仓库中获取的。你也可以在 GitHub 上关注我,获取我在*台上不断分享的最新项目和见解。
正如我们之前所讨论的,还可以基于机器学习预测执行插补,这可以产生更稳健的模型和更准确的缺失值插补。
极端值
数据集通常包含离群值或数据点,它们的值与我们的数据中实际预期的值相差甚远。这可能是由于记录数值时的人为错误或记录特征的机器故障。当我们试图评估机器学习的指标,其中一些是均方误差时,数据中异常值的存在可能会显著增加误差。但是这并没有给我们模型性能的最准确的描述。
此外,有许多机器学习模型对数据中的异常值并不稳健。因此,必须采取措施在数据处理阶段将其移除,以便在使用均方差等指标时,我们能够获得模型的真实表示,同时确保模型能够生成最佳预测,而不会出现异常值。
转换数据
在填充缺失值并移除异常值后,下一步将是转换这些数据,以便在机器学习模型上进行训练变得可行。根据数据类型和业务需求,有许多方法可以转换数据。
1。维度缩减
拥有高维数据(更高数量的特征)的一个挫折是有一种现象叫做“维数灾难”,增加的特征具有递减的回报。因此,移除那些对模型预测和输出没有显著影响的要素非常重要。降低维度有两个作用:它减少了机器学习模型对数据进行训练的时间,有时还可以从数据中删除离群值。因此,我们应该进行降维,以确保在训练后得到一个更健壮的模型。
有多种方法可以将高维数据简化为低维表示。可以使用的降维技术有主成分分析(PCA) 、随机邻域嵌入(t-SNE) 和 UMAPs 等。请注意,这些方法中的每一种在引擎盖下都有不同的工作方式,但最终的结果都是减少尺寸。
2.标准化
这也是一个很好的做法,在将数据提供给机器学习模型之前,标准化数据,并确保所有的输入特征都在相同的尺度上。考虑两个特征的例子:身高和体重。让我们考虑我们将要用 ML 算法预测的输出变量是“户外活动”。我们知道,身高可以用厘米(cm)来度量,而体重可以用公斤(kg)来度量。我们通常不能比较这两个特征,因为它们不在同一尺度上。但是,如果我们要转换这些特征,使它们代表相同的尺度,这确保了我们可以比较它们,并决定哪个特征对确定一个人的“户外活动”最有影响。
下面是如何在 Python 中实现标准化的代码片段。
# Using the StandardScaler() from Sklearn library
# Divided the data into X_train and X_cvscaler **=** StandardScaler()
scaler**.**fit(X_train)
X_train_standardized **=** scaler**.**transform(X_train)
X_cv_standardized **=** scaler**.**transform(X_cv)
3.正常化
正如我们在上述案例中所看到的,以不同尺度呈现的数据可能会有问题。还有一个备选策略来处理以不同比例呈现的数据。一种方法是归一化数据,这意味着我们从特定特征的最小值中减去当前值,并将结果除以感兴趣特征的最大值和最小值之间的差。这也是转换数据的有效方法。下面是如何得到一个好主意的等式。
作者图片
基于该等式,让我们理解给出的当前值。
Xmin =特征中存在的最小值
Xmax =特征中存在的最大值
Xnorm =作为执行此操作的结果而获得的归一化值。
4.扔掉
重要的是解决数据中存在的影响机器学习模型性能的异常值。减少这些异常值影响的方法之一是根据一个重要特征将数据点划分到不同的箱中。换句话说,它是将广泛的数据集分类成更相似的数据的更小的组。这确保了数据中的异常值对预测的总体影响最小。因此,这也是一种有效的数据转换方式。
5.使聚集
每当我们处理输出或目标变量未知的无监督机器学习时,处理这些数据的一种流行方法是聚类。虽然聚类可以用于无监督的机器学习,但它也可以用于有监督的机器学习。如果我们要根据某个特定的特征对数据进行聚类,我们可以将已经考虑过的数据分组。这种方法还可以转换数据,我们可以更好地从中发现模式。
处理不*衡数据
在机器学习中的大多数时候,在输出中出现事件的可能性很小的地方存在数据。考虑诸如银行业的欺诈检测、营销的实时竞价、贷款违约或入侵检测之类的例子,其中事件中正面案例的发生与结果相反的可能性相比是有限的。在这种情况下,重要的是处理输出类的这种数据不*衡,以便与其他组相比,没有必要偏向某一组。
Elena Mozhvilo 在 Unsplash 上拍摄的照片
有各种算法、策略或技术通常用于处理不*衡数据。让我们看看处理这种不*衡数据的各种方法。
1.欠采样
其工作原理是通过移除多数类中的数据点来减小数据的总体大小,使得多数类和少数类中的数据点总数相同。在这个过程中可以使用各种算法。让我们回顾一下处理这些数据的一些方法。
1a。接*欠采样
该方法的工作原理是考虑多数类和少数类之间的距离,并根据与少数类的最*距离对点进行采样。因此,根据少数群体的规模,我们用于模型预测的数据会有所减少。有各种不同类型的未遂事件算法。它们可以是 NearMiss-1 、 NearMiss-2 和 NearMiss-3 中的任一个,每个在做出考虑特定示例的决定之前以不同的方式考虑点数,等等。有关这种技术的更多信息,请随意参考下面的文章,这篇文章详细介绍了这种技术以及许多其他技术。
不*衡分类的欠采样算法(machinelearningmastery.com)
1b。压缩最*邻规则欠采样
这是一种技术,当数据中的训练点数减少时,模型性能不会降低。开发这种技术主要是因为使用K-最*邻(KNNs) 所带来的内存限制。因此,减少了数据点的总数,从而在使用 KNN 算法进行预测之前需要更少的内存。在我们的案例中,使用这种方法时考虑了少数类和多数类示例,并对它们进行了测试,以了解省略多数类中的点如何导致模型性能的最小降低。
1c。欠采样的 Tomek 链接
这是一种有用的方法,是对上述压缩最*邻方法的修改。它主要计算多数类和少数类之间的欧几里德距离,并找到包含我们考虑的两个类之间最小欧几里德距离的那些 tomek 对。因此,我们只得到那些在多数类和少数类样本之间具有最低欧几里德距离的样本对。有关这种方法的更多信息,请随意访问下面给出的链接,这样您就可以很好地理解各自的主题。
不*衡分类的欠采样算法(machinelearningmastery.com)
虽然欠采样对于减少偏差或类别不*衡可能是一件好事,但它是通过减少训练样本大小来实现的,以确保数据中存在类别*衡。但是我们正在丢失训练数据中的信息。当机器学习模型通过大量训练样本进行训练时,它们将能够很好地进行概括。在我们的例子中,我们正在减少数据的大小,这有时并不是最好的选择。
2.过采样
在过采样的情况下,我们将多数类作为我们的基础,然后我们尝试增加来自少数类的数据点的总数,以便最终结果是多数类和少数类的数量相等。关于如何做到这一点,有各种各样的方法和途径,其中最流行的是击打和随机抽样。让我们复习一下这些方法,以便对它们有一个详细的了解。
2a。重击
SMOTE 代表合成少数过采样技术,可用于对数据进行过采样,并创建相同数量的多数和少数类。它根据 k-最*邻算法的原理工作,以便创建合成数据点。数据点被转换到特征空间,并且找到它们的最*邻居。他们计算两个样本点之间的距离,并在连接这两个点的线段中找到合成点,以获得数据中的附加点。因此,这会导致数据过采样,并确保多数类和少数类的数量相等。
2b。随意采样
这是一种基于获取少数类并复制这些数据点以获得具有相同数量的多数类和少数类的数据来*衡输出类的技术。这种方法的一个缺点是,由于复制或拷贝相同的信息来创建相同数量的类,ML 模型可能倾向于过度拟合数据。
现在让我们看一下代码,根据需要,我们可以使用过采样或欠采样等技术。下面是我的信用贷款违约预测知识库中的代码片段的链接。
**import** imblearn
**from** imblearn.over_sampling **import** RandomOverSampler
**from** imblearn.under_sampling **import** TomekLinks
**from** imblearn.over_sampling **import** SMOTE
**from** imblearn.under_sampling **import** NearMiss
‘imb learn’是一个可用于过采样或欠采样的库。现在让我们来看一下可以用来修改数据的函数。
**def** sampler_function(data_x, data_y, sampler **=** 0, random_state **=** 101):
**if** sampler **==** 0:
sampler **=** RandomOverSampler(random_state **=** random_state)
**elif** sampler **==** 1:
sampler **=** TomekLinks()
**elif** sampler **==** 2:
sampler **=** SMOTE()
**else**:
sampler **=** NearMiss()
X_transformed, y_transformed **=** sampler**.**fit_resample(data_x, data_y)
print('Original dataset shape:', Counter(data_y))
print('Resample dataset shape:', Counter(y_transformed))
**return** X_transformed, y_transformed
在上面的代码片段中,我们定义了一个函数,它考虑了输入数据( data_x )、输出数据( data_y )以及所使用的采样技术(采样器)和一个随机状态。根据“采样器”的值,可以使用不同的采样技术来确定过采样或欠采样。选择了采样器之后,我们将数据拟合并重新采样,如上面的代码片段所示,最后我们将得到相同数量的类。
结论
我们已经看到了在将数据提供给 ML 模型之前执行数据预处理和数据转换的各种方法。请注意,这些是预处理数据的一些最佳方法,还可能有本文中没有介绍的其他技术。但是这些技术应该给出足够的基线,以确保人们非常详细地了解预处理的步骤。
以下是您联系我或查看我作品的方式。谢了。
GitHub: 苏哈斯马达利(Suhas Maddali)(github.com)
LinkedIn: (1)苏哈斯·马达利,东北大学,数据科学| LinkedIn
中等: 苏哈斯·马达利—中等
在多伦多拿到停车罚单的几率有多大?
原文:https://towardsdatascience.com/what-are-the-odds-of-getting-a-parking-ticket-in-toronto-1f090dd0c608
探索性数据分析和简单的统计模型
执行探索性数据分析(EDA)和构建统计模型是数据科学家的基本技能。在这篇文章中,我将探索多伦多停车罚单的数据集。我将从时间和地点的角度分析和可视化模式。在帖子的后半部分,我将提出一个简单的模型来评估在特定时间和地点获得停车罚单的机会。
这篇文章旨在向初级数据科学家展示如何探索数据集和应用贝叶斯思维。它还介绍了一些有趣的见解,关于多伦多发出的停车罚单。
我使用的公开数据可以在多伦多公开数据获得。数据集描述称,“整个多伦多市每年大约开出 280 万张停车罚单。该数据集包含与每个日历年开出的每张停车罚单相关的不可识别信息”。
数据概述和预处理。
下面是五个转置的行车票记录。我们将使用的关键信息是违规的时间、地点和类型(描述)。
五个转置行的示例
对原始数据进行了一些基本的预处理,例如合并日期和时间列,删除时间不正确的异常行等。
如果我们绘制每日门票数量,我们可以在 2020 年 4 月左右看到明显的“covid19 下降”。我们将只使用 2019 年的数据,因为 2020 年的数据不典型。
每日停车票
什么时候有最多的票?
让我们从时间的角度来探究这些数据。每种违规类型都有其分布。因此,我们将在一个违反类型的基础上研究时间分布。
首先,我们用 7 X 24 个单元格创建一周的热图,统计每个单元格中的票数,最后归一化热图(所有单元格之和应为 1)。因此,较暗表示百分比较高,较亮表示百分比较低。
一些有趣的观察:
规范化停车罚单分布
清晨(早上 5 点到 7 点)或下午(下午 3 点到 6 点)是否有一个“私人财产公园”值得怀疑。
规范化停车罚单分布
晚上(早上 0 点到 7 点)几乎不会出现“未付费停车”的情况。我猜大多数机器停车场靠*办公和商业建筑,人们很少在那里过夜停车。此外,一些停车场可能会在晚上关闭,酒吧禁止进入。军官不在那些地方工作是合理的。
我们还可以将全年的门票数量视为时间序列数据,并将其分解为几个部分。例如,如果我们分解“停车时间超过 3 小时”的违规数据,并查看趋势部分,我们可以看到冬季发出的罚单较少。从季节部分,我们会看到一个周模式。有一些明显的下降(你可以在上面的线图和下面的残差图中看到它们)。它们可以用加拿大夏季的国定假日和冬季的极端天气日来解释。
标准化后,我们可以比较前 5 种违规类型,因为这些类型的罚单数量不同。我选择基于十天移动*均线来归一化该值。
比较前 5 种违规类型的折线图
一些观察结果:
节假日和极端天气会显著减少“停车时间超过 3 小时”和“未支付停车机器所需费用”(绿色和紫色线)的门票。要点是城市通常不会在那些特殊的日子给你开罚单,因为不付钱或者停车时间太长。
“公园标志 HWY 禁止 DY/TM”类型(橙色线)有几个周期性峰值。高峰意味着该城市可能会批量发行这些罚单,或者该城市可能会加强对此类违规行为的定期检查。
门票最多的地点在哪里?
数据集中没有地理信息。现在,我们只能将位置视为字符串。
这份名单是门票最多的前 10 条街道。
该列表显示了门票最多的前 10 个地点。
每个顶部位置都有独特的图案。例如,大多数 2075 BAYVIEW AVE (一家医院)的门票是从上午 10 点到下午 2 点的私人停车场。
布里姆利路南 1 号是一个公园。在那里开停车罚单有各种各样的理由。但是大部分都是下午和晚上给的。
拿到票的概率有多大?
请注意,如果你从来没有违反停车规则,你将永远不会得到一张停车罚单。
我们假设你在一个特定的地方违反了停车规则,你可能会收到一张停车罚单。这个机会取决于停车执法人员。假设一个检查员同时检查这个地方,你会 100%得到一张票;如果没有,有 0%的机会拿到票。因此,检查的概率给你违反停车规则将等于得到一张罚单的概率。
基本数学是下面简单的贝叶斯方程。
一级方程式
我们想知道我们的目标概率 P(检查|违规)。解决方案是,一旦我们有了 P(检查和违规)和 P(违规),我们就可以得到 P(检查|违规)。
评估 P(检查和违规)
让我们通过结合位置和时间因素来计算这些概率。为了让事情变得简单些,让我们来挑选第一名, 4001 莱斯利街。是北约克综合医院。以下是 2019 年的票数分布图。
每个单元格表示 2019 年该时间段发行了多少张票。每个单元格代表一个联合事件的编号,意味着有人违反了法律和警官抓住了那个人。
我们假设一旦检查员到达现场,他们会发现所有的违规行为。所以票的总数不是一个好的概率分布的度量。由于每个时间点在一年中*均会重复 52 次,我们可以使用每个时间点的一年中唯一的天数除以 52 作为概率。
例如,假设在星期五上午 11 点到 12 点发行 60 张票。这 60 张罚单仅涵盖 26 周(一年中的 26 个独特的日子),这意味着在周五上午 11 点到 12 点没有任何罚单的那几周,既没有违规,也没有检查员在那个时间出现。那么从技术上来说,我们认为联合事件的概率是 26/52 = 50%。
现在我们有了每个单元的联合事件 P(检查和违规)的概率。我通过将每个单元格的值与其两个相邻单元格的值进行*均来*滑结果。
*滑的结果。每个单元格都是自身和两个相邻单元格的*均值。
评估 P(违规)
接下来,让我们获得每个时间点的违规概率。我们可以假设有一小部分人喜欢违反停车规则,不管时间和地点。停车的游客越多,那些“停车违规者”就越有可能到来。现在问题变成了我们是否能有停车游客数量的数据。
我在网上找到了北约克总医院 2019 年的统计数据(参考文献 3)。有 118152 名急诊患者和 170132 名门诊患者,这意味着每天约有 790 名患者。当然,不是所有的病人都需要停车;有些患者可能会多次就诊和停车。有理由相信每天停车的游客应该在 500 到 1000 之间。
我还找到了一篇关于预测急诊科每小时患者访问量的论文(参考文献 2)。关键是不同时间到达的病人数量的分布。
结合上述知识和信息,我为北约克综合医院创建了一个停车游客分布图。*日停车游客总数不超过 650 人,周末不超过 300 人。
根据停车游客的数量,如果我们知道违规率,我们可以通过以下公式计算违规概率:
方程式 2。
不幸的是,我在网上找不到可靠的违规率。但是我们可以调整利率。下图显示 P(违规)的比率为 0.013。这一比率意味着每 1000 名停车游客中,就有 13 人违反停车规则。
违规率不变的假设可能不成立。例如,人们可能愿意在晚上偷一个比白天稍微危险的非法停车。
为了估计每小时的违规率,我假设 P(检查|违规)总是 1,那么 P(违规)将等于 P(检查和违规)。通过用停车游客的数量求解公式 2,我们可以计算出每个时间点的违章率。不出所料,夜间的费率确实更高。
假设 P(inspection|infraction)的逻辑总是一个意思,即通过捕捉所有的违规,官员们工作得很完美。从这一假设得出的违规率可被视为最佳率;实际违规率应该高于最佳值。
检查 P(检查|违规)
现在,我们可以按小时*均最佳违规率,然后应用公式 1 和公式 2,得到 P(检查|违规),如下所示。
因为我们使用的是最佳违规率的*均值,大多数概率接*于 1,正如预期的那样。即使结果高估了实际可能性;我们仍然可以发现一些有趣的观察结果:
如果你违章停车,周一白天和工作日上午 9 点到 10 点收到停车罚单的几率相对较低。
官员通常上午比下午更有可能在现场。
请注意,结果高度依赖于停车游客分布的准确性以及如何评估违章率,这将最终确定 P(违章)。概率较低的时间段可能表明检查的机会较少,或者我们高估了 P(违规),即某人违规的可能性。
结论
我研究了基于时间、地点和违规类型的多伦多停车罚单数据集。我展示了从 2019 年的数据中学到的一些令人兴奋的见解。我还提出了违规和检查的简单统计模型。我们需要有关相关位置的详细信息,以便我们可以模拟某人违反停车法规的可能性以及停车执法人员检查该地点的可能性。
感谢阅读。
参考资料:
[1] 多伦多公开停车罚单数据
[2] 预测急诊科每小时的患者访问量,以应对拥挤状况 Morten Hertzum
[3] 北约克总医院统计数据
什么是转置卷积?
原文:https://towardsdatascience.com/what-are-transposed-convolutions-2d43ac1a0771
了解“反向”卷积的工作原理
在 Unsplash 上由 Philippe D. 拍摄的照片
介绍
转置卷积就像卷积家族的“丑小鸭”。它们古怪而怪异,但转置卷积并不像看上去那样简单。
你会经常在自动编码器的解码器部分,或者 GANs 的生成器部分找到层转置卷积。
他们的目的很明确:为了增加他们输入的尺寸、高度和宽度。
这是与常规卷积的相反的:缩小它们输入的大小、高度和宽度。
"所以,转置卷积是卷积的逆运算?"
转置卷积
上面的问题没有简单的答案,因为卷积不能“还原”,也就是说,在给定结果输出的情况下,不能检索原始值。即使是最简单的过滤器,即身份过滤器,在图像上进行卷积时,也会导致一些信息永久丢失(原始图像最外面的行和列中的数字,如下例所示):
来源:图片来自我的书《用 PyTorch 一步一步进行深度学习》,第 5 章,“卷积”
此外,已知卷积通常产生尺寸减小(高度和重量)的输出。虽然我们对丢失的信息无能为力,但是我们可以恢复缩小的大小!这就是一个“转置卷积”的作用。
“为什么叫换位?”
我也不喜欢这个名字,但是我估计叫它“反卷积也不够准确,所以就是这样。退一步说,转置卷积的算法并不那么直观,所以让我们用 PyTorch 做几个例子来理解它是如何工作的。
在这两个例子中,我们将使用一个单通道、2x2 图像作为输入,以及一个同样大小的内核/过滤器:
input_image = torch.ones((1, 1, 2, 2)) # N, C, H, W
input_image
**Output:
tensor([[[[1., 1.],
[1., 1.]]]])**kernel_size = 2
kernel = torch.ones((1, 1, kernel_size, kernel_size))
kernel
**Output:
tensor([[[[1., 1.],
[1., 1.]]]])**
单通道、2x2、图像作为输入,以及相同大小的内核/滤波器。图片作者。
使用 1 的步幅(转置)
现在,让我们尝试一个 2D 转置卷积([**F.conv_transposed2d**](https://pytorch.org/docs/stable/generated/torch.nn.functional.conv_transpose2d.html)
,在 PyTorch 的函数式 API 中),使用一个的步幅(转置),和一个零的填充(转置):
import torch.nn.functional as Fstride_transp = 1
padding_transp = 0F.conv_transpose2d(input_image,
weight=kernel,
stride=stride_transp,
padding=padding_transp)
**Output:
tensor([[[[1., 2., 1.],
[2., 4., 2.],
[1., 2., 1.]]]])**
我不知道你,但我第一次看到那个输出,我就被它难倒了!让我们深入了解一下!
这就是转置卷积在幕后实际做的事情:
- 首先,它用零填充图像,尽管它没有使用作为参数的填充(转置)而是使用隐式填充代替(是啊,说到令人困惑!).
隐式填充。图片作者。
padding_implicit = kernel_size - padding_transp - 1
padded_image = F.pad(input_image, pad=[padding_implicit]*4)
padded_image
**Output:
tensor([[[[0., 0., 0., 0.],
[0., 1., 1., 0.],
[0., 1., 1., 0.],
[0., 0., 0., 0.]]]])**
用隐式填充进行填充。图片作者。
- 然后,使用常规的 2D 卷积(
**F.conv2d**
,使用一个的固定步幅(不是用作参数的步幅(转置)),在填充图像上卷积内核/滤波器!)
F.conv2d(padded_image, weight=kernel, stride=1)
**Output:
tensor([[[[1., 2., 1.],
[2., 4., 2.],
[1., 2., 1.]]]])**
我们走吧!这与转置卷积函数产生的输出相同!下图说明了这两个步骤:
使用一步(转置)的转置卷积。图片作者。
“好的,但是步幅(转置)呢?根本没用!”
接得好!事实上,它并没有被使用,这就引出了第二个例子。
使用 2 的步幅(转置)
我们将保持相同的输入图像和内核/过滤器,相同的零的填充(转置),但是我们现在将使用两个的步距(转置)。
stride_transp = 2
padding_transp = 0F.conv_transpose2d(input_image,
weight=kernel,
stride=stride_transp,
padding=padding_transp)
**Output:
tensor([[[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]]])**
这个输出也令人困惑,对吗?大于一个的步幅(转置)实际上在开始时引入了 又一步 :
- 首先,在输入图像的现有 1之间插入 0 序列作为列和行。要插入的列/行数由步距(转置)减去一个给出。在我们的例子中,它将插入一列和一行,产生如下图像:
zero_added_image = torch.tensor([[[[1, 0, 1],
[0, 0, 0],
[1, 0, 1]]]]).float()
添加零的列和行。图片作者。
- 接下来,它使用一个的固定步幅执行隐式填充和常规卷积,就像第一个例子一样:
padding_implicit = kernel_size - padding_transp - 1F.conv2d(zero_added_image,
weight=kernel,
stride=1,
padding=padding_implicit)
**Output:
tensor([[[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]]])**
又来了!这与转置卷积函数产生的输出相同!下图说明了整个事情:
使用步长为 2 的转置卷积。图片作者。
上面的两个例子足以让你理解转置卷积的要点,以及如何使用它们来增加输出的大小(高度和重量)。
输出大小
"有没有一种简单的方法来计算产量的大小?"
当然,给定图像和内核大小、步幅(转置)和填充(转置),结果输出的大小遵循以下公式:
转置卷积的输出大小
最后的想法
转置卷积非常有用,尤其是在生成模型中,并且很容易简单地假设它们是常规卷积的“相反”操作(因为它们增加了输入的高度和宽度),而无需过多考虑。不过,它们的内部工作方式有点复杂,所以我希望我能帮助你更好地理解它们。
如果你想了解更多 PyTorch,计算机视觉,NLP 的知识,给我自己的系列丛书, 深度学习用 PyTorch 循序渐进 ,一试:-)
如果您有任何想法、意见或问题,请在下面留下评论或通过我的 个人资料链接 页面联系。
如果你喜欢我的文章,请考虑使用我的推荐页面 注册一个中级会员 来直接支持我的工作。对于每一个新用户,我从中获得一小笔佣金:-)
什么是视觉变形金刚,它们对通用学习有何重要性?
探索概念并尝试示例应用
图 1:行动中的视觉变形金刚(图片由作者提供)
在过去的几年里,人工智能领域取得了重大进展。生成模型是视觉领域中最成功的,然而,它们是为高度专业化的任务而构建的。每当任务改变时,这些专门的学习模型需要重建或再培训。因此,对通用学习模型的兴趣正在增加。其中一种模型叫做变形金刚。在本文中,我们简要讨论:
- 什么是变压器?
- 什么是视觉转换器(ViT)?
- ViTs 的各种应用有哪些?
- vit 如何用于通用学习?
1。 正文变形金刚
转换器的概念起源于自然语言处理(NLP)应用,其任务是理解文本并得出有意义的结论。Transformer 模型已经实现了高性能,并且由于其简单性和可推广性,已经成为 NLP 领域中事实上的标准。
图 2:用于语言翻译的转换器示例(图片由作者提供)
在文本处理应用程序中,数据由来自一组固定词汇表的大量单词组成。在典型的变压器架构中,执行以下一系列步骤:
► *Text is split into a set of words called tokens.**► Each token is converted into an encoded/embedded vector (e.g. word2vec)**► The position of the word in the sequence is encoded using position embedding [1] and integrated with the word embedding.**► The embeddings are fed into the Transformer encoder.**► The encoder has a Multi-Layer Self-Attention Network (MSP) which assigns weights to tokens based on their relative importance in the sentence, hence embedding the context.**► A Multi-layer Perceptron (MLP) network follows the MSP and encodes the output from the attention network.**► There are multiple MSP and MLP blocks along with Norm layers inside the encoder.**► A final MLP-Head Layer is added outside the encoder network which provides the logits. Logits can be converted to probabilities by applying an activation layer (e.g. softmax).*
正如我们所看到的,变压器网络的架构是通用的,因为编码器输出不是为特定任务(例如分类)构建的,而是通过添加相应的 MLP 头来提供可用于多种应用的通用编码。这就是为什么变形金刚在迁移学习中是有用的,并且有希望实现通用的学习目标。
2。 【视觉变形金刚(ViT)
Vision Transformer (ViT)的概念是 Transformer 原始概念的扩展,后者在本文前面被描述为 text transformer。这只是在图像域中的变换器的应用,在实现中稍作修改,以便处理不同的数据形态。更具体地说,ViT 使用不同的方法进行标记化和嵌入。然而,通用架构保持不变。输入图像被分割成一组图像块,称为视觉标记。视觉标记被嵌入到一组固定维度的编码向量中。图像中碎片的位置与编码矢量一起被嵌入,并被馈入变换器编码器网络,该网络基本上与负责处理文本输入的网络相同。在图 3 [2]中可以看到运行中的 ViT 架构示例。
图 3:用于图像分类的视觉转换器的演示(来源:谷歌研究
ViT 编码器中有多个模块,每个模块由三个主要处理元件组成:层范数、多头注意力网络(MSP) 和多层感知器(MLP) 。层规范保持训练过程在轨道上,让模型适应训练图像之间的变化。 MSP 是一个网络,负责从给定的嵌入式视觉标记生成注意力地图。这些注意力地图有助于网络聚焦于图像中最重要的区域,例如物体。注意力图的概念与传统计算机视觉文献中的概念相同(例如,显著性图和阿尔法抠图)。
MLP 是一个两层分类网络,末端是 GELU ( 高斯误差线性单元)。最后一个 MLP 块,也称为 MLP 头,用作变压器的输出。在此输出上应用 softmax 可以提供分类标签(即,如果应用是图像分类)。
3。应用应用
由于其通用性,ViTs 的应用几乎涵盖了视觉的所有方面。这包括图像分类、图像到文本/文本到图像生成、视觉推理、联想学习和多模态学习。在本节中,我们将通过实际例子来试验 ViTs 最常见和最成功的应用。
3.1。 【图像分类】(图像- >标签)
图像分类是视觉中最常见的问题。图像分类任务的最新技术是基于 CNN ( 卷积神经网络)的方法。vit在小型到中型数据集上没有产生可比较的性能,然而,它们在非常大的数据集上已经胜过CNN[3]。这是因为CNN比 ViTs 更有效地对图像中的局部信息进行编码,这是由于局部受限感受野的应用。
让我们试着用 ViT 做实验。我们首先加载一个已经在 imagenet 上训练过的预训练模型,然后将其应用于从互联网上收集的一组随机图像。我们为给定的图像挑选五个最可能的标签。结果可以在图 4 中看到。结果可能不是超级完美的;然而,他们很好地记住,网络不是在这些图像上训练的。
图 4:ViT 的图像分类输出(作者提供的图像)
3.2。 图像字幕(图像- >句子)
通过生成描述图像内容的标题而不是一个单词的标签,可以实现更高级形式的图像分类。随着 ViTs 的使用,这已经成为可能。 ViTs 学习给定数据形态的一般表示,而不是一组粗糙的标签,因此,可以为给定图像生成描述性文本。我们将使用在 COCO 数据集上训练的ViT【4】的实现。这种字幕的结果可以从图 5 中看出。
图 5:使用 ViT 生成图片标题(图片由作者提供)
3.3。 对比语言-图像预训练(图像< - >文本片段)
图 6:具有对比语言-图像预训练的 ViT 架构(来源: Google Research
ViTs 的一个更高级的应用是学习图像和文本之间的联系。这是一个需要真正概括能力的应用程序,因为它需要文本和图像的抽象表示。这可以通过为文本片段和图像训练两个独立的变换编码器来实现。然后,可以通过构建余弦相似性矩阵来比较编码图像和文本特征各自的相似性。在 CLIP(对比语言图像预训练)[5]中提出了这种变换器模型的相关实现。为了进一步理解这一点,我们取了五个样本图像,并为每个图像编写了一个小的文本片段。然后利用预先训练好的 ViT 模型,将文本片段和图像分别编码成一组文本和图像特征向量。我们计算文本和图像特征之间的余弦相似度。这将产生如图 7 所示的输出。可以看出,正确的图像-文本对之间的相似度最高。这种学习方式相对来说更普遍,是迁移学习的一种形式。
图 7:图文关联学习的 ViT 结果(图片由作者提供)
4。 最后备注
在本文中,我们解释了文本转换器和图像转换器的概念。然后,我们通过构建和实现实际的例子,探索了变压器模型的一些主要应用。如果您想更深入地研究并获得代码,那么您可以从 git 存储库中访问相应的 python 笔记本和帮助代码。https://github.com/azad-academy/vision-transformers
在接下来的文章中,我们将更深入地研究迁移学习和变压器网络的一些最新进展。
5。 参考文献
[1] Mehreen Saeed,Transformer 模型中位置编码的温和介绍,https://machine learning mastery . com/A-Gentle-Introduction-To-Positional-Encoding-In-Transformer-Models-part-1/,2022 年
[2] Alexey Dosovitskiy,Lucas Beyer,Alexander,Dirk Weissenborn,Xiaohua Zhai,Thomas Unterthiner,Mostafa Dehghani,Matthias Minderer,Georg Heigold,Sylvain Gelly,Jakob Uszkoreit,Neil Houlsby,“一幅图像相当于 16x16 个字:大规模图像识别的变形金刚”,ICLR,2021 年
[3]陈湘宁、谢卓瑞、龚柏青,“当视觉变形金刚在没有预训练或强大数据增强的情况下胜过 ResNets 时”,2022 年
[4] Saahil 等人,CaTr:变形金刚的图像字幕,https://github.com/saahiluppal/catr,2020 年
[5] 亚历克·拉德福德,琼·金旭,克里斯·哈勒西,阿迪蒂亚·拉梅什,加布里埃尔·戈,桑迪尼·阿加瓦尔,吉里什·萨斯特里,阿曼达·阿斯克尔,帕梅拉·米什金,杰克·克拉克,格雷琴·克鲁格
从 1001 个 A/B 测试中可以学到什么?
原文:https://towardsdatascience.com/what-can-be-learned-from-1-001-a-b-tests-361a4b6e40a7
对测试持续时间、样本大小、提升、功效、置信阈值和连续测试的表现进行深入了解的荟萃分析
卢克·切瑟在 Unsplash 上的照片
典型的 A/B 测试运行多长时间?有百分之多少的 A/B 测试会产生“赢家”?在线控制实验达到的*均升力是多少?顶级转化率优化专家在为网站和移动应用提供有效干预方面有多出色?
使用 Analytics-Toolkit.com 统计分析*台分析的 1001 个 A/B 测试的元分析旨在提供这些和其他与在线 A/B 测试相关的问题的答案。演示文稿的布局如下:
对主要发现和简要概述感兴趣的人可以直接跳到“要点”。
所有图片和图表,除非特别注明,均由 Analytics-toolkit.comhttps://www.analytics-toolkit.com/提供
背景和动机
A/B 测试,也称为在线控制实验,是在线业务中证据和风险管理的黄金标准。它们是估计不同类型干预的因果影响的首选工具,通常目标是改善网站或应用程序的性能,并最终改善业务成果。因此,A/B 测试的作用主要是作为一种管理业务风险的工具,同时应对创新和改进产品或服务的持续压力。
考虑到这一把关者角色,A/B 测试的执行方式至关重要,这种方式可以产生可靠的结果,同时*衡误报和漏报结果的业务风险和回报。A 2018 元分析[1]115 个公开可用的 A/B 测试揭示了与在线受控实验的规划和分析相关的重大问题。也就是说,大多数测试(70%)出现了动力不足,提出了与去向不明 窥视 和低统计功效相关的问题。第一种可能会导致估计值过高,对假阳性率缺乏控制,而第二种可能会导致无法检测到真正的改进,并因样本量不足而错过从测试中学习的机会。
自分析工具包于 2014 年推出以来,解决这些问题和促进稳健的统计实践一直是开发 A/B 测试统计工具背后的主要驱动力。在 2017 年,提出并实施了顺序测试方法(敏捷)来解决窥视背后的动机,以提供效率并提高测试的 ROI,而不损害统计的严谨性。2021 年底,发布了一个经过彻底改革的*台,其目标之一是解决 A/B 测试结果不佳的第二个主要原因——统计能力不足。改革的其他目标包括防止或尽量减少在线 A/B 测试中应用统计方法的其他常见错误。
鉴于上述情况,当前的元分析有多个目标:
- 提供一个结果无偏见的分析,改善以前的研究,可能遭受选择性报告问题。
- 产生一个更强大的,因此更有价值的分析。
- 检查顺序测试的真实表现,顺序测试本质上取决于测试干预的未知真实效果。
- 揭示关于关键数据的新见解,如测试持续时间、样本大小、置信阈值、测试功效,并探索测试干预的效果分布。
- 检验 Analytics Toolkit 测试计划和分析向导在多大程度上可以鼓励 A/B 测试中的最佳实践,并减轻测试不足的问题。
数据和方法
该分析中的数据来自自 2021 年末推出新的分析工具包*台以来进行的 1,001 次测试的样本。数据集包含固定样本测试和顺序测试(敏捷测试),90%的测试属于后一种类型。
最初测试的较大样本被筛选,以便只包括在此期间进行了三次以上 A/B 测试的用户的测试。基本原理是尽量减少对*台没有足够经验的用户的测试比例,以及在探索软件功能时输入的测试比例,因为这些测试可能包含有问题的数据。
基于测试计划和实际记录的观察之间的极端不匹配,删除了 46 个异常值。据认为,这种不匹配很可能表明对顺序测试方法不熟悉或执行非常差,使得从这些方法中得出的统计数据有问题。这些异常值的去除对敏捷效率数字产生了最大的实质性影响,带来了 3–4 个百分点的积极影响..
此外,估计升力超过 100%的 22 项测试被删除,因为这些结果很可能不是基于声音质量的实际数据。在所有三个屏幕之后,剩余的测试数是 1,001。
鉴于 Analytics Toolkit 大多数用户的已知特征,A/B 测试很可能代表由高级和专家 CRO 从业者以及那些对统计知识和理解高于*均水*的人进行的测试。
基本测试特征
A/B 测试的分析样本的基本特征包括测试持续时间、样本大小和每次测试的测试变量数量。测试持续时间提供了有关测试外部有效性的信息。样本大小提供了估计的统计能力和质量的概念,而变异数是从业者在所谓的 A/B/N 测试中测试一个以上变异与对照的频率的简单度量。
试验时间
测试持续时间的分布
所有 A/B 测试持续时间的算术*均值为 35.4 天,等于五周。中位数是 30 天,这意味着一半的测试持续不到一个月。大多数测试跨越了一个时间框架,这个时间框架允许对任何结果进行良好的概括。
在 50 天截断的测试持续时间的分布
放大图表显示了与在整周间隔上监控的测试相对应的显著峰值:在 7 天(1 周)、14 天(2 周)、21 天(3 周)等等,直到 49 天(7 周),在这一点上,由于数据量低,该模式不再可见。似乎大量的测试都是按照外部有效性的最佳实践进行的,这应该会导致任何结果的更好的普遍性。
样本量
每次测试的用户数量,为方便使用,图表截断为 100 万
每次测试的会话数,为方便使用,图表截为 2,000,000
对于以用户为主要衡量标准的测试,*均样本量为 217,066 个用户,但中位数仅为 60,342 个用户。对于基于会话指标的测试,*均样本量为 376,790 个会话,而中位数为 72,322 个会话。
这种类似幂律的分布并不令人惊讶,因为幂律分布描述了用户和参与度在网络属性和移动应用之间的分布。
如果没有主要指标的基线率和标准偏差的背景,样本大小本身没有什么意义,但我们可以有把握地说,抽样测试包括足够数量的用户或会话,以避免与非常小的样本大小相关的统计复杂性。
变体数量
在 Analytics Toolkit *台上进行的绝大多数测试(88%)只包括一个测试变量和一个控制变量。只有 10%包含两个变体,只有 2%包含三个或更多变体。似乎大多数专业转换率优化者更喜欢用一个单独的、经过深思熟虑的干预来计划测试,而不是花更多的时间一次性测试一组更多样化的想法。人们可以推测,这反映了对快速实现的增量改进的偏好,而不是花费更长时间的更复杂的测试,每个测试都带有更高的不确定性。
高级测试参数
高级测试参数反映了数据集中 A/B 测试最重要的统计设计的关键方面。
置信阈值
使用的置信度阈值分布
置信度阈值的分布表明,在大多数测试中,阈值在 80%和 95%之间,只有少数例外。置信阈值在这个范围内稍微均匀分布的事实与用户利用向导或他们自己的风险回报计算来达到与手头情况匹配的特定阈值的情况并不矛盾。高于 95%的少数阈值可能对应于在有利于变体的错误结论的情况下具有更高风险的测试。
这种良好实践可以与“默认”应用 95%置信度阈值方法的一刀切方法形成对比。从商业角度来看,后者通常是次优的。
置信阈值分布似乎表明了 A/B 测试中两种类型风险的合理*衡,并且可以被视为这些测试的商业效用的积极因素。然而,这些数据本身并不是决定性的。
统计能力
统计功效的分布(相对于所选择的感兴趣的最小效应)
绝大多数测试的功率为 80%,然而也有少数大约三分之一的测试的功率为 90%。这是令人鼓舞的,因为 80%的功率提供了相当低的检测感兴趣的目标最小效应的真实效应的机会。在计划测试时,最好探究感兴趣的最小效应和功效曲线 90%点处的最小可检测效应之间的关系。
最小可检测效应
最小可检测效应分布
90%功率下最小可探测效应的分布如下图所示,*均值为 11.3%,升力中值为 6%。
三分之二的试验具有低于 10%升力的最小可检测效应,这明显多于之前荟萃分析中大约四分之一的试验[1]。6%的中值意味着半数试验的 MDE 低于 6%的相对升力。这可能是向导的指导和使用该工具的实践者的经验共同作用的结果。仅凭手头的数据很难理清这两者。
上述数字可以被解释为暂时支持 2018 年荟萃分析[1]中观察到的至少一些不切实际的 mde 与未说明的窥视有关的结论。
无论如何,这些都是非常令人鼓舞的数字,尤其是根据下一节的调查结果。
结果统计
提升估计是固定样本检验的简单无偏最大似然估计,也是序贯检验的偏倚缩减最大似然估计。
积极成果的百分比
大约 33.5%的所有 A/B 测试具有统计显著性结果,其中一个变体优于对照。这高于之前的荟萃分析[1]中观察到的 27%,也高于 Kohavi、Tang 和 Xu (2020 年)在第 112 页[2]的综述中报告的行业*均值的上限。鉴于本荟萃分析的纳入标准中没有结果偏倚,这一数字可以被视为被测试观点及其实施(也称为干预)相对较高质量的证据。
考虑到 Analytics Toolkit 用户的众所周知的概况,其中高级和专家 CRO 从业者的比例过高,这种高比例的“赢家”并不完全令人惊讶。它显示了积累的知识和经验的价值,并可能意味着这些专业人员更善于筛选出糟糕的想法和/或表明他们对决策者的影响力,即哪些想法进入了测试阶段。
提升估计
升力估算分布
尽管上面的数字很乐观,一种解释所有 A/B 测试的提升估计值的方法是,显示这些精英专业人员产生和实施为在线业务带来重大价值的想法的能力有限。中值提升估计值仅为 0.08%,而*均值为 2.08% ( 标准误差为 0.552%)。这意味着*一半的测试干预措施没有影响或有负面影响。即使在积极的估计增长中,大多数也低于 10%。另一方面,大多数估计的负面影响也只有不到 10%的影响。
与具有相同均值的正态分布相比较的升力估算分布
(由 GIGAcalculator.com 提供)
使用 p 值< 0.0000001 on all five of the battery of tests supported by GIGAcalculator’s 正态性检验计算器,提升估计值显然不是正态分布的。尾巴很重,向正端倾斜。零左右的估计主导了形状。
上述数据表明,影响用户行为是很难的。影响用户执行一个想要的动作和让他们偏离他们想要实现的目标是一样困难的。然而,正中值和*均值反映了测试的干预措施具有比掷硬币更好的产生积极效果的可能性,与零的差异具有统计学意义(p = 0.000084h0:%升程≤ 0),相关的 95%区间跨度为[1.172%,+∞)。
统计显著性检验的最佳变量的提升估计值
在具有统计意义的积极结果中,中值提升估计值是可观的 7.5% ,而*均值是巨大的 15.9% !标准差为 19.76%,均值的置信区间如下:95%CI [13.76%,17.98%];单侧 95%CI [14.1%,+∞]。这意味着带有“获胜”变体的测试可能会给企业带来巨大的价值。
在少数情况下,获胜变体的提升估计低于零,这反映了非劣性测试。鉴于一些积极的估计也来自非劣效性测试,上述提升的潜在好处可能比数字显示的更大。
统计非显著性检验的最佳变量的提升估计值
在没有统计显著结果的试验中,大多数具有负的估计升力,而一些具有正的估计升力。*均值为 -4.9% ,中位数为 -1.7% ,这些数据说明了为什么执行 A/B 测试如此重要(SD = 10.8%,95%CI [-5.70%,-4.07%],单侧 95%CI (-∞,-4.201))。在许多情况下,不太可能在非实验环境中检测到如此小的影响,因为任何类型的观察性事后评估(变化影响估计)都涉及更大的不确定性。
顺序测试的效率
本节中的统计数据反映了顺序测试及其性能的各个方面。为某个最大目标样本量和达到该目标的若干中期评估计划了连续实验,但可能在任何评估时停止(“提前”),这取决于到该点为止的观察数据。顺序测试的效率取决于所执行的顺序测试的类型、测试计划以及测试干预的真实效果大小和方向。
*均停止阶段
使用 AGILE 的连续评估在线实验*均计划用于 10.8 个监控阶段。这些测试*均在第 5.6 次分析时停止,表明它们在最大计划测试持续时间/样本量的一半时停止。这与顺序测试的预期性能相一致,这意味着人们可以安心地为测试计划更长的最大运行时间,因为如果结果相对于感兴趣的最小效果过于积极或过于消极,测试将会提前终止。
实际运行时间与最大运行时间
顺序 A/B 测试的停止阶段和实际运行时间取决于测试干预的真实效果大小和方向。实际运行时间占各自最大运行时间的百分比分布如下所示。
测试运行时间与计划最大值的分布
*均值和中间值几乎相同,分别为 64%和 64.7%,这意味着测试*均在不到最大计划运行时间的三分之二时停止。
有 57 个测试在其最大运行时间的 100%处停止,这表明只有 2 个监控阶段的测试数量高于预期,和/或计划的测试数量非常完美(单位时间内非常稳定的用户或会话率),和/或测试出于任何原因进入事后阶段。两阶段测试是一个小因素,但很难区分其他两个。因此,这些很可能代表了人工测试(例如,为了比较估计值和固定样本分析的目的,事后重新分析测试),而不是使用 AGILE 计划和分析的实际测试。
如果假设是这种情况,那么这些测试会使分布向上倾斜,而真正的*均值和中间值大约是最大运行时间的 62%,这稍微提高了性能。然而,大多数这样的测试实际上是人为的可能性被认为是足够低的,不能保证完全排除在分析之外。
性能对比等效固定样本测试
相当于固定样本设计百分比的样本量分布
性能与固定样本当量的关系反映了性能与最大运行时间的关系,峰值出现在固定样本当量的 105%到 115%之间,因为在 5 到 12 次分析之间的大多数测试中,5–15%是预期的最坏情况样本量膨胀。序贯检验的*均样本量和中值样本量分别是同等固定样本检验的 73.4%和 74%。这使得*均节省的时间和用户暴露在 26%左右。如果从数据中移除 105%和 115%之间的意外峰值,这些数字将提高到约 71.5%和约 28.5% 。
据我所知,这是第一次对在线 A/B 测试中真实干预的稳健频率主义序贯测试方法的实际性能进行元分析。它证明了使用顺序测试优于固定样本测试的优势,尽管这种影响相对于估计值有所减弱,这主要是因为所有测试的估计升力分布远非正常,密度明显集中在零附*。
外卖食品
荟萃分析通过提供一个比以前的荟萃分析多*十倍的结果无偏的测试集合来实现其前两个目标。它还提供了使用 Analytics Toolkit 测试计划和分析向导的积极效果的临时证据。
现实场景中顺序测试优势的证据是大量的,至少支持 26%的运行时间/样本量性能提升,测试的 ROI 可能有更大的提高,因为在测试中,由于有效性或无效性而提前停止的真实效果的大小不成比例。
荟萃分析还得出以下关键数据:
- 33.5%的 A/B 试验产生了具有统计学意义的阳性结果,*均效果为 15.9%,而其中一半的估计效果大于 7.5%。
- 所有测试的中值升力估计为 0.08%,*均值为 2.08%,证明了 CRO 专业技术的优势,与零相比具有显著的统计学差异。
- 对于大多数测试,估计升力接*于零,这对于功率分析和样本量规划具有重要意义。重要的是,它证明了对随机对照试验的需求,该试验具有优于观察方法的稳健统计估计,而观察方法检测这种微小变化的能力要差得多。
- 就*均效率改进而言,与同等的固定样本规模测试相比,真实场景中的顺序测试至少有 26%的优势
- 88%的测试是简单的 A/B 测试,只有 12%是 A/B/N 测试,大多数测试只有两个变量,这表明专家 cro 更喜欢保持简单和迭代,而不是运行更复杂的测试。
- 典型的测试持续时间约为一个月,或四到五周,*均来说,表明结果具有良好的普遍性。
- A/B 测试*均包括 60,342(中值)到 217,066(*均值)个用户,以及 72,322(中值)到 376,790(*均值)个会话。
- 大多数在线实验都是在 80%到 95%的置信度下进行的。
- 一半的 A/B 测试有 90%的概率检测到 6%或更低的真实影响,而*均 MDE 为 11.3%,这表明更好的测试成为顶级专业人士的标准。
假设分析中的大多数测试是针对关键业务指标执行的,很少是针对不太连续的用户操作,那么可以推断出测试比直接实现的好处。在两家希望实施相同变革的相同公司中,仅实施通过 A/B 测试的变革的公司将比仅实施所有变革的公司实现快数倍的增长。它也会变得更加顺畅,这在商业中至关重要。前者的优势来自于只实施*均提升 15.9%的成功测试,而后者的*均提升仅超过 2%,尽管成功测试导致实施了所有提议变更的三分之一以上。
虽然最后一个结论可能有点夸张,但它应该是说明统计开销时测试的显著边际效益的主要例子。准备、运行和分析测试的各种开销需要单独考虑,典型的规模经济在起作用。
参考
[1],g . z .(2018)“115 个 A/B 测试的分析:*均 Lift 为 4%,大多数缺乏统计功效”[在线]在https://blog . analytics-toolkit . com/2018/Analysis-of-115-A-B-Tests-Average-Lift-Statistical-Power/,[ 2]科哈维,唐,徐(2020)《可信的在线对照实验:A/B 测试实用指南》,剑桥:剑桥大学出版社。ISBN:978–1–108–72426–5。土井:10.1017988686861
原载于 2022 年 10 月 18 日 https://blog.analytics-toolkit.com的* 。*
我们能从后验分布中学到什么?
原文:https://towardsdatascience.com/what-can-we-learn-from-posterior-distributions-43671a2cb960
贝叶斯后验概率的频率主义解释
假设我们观察到了来自未知分布 q 的 N 独立同分布 (iid)样本 X = (x1,…,xN) 。统计学中的一个典型问题是“样本集 X 告诉我们关于分布 q 的什么信息?”。
参数统计方法假设 q 属于一个参数分布族,并且存在一个参数 θ 其中 q(x) 等于所有 x 的参数分布p(x |θ);比如 p(。|θ) 可以是单位方差的正态分布,其中 θ 表示其均值。在这个设定中,问题“关于 q ,X 告诉了我们什么?”被翻译成“关于参数 θ ,我们有 q = p(。|θ) ?”。
回答这个问题的贝叶斯方法是使用概率论的规则,并假设 θ 本身是一个随机变量,具有先验分布 p(θ) 。先验分布 p(θ) 是我们在之前对 θ 的假设和猜测的形式化。在这种情况下,我们可以将参数和数据的联合概率分布写在一起:
使用这个公式, X 捕获的关于 θ 的所有信息可以在后验分布中进行总结
方程式 1。后验分布
贝叶斯统计是美丽的,自洽的,优雅的:一切都是使用概率论的规则自然得出的,假设总是清晰明了的。但往往看起来神秘而令人费解:(一)关于底层分布 q 我们真的能从后验分布 p(θ|X) 中学到什么?以及(ii)如果我们的假设不成立,例如,如果 q 不属于我们考虑的参数族,该信息的可靠性如何?
在本文中,我的目标是获得关于这两个问题的一些直觉。我首先分析当样本数 N 很大时后验分布的渐*形式——这是一种研究贝叶斯推理的频率主义方法。第二,我展示了一般理论如何应用于高斯家族的简单情况。第三,我使用模拟和分析,对于三个案例研究,后验分布如何与数据的基本分布相关,以及这种联系如何随着 N 的增加而变化。
理论:大 N 的渐*情况
等式 1 中的后验分布的对数可以重新表示为
方程式 2。对数后验分布
等式 2 中的常数(相对于 θ )仅对于归一化后验概率分布是重要的,并不影响它如何作为 θ 的函数而变化。对于较大的 N ,我们可以使用大数定律,并通过下式*似等式 2 中的第二项(对数似然的总和)
其中 D-KL 是 Kullback-Leibler 散度并且测量真实分布 q 和参数分布 p(.|θ) 。然而,重要的是要注意,只有当 log p(x|θ) 的均值和方差(相对于 q )对于某个参数 θ 是有限的时,*似才有效。我们将在下一节中进一步讨论这个条件的重要性。
如果 p(θ) 在参数空间上具有完全的支持(即,总是非零),那么 log p(θ) 总是有限的,并且对于大的 N ,等式 2 中的主导项是 D-KL [q || p(。|θ)] 乘以 N. 这意味着增加样本数 N 会使后验分布 p(θ|X) 越来越接*该分布
方程式 3
其中 Z 是归一化常数。p (θ;N) 是一个有趣的分布:它的最大值是散度 D-KL [q || p(.|θ)] 最小(即当 p(。|θ) 尽可能接* q ,其对D-KL【q | | p(。|θ)]* 随着样本数 N 的增加而增加(即,随着 N 的增加,其最大值附*变得更加“狭窄”)。
当假设正确时
当假设正确并且存在一个 θ* 时,我们有 q = p(。|θ)* ,那么
其中D-KL【p(。|θ) || p(。|θ)】*是 θ 和 θ* 之间的伪距离。因此,随着 N 的增加,后验分布集中在真实参数 θ* 附*,为我们提供了完全识别 q — 所需的所有信息,见脚注。
当假设是错误的时候
当没有 θ 时,我们有 q = p(。|θ) ,那么我们永远无法识别真正的底层分布q——仅仅是因为我们没有在正确的地方搜索!我们强调,这个问题不限于贝叶斯统计,并扩展到任何参数统计方法。
虽然在这种情况下我们永远无法完全确定 q ,但是后验分布仍然提供了关于 q 的信息:如果我们将 θ* 定义为 q 在参数族空间上的伪投影的参数:
然后,随着 N 的增加,后验分布集中在 θ* 附*,给我们足够的信息来识别参数族中的最佳候选值q——参见 footnote⁴.
中间总结
随着 N 的增加,后验分布集中在参数 θ* 附*,该参数描述了参数族中最接*实际分布 q 的分布。如果 q 属于参数族,那么最接* q 的分布就是 q 本身。
示例:高斯分布
在上一节中,我们研究了大量样本的后验分布的一般形式。在这里,我们研究一个简单的例子,看看一般理论如何应用于具体情况。
我们考虑一个简单的例子,其中参数分布是高斯分布,单位方差和*均值等于 θ :
为简单起见,我们将标准正态分布视为先验 p(θ) 。使用等式 1,很容易表明后验分布为
随着
现在,我们还可以确定*p (θ;N) (见等式 3)并将其与后验分布进行比较:只要真实分布的均值和方差 q 是有限的,我们就有
因此,我们可以写出(使用等式 3)
随着
方程式 4
如一般理论所料,我们可以用*p (θ;N) 为大 N 因为
总而言之, p(θ|X) 集中在基础分布 q 的真实均值附*——如果它存在的话。
模拟:好的、坏的和丑陋的
我们的理论分析有两个关键的假设:(i) N 很大,以及(ii)logp(x |θ)的均值和方差(相对于 q )对于某些 θ 是有限的。在本节中,我们使用模拟来研究如果这些假设不成立,我们的发现有多可靠。
为此,我们考虑上一节中示例的简单设置,即具有单位方差的高斯分布族。然后,我们考虑 q 的三种不同选择,分析后验 p(θ|X) 随着 N 增加的演化。
另外,我们还看看最大后验概率(MAP)估计值 q-MAP-N = p(。 q 的|θ-hat-N) 随着 N 的增加而演化,其中 θ-hat-N 是 p(θ|X) 的最大化器。这有助于我们理解,通过查看后验 distribution⁵.的最大化器,我们可以多么精确地识别真实分布
好:高斯分布
对于第一种情况,我们考虑最好的情况,即 q 属于参数族,并且满足所有假设:
方程式 5。等价于 q(x)=p(x|θ=1)
我们从 q 抽取 10000 个样本,通过将抽取的样本对 N = 1 到10000逐一相加,得到后验分布 p(θ|X=(x1,…,xN)) 和 MAP 估计 q-MAP-N — (图 1)。我们观察到当 N 增加(图 1,左侧)时 p(θ|X) 集中在真实参数周围,并且 MAP 估计收敛到真实分布 q (图 1,right)⁶.
图一。高斯分布为 q. 左图:作为 n 的函数的后验分布的均值(黑色实曲线)和标准差(灰色阴影区域)黑色虚线表示 q=p(.|θ=1).后验分布收敛于真实参数。垂直彩色线条显示 N=2、10、100 和 1000。右图:N=2、10、100 和 1000 时 q 的 MAP 估计值(彩色曲线)。黑色虚线表示真实的分布 q。
坏:拉普拉斯分布
对于第二种情况,我们考虑将单位均值的拉普拉斯分布作为真实分布:
在这种情况下, q 不属于参数族,但它仍然具有有限的均值和方差。因此,根据理论,后验分布应该集中在参数族上 q 的伪投影的参数 θ* 周围。以高斯族为例, θ* 始终是底层分布的均值,即 θ = 1* (见等式 4) 。
我们的模拟显示随着 N 的增加 p(θ|X) 确实集中在 θ = 1* 附*(图 2,左侧)。然而,MAP 估计收敛到一个与真实分布 q (图 2,右)完全不同的分布,这仅仅是因为我们在高斯分布中搜索拉普拉斯分布!这本质上是任何参数统计方法的问题:如果搜索错了地方,就找不到正确的分布!
图二。拉普拉斯分布为 q. 左图:后验分布的均值(黑色实曲线)和标准差(灰色阴影区域)为 n 的函数,黑色虚线表示 q 在参数族上的伪投影对应的参数,即θ=1(见方程 4)。后验分布收敛于θ。垂直彩色线条显示 N=2、10、100 和 1000。右图:N=2、10、100 和 1000 时 q 的 MAP 估计值(彩色曲线)。黑色虚线表示真实的分布 q。
柯西分布
对于我们的第三种也是最后一种情况,我们选择最差的情况,并将柯西分布(著名的重尾分布)视为真实分布:
在这种情况下, q 不属于参数族,但更关键的问题是柯西分布没有明确定义的均值或有限方差:所有理论的假设都被违反了!
我们的模拟显示, p(θ|X) 并不收敛于任何分布(图 3,左侧): p(θ|X) 的标准差趋于零,并集中在其均值附*,但均值本身并不收敛,而是从一个值跳到另一个值。问题是基本的:柯西分布和高斯分布之间的 KL 散度是无限的,与它们的参数无关!换句话说,根据 KL 散度,所有的高斯分布都与 q 等距(且无限远),所以不存在挑哪一个作为其估计的偏好!
图三。柯西分布如 q. 左图:作为 n 的函数的后验分布的均值(黑色实曲线)和标准差(灰色阴影区域),黑色虚线表示 q 的中值:如果 q 有均值,那么由于对称性,该均值将等于 1。后验分布不收敛于任何分布,其均值从一个值跳到另一个值。垂直彩色线条显示 N=2、10、100 和 1000。右图:N=2、10、100 和 1000 时 q 的 MAP 估计值(彩色曲线)。黑色虚线表示真实的分布 q。
结论
如果我们假设的参数分布族与真实分布 q 没有太大差异,那么后验分布总是集中在一个参数周围,该参数在某种程度上提供了关于 q 的信息。然而,如果 q 不在参数族中,该信息可能只是边缘信息,并不真正有用。最坏的情况是当 q 与参数族中的任何分布相差太大时:在这种情况下,后验分布是无信息的。
承认
感谢 Johanni Brea 、 Navid Ardeshir 、Mohammad Tinati、 Valentin Schmutz 、 Guillaume Bellec 和 Kian Kalhor 对相关主题的多次讨论。
代码:
脚注:
有多个优秀的开放存取教科书,感兴趣的读者可以在其中找到更多关于贝叶斯统计的信息:布拉德利·埃夫隆和特雷弗·哈斯蒂的[1] " 计算机时代统计推断;安德鲁·格尔曼等人的[2] " 贝叶斯数据分析;大卫·麦凯的[3] " 信息论、推断和学习算法。此外,参见脚注 3 和 4 以及本在线课程。
一个有趣的练习是估计 p(θ|X) 和p (θ;N) 都是。作为提示,请注意,您可以在p (θ;的最大化器周围使用不同分布的泰勒展开式。N) 。好奇的读者可能也想思考这些结果告诉我们关于参数 θ的最大似然估计的什么。
要了解更多关于贝叶斯推断的渐*一致性,你也可以看看 Barron et al. (1999) 和 Walker (2004) 这两个众所周知的例子。
要了解更多关于模型错误设定下的统计推断,可以看看kle ijn and van der vaart(2006)、kle ijn and van der vaart(2012)、 Wang and Blei (2019) 等几个众所周知的例子。
⁵我们还可以研究后验预测分布q-PPD-n(x)**= p(x | x)=∫p(x |θ)p(θ| x)dθ如何随着 N 的增加而演变。在我们同时具有高斯先验和高斯似然的设置中,我们有 q-MAP-N(x) = 正常 (x|μ=θ-hat-N,σ =1) 和 q-PPD-N = 正常 (x|μ=θ-hat-N,σ =1+1/(N+1)) 。因此,我们对 q-MAP-N 的所有定性观察对于 q-PPD-N 也是正确的。
⁶有趣的练习给感兴趣的读者:你能计算出作为 q 方差函数的收敛速度吗?根据你的计算,你在图中看到的有意义吗?
数据工程师能从软件工程师那里学到什么,反之亦然
不要被你的工作描述所限制
在过去五年的职业生涯中,我成为了一名全职软件工程师和一名全职数据工程师。我注意到这两个角色有很多相似之处,帮助我顺利地从一个角色转换到另一个角色,但也有明显的差异,促使我学习新的技能。
分享它们的不同之处,更重要的是,从我的角度来看,一个角色可以从另一个角色身上学到什么,这将是一件有趣的事情。如果你正在考虑换工作,我希望这篇文章能给你一些启发。即使你不是,这篇文章仍然会帮助你离开你的舒适区,向别人学习。
我的情况
由于这篇文章会很主观,是否真的适合你要看了,我就简单说明一下我的情况。
软件工程->数据工程师(由高创立)
我最初在一家国际银行做软件工程师。我的工作是几乎从零开始构建软件来集成不同的内部银行应用程序,如数据仓库和报告工具。我主要使用的技术是 Python 作为主要编程语言,Apache Kafka 作为流媒体*台,RestAPI 框架如 Connexion 和 FastAPI,以及一点 SQL。
后来我跳槽到了一家创业公司,成为了一名数据工程师。我花了大部分时间使用诸如 Airflow 和 dbt 之类的工具构建数据管道和数据模型。整个堆栈在 GCP 上运行,所以我也可以学习云服务,如 BigQuery、Pubsub、云存储等。
正如你所看到的,虽然我有两个不同的职位,但他们在技术和工作类型上确实有共同点,那就是将数据从一个地方移动到另一个地方。这就是为什么我更容易做出改变。如果你是一个专注于 web 应用的软件工程师,那么这个转变对你来说可能更有意义。
软件工程师与数据工程师
维基百科将软件工程师定义为应用软件工程原理来设计、开发、维护、测试和评估计算机软件的人。
创作人:高
软件工程师是一个非常广泛的工作范畴。每个软件工程师的职责可能完全不同。总体而言,他们的任务包括:
- 从涉众、开发人员和其他利益相关方收集需求。软件需求包括功能性需求(如业务规则)和非功能性需求(如可靠性、可伸缩性、性能)。
- 设计系统的架构、组件、接口和其他特征。它涉及到与其他工程团队的合作,以确保解决方案能够融入大局。它还包括详细的实现设计,如算法、数据结构等。
- 使用一种或多种编程语言开发软件。
- 测试软件使用单元测试、集成测试、用户验收测试、冒烟测试等。这是一个实验性的,技术性的调查,为涉众提供关于软件质量的信息。
- 一旦软件投入使用,就对其进行维护。它指的是在发现错误时更新软件和监控服务的健康状况等活动。
软件工程师这个术语从 20 世纪 60 年代开始正式使用。随着领域变得越来越大越来越复杂,术语软件工程师不再足够清晰地描述这个人在做什么。因此,出现了许多新的工作角色,它们是软件工程师的分支:
- 全栈工程师—专注于 web 应用。
- IOS/Android 开发者——专注于移动应用。
- DevOps 工程师—开发和维护软件的发布、部署和运行流程。
同样,数据工程师也被认为是软件工程师的一个分支,重点是大数据。直到 2010 年代,数据工程师这个术语才被广泛采用。
维基百科将数据工程师定义为构建系统以收集和使用数据的人。
没错。数据工程师不是像构建 web 应用程序那样构建软件,而是构建一个系统。但是,让我们看看数据工程师的任务:
- 收集所有相关方的需求。这和软件工程师是一样的。
- 建立数据管道,从源系统收集原始数据,并将它们转换成数据用户可以理解的信息。数据工程师通常使用现有工具(如 Airflow 和 dbt)构建数据管道和数据模型。
- 上线后维护管道。与软件一样,监控数据管道的健康状况以确保数据的可靠性非常重要。
一般来说,数据工程师是软件工程领域的专家。下表显示了这两种角色之间的一些差异。
创作人:高
数据工程师能从软件工程师身上学到什么?
了解了他们的异同之后,再来看看他们是如何互相学习的。
- 测试,测试,测试
测试是软件工程生命周期中必不可少的单元。它帮助工程团队评估软件的质量,并确保它满足涉众的需求。
开发了一套软件测试策略,如单元测试、集成测试和用户验收测试,以减轻产品风险。一种常见的做法是将这些测试编码到 CI/CD 管道中,这样如果没有通过测试,软件将无法部署。
编写测试是每个软件工程师的 DNA,有许多测试框架,如 TDD(测试驱动开发)和 BDD(行为驱动开发)来帮助工程师编写测试。然而,对于数据工程师来说,测试仍然被视为必须拥有的东西。几个原因可能是:
- 数据管道正在处理许多未知因素。不像常规应用程序那样需要更多的输入,数据管道从许多来源接收各种格式的数据。除非我们有严格的数据契约,否则很难预测所有类型的数据并涵盖所有场景。(数据契约是现在的热门话题,你可以在查德·桑德森的博客文章中读到更多。)
- 甲骨文问题 。 Oracle 问题是指难以确定预期产出的情况。由于许多未知因素,有许多情况我们不知道如何处理,这也增加了难度。
- SQL 天生难以执行单元测试。SQL 是数据工程师的主流编程语言。但是执行单元测试并不容易,因为代码通常是一个很大的块,很难取出一部分来只测试那一部分。此外,像 BigQuery 这样的云服务没有本地环境(例如在本地运行 Postgres docker),因此测试期间的远程连接可能会造成麻烦。目前,大多数测试都是数据测试,不测试业务逻辑,而是测试数据质量,包括数据的新鲜度、完整性和唯一性。
关于 dbt 中的测试主题,你可以阅读我的如何在 dbt 中进行单元测试的文章。
*年来,随着数据工程领域越来越成熟,自动化测试终于比以往更多地被提及。像远大前程、 dbt 和 Dagster 这样的框架开发了简化测试的特性,从而提高了数据管道和数据模型的质量。
- 编码技巧
大多数数据工程团队使用数据工具,如 Airflow、Dagster 和 dbt。相比于作为软件工程师写底层代码,他们更抽象,更容易管理。但是核心数据处理仍然需要在整个管道中编写。
除了 SQL 之外,精通至少一种编程语言是很重要的。熟悉编程语言也使得为开源项目做贡献成为可能,例如,Airflow。
最*出现的基础设施代码(IaC)和管道代码(PaC)在数据工程领域越来越流行。它们减轻了基础设施管理和发布周期管理的负担。熟悉 terraform、bash 和 Github 动作肯定会提高数据工程师的工作效率。
- 监测数据产品的可靠性
在软件工程中,通常是在服务上线后才进行监控。监控使开发人员能够在问题还很小的时候就迅速发现问题。
数据产品监测,或者换句话说,数据可观测性还是一个新概念。数据可观察性允许组织完全了解他们的数据系统,并在早期阶段修复数据问题。数据管道是由许多步骤组成的复杂系统。考虑到流程中的许多步骤,在一个仪表板中找到错误指标的根本原因是令人沮丧的。
数据工程师应该更愿意在设计阶段的开始就有一个监控的心态,以避免潜在的挫折。
软件工程师能从数据工程师那里学到什么?
好吧,让我们看看另一边。虽然软件工程师是一般角色,但他们还是可以学习数据工程师的专业知识。
- 更愿意学习新技术
数据工程是一个基于工具的领域,并且这个领域还在不断发展。谷歌“数据工程景观”会返回带有数百种数据工具的图片。要跟上每一个工具是不可能的,但是偶尔跟上绝对是值得的。
网站现代数据栈为每个类别收集了很多数据工具。
成为数据工程师后,我花了更多的时间阅读数据博客和产品发布说明,并比以往更频繁地参加会议。我发现这是所有软件工程师的好习惯。无论你做什么类型的工作,浏览你的 LinkedIn 帖子和媒体,看看你所在的领域是否有新的东西可以吸收,这总是好的。
如果你发现你所在领域的前景已经相当稳定,你可能需要重新考虑这份工作对你来说是否仍然有趣或具有挑战性。
- 更负责端到端系统
如前所述,数据工程师负责端到端系统。它要求工程师有能力同时处理多个组件。当我还是一名软件工程师时,我主要关注我自己的组件。
关注多个组件是成为架构师的先决条件。软件架构师是负责与整个系统行为相关的高级设计选择的人。如果你的目标是成为一名软件架构师,你应该更加关注系统设计。
- 想想成本
这是我作为软件工程师从未想过的一个有趣的视角。数据工程师处理大数据,因此拥有一种经济高效的方法来存储和转换数据变得极其重要,尤其是对初创公司而言。
尽管成本不是软件工程师首先要考虑的事情,但无论从财务角度还是流程角度,始终考虑效率和效果都是一个好习惯。例如,如何改进软件以使用更少的内存、CPU 和存储。
结论
在这篇文章中,我谈到了数据工程师和软件工程师可以互相学习的东西。他们有相似但互补的专业知识。如今的科技市场已经衍生出许多新的职位,未来还会更多。根据公司的不同,工作之间的界限可以是清晰的,也可以是模糊的,但是不要被你的工作描述要求你做的事情所限制。保持开放的心态,不断学习。干杯!
缺少哪些数据科学在线学习*台
原文:https://towardsdatascience.com/what-data-science-online-learning-platforms-are-missing-713482c6ebc1
好奇心是你的朋友
布雷特·乔丹在 Unsplash 上的照片
如果你已经完成了一门课程,但仍然不知道你现在应该知道什么,不要担心。
如今,在线学习*台无处不在,对于任何想要学习新概念或提高技能的初出茅庐甚至是成熟的数据专业人士来说,这都是一种极好的资源。
介于这两个极端之间,我是在线学习*台的忠实粉丝。首先,与学院或大学里更传统的课堂式课程相比,它们相对便宜,因此各行各业的人都可以参加。其次,根据*台的不同,您可以探索各种各样的主题来拓宽您的数据视野。第三,一系列可用的教学方法将适用于大多数学习方式,无论是通过互动课程还是讲座式的内容。
这些综合因素实际上有助于任何希望学习数据专业的人在他们的领域变得非常博学。
然而。
而且还有一个大然。
在成为一个在线*台的成员并尽可能多地学习数据科学相关主题一年后,我开始注意到缺少了一些东西。
感觉这些课程就像是一个打勾练习,其中简单地提到了某些方法或功能,但没有详细解释。这就好像有人拿着一个剪贴板,上面写着“一个数据科学家必须听说过的所有事情”,并确保每个术语都被检查出来,不管是否有一个好的解释。我在另一篇文章这里中提到了这样做的后果。
有时,所用的例子几乎是“太完美了”。你会问一些问题:
但是这种技术如何处理我的数据呢?
当我在自己的项目中使用该技术时,为什么会出现所有这些错误?
现在,我不想让人觉得我讨厌在线学习*台。正如我上面提到的,我是一个超级粉丝,现在仍然使用它们来发展我的技能。但我想谈谈一些事情,这些事情将补充任何人在使用这些*台以更全面的方式增加他们的数据清单时的旅程。
- 好奇。如果你不理解某个主题,因为它的描述方式或他们在例子中使用的数据集,做更多的研究。将会有无限量的帖子或视频用不同的数据集解释这个概念,这可能会帮助你找到拼图中缺失的部分。(如果你找不到任何全面解释这个话题的文章,那么这是一个写你自己文章的好机会!)
- 阅读文档。尽量不要把你从课程中学到的任何东西当作真理。通过在线阅读官方文档,了解每个函数或方法的参数是干什么的。这些应该包含你需要知道的一切。仅仅因为学习*台在一个函数中使用了一个特定的参数,并不意味着这个参数是你应该一直使用的或者对你的数据是正确的。
- 尽量不要用手提钻解决你的数据问题。您刚刚在课程中学习的机器学习算法或可视化技术可能不是用于您的数据的最佳方法——尽量不要被*期偏差所诱惑!当然,你可以试一试,但是如果准确度分数不是很高或者你的观想看起来很糟糕,不要放弃。尝试各种技巧,选择最有效或看起来最好的!
- 对自己有信心。如果你已经完成了一门课程,但仍然不知道你现在应该知道什么,不要担心。有时需要时间来吸收知识。这没关系。与其仓促行事,只理解一半的理论,不如慢慢来,适当地提高自己的技能。
如果你正在读这篇文章,并且你有任何其他对你的学习之旅有帮助的建议,请在评论中提出来!
科学家能从经济学家那里学到什么
原文:https://towardsdatascience.com/what-data-scientists-can-learn-from-economists-a08b40c13fee
我最*看到两篇文章(第一部分 1 和第二部分 2 )将 ROC 图背后的思想归纳为一个更广泛的经济学驱动的模型选择框架。这是一个更广泛的值得关注的话题的一部分,但通常被完全排除在讨论之外。事实上,“像经济学家一样思考”的能力是大多数数据科学家应该拥有的绝对必要的技能,而且它是可以学习的。请记住,对于局外人来说,数据科学家就像谚语中的拿着锤子的人,对他来说,每个问题都像钉子。我们应该学会展示我们的“模型”为一个给定的用例提供的真正价值(如果有的话),并且用我们的观众能够理解的术语来表达。换句话说,我们应该根据每美元能产生多少效果来评估我们的模型,但是我们经常仅仅停留在效果上(例如,高精度,AUC,等等),而忽略了美元(货币成本和收益)。让我们改变这种心态。
每当我们在复杂的权衡面前犹豫不决时,一个想法是尝试快速利弊分析:对于每一个可能的结果,我们写下利弊,并找到一种方法将它们添加到一个单一的“目标”中,以表达我们对每个结果的总体满意程度。经济学家称之为效用。效用通常用货币术语来表达,但在更抽象的层面上,效用表达的是我们从给定结果中获得的净“收益”或“满意度”(如果效用为负,则是“不满意度”)。由于多种结果是可能的,我们可以通过给每种结果分配一个概率来表达我们的不确定性,并通过对所有可能结果的效用进行*均来计算预期效用。
同样,如果机器学习模型的预期效用大于它试图取代的任何过程,那么它就值得部署,这被称为基线。基线可能是某个人抛硬币决定的,但这在实践中不太可能。更有可能的是基于规则的过程或现有的机器学习模型,我们声称新模型可以对其进行改进。对于这篇文章,我们把重点放在二进制分类和 ROC 图作为我们的例子,因为它传达了主要思想,并且有一个很好的视觉效果,但是我们可以在其他上下文中应用类似的思想。
要复习二进制分类和 ROC 图,请阅读上一篇文章。从那篇文章中得出的结论是,我们在比较机器学习模型时必须小心,因为在竞争目标之间存在权衡,例如最大化真阳性,同时最小化假阳性。由于经济学大致上是研究人们在面临约束和不确定性时如何做出决策,因此在相互竞争的目标之间找到正确的*衡是大多数经济学家非常熟悉的事情。解决方案在于使用期望效用来驱动数据科学中的模型选择,从而改进传统的评价指标。让我们现在进入杂草。
因为我们的例子是基于二进制分类,一个好的起点是我们的老朋友混淆矩阵。回想一下, TP s、 FN s、 FP s 和 TN s 的计数取决于阈值 t ,标准化度量 TPR 和 FPR 也是如此,它们可以从计数中导出。我们现在向混淆矩阵中的每个单元格添加两种数据点(如下所示):
- 在第一行中,我们有每个单元的预期比例,它取决于由 TPR(t) 和 FPR(t) 判断的类比例(正类的 p 和 1-p )和模型性能。
- 在第二行,我们得到了这个单元的效用。例如,如果结果是 TP ,那么 v_TP 是与该结果相关的效用,给我们左上角的单元格。通常能够定义这样一个效用函数是经济学家被雇佣的首要原因,但是我们认为这样一个函数的存在是理所当然的。在制造环境中,一个 TP 是我们卖给一个满意客户的工作产品。一个 FN 是我们丢弃的工作产品,因为我们的模型被错误地识别为有缺陷,一个 FP 是我们的模型遗漏的有缺陷的产品,我们把它卖给了一个不知情的客户,最后一个 TN 是我们由于我们的模型识别的实际故障而丢弃的产品。我们可以开始想象在每种情况下计算成本的方法,但是我们在这里关心的是由 v_TP 、 v_FN 、 v_FP 和 v_TN 给出的最终结果。这些代表了每种情况导致的收益(温暖和模糊的感觉,如果你喜欢的话)或损失(下沉的恐惧的感觉,如果你喜欢的话)。所以效用可以是正的,也可以是负的。预期效用是这四个值的加权*均值,按每个值的概率加权。
作者图片
注意,我们使用了这样一个事实:FNR(t) = 1-TPR(t) 和 TNR(t) = 1-FPR(t) 来将期望效用写成 TPR 和 FPR 的函数。由于 TPR 和 FPR 是阈值 t 的函数,预期效用也是 t 的函数,连同其他输入。因此,我们可以通过两种方式来可视化预期效用:(1)绘制效用曲线(称为无差异曲线)作为 TPR 和 FPR 的函数,以便我们可以在 ROC 空间中可视化它,以及(2)绘制预期效用作为 t 的函数,以便我们可以在模型选择期间找到 t 的最佳值。我们将在这里两者都做,但首先让我们做一些数学。
当两个结果具有相同的预期效用时,我们说我们对这两个结果不感兴趣。因此,为了在 ROC 空间中可视化效用,我们可以通过将期望效用设置为某个常数,并根据 TPR 和 FPR 求解该方程,来绘制无差异曲线。由于 TPR 和 FPR 是相互竞争的目标,我们应该看到一个正斜率,表明 TPR 中增加的任何收益至少在一定程度上被由于 FPR 增加而产生的成本抵消。无差异曲线的斜率 s 决定了我们愿意用 TPR换取 FPR的比率。我们如何找到 s?我们采用上面的期望效用方程,将其设置为某个常数,然后尝试根据 TPR 和 FPR 重写它,将所有其他项移动到左侧的单个常数,我们称之为 c 。经过所有的代数重组后,结果如下:****
现在我们从基础微积分中知道一个写为 c = yb + xa 的方程在 x-y 空间中是线性并且有一个斜率由 -a/b 给出。这意味着将期望效用设置为等于某个常数描绘出无差别“曲线”,即在 TPR-FPR 空间中的直线。线的斜率由下式给出
斜率有一个直观的意义,所以让我们解开它。正如我们在上面看到的,它被分成两部分:第一项是类比例的比率(负对正),第二项是正确分类的效用减去错误分类的效用的比率(负对正)。因此,第一项考虑了每一类的相对权重,第二项考虑了每一类的相对“性价比”。我们现在拥有了像经济学家一样评估我们的模型所需要的一切。****
回想一下,由于 TPR 和 FPR 之间的权衡,导致 s > 0 。在机器学习课程中,我们了解到,对于二元分类,我们可以绘制 ROC 图,并使用 45 度线作为我们的基线,我们认为这是通过投掷无偏硬币来随机猜测类别的“模型”。但实际上,即使对于基线来说,这也是一个相当低的门槛,只有当 s 接* 1 时才有意义。否则,我们需要使用一个不那么幼稚的基线。这通过 ROC 空间中的蓝色无差别曲线(顶部两个图)或通过绘制预期效用与阈值 t (底部两个图)来显示:
作者图片
- 当 s = 1 时,组成 s 的两个术语之间有一种*衡,这意味着每个类别的相对比例由我们对其进行正确分类所获得的“有利可图”来*衡。在这种情况下,黄线可以作为我们的基线。请注意,按照这个标准,绿色和红色模型都很好地超越了基线。
- 在 左侧 我们有 s > 1 ,这意味着(a) 负面类别比正面类别多,或者(b)就效用而言,正确分类负面类别比正确分类正面类别多,或者(a)和(b)都成立。在这种情况下,一个好的起始基线是设置 t = 1 ,这意味着我们总是拒绝,导致 FPR = 0 和 TPR = 0 ,我们可以使用它们作为输入来计算预期效用并描绘出蓝色所示的无差异曲线,作为我们的新基线。请注意,无论 t 如何,红色模型总是低于基线,而绿色模型在接* 1 的 t 的一些值(对应于 ROC 图的左下角)超过基线。
- 在右手边的上,我们有 s < 1 ,这意味着(a) 正类超过负类,或者(b)就效用而言,正确分类正类超过正确分类负类,或者(a)和(b)都成立。在这种情况下,一个好的起始基线是设置 t = 0 ,这意味着我们总是接受,导致 FPR = 1 和 TPR = 1 ,我们可以使用它们作为输入来计算预期效用并描绘出蓝色所示的无差异曲线,作为我们的新基线。请注意,无论 t 如何,红色模型总是低于基线,而绿色模型在 t 的某些值接* 0 时超过基线(对应于 ROC 图中的右上角)。
事后看来,这一切似乎很直观,但使用无差异曲线,我们将这一想法形式化。相当令人印象深刻!总之,通过测量预期效用,我们能够在模型选择过程中做出更明智的决策,以业务约束为指导,而不仅仅是测试数据上的模型性能。
DataOps 到底是什么
原文:https://towardsdatascience.com/what-dataops-is-exactly-c895a47421ae
软件部署
DataOps 概述以及它与其他开发运维实践的不同之处
很难夸大数据在现代企业中的重要性。作为一个新的流行词,DataOps 旨在帮助组织克服数据分析过程中的障碍。但是这种新兴的实践到底是什么,它如何帮助企业更好地利用他们的数据?在本文中,我们将通过观察 DataOps 的各个方面并研究它补充其他 DevOps 和 MLOps 实践的方式,来探索 data ops 变得有多重要。
文章组织如下:
- 什么是数据操作
- 数据操作的七个步骤
- 数据操作 vs 操作
- 数据操作工具
1 什么是数据操作
DataOps 是将 DevOps 原则应用于数据生命周期的结果。DataOps 的基本理念是,“如果您围绕这一点构建一个系统,使大量监控、部署和协作实现自动化,您的工作效率就会大大提高,您的客户也会更加满意,最终您会做得更好。”
DataOps 专注于三个流程:
- 减少错误,提高您的客户数据信任度。实际上,你应该监控所有的软件,目的是检查你正在做的事情。
- 部署的周期时间,这涉及到你能以多快的速度将新模型、新数据集和新可视化从你的脑海中带入生产。这一方面涉及速度和风险。
- 提高团队生产力,减少会议和协作的次数。
所有先前定义的过程都是可度量的,您应该度量它们。例如,您应该衡量回答以下问题的指标:
- 你的团队做了多少工作?
- 东西多久坏一次?
- 你把新东西投入生产的速度有多快?
这些都是非常重要的指标。与其说是关于数据科学或数据工程。你总是优化整体而不是局部。这个想法是向人们展示你的工作,从他们那里获得反馈,然后重复这个反馈。
2 数据运营的七个步骤
数据操作包括以下七个步骤:
作者图片
- 向逻辑测试添加数据,从 DevOps 移至 DataOps。
- 把你的代码放到版本控制中。不要把它放在你硬盘的某个地方或者文件共享上。您可以使用 Github 或 GitLab 之类的框架。
- 分支合并。当你在开发中改变一些东西时,运行自动化测试来判断回归或影响分析。如果你改变了后端的一些东西,你能够以一种非常简单的方式判断前端是否坏了。
- 编写在生产中运行的自动化测试。您应该测试您的代码是否按预期运行。
- 使用多种环境。许多开发人员在生产级别处理同一个项目可能会导致冲突。因此,每个团队成员都可以在项目的本地副本上工作是很重要的。
- 再利用和集装箱化。您应该重用您的代码,并使它在您的本地机器上独立工作。由于这个原因,你应该用容器包装你的软件,比如 docker。
- 过程参数化,让你的软件管道灵活应对变化。
你可以在这个链接找到更多关于数据操作七个步骤的信息。
要运行您的测试,您可以使用诸如 Great Expectations 这样的工具。然而,您也可以自己编写测试,在很多方面都非常简单。例如,您可以进行行数检查,或者编写 SQL 查询来进行测试。
所以整个想法是这些测试:
- 应该自动完成,
- 处于版本控制中
- 生产期间运行,
- 在开发过程中运行。
实际上,大约 10%的工作应该是开发自动化测试。
3 数据操作与多操作
DataOps 和 MLOps 有什么区别?它们是一样的还是不同的?
对此有两个答案。从一个工程师的角度来看,答案是否定的也是同样的想法。只是 DevOps 应用于数据,所以你叫它 DataOps 或者 MLOps。
从更一般的角度来看,答案是肯定的。您可以使用术语 DataOps 来包含数据、模型、可视化和治理。DataOps 的目标是优化整体,而不仅仅是一个部分。
更正式的说法是,DataOps 是构建组织的数据基础架构的概念,这种方式不仅能让您的组织表现更好,还能更加敏捷。不仅仅是有好的数据;这是关于拥有值得信赖和可靠的数据。
数据运营可以带来以下好处:
- 提高数据质量
- 提高数据速度
- 提高数据效率
- 提高数据的准确性
- 提高使用相同数据集的团队或部门之间的一致性(即减少错误)
下图显示了数据、机器学习、开发和运营的具体重点:
作者图片
4 个数据操作工具
DataOps 工具自动化并简化了数据生命周期的所有部分。它们提高了组织数据管理的灵活性,并加快了用户数据分析的速度。
有四种类型的数据操作工具:
- 一体化工具,专注于数据管理,如数据摄取、转换、分析和可视化。
- DataOps 编排工具,允许您以集中的方式管理复杂的数据管道。
- 组件工具,只关注整个管道的单个组件。
- 案例专用工具,专注于特定领域。
一些流行的数据操作工具包括远大前程、数据表单断言、蒙特卡洛和 dbt 测试。
摘要
恭喜你!您刚刚学习了数据操作背后的基本概念!
DataOps 方法对任何公司来说都是一个强大的工具,值得花时间来了解该框架及其优势。要记住的最重要的事情是,这个实践是关于协作的。
它是关于建立一种文化,在这种文化中,从工程师到数据科学家的每个人都与他们的利益相关者一起工作,以便更快、更有效地产生数据驱动的结果。
这篇文章的内容受到了克里斯托弗·伯格在 DataTalks.Club 的播客插曲 Storytime for DataOps 的启发。
原贴于 DataTalks。 俱乐部。
相关文章
DevOps 和 MLOps 是一回事吗?
DevOps(开发和运营)是一组尝试在开发和运营团队之间建立协作的最佳实践,目的是尽可能自动化软件部署过程。
在过去十年中,DevOps 部门取得了很大进展,达到了… 继续阅读。
1966 年制造的一个聊天机器人告诉了我们关于人类语言的什么?
语言是人类智力水*的典型标志。但是对计算机来说,进行对话到底有多难呢?
亚历山大·沙托夫在 Unsplash 上拍摄的照片
今年早些时候,谷歌的一名工程师发表了一项声明:他认为 LaMDA——谷歌的内部语言模型——具有感知特征。伴随公告的是几页文字记录,包括他和机器之间的对话。这些对话极其逼真,就好像是两个人之间的对话。这些文字记录在主要的新闻网络上被大量报道,争论着 LaMDA 是否真的有自我意识和智慧。许多机器学习和人工智能研究人员,如 Yann Lecun 、戴密斯·哈萨比斯和 Yannic Kilcher ,都持否定立场。他们认为 LaMDA 是一个令人印象深刻的语言模型,但远非真正的智能。
这在人工智能领域并不是新闻。50 多年前,另一个聊天机器人是使用基本的语言规则创建的。令人惊讶的是,它愚弄了比预期更多的人,让他们认为它是智能的。
治疗师
Joseph Weizenbaum 静静地看着他的测试对象向计算机终端输入命令。测试对象正在与伊莱扎对话,伊莱扎是一个被设计成治疗师的计算机程序。
那是在 1966 年左右。在这一点上,Weizenbaum 已经在计算机上工作了很长时间。他开始从事模拟计算机的工作,模拟计算机使用真空管和液压系统代替晶体管。他帮助开发了早期的数字计算机,后来在 1955 年开发了第一台银行计算机。无论如何,他是计算机领域的先驱。
但韦岑鲍姆本质上是一个人道主义者。他经常想知道智能的本质以及人和机器之间的关系。即使在那个时候,人工智能作为一个领域已经开始蓬勃发展。提出了建立和判断智力的竞争性技术和定理。其中最著名的可能是图灵测试。在图灵测试中,人类会通过与未知系统对话来评估该系统,并根据对话的质量来判断该系统是否具有人类智能。
图灵测试的简单性可能会让韦岑鲍姆产生怀疑。毕竟,这是一个非常主观的测试,完全基于语言。所以他研究了分割语言的不同方法,以便将陈述转换成答案。以下面的语句为例:
看来 你讨厌 我。
Weizenbaum 注意到,通过只识别重要的单词和短语,如“你”和“我”,并丢弃其余的,句子可以形式化为
X你 Y我。
然后可以转化成一个问题
为什么你觉得我讨厌你*?*****
他还可以对单词和短语的重要性进行排序。拿下面这句话来说:
我知道大家都在嘲笑我我。****
单词“我”和“我”被突出显示,但是 Weizenbaum 注意到当人们使用“每个人”时,他们经常谈论特定的人。因此,短语“每个人”具有更高的优先级,可以使用不同的答案
谁特别嘲笑过 你 ?
这是韦岑鲍姆会话体系的基础。他把这个程序命名为伊莱扎,以剧中学习如何与他人交谈的主角“皮格马利翁”命名。伊莱扎用过各种剧本,其中最成功的叫做《医生》。医生模仿了颇有影响的心理学家卡尔·罗杰斯的治疗风格。
这让我们回到了 1966 年。韦森鲍姆正在观察他的实验对象与伊莱扎的互动。受试者在屏幕上打字,伊莱扎回复了医生的脚本:
人类:男人都一样。
电脑:用什么方式?
人类:他们总是为这样或那样的事情烦我们。
计算机:你能想出一个具体的例子吗?
人类:嗯,我男朋友让我来的。
电脑:你男朋友让你来的
人类:他说我大部分时间都很沮丧。
电脑:听说你很沮丧,我很难过
人类:是真的。我不开心。
过了一会儿,这个人转过身来,礼貌地请 Weizenbaum 走出房间,以便给她一些隐私。这让 Weizenbaum 大吃一惊——他的测试对象使用一个不到 200 行代码的程序,体验了一次接*真实的治疗过程!
到底发生了什么?
伊莱扎去说服许多其他人,他们正在与它进行有意义的对话。20 世纪 70 年代的一则轶事说,一位销售主管与它交谈,认为他在与麻省理工学院的一位客户交谈。伊莱扎可能不是真正的智能,今天我们可以构建更高级的语言模型,但它在构建自然语言系统方面教会了我们许多宝贵的经验。
语言模型不一定要好到可信
威廉·纳瓦罗在 Unsplash 上的照片
伊莱扎如此成功的原因后来被描述为伊莱扎效应。事实证明,人类倾向于给我们连接的计算机程序赋予人类的特征。这就是为什么史蒂夫·乔布斯想让麦金塔说“你好”的原因。这也是为什么尽管语言模型直到最*才变得好,但聊天机器人已经在商业上存在了很长时间。ELIZA 中使用的启发式方法——扫描重要的单词,然后对它们进行排序以确定响应——现在仍在许多聊天机器人中使用。假设你正在为一家披萨外卖公司编写一个聊天机器人。您首先收到一个提示。
我要一份 大披萨 配 芝士 和 腊肠 浇头送来 尽快 。
然后,你可以扫描重要的词,并提供适当的答复。
一份 大披萨芝士* 配 意大利腊肠 ,马上来!你要把它 送到哪里 ?*****
也许 ELIZA 最令人惊讶的方面是它是多么简单——它的整个工作过程用了不到 10 页的篇幅来描述。正如 Ian Goodfellow 在《深度学习》一书中所说:
在许多情况下,使用简单但不确定的规则比复杂但确定的规则更实际[……]
通过图灵测试容易吗?
布雷特·乔丹在 Unsplash 上的照片
许多人认为 ELIZA 应该被认为是第一个通过图灵测试的程序。许多人用伊莱扎作为例子,说明图灵测试在判断智力方面是不完全的。还记得 LaMDA,那个对话被发表的语言模型吗?你会说对话的质量意味着 LaMDA 有类似智力的东西吗?这仅仅是一个统计结果,仅仅是一个算法的结果吗?还是两者是一回事?
1980 年,哲学家约翰·塞尔提出了一个名为“中国房间”的思想实验。在中文教室里,有一个人拿着一本中文字典和一本规则书。规则手册包含了强大的人工智能语言模型的执行步骤。这个人对中文一无所知,每次他从房间外的一个说中文的人那里得到提示时,他都会使用规则书做出适当的反应。如果遵循书中的所有规则,他能做出可信的反应,那么他真的能理解正在交谈的内容吗?塞尔认为,这个人显然没有,规则书也没有,因此简单的交谈和通过图灵测试并不意味着理解。
中国室遇到了很多批评和赞扬。在此,我仅举一个批评:前提定义不清。前提认为理解和遵循指令是两回事。这种批评说它们是一样的,“理解/意识”是许多复杂指令共同作用的结果。
韦岑鲍姆的警告
伊莱扎开启了 NLP 的革命。然而,Weizenbaum 用一种有点阴暗的观点看待他的创作。有一次,他试图让 ELIZA 记录它的交互,这样他可以在以后检查它们。他立即遭到了研究对象的抵制,称这类似于侵犯他们最深的隐私。他发现,人类将秘密透露给不思考的机器是反乌托邦的症状和标志。对他来说,是高度工业化的世界将人们禁锢在加压的环境中,让他们如此容易地与像伊莱扎这样的算法联系起来。因为人类不理解他们与之互动的计算机系统,他们把他们所知道的唯一特征——他们自己——归因于伊莱扎。
在晚年,Weizenbaum 对人工智能和计算机的影响感到更加消极。他明确区分了决策(计算机)和选择(人类),并认为计算机的能力是有限的。Weizenbaum 死于 2008 年,在现代神经网络革命之前。人们一定想知道他会如何看待如今机器学习的应用,或者 GPT 或 LaMDA 等语言模型。
来源
[1]魏曾鲍姆,约瑟夫。"计算机能力和人类理性:从判断到计算."(1976).
[2]约瑟夫·韦岑鲍姆。"伊莱扎——一个研究人机自然语言交流的计算机程序."美国计算机学会的通讯 9.1(1966):36–45。
[3]https://spectrum . IEEE . org/why-people-required-privacy-to-confident-in-the-world-first-chatbot
各国在联合国一般性辩论上谈些什么?使用 LDA 的主题建模
LDA 背后的直觉及其局限性,以及使用 Gensim 的 python 实现
由兰楚和罗伯特·扬·索科列维奇拍摄。在这里找到这篇文章的代码。
1.什么是潜在狄利克雷分配?
在分析大量文本时,潜在狄利克雷分配(LDA)是一种流行的模型。它是一个生成概率模型,使用户能够从一组文档中发现隐藏的(“潜在的”)主题。LDA 将每个文档建模为通过从统计分布中重复采样单词和主题的过程而生成的。通过应用巧妙的算法,LDA 能够恢复在这个生成过程中使用的最可能的分布(Blei,2003)。这些分布告诉我们存在哪些主题,以及它们是如何在每个文档中分布的。
让我们首先考虑一个简单的例子来说明 LDA 的一些关键特性。假设我们有以下 5 个文档的集合
- 🍕🍕🍕🍕🍕🦞🦞🦞🐍🐍🐋🐋🐢🐌🍅
- 🐌🐌🐌🐌🐍🐍🐍🐋🐋🐋🦜🦜🐬🐢🐊
- 🐋🐋🐋🐋🐋🐋🐢🐢🐢🐌🐌🐌🐍🐊🍕
- 🍭🍭🍭🍭🍭🍭🍕🍕🍕🍕🍅🍅🦞🐍🐋
- 🐋🐋🐋🐋🐋🐋🐋🐌🐌🐌🐌🐌🐍🐍🐢
并且希望了解存在哪种主题以及它们如何在文档之间分布。快速观察显示,我们有很多与食物和动物相关的表情符号
- 食物:
- 动物:
并且这些主题在每个文件中出现的比例不同。文档 4 主要是关于食物的,文档 5 主要是关于动物的,前三个文档是这些主题的混合。这就是我们在谈论主题分布时所指的,主题的比例在每个文档中的分布是不同的。此外,我们看到表情符号🐋和🍭比其他表情符号出现得更频繁。这就是我们在讲每个题目的单词分布时所指的。
这些主题和每个主题中的单词的分布正是 LDA 返回给我们的。在上面的例子中,我们将每个主题分别标记为食物和动物,不幸的是,LDA 没有为我们做这件事。它只是返回给我们每个主题的单词分布,作为用户,我们必须从中推断出主题的实际含义。
那么 LDA 是如何实现每个话题的词分布的呢?如前所述,它假设每个文档都是通过从各种分布中抽取主题和单词的随机过程产生的,并使用一种聪明的算法来寻找最有可能产生数据的参数。
得到💬任何数据科学或编程问题的 GPT 式答案。为成千上万的人生成摘要和学习笔记📚只需一次点击即可获得学习资源。👉
2。LDA 背后的直觉
LDA 是一个概率模型,它利用了狄利克雷分布和多项分布。在我们继续讨论 LDA 如何使用这些分布的细节之前,让我们稍微休息一下,回顾一下这些分布的含义。狄利克雷和多项式分布是贝塔和二项式分布的推广。Beta 和二项式分布可以理解为涉及投掷硬币(返回离散值)的随机过程,而 Dirichlet 和多项式分布处理随机过程,例如投掷骰子。所以,让我们后退一步,考虑稍微简单一点的分布:贝塔分布和二项式分布。
2.1 贝塔和二项式分布
为了简单起见,我们将用一个抛硬币的例子来说明 LDA 是如何工作的。想象一下,我们有一个完全用两个词写成的文档:🍕和🍅,并且该文档是通过重复投掷硬币而生成的。每次硬币正面朝上,我们就写🍕,每次硬币落下时,我们写下🍅。如果我们事先知道硬币的偏向是什么,换句话说,它产生的可能性有多大🍕,我们可以使用二项式分布来模拟生成文档的过程。生产的可能性🍕🍕🍕🍕🍕🍕🍕🍅🍅🍅(以任何顺序)例如由 P = 120P(🍕)⁷P(🍅),其中 120 是排列 7 个披萨和 3 个番茄的组合数。
但是我们如何知道概率 P(🍕)和 P(🍅)?给定上面的文档,我们可以估计 P(🍕)= 7/10 和 P(🍅)= 3/10,但是我们在分配这些概率时有多大把握呢?将硬币翻转 100 次,甚至 1000 次,将会进一步缩小这些概率。
掷硬币。作者图片
在上面的实验中,每个实验都会给我们相同的概率 P(🍕)=7/10 = 0.7.然而,随后的每一次实验都会加强我们的信念,即 P(🍕)=7/10.在看到更多证据后,贝塔分布给了我们一种量化这种信念强化的方法。贝塔分布采用两个参数𝛼和𝛽,并产生概率的概率分布。参数𝛼和𝛽可以被视为“伪计数”,代表了我们对硬币有多少先验知识。𝛼和𝛽值越低,分布越广,代表不确定性和缺乏先验知识。另一方面,𝛼和𝛽的较大值产生在某个值(例如,第三个实验中的 0.7)附*急剧达到峰值的分布。这意味着我们可以支持我们的说法,P(🍕)=0.7.我们在下图中展示了与上述三个实验相对应的 beta 分布。
具有不同α和β值的β分布。大量的实验意味着较窄的分布。作者图片。
现在这样想,我们有一个先验的信念,着陆头的概率是 0.7。这是我们的假设。你继续另一个实验——把硬币抛 100 次,得到 74 个正面和 26 个反面,先验概率等于 0.7 是正确的概率是多少?发现你可以描述一个事件的概率,基于可能与事件相关的先验知识,通过贝叶斯定理,它显示了如何给定一些可能性,以及一个假设和证据,我们可以获得后验概率:
这里有 4 个组件:
- 先验概率:假设或先验概率。它定义了我们对一个事件的先验信念。这个想法是我们假设某种先验分布,这是我们已知的最合理的分布。先验概率是每个硬币的 P(头),通过使用 beta 分布生成,在我们的例子中是 0.7
- 后验概率:给定证据的先验概率的概率。这是一个概率的概率。给定 100 次 74 头 26 尾的翻转,先验概率等于 0.7 是正确的概率是多少?换句话说,有了证据/观测数据,先验信念正确的概率是多少?**
- 似然性:似然性可以描述为假设我们的假设为真,观察到数据/证据的概率。比如说,我把一枚硬币抛 100 次,得到 70 个正面和 30 个反面。假设我们之前认为 P(头)是 0.7,那么在 100 次翻转中观察到 70 个头和 30 个尾的可能性有多大?我们将使用二项式分布来量化可能性。二项式分布使用贝塔分布的先验概率(0.7)和实验次数作为输入,并从二项式分布中抽取正面/反面的数量。
- 证据的概率:证据是观察到的数据/实验结果。在不知道假设是什么的情况下,观察到数据的可能性有多大?量化这一项的一种方法是为每个可能的假设计算 P(H)P(E|H)并求和。因为证据项在分母中,所以我们看到证据和后验概率之间的反比关系。换句话说,证据的概率高,后验概率小,反之亦然。证据的高概率反映了替代假设和当前假设一样与数据兼容,所以我们不能更新我们先前的信念。*
先验概率等于 0.7 的 10 次试验的二项式分布的概率密度曲线。可以看出,10 次翻转中有 7 次头部落地的概率最高。作者图片。
2.2 文档和主题建模
可以这样想:我想使用一些数学框架生成一个新文档。这有什么意义吗?如果是的话,我该怎么做?LDA 背后的思想是,每个文档都是由主题混合生成的,每个主题都是单词的分布(Blei,2003)。您可以做的是随机选取一个主题,从该主题中抽取一个单词,然后将该单词放入文档中。你重复这个过程,挑选下一个单词的主题,下一个单词的样本,把它放在文档中…等等。该过程重复进行,直到完成。
遵循贝叶斯定理,LDA 学习如何以下列形式表示主题和文档:
Blei 等人(2003 年)。潜在狄利克雷分配。
这里有两件事值得一提:
- 首先,一个文档由多个主题组成,每个主题 z 取自一个多项式分布 z~Mult(θ) (Blei et al .,2003)
我们称 Theta (θ)为给定文档的主题分布,即每个主题出现在文档中的概率。为了确定θ的值,我们从狄利克雷分布中抽取一个主题分布样本。如果你还记得我们从 beta 分布中学到的东西,每枚硬币都有不同的正面着地概率。同样,每个文档都有不同的主题分布,这就是为什么我们要从狄利克雷分布中得出每个文档的主题分布θ。狄利克雷分布使用α/α—适当的知识/假设作为输入参数生成话题分布θ,即θ∞Dir(α)。Dirichlet 中的α值是我们关于该文档的主题混合的先验信息。接下来,我们使用由狄利克雷分布生成的θ作为多项式分布 z∞Mult(θ)的参数来生成文档中下一个单词的主题。
- 第二,每个主题 z 由词的混合物组成,其中每个词从多项式分布 w~Mult(ϕ中抽取)(Blei 等人,2003)
让我们称之为φ(ϕ)每个主题的词分布,即词汇表中每个词出现在给定主题 z 中的概率。为了确定ϕ的值,我们使用β作为输入参数β——关于主题中词频的先验信息,从狄利克雷分布φz∞dir(β)中采样给定主题的词分布。例如,我可以使用给定主题中每个单词被分配的次数作为β值。接下来,我们使用从 Dir(β)生成的 phi (ϕ)作为多项式分布的参数来采样文档中的下一个单词——假设我们已经知道下一个单词的主题。
每个文档的整个 LDA 生成过程如下:
p(w,z,θ,ϕ | α,β ) = p(θ| α) p(z| θ) * p(ϕ| β) p(w| ϕ)
总的来说,第一步是获得文档的主题混合物— θ,它是由带有参数α的狄利克雷分布生成的。这给了我们第一项。下一个单词的题目 z 是从一个参数为θ的多项式分布中抽取出来的,这个分布给了我们第二项。接下来,从具有参数β的狄利克雷分布中得出每个单词在文档ϕ中出现的概率,这给出了第三项 p(ϕ|β).一旦我们知道了下一个词 z 的主题,我们就使用以ϕ为参数的多项式分布来确定这个词,这就给出了最后一个词。
3.用 Gensim 实现 Python
3.1 数据集
本文中的 LDA python 实现使用了一个数据集,该数据集由联合国一般性辩论的文本组成。它包含了从 1970 年到 2020 年每个国家的代表在联合国一般性辩论中的所有发言。数据集是开放数据,可在在线获得。你可以通过阅读这篇论文来获得对其内容的额外洞察。
3.2 数据预处理
作为预处理的一部分,我们将使用以下配置:
- 小写字母盘
- 令牌化(使用 NLTK 令牌化将文档分割成令牌)。
- 对令牌进行符号化(来自 NLTK 的 WordNetLemmatizer()
- 删除停用词
文本预处理功能。
数据集中某些属性的示例
**
2020 年美国和阿富汗使用 TF-IDF 演讲中最重要的 10 个词的例子。单词的大小代表了重要性的大小。
3.3 使用 Gensim 训练 LDA 模型
Gensim 是一个免费的开源 Python 库,用于处理原始的非结构化文本,并将文档表示为语义向量。Gensim 使用各种算法,如 Word2Vec、FastText、潜在语义索引 LSI、潜在狄利克雷分配 LDA 等。它将通过检查训练文档语料库中的统计共现模式来发现文档的语义结构。
关于训练参数,首先我们来讨论一下房间里的大象:文档里有多少个主题?这个问题没有简单的答案,取决于你的数据和你对数据的了解,以及你实际需要多少题目。我随机使用了 10 个主题,因为我希望能够解释和标记这些主题。
LDA 模型训练参数
Chunksize 参数控制在训练算法中一次处理多少个文档。只要文档块适合内存,增加块大小将加速训练。通道控制我们在整个语料库上训练模型的频率,这被称为时期。 Alpha 和 eta 是在第 2.1 和 2.2 节中解释的参数。这里的形状参数η对应于*β。*
在下面的 LDA 模型的结果中,让我们看看主题 0,作为一个例子。它说 0.015 是单词“nation”在文档中产生/出现的概率。这意味着如果你无限次抽取样本,那么单词“nation”将被抽取 0.015%的时间。
*topic #0 (0.022): 0.015*"nation" + 0.013*"united" + 0.010*"country" + 0.010*"ha" + 0.008*"people" + 0.008*"international" + 0.007*"world" + 0.007*"peace" + 0.007*"development" + 0.006*"problem" topic #1 (0.151): 0.014*"country" + 0.014*"nation" + 0.012*"ha" + 0.011*"united" + 0.010*"people" + 0.010*"world" + 0.009*"africa" + 0.008*"international" + 0.008*"organization" + 0.007*"peace" topic #2 (0.028): 0.012*"security" + 0.011*"nation" + 0.009*"united" + 0.008*"country" + 0.008*"world" + 0.008*"international" + 0.007*"government" + 0.006*"state" + 0.005*"year" + 0.005*"assembly" topic #3 (0.010): 0.012*"austria" + 0.009*"united" + 0.008*"nation" + 0.008*"italy" + 0.007*"year" + 0.006*"international" + 0.006*"ha" + 0.005*"austrian" + 0.005*"two" + 0.005*"solution" topic #4 (0.006): 0.000*"united" + 0.000*"nation" + 0.000*"ha" + 0.000*"international" + 0.000*"people" + 0.000*"country" + 0.000*"world" + 0.000*"state" + 0.000*"peace" + 0.000*"organization" topic #5 (0.037): 0.037*"people" + 0.015*"state" + 0.012*"united" + 0.010*"imperialist" + 0.010*"struggle" + 0.009*"aggression" + 0.009*"ha" + 0.008*"american" + 0.008*"imperialism" + 0.008*"country" topic #6 (0.336): 0.017*"nation" + 0.016*"united" + 0.012*"ha" + 0.010*"international" + 0.009*"state" + 0.009*"world" + 0.008*"country" + 0.006*"organization" + 0.006*"peace" + 0.006*"development" topic #7 (0.010): 0.020*"israel" + 0.012*"security" + 0.012*"resolution" + 0.012*"state" + 0.011*"united" + 0.010*"territory" + 0.010*"peace" + 0.010*"council" + 0.007*"arab" + 0.007*"egypt" topic #8 (0.048): 0.016*"united" + 0.014*"state" + 0.011*"people" + 0.011*"nation" + 0.011*"country" + 0.009*"peace" + 0.008*"ha" + 0.008*"international" + 0.007*"republic" + 0.007*"arab" topic #9 (0.006): 0.000*"united" + 0.000*"nation" + 0.000*"country" + 0.000*"people" + 0.000*"ha" + 0.000*"international" + 0.000*"state" + 0.000*"peace" + 0.000*"problem" + 0.000*"organization"*
3.4 题目质量
生成的主题通常用于讲述一个故事。高质量的主题是那些容易被人类理解的。评估主题质量的一个流行指标是连贯性,连贯性值越大,通常对应的主题越容易理解。这意味着我们可以使用主题一致性分数来确定主题的最佳数量。两个流行的一致性度量是 UMass 和 word2vec 一致性分数。UMass 计算一个主题中的两个单词在同一文档中出现的频率,相对于它们单独出现的频率。具有诸如 United、Nations 和 States 的主题将具有较低的一致性分数,因为即使 United 经常与 Nations 和州在同一文档中共同出现, Nations 和 States 则不会。另一方面,基于 word2vec 的一致性分数采用不同的方法。对于主题中的每一对单词,word2vec 都会对每个单词进行矢量化,并计算余弦相似度。余弦相似性得分告诉我们两个单词是否在语义上彼此相似。
对应于 LDA 模型的相干值具有相应的主题数量。看起来选择 5 个主题可能会产生最好的一致性分数/质量,即使在这种情况下不同数量的主题的分数差异是微不足道的。作者图片。
4.限制
- 顺序无关紧要:LDA 将文档作为“单词包”来处理。单词包意味着您查看文档中单词的频率,而不考虑单词出现的顺序。显然,在这个过程中会丢失一些信息,但是我们的主题建模的目标是能够从大量的文档中查看“大画面”。另一种思考方式是:我有 10 万个单词的词汇表,在 100 万个文档中使用,然后我使用 LDA 查看 500 个主题。
- 主题的数量是一个需要由用户设置的超参数。在实践中,用户使用不同数量的主题运行几次 LDA,并比较每个模型的一致性分数。更高的一致性分数通常意味着主题更容易被人类理解。
- LDA 并不总是能很好地处理诸如推文和评论之类的小文档。
- LDA 生成的主题并不总是可解释的。事实上,研究表明,具有最低困惑或对数似然的模型通常具有较少的可解释的潜在空间(Chang 等人,2009)。
- 常用词往往主导每个话题。实际上,这意味着从每个文档中删除停用词。这些停用词可能特定于每个文档集合,因此需要手工构建。
- 为先验分布选择正确的结构。实际上,像 Gensim 这样的包默认选择对称的 Dirichlet。这是一种常见的选择,在大多数情况下不会导致更差的主题提取(Wallach 等人 2009 年,Syed 等人 2018 年)。
- LDA 不考虑主题之间的相关性。例如,“烹饪”和“饮食”更有可能在同一文档中共存,而“烹饪”和“合法”则不会(Blei 等人,2005 年)。在 LDA 中,由于选择使用狄利克雷分布作为先验,主题被假设为彼此独立。克服这个问题的一种方法是使用相关主题模型而不是 LDA,LDA 使用逻辑正态分布而不是狄利克雷分布来绘制主题分布。
感谢您的阅读。如果你觉得我的帖子有用,并且正在考虑成为中级会员,你可以考虑通过这个 推荐会员链接 :)来支持我,我将收取你的一部分会员费,不需要你额外付费。如果你决定这样做,非常感谢!
参考文献:
- 布雷,大卫 m,安德鲁 Y. Ng,迈克尔乔丹。"潜在的狄利克雷分配."机器学习研究杂志* 3。一月(2003):993–1022。*
- 艾达的小册子。LDA 和 Gibs 采样概述。克里斯塔夫斯。
- Chang,Jonathan,Sean Gerrish,,Jordan Boyd-Graber 和 David Blei。"阅读茶叶:人类如何解读主题模型."神经信息处理系统进展* 22 (2009)。*
- 拉弗蒂、约翰和大卫·布雷。"相关主题模型."神经信息处理系统进展 18 (2005)。
- 沃勒克、汉娜、大卫·米米诺和安德鲁·麦卡勒姆。"反思 LDA:为什么先验很重要."神经信息处理系统进展 22 (2009)。
- 托马斯·霍夫曼。"概率潜在语义分析."arXiv 预印本 arXiv:1301.6705 (2013)。
- 赛义德、沙欣和马可·斯普雷特。"为潜在的狄利克雷分配选择先验."2018 年 IEEE 第 12 届语义计算国际会议(ICSC),第 194–202 页。IEEE,2018。
- https://dataverse.harvard.edu/file.xhtml?fileId=4590189&版本=6.0
- 贝塔分布
*https://en.wikipedia.org/wiki/Beta_distribution *
数据科学家是做什么的?
原文:https://towardsdatascience.com/what-do-data-scientists-do-1309d53c2420
我作为数据科学家的想法
照片由 Unsplash 上的 Sereja Ris 拍摄
什么是数据科学,数据科学家是做什么的?即使我自己是一个资深的数据科学家,我也经常发现自己对这个问题很困惑!所以我决定写这篇文章,记录我对数据科学家的想法。这篇文章代表我自己的想法和结论,而不是我的雇主。
数据科学家是做什么的?我认为最重要的是通过数据科学为企业带来价值。我说的价值是什么意思?对于一个典型的企业来说,商业价值的最终目标和形式是增加收入。更一般地说,我们可以将价值视为对业务至关重要的北极星指标。例如,对于重视用户增长的产品公司来说,每月活跃用户或每月返回用户可以作为北极星指标。
在我看来,数据科学家在大多数企业中受到重视的领域有五个:
1。数据科学产品是收入的直接来源
有时,数据科学家会创建算法或一种可以直接销售给客户的产品。例如,数据科学家可以编程并创建客户可以购买的商业 NLP 模型。或者,数据科学家可以编写一个推荐系统,直接显示用户指标和收入。
在这种情况下,数据科学家经常被给予一个特定的问题去钻研,目标是创造一个新的或改进的产品。他们花费大量时间研究、评估不同的算法、编写管道、设计模型架构、训练模型、监控模型性能,以及将模型部署到生产中。
2。数据科学为特定产品提供支持并推动战略
在产品公司中,数据科学家通常为特定产品提供支持,这直接影响产品路线图、功能展示、产品战略,从而间接影响收入。
在这个场景中,数据科学家的利益相关者通常是产品经理、工程师经理和其他内部客户。数据科学家提供什么样的支持?它可能包括以下类别以及更多类别:
- 进行产品/市场适应性研究
- 进行定价研究
- 构建模型以推动产品特性
- 通过深入分析发现产品/模型的机会/问题
- 衡量机会的市场规模
- 提供建议并影响行动
- 设计、监控、分析和重复实验或准实验
- 衡量项目/计划的成功/影响
3。数据科学为其他功能提供支持
数据科学家也可能为其他部门提供支持,如销售或营销。数据科学家可以告诉他们销售和营销工作的目标,并帮助提高销售线索的质量。
4。数据科学家是意义创造者
数据科学家的另一个角色是理解和发现。有些公司可能有测量东西的人,也有制造东西的人,但是他们不明白数据说的是什么。所以他们雇佣数据科学家,希望数据科学家能告诉他们数据意味着什么,并在数据中发现一些价值。这通常是一个非常不合时宜的任务,人们往往会有不切实际的期望,但这仍然是公司雇佣数据科学家的一个重要原因。意义创造和发现是数据科学家可以做出贡献的一个重要案例,但让人们对本质上是一次形式不良的探索失望是危险的。
5。数据科学家倡导数据驱动的文化
很多公司在做决策的时候,充其量是数据知情,而不是数据驱动。数据科学家倡导数据驱动的文化,并帮助每个人提高数据科学素养。数据科学家不仅要为业务提供价值,而且要为每个人提供文档和工具,让每个人都能放心地直接使用数据,并培养每个人在自己的工作中使用数据科学的习惯。
数据科学项目的工作流程是怎样的?
1.定义业务问题
业务问题是什么?企业实际需要什么?我们能把这个商业问题转化成数据科学问题吗?
2.确定问题的范围
就数据和资源而言,我们目前拥有什么?我们还需要什么?我们在考虑什么样的研究设计?我们是否在考虑使用历史数据、收集新数据、运行实验、做调查,以及什么样的建模?这个项目的路线图和分析框架是什么?
3.收集数据
理想的情况是,我们需要的所有数据都已经在数据库中很好地格式化了。事实上,至少从我的经验来看,那是一个梦。如果我认为我已经得到了我需要的所有数据,那是我不够努力。
通常,我们需要通过各种外部 API 收集数据。对于可以由多个供应商提供的外部数据,评估不同的供应商并决定使用哪个供应商也是数据科学家的责任。
另一种情况是当产品工程师和业务需求之间存在脱节时,数据科学家对调查特定指标感兴趣,但产品工程师当前不记录计算该指标所需的信息。因此,数据科学家的工作是在工程师和业务需求之间架起一座桥梁,告诉工程师我们需要记录的内容和位置,更好的方法是提醒工程师和项目经理在设计功能时考虑要收集哪些数据。
除了获取我们需要的数据,更重要的是理解数据,确保我们拥有的数据是高质量的。
4.进行分析
准备好数据后,数据科学家可以执行他们设计的项目路线图和分析框架。一般来说,几乎所有的分析工作都是从指标开始的。数据科学家通常与产品经理一起定义、创建和跟踪重要的指标。数据科学家通常会构建仪表板,作为他们观察趋势和获得洞察力的工具,并使用各种模型和框架来补充和支持项目需求。
5.将洞察力带回业务中
无论是笔记本、仪表板还是模型,数据科学家要想产生影响,他们需要向业务的其他部分提供见解和行动项目。我们分享的内容取决于我们希望收件人能够做多少探索,因此我们可以简单地分享幻灯片或 Google doc,其中包含总结结果的文字和图表,或者我们可以发送运行笔记本的完整输出以显示我们运行了什么代码,甚至发送底层笔记本、部署的仪表板或实时模型供他们自己运行。然后这个工作流程又重新开始。
关于工具的想法
许多数据科学家本质上都是软件开发人员。我们喜欢制作工具,让事情变得简单。我自己经常被这些工具冲昏头脑,因为它很有趣。
除了数据科学家自己编写的工具之外,数据科学家可能还需要研究和决定各种供应商工具,例如,Data Studio、Kibana、QuickSight 和其他工具的优缺点是什么,我们如何部署模型和仪表板,我们是否应该将 Airflow 重写为 Prefect,我们是否应该使用 BigQuery 或 Athena?工具和技术一直在变化。学习和理解不同的工具非常有趣,它们是我们工作的基础,但它们从来都不是数据科学的本质。
基于我自己有限的经验和观察,希望这些关于数据科学家所做工作的想法是有用的。让我知道你自己的想法。我很想听听!
作者索菲亚·杨 2022 年 1 月 5 日
当 Git 出错时,你会怎么做?
原文:https://towardsdatascience.com/what-do-you-do-when-git-goes-wrong-a50d20595a80
如何安全地恢复最新提交
吉姆·威尔逊在 Unsplash 上拍摄的照片
你有没有遇到过这样的情况,当你的 git 严重出错,你需要拼命恢复?我发现自己偶尔会遇到这种情况,人们似乎也会遇到同样的问题。许多新的 Git 用户在第一次遇到这种情况时可能会感到绝望。因此,在本文中,我将向您展示当 git 出错时该做什么,以及如何安全地修复它。
Git 问题
长话短说,我忘记了为我的代码使用分支,并且没有首先做git pull
从远程存储库中获取所有的更改就提交了我的更改。结果是:
git push
被拒。
git pull
也不行。
解决方案
上面的“提示”里有一些很好的建议。但有时我们想做的只是撤销最*的提交。与此同时,我们可能仍然需要最*一次提交所做的更改,并且不想丢失它们。有多种方法可以做到这一点。我是这样做的:
- 我检查我的
git log
,它显示了我所有的提交历史:
- 然后,我复制并粘贴我的最新提交 ID。我执行
git diff commit_id > patch
来保存最*提交到文件的差异。这一步非常重要。这允许我们将最*提交的更改保存到一个单独的文件中。
- 然后我做了一个
git reset --hard HEAD^
来回复到之前的提交。注意这是一个危险区域。您将丢失最*提交的内容。
- 现在,当我们再次检查
git log
时,我们确实处于之前的提交状态:
- 然后我们终于可以做一个
git pull
- 如果我们仍然想要应用我们最*提交的更改,我们想要做什么?请记住,我们已经将差异保存在补丁文件中。在这里,我们可以运行
patch -p1 < patch
来应用这些更改。我先做了一次预演,以确保一切正常。
- 现在我们可以在
git diff
中看到文件变更,我们可以使用git commit -a
提交所有变更,使用git push
成功推送变更。
摘要
总之,下面是我为解决冲突和保存文件更改而执行的 git 命令:
# get the id of the lastest commit
git log# save the diff from the latest commit to a patch file
git diff 13fd7bc9219ee10f64b803303e6d90f94bb6e219 > patch # revert to the previous commit
git reset — hard HEAD^ # confirm that we are at the previous commit
git log # fetch changes from repo
git pull# apply file changes from the path file
patch -p1 — dry-run < patch
patch -p1 < patch # check git diff on the file changes
git diff # commit changes
git commit -a # push changes
git push
让我知道你在这种情况下通常做什么,如果你有任何建议。请随意与我分享您使用 git 的有趣经历!😃
数据科学家是做什么的?
原文:https://towardsdatascience.com/what-does-a-data-scientist-do-12109f4fc03a
业内数据科学家的日常工作
乔恩·泰森在 Unsplash 上的照片
你还在想专业数据科学家的日常工作是什么样的吗?
让我来阐明这一点,并分享我学到的一些技巧,这些技巧可以帮助你成为一名专业的数据科学家。
问题是
与我交谈过的大多数数据科学学生都被他们在网上找到的海量内容弄得不知所措。
有成千上万的在线课程、博客文章和网络研讨会,涵盖了数据科学领域的不同工具、算法和技术。
然而,仍然不清楚专业数据科学家的实际日常工作是什么样的。
实际的数据科学工作是什么样的?
让我们在这篇文章中解决这个盲点。
数据科学家的角色
作为一名数据科学家,你实际上是两个团队之间的“接口”:
- 开发人员/数据工程师👷
- 业务/产品人员👩🏻💼
您的角色是搭建桥梁(即数据产品),将抽象数据转化为高质量的业务决策。
你对两个世界说得越多,你的工作就越有效。然而,这两个团队中的每一个都说“稍微不同的语言”。
与业务/产品人员交谈
业务利益相关者,如产品负责人,专注于设定和实现清晰的业务成果。你需要定期与他们交谈,以确保你为公司解决了正确的问题。
没有什么比针对错误的问题构建完美的解决方案更令人沮丧的了。
例如,您的产品销售线索可能会对您说这样的话:
👩🏻💼:“我们希望在本季度末将用户留存率提高 5%。有想法吗?”
酷毙了。你知道你需要解决什么。
现在让我们继续讨论如何解决这个问题。
为此,你需要相关的、高质量的数据。没有高质量的数据,你就无法衡量员工的忠诚度,也就无法衡量你的进步。没有高质量的数据,你将会悲惨地失败。
与数据工程师交谈
数据工程师负责为您提供高质量数据所需的基础设施。所以他们是你现阶段最好的盟友。
如果你想成为一名成功的数据科学家,你和数据工程师之间的交流是必须的。
数据工程师和科学家之间的良好对话会产生具体的行动。例如:
- 让我们添加脸书第三方数据来丰富用户资料,或者
- 删除交易表中的重复条目,或
- 使数据可用于前端仪表板。
一旦获得高质量的数据和清晰的业务成果,您就可以施展数据科学的魔法了。
常见的“数据科学”魔术
使用数据解决业务问题的三种方式是:
#1.使用 Tableau/Power BI 构建仪表板
构建一个用户保持度控制面板,产品负责人可以使用该控制面板按相关用户属性(例如,地理位置、年龄)对该指标进行细分。仪表板是保持产品人员和您之间交流的好方法。
我个人推荐你从这个开始。
#2.运行数据探索
自己探索数据,找到唾手可得的果实(又名速赢)。例如,您可能会发现某些脸书活动带来了低保留用户,所以您 ping 营销团队来阻止他们。快速轻松取胜。我喜欢这些。
#3.训练一个机器学习模型
有时候你需要拿出大枪,使用机器学习。例如,您可以建立一个客户流失预测模型,以识别可能流失的客户。有了这些信息,营销团队可以向这些用户发送报价,并保持他们活跃。
我的建议:机器学习很有诱惑力。但通常情况下,您并不真的需要使用它。在求助于 ML 之前尝试#1 和#2。
如何实现:基于项目的学习
每个专业数据科学家都需要掌握一些技能来实施上述 3 种解决方案中的任何一种。那么问题来了,这些技能是什么?
成为一名专业的数据科学家需要掌握哪些技能?
在我看来,任何数据科学家都应该知道:
- SQL :没有数据就没有数据科学家。为了查询和提取项目数据,您需要掌握 SQL。没有它,你会很慢,依赖数据工程师。
- Python :数据科学和 ML 中的主要编程语言,得益于其庞大的开源库生态系统。
- 演示和可视化:数据科学家是业务涉众和数据工程师之间的“接口”。因此,您需要以可操作的方式谈论和展示信息,重点关注其业务影响。
- 机器学习 (ML) : ML 是关于从数据中构建软件。它用于自动化和改进运营和业务决策。
- (一点点)云服务:大多数公司的基础设施都在云中(例如 AWS、Google Cloud 或 Azure)。在云环境中工作,并构建与云服务集成的解决方案,这一点非常重要。
- (有点)深度学习库:如果你想深入研究计算机视觉或自然语言处理,你需要了解神经网络,如何训练,以及如何微调它们。
大多数人遵循基于课程的方法,他们开始许多课程(并完成其中的一小部分)。这不是最适合我的。
相反,我建议你通过遵循基于项目的方法来学习。
→挑一个你关心的问题
→找到与之相关的数据。
→构建一个解决方案(上面提到的 3 个中的任何一个)并使其可公开访问(例如 GitHub)。
并重复。
学习数据科学的唯一途径是解决数据科学问题。
想成为机器学习和数据科学的专家吗?
🚀 加入 Datamachines 时事通讯,了解 ML 和数据科学的真实世界。
💎 今天使用我的推荐链接 成为会员,可以无限制地访问我在媒体上发布的所有内容并支持我的写作。
**https://pau-labarta-bajo.medium.com/membership
快乐学习🤗
避寒胜地**
数据科学家读什么?
有秘方吗?我分享我 2022 年 1 月至 3 月的阅读
方与在 Unsplash 的合影
数据科学不会停滞不前。我记得当我开始的时候,选择的编程语言会在一年中不断变化,因为新的软件包被编写出来,击败了竞争对手。事实上,在那个时候,还没有真正认可的大学培训课程。你不得不接受你能得到的任何训练,并希望有人会抓住你的机会。我不会说感到冒名顶替综合症和巨大的压力是不寻常的,这种压力可能会使某人过度工作并不断学习,以防他们“发现”自己并不好。
作为一个题外话,我倾向于发现那些没有这种感觉的人是骗子,他们对数据科学还没有足够的了解,以至于不知道他们真的什么都不知道。
如今,尽管数据科学课程和大学课程盛行,但我要说,学习的压力仍然存在。人们经常期望我们都应该对所有算法了如指掌(你不知道),我经常发现数据科学家在办公室里熬夜看论文,错过了家庭生活,慢慢失去了对工作的热爱。
那么,你应该读什么呢?简单来说,就是任何让你充满激情,让你保持兴趣的事情。你想读一篇 20 页的纯数学论文吗?
去吧。
你想看一篇关于有人如何在瓶子里造出一艘小船的文章吗?
去吧。
佩吉·安克在 Unsplash 上的照片
这可能看起来很奇怪,但这就是我所做的,至少对我来说,当我跟随任何我迷失的兔子洞( wiki 或其他)时,我会学到最多。
正如我之前所说,作为一名数据科学家,人们似乎认为我们总是在阅读论文、做数学、在白板上涂鸦等等。在我们所有的时间里。但是我发现如果我那样做,我会在“现在”如何做事情上变得狭隘,而不是未来会发生什么。这也有点像公共汽车司机的假期,下班后我需要时间做点别的事情,否则我会发疯的。
我的第一个建议是,如果你对数据科学感到疲惫和厌倦,不要一直这样做!如果你每天都做一些你喜欢的事情,超出了你喜欢的程度,你就有可能讨厌你喜欢的事情,错过其他你想做的事情。这是很多人在读博士时经历过的事情。我记得当我开始工作时,我的第一次经历是走进办公室,到周末时,一个人会在一天结束时不停地哭泣。他们花了这么多时间试图解决问题,他们不能再通过做其他事情或以不同的方式看待问题来分散注意力。
这和阅读有什么关系,保罗?
好吧,也许你是对的,我已经跑题了。但我想说的是,不要认为你必须阅读的所有资料都是数据科学。通常,看看其他感兴趣的东西可以建立联系,给你带来你甚至不知道的灵感。
对我来说,这发生在最*的一份工作中,他们非常努力地试图以一种特殊的方式解决一个问题,但我可以看到它与可靠性工程世界中已经存在的解决方案有关(我过去的生活之一,我仍然关注着它)。
我的阅读清单
在工作中,经常会被问到在读什么或者目前感兴趣的内容;我每月公布一份我读过(或看过)的、我认为很吸引人的东西的清单。很多人喜欢它,我想,为什么不分享一下呢?
所以这里是我最*三个月所读的内容(我甚至包括了我的评论而不是裸露的链接),供你欣赏。尽情享受吧!如果你觉得它有帮助,请让我知道,我会继续分享!
2022 年 1 月
吴恩达:解除大赦国际
这是一位同事发给我的一篇文章,其中吴恩达(最著名的数据科学家之一)回答了一些他认为人工智能未来趋势的问题。他提出了一个很好的观点,即拥有基础模型(人们用作基础和调整的高级通用模型),以及拥有更多以数据为中心的人工智能,我们的目标是“好数据”而不是“大数据”,以实现大型数据集无法或不会存在的领域的目标。
我们在自动化种族主义吗?
这是一个周期性出现的话题,也是人们必须更多考虑的事情,特别是在机器决策被用来做出可能不公*地评判人们的决策的领域。即使错误率相同,在某些事情做得不好的机器和在特定群体中表现很差的机器之间也有微妙的区别。例如,如果针对一个团队成员的错误决策比针对不同团队的错误决策更具破坏性,那么相同的失败率可能是非常不可取的。这是一个非常有趣的关于原因的研究,以及如何“重置”你可能有的偏见。
他们使用的第一个例子非常令人震惊,但也是我没有想到的一个有趣的技术,即通过显著性识别图像中的感兴趣区域。这在 Twitter 裁剪的缩略图中引起了一些令人震惊的行为,ML 系统在图像中寻找人脸进行裁剪,它将有 60%以上的时间选择白人人脸而不是其他种族。这里的原因是训练数据几乎没有非白人面孔的例子,但也提出了这样一个问题,即这样一个工具是否首先需要机器学习。
另一个有趣的例子是在医疗干预中,他们发现非白种人必须病得更重才能触发干预。原因是训练数据以一种被证明是有偏见的方式被标记。
到最*点的最快方法
我想我们都遇到过寻找最接*另一个值的编码问题。有时我们只是简单地将所有点加载到一个列表中,遍历所有的点,然后返回最*的一个。这对于少量的点来说可能没问题,但是一旦你达到数百万甚至数十亿,这就变得非常耗时。
在这个视频中,电脑爱好者用 K-d 树来寻找一种快速有效的搜索方法。这些使您能够快速搜索多维区域(k 维)。如果你想知道为什么这是一个问题,他们举了机器人激光雷达导航的例子,每次扫描都会返回 1000 个点,他们需要快速将这些与之前扫描的地图联系起来。如果你不能做到这一点足够快,那么导航会变得笨拙和缓慢,因为他们必须等待他们的地图更新。
将建筑变成景点
这不是一个数据科学或机器学习视频,但这里汤姆·斯科特(他制作了许多有趣的视频)谈论了苏格兰的希尔豪斯。一座革命性的房子建于 20 世纪初,但因为它太先进了,简直要融化在苏格兰的天气里了。
问题是它不能被完全覆盖,或者它不会完全干燥(太快或根本不会),所以他们使用了一种创新的锁子甲网格系统来保持干燥,让它呼吸。
这里的问题是,如果游客看不到房子,那么他们可能会忘记它,不再来参观。通过在盒子里安装特殊的走道,他们使游客能够看到房子的景色,这在把它变成一个独特的景点之前是不可能的。
这是一个有趣的例子,将一个问题转化为一个全新的机会,推动游客到该地旅游,并帮助支付费用。这是我们在处理问题时应该经常考虑的事情。
2022 年 2 月
有时候简单仍然是最好的
我想我以前给人们指出过汤姆·斯科特在 YouTube 上的视频,但我觉得这个很有趣。在苏格兰,落石会给道路网带来危险。
在这个视频中,他们看到了维多利亚时代的预警系统是如何被使用的,因为没有其他现代解决方案被发现也同样有效。
多目标跟踪
这个问题是在最*的一次项目头脑风暴中出现的。最终,特定的理想解决方案是需要能够从一个场景到另一个场景跟踪对象,或者同时跟踪多个对象。这篇文章介绍了相关内容,并为感兴趣的人提供了进一步阅读的资源链接。
SQL:拒绝死亡的数据库系统
不久前,SQL 被吹捧为即将过时,许多非结构化版本被吹捧为前进的方向。然而,它继续被大量使用,因为它的结构意味着在某些情况下人们可以更容易地使用和维护它。当然,在其他解决方案应该被使用的情况下,它也仍然被使用,但这不是这里的要点(我只是想在其他人之前指出这一点)。
此外,如果你一直在关注像吴恩达这样的顶尖数据科学家的预测。你会看到,他们现在提倡高质量的数据集,而不是用于训练模型的大型数据集(特别是如果基础模型变得更加广泛的话),所以 SQL 可能会存在更长一段时间。
如果你曾经尝试过学习 PySpark,你会发现很多 PySpark 语句的结构与 SQL 相似。考虑到这一点,我在这里添加了一篇文章的链接,还链接到了汗学院,该学院开设了一个免费的 SQL 培训课程,所有这些都在浏览器中完成。
距离——海明、欧几里德还是曼哈顿?
如果您从未处理过任何地理或距离数据,您可能从未认真考虑过,有时直线距离测量与您试图解决的问题并不匹配。输入不同的距离度量。也许你不需要它们,但是知道它们还是很有用的。
三月
数据趋势
这篇文章很有趣,因为它展示了他们认为未来三年会出现的趋势。我甚至学到了一个新东西,“语音钓鱼”,他们不是使用深度假货来制作视频,而是用它来模仿人们的声音(这已经被用于一个犯罪骗局)。
不管怎样,这都是一本有趣的书。
很快我们就可以看电视旅行了
至少在更多的地方。
https://www.bbc.co.uk/news/technology-61155735
BBC 的这篇新闻报道了高速公路法规正在被修改的事实,这样自动驾驶汽车的司机就可以看电视了。尽管如此,使用手机仍然是非法的。
另一个注意事项是,自动驾驶汽车的用户将不对撞车负责(保险公司将负责)。这当然是一个有争议的问题,因为自动驾驶汽车的制造商在发布产品时会更加犹豫,因为他们最终不希望它花费他们更多的钱(即,他们无法为每种场景设计,因此可能会有过高的责任成本)。如果你想深入了解,甚至有一整篇维基百科文章。
另外,如果你认为我们是在一个自动驾驶的世界,我们不是。有一个整体分类系统,目前的汽车都在 SAE 级,这是系统可以帮助你的最后一个评级(越高越自动化),但最终司机负责监控和继续控制。
一级系统的一个例子是车道辅助系统、自适应巡航控制和自动制动系统(控制转向或加速/减速,二级两者都做)。两者都是为了指导你,并作为最后的失败保险,但它是由你来监控或超越它们。
车道保持辅助系统
我的车有这个,我一直认为它使用摄像头来检测道路的白线,然后做一些有趣的事情来保持它在车道上(或者如果我不这样做就警告我)。所以我做了一些调查,有一篇有趣的研究文章使用支持向量机来做这件事,然后我找到了一个更有爱好的方法来使用 OpenCV 做这件事。(有一个 Coursera 专精如果有人超级感兴趣的话,尽管我自己没有看过)。
如你所见,这个月我掉进了一个兔子洞。
摘要
我列出了过去三个月我发现的一些有趣的事情,希望你也喜欢。
祝你一周愉快!
AlphaFold 是做什么的?
原文:https://towardsdatascience.com/what-does-alphafold-do-60b6370dafe4
利用人工智能的力量来理解蛋白质是如何折叠的
TL;速度三角形定位法(dead reckoning)
- 我试图给蛋白质折叠一个简单的解释,
- 为什么我们想要预测它是如何发生的,
- AlphaFold 如何使用神经网络,一种机器学习(ML)技术来解决蛋白质折叠问题,
- 并给出了一个在 Google Cloud 上使用 Vertex AI 进行批量推理的参考架构……走吧! ➡️
🤔什么是蛋白质折叠,为什么它是一个难题?
每种蛋白质都是由一系列氨基酸结合在一起组成的。这些氨基酸相互作用形成形状,这些形状在更大的范围内折叠起来成为复杂的三维结构,基本上是我们星球上所有生命的基石。
蛋白质潜在的折叠方式多得难以想象。因此,弄清楚它们如何以一致的方式快速折叠是非常棘手的。目前,已知的蛋白质超过 2 亿种,而且每年都有更多的蛋白质被发现。每一个都有独特的 3D 形状,决定了它的工作方式和功能。
图 1:不同尺度的氨基酸。作者插图。
能够可靠地预测蛋白质将如何折叠开启了许多强大的用例,例如发现治疗疾病的新药,并总体上帮助我们更好地理解生物学如何工作。但几十年来,人们一直认为做出这种预测所需的计算能力远远超出了现有能力。
然而,利用他们设计算法的经验,可以在几个小时内学习复杂的游戏,如国际象棋和围棋,Deepmind 的研究人员开发了一种名为 AlphaFold 的机器学习引擎,可以预测蛋白质折叠的方式。最新版本(AlphaFold2)现在可以在几分钟内大规模预测蛋白质的形状,并精确到原子的精度!🤯
这是一项重大突破,凸显了人工智能对科学的影响。这项工作已经发表在《自然》杂志上,并赢得了生命科学、数学和基础物理领域的突破性奖项。👉 详见延伸阅读。
alphafold 是如何工作的?
毫无疑问,蛋白质折叠背后的科学和推导蛋白质结构预测的实验过程是复杂的。所以我会尽我所能简化这个过程以及它在 AlphaFold 中的工作方式。
蛋白质折叠的一个关键假设是,预测它将如何折叠的所有必要信息都可以从氨基酸序列及其所处的环境中获得。
就 ML 模型而言,您可以将氨基酸序列视为我们的输入变量,而“环境”由模型的参数决定。最终结构的输出预测,或蛋白质将如何折叠,是由前者决定的。
图 2:蛋白质折叠的 AlphaFold 架构,来源:Jumper 等,2021 [2],作者注释。
这里有一个(非常😅)蛋白质折叠如何在 AlphaFold 上工作的粗略分类:
1.提供氨基酸序列作为 AlphaFold 算法的输入,
2.进行一些数据预处理以产生包含在氨基酸序列中的骨架原子。原子最初被赋予随机坐标。
3.搜索结构和模板数据库,以便:
3a。找出对应于氨基酸序列的结构。这有助于检测氨基酸序列中更可能发生变化的部分,并收集这些“突变”之间的关系。
3b。基于现有模板识别可能具有相似结构的蛋白质,并构建结构的初始表示用于成对比较。这个模型代表了哪些氨基酸可能相互接触。
4.MSA 和成对结构(3a。& 3b。)通过一个名为“Evoformer”的深度学习模型,该模型有 48 个神经网络模块,用于在氨基酸序列和几何结构的成对结构特征之间交换信息,这有助于在几次迭代中完善模型。接下来是另一个称为“结构模块”的深度学习模块,它有 8 个神经网络块来构建输入序列的最终 3D 蛋白质结构。
重新运行步骤 3 和 4 三次
5.最终的输出结果是一个精确的折叠蛋白质结构,其中每个原子都有相应的坐标。
🔮顶点人工智能的 AlphaFold 批量推理
“计算密集型”是什么意思?😮💨
正如你可能已经从上一节中收集到的,从 AlphaFold 获得预测需要大量的特征工程,因为它从基因和结构库中提取了大量的补充数据。所有这些都需要万亿字节的内存来存储,以便在预测期间使用。
然后,你有一个非常密集的神经网络,用来创建自己的预测。理想情况下,你需要大量的 GPU(甚至是 TPUs )来加速神经网络中每个节点进行的数学计算。大多数人没有运行像 AlphaFold 这样的 ML 模型所需的物理基础设施…
但是不要害怕!通过云的力量,任何人都可以运行 AlphaFold 算法!具体来说,在谷歌云*台(GCP)上使用 Vertex AI。
Vertex AI 将用于构建 ML 的 GCP 服务集中在一个统一的 UI 和 API 下,以简化大规模构建、训练和部署机器学习模型的过程。
下面的例子涵盖了一些最*发布的功能,如 Vertex AI Pipelines,它们通过编排您的 ML 工作流来帮助您自动化、监控和管理您的 ML 系统——这是实现机器学习操作的关键起点( MLOps )。
你可以这样做
图 3:顶点 AI 上 AlphaFold 批量推理的参考架构。作者插图。
先决条件:
1.将功能工程过程中引用的 MSA 和结构模板加载到 Google 云存储(GCS)中。您还可以使用 GCS 来存储您的氨基酸输入数据。
2。使用代表特征工程过程和神经网络的开源代码来构建顶点 AI 管道。
图 AlphaFold 批量推理的通用顶点 AI 流水线,来源:谷歌云【4】
基于图 3 中描述的架构组件,图 4 中所示步骤的总结:
1.触发管道运行
1a。负载输入和
1b。参考数据
2。运行特征工程管线(存储在 GCS 中)
3。将特征和模型参数输入管道以获得预测
3a。重复给定次数的迭代
4。对预测的结构进行琥珀色松弛(可选)
5。预测的蛋白质结构排名
6。将模型预测存储在 GCS 中
现在你有了它,如果你想看看样本代码和你需要开始做的一切,就去 GitHub 库。
🏁包裹
作为一个可能对蛋白质折叠非常陌生的人,我不指望你在看完这篇文章后突然成为一名基因研究者!另一方面,如果你已经在这个领域工作,我希望这是一个学习如何应用人工智能来帮助解决一些自然最深层的奥秘的实用起点!
本岗位目标:
- 提高对一个令人着迷(但非常复杂)的话题的认识,并努力让这个话题变得更容易理解
- 强调这样一个事实,你不需要一个满是超级计算机的实验室来完成像 AlphaFold 这样的 ML 系统所需要的计算密集型工作。
如果你对蛋白质折叠和 AlphaFold 有了基本的了解,我在这里的工作就完成了!下次再见,感谢您的阅读和支持🙏🏼。
🗃参考资料&进一步阅读
[1] Deepmind,Highlighted Research,https://www . deep mind . com/Research/highlight-Research/alpha fold
[2] Jumper,j .,Evans,r .,Pritzel,a .等.用 AlphaFold 进行高度精确的蛋白质结构预测.自然 596,583–589(2021)(CC BY 4.0)。【https://doi.org/10.1038/s41586-021-03819-2
[3]使用顶点人工智能管道运行 AlphaFold 批量推理,谷歌云博客文章,https://Cloud . Google . com/Blog/products/AI-machine-learning/alpha fold-batch-inference-with-Vertex-AI-Pipelines
[4] Google 云*台,GitHub repository (Apache-2.0 许可证):https://GitHub . com/Google Cloud Platform/vertex-ai-alpha fold-inference-pipeline # readme
C3.ai 是做什么的?
原文:https://towardsdatascience.com/what-does-c3-ai-do-305880b737c8
与前玛奇纳一起深入研究无代码 ML
刘玉英在 Unsplash 上的照片
TL;速度三角形定位法(dead reckoning)
C3.ai 是一家软件公司,提供一系列 ML 驱动的解决方案,这些解决方案是为特定行业量身定制的,目标是更大的公司。他们的一款产品名为“Ex 玛奇纳”,这是本文的重点,旨在:
- 一个易于使用的,可视化的,无代码的构建 ML 模型的环境。
- 目标用户受众是“公民数据科学家”,他们通常是不具备数据科学专业知识,但仍希望能够利用预测性 ML 模型功能的业务用户。
⚡️趣闻
“Ex 玛奇纳”一词来源于拉丁语“deus ex machina”(或“机器中的上帝”),指的是突然出现或被引入一种情况中的人或事物,它为一个显然无法解决的难题提供了一种人为的或人为的解决方案。[1]
🤹🏼♂️公民数据科学家工作流程
就像我之前的“T2 是做什么的?”帖子,我决定给前玛奇纳自己一个旋转。
为了在我的修补中应用一点结构,我提出了一个简化的工作流,它可能代表了普通公民数据科学家所走的道路:
图 1:公民数据科学家工作流程,作者的插图。
无需编写任何代码或了解很多关于 ML 的知识,您可能会想…
- 加载一些数据,
- 可能做出一些改变或者为模型训练准备数据,
- 训练一个模型,最后,
- 用那个模型预测一些事情。
当我深入这个产品的内部工作时,我们将回头参考这些步骤。
🚀启动并运行
C3.ai 最*宣布与 GCP合作。普通读者会知道这是我首选的云,所以我想看看能不能通过 GCP 市场来提升它:
图 2: GCP 市场,C3 AI Ex 玛奇纳
搜索“C3.ai”很快就出现了一个市场产品列表,包括玛奇纳以外的产品。不像有些产品可以让你不用离开 GCP 就可以启动并运行,我看到了一个注册链接。
这会将您带到一个外部登录页面,您可以在那里注册 14 天的免费试用。所以我就是这么做的!
Ex 玛奇纳作为按用户订阅服务提供,可用作托管在 C3.ai 服务器上的托管服务。如果您选择他们的“企业”订阅层,您也可以将其部署在您选择的基础架构或云上。
注册后,您可以通过 C3.ai 托管的网站登录 Ex 玛奇纳。
您首先看到的是左侧带有导航的仪表板,在主页上有几个部分,其中包含示例工作流、您最*的项目和资源:
图 3: C3 AI Ex 玛奇纳,主页/欢迎页面
项目是您构建 ML 工作流的地方,使用拖放工具放置在画布上。
在创建或加载项目之前,您必须确保您的“环境”正在运行(参见主页左上方):
图 4: C3 艾 Ex 玛奇纳,环境状况
您可以为不同大小的“环境”付费,根据您的需求选择更多内存。这些环境似乎是由 C3.ai 托管和管理的。我将在文章的最后谈到定价。
现在,让我们来构建我们的公民数据科学家工作流!
⛽️ 1.加载一些数据
第一步是创建一个新项目(参见“最*的项目”面板右上角的“+”符号)。
在新创建项目的画布右侧,您会看到一个“节点”类别列表,这些类别与您可能要执行的不同任务相关。您可以独立运行节点,也可以作为一个端到端的工作流运行节点。
展开“输入数据”类别会显示几个不同的数据源子类别,为了简单起见,我选择了 CSV 文件上传:
图 5: C3 人工智能 Ex 玛奇纳项目,输入数据节点
你点击节点,并将其拖到画布上进行配置,即告诉它从哪里上传文件,跳过标题行,以及使用哪个分隔符。
在这种情况下,我使用 Kaggle 数据集进行贷款违约预测:
图 6: C3 艾 Ex 玛奇纳,项目,画布视图
配置好节点并点击 Run 按钮后,您可以通过双击节点来查看数据示例:
图 5: C3 人工智能 Ex 玛奇纳,输入数据节点细节
👩🏾🍳 2.准备数据
在我们训练一个 ML 模型之前,通常需要一些数据准备,除非你使用一个干净的、精选的数据集(就像这个例子!).
至少,我们可能希望进行一些数据分析,以了解我们加载的数据集中是否有缺少或不一致的值的列。
对于这个任务,我查看了“分析”类别下的“描述列”节点,将它拖到我们的画布上:
图 6: C3 艾 Ex 玛奇纳,描述列节点
运行并双击“Describe Columns ”(描述列)节点,使我们能够构建数据的可视化配置文件,并提取我们可能感兴趣的关键摘要:
图 7: C3 AI Ex 玛奇纳,描述列节点细节
假设我们对要用于模型训练的数据集感到满意,将数据集随机分成单独的训练集和测试集通常是个好主意。
我们这样做是因为它有助于我们了解模型在对以前从未见过的数据进行预测时的表现。如果您想了解更多信息,请点击此处。
我不相信 Ex 玛奇纳会在模型训练之前自动分割您的数据集,所以我使用了“变换”类别下的“随机分割”节点来实现这一点,使用默认配置:
图 8: C3 人工智能 Ex 玛奇纳,随机分割节点
🏆 3.训练模特
加载并准备好我们的训练数据后,是时候训练我们的 ML 模型了。
戴上公民数据科学家的帽子,我决定坚持使用“AutoML”类别的节点,特别是“模型搜索分类器”,它可以在一个步骤中训练多个模型:
图 9: C3 人工智能 Ex 玛奇纳,模型搜索分类器节点
在配置了要用来为模型定型的列和目标列之后,可以钻取到该节点。
对于我要使用的数据集,列是:
- ‘就业’,这是一个布尔型,1=就业,0 =失业。
- ‘银行余额’,贷款申请人的银行余额。
- ‘年薪’,贷款申请人的年薪。
训练标签(我们希望我们的模型预测的内容)是:
- 默认,这是一个布尔 1 =默认 0 =过去没有默认。
点击“Train ”,将根据您选择的指标创建一个车型排行榜。然后,您可以挑选最好的,保存起来供以后使用:
图 10: C3 人工智能 Ex 玛奇纳,模型搜索分类器节点细节-1
向下滚动模型选择面板,您还可以获得关于所选模型的一些信息。例如特征重要性和在训练期间使用的任何参数:
图 11: C3 人工智能 Ex 玛奇纳,模型搜索分类器节点细节-2
🤖 4.获得一些预测
现在是激动人心的部分,得到一些预测!
再次坚持使用“AutoML”类别的节点,我将“AutoML Predict”拖到画布上,确保它与我的测试数据集相连接。您所需要做的就是为新列命名,在该列下,您希望从您的模型中捕获预测输出,并且实际上是从那些先前保存的数据中使用的模型:
图 12: C3 人工智能 Ex 玛奇纳,自动 ML 预测节点
运行“AutoML Predict”节点并双击后,您可以看到一个更新的数据样本,其中有一个新列显示模型预测,即贷款申请人是否可能违约:
图 13: C3 人工智能 Ex 玛奇纳,自动 ML 预测节点细节
这个视图中似乎没有任何评测统计,这让我有点失望。点击“Vizualisations”选项卡(上面截图的顶部中间)可以构建不同的图表,但没有明显的“现成”信息告诉我该模型在我的测试数据集上的表现如何。
最终,我们的公民数据科学家将希望将预测(或从 ML 中获得的洞察力)纳入他们的业务中,就像通常的任务一样。因此,我们可能需要将数据从玛奇纳转移到其他适合执行进一步分析的地方,或者可能需要构建一个仪表板或报告。
在撰写本文时,与当今市场上可用的大量数据源、BI 和分析工具相比,节点的“输出”类别看起来有些有限。我还注意到缺少直接输出到 BigQuery 和 Google 云存储的节点…这可能是试用版的限制?
图 14: C3 人工智能 Ex 玛奇纳,输出数据节点
在我看来,AWS S3、Azure ADLS 和 Snowflake 这样的大型企业数据仓库公司都在名单中。我确实尝试了雪花连接,但无法让它工作(在这篇文章的下一部分会有更多)。
如果没有“It 支持”,我们的公民数据科学家不太可能连接到这些目标中的大多数。因此,尝试贴*角色,并通过“自动预测”节点选项使用“导出到 CSV 选项”:
图 15: C3 人工智能 Ex 玛奇纳,自动 ML 预测节点—导出到 CSV
现在你知道了,我们的工作流程已经完成,从加载数据到从 ML 模型获得一些预测— 而无需编写任何代码!
⚖️初步印象
以下是我对 Ex 玛奇纳实验的一个简短总结:
设置:
启动和运行试验相当简单。
我确实尝试过将示例工作流中的预测推送到雪花数据库表中,但收效甚微。
我在雪花中创建了一个数据库、表和模式,并且能够在 Ex 玛奇纳成功测试连接:
图 16: C3 AI Ex 玛奇纳,输出数据—雪花节点—创建凭证
但是当我试图通过运行“输出数据—雪花”节点来实际写出一些数据时,我得到了一个非常无用的错误消息:
图 17: C3 人工智能 Ex 玛奇纳,输出数据—雪花节点—运行错误— 1
就是这样,没有迹象张贴到文件或任何简单的方法来提高支持票。在画布上,节点的配置中有一个不同的错误消息,但它似乎与雪花无关:
图 18: C3 人工智能 Ex 玛奇纳,输出数据—雪花节点—运行错误— 2
我发现文档迷你站点相当稀疏,很少涉及我认为配置某些工具所需的细节。在上下文中,节点级别的文档通常是不存在的:
图 19: C3 AI Ex 玛奇纳,AutoML 预测节点—文档选项卡
虽然大多数节点都很直观,但我认为在产品文档方面肯定还有改进的空间。
易用性:
“拖放”工作流范式并不新鲜,但 Ex 玛奇纳是我见过的第一个专注于 ML 的云原生例子。对于公民数据科学家来说,这是一个很好的切入点。
很高兴看到一些广泛的模型评估和可解释性特性作为 AutoML 节点的一部分,但也许它们会出现在未来的迭代中。
费用:
Ex 玛奇纳按用户订购服务提供,有免费、团队、专业和企业选项(用于在您自己的基础架构上部署):
图 20: C3 AI Ex 玛奇纳,订阅计划
团队版和专业版在个人版的基础上增加了一些额外的功能。一些亮点是协作、SSO 和身份提供者集成,您还可以获得更多内存,并且可以添加到项目的 AutoML 节点数量没有限制。
还提供了一些基本的调度和模型管理功能,但还没有接*对整个 MLOps 生命周期的支持。
总体:
Ex 玛奇纳最初在大约一年前推出,所以与公民数据科学产品领域的其他大玩家如 Alteryx 和 KNIME 相比,它仍然相对不成熟。
在纯粹的“自动”方面,有一些竞争对手,如 H20.ai、DataRobot 和 GCP Vertex AI。它们提供了类似的“无代码”体验,但在自动化常见任务方面要复杂得多,例如数据准备、模型选择、可解释性,甚至是生产模型。
目前,Ex 玛奇纳感觉自己处于市场上最好的“拖放式”和 AutoML 产品之间。
除了文档和数据输出设置方面的一些问题,我认为 Ex 玛奇纳为想要构建并从 ML 模型中获得洞察力的公民数据科学家提供了一个伟大的无代码工具。
如果 C3.ai 继续通过增加功能和改善用户体验来投资于该产品,它可能成为一个新兴市场的有力竞争者。
🙏🏼再次感谢您阅读我的帖子,如果您有任何问题或反馈,请联系我们!
📇参考
[1]布里安妮卡,《杀出重围》,https://www.britannica.com/art/deus-ex-machina
数据科学家的职业发展是什么样的?
理解大公司中初级与高级数据科学家角色的指南
Ethan Johnson 在 Unsplash 上拍摄的照片
恭喜你,你终于获得了一份数据科学家的工作邀请。所有花在更新简历和准备面试上的夜晚终于有了回报。
现在怎么办?
虽然得到一份数据科学家的工作确实令人兴奋,但这只是漫长职业生涯的第一步。当你面临漫长的旅程时,重要的是要了解这个旅程需要什么,不仅要管理你自己的期望,还要了解你需要发展的关键领域,以推进你的职业生涯。
那么,数据科学家的职业发展实际上是怎样的呢?在大公司工作的初级和高级数据科学家有什么区别?好了,不用再看了,因为这正是我们将在这篇博文中讨论的内容。
但是首先,一些免责声明。我将在这里展示的信息是基于我目前工作的团队和公司,这是一个更专注于咨询而不是产品开发的团队和公司。因此,它可能代表也可能不代表整个行业。
此外,这篇博文不会涵盖那些最终进入管理层的人,换句话说,那些负责为企业带来新客户的人。相反,我们会看一个决定长期留在技术路线的人的职业轨迹。
为了让本文更有条理,我们将评估四个不同领域中每个级别的数据科学家的角色和工作范围:
- 解决问题
- 沟通
- 管理关系
- 工作规划和授权
研究生数据科学家
这是一个入门级的角色,通常由工作经验不到两年的大学毕业生担任,是公司研究生项目的一部分。
除了为公司做出可靠的贡献之外,研究生数据科学家的主要目标是在整个项目期间尽可能多地学习。
大多数公司会给你找一个伙伴,他会帮助指导你,并组织各种与沟通、数据隐私、如何与客户打交道、提高不同技术技能等相关的研讨会。
在我的公司,每个毕业生都需要填写一份熟练程度检查表,该表主要跟踪我们在技术和非技术方面的学习和发展进度。
1.解决问题
理想情况下,一名毕业的数据科学家应该具备基本的解决问题的技能,例如将任务分解为一系列可行步骤的能力,以及知道哪个优先于另一个的能力。
就日常职责而言,人们可以编写 SQL 查询,使用 Excel 或 R 进行分析,制作数据可视化,创建仪表板,以及帮助为客户准备一部分 PowerPoint 幻灯片。
2.沟通
作为一名研究生数据科学家,你将学会把发现总结成易于理解和交流的表格或图表。这是因为,在一天结束的时候,一个分析的好坏取决于你的听众能够带走的信息。
3.管理关系
处于层级的最底层,毕业生没有太多被期望去做的授权或监督。尽管如此,这是开始与你的直接同事和你经常合作的客户团队建立融洽和有意义的关系的最佳时机。
这不仅会在你职业生涯的早期树立你作为一个可靠员工的名声,更重要的是,如果你知道将来该向谁寻求帮助,会让你的工作变得容易得多。
4.工作规划和授权
与上面提到的观点类似,研究生数据科学家不需要委派工作,而是将大部分时间花在完成上级交给他们的任务上。
数据科学家
一旦你完成了研究生课程,你就会自动成为一名数据科学家。公司的大多数数据科学家都属于这一类。
与毕业生类似,数据科学家是在更高级的同事的指导下在现场工作并推动项目向前发展的人,但他们还承担着照顾项目中其他毕业生和实习生的额外责任。
1.解决问题
数据科学家执行的任务大多与毕业生相同,只是有时会承担更复杂的任务,例如,在高级数据科学家的帮助下构建复杂的模型。
除了照看自己的工作,他们还帮助 sense 检查毕业生和实习生给出的答案。此外,他们捕捉分析的关键含义,并推荐合理的后续步骤来推进某项工作。
2.沟通
在沟通方面,这一级别的数据科学家将开始组织团队会议,并促进团队内部的讨论。偶尔,他们也可能发起一个知识分享会议来让其他毕业生和实习生受益,比如教他们如何正确地使用 Git 进行版本控制,或者如何审查其他人的代码。
3.管理关系
如上所述,作为一名数据科学家,很大一部分贡献不仅仅是你自己的工作,因为他们还为其他经验不足的同事提供支持。此外,数据科学家还可以有效地向高级数据科学家传达他们的进展、障碍以及如何解决它们的计划,并接收反馈。
4.工作规划和授权
这一级的授权很少,但对他们持续交付高质量工作的能力的期望增加了。
高级数据科学家
在一系列项目中,你不断证明自己可以照顾初级数据科学家,同时自信地在任务之间周旋,之后,你被提升为高级数据科学家。
高级数据科学家是团队和项目管理的第一步,因为你不仅要在自己管理的工作流中扮演支持角色,还要向首席数据科学家和客户汇报。
在这一阶段,您将开始协助客户互动,例如通过电子邮件回答客户问题,以及领导由 2-3 名初级数据科学家组成的工作流。
1.解决问题
高级数据科学家解释客户的问题,并在工作流级别构建问题。他们还领导一个由初级数据科学家组成的团队,帮助将他们想要的解决方案公之于众。
对工作流的输出如何整合到整个项目中有一个坚实的理解是至关重要的。这是为了确保时间和资源得到最佳利用。
2.沟通
高级数据科学家通常使用 PowerPoint 幻灯片在工作流级别起草、讲述解决方案并与客户沟通。
3.管理关系
高级数据科学家的大部分时间都花在支持初级数据科学家和向利益相关者传达相关信息上。
与初级数据科学家相比,他们花在技术工作上的时间要少得多,只有在必要时才会介入,为他们的工作流提供支持、指导、激励和反馈。
因为他们是团队中更新最多的人,所以高级数据科学家也充当工作流和客户之间的中间人,主持会议并展示结果和影响。
4.工作规划和授权
高级数据科学家应该在工作流级别规划工作,并在初级数据科学家之间分配任务。此外,他们还与团队一起安排及时的检查,以评估进展和改变优先级或工作流方向的需要。
首席数据科学家
在花了几年时间展示你的项目和人员管理能力,并证明自己是一个伟大而可靠的领导者之后,你终于准备好作为首席数据科学家领导整个项目了。
首席数据科学家是特定项目中客户的第一联系人,通常领导 8-10 人的团队。正如你所料,你越往上爬,就越不会去做数字运算,相反,你会承担更多咨询和报告的角色。
1.解决问题
首席数据科学家制定了项目的总体议程。他们与客户密切合作,定义问题,讨论和权衡潜在的解决方案,并就应该完成的时间表达成一致。
除了设定项目的战略方向,他们还管理项目的分析过程,并知道何时何地需要外部专家。
2.沟通
首席数据科学家处理与客户的大部分日常沟通。他们还领导所有的客户会议以及每周或每两周一次的团队进度报告。
3.管理关系
在外部,首席数据科学家是客户就任何特别问题或项目的第一联系人。在内部,他们设定项目团队的文化、方向和工作风格。
4.工作规划和授权
首席数据科学家能够将他们的项目划分为由高级数据科学家领导的工作流,并高效地委派任务。为了确保项目得到很好的执行,并根据时间表完成交付成果,这意味着分配合适的人员来完成合适的任务,同时也为人们提供发展和培养自身技能的机会。
首席数据科学家
成为首席数据科学家后,人们通常会走两条路:进入管理层,成为高管,或者成为技术主题专家。正如本文开头所提到的,我们将关注后者,并讨论首席数据科学家的角色。
与高管不同,首席数据科学家并不负责撰写推介书,也不负责为企业赢得新客户。相反,他们是公司内部所有需要技术建议或支持的项目的顾问。
1.解决问题
尽管首席数据科学家没有正式参与特定项目,但他们仍然负责质量控制,并确保所有项目都执行最佳实践流程。
当不协助项目团队时,首席数据科学家研究市场领先的创新技术和算法。此外,他们还参与公司内部的学习和发展计划,例如设计研讨会和培训材料,介绍或教授人们如何使用特定的技术或工具。
2.沟通
首席数据科学家能够快速跟上项目进度,并与首席数据科学家讨论其项目的具体需求,随后提出解决方案以及各自的权衡,如可扩展性、商业影响等。
3.管理关系
首席数据科学家与其他首席数据科学家保持密切关系,以便在需要时为他们提供及时的帮助。在极少数情况下,当首席数据科学家不在或存在资源缺口时,他们有时也会介入领导项目。
4.工作规划和授权
虽然没有委托任务,但首席数据科学家需要高效地计划他们的一天,以会见寻求帮助的项目负责人。
虽然不同公司的职称和工作范围可能不同,但我希望您能从这篇博客文章中获得一些关于数据科学家职业发展的见解。
如果你从这篇文章中发现了任何价值,并且还不是一个媒体会员,如果你使用下面的链接注册会员,这对我和这个*台上的其他作者来说意义重大。它鼓励我们继续推出像这样的高质量和信息丰富的内容——提前感谢您!
https://chongjason.medium.com/membership
不知道接下来要读什么?这里有一些建议。
你最喜欢的电影是什么样子的?
原文:https://towardsdatascience.com/what-does-your-favorite-movie-look-like-8c7b4a13ee94
如何将任何视频转换成反映其配色方案的图像
你最喜欢的电影是什么样子的?作者图片
你有没有想过你最喜欢的电影是什么样子的?嗯,你肯定知道它看起来像什么,因为你很可能不止一次地看过它,但是它在静态下看起来如何,或者它如何使用单一图像可视化?
怪物史莱克 2 电影的配色方案。作者图片
我提出了一种使用机器学习算法来创建反映任何视频配色方案的图像的方法。这不仅是一个有趣的项目,也是给你热爱电影的朋友和熟人的无尽的礼物创意来源:首先,它是非常个人和独特的,其次,它是高度可定制的,因为你可以使用这个图像作为任何你可以订购打印的东西的打印:帽子、t 恤、毛巾、帆布等。等。
如何阅读这篇文章
为了方便起见,让我简要描述一下本文的所有主要部分,以便您知道从哪里开始,并在将来成功地导航:
- 在问题陈述部分,我会告诉你我要用这个项目解决什么问题;
- 在算法和实现细节部分,我将告诉你我是如何使用 Python 实现这个项目的,以及它的库: moviepy 和 scikit-learn 。如果你不熟悉 Python 或一般的编程,不要害怕跳过这一节,因为使用项目代码不需要你具备任何特定的知识;
- 在用户指南部分,你会找到最终程序的用户指南和带源代码的 GitLab 库的链接;
- 在图库部分,您可以看到程序根据不同电影生成的结果图像。开始时看一下这里,看看这个程序能够做什么;
- 在结果和结论部分,我总结了已完成的工作,并分享了我对可能改进的想法。
现在,当你知道以什么顺序阅读这篇文章时,让我们开始吧!
问题陈述
我想写一个程序,将一些视频文件作为输入,输出一个图像,反映给定视频的配色方案。结果图像的一些特征也由附加参数设置。
要查看程序能够生成的示例图像,请参见图库部分。
算法和实现细节
让我们将初始问题分解成子问题,并一步一步地回顾算法:
- 首先,我们需要将提议的视频转换成图像列表;
- 对于给定列表中的每张图片,我们需要通过分析图片提取最流行的颜色;
- 最后,有了颜色列表,我们需要合成最终的图像。
让我们更详细地讨论这些步骤,并查看执行它们的代码。请注意gists 中的代码不要直接使用,这里只是给大家一个大概的概念。我试图保持它尽可能简单,同时存储库中的结果代码在某种程度上被优化并包装在类中。
1.将视频转换为图像列表
首先,我们需要将给定的视频转换成一组图像,以便将来进行分析。有了电影库就很容易了。
首先,我们读取 moviepy 对象中的视频。使用duration
属性获取以秒为单位的视频持续时间,并设置step
变量以确定我们希望提取视频帧的频率,我们使用 for 循环获取当前时间戳中的图像(使用 get_frame 函数)并将其添加到结果列表中。
start
变量需要一点偏移,因为所有的视频在第 0 秒开始黑屏。
2.分析图像颜色
当我们将一个视频“切片”成一系列图像时,我们需要分析其中哪些颜色是最流行的。让我简单地告诉你我们将如何做。
总体思路是对图像使用聚类算法。聚类是将相似的数据点分组到组(或聚类)中的任务。在我们的例子中,数据点是图像的像素,特征是三个 RGB 颜色值。
在聚类算法为我们计算了聚类之后(这意味着它分析了所有图像像素并基于一种颜色创建了前 k 个像素组,其中 k 是聚类的数量),我们可以使用这些聚类代表来获得最流行的颜色。最简单的方法是应用基于质心概念的聚类算法。聚类中的质心只是一个聚类的几何中心(可以解释为给定组中最常见的元素)。有几种基于质心的聚类算法;我选了 K-Means (也可以是 MeanShift 、 亲和传播 等。):它迭代地更新聚类质心,直到收敛。
K-均值算法的收敛性。公共领域
了解更多关于集群的资源
如果您想了解关于如何使用聚类从图像中提取颜色的更多详细信息,可以查看以下文章:
如果您想从总体上了解更多关于聚类算法的知识,请查看我的聚类备忘单文章,它将为您提供关于聚类算法动物园和聚类分析的总体情况:
回到实践中
但是让我们继续练习吧。让我们以下图为例进行颜色分析:
凯文·施密德在 Unsplash 上的照片
使用不同的 k 值通过聚类算法运行此图像,您将获得以下输出:
上图中 3、5、10 和 20 种最受欢迎的颜色。作者图片
正如你所看到的,使用太少的颜色不能反映真实的画面,使用太多的颜色会使结果变得嘈杂。在我的实验中,我设置了 5 种颜色。
让我们看看代码并讨论实现细节。
我们首先对给定的图像进行预处理:将其调整为较小的尺寸,以使算法运行得更快,并根据 scikit-learn 对象的期望将其重新整形为 2D 数组。然后,我们训练一个聚类算法,获得聚类质心的坐标,并根据流行度对结果颜色进行排序,将它们从 RGB 转换为十六进制以便于可视化。
如果你想更好地理解代码和每个变量的类型和形状,请看看这个交互式 Jupyter 笔记本,里面有演示代码和更详细的注释。
3.合成生成的图像
现在问题仍然很小:有了一组颜色,我们只需要合成最终的图像。
要做到这一点,我们需要一些简单的坐标计算,我已经在下面可视化了。
坐标计算的可视化。作者图片
我们知道,在 matplotlib 约定中,图像左下角点的坐标为 (0,0) ,右上角点的坐标为 (w,h) (如果图像的宽度等于 w ,高度等于 h )。
我们需要依次画出 n 个矩形,每次稍微向右移动。我将使用的 Matplotlib Rectangle 类使用三个参数绘制一个矩形:左下角的坐标、宽度和高度。
每个矩形的宽度和高度是相同的:高度等于图像的高度,宽度是图像的宽度除以矩形的数量。左下点的坐标等于索引 i 与图像宽度除以矩形数量的乘积。通过将 i = 0,1,2 代入上述公式来确保这一点。
请注意,图像宽度和高度是以英寸为单位设置的,而不是以像素为单位。请参考带有演示代码的同一个 Jupyter 笔记本进行交互可视化。
为了简单起见,在上面的例子中,我明确指定了一个颜色列表。事实上,对于每张图片,我都保存了所有的前 k 种颜色。有了这些信息,您可以根据分析结果创建不同的颜色选择方法。
我已经实现了由mode
参数选择的两个选项。如果mode="popular"
,我们就选择最流行的颜色。但是如果mode="sample"
,我们根据给定的分布采样颜色。因此,即使对于同一视频,您也可以获得不同的结果,使图像更加多样化。
使用蝙蝠侠预告片中的一帧解释模式参数。作者图片
用户指南
让我们来谈谈如何使用这个程序。您可以在下面的资源库中找到代码:
https://gitlab.com/Winston-90/movie_color_scheme
在设置好环境并安装了所需的库之后,就可以像我们通常在 Python 脚本中所做的那样,通过设置参数来使用程序:python main.py --parameter1 value --parameter2 value
。让我们回顾一下程序参数。
程序参数列表
必需的参数:
video_path
:要处理的视频文件的路径;result_path
:保存结果图像的路径(包括。png);width
:结果图像的宽度,英寸。默认值:25;height
:生成图像的高度,英寸。默认值:5。
不太重要的参数(您可以只使用默认值):
mode
:选择颜色的模式。如果是‘流行的’——返回最流行的颜色,否则根据分布抽样颜色。默认值:“样本”;start
:开始视频处理的时间(秒)。默认值:1;step
:以秒为单位步进。默认值:1;number_of_colors
:从每幅图像中提取的颜色数(聚类数)。默认值:5;compress_to
:预处理过程中调整图像大小的像素数。默认值:200;verbose
:如果为真,显示结果图像。默认值:Falsedelete_after
:如果为真,处理后删除临时文件。默认值:False。
保存中间结果
我还需要提到一个可以节省您时间的实现细节。由于分析阶段需要很长时间,拒绝保存中间结果将不是一个好的解决方案。
因此,我保存了图像数组和颜色数组,以便您稍后可以重现实验。例如,如果您设置了mode="sample"
,但没有发现结果图像非常吸引人,您可以只运行最后一个阶段,提供保存的颜色数组文件的路径(注释掉 main.py ) 中相应的代码行),而不需要从头开始运行整个分析。
对于videoname.mp4,这些文件将被命名为 videoname_images.pkl 和 videoname_colors.pkl 并保存在tmp
文件夹中。
走廊
在这个部分中,您可以找到基于不同电影的程序输出。所有提供的高分辨率图像你也可以在回购中找到。
让我先分析一下我在文章开头给你看的《怪物史莱克 2》的配色方案,以基本证明这种方法是可行的,并且能够引起真正的电影爱好者的兴趣。让我们放大来回顾前 10 分钟:
《怪物史莱克 2》前 10 分钟色彩分析。图片作者。
这里的步长参数等于它的默认值 1,所以上图中的每个小矩形都是视频中的一秒。
漫画以梦工厂的开场主题开始,一个孩子坐在月亮上扔鱼竿。这是发生在浅蓝色 背景中的。黑色背景上的白色小标题写着梦工厂的礼物……然后就出现了。
接下来是一个带有故事书的小故事和白马王子据称拯救了菲奥娜的时刻,之后是一个关于菲奥娜和史莱克的电影的真正的屏幕保护程序,顺便提一下,这里有许多关于各种文化作品的参考资料。之后,叙述实际上开始于沼泽,以适当的色调。
我们继续看指环王。第二部电影的色彩设计和第三部电影明亮的结尾吸引了我的眼球。
指环王-指环联盟。作者图片
指环王-双塔。作者图片
指环王-王者归来。作者图片
我也分析了所有的哈利波特电影。第三部电影的标题在这里最引人注目——它们很轻(以掠夺者地图为背景)。在最后一部电影中,哈利和邓布利多谈话的那个精彩瞬间也历历在目。
哈利波特与魔法石。作者图片
哈利波特与密室。作者图片
哈利波特与阿兹卡班的囚徒。作者图片
哈利波特与火焰杯。作者图片
哈利波特与凤凰社。作者图片
哈利波特与混血王子。作者图片
哈利·波特与死亡圣器(上)。作者图片
哈利·波特与死亡圣器第二部。作者图片
只要有一点想象力,你就可以根据这些图像创作出迷人的艺术作品。我不太擅长这个,但让我告诉你一个大概的想法。
由此可知:
搏击俱乐部,1999 年。作者图片
对此:
搏击俱乐部艺术图片:公共领域和照片由 NEOSiAM 2021
结果和结论
最后,让我稍微讨论一下所做的工作。
支持的视频格式
这个程序使用 moviepy 库进行视频处理,所以支持 FFmpeg 支持的各种视频格式,像. mp4,.mpeg,。avi,。mov,。mkv 等。参见此处的完整列表(多路复用器部分)。
有时我会遇到 moviepy 视频读取错误,将视频文件从一种格式转换为另一种格式通常会有所帮助。我用了一个免费的 VLC 视频播放器。
执行时间
正如我们上面讨论的,该程序包括三个主要阶段——从视频中提取图像,分析它们,并编辑最终图像。
第一个和最后一个阶段进行得相当快。图像的编辑几乎在瞬间发生,而视频到图像的转换通常不超过两分钟。
但是图像分析需要很多时间,通常情况下,它是大约与视频的持续时间相同(对于 1 秒的步骤)。要缩短这一时间,您可以:
- 将
step
参数设置为较大的值(例如 2 或 3)。这将允许您在最终图像中使用较少的矩形获得不太精确的可视化效果,但会显著提高执行速度。 - 将
number_of_colors
或compress_to
参数设置为较小的值,尽管这样会产生较差的结果,不推荐使用。
由于这个项目是业余的,只是为了兴趣和乐趣,它有许多缺点和未来工作的巨大领域。例如,聚类算法的优化实现和 GPU 的使用可以大大减少运行时间。
结论
很久以前,我就有了这个项目的想法。很久都没找到时间实现,后来开始写代码,遇到错误和未知。当代码准备好的时候,我花了20 多个小时来处理你在上面看到的流行电影。最后,我整理了一下思路,把它们转移到这篇文章上。
虽然实现并非没有缺点(它可以工作得更快,并且我没有删除黑条,这在黑暗电影中可能是一个问题),但我对结果非常满意。设定目标,并面临挫折,但最终实现你想要的是一个人能经历的最好的感觉之一。
感谢您的阅读!
- 我希望这些材料对你有用。在 Medium 上关注我,获取更多类似的文章。
- 如果您有任何问题或意见,我将很高兴得到任何反馈。在评论中问我,或者通过 LinkedIn 或 Twitter 联系我。
- 为了支持我作为一名作家,并获得数以千计的其他媒体文章,使用我的推荐链接获得媒体会员资格(不收取额外费用)。
当我们微调伯特时,到底会发生什么?
原文:https://towardsdatascience.com/what-exactly-happens-when-we-fine-tune-bert-f5dc32885d76
对最*的一些 BERTology 研究的进一步观察
预训练/微调方法的说明。3 个不同的下游 NLP 任务,MNLI、NER 和 SQuAD,都是通过对特定任务进行微调,用相同的预训练语言模型来解决的。图片鸣谢:德夫林等人 2019。
谷歌的 BERT 是自然语言建模中的一个范式转变,特别是因为引入了预训练/微调范式:在以无监督的方式对大量文本数据进行预训练后,模型可以用相对较少的标签对特定的下游任务进行快速微调,因为一般的语言模式已经在预训练期间学习过了。
作者 Jacob Devlin 等人写道,微调 BERT 是“直截了当的”,只需在最终 BERT 层之后添加一个附加层,并在几个时期内训练整个网络。作者在标准的 NLP 基准问题 GLUE、SQuAD 和 SWAG 上展示了强大的性能,这些问题在使用 ADAM optimizer 进行了 2-3 个时期的微调之后,探索了自然语言推理的不同方面,学习率在 1e-5 到 5e-5 之间,这是一种在研究社区中普遍采用的方法。
由于其显著的成功,这种预训练/微调范例已经成为该领域的标准做法。然而,从科学的角度来看,我们实际上并没有很好地理解微调过程。微调过程中哪些图层会发生变化?我们需要微调吗?结果有多稳定?让我们深入一些在最初的伯特论文之后的最*的“伯特学”研究。
微调过程中哪些图层会发生变化?
冻结前 8 层 BERT 对 MNLI 和 SQuAD 上的微调性能影响不大。图片来源:Merchant et al 2020。
BERT 背后的直觉是,早期层学习与下游任务几乎没有关联的通用语言模式,而后期层学习特定于任务的模式。这种直觉符合深度计算机视觉模型,早期层学习边缘和拐角等通用特征,后期层学习特定特征,如面部检测情况下的眼睛和鼻子。
这种直觉已经被另一个谷歌团队 Amil Merchant 等人在他们的作品“中实验性地证实了,在微调过程中 BERT 嵌入发生了什么?“他们的技术之一被称为部分冻结:他们在微调过程中保持早期 BERT 层冻结,即固定,并测量当改变冻结层的数量时,下游任务的性能会改变多少。它们表明,即使冻结 12 个 BERT 层中的前 8 个(即仅调整后 4 个),MNLI 和小队任务的性能也不会显著下降。
这一发现证实了这样的直觉,即最后一层是最特定于任务的,因此在微调过程中变化最大,而早期层保持相对稳定。该结果还意味着,实践者可以通过冻结早期层而不是在微调期间训练整个网络来潜在地节省计算资源。
我们需要微调吗?
基于特征的方法的性能接*于在 CoNLL-2003 上的微调模型。图片鸣谢:德夫林等人 2019。
除了微调,我们是否可以简单地将预训练的 BERT 模型中的嵌入内容作为下游模型中的特征?毕竟,微调在计算上仍然很昂贵,因为 BERT 模型中有大量的自由参数,在 BERT-base 的情况下有 110 万个,在 BERT-large 的情况下有 340 万个。此外,在具有大量下游任务的应用中,共享一组可以在下游进行调整的公共权重会更经济。
Devlin 等人将这种方法称为“基于特征的方法”,他们发现,实际上,它可以执行接*微调的模型。特别地,在最终分类层之前,他们将预训练的 BERT 嵌入馈送到随机初始化的 2 层 BiLSTM 网络中,并在 CoNLL-2003 命名实体识别基准问题集上测量性能。有趣的是,他们发现使用倒数第二个隐藏的 BERT 层比最终层效果更好,这表明最终层因此过于接*预训练任务,因此来自早期层的嵌入更有用。事实上,作者报告了使用所有最后 4 个隐藏层作为特征时的最佳结果:F1 得分为 96.1%,仅比微调的 BERT 模型低 0.3%。
研究员马修·彼得斯等人在《调还是不调?使预先训练的表征适应不同的任务,得出类似的结论。他们考虑了 5 种不同的 NLP 任务,并将标准微调方法与基于特征的方法进行了比较,其中他们使用所有 12 个 BERT 层作为下游神经网络模型中的特征。他们发现,对于围绕命名实体识别、情感分析和自然语言推理的任务,基于特征的方法与微调模型的性能接*(精度在 1%以内)。语义文本相似性任务是一个例外,在这个任务中,微调比基于特征的方法要好得多(2–7%)。
微调稳定吗?
按照 Devlin 等人(最左边的点)和 Mosbach 等人(最右边的点)的微调方法,对 25 个随机种子的模型性能进行了微调。莫斯巴赫的方法始终能产生更稳定的结果。图片鸣谢:莫斯巴赫等人 2021。
BERT 的问题之一是所谓的微调不稳定性现象:研究人员观察到,用不同的随机种子开始微调训练工作会导致非常不同的结果,其中一些可能很差。为了解释这种不稳定性,一些从业者建议使用不同的种子运行许多微调作业,并在拒绝集合中挑选最好的一个,但这种做法可能会导致拒绝集合中的过度拟合。
为什么微调 BERT 这么脆?这个问题已经由两个小组研究过,马里乌斯·莫斯巴赫和他的合作者,在他们的工作“关于微调 BERT 的稳定性”,和张天翼等人在“重温少样本 BERT 微调”中,都得出了相似的结论。
首先,有优化器的问题。最初的 ADAM 优化器包括一个“偏差校正项”,该项隐含地添加了一个预热机制,有效地降低了训练过程开始时的学习率。然而,在 BERT 的张量流实现中,作者排除了这一项。Mosbach 等人和 Zhang 等人都表明,这解释了微调不稳定性的一部分:在重新添加偏差校正项后,微调结果更加稳定,这可能是因为该项添加了隐式预热阶段。
第二,是训练时期的数量。Mosbach 等人和 Zhang 等人都表明,当训练超过“标准”3 个时期时,微调不稳定性就会消失,如 Devlin 等人的论文中所做的那样。莫斯巴赫等人甚至推荐对 20 个时期进行微调。直觉上,这个结果是有意义的:即使我们选择了最差的种子,我们也应该能够收敛到与最佳种子相同的全球潜在最小值,只是需要更长的时间。
结论
让我们用 3 个要点总结一下这些经验:
- 伯特的层次是分等级的。早期的 BERT 层学习更多的通用语言模式,相当于深度视觉模型中的棱角,而后期的 BERT 层学习更多的任务特定模式。
- 微调并不总是必要的。相反,基于特征的方法是一种可行且廉价的替代方案,我们只需提取预先训练的 BERT 嵌入作为特征。然而,重要的是不要只使用最后一层,至少要使用最后 4 层,或者全部。
- 当遵循 Devlin 等人的方法时,微调是脆弱的这种微调不稳定性已被证明在训练大量时期时消失,并且当使用原始 ADAM 优化器而不是 Devlin 等人使用的修改版本时消失。
优秀的数据产品经理做什么——为什么你可能需要一个
意见,数据团队
打开现代数据团队中最新的数据角色:数据产品经理
本文与 阿图古普特 合著。
我们与之交谈的公司都在努力构建他们的数据产品或*台。这包括迁移到雪花,与数据块集成,向数据网格移动,或者通常投资于他们的数据堆栈。
我们越来越多地看到数据部门将他们的团队结构现代化,由数据产品经理来负责这些项目。
这些数据产品经理负责识别内部用户数据体验中的差距,并通过与数据和分析团队合作来弥补这些差距。它们推动项目的优先顺序和总体愿景,以发展组织有效运营数据的内部能力。
Tableau 的首席数据官温迪·特纳-威廉姆斯(T21)认为这是一个非常重要的角色。好的产品需要好的产品经理。
“从我的角度来看,数据产品经理实际上是我最想聘用的角色之一。我喜欢他们真正创造愿景,然后推动工程师实现这一愿景,”温迪在最*的一次谈话中说。“对我来说,这是一个重要的组成部分,因为我倾向于关注能够创造故事、与我们的内部客户甚至我们的产品团队互动的数据产品经理。”
在本文中,我们将介绍:
- 什么是数据产品
- 数据产品经理是做什么的?他们需要什么技能?
- 产品经理需要什么背景?他们向谁报告?
- 数据产品经理与产品经理
- 数据产品经理与数据科学家
- 数据产品经理的未来
什么是数据产品经理?角色是如何演变的?
21 世纪初,LinkedIn、网飞和优步等公司遇到了问题。整个组织的团队都在大规模地处理数据,而且是大量的数据。
数据为他们的产品路线图提供动力,推动管理层决策,并为他们的付费营销活动提供信息。
内部和外部数据在公司内外流动。对于如何使用这些数据以及由谁使用这些数据,有一些法规、指导方针和限制。但没有人负责开发数据解决方案,以使分析具有可操作性、可扩展性和可访问性。
因此,创建了产品数据经理这一角色来回答以下问题:
- 存在哪些数据?
- 谁需要这些数据?
- 这些数据从哪里流入/流出?
- 这些数据有什么用?
- 有没有一种方法可以更容易地处理/访问这些数据?
- 这些数据是否合规和/或可操作?
- 我们如何更快地让数据对公司更多的人有用?
什么是数据产品?
当然,没有一个数据产品——或者几个数据产品——就不可能有一个数据产品经理。
但是定义一个数据产品却异常困难。事实是,许多东西都可以被视为数据产品,从 Looker 仪表板或 Tableau 报告,到 A/B 测试*台,甚至是多层数据*台。
Yelp 的数据实验负责人 Eric Weber 建议“以一种通用的方式谈论数据产品可以产生通用的结果。数据产品是一个有用的想法,但要让它真正创造价值,我们必须深入细节……”
所以说具体点。不管该产品可视化/处理/投入工作的数据是什么,它都应该提供特定的结果:
- 提高数据可访问性(当人们需要时,在他们需要的地方提供表面数据)
- 增加数据民主化(使人们更容易操纵数据)
- 更快的数据投资回报(更快的洞察力)
- 为数据团队/数据消费者节省时间
- 更精确的见解(即实验*台)
同样,数据产品应该具有一些重要的特征或品质。
- 可靠性和可观察性。SaaS 产品的可接受停机时间是关于“多少个 9”的讨论 99.9%或 99.999%的可用性。正如软件工程师使用 Datadog 或 New Relic 等产品来跟踪 SaaS 产品性能一样,数据产品经理需要解决方案来*乎实时地识别和解决数据产品性能问题 s 。
- 可扩展性。数据产品应该随着组织和需求的增长而扩展弹性。
- 延展性。虽然数据产品可能是通过集成不同的解决方案构建的,但它需要保持与 API 轻松集成的能力,并且足够灵活,能够以最终用户喜欢的所有不同方式使用数据。
- 可用性。伟大的 SaaS 产品专注于提供伟大的用户体验。它们很容易学习,使用起来很有趣,完成工作也很快。
- 安全与合规。数据泄露代价高昂,令人痛苦,监管罚款也是如此。
- 发布规程和路线图。SaaS 产品不断发展和改进。路线图是在未来至少一年内制定的,并有强大的质量保证流程进行更新。
数据产品经理是做什么的?他们需要什么技能?
数据产品经理负责数据民主化和加快数据本身的价值实现。他们设计、构建和管理数据*台或一套特定数据工具的跨职能开发,以服务于多个客户。
例如,Atul 为优步的数据分析、数据知识和数据科学*台定义了产品战略和方向。在任职期间,他领导了一个项目来改进组织的数据科学工作台,数据科学家利用该工作台来简化协作。
数据科学家目前正在自动验证和核实申请加入优步*台时所需的工人文档。对于机器和深度学习来说,这是一个伟大的项目,但问题是数据科学家通常会达到可用计算的极限。
传统的工程项目负责人可能试图添加更多的虚拟机或延长项目时间表,而 Atul 研究了多种解决方案,并确定虚拟 GPU(当时是一种新兴技术)为一种可能的解决方案。
虽然价格不菲,但 Atul 的领导证明了支出的合理性。该项目不仅为公司节省了数百万美元,还支持了一项关键的竞争优势。
这种积极主动的方法让优步开始构建他们需要的基础,以便在 GPU 可用时立即加以利用。价值实现时间大大加快,这是优秀数据产品经理的标志。
数据产品经理需要什么背景?他们向谁报告?
虽然您不需要编写代码,但如果没有经过技术培训,这是一项很难完成的工作。这是一个需要理解复杂系统并与非常专业的同事一起工作的角色。
如果候选人有与客户交谈的经验,也会有所帮助。这可能表明他们擅长翻译需求和向不同的受众讲述故事。
常见的数据产品经理背景包括:
- 后端工程(想要设定愿景的经理或优秀工程师)
- 传统 B2B 产品管理
- 内部工具产品管理
- 数据分析师
一个数据产品经理挣多少钱?根据 Glassdoor 的数据,数据产品经理的*均工资为 112,704 美元。
一些数据产品经理依赖于数据分析师和数据科学家。其他人与运营团队、软件工程师一起工作,或者在更大的公司里,与行政人员一起工作。
无论报告的结构如何,数据产品经理使数据消费者更容易理解和民主化,而不是数据本身,而是从数据中收集的见解。
数据产品经理与产品经理
处理数据涉及到大多数产品管理形式所特有的技能。
在为公司构建数据*台时,您必须考虑各种数据角色:工程师、数据科学家、产品经理、业务功能用户和总经理。(图片由 Atul Gupte 提供)
您不是与传统客户合作,而是与数据消费者合作。这些员工使用的产品能够理解您公司的数据,无论是内部产生的、第三方的还是其他的。
换句话说,数据产品经理是一个产品经理角色,专门负责构建内部数据工具或服务于内部数据消费者的数据产品。
数据产品经理与数据科学家
这两种角色的主要区别在于,数据科学家试图在现有产品或解决方案中收集见解。例如,“为什么用户不注册?”
另一方面,数据产品经理致力于通过发现“数据的最佳结果是什么,以及我们如何实现这一结果”来增强工程师、业务利益相关者和执行领导的能力
例如,优步在用户每次出行时都会收集数据。数据科学家将能够帮助预测用户可能抱怨或跳转到另一个拼车应用程序的价格点,以及价格如此之高的原因。
数据项目经理将关注数据还可以做什么,它可以与什么其他数据结合,如何确保数据是可靠的,机器学习模型是否足够,等等。
数据产品经理的未来
数据团队正变得越来越分散和分散,从数据治理经理到分析工程师,出现了更多的角色。
与此同时,数据生产者和数据使用者之间的距离越来越大,需求呈指数增长。这在一定程度上是因为组织的所有部门越来越依赖数据。
数据产品经理的未来将非常类似于传统的产品经理:一个跨越孤岛并激励团队和谐相处的指挥。
他们将是数据团队成员、数据消费者和产品构建者之间的关键连接点。它们将弥合数据产品和数据即服务之间的鸿沟。他们将确定用户的需求,监控开发,传播愿景,协调利益相关者,并对项目进行优先排序。
因此,组织将从应对数据火灾的被动姿态转变为构建内部数据能力作为竞争优势的主动姿态。
进步的数据产品经理将严格检查好的数据产品的质量,并设定他们自己的衡量标准(我们对停机时间和数据质量有一些建议)。
将调查数据产品用户满意度,测量停机时间,并记录发布流程。这一切都将与商业价值联系起来,并在整个公司传播。
这对任何数据专业人员来说都是一个激动人心的未来。
您是否正在为您的组织开发和管理数据产品? 伸手到蒙特卡洛 。
导入 Python 模块会发生什么?
原文:https://towardsdatascience.com/what-happens-when-you-import-a-python-module-ad6c0efd2640
深入研究进口系统
可用性是衡量代码质量的关键指标之一。它是指代码可以在不同的程序中以最小的改动使用的程度。在 Python 中,我们使用import
从模块中导入代码。但是你有没有好奇过import
是如何在幕后实现的?在本文中,我们将深入探讨 Python 的导入系统。我们还会讨论一个有趣的问题:循环导入。喝杯茶,让我们直接进入正题。
模块 v.s .包
Python 被组织成模块和包。模块是一个 Python 文件,包是模块的集合。考虑以下导入模块的示例:
import random
random.randint(1,10)
[random](https://docs.python.org/3/library/random.html)
是 Python 内置的模块。在第一行中,它导入random
模块并使其可用,然后它访问randint()
。如果您打开一个 IDE 并调试导入,您将看到代码位于random.py
文件中。
也可以这样导入randint
:
from random import randint
randint(1,10)
让我们来看一个包中的例子:
import pandas
pandas.DataFrame()
乍一看,你真的分辨不出它是模块还是包。但是如果您调试导入,它会将您重定向到[pandas](https://github.com/pandas-dev/pandas/tree/main/pandas).__init__.py
而不是pandas.py
。一个包包含子模块或递归子包,而__init__.py
是包的入口点。
但不是唯一的方法,像importlib.import_module()
和内置__import__()
这样的函数也可以使用。
>>> import importlib
>>> importlib.import_module('random')
<module 'random' from '/Users/xiaoxu/.pyenv/versions/3.9.0/lib/python3.9/random.py'>>>> __import__('random')
<module 'random' from '/Users/xiaoxu/.pyenv/versions/3.9.0/lib/python3.9/random.py'>
包裹。init。巴拉圭
那么什么是__init__.py
?
一个常规 Python 包包含一个
__init__.py
文件。当包被导入时,这个__init__.py
文件被隐式执行,它定义的对象被绑定到包的名称空间中的名称。该文件可以留空。
让我们看一个例子。我有一个这样的文件夹结构。p1
是我的包,m1
是子模块。
文件夹结构(由高创建)
在m1.py
中,我有一个变量DATE
,我想在main.py
中使用它。我将创建几个版本的__init__.py
,看看它如何影响main.py
中的导入。
# m1.py
DATE = "2022-01-01"
案例 1:清空 **__init__.py**
文件。
由于导入p1
时__init__.py
文件为空,所以没有导入子模块,所以不知道m1
的存在。如果我们使用from p1 import m1
显式导入m1
,那么m1.py
中的所有内容都将被导入。但是,我们实际上不是导入一个包,而是导入一个模块。可以想象,如果您的包有很多子模块,您需要显式地导入每个模块,这可能会非常繁琐。
# main.py
import p1
p1.m1.DATE>> AttributeError: module 'p1' has no attribute 'm1'from p1 import m1
from p1 import m2, m3 ...# needs to explictly import every submodulem1.DATEWorks!!
情况 2:导入 **__init__.py**
文件中的子模块
我们从__init__.py
文件中的m1
导入所有内容,而不是将其留空。然后,main.py
文件中的import p1
会识别m1.py
中的变量,你可以直接调用p1.DATE
而不知道它来自哪个模块。
# __init__.py
from .m1 import * # or from p1.m1 import *
from .m2 import * # main.py
import p1
p1.DATE
你可能已经注意到了m1
前面的点。这是一个告诉它在当前包中搜索的快捷方式。这是一个相对进口的例子。一个等价的绝对导入将像from p1.m1 import *
一样显式地命名当前包。
不过有一个警告。如果包中的另一个子模块包含相同的变量,后面导入的子模块将覆盖前面的子模块。
拥有一个非空的__init__.py
的好处是当客户端导入包时,所有的子模块都已经可用,所以客户端代码看起来更整洁。
Python 如何找到模块和包?
在 Python 中查找模块和包的系统被称为导入机制,它由查找器、加载器、缓存和编排器组成。
进口机械(由高创造)
- 搜索模块中缓存的
**sys.modules**
每次导入模块,首先搜索的是sys.modules
字典。键是模块名,值是实际的模块本身。sys.modules
是一个缓存的字典,如果模块在那里,那么它将被立即返回,否则,它将在系统中被搜索。
回到前面的例子。当我们导入p1
时,两个条目被添加到sys.modules
。顶层模块__init__.py
和子模块m1.py
。
import p1
import sys
print(sys.modules){
'p1': <module 'p1' from '/xiaoxu/sandbox/p1/__init__.py'>,
'p1.m1': <module 'p1.m1' from '/xiaoxu/sandbox/p1/m1.py'>
...
}
如果我们导入它两次,第二次导入将从缓存中读取。但是如果我们故意从sys.modules
字典中删除条目,那么第二次导入将返回一个新的模块对象。
# read from cache
import p1
import sys
old = p1
import p1
new = p1
assert old is new# read from system
import p1
import sys
old = p1
del sys.modules['p1']
import p1
new = p1
assert not old is new
2。搜索模块规格
如果模块不在sys.modules
字典中,那么它需要被一列元路径查找器对象搜索,这些对象有它们的find_spec()
方法,以查看模块是否可以被导入。
import sys
print(sys.meta_path)
[ <class '_frozen_importlib.BuiltinImporter'>,
<class '_frozen_importlib.FrozenImporter'>,
<class '_frozen_importlib_external.PathFinder'>]
BuiltinImporter
用于内置模块。FronzenImporter
用于定位冻结的模块。PathFinder
负责查找位于这些路径之一的模块。
sys.path
sys.path_hooks
sys.path_importer_cache
__path__
让我们看看sys.path
里有什么。
import sys
print(sys.path)
[ '/xiaoxu/sandbox',
'/xiaoxu/.pyenv/versions/3.9.0/lib/python39.zip',
'/xiaoxu/.pyenv/versions/3.9.0/lib/python3.9',
'/xiaoxu/.pyenv/versions/3.9.0/lib/python3.9/lib-dynload',
'/xiaoxu/.local/lib/python3.9/site-packages',
'/xiaoxu/.pyenv/versions/3.9.0/lib/python3.9/site-packages']
PathFinder
将使用find_spec
方法寻找模块的__spec__
。每个模块都有一个规范对象,它是模块的元数据。其中一个属性是loader
。loader
指示输入机械在创建模块时使用哪个加载器。
import p1
print(p1.__spec__)ModuleSpec(name='p1', loader=<_frozen_importlib_external.SourceFileLoader object at 0x1018b6ac0>, origin='/xiaoxu/sandbox/p1/__init__.py', submodule_search_locations=['/xiaoxu/sandbox/p1'])
3。加载模块
一旦找到模块规范,导入机器将使用 loader 属性初始化模块,并将其存储在sys.modules
字典中。您可以阅读这个伪代码来理解在导入的加载部分发生了什么。
Python 循环导入
最后我们来看一个进口的有趣问题:循环进口。当两个或多个模块相互依赖时,就会发生循环导入。在这个例子中,m2.py
依赖于m1.py
,而m1.py
依赖于m2.py
。
模块依赖(由高创建)
# m1.py
import m2
m2.do_m2()def do_m1():
print("m1")# m2.py
import m1
m1.do_m1()def do_m2():
print("m2")# main.py
import m1
m1.do_m1()AttributeError: partially initialized module 'm1' has no attribute 'do_m1' (most likely due to a circular import)
Python 无法从模块m1
中找到属性do_m1
。那么为什么会出现这种情况呢?该图说明了这一过程。当import m1
时,Python 逐行遍历m1.py
。它找到的第一个东西是import m2
,所以它去导入m2.py
。第一行是导入m1
,但是因为 Python 还没有遍历m1.py
中的所有内容,所以我们得到了一个半初始化的对象。当我们调用哪个 python 没有看到的m1.do_m1()
时,会引发 AttributeError 异常。
循环进口(由高创造)
那么如何修复循环导入呢?一般来说,循环导入是糟糕设计的结果。大多数时候,这种依赖关系实际上并不是必需的。一个简单的解决方案是将两种功能合并到一个模块中。
# m.py
def do_m1():
print("m1")
def do_m2():
print("m2")# main.py
import m
m.do_m1()
m.do_m2()
有时,合并的模块会变得非常大。另一个解决方案是推迟m2
的导入,以便在需要时导入。这可以通过将import m2
置于功能def do_m1()
中来实现。在这种情况下,Python 会加载m1.py
中的所有函数,然后只在需要的时候加载m2.py
。
# m1.py
def do_m1():
import m2
m2.do_m2()
print("m1")def do_m1_2():
print("m1_2")# m2.py
import m1def do_m2():
m1.do_m1_2()
print("m2")# main.py
import m1
m1.do_m1()
许多代码库使用延迟导入不一定是为了解决循环依赖,而是为了加快启动时间。来自 Airflow 的一个例子是不要编写构建 Dag 所不需要的顶级代码。这是因为顶级代码解析速度对 Airflow 的性能和可伸缩性都有影响。
# example from Airflow doc**from** **airflow** **import** DAG
**from** **airflow.operators.python** **import** PythonOperator
**with** DAG(
dag_id="example_python_operator",
schedule_interval=**None**,
start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
catchup=**False**,
tags=["example"],
) **as** dag:
**def** print_array():
**import** **numpy** **as** **np**
*# <- THIS IS HOW NUMPY SHOULD BE IMPORTED IN THIS CASE*
a = np.arange(15).reshape(3, 5)
print(a)
**return** a
run_this = PythonOperator(
task_id="print_the_context",
python_callable=print_array,
)
结论
一如既往,我希望这篇文章对你有用,并能给你启发。我们认为 Python 中的许多东西都是理所当然的,但是当发现它内部是如何工作的时候,就变得有趣了。希望你喜欢,干杯!
参考
https://alone-djangonaut . com/how-python-import-machinery-works
当你在回归模型中包含不相关的变量时会发生什么?
图片由 Ernesto Velázquez 来自 Pixabay ( Pixabay 许可)
你的模型失去了精确性。我们会解释原因。
在上一篇文章中,我们看到了遗漏重要变量如何导致回归模型的系数变得有偏差。在本文中,我们将研究这种情况的相反情况,也就是说,用完全多余的变量填充回归模型会对回归模型造成损害。
什么是无关和多余的变量?
回归变量被认为是不相关的或多余的有几个原因。以下是描述这些变量的一些方法:
- 无法解释模型响应变量( y )中任何方差的变量。
- 一个变量,它的回归系数 ( β_m ) 在某个指定的 α 水*上是统计上不显著的(即零)。
- 与模型中其余回归变量高度相关的变量。由于其他变量已经包含在模型中,因此没有必要包含与现有变量高度相关的变量。
向回归模型中添加不相关的变量会导致系数估计变得不太精确,从而导致整个模型失去精度。在本文的其余部分,我们将更详细地解释这一现象。
人们很容易在模型中填入许多回归变量,以期达到更好的拟合。毕竟,人们可能会推测,如果一个变量被判断为不相关,训练算法(如普通的最小二乘法)会简单地将其系数压缩到接*零。此外,可以表明,线性模型的 R *方(或非线性模型的伪 R *方)只会随着模型中回归变量的每次添加而增加。
不幸的是,在这种情况下,虽然 R *方(或伪 R *方)不断上升,但模型越来越不精确。
我们将使用线性回归模型作为我们的工作台来解释精度逐渐下降的原因。
经典的线性模型作为我们的工作台
经典线性回归模型的方程可以表示如下:
线性回归模型(图片来自作者)
下面是上述等式的矩阵形式:
线性回归模型的矩阵形式(图片由作者提供)
式(1)中, y 为因变量, X 为回归变量, β 为 k 回归系数 β_1,β_2,β_3,…,β_k 包含种群水*是 y 的观测值与 y 的建模值之差。回归模型的误差项【ϵ】反映了因变量 y 中回归变量 X 无法解释的方差部分。
我们将假设误差项向量中的 n 个误差项ϵ_i**【I = 1 到 n】中的每一个误差项都围绕某个*均值(假设该*均值为零)变化,并且每个误差项围绕其*均值的方差*均为某个值σ 。因此,假设误差具有零均值和恒定方差σ 。
如果模型中包含正确的回归变量集,它们将能够解释 y 中的大部分方差,从而使误差项的方差**非常小。另一方面,如果重要变量被忽略,那么y 中原本能够解释的方差部分现在将泄漏到误差项中,导致方差变大。****
在大小为 n 的数据集上求解(也称为“拟合”或训练)线性模型,产生的估计值,我们将其表示为 β_cap。 因此,拟合的线性模型方程如下:****
上式中, e 是残差(又名残差)的列向量。对于第次观测,残差 e_i 为第次次 y_i 观测值与对应的第次拟合(预测)值 y_cap_i 之差。 e_i=(y_i — y_cap_i)
在我们进一步寻求发现无关变量对模型的影响之前,我们将陈述以下重要的观察结果:
估计回归系数β_cap 是具有均值和方差的随机变量
让我们来理解为什么会这样:每次我们在大小为 n 的不同随机选择的数据集上训练模型时,我们都会得到一组不同的系数真值的估计值。因此,估计系数的向量β_ cap =【β_ cap _ 1,β_cap_2,…,β_ cap _ k】是一组具有某种未知概率分布的随机变量。如果训练算法不产生有偏估计,则该分布的*均值(也称为期望值)是系数的真实群体水*值的集合。**
具体来说,估计系数【β_ cap】,*** 的 条件期望 是它们的真实总体值【β】,这里的条件是对回归矩阵 X. 这可以表示如下:***
估计系数的条件期望是真实的总体水*值【β】(图片由作者提供)
可以看出,β_ cap的条件方差 可以通过下面的等式计算:
估计回归系数的条件方差公式(图片由作者提供)
在上面的等式中:
- β_cap 是大小为(k×1)的拟合回归系数的列向量,即 k 行和 1 列,假设模型中有 k 个回归变量,包括截距,也包括任何无关变量。
- X 是大小为 (n x k) 的回归变量矩阵,其中 n 是训练数据集的大小。
- X’是 X 的转置,即 X 的行列互换。就好像 X 已经侧过来了。因此X’的大小为 (k x n) 。
- σ 是回归模型的误差项 ϵ 的方差。在实践中,我们使用拟合模型的残差 e 的方差 s 作为 σ 的无偏估计。 σ 和 s 是标量(因此没有用粗体字体描述)。
- X'X 是 X 与其转置的矩阵相乘。由于的大小为(n X k)的大小为(k X n)【X’X的大小为 (k x k) 。****
- (-1) 的上标表示我们取了这个 (k x k) 矩阵的逆,是另一个大小为 (k x k) 的矩阵。
- 最后,我们用误差项 ϵ 的方差 σ 来缩放这个逆矩阵的每个元素。
等式(4)给出了回归模型系数的方差-协方差矩阵 。如上所述,这是一个 (k x k) 矩阵,如下所示:
回归系数的方差-协方差矩阵(作者图片)
沿主对角线向下的元素,即从方差协方差矩阵的左上角到右下角的元素,包含 k 回归系数β_ cap=【β_ cap _ 1,β_cap_2,…,β_ cap _ k】的估计值的方差。该矩阵中每隔一个元素 (m,n) 都包含估计系数 β_cap_m 和β_cap_n 之间的协方差。**
主对角线元素的*方根是回归系数估计的标准误差。我们知道 区间估计理论 认为标准误差越大,估计的精度越小,估计周围的置信区间越宽。
估计系数的方差越大,估计的精度越低。因此,由训练的模型生成的预测的精度较低。
检查由上述观察产生的两个边界情况很有用:
Var(β_cap_m|X) = 0 : 此时,系数估计的方差为零,因此系数估计的值等于系数的总体值β_ m。**
Var(β_cap_m|X) = ∞ : 在这种情况下,估计是无限不精确的,因此相应的回归变量完全不相关。
我们来考察 mth 回归变量在 X 矩阵中的情况:
X 中的 mth 回归变量(作者图片)
该变量可由列向量xT42 _ m 表示,大小为 (n x 1) 。在拟合的模型中,其回归系数为β_ cap _ m。**
该系数即Var(β_ cap _ m| X)的方差是式(4)方差协方差矩阵的 mth 对角元素。该差异可表示如下:
mth 拟合回归系数的方差(作者图片)
在上式中,
- σ 是模型误差项的方差。在实践中,我们使用拟合模型的残差的方差 s 来估计 σ 。
- n 是数据样本数。
- R _m 是线性回归模型的 R *方,其中因变量是第个回归变量X_ m,解释变量是 X 矩阵中的其余变量。于是, R _m 就是X_ m对其余 X 的回归的 R *方。
- Var(x_ m)是x**_ m的方差,它由通常的方差公式给出如下:
第 m 个回归变量的方差(图片由作者提供)
在我们分析等式(5)之前,让我们回忆一下,对于第个回归变量, β_cap_m 的方差越大,估计的精度越低,反之亦然。
现在让我们考虑以下场景:
场景 1
在这种情况下,我们将假设变量x_ m恰好与模型中的其他变量高度相关。
在这种情况下,用剩余的×1.0回归X_ m得到的 R *方 R _m ,将接* 1.0 。在等式(5)中,这将导致分母中的(1-R _ m)接*于零,从而导致 β_cap_m 的方差非常大,因此不精确。因此,我们有以下结果:**
当您加入与模型中其他回归变数高度相关的变数时,这个高度相关变数在定型模型中的系数估计会变得不精确。相关性越大,估计系数的不精确性越高。
回归变量之间的相关性称为多重共线性。
回归变量之间存在多重共线性的一个众所周知的后果是系数估计精度的损失。
场景 2
现在考虑第二个回归变量 x _j ,使得 x _m 与x_ j高度相关。等式(5)也可用于计算x_ j的方差,如下所示:
第 j 个拟合回归系数的方差 β_cap_j(图片由作者提供)
R _j 是X_ j对其余×X(包括X_ m)的线性回归的 R *方值。由于x_ m被假设为与x_ j高度相关,如果我们从模型中省略掉x_ m,那么R _ j【1—R _ j】将会显著减少包含高度相关变量x_ m会增加 β_cap_j 的方差(即降低精度)。这表明包含高度相关变量如x_ m的另一个重要结果:**
当添加与模型中其他回归变量高度相关的变量时,会降低模型中所有回归变量的系数估计精度。
场景 3
考虑第三种情况。不管 x _m 是否与模型中的任何其他变量特别相关,模型中的 x _m 的存在将导致 R _j ,这是模型的 R *方,在该模型中,我们对其余部分进行回归X_ j这种行为源于 R *方的公式。从等式(5)我们知道,当 R _j 增大时,等式(5)的分母变小,导致 β_cap_j 的方差增大。如果x_ m也不能解释因变量 y 中的任何方差,则这种影响,即 β_cap_j 的精度损失尤其明显。在这种情况下,将x_ m添加到模型中并不会减少模型的误差项 ϵ 的方差。回想一下,误差项包含了 y 中 X 无法解释的方差部分。因此,当X_ m是一个不相关变量时,它加入到模型中只会导致等式(5)的分母减少,而不会导致等式(5)的分子补偿性减少,从而导致所有 j 的Var(β_ cap _ j |X)因此,我们有了另一个重要的结果:**
向回归模型中添加不相关的变量会使所有回归变量的系数估计变得不太精确。
最后,让我们回顾一下等式(5)揭示的另外两件事:
第 m 个拟合回归系数的方差(图片由作者提供)
分母中的 n 是数据集大小。我们看到,训练模型的数据集越大,系数估计值的方差越小,因此精度越高。这似乎很直观。极限情况是当模型在整个群体上训练时。
估计回归系数的精度随着训练数据集大小的增加而提高。
此外,我们看到一个回归变量如 x _m 的方差越大,其回归系数估计值的方差越小。乍一看,这似乎不太直观。我们可以通过注意到几乎没有可变性的变量无法解释因变量 y 的可变性来理解这种影响,反之亦然。对于这种很大程度上“刚性”的变量,训练算法将无法正确估计它们对模型输出可变性的贡献(通过回归系数量化)。
如果您喜欢这篇文章,请关注我的Sachin Date以获得关于回归、时间序列分析和预测主题的提示、操作方法和编程建议。**
当你忽略回归模型中的重要变量时会发生什么
省略可变偏差(图片由作者提供)
我们将了解什么是遗漏变量偏差,并使用真实数据集说明其计算
我们将研究在线性回归模型中没有包括重要变量的后果。举例来说,我们将基于汽车特征的真实世界数据集进行讨论。我们的目标是在统计建模中形成一个众所周知的结果,称为省略变量偏差,并使用样本数据集说明计算。
汽车数据集
以下数据包含 205 辆汽车的规格,摘自 1985 年版的沃德汽车年鉴。每行包含一组 26 个关于单个车辆的规格。
汽车数据集(来源:加州大学欧文分校
我们将考虑由以下变量组成的数据子集:
城市 _ 英里数
汽车 _ 体积
整备质量
发动机 _ 尺寸
原始数据集中不存在 Car_Volume 变量。它是我们添加的一个新变量,如下:Car_Volume = LengthWidthHeight。
汽车数据集的子集(来源:加州大学欧文分校)
上述 4 变量版本的数据集可从此处 下载 。
回归目标
我们的回归目标是使用线性回归模型回归发动机尺寸和整备质量的城市行驶里程。模型方程为:
city _ mpg =β_ 1+*β_ 2 *汽车 _ 体积+β_ 3 *整备 _ 重量+β_ 4 发动机 _ 尺寸+ ϵ
回归模型的误差项 ϵ 代表建模者无法测量的所有因素的影响。
上述方程的矩阵形式如下:
线性回归模型的方程(图片由作者提供)
哪里,
- y 是一个【n×1】大小的列向量,包含 City_MPG 的观测值。n 是数据点的数量。
- β 是一个【4×1】大小的回归模型系数列向量 β_1、β_2、β_3 、 β_4 对应于截距、汽车 _ 体积、整备 _ 重量和发动机 _ 大小。
- 是一个【n×4】*大小的矩阵,包含回归变量的值。这个矩阵的第一列是 1 的列,它充当截距 β_1 的占位符。*
- 是模型的回归误差的一个【n×1】大小的列向量。
让我们用矩阵来说明回归模型的方程是怎样的:
包含三个变量和一个截距的线性回归模型(图片由作者提供)
在 X 矩阵中,由列向量X _ 1 =**【X _ 11,…X _ n1】'表示的第一列是 1 的列。假设样本量为 n ,上述矩阵表示等价于写出以下 n 回归方程组:**
四个变量和误差项的 n 个回归方程系统(图片由作者提供)
现在,假设我们将这个方程组分成两部分,如下所示:
分成两部分的 n 方程系统(图片由作者提供)
下面是上述划分的矩阵表示:
分成两部分的 n 方程系统(图片由作者提供)
一般来说,我们可以将上述划分表示如下:
分区线性回归模型(图片由作者提供)
我们已经用变量替换了分割出来的回归变量x_ 4,这是一个【n×1】列向量。γ*(γ)是代替回归系数 β_4 的【1×1】“矩阵”。*****
当一个人在一组 n 个样本的数据集上训练(也称为“拟合”)上述线性模型时,拟合的模型可以表示如下:
拟合的分段线性回归模型(图片由作者提供)
注意**和 γ 上的帽或帽子“^”符号表示它们是拟合值,即 β 和 γ 的相应群体水*值的估计值。同样在等式(2)中,残差的列向量 e 代替回归误差的列向量 ϵ.带残差 e_i 是带观测值 y_i 的和来自拟合模型的对应带预测值之间的差值。****
我们现在已经为解决当你忽略回归变量时会发生什么的问题做好了准备。
省略回归变量的影响
让我们重新看看汽车数据集的回归模型:
**city _ mpg =β_ 1+β_ 2 *汽车 _ 体积+β_ 3 整备 _ 重量+β_ 4 发动机 _ 尺寸+ ϵ
以下是拟合模型的方程式:
**City _ MPG =β_ 1 _ cap+β_ 2 _ cap *汽车 _ 体积+β_ 3 _ cap 整备 _ 重量+β_ 4 _ cap 发动机 _ 尺寸+ e
假设我们在构建模型时没有包含变量 Engine_Size 。这类似于从等式(1)中省去项 zγ 或者从等式(2)中省去项 zγ_cap 。
如果我们求解方程(2)的其余部分,即y=xβ_ cap+e,通过最小化残差的*方和 e ,它具有一个漂亮的闭合形式解,可以表示为
y=xβ_ cap+e(图片由作者提供)**
在上面的等式中:
- β_cap 是大小为(k×1)的拟合回归系数的列向量,假设模型中有 k 个回归变量,包括截距,但不包括我们忽略的变量。
- X 是大小为 (n x k) 的回归变量矩阵。
- X' 是X的转置,即 X 的行列互换。就好像 X 已经侧过来了。因此 X' 的大小为(k×n)。因此, X'X 的大小为 (k x k) 。回想一下大小为(k x n)**(n x k)的两个矩阵的乘积是大小为 (k x k) 的矩阵。
- y 是大小为(n×1)的观测值的列向量。
(X ' X),大小为 (k x k) ,当与大小为 (k x n) 的【X '**相乘时,产生大小为 (k x n) 的矩阵,当与大小为 y 相乘时
在上面的等式中,我们将等式(1)中的 y 替换为xβ+zγ+【ϵ:
用xβ+zγ+ϵ(图片由作者提供)
接下来,我们将蓝色括号中的术语分配如下:
分发括号中的术语后(图片由作者提供)
等式(3)的 R.H.S .上的第一项可以简化为简单的 β 如下:
第一个术语的简化(图片由作者提供)
在上面的简化中, I 是一个大小为(k×k)的单位矩阵。 I 是数字 1 的矩阵等价。一个矩阵 A 与 A 的逆矩阵相乘等于 I ,同理, (n)(1/n)=1 。*
让我们用 β 代替等式(3)的第一项,并将简化的等式(3)重述如下:
方程式(3)的简化版(图片由作者提供)
上面的等式给了我们第一个提示,变量【z】的省略可能会导致系数向量 β_cap 的拟合值偏离其真实群体值β,偏离量等于红色框中各项的值。
让我们回忆一下,拟合回归模型中的系数估计值是随机变量,它有一个*均值(也称为期望值)和围绕*均值的方差。
因此,我们感兴趣的不是 β_cap 的点估计。相反,我们应该计算下面的 条件估计值β_ cap的条件均值:
E(β_ cap|X)
相应地,让我们对上述等式两边的条件期望如下:
接受双方的条件期望后(图片由作者提供)
上面等式的 R.H.S .上的蓝色表达式可以使用恒等式E(A+B+C)= E(A)
去掉条件期望操作符后(图片由作者提供)
右边第一项E(β| X)简单来说就是,即常数的系数的真实总体值。
在我们考察右边的第二项之前,让我们用恒等式E(ABC)= E(AE(B)E(C)假设随机变量**
等式(4)的第三项使用期望乘积规则简化(图片由作者提供)
现在我们得出一个重要的观察结果。
线性回归模型的主要假设之一是误差【ϵ,以回归变量 X 为条件,具有零均值。
错误是外生的**这一属性意味着灰色的期望 e(【ϵ】|x)=0,其中 0 是大小为的列向量绿色的期望是简单的X’(它是 X 的转置)并且它的大小是 (k x n) 。因此,绿色和灰色位相乘在一起就是大小为(k×1)的列向量 0 。最后,黄色位是大小为 (n x k) 的 X 与其大小为 (k x n) 的转置的乘积的倒数。因此,黄色位相当于一个大小为 (k x k) 的矩阵。这个矩阵与(k×1)列零向量的乘积就是一个大小为(k×1)的列零向量。**
因此,等式(4)中的第三项实际上消失在大小为(k×1)的零的列向量中。
到目前为止,我们已经表明,在等式(4)中,右边的第一项是列向量**而第三项是列向量 0 ,两者的大小都是(k×1)。**
现在我们来看等式(4)的第二项。简单来说,我们就用恒等式E(AB)= E(A)E(B):
等式(4)的第二项使用期望乘积规则简化(图片由作者提供)
灰色项简单来说就是 γ ,因为它是 z 的系数的总体水*值,因此它的期望(均值)与它本身相同。
将 R.H.S .上期望值内的绿色位与 y 对×的最小二乘回归的闭合形式解进行比较会有所帮助(如下所示):
*****y=xβ_ cap+e*(图片由作者提供)
很容易看出,绿色位其实是省略变量 z 对 X 的最小二乘回归的封闭形式解!
因此,我们可以将等式(4)的第二项表达如下:
z 对 X 的回归的拟合系数 β _zX 的期望值(图片由作者提供)
在上述等式的 R.H.S 中:
- γ γ 是一个标量,因此没有加粗。
- β_cap_zX 是从回归z 到X 中剩余变量的拟合回归系数的向量。**
现在,我们可以将所有的部分放在一起,并在从回归中省略变量【z时,说明回归的拟合系数【β_ cap】***yon的期望值公式:***
当变量从回归中省略时,拟合系数的期望值(图片由作者提供)
在等式(5)中, β_cap_zX 为大小为(k×1)的列向量,其中 k 为模型中回归系数的个数(不包括z)γ为标量。因此,当我们从模型中省略诸如 z 之类的变量时,得到的模型的拟合系数从其真实总体值偏离,偏离量与z 与中剩余变量的协方差成比例,如E(β_ cap _ zX所示****
这一分析表明了以下两种情况:
省略的变量 z 与 x 中的其余回归变量相关。
在这种情况下,E(β_ cap _ zX|X)是非零向量。由此,我们得出以下重要结果:
当省略的变量与回归模型中的其余变量相关时,剩余回归模型的最小二乘估计不再是无偏的。因此,它不再是蓝色的。
省略的变量 z 与其余的回归变量 X 不相关
在这种情况下,列 vectorE(β_ cap _ zX|X)包含全零。因此,方程 R.H.S .的第二项。(5)消失,剩余模型的拟合系数的期望值等于群体值 β 。
当省略的变量与回归模型中的其余变量不相关时,剩余回归模型的最小二乘估计器继续保持无偏,因此,它保持蓝色。****
即使省略的变量与回归变量的其余部分不相关,省略它也是要付出代价的。
如果被省略的变量 z 中的方差已经“解释”了响应变量 y 中的一些方差,那么省略 z 会导致这个无法解释的方差漏入模型的误差项【ϵ,导致误差的方差更大并且 R *方 到
这个结果有一个直观的方面。如果我们继续从模型中移除相关变量,我们最终将只剩下回归的截距,这将我们带到均值模型,即y _ I=β_ 1+ϵ_i,其中 β_1 是 y 的均值。中所有无法用 y 均值解释的方差,都会溢出到误差项 ϵ 的方差中。
让我们回到我们的汽车数据集和回归模型:
city _ mpg =β_ 1+***β_ 2 汽车 _ 体积+β_ 3 整备 _ 重量+β_ 4 发动机 _ 尺寸+ ϵ
我们来考察省略 Engine_Size 的效果。根据等式(5),我们需要回归汽车体积和整备质量上的发动机尺寸(加上截距)。
我们将使用 Python 库 Pandas 将数据集加载到内存中:
****import** pandas **as** pd
**from** patsy **import** dmatrices
**import** numpy **as** np
**import** scipy.stats
**import** statsmodels.api **as** sm
**import** matplotlib.pyplot **as** plt
***#Read the automobiles dataset into a Pandas DataFrame***df = pd.read_csv(**'automobile_uciml_4vars.csv'**, header=0)**
让我们打印出前几行:
*****#Print the first few rows of the data set***print(df.head())**
autos 数据集的前几行(图片由作者提供)
为了判断省略发动机 _ 尺寸的影响,让我们回归发动机 _ 尺寸对汽车 _ 体积和整备质量的影响。
*****# Here's the model expression in Patsy syntax. The intercept's presence is implied.***model_expr = **'Engine_Size ~ Car_Volume + Curb_Weight'
*# carve out the X and y matrices using Patsy***y_train, X_train = **dmatrices**(model_expr,df, **return_type**=**'**dataframe**'**)***# Build an OLS regression model using Statsmodels*** olsr_model = sm.**OLS**(**endog**=y_train, **exog**=X_train)***# Fit the model on (y, X)*** olsr_results = olsr_model.**fit**()***#Print the training summary of the fitted model*** print(olsr_results.**summary**())**
以下是培训总结:
根据汽车体积和整备质量回归发动机尺寸的训练总结(图片由作者提供)
调整后的 R *方值 0.753 和显著的 F 统计值 312.7 使我们相信发动机尺寸与汽车体积和整备质量密切相关。
因此,等式(5)表明,如果我们从以下回归模型中省略变量 Engine_Size :
city _ mpg =β_ 1+***β_ 2 汽车 _ 体积+β_ 3 整备 _ 重量+β_ 4 发动机 _ 尺寸+ ϵ
然后城市 _MPG 对汽车 _ 体积和整备 _ 重量的最小二乘线性回归将产生拟合系数β_ cap=【β_ 1 _ cap,β_2_cap,β_ 3 _ cap】,即将显著偏离它们的真实人口值β=]**
让我们使用等式(5)使用如下两步程序来估计该偏差:
第一步:我们将首先回归汽车 _ 体积、整备 _ 重量、发动机 _ 尺寸(加上截距* ) :*
*model_expr = 'City_MPG ~ Car_Volume + Curb_Weight + Engine_Size'y_train, X_train = dmatrices(model_expr, df, **return_type**='dataframe')olsr_model = sm.**OLS**(**endog**=y_train, **exog**=X_train)olsr_results = olsr_model.**fit**()**print**(olsr_results.**params**)*
我们看到以下输出:
*Intercept 44.218699
Car_Volume 0.000019
Curb_Weight -0.012464
**Engine_Size 0.008221**
dtype: float64*
在上面的输出中, Engine_Size (高亮显示)的估算系数为 0.008221 。这个值代替了等式(5)中的 γ 。注意,在等式(5)中, γ 是该系数的真实总体值,而在实践中,我们使用其估计值 0.008221。
步骤 2: 我们现在将汽车 _ 体积和整备 _ 重量上的发动机 _ 尺寸(加上截距):
*model_expr = 'Engine_Size ~ Car_Volume + Curb_Weight'y_train, X_train = dmatrices(model_expr, df, **return_type**='dataframe')olsr_model = sm.**OLS**(**endog**=y_train, **exog**=X_train)olsr_results = olsr_model.**fit**()**print**(olsr_results.**params**)*
我们看到以下输出:
*Intercept 2.256588
Car_Volume -0.000165
Curb_Weight 0.088617
dtype: float64*
这是列向量E(β_ cap _ zX|X)😗*
截距、汽车体积和整备质量(按此顺序)的拟合系数的期望值,从汽车体积和整备质量回归发动机尺寸(加上截距)(图片由作者提供)
根据等式(5),如果我们通过 γ (来自步骤 1)缩放该向量,如果我们从模型中省略 Engine_Size ,我们将得到回归模型系数估计中引入的偏差估计:
在截距、汽车体积和整备质量(按此顺序)的系数估计中引入的估计偏差,因为从回归模型中忽略了发动机尺寸(图片由作者提供)
通过不忽略所讨论的变量来解决偏差问题是很有诱惑力的。但这可能会导致另一个问题。如果省略的变量与模型中的其他变量相关(如 Engine_Size is),那么将它添加回去会导致多重共线性,这种情况会降低系数的精确度。那是另一篇文章的主题!
敬请期待,造型快乐!
参考文献、引文和版权
数据集
汽车数据集 引用: Dua,d .和 Graff,C. (2019)。UCI 机器学习知识库[http://archive . ics . UCI . edu/ml]。加州欧文:加州大学信息与计算机科学学院。(CC BY 4.0) 下载链接
如果你喜欢这篇文章,请关注我的Sachin Date获取关于回归、时间序列分析和预测主题的提示、操作方法和编程建议。
我的 A/B 实验应该使用什么假设检验?
原文:https://towardsdatascience.com/what-hypothesis-test-should-i-use-for-my-a-b-experiment-2cfc7fd3537b
选择正确测试的快速参考指南
Javier Allegue Barros 在 Unsplash 上拍摄的照片
对于任何数据从业者来说,在运行 A/B 实验后选择假设检验可能是势不可挡的。两个流行的 Python 库 scipy 和 statsmodels ,已经为所有类型的用例实现了数百个假设测试。
这篇文章是你分析 A/B(/C)实验所需的最常见假设检验类型的快速参考指南。作为一名数据科学家,我在 11 月份经常使用这些测试。
我们将讨论两个或更多样本中连续变量和分类变量的参数和非参数检验。我在下面包含了一个流程图,以帮助您确定使用什么测试。由于每种方法都有几个不同的输入参数,因此在执行测试时请阅读文档。
如需进一步阅读,请查看我的其他文章,了解为什么您应该运行 A/B 实验和如何设置 A/B 测试。您还可以在此处找到测试的详细说明,在此处找到测试的详细说明,在此处找到测试的详细说明。
作者图片
“学生”t 检验
t 检验是一种参数检验,用于确定两个连续样本的*均值之间是否存在显著差异。
假设
- 每个样本中的观察值都是独立的
- 每个样本中的观察值*似呈正态分布
- 每个样本中的观察值具有相同的方差
假设
- H0:两个样本的*均值是相等的
- H1:两个样本的*均值不相等
资源
曼-惠特尼实验
Mann-Whitney U 检验是一种非参数检验,用于确定两个连续样本的分布是否相同。Mann-Whitney U 检验是学生独立样本 t 检验的非参数版本。
假设
- 每个样本中的观察值都是独立的
- 每个样本中的观察值是连续的或有序的,并且可以排序
- 每个样本的分布形状大致相同
假设
- H0:每个样本的分布都是一样的
- H1:每个样本的分布都不一样
资源
配对学生 t 检验
配对学生 t 检验是一种参数检验,用于确定两个配对连续样本的均值之间是否存在显著差异。
假设
- 每个样本中的观察值都是独立的
- 每个样本中的观察值*似呈正态分布
- 每个样本中的观察值具有相同的方差
- 每个样本的观察值是成对的
假设
- H0:两个配对样本的*均值是相等的
- H1:两个配对样本的*均值不相等
资源
Wilcoxon 符号秩检验
Wilcoxon 符号秩检验是一种非参数检验,用于确定两个成对连续样本的分布是否相同。Wilcoxon 检验是配对学生 t 检验的非参数版本。
假设
- 每个样本中的观察值都是独立的
- 可以对每个样本中的观察值进行排序
- 每个样本的观察值是成对的
假设
- H0:配对样本的分布是相同的
- H1:配对样本的分布是不一样的
资源
方差分析检验(ANOVA)
单向 ANOVA 检验是一种参数检验,用于确定两个或多个连续样本的*均值之间是否存在显著差异。
假设
- 每个样本中的观察值都是独立的
- 每个样本中的观察值*似呈正态分布
- 每个样本中的观察值具有相同的方差
假设
- H0:两个或更多样本的*均值是相等的
- H1:样本的一个或多个*均值不相等
资源
克鲁斯卡尔-沃利斯 H 检验
Kruskal-Wallis H 检验是一种非参数检验,用于确定两个或多个连续样本的中位数之间是否存在显著差异。它是单向 ANOVA 检验的非参数等效方法。
假设
- 每个样本中的观察值都是独立的
- 每个样本中的观察值具有相同的方差
假设
- H0:两个或更多样本的中位数是相等的
- H1:样本的一个或多个中位数不相等
资源
卡方检验
卡方检验检验列联表中两个或更多分类变量的独立性。
假设
- 样本中的观察值是独立的
- 列联表中每个单元的观察频率和预期频率至少为 5
假设
- H0:变量是独立的
- H1:变量不是独立的
资源
费希尔精确试验
像卡方检验一样,Fisher 精确检验用于检验列联表中两个分类变量的独立性。当样本量较小时,使用费希尔精确检验代替卡方检验。
假设
- 样本中的观察值是独立的
假设
- H0:变量是独立的
- H1:变量不是独立的
资源
泊松电子检验
泊松精确检验(E-检验)检验两个泊松率之间是否有显著差异。
假设
- 样本中的观察值是独立的
假设
- H0:泊松比是一样的
- H1:泊松率是不一样的
资源
- 顾,吴,唐,舒坎 2008:检验两个泊松比,生物统计学杂志 50 (2008) 2,2008
- stats models . stats . rates . test _ poisson _ 2 index
结论
本文回顾了在分析 A/B 实验时最有可能使用的假设检验。我们讨论了测试最适合什么情况,需要满足什么假设,如何解释结果,并提供了实现测试所需的代码和资源。
感谢机器学习大师启发了这篇文章。
我错过了什么吗?告诉我,我会更新名单。
喜欢你读的书吗?跟我上 中 。否则, 推我 或者在 LinkedIn 上加我。
你可以在 GitHub 上找到这篇文章中用到的所有代码。
我错在哪里:回顾我对现代数据堆栈的 2022 年预测
我们在数据世界的起点和现在的位置
迈克·科诺诺夫在 Unsplash 上拍摄的照片
今年年初,我对 2022 年现代数据堆栈的未来做了一些大胆的预测。
我不想用一系列新的预测来开始 2023 年——说实话,我还是会做——我想停下来回顾过去一年的数据。我们做对了什么?什么不尽如人意?我们完全错过了什么?
每年的这个时候,随着社交媒体充斥着崇高的预测,人们很容易认为这些预测背后的人是无所不知的专家。但实际上,我们只是普通人。人们多年来一直埋在数据世界中,是的,但仍然容易出错。
这就是为什么今年,我不只是在内部做这项练习,而是向公众开放。
以下是我对 2022 年以来六大趋势的思考——哪些是对的,哪些是完全错的。
结论:大部分是真实的✅,但进展比预期缓慢的❌
TL;DR :我们确实看到了很多围绕“数据网格*台”的市场整合,但是实现实践和工具堆栈比我们预期的要落后得多。不过,数据网格仍在我的考虑范围之内,并将成为 2023 年的主要趋势。
我们开始的地方
以下是我今年年初说的话:
“在 2022 年, 我认为我们将会看到大量*台更名,并作为‘终极数据网格*台’提供服务 。但问题是,数据网格不是一个现成的*台或服务。这是一个设计概念,其中包含一些精彩的概念,如分布式所有权、基于域的设计、数据可发现性和数据产品运输标准,所有这些都值得在您的组织中尝试实施。
因此,我的建议是:作为数据领导者,重要的是在概念层面坚持首要原则,而不是相信你很快就会在市场上不可避免地看到的炒作。
如果一些团队(尤其是较小的团队)可以通过基于雪花和 dbt 构建的完全集中的数据*台实现数据网格架构,而其他团队将利用相同的原则在复杂的多云环境中整合他们的“数据网格”,我不会感到惊讶。"
(所有片段均来自《T2 2022 年现代数据堆栈的未来》报告。)
我们现在在哪里
我关于公司将围绕数据网打造自己品牌的预测完全实现了。我们在starbrust、 Databricks 、 Oracle 、 Google Cloud 、 Dremio、、 Confluent 、 Denodo 、 Soda 、 lakeFS 、 K2 View 等等中看到了这一点。
数据网从想法到现实的转变也取得了进展。Zhamak Dehghani 与 O'Reilly 一起出版了一本关于数据网格的书,真实的用户故事正在数据网格学习社区中增长。
结果是关于如何实现数据网格的两种越来越流行的理论:
- 通过团队结构:基于分布式领域的数据团队,负责发布数据产品,由中央数据*台团队提供支持,为分布式团队提供工具
- Via“Data as a product”:负责创建数据产品的数据团队——即把数据治理推向“左边”,更接*数据生产者而不是消费者。
虽然这一进步是显著的,但它最终没有将指针移动得足够远,数据网格与一年前一样模糊。数据人员仍然渴望清晰和具体。例如,在 Starburst 关于数据网格的会议上,聊天中最常见的问题是“我们如何实际实现数据网格?”
虽然我预计,今年,我们作为一个社区将更接*于“如何实现数据网格”的讨论,但我们仍然停留在去年的位置。我们仍处于早期阶段,因为团队需要弄清楚实现数据网格的真正含义。尽管现在越来越多的人接受了这个概念,但是对于如何在操作中实现数据网格,确实缺乏真正的操作指导。
这仅仅是由于网格工具组仍然是不成熟的。虽然有很多品牌重塑,但我们仍然没有一个关于如何实现数据网格的最佳参考架构。
结论:大部分是真实的✅,但比预期的❌要慢
TL;DR: dbt 实验室的语义层如期上线。对于指标层来说,这是一个巨大的进步,但我们仍在等待看到对数据团队使用指标的方式的全面影响。度量层有望成为 2023 年的重要趋势。
我们开始的地方
以下是我今年年初说的话:
“我对指标层最终成为现实感到非常兴奋。几个月前,来自 Fivetran 的 George Fraser 有一个不受欢迎的观点,认为 所有的度量商店都将演变成 BI 工具 。虽然我不完全同意,但我确实相信没有与 BI 紧密集成的度量层不太可能变得普遍。
然而,现有的 BI 工具并没有真正地将外部指标层集成到他们的工具中…这使得这成为一个先有鸡还是先有蛋的问题。独立的度量层将努力鼓励 BI 工具采用它们的框架,并将被迫像多年前被迫构建的 Looker 一样构建 BI。
这就是为什么我对 dbt 宣布进军指标层感到非常兴奋。dbt 已经有足够的分布来鼓励至少现代 BI 工具(例如,预置、模式、Thoughtspot)深度集成到 dbt metrics API 中,这可能会给较大的 BI 玩家带来竞争压力。
我还认为,指标层与转换过程如此紧密地交织在一起,这在直觉上是有意义的。 我的预测是,我们将在 2022 年看到 metrics 成为更多转换工具中的一等公民。
我们现在在哪里
作为度量层的领导者,我把钱投在了 dbt 实验室上,而不是 BI 工具上——事实证明这是对的。
dbt Labs 的语义层如期推出(在公开预览中),同时还有来自 Hex、Mode、Thoughtspot 和 Atlan (美国!).这是现代数据堆栈向前迈出的一大步,无疑为 metrics 成为一等公民铺*了道路。
我们没有做对的是接下来发生的事情。我们认为,随着 dbt 的语义层,度量层将被火箭发射到日常数据生活中。然而,实际上,进展被更多地度量,度量层获得的牵引力比预期的要少。
在某种程度上,这是因为基础技术比我预期的启动时间要长。毕竟语义层是 10 月份刚刚在 dbt Coalesce 发布的。
这也是因为改变人们编写指标的方式是很难的。公司不可能一夜之间就切换到指标/语义层。变更管理过程是巨大的,更有可能的是,转换到度量层将需要几年时间,而不是几个月。
结论:大部分是真实的✅,但也开始走向新的方向❌
TL;正如预期的那样,这个领域正开始与 ETL 和数据摄取整合。然而,与此同时,reverse ETL 现在正试图重塑自己的品牌并扩大其类别。
我们开始的地方
以下是我今年年初说的话:
“我对解决现代数据堆栈中‘最后一英里’问题的一切都感到非常兴奋。我们现在谈论的更多的是如何在日常运营中使用数据,而不是如何存储数据——这是一个令人难以置信的迹象,表明数据堆栈的基本构建模块(存储、转换等)已经变得多么成熟!
我不确定的是反向 ETL 是否应该是一个独立的空间,或者仅仅是与一个数据摄取工具结合,因为数据输入和输出的基本功能是如此的相似。像 Hevo Data 这样的公司已经开始在同一产品中提供摄取和反向 ETL 服务,而 我相信我们可能很快就会在该领域看到更多的整合(或更深入的走向市场合作伙伴关系) 。”
我们现在在哪里
我的大预测是,我们将在这一领域看到更多的整合,这肯定会如预期的那样发生。最值得注意的是,数据摄取公司 Airbyte 收购了开源反向 ETL 产品 Grouparoo 。
与此同时,其他公司通过推出 Hevo Data 的 Hevo Activate (将反向 ETL 添加到该公司现有的 ETL 功能中)和 Rudderstack 的反向 ETL (其早期 Warehouse Actions 产品线的更名版本)巩固了他们在反向 ETL 领域的立足点。
然而,一些反向 ETL 的主要参与者今年并没有倾向于整合,而是专注于重新定义和扩展他们自己的类别。最新的流行词是“数据激活”,这是“客户数据*台”(CDP)类别的一个新说法,由像 Hightouch 和 Rudderstack 这样的公司推动。
这是他们的主要论点——在一个数据存储在中央数据*台的世界里,我们为什么需要独立的 CDP?相反,我们可以从仓库中“激活”数据来处理传统的 CDP 功能,如发送个性化电子邮件。
简而言之,他们已经从谈论“推动数据”转向用数据实际驱动客户用例。这些公司仍然在谈论反向 ETL,但它现在是他们更大的数据激活*台中的一个特性,而不是他们的主要描述符。(值得注意的是, Census 抵制了这种趋势,在其网站上坚持使用反向 ETL 类别。)
判决结果:大部分属实 ✅
TL;这一类别随着分析师和公司的买入而持续爆发。虽然还没有一个占主导地位的赢家,但这个领域已经开始在传统数据目录和现代目录之间划出清晰的界限(例如,活动元数据*台、用于数据操作的数据目录等)。
我们开始的地方
这是我们今年年初说的:
“数据世界将永远是多样化的,而人员和工具的多样化将永远导致混乱。我可能有偏见,因为我毕生致力于在元数据领域建立一家公司。但是我真的相信 让混乱的现代数据堆栈变得有序的关键在于我们如何使用和利用元数据来创建现代数据体验 。
Gartner 用一句话概括了这一类别的未来:“独立的元数据管理*台将从扩充的数据目录转向元数据‘随处’编排*台。”
2.0 代的数据目录是被动的、孤立的,而 3.0 代的数据目录建立在这样一个原则之上,即无论用户何时何地需要,上下文都必须可用。第三代目录将利用元数据来改进 Looker、dbt 和 Slack 等现有工具,而不是强迫用户使用单独的工具,最终实现智能数据管理系统的梦想。
虽然 2021 年该领域已经有了大量的活动和资金, 我很确定我们将在 2022 年看到一个占主导地位的真正的第三代数据目录(也称为 活动元数据*台 )的崛起。
我们现在在哪里
鉴于这是我的空间,我并不惊讶这个预测是相当准确的。然而,令我惊讶的是,这个空间的表现超出了我最大的预期。
活动元数据和第三代目录的发展速度比我预期的还要快。与去年只有少数人谈论它的时候相比,这是一个巨大的转变,来自整个数据生态系统的大量公司现在都在竞争这个类别。(以 Hevo Data 和 Castor 采用“数据目录 3.0”语言为例。)少数人拥有支持他们言论的技术。但就像数据网格的早期一样,当专家和新手在一个仍在定义的空间中表现得同样博学时,其他人则不然。
今年让这个领域爆炸的部分原因是分析师如何抓住并放大了现代元数据和数据目录的想法。
在 2021 年发布新的活动元数据市场指南后,Gartner 似乎已经进入了活动元数据领域。在今年的会议上,活动元数据作为关键主题之一出现在 Gartner 的主题演讲中,也出现在本周几乎一半的不同主题和类别的演讲中。
G2 在年中发布了新的“主动元数据管理”类别,标志着“新一代元数据”。他们甚至称之为“数据目录的第三阶段”,与这种新的“第三代”语言保持一致。
同样,Forrester 放弃了关于“机器学习数据目录”的 Wave 报告,为“数据运营的企业数据目录”让路,标志着他们对成功的数据目录应该是什么样子的想法发生了重大转变。作为其中的一部分,Forrester 颠覆了他们的 Wave 排名,将所有以前的领导者移到了底层或中间层,这是市场开始分离现代目录(例如活动元数据*台、数据操作的数据目录等)的一个主要标志。)来自传统的数据目录。
判决:没有成真 ❌
TL;博士:虽然我很希望这已经成为现实,但我们在这一趋势上取得的进展远低于我的预期。12 个月后,我们差不多又回到了起点。
我们开始的地方
这是我们今年年初说的:
“在 2021 年所有被炒作的趋势中,这是我最看好的一个。 我相信,在未来十年,数据团队将成为组织结构中最重要的团队之一,为经济前沿的现代数据驱动型公司提供动力。
然而,现实情况是,如今的数据团队陷入了服务陷阱, 他们的数据项目只有 27%是成功的 。我认为解决这个问题的关键在于“数据产品”思维模式的概念,数据团队专注于为团队的其他成员构建可重用、可复制的资产。这将意味着在用户研究、可扩展性、数据产品运输标准、文档等方面进行投资。”
我们现在在哪里
回想起这一个就心痛。在我所有的预言中,这一个没有实现(还没有?🤞)让我无比难过。
尽管嘴上这么说,我们离数据团队作为产品团队运作的现实还很远。虽然数据技术今年已经成熟了很多,但在数据的人性化方面,我们并没有比去年取得更大的进步。在数据团队如何从根本上运作(他们的文化、流程等)方面,还没有太多进展。
判决结果:大部分属实 ✅
TL;正如预测的那样,这个空间今年继续扩张并分裂。然而,明年它将何去何从,以及它是否会与相邻类别合并,仍是一个悬而未决的问题。
我们开始的地方
这是我们今年年初说的:
“我相信在过去的两年中,数据团队已经意识到提高生产力的工具不是必须的,而是必须的。毕竟,数据专业人员是你有史以来最受欢迎的雇员之一,所以他们不应该浪费时间在排除管道故障上。
那么,数据可观测性在未来会成为现代数据堆栈的关键部分吗?绝对的。这是我不太确定的。
理想情况下,如果你把所有的元数据都放在一个开放的*台上,你应该能够把它用于各种用例(比如数据编目、可观察性、血统等等)。我去年在我关于元数据湖的文章中写了这个想法。
也就是说,如今,这些领域需要大量的创新。 我的感觉是,在我们看到未来几年的整合之前,我们将在 2022 年继续看到分裂。”
我们现在在哪里
最大的预测是这个空间将继续增长,但以一种分散而非整合的方式——这确实发生了。
数据可观测性保持不变,并在 2022 年继续增长。这一领域的参与者数量正在持续增长,现有公司越来越大,新公司成为主流,每个月都有新工具推出。
例如,在公司新闻中,有一些主要的 Ds 系列(蒙特卡洛$ 1.35 亿、解开$ 5000 万)和 Bs 系列(Edge Delta$ 6300 万、Manta$ 3500 万)。
至于工具方面,Acceldata 开源了其*台,Kensu 推出了数据可观测性解决方案,AWS 将可观测性特性引入亚马逊 Glue 4.0,纠结分拆出另一家专注于可观测性的公司。
在思想领导领域,蒙特卡洛和 T2 的 Kensu 和 O'Reilly 都出版了关于数据可观察性的重要书籍。
让事情变得更复杂的是,许多与行业相邻或处于早期阶段的公司也一直在扩张并巩固他们在这一领域的角色。例如,在数据质量领域起步之后,Soda 现在是数据可观察性领域的主要参与者。类似地,Acceldata 开始于日志可观察性,但现在它将自己标榜为“现代数据堆栈的数据可观察性”。自 2021 年分别推出系列和系列 B 以来,Metaplane 和 Bigeye 也越来越引人注目。
像去年一样,我仍然不确定数据可观测性将走向何方——走向独立还是与数据可靠性、活动元数据或其他类别合并。但在高层次上,它似乎正在向数据质量靠拢,重点是确保高质量的数据,而不是活跃的元数据。
随着 2022 年 12 月的临*,我们惊讶地发现数据世界发生了如此大的变化。
就在 9 个月前的 3 月,数据委员会(T8)成立了,我们在那里讨论了数据世界的方方面面。我们把所有热门镜头放在我们的技术、社区、氛围和未来——因为我们可以。我们处于增长模式,寻找下一个新事物,争夺看似无限的数据馅饼中的一块。
现在我们处在一个不同的世界,一个经济衰退、裁员和预算削减的世界。我们正在从增长模式转向效率模式。
不要误解我的意思,我们仍然处于数据的黄金时代。就在几周前,雪花宣布收入创纪录,同比增长 67%。
但是作为数据领导者,我们在这个数据的黄金时代面临着新的挑战。随着大多数公司开始谈论效率,我们如何才能考虑使用数据在我们的工作中发挥最大效率?数据团队如何才能成为其组织中最有价值的资源?
我仍在试图弄清楚这将如何影响现代数据堆栈,我迫不及待地想尽快分享我的想法。但我可以肯定的一点是,2023 年将是数据世界中值得纪念的一年。
2023 年现代数据堆栈的未来报告出来了! 在这里阅读 或 下载 PDF 。
准备好接受关于这些趋势的辛辣观点和专家见解了吗?我们为 2023 年的第一次大数据辩论召集了一个超级明星小组(鲍勃·穆利亚、巴尔·摩西、本·斯坦西尔、道格拉斯·兰尼和特里斯坦·汉迪)。 观看这里的录音。
我对图形神经网络的了解
原文:https://towardsdatascience.com/what-i-learned-about-graph-neural-networks-e17bb0d70a7f
卷积和注意机制在图中的应用
一个美学网络,图片来自 Alina Grubnyak
*年来,图形神经网络在机器学习领域迅速获得牵引力,变得适用于各种任务。毫无疑问,社交网络的出现在 GNNs 的成功中发挥了重要作用,然而它们也适用于生物学、医学和其他领域,在这些领域中,图代表了基本的实体。
我总是被新兴的技术和方法所吸引,因此我决定尝试并学习一些相关知识。此外,为了让知识沉淀下来,我决定写这篇文章来记下我在这次旅程中遇到的所有概念。
有条不紊地组织所有的内容可能对将来的快速复习有用,或者有希望为其他需要学习资源的人服务。
现在说的够多了,让我们从基本面开始吧!
什么是图?
如果你正在读这篇文章,你很可能已经知道什么是图,所以我不会在这上面花太多时间。
图是由节点 V 组成的结构 G ,它们之间通过边 E 连接。
图表示例
节点可以有特性,更好地描述节点本身。例如,如果节点代表人,那么他们的特征可以是年龄、性别、身高等等。
节点之间的边表示关系,即两个节点如果有关系就是连接的(想想 Instagram 上的跟的概念),如果关系对称,它们可以是无向的,如果关系不对称,它们可以是有向的。
正如我所说的,我不打算深入讨论这个问题,因为这不在本文的范围之内,但是为了便于阅读,我需要介绍一些术语。
图形神经网络简介
鉴于图形结构在我们的日常生活中如此丰富(社交网络、地图、用户-产品交互……),研究人员开始寻找能够处理它们的深度学习架构。在过去 10 年的 DL 研究中,卷积神经网络成为最幸运的架构之一,它工作于图形的一个特殊例子:图像。
图像可以被认为是图形的特殊情况,其中像素代表以网格组织的节点,它们的灰度/RGB 值是它们的特征。
网格形式的图像示例。卷积的工作原理是聚合邻域的像素值。
当您对一组像素应用卷积时,您将汇总从卷积居中的像素及其所有相邻像素获得的信息。
现在,您不能直接在图形上应用卷积,因为图形节点没有固有的顺序(与图像不同,图像中的像素由其在图像中的坐标唯一确定)。
因此研究人员想知道:我们能推广图上的卷积运算吗?
他们提出了两类方法:
- 频谱法:顾名思义,它们与频域有关。它们保留了卷积的严格概念,但理解起来有点棘手。尽管在数学上更合理,但由于计算成本,它们很少被使用。
- 空间方法:它们代表了光谱方法的一个体面的*似,尽管没有数学上的严格。更容易理解的是,它们基于这样一个概念,即每个节点都应该从自己和它的 K 跳邻居那里收集信息。
就我个人而言,我看了看光谱方法,但由于它们不是今天最常用的,我决定不给它们太多的空间,而支持空间方法,我将在这篇文章中涉及更多。
我们开始吧:图卷积网络
深度学习和卷积在图上应用的第一个成功例子出现在 Kipf & Welling,2017 中,其中介绍了图卷积网络。
他们算法背后的主要思想如下:
- 将线性投影应用于节点的所有特征向量
- 你汇总它们(*均值、总和、串联…)
- 将一个节点的投影与其相邻节点的投影组合在一起。
以下是公式中的过程:
方程式 1,GCN 层,归功于https://distill.pub/2021/understanding-gnns/
等式 1 是前面列出的步骤的数学表达式。每个节点的嵌入是通过将每个邻居投影到另一个空间,*均(但也可以使用其他类型的聚合),并将它们与节点本身的投影相结合而获得的。最后一步,像在 DL 中一样,是激活函数传递。
这太棒了,不是吗?然而,当我读它的时候,我对你是如何编码的感到有点困惑。好的,我有一个图,但是我如何有效地找到每个节点的邻居,以便组合它们的特征?简单,你用邻接矩阵一一!
邻接矩阵 A ,大小为 N ( N 为节点数),描述节点如何连接: A(v,u) = 1 如果节点 v,u 连接。
例如,如果您只想汇总一个节点的所有邻居(也称为单跳节点)的功能,您只需:
等式 2,1 跳功能聚合
现在,如果您在 k 步上不断迭代该过程,您将从 k 跳邻居聚集特征,并且上面的表达式可以容易地表达如下,其中已经添加了线性投影:
方程 3,矩阵形式的 GCN 层
请注意,原始论文没有使用简单邻接矩阵 a。作者应用了一些提高性能的规范化技巧,但为了便于学习,这足以理解概念。
因此参数 k 调节你想从学习的层数和跳数。这是一件不太明显但相当聪明的事情!但是……我该如何选择 k ?
GCNs 的一个奇特之处在于,它们通常不是深层网络,相反,它们更可能是非常浅层的(大多数时候 2 层就够了!).到今天为止,为什么浅层网络工作得更好还不清楚,但这背后有一些直觉:
- 如果网络是强连接的,单个节点只需几跳就可以到达大多数其他节点
- 许多学习任务依赖于这样的假设,即来自*节点的信息比来自远节点的信息更相关
这很酷,对吧?看起来几个层(以及参数)就能达到目的!是的,但是由于图形的大小,gcn 通常会处理可伸缩性问题。想想在一个有数百万个节点的图上应用等式 3:邻接矩阵将是巨大的!幸运的是,有论文探索了这种大图的学习技巧,比如 GraphSAGE 。
你能用 GCNs 做什么?
一旦您建立了自己的网络,您就可以开始解决以下任务了:
- 节点分类,即对图中每个节点的分类
- 图形分类,即对整个图形的分类
- 链路预测,即预测两个节点是否连通
- 节点聚类,即根据节点的特征和/或连接性对节点集合进行分组
我发现图形网络特别吸引人的地方是它们可以在两种不同的环境中使用:
- 归纳学习:在训练时,你完全不知道测试集节点,就像你处理标准的机器学习问题一样
- 转导学习:在训练时,你确实能看到你的测试集节点,因为它们是你的图形结构的一部分。但是,您不能使用它们的标签来计算和最小化您的成本函数
归纳学习(左)与直推学习(右)。在归纳设置中,数据集由多个图形组成。在直推式设置中,数据集由单个图的所有节点组成,但其中一些节点的标签被屏蔽掉了。
直推式方法是我不习惯的,因为在我通常的 ML 项目中,我从不使用我的验证/测试集进行训练。然而,图学习可能也需要来自这些集合的信息,因为它们是图结构的一部分,并且它们的特征被组合来计算每个节点的嵌入!
例如,如果给你一个用户网络,你的目标是预测他们是否是机器人,你可能会直推式地做:你将通过使用整个网络作为输入,对每个节点进行分类。然而,只有标签的子集(对应于训练集)将用于计算和最小化成本函数。
另一方面,对于图分类,您通常通过归纳来学习:您的数据集由一组图(而不是单个节点)组成,您可以将这些图分为训练集、验证集和测试集。您的网络将被优化以将每个图分配到正确的类。
成功的 GCNs 应用示例如下:
GCNs 中的注意机制:图注意网络
正如我们之前解释的,GCNs 学习的步骤之一包括从邻居那里聚集信息。这个聚合步骤可以以这样一种方式加权,以便将重要性分配给邻居,这就是注意机制和 图形注意网络 背后的思想。
该方法允许每个节点了解要关注哪些邻居,并在聚集步骤中为每个邻居指定不同的关注权重。
注意力层是这样工作的:
等式 4,图形注意力网络中的注意力层,归功于https://distill.pub/2021/understanding-gnns/
基本上,注意力机制为网络的每一条边学习一个权重。
在这个例子中,我们将注意力权重的计算简化为单个注意力头的情况。然而,你可能在同一层有多个注意力头,以不同的方式关注邻居。
与标准的 GCNs 不同,聚合系数是动态计算的,允许网络决定收集信息的最佳方式,尽管投入了一些计算能力。
这些系数是如何计算的?这个想法是学习一个评分函数 S ,它给每条边分配一个分数。这是通过对由给定边链接的节点的线性投影求和,将它们通过评分函数 S 和a 激活步骤来完成的。最后,对一个给定节点的所有邻居的分数进行归一化,获得注意力权重。
在公式中:
等式 5,边缘分数计算,归功于https://distill.pub/2021/understanding-gnns/
等式 6,注意力分数计算,归功于https://distill.pub/2021/understanding-gnns/
实现的方式有点复杂,不过,我建议看看这个回购。
结论
暂时就这样了。而且只是现在。我希望在接下来的几周里浏览更多的资源,因为仍然有一些方法我还没有探索到,甚至还没有看到。
我希望我让你相信图形学习是值得你花时间的。谁知道呢,也许它可以成为你下一个项目的可能选择。我花了一些时间来吸收所有这些东西,因为它不像其他 DL 主题那样熟悉,所以不要责怪自己,如果不是一开始一切都非常清楚(但如果是的话,也许我做得很好!).
感谢阅读!
除非另有说明,所有图片均为作者所有。
我在 Stitch Fix 学到的搭建*台
原文:https://towardsdatascience.com/what-i-learned-building-platforms-at-stitch-fix-fc5e0ec72c86
为数据科学家搭建*台的五个经验教训。
*台的蓝图。图片来自 pixabay 。注:本帖原文出现在我的 子帖 上。
为什么要搭建*台?
想象一下。你是一个个体贡献者,在某个要求你写“代码”来完成工作的公司工作。我在这里试着广撒网,例如,你可以是 Stitch Fix 的全栈数据科学家,创建模型,然后插入业务中,或者你可以是一家初创公司的软件工程师,编写产品功能,基本上是任何你必须开发一些“软件”的人,通过你的工作,业务以某种方式向前发展。总的来说,由于事情相对简单,开始并向业务交付价值是很容易的。但是持续不断地交付价值并坚持下去是很难的。你可以很容易地达到极限速度,最终把所有的时间都花在保持之前的努力上,或者与它们的细节斗争,以扩大和做更多的事情,而不是推动你的业务向前发展。那么如何预防这种情况呢?在某种程度上,你需要开始构建抽象,以减少维护成本并提高开发速度,毕竟,这是所有大型科技公司的内部工作。这些抽象构建出的是一个*台,也就是你在其上构建的东西。现在,构建 良好的 *台并不是那么简单,尤其是随着企业的发展壮大。
我很幸运地在过去的六年里专注于“数据科学工程”,并学习为 Stitch Fix 的世界级数据科学团队构建 伟大的 *台。在此期间,我亲眼目睹了许多*台的成功和失败。现在,有很多关于已经建立了什么类型的*台(见任何大型科技公司的博客)以及如何考虑建立一个软件产品(例如建立一个 MVP )的资料,但是关于如何启动一个*台和建立一个*台的资料很少。在这篇文章中,我将把我关于如何构建*台的主要经验总结成五个教训。我希望这五堂课对任何试图构建*台的人都有用,尤其是在数据/ML 领域。
背景上下文
当我在 2016 年加入数据*台团队时,杰夫·马格努松刚刚写了工程师不应该写 ETL 。我很高兴能够为在无手模型中工作的数据科学家构建功能。在当时,这是管理数据科学部门的一种前卫方式(如果你没有读过这两篇文章,那么它值得一读)。在高层次上,*台团队在没有产品经理的情况下运营,必须拿出*台能力来推动数据科学家前进,而数据科学家反过来推动 Stitch Fix 业务前进。听起来很俗气,杰夫·马格努松写道“工程师应该把自己视为‘托尼·斯塔克的裁缝’,打造盔甲,防止数据科学家陷入陷阱,产生不可扩展或不可靠的解决方案。”是真的,我们确实用我们制造的工具实现了梦想。现在,事情在实践中是如何进行的?一些人的想法和努力失败了,而另一些人获得了巨大的成功,这就是这篇文章的动机。
在我们继续之前,先快速了解一下术语。我将在一个松散的隐喻意义上使用术语“*台”——它是在之上构建的任何东西。因此,如果你是一个提供 web 服务 API、库、UI 等的人。,其他人用来在上面构建,那么你正在构建一个*台。除非另有说明,否则我还自由地使用术语“API”来涵盖您*台上的所有 UX。
经验教训
在这里,我将提出五个教训。虽然这些课程可以独立阅读,但我强烈建议按顺序阅读。
第一课:关注采用,而不是完整性
每个人都想为他们的利益相关者建立一个完美的*台,附带所有的附加功能。虽然这是善意的,但他们通常会陷入一个陷阱——在没有早期采用者的情况下构建太多。对于那些熟悉 MVP 和 PMF 这些术语的人来说,这基本上就是这节课的内容。
让我把这个放在上下文中。Stitch Fix 数据*台团队在没有产品经理的情况下运营。因此,每个*台团队都必须弄清楚要构建什么以及为谁构建。这里一个简单的解决方案可能是“只雇佣一个项目经理”,但是(1)很难找到技术人员(尤其是在 2016 年),( 2)这与我们想要的运营方式背道而驰。许多工程师不得不艰难地认识到,他们不能孤立地建造东西;离开一个季度,然后去“塔达”🎊我不保证会有人使用你的产品。事实上,那是让你被解雇的原因!
为什么会发生这种情况?好吧,如果你有一个实现各种用例的*台的愿景,那么从一开始就为所有用例构建是很诱人的。这是一个艰苦的过程,需要很长时间才能得到有用的东西。我的比喻是:如果你想建造一所房子(代表你的*台),你通常从所有的基础开始,然后向上建造,添加墙壁,天花板,然后一旦外部完成,内部——房子在一切完成之前是不适合居住或使用的。如果你以这种方式建立一个*台,很容易离开很长一段时间而没有任何东西可以展示。更糟糕的是,你浪费了很多精力去建造一栋没人想要的房子,比如只有一间浴室,却发现你的最终用户每个房间都需要一间浴室。
帮助理解我的比喻的图像。左边是“垂直向上建筑”。右边的“一下子”。图片作者。
因此,相反,人们应该设法一次为一个房间“垂直”建造一个房间,这样它就可以居住,有人可以在整个“房子”完工之前使用它。是的,继续,试着想象一所房子,其中只有一个房间的结构存在,那个房间是功能性的——这就是我想要的图像。虽然在现实世界中我们可能不会建造这样的房子,但是我们可以总是建造这样的软件,所以请原谅我。也就是说,模块化建筑最*风靡一时,所以也许我正在用这个比喻做某事……通过一次建造一个房间,当你填写房子的其余部分时,你会得到更快的确认/有时间旋转/纠正。现在,这并没有解决先建什么房间的问题,因此也没有解决先为谁建房间的问题。请记住,搭建*台也有人性化的一面。确定谁并获得他们的承诺可以说是决定你的项目成败的关键。这里有两种我认为很有效的模式:
- 采用现有的用户工具
- 与团队和特定用例紧密合作
采用现有的用户工具 Stitch Fix 雇佣的数据科学家是一批有能力的人。如果在*台的某些方面有差距,你可以肯定数据科学家自己填补了这个空白,并建立了一些东西。作为一个确定自己产品路线图的团队,我们在寻找构建和扩展的能力。继承自主开发的工具/框架/软件是非常有意义的。为什么?采用几乎是有保证的——*台团队只需要润色和概括。如果他们建了一个为他们工作的窝棚,那么进来做一次改造会给你一套非常具体的参数。这种方法的一个警告是,你需要看到一个比他们的解决方案目前提供的更大的愿景,例如,更多的功能,或支持更多的用户,否则你将做一个几乎没有好处的改造。
例如,有一个自行开发的工具,是其中一个团队为他们自己的特定业务环境开发的。这是一种配置驱动的方法,用于标准化他们团队的模型培训管道。他们构建它是因为他们需要它来解决一些非常具体的痛点。我们没有合作建造它,因为我们当时没有能力支持这样的努力(我们甚至对此表示怀疑)。一年后,突然有更多的数据科学团队听说了它,并想开始使用它。问题是它与原始团队的环境紧密相关,原始团队没有动力去支持其他使用它的团队。*台团队介入并拥有的完美问题!重要的是,我们可以看到一个更宏伟的愿景,以及它如何服务于更多的用例。请看这篇文章了解我们添加的结果和扩展。
我特别喜欢这种方法,因为:
- 你没有花时间迭代自己来决定构建什么来让人们采用它 1 。赢了。
- 你让别人来证明它的价值。赢了。
- 然后你就可以有很好的理由继承它并改进它。赢了。
注意:继承有时会带有政治色彩,尤其是当创建它的人不想放弃它的时候。如果有明确的*台责任界限,这不是一个难以下咽的药丸,但如果对创作者来说是一个惊喜,那么选项是让他们转移到*台,或者只是进行一次艰难的对话…然而,一般来说,这应该是对所有参与者的双赢:
- 对于开发工具的团队来说,这是一个胜利,因为他们现在不再需要维护工具了。
- 这对您来说是一个胜利,因为您可以接管该工具,并比其他方式更进一步地采用和增强功能。
- 这是企业的胜利,因为它没有在投机活动上浪费资源。
与团队和特定用例紧密合作 我记得与一位*台工程师的一次对话。他们回避反馈,即他们应该能够更快地交付一些东西,让人们得到它们。“不,那不可能,那要花两个月的时间”(或类似的话)。我同意,是的,这是一个挑战,但是如果你考虑得足够久,通常有很多方法可以让任何*台项目以一种可以显示增量价值的方式被分块到带来一个利益相关者。
展示增值很重要;这有助于您与您的目标利益相关者/用户保持一致。这也是降低项目风险的好方法。当构建*台时,你需要减轻技术风险,即证明“如何”将实际工作,以及采用风险 k,即是否会有人实际使用我构建的东西。用我们造房子的比喻来说,这就是我所说的弄清楚如何在不完成整个房子的情况下建造一个可居住的房间。你想让你的涉众从架构图开始,到展示样本材料,再到构建一些对他们的用例最少起作用的东西。
实际上,构建交付增量价值的一种方法是做时间框原型,并根据结果做出去/不去的决定。在这里付出很小的代价,并学会尽早终止一个项目,要比在没有减轻成功的关键风险的情况下获得大量投资好得多。通过瞄准一个特定的、狭窄的用例来做到这一点,然后确定如何通过“水*地”扩展*台以支持更广泛的用例来扩大吸引力。例如,当我们开始构建我们捕获机器学习模型的能力,并且不需要数据科学家来部署模型时,我们与一个正在着手构建新计划的团队进行了非常密切的合作。你可以把他们视为“设计伙伴”。他们有一个狭窄的用例,他们想用它来跟踪构建了什么模型,然后有选择地批量部署他们的模型。这使我们能够将注意力集中在两个部分:保存他们的模型,并拥有一个批处理作业操作符,他们可以将该操作符插入到他们的离线工作流中进行模型预测。将它约束到一个有截止日期的团队中,给了我们一些明确的约束来增量交付。首先是保存模型的 API,然后是编排批量预测的作业。因为我们有一个用这些能力支持其他团队的愿景,所以我们知道不要过度关注这一个团队的工程设计。通过与他们的密切合作,我们确保了我们的早期采用,这有助于提供关于我们预期的 API 和批量预测功能的宝贵反馈。反过来,他们得到了一个支持和倾听他们的担忧的合作伙伴,并与他们保持一致以确保他们的成功。
作为一个敏锐的读者,你可能会认为这听起来像是敏捷项目管理应用于构建*台。我的回答是,你基本上是对的,但许多*台工程师可能没有这种框架或指导来看到这种联系,尤其是在产品经理会为你做这种事情的世界里。
第二课:你的用户并不都是*等的
作为工程师,我们热爱创造可能性。对我们来说,想要确保任何人都可以利用我们提供的*台做任何事情是非常容易的。这是为什么呢?好吧,我在这里是刻板印象,但我们通常希望*等,在提供支持和功能方面*等地对待我们为之构建的每一个用户。
这是一个错误。
两个事实:
- 你为之建立的用户会落在一个能力谱上(如果你愿意,可以称之为钟形曲线)。有普通用户,也有离群用户。离群用户是你最老练的用户。
- 您添加到*台中的特性对开发成本和维护的贡献并不相等。
根据我的经验,外部用户希望您的*台支持更复杂的功能/需求,因为他们希望您支持他们更复杂的需求。这通常意味着实现这样一个特性需要更高的开发成本和维护成本。所以你真的要问问自己,我是不是应该:
(1)完全为这个特性设计?
(2)然后实际花时间构建和维护它?
或者(3)推回去,告诉用户他们应该自己构建。
你可能会认为我所说的只是一个过度工程化的例子。虽然,是的,这确实有那种味道,但过度工程与解决方案是什么有更多的关系,而不是实际决定你是否应该支持*台中的某些功能。使用我们建造房子的比喻,你应该建造一些复杂的定制家庭自动化系统,因为有人想要声控灯,还是应该告诉用户自己想办法提供这种功能?
除非你想建立一个全新的*台并寻找客户,或者有令人信服的商业理由这样做,否则,作为一个*台建设者,你应该学会说不(当然是以一种好的方式)。以我的经验来看,这些特征最终往往与投机行为有关。我发现在决定是否应该支持之前,最好是等待,并确保这项工作首先被证明是有价值的。请记住,这些问题来自经验丰富的最终用户,因此他们很可能通过自己提供支持来解决问题。请注意,如果您采用这个策略,那么它可以融入到第 1 课中的“采用自主开发的工具”策略中。
第三课:抽象出系统的内部结构
随着时间的推移,随着您所在领域的技术提供商的成熟,在一个组织内构建的基础设施/工具越来越少。作为一个*台构建者,你总是会与一些第三方供应商整合,例如 AWS、GCP、MLOps 供应商等。这是非常诱人的,尤其是如果供应商解决了您想要解决的确切问题,直接向您正在构建*台的用户公开他们的 API,因为这是交付一些价值的快速方法。
向最终用户公开这样的 API 是一个很好的方法:
- 供应商锁定。
- 痛苦的迁徙。
为什么?你已经放弃了控制用户 API 的能力。
相反,提供你版本的 API2。这应该采用封装该供应商 API 的轻量级包装的形式。现在很容易做得很差,把你的 API 和底层 API 结合起来,例如使用相同的措辞,相同的数据结构等等。
你的设计目标应该是确保你的 API 不会 泄露你正在使用的底层内容。这样,您保留了在不强迫用户迁移的情况下更改供应商的能力,因为您保留了在不要求用户更改代码的情况下进行迁移所需的自由度。这也是简化使用供应商 API 的体验的好方法,因为你可以通过代表用户做出共同的决定来减轻用户的认知负担,例如,事物如何命名、结构化或存储。
例如,我们在 Stitch Fix 的系统中集成了一个可观察性供应商。直接公开他们的 python 客户端 API 意味着,如果我们想要改变/迁移,将很难做到。相反,我们将他们的 API 包装在我们自己的客户端库中,确保使用内部术语和 API 数据结构。这样,如果我们将来需要,就可以很容易地替换掉该供应商。
请注意,如果您使用姐妹*台团队的 API,这也不是一种不合理的方法。一些要思考的反问,要不要掌握自己的命运?或者,与他们的目标和系统设计相结合?
第 4 课:体验用户的生命周期
如果你和产品经理一起工作,那么他们表面上应该知道并意识到你的用户的生命周期,在你构建*台时帮助指导你。由于我们在 Stitch Fix 没有产品经理,我们被迫自己做这件事,因此有了这一课。现在,即使你有产品经理,我猜他们仍然会感谢你承担一点这个负担。
随着时间的推移,您为最终用户提供的功能和体验会产生下游效应。虽然掩盖用户工作流的复杂性可能很容易,特别是如果它们延伸到您的*台之外,但这样做将不可避免地导致租户和社区问题(用我们的住房比喻来说)。
租户问题通常是小问题,比如同时使用水龙头会降低每个人的水压。这些问题只需要一些小的调整就可以解决/缓解。例如,你让启动参数化作业变得非常容易,人们用工作堵塞了你的集群,除此之外,你的云费用也在飙升。这里有什么快速解决办法?也许您可以确保作业始终标记有用户和 SLA,这样您就可以快速确定谁在利用您的所有云资源/使用它来根据优先级决定将任务路由到哪里。或者,只要确定你需要跟谁谈,就能干掉他们的工作。
“社区问题”是更大的问题。比如说你建了一个很牛逼的房子(*台),可以支撑很多租户(用户),但是它周围的街边停车位却微乎其微;你没有说明这一点。每当有人(即潜在用户)想要参观房子时,他们都很难停车,并且不得不走很长的路。如果不尽快修复,这些问题真的会损害您的*台。为了说明这一点,假设你专注于让用户工作流程的一个方面在你的*台上变得非常简单,但是你忽略了它是如何融入他们的大环境的。例如,您可能已经增加了某人需要完成以投入生产的工作总量,因为他们的开发工作不能直接翻译到您的生产*台系统中。在这种情况下,最初热情高涨的*台解决方案会变成恐惧,因为最终用户会一次又一次地碰到一个特殊的症结。当最终用户想出自己的工具来解决这个问题时,这种情况就出现了。
那么你应该怎么做呢?站在最终用户的立场上,从宏观的角度来看,你所提供的东西是如何适应他们需要完成的工作的。以下是一些缓解问题的方法:
- 做一个最终用户:实际使用你的*台,并在上面进行生产。
- 假设建模:画出用户工作流程图,然后考虑你所提供的任何*台特性的分支(适用于任何情况)。
- 引入最终用户:引入用户进行内部轮换——他们应该能够理解并向您和您的团队解释这一点(引入某人来帮助您的用户更好地发声)。
- 建立关系:与你的同事建立足够深的信任和关系,这样你就可以问一些直截了当的问题,比如“你讨厌你的工作流程的什么?”“如果有什么事情是你在生产 X 时不需要做的,那会是什么?”。有时候,你的用户只是被固定下来,接受他们不能改变世界的事实,而事实上他们可以通过给你反馈来改变世界。其他时候,他们没有足够的安全感来给你真正需要的反馈,所以你需要建立信任来实现这一点。
如果你做上述事情的时间足够长,你可以开始更容易地直觉到将要发生什么,从而确定你可能需要什么额外的功能,或者预期和计划的潜在问题。
第 5 课:两层 API 技巧
在这一课中,我提出了我在着手构建*台时的高层次思考框架。这基本上是我想出的帮助在 Stitch Fix 交付成功*台的剧本。我承认,由于严格的要求/您的*台的性质,可能并不总是有可能实现这种方法。但是当你构建更高层次的抽象时,你应该能够应用这种思维方式。否则,当你读这一课时,你会希望看到与前四课的联系。但首先,要有动力。
动机 (1)还记得你*台上要求复杂特性的老练用户吗?既然你说“不,你自己去建吧”,他们很可能会去做。但是,如果他们成功了,你会想要继承他们的代码,对吗?如果可以的话,你不想让这个过程变得更简单吗?
(2)当提供*台功能时,很容易编写非常耦合的、不可概括的代码,即很难拆分和扩展/重用。如果您刚刚起步并需要获得一些东西,这并不是一件坏事,但是当您想要扩展您的*台时,这就成了一个问题。根据我的经验,特别是如果你没有时间做“技术债务”项目,这种耦合的代码很容易滚雪球,从而严重影响你的团队的工作交付。
(3)在第三课中,重点是不要泄露供应商 API 细节。我认为这是一个很好的方法,实际上你创建了两层 API,但是它非常关注供应商 API 封装的微观问题。我们如何进一步扩展这种想法,并为我们的整个*台提供一些框架?
两层 API 为了帮助维护和发展*台,您应该考虑构建两层 API:
- 底层允许一个人构建“任何东西”,但是是以一种受限的方式。
- 第二个更高层次提供了一种认知上不太费力、固执己见的做事方式。
用我们这里的房屋建筑类比,下层代表房子的地基、管道和电气;它限制了房子的形状和表面积。更高层的 API 对应的是一个房间是什么;它的功能和布局,例如,对于你的用户来说,你已经放置了冰箱、炉子和水槽,形成了一个厨房三角形,因为对于任何做饭的人来说,这都是一个很好的设置。如果有人想要更复杂的房间,我们可以轻松拆除墙壁,找到水管和电线,这样他们就可以随心所欲地重新布置房间。
让我们更具体地展开这两层。
与房屋隐喻相关的两层 API。图片作者。
这个底层 API 层是什么? 这个“低级 API”的目的是你可以表达任何你想让你的*台做的事情,也就是说,这个 API 捕获基本级别的原语。也就是说,这是你的基本能力层,使用它意味着你可以控制所有的细节。
这一层的目标不是向您的最终用户公开它。相反,目标是让你给自己定义一个清晰的基础(双关语,我们的房屋建筑比喻),以此为基础进行建设。因此,你应该把自己视为这一层的主要目标。例如,这一层可以具有用于以各种格式读写数据的 API,在哪里使用它需要决定文件名、位置、哪种格式使用哪种函数等等。
这第二个 API 层是什么? 这个“高级 API”的目的是为普通用户提供一个简单的体验,这个体验完全建立在你的低级 API 之上。您实际上是在这个 API 中定义了一个约定来简化用户的*台体验,因为您已经为他们做出了一些较低级别的 API 决策。例如,基于较低层的示例,该层可以公开用于保存机器学习模型对象的简单 API。这是一个更简单的 API,因为您已经决定了文件名约定、位置、格式等。来保存模型,这样您的*台最终用户就不必这样做了。
这一层的目标是成为*台最终用户的主要 API 接口。理想情况下,他们可以用它完成所有需要的事情。但是如果他们需要做一些更复杂的事情,而这个更高级别的 API 中没有,他们可以下降到你提供的更低级别的 API 来构建他们自己需要的东西。
为什么两层应该起作用 强迫自己思考两层你:
- 让你和你的团队更难将关注点结合在一起。因为,从设计上来说,你是在强迫自己决定如何将你的*台上一个更有主见的能力(更高级别的 API)分解成基本级别的原语(更低级别的 API)。
- 因为您定义了基础层,所以您可以更容易地限制*台的形成方式。这有助于为您支持的更复杂的用户提供支持,他们可以剥离固执己见的层并做更复杂的事情,而无需您明确支持。通过以这种方式支持更复杂的用户,您有时间考虑是否应该以一流的方式支持他们更复杂的用例(参见第 1 课的“采用现有用户工具”部分)。
现在你们中的一些人可能会反对支持两个 API 的想法,因为这听起来像是 API 开发、维护和版本控制的一大堆工作。对此我说,是的,但是如果你遵循良好的文档和 API 版本实践,你无论如何都要付出代价。无论是你团队的内部还是外部,都不应该有太大的改变,除了你沟通的方式和地点。如果您采用构建单一 API 层的替代方法,您的初始成本可能会更低,但未来的维护和开发成本将会高得多;你应该预料到你的*台需要随着时间而改变。例如,与安全相关的更新、主要库版本、新功能等。我在这里的论点是,使用两个 API 层比使用一个 API 层更容易做到这一点。
两个简单的例子 为了帮助阐明这一点,我们来看两个两层 API 思想的例子。
示例 1 例如,当我们引入我们的基于配置的方法来训练模型时,它是建立在我们的模型包络方法之上的,用于捕获模型,然后启用部署。因此,如果有人不想使用我们的配置方法来创建模型,他们仍然可以通过使用 API 来利用模型信封的好处。
例 2
在 Stitch Fix 上,我们让构建 FastAPI web 服务变得很容易,但是用户实际上并不需要知道或者关心他们正在使用 FastAPI。这是因为他们使用了更高级的自以为是的 API,使他们能够专注于编写 python 函数,然后将这些函数转化为运行在 web 服务器上的 web 服务端点;他们不需要通过自己编写代码来配置 FastAPI web 服务,因为已经为他们处理好了。该功能构建在 FastAPI 之上,作为基础层。如果用户想要比上层固执己见层所能提供的更多的功能,可以直接调用下层的 FastAPI API。
摘要
感谢阅读!以防你一直在偷东西,这是我想让你带回家的东西。要构建*台:
- 首先为特定的垂直/用例构建,并交付增量价值,在这种情况下,您要么继承一些有用的东西,要么瞄准一个特定的团队,该团队将在您的工作准备就绪时采用您的工作。
- 不要*等地为每个用户构建。让老练的用户自己保护自己,直到证明你应该为他们投入时间。
- 如果可能的话,不要泄露底层供应商/实现细节。为底层 API 提供您自己的瘦包装器,以确保当您必须对*台进行更改时,您有更多的选项可以控制。
- 活出用户的生命周期。记住,你提供并塑造了用户使用你*台的体验,所以不要忘记宏观背景和你的 UX 的含义;喝你自己的香槟/吃你自己的狗粮,这样你就能确保你能预见/理解你所提供的东西的共鸣影响。
- 考虑提供两层 API 来保持*台开发的灵活性:
(i) 考虑一个有界的基础 API 层。也就是说,你希望你的*台提供什么样的基本级别的原语/功能,从而为你自己在之上构建什么样的基础。 (二)想想一个自以为是的更高级别的 API 层。对于普通用户来说,这一层应该比基础 API 层简单得多。为了处理更复杂的情况,对于更高级的用户来说,仍然有可能使用你的低级基础 API。
如果你不同意,有问题或意见,我很乐意听到他们在下面。
关闭
我很高兴能与你分享我在 Stitch Fix 工作期间获得的见解(希望它们有用!).然而,自从我离开后,我不仅仅是在编辑这篇博客。我一直在盘算着自己搭建一个*台。敬请期待!
此外,特别感谢 Elijah、Chip 和 Indy,他们对本文的一些草稿给出了宝贵的反馈;错误和遗漏都是我的。
出发前:你可能感兴趣的链接
📣跟我来:
⭐结账github—stitch fix/Hamilton:
- 用于定义数据流的可扩展通用微框架。你可以用它来构建数据框架、数字矩阵、python 对象、ML 模型等等
🤓阅读一些博客:
- 配置驱动的机器学习管道|缝合修复技术—多线程
- 免费部署 Stitch Fix 的数据科学家的机器学习*台
- 函数和 Dag:Hamilton,用于熊猫数据帧生成的通用微框架
- 非常有用的*台团队| Stitch Fix 技术——多线程(不是我写的)
进行数据科学面试的经验可以帮助你赢得下一次面试
数据科学面试技巧和准备策略
去年 5 月毕业后,我加入了一个数据科学和领导力发展轮岗项目,在这个项目中,我的日常任务不仅包括数据科学工作,还包括参与社区和项目开发。我参与项目开发的方式之一是为暑期实习项目进行面试。在此期间,我对成功面试的要素有了深入的了解,并从不同的角度理解了面试过程。在这篇文章中,我将概述一些你可以在下次面试中脱颖而出的技巧和行动。
图片来源: Unsplash
1.通常,行为面试表现是关键的区别。
当比较这个职位的候选人时,许多候选人在技术上都很强。如果是这种情况,行为部分的权重会增加。认识到这一点很重要,因为很多时候,一个候选人被选中是因为他们在行为问题上的表现。练习下面的三个问题,几乎总是在面试开始时被问到,会让你自信地回答问题。
- 说说你自己吧。
- 你为什么对这家公司感兴趣?
- 你为什么对这个角色感兴趣?
自信地开始面试会对面试的其余部分产生巨大的影响。如果你没有时间准备其他东西,对这三个问题有一个扎实的答案会让你自信地开始面试。这也给你时间冷静神经:)
2.准备比你想象的更重要。
我必须承认,有很多面试是我没有准备的。有一些面试,我以为我已经准备好了,但当我收到拒绝信时,我很失望。当我进行面试时,我突然意识到,当你是面试官时,很容易看出候选人准备不足。也许,候选人确实做了准备,但有一个因素会降低你准备的交付——紧张。最好比你认为需要的准备得更多,因为当面试的时候,你会更加自信,这会抵消你可能感到的紧张。
准备提示:
下面是一个准备框架,你可以用它来确保你为下一次面试做好准备:
研究
面试前的调研,我喜欢用营销中常用的 5C 框架。对于以下每一个类别,试着沿着以下问题的思路思考。
- 公司:公司的使命是什么?他们提供什么产品?是什么让这家公司与众不同?
- 客户:公司的主要客户是谁?他们的痛点和需求是什么?他们产品的市场规模有多大?
- 合作者:公司的主要合作伙伴是谁?公司的价值链是什么,合作者在这个过程中扮演什么角色?
- 竞争对手:你面试的公司的直接竞争对手是谁?间接竞争呢?竞争对手产品的主要特点是什么,这些产品的区别是什么?
- 背景:目前世界上正在发生的可能影响公司的事情(新技术、法律、社会等)。)?公司目前面临哪些威胁和机遇?有哪些关键的行业趋势?
简历上的数据科学项目
对于数据科学相关的项目和工作经验,我建议为你的每个项目浏览一下 CRISP-DM 框架。通过这一过程,你将能够清楚简明地解释从业务理解到评估和部署的整个过程。以下是一些你应该能够回答的关于简历中项目的问题:
- 业务理解:定义你要解决的问题。大多数情况下,问题并不明确,需要由数据科学家协调利益相关者来决定解决什么问题。这个项目的主要目标是什么?项目的成功标准是什么?有没有一种方法来评估项目的影响/定义 ROI?我们可以比较的基准性能是什么?
- 数据理解:你是如何为你的项目收集数据的?数据来源是什么?数据的大小是多少,有什么特点?在探索性数据分析过程中,您发现了什么?
- 数据准备:你使用了哪些数据预处理技术?数据中有可能影响您的项目的潜在问题吗?你是如何处理缺失的价值观的?你使用了什么特征工程方法?
- 建模:你建立了哪些模型?你是怎么训练模特的?
- 评估:你选择最终型号的因素是什么?你评估了哪些评估指标?为什么选择指标“X”而不是指标“Y”(必须联系到业务问题,并解决数据的任何潜在问题,如不*衡的类等。)?
- 部署:您的模型是如何部署的?你所做的工作如何与业务问题联系起来?你的项目有什么影响?
"成功的努力始于准备。"—乔·吉布斯
3.签到(尤其是技术问题)
有时候面试官不是看你的回答有多专业,而是看你是否能解释事情如何运作的大背景。这就是签到非常有用的地方,因为如果有必要的话,你可以让面试官要求你更深入地探讨一个话题。对于概念性的问题,先从大的方面入手,问问面试官他们是否想让你更深入,然后再做相应的处理。特别是对于数据科学面试,工作的一部分是能够向非技术利益相关者传达技术概念,因此能够向面试官展示你拥有这一技能非常重要。
4.当你感到停滞不前时,暂停下来,放慢速度
花点时间,澄清面试官的问题,要求一些时间来整理你的想法,这是没问题的。我主持的最好的面试的一个共同点是,候选人在回答问题之前花时间整理他或她的想法。如果他们不知道某个问题的答案,他们会说他们还没有了解这个概念/主题。然而,他们也试图回答这个问题,并表示他们期待着了解更多关于这个话题。
当你不知道答案时,这里有一些东西可以给你的面试官看:
- 表现出学习的意愿和好奇心。
- 表明你不知道解决方案,但试图尽你所能回答。
- 到了提问的时候,可以考虑问问面试官如何解决问题,或者你不知道的问题的解决方案。这说明你对学习有兴趣。
5.一定要让面试官看到你的个性。
很容易忘记面试是双向的。不仅仅是公司评估你是否适合这个职位,你也要评估公司看它是否适合你。面试时紧张是正常的,但如果你能让自己对面试感到兴奋,并展示你的个性,这将有助于你与面试官建立联系。在一天结束的时候,面试你的人在寻找他们愿意每天一起工作的人。技能是可以教授的,但是展示你是一个令人愉快的共事者可能是你获得这份工作的决定性因素。
我从玩了一百多万个单词游戏中学到了什么
小心!这篇文章包含了一些剧透
图片作者。
好吧,完全公开:我实际上没有玩过一百万个 Wordle 游戏,但我写了一个 Wordle 模拟器。为什么?因为我想更多地了解游戏的动态,并评估人们在网上讨论的一些策略,特别是那些讨论“在单词开头使用的最佳单词的。以下是对所采取的方法的描述以及我从中学到的东西。
注意:在这篇文章中,我将讨论一些好的单词猜测。我不会掩饰这些话,因为它们已经在别处、网上和媒体上被广泛讨论过了。然而,我会掩饰通过这种分析发现的小说“最佳”单词,以便读者可以在没有收到不受欢迎或不想要的提示的情况下阅读文章。在文章的最后,我将为那些感兴趣的人揭示这些新单词。这并不是说有任何启示,但我想尊重那些对这里采取的方法感兴趣,但不希望任何可能破坏他们未来生活乐趣的暗示的人。
TLDR;
下面讨论的对 Wordle 的模拟*似于一个强大的 Wordle 玩家,为了这个分析,我模拟了超过 100 万个游戏,使用了超过 400 个不同的(精心挑选的)种子/起始单词集。完整的技术细节和发现将在下面讨论,但主要结果的总结包括以下内容:
- *均 95%的目标单词可以在 6 次猜测内解决,*均游戏时间大约为 4 轮。
- 到第三次猜测的时候,一个好的玩家将会找到大约 4 个目标字母,其中 2 或 3 个在正确的位置上。
- 并非所有的目标单词都被同等地创建。在模拟中,挂钩和舱口在 90%的情况下未能解决,而升起和外星人总是被解决,并且通常在 3 个回合内。
- 你用来开始写单词的种子单词很重要。即使对于这里测试的精心选择的单词,我们也发现有些单词比其他单词更好。一些起始词/种子词能够在 80%的时间里在 4 轮>内解决一个典型的单词,相比之下,其他种子词只能解决 60%的时间。
- 提供的数据表明,从一个或两个单词的正确组合开始比依靠一个好的三个单词的组合更好,因为使用固定的第三个单词意味着你将忽略可以从前两次猜测中收集到的有用信息。然而,最好的一个单词开头并不比最好的两个单词开头好多少,即使你会忽略第一轮的一些信息。
- 有一个可识别的单个单词和一对单词,它们提供了一个明显比其他测试单词更好的单词开头;当对大量的 Wordle 游戏进行评估时,这些'最佳'种子导致最短的*均游戏时间(每场游戏约 3.6 回合),其中很大一部分(46%-48%)游戏在 3 回合内完成。
什么是沃尔多
Wordle 是一款简单却引人注目的在线猜词游戏,最*在互联网上风靡一时。玩家每天有一次玩单词游戏的机会,每天都会选择一个新的目标单词。
目标是让玩家根据一系列最多 6 次的猜测,推断出一个 5 个字母的目标单词。对每个猜测进行评估并进行颜色编码,以指示哪些字母(如果有的话)包含在目标单词中(黄色),哪些字母在正确的位置上(绿色),以及哪些字母在目标单词中不存在(灰色)。这样,随着每一个新的猜测,玩家得到更多关于目标单词的提示。玩家可以选择使用或忽略一些或所有这些提示来产生他们的下一个猜测;有一个(更具挑战性的)游戏版本,玩家必须用每个新的猜测来满足所有当前的提示。
来自 https://www.powerlanguage.co.uk/wordle/的文字截图
上面的例子显示了一个正在进行的游戏,在 3 轮(猜 3 次)之后,在猜对目标单词之前。第一次猜测显示' n 和' t '在目标单词中,尽管位置不正确,第二次猜测表明' a 也是目标单词的一部分,尽管不是它的第一个字母。这前两个猜测也排除了一些字母的进一步考虑(“ s ”、“ o ”、“ r ”、“ d ”、“ i 【T21”)、“ e ”、“ u ”)。有了这些提示,玩家在第三轮取得了很好的进展,猜中了“ t ”、“ a ”、“ n ”、“ g ”,都在正确的位置上,只剩下一个字母来完成游戏。
世界模拟器
编写一个 Wordle 模拟器需要一个合适的 5 个字母的英语单词的数据集。我通过汇集一些不同的在线词典和数据集建立了这样一个数据集,包括一个常见英语单词的数据集和一个常见 T2 人名的数据集。这些数据集是公开的,容易获得。我从英语单词数据集中剔除了人名,并选择了一组 2500 个常见的 5 字母单词,我认为这是 Wordle 使用的数据集的一个很好的*似,尽管毫无疑问它并不完美。
至于模拟器的逻辑:给定一个目标单词,基本思想是迭代多达 6 次猜测,将每次猜测与目标单词进行比较,并更新越来越多的关于被发现在目标单词之内或之外的字母及其正确和不正确位置的约束。这些约束可用于在挑选下一个猜测时排除不兼容的单词。每个猜测必须是数据集中的一个单词,当玩家猜中正确的单词或猜不到时,游戏停止。
为了帮助指导下一个猜测的选择,模拟器根据可能的适合性对兼容的单词进行评分。为此,我目前使用数据集中单词的唯一字母的(固定)频率之和。这样,字母更频繁的兼容单词比字母更不常见的单词更容易被选择。按照现在的情况,模拟器总是选择下一个猜测,该猜测与迄今为止学习到的所有约束的兼容。这种方法可能会以一种更符合强大的 Wordle 玩家的方式来模拟游戏,对于未来的工作来说,削弱模拟器的游戏风格以更好地接*普通玩家可能是有意义的。做到这一点的一种方法可能是在如何选择新单词中增加一些随机性,或者可能是通过放松一些约束,使得不是每个选择的单词总是保证满足所有当前的约束。我会把这个留给以后的工作。
世界开幕式
Wordle 的一个不寻常的特点是玩家的第一个单词必须在没有任何关于目标单词的信息的情况下选择,这导致了很多关于最佳第一个单词的猜测。有些词可能比其他词更好吗?寻找并坚持一个好的开场白值得吗?
具有更多独特字母的单词应该比具有重复字母的单词表现更好,理由是更多独特字母意味着有更多机会与目标单词匹配?例如,像“ mamma ”这样的单词,有两个独特的字母,与所用数据集中 48%的单词至少有一个字母相同。把这比作一个像“承认”这样的词。它的 5 个独特的字母(包括“ mamma ”的“m”和“a”)意味着它有一个与大约 82%的潜在目标单词匹配的单个字母。换句话说,如果您以' admit '开始下一个单词,那么您将在大约 82%的情况下生成与目标单词的单个字母匹配,*均而言' admit '将生成 1.29 个正确的字母匹配。
这种策略的一个变体是使用含有大量元音的单词,因为大多数,但不是全部(synth’、 lynch 等)。)5 个字母的单词包含元音。一个很好的候选词是' audio ',使用它作为您的第一个单词将在大约 91%的情况下生成至少一个匹配的字母——我们将这种重叠称为单词的覆盖范围,因此我们会说' audio ' 覆盖了 91%的目标单词——*均而言,您可以期望找到大约 1.33 个与目标单词匹配的正确字母
语言学家对沃尔多也有很多看法。最*的一篇文章强调了各种语言限制是如何共同决定似是而非的字母顺序的: tr 可以用在单词的开头,但不能用在结尾,而“ ng 可以用在结尾,但不能用在开头。在选择开头词时,这并不可行,但这样的观察可能有助于以后的猜测。
然后是数学家,他们指出考虑字母概率可能是有用的,因为重叠更有可能出现在有许多常见(高概率)字母的单词中,例如' e '、 s '或' t' 。如上所述,我们可以通过计算每个单词的唯一字母的频率/概率之和来给每个单词打分,然后挑选得分高的单词,如roast,作为我们的初步猜测,同时避开得分低的单词,如edged,即使edged包含一直流行的字母e。“roas”的覆盖率刚刚超过 92%,*均来说,它将提供 1.75 个字母匹配。相比之下,的覆盖率略高于,*均只有 0.75 个字母匹配。
这种字母概率的想法把我们带到了一个重要的数学分支,叫做信息论,,它提供了一个管理信息和消息的编码和传输的规则的正式处理。一个关键的概念是 熵 的概念,它也可以用来估计一条消息中包含的信息量——与其含义无关——高熵词,如“rose”也是很好的候选词(95%的覆盖率,*均有大约 1.95 个字母重叠)。
沃尔多集合覆盖问题
到目前为止,我们一直在谈论最初的单词猜测——用来让我们开始的单个单词——但是后续的猜测呢?我们必须在接下来的所有回合中靠自己的手段吗?或者有没有固定的第二个和第三个词可以在大多数情况下有所帮助?原来,理论计算机科学中的一个重要问题, 套盖问题 ,在这里可以帮到我们。从一个角度来看,下面是这个问题的一个版本:
保证与每个可能的目标单词至少有一些重叠的最小单词集是什么?这个最小单词集称为最小集合覆盖。
由于超出本文范围的原因,(最小)集合覆盖问题很难解决。它是一个所谓的 NP-Complete 问题,意思是虽然验证一个特定的解是否有效很容易,但是一旦找到,实际找到解是非常耗时的;至少我们至今没有发现任何捷径,捷径可能不存在。
尽管寻找(最小)集合覆盖是困难的,但是我们有有效的算法来识别接*的*似。例如,在 Wordle 的情况下,我们可以从具有最高覆盖率的单词开始;也就是说,它至少有一个字母与最多的其他单词重叠。这是我们封面的第一个词。接下来,我们消除当前集合覆盖所覆盖的所有单词,重新计算剩余单词的覆盖分数,并识别具有最高覆盖的剩余单词,然后将其添加到集合覆盖中。我们重复这个过程,直到没有更多的单词需要覆盖。这被称为贪婪算法,因为在每次迭代中,我们贪婪地提交下一个得分最高的单词。不能保证产生最佳的集合覆盖,因为这样的集合覆盖可能需要一个不在最高覆盖单词中的单词,但是它应该使我们接*。
我的直觉是,如果我们尝试这样做,那么我们可能需要 5 或 6 个单词来覆盖我们数据集中的 2500 个单词。鉴于你只有 6 次猜测的机会,这样的结果可能并不那么有用。然而,当我发现一个只有两个字的封面时,我很惊讶。也就是说,只使用两个特定的单词作为开始的两次猜测保证了与目标单词中至少一个字母的匹配,而不管选择了哪个目标单词。当然,对一个字母使用两次猜测可能听起来并不那么吸引人,但*均来说,这两次猜测会让你得到目标单词中的 2.88 个字母,68%的情况下会让你得到至少 3 个目标字母。此外,在 60%的时间里,这些字母中至少有一个会处于正确的位置。只猜两次就不错了!
然而,我们可以做得更好。在上面我使用了一个单词的覆盖率分数作为选择封面的基础。我们可以尝试其他方法来选择单词,比如前面提到的:选择具有最高字母概率得分或最高熵得分的单词。结果是,这两种方法都导致 3 个单词的集合覆盖,也就是说,需要 3 个单词来完全覆盖整个集合,但是使用这 3 个单词,我们得到 3.78 个字母的*均重叠,并且 65%的时间我们将得到 5 个匹配字母中的 4 个。此外,三分之二的时间这些字母中的一个将处于其正确的位置,三分之一的时间两个字母将处于其正确的位置。当然,作为这些猜测的结果,你也会学到很多不在目标单词中的字母。
生成种子词
因此,在这个阶段,我们可以通过使用覆盖率、字母概率和熵选择单词,使用上述过程来识别 3 个不同的集合覆盖。然而,这种贪婪算法并不能保证找到最好的集合覆盖,它值得我们扩大搜索范围。我们可以从不同的(好的)单词开始搜索。在这项工作中,我使用覆盖率和熵来集中前 100 个得分单词,以生成 200 个可能的集合覆盖,其中一些包含 2 个单词,一些包含 3 个单词;事实上,他们创造了 197 个独特的封面。我还包含了第一个单词,以及每个单词的前两个单词作为附加的种子单词;这些子集不是有效的集合覆盖,但是它们通常覆盖大多数单词,因此也应该提供一个良好的开端。最终结果是 471 个唯一的种子词集合的列表,每个集合包含 1 - 3 个词。
毫不奇怪,这些词包括其他人通常建议作为良好的单个词或成对词与 Wordle 一起使用的词,如'rise'、' audio '、' notes '、' resin '、' stare ,以及许多流行的双词集,如'rise'后跟' count '和' notes '后跟' laird 。
从 30 年的世界中学到的教训
我们现在准备运行我们的 Wordle 模拟实验。每次模拟运行将使用 471 组种子单词中不同的一组作为其初始猜测,并且每个种子将用于对 2500 个可能的目标单词进行 Wordle。因此,我们有效地模拟了给定种子集在完整的 Wordle 游戏运行中的使用(相当于几乎 7 年的 Wordle,基于每天一个单词),总共 1,177,500 (471 x 2,500)个单独的游戏,结果是 4,714,791 轮游戏;出于这种分析的目的,我们排除了由种子单词解决的目标单词,剩下 1,176,614 个游戏和 4,713,381 个回合。
这可能更容易理解为 471 个玩家玩了将* 7 年的 Wordle,每个玩家都使用他们自己最喜欢的一套单词。如果玩一个普通的 Wordle 游戏需要 15 分钟,那么这相当于 30 年的实际游戏时间;幸运的是,我的笔记本电脑可以在 6 小时内完成这项工作。
我发现了什么?让我们从一些总结结果开始,从目标单词在特定一轮游戏中的分数开始(1 到 6)。下图显示,*均来说(在所有目标单词和种子猜测中),47%的游戏在第四轮以正确的目标单词结束。略高于 4%的游戏需要全部 6 轮,类似数量的游戏无法在 6 轮内解决;请记住,在这个模拟中,我们的模拟器像一个强大的玩家一样使用高质量的初始猜测,因此经常玩游戏可能与更长的游戏和更大比例的不成功游戏相关联。
按回合计算的成功的世界扑克游戏的分数(图片由作者提供)。
随着游戏的展开,每猜一个新单词,你能学到多少?这如何帮助约束可能的目标单词集?下面我们来看看每轮新猜猜看,正确和不正确字母的数量,以及正确和不正确字母位置的累计数量。例如,第一个图(左上方)集中在目标单词中的字母及其位置,虽然第一次猜测通常在第三次猜测时发现少于 2 个目标字母(大多数在不正确的位置),但一个强有力的玩家将*均定位大约 4 个目标字母,其中 2 或 3 个在正确的位置。同样,到第 3 轮,大约 8 个不正确的字母将被知道,玩家将获得大约 16 个约束条件来指导他们搜索目标单词。这些限制将极大地限制第 3 轮后剩余的兼容单词集,因此大约 70%的游戏在第 3 轮后成功结束(对于使用强种子的强玩家)。
作者图表。
简单和困难的目标词
是不是有些目标词比较难解?是的。当在起始词的所有种子集中取*均时, hitch 和 hatch 是最不频繁解决的目标。模拟器在 90%的时间里无法解决这些问题,当它们能够解决时,这些单词只能在大约 5%的时间里在 3 轮或更少的回合中被定位。另一方面,像'兴起'、外星人'、过道'、加注等单词,在 66%以上的游戏中,可以 100%的时间在 3 轮或更少的回合内解决;从这个意义上说,这些都是 Wordle 最容易攻击的目标。
获得良好的开端
让我们回到最主要的问题:哪些词适合作为开场猜测。这些高质量的起始词中有一些比其他的更好吗?或者所有的种子在引领短期游戏成功的可能性方面都是相似的吗?是尝试 1 字、2 字、3 字种子好?哪些是最好的 1、2、3 字种子?
下面我们可以看到 1 个(蓝色)、2 个(橙色)和 3 个单词(绿色)的种子的*均游戏长度的分布,当每个种子都与完整的 2500 组目标单词进行测试时;*均而言,这些种子集在 95%以上的时间里都能成功完成游戏。同样,模拟器是一个强大的玩家,使用良好的种子,因此为什么绝大多数种子导致*均游戏时间只有 3 或 4 轮,如图所示。但是,即使在这些高质量的种子中,很明显一些会比其他的导致更短的游戏。事实上,最好的 1、2 和 3 个单词的种子在 80%以上的时间里可以在 4 轮或更少的时间内解决一个典型的目标单词。
1、2 和 3 字种子的*均游戏长度的分布;作者配图。
我们也可以看到 1 个和 2 个单词的种子如何比 3 个单词的种子产生更短的游戏。这表明,玩家最好尝试找到自己的第三个单词,而不是依赖于一个通用的第三个单词,这是有意义的,因为前几个单词可能会透露目标单词的很多信息(大约 3 个正确的字母,一个在正确的位置上,大约 6 个不正确的字母)。盲目使用固定的第三个词是忽略了很多信息。
然而,1 字和 2 字种子集之间的差异更小,即使在使用 2 字种子集时一些信息被忽略。*均而言,1 字种子的*均游戏长度(3.80)略短于 2 字种子(3.86);在图中显示为彩色编码的垂直实线)。然而,如果我们将单个最佳 1 字种子与单个最佳 2 字种子— 进行比较,其中“最佳”意味着最短的*均游戏长度—如上面相应的垂直虚线所示,那么差异就小得多(最佳 1 字种子与 2 字种子分别为 3.66 比 3.68)。除了游戏的*均长度之外,值得关注的是可以在比如说 3 轮或更少轮中解决的游戏的比例——即非常短的游戏的比例——这样一来,我们发现 46%的与最佳 1 词猜测相关的游戏需要 3 轮或更少轮,相比之下,48%的游戏需要最佳 2 词查询。
从另一个角度来看,将这与这些精心策划的种子队中表现最差的种子队(*均游戏时间最长的种子队)进行比较是有益的。最差的 1、2 和 3 个单词的种子实现了较低的完成率(90–92%而不是> 95%),并且它们需要更多的猜测来完成(*均 4.12–4.45 次猜测)。
结论
那么,在游戏开始的时候,有哪些最好的 1、2、3 字组合呢?如果你不想知道实际的单词,那么继续读下去是安全的,但是要小心,因为在这篇文章的结尾,它们会被揭露。现在,我将抽象地讨论这些最佳集合,同时做一些最后的观察:
- 如果您只想使用一个单词,那么'** * * 【T1]'是您的最佳选择。使用这个词导致超过 95%的游戏成功,*均游戏时间为 3.66 轮,其中 83%的游戏在 4 轮内完成。
- 相反,如果你想用两个词,那么你应该试试' ##### '和'$ $ $ $'。它们导致超过 96%的目标单词成功,*均游戏长度为 3.68 轮,86%的游戏在 4 轮内完成。
- 最好的三字种子是' @@@@@ ','&&&&【T42]',和“% % % % % %【T7]',成功率为 97%,但*均游戏时长为 4.2 轮,82%的游戏在第 4 轮完成。
你应该用“”和一个定制的第二个词,还是用“# # # #”后跟“$ $ $ \(*”?请注意,您从使用' *#####* '作为第一个猜测中学到的东西与您将从使用' *\)$$$$ '作为第二个猜测中学到的东西没有冲突,因为按照设计,它们没有共同的字母,但是您将忽略您从' ##### '中学到的东西。然而,'$ $ $ $【T17]'之所以被选中,是因为它本身也是一个很好的用词,而且在实践中,它和一个更加定制的第二种猜测一样有效。
作者图表。
我们可以在上图中看到这一点,该图显示了之前讨论过的各种单词特征(正确/不正确的字母/位置等)。)按回合打。但是,现在我们也包括了'** * * * * **'(虚线)和' ##### '和' $$$$$ '(虚线)的结果。正如所预期的,这些种子集比*均(高质量)种子集表现得更好,至少在正确/不正确的字母、位置和减少的兼容单词数等方面。
这些结果也有助于澄清使用'** * * * * **'与使用' ##### '和' *$$$$\(* '之间的差别相对较小。如果有什么不同的话,*均来说,当涉及到削减第 2、3 和 4 轮中兼容单词的*均数量时,'*# # # # # #*'和'T32,\) $ $ $ $ \('的配对似乎做得稍好一些,这可能解释了为什么我们发现'T34,# # # # # #'和'T36,\) $ $ $ $'(48%)比' * * * * * * '(48%)有更多的游戏有 3 轮或更少的游戏
这些会对你下一部游戏产生影响吗?这完全取决于你。当然,有一个强有力的开头词是有意义的,如果这就是你想要的所有帮助,那么'** * * 【T1]'是一个很好的选择,至少基于我们在这个分析中发现的。
如果你希望更进一步,并愿意提交你的前两次猜测,那么'# # # # # #'接着'$ $ $ $ $【T5]'可能会很好地为你服务,至少*均来说,并让你更快地进入有趣的中局,如果你对' # # # # # # '做得好,那么你总是可以选择定制的第二次猜测,以尝试并实现传说中的两轮胜利。
使用“*****”或“#####”和“$$$$”作为开头策略,就像它得到的一样简单:没有长的单词列表或复杂的决策树或查找表,只是一个精心选择的单词或单词对,让你有一个好的开始。不要担心,对于您随后的猜测,仍然有大量的工作要做。
说到这里,如果你想要一些帮助来完善你的猜测策略,那么看看我的新帖子,它看起来就是这个话题。
现在,今天的单词在哪里?
小心!剧透如下
说到这里,如果你确定你想知道最适合使用的单词,那么解码如下:
确定的话继续滚动……
快到了…
- **** = ' 故事集
-
= ' 圆锥',$$$$$ = ' 试验【T17'
- @@@@@ = ' 讨厌',& & & & & = ' 圆',%%%%% = ' 爬【T23'
我在担任数据科学总监的前 6 个月学到了什么
在不同行业中转换到新角色的挑战和回报
伊恩·施耐德在 Unsplash 上拍摄的照片
在 6 个月前开始担任一个数据科学团队的主管之前,我做了许多其他人在面对新事物时会做的事情:我在媒体上搜索关于其他人在这个过程中所学到的东西的帖子。我没有找到很多关于成为数据科学经理的帖子(尽管我发现这篇帖子非常有帮助!).有很多关于数据科学的技术方面以及如何管理数据科学项目的帖子,但是没有多少关于如何管理数据科学团队的帖子。所以我想当我习惯了这个新角色后,我会分享我的经验。
TL;在这篇文章中,我将首先关注我面临的最大挑战:(1)适应一家非科技公司,以及(2)招聘和雇佣(在某些情况下,这与第一位相关)。到目前为止,我还有其他的挑战,但是我想我会从这两个开始,因为它们占据了我一天至少 75%的时间。敬请关注未来关于其他挑战和观察的帖子!
关于我的一点…
我对管理并不陌生,但最*一直在科技公司做 IC。为什么?我错过了编码和进入本质的技术细节。
当我说我不是管理新手时,我的管理经验在数据科学方面还没有达到 100%。几年前,我管理过一个团队,既有人事方面的,也有项目方面的。但是他们玩得很开心,坦白地说,我很嫉妒我没有和他们一起玩键盘。
在之前的工作中,我是 R1 大学的教授,从事应用数据科学和机器学习的前沿研究。大多数人不认为这是一项管理工作,但如果你仔细想想,它确实是。虽然有教学成分,但在 R1 大学,研究是至高无上的。但是这对教授的日常生活意味着什么呢?首先也是最重要的是,通过撰写许多冗长的提案来获得工作资金。这意味着能够证明你可以管理预算。第二,同样重要的是,这意味着招募一支团队。在巅峰时期,我的团队有 2 名博士后、10 名研究生和大约 20 名本科生。任何教授的研究小组的成功都与他们能够招募到实验室的学生的质量密切相关。他们都需要得到指导。他们都有不同的技能和经验水*。他们都需要定期接受绩效评估并给出反馈。他们都有人际关系问题,有时会影响团队。所以,是的,在 R1 担任教授是一项管理工作,同时还得兼职教授一些课程。
那么,如果我如此热爱编码,我为什么还要回到管理层呢?我想这是因为我意识到我也喜欢影响数据科学的方向。作为一名 IC 数据科学家,你的日常工作(理想情况下)是解决问题,编写和审查代码,并记录你的工作。我在担任 IC 期间发现,我没有太多机会坐在桌前讨论特定问题的业务需求,以及数据是否能够真正解决该问题。我没有能力推动数据科学工作的方向。我发现我错过了。
基于此,我接受了一份我梦寐以求的工作:领导一个在滑雪行业工作的数据科学团队——这是我热爱的行业。
照片由 Astrid Schaffner 在 Unsplash 拍摄
关于我的公司…
滑雪产业不是科技。让我们面对现实吧。这个行业可能已经存在了几十年,但它不是由花很多时间思考数据的人创建的。创立这个行业的人,都很会治山。然而,总的来说,它最初并不是以数据为中心的。
然而,我最*的工作是在技术领域。这对数据科学经理来说到底意味着什么?这意味着我们在构建基础架构解决方案的同时,通常还会构建数据科学解决方案。我花了相当多的时间谈论和解决科技公司的数据科学家可能认为理所当然的问题。比如我们应该在什么云*台上,有什么正确的工具(想想版本控制,CI/CD,集群管理等等。)我们应该用那里?对于我们的海量数据,什么是正确的存储解决方案?(看到我在那里做了什么吗?;) )当我们有大量不同的数据源时,即使是同一类型的数据,每个数据源都有自己的模式和噪声源,它们都必须很好地协同工作,我们该怎么办?在科技公司,这些问题很大程度上得到了解决或者很容易处理。如果这些问题还没有解决,会有一小群人来解决它们。但在非技术领域,数据科学家必须是多面手,对全栈解决方案之类的东西要了解得多,对某个主题的技术深度要了解得少。除了决定合适的*台和工具之外,同样重要的是能够将这些决定传达给业务部门,无论是在价值方面还是在证明成本的合理性方面。
有时候我觉得这很有挑战性。其他时候,我发现这是一个产生积极影响的好机会。我非常相信,一个人在这样一个角色中的快乐是找到一种看待事物的方式,更像是后来的事情…并且帮助他们的团队也这样做。
由 Eric Prouzet 在 Unsplash 上拍摄的照片
到目前为止,我面临的最具挑战性的问题是:招聘
任何阅读这篇文章的人都知道,获得合适的数据科学人才是非常非常困难的。数据科学家被比作独角兽。它是一种独特的技能,由许多复杂的专业技术领域组成,包括编码、统计和商业技能。对我来说,这意味着吸引和争夺最佳人才的竞争异常激烈。当我还是一名教授时,有一位招聘人员联系我,说金融科技公司有一份数据科学家的工作,起薪是每年 100 万美元,外加奖金。是的,真的。(我没拿……我觉得那种工资的附加条件不值得。)
FAANG 公司(脸书-苹果-亚马逊-网飞-谷歌)能够支付惊人的薪水。但是大多数雇佣数据科学家的公司都不是那样的。不要误会我!数据科学家仍然可以过上非常体面的生活!但是在实际实践的世界里,非技术数据科学家,事情要现实得多。不幸的是,这意味着我在和 FAANG 公司争夺人才。
因此,我不得不在刊登广告和招聘的地方变得非常有创意。数据科学家总是会在 FAANG 公司找工作,但他们并不总是认为非科技公司雇佣了数据科学家。因此,这意味着我已经知道,在推销我的空缺职位时,我必须更加主动。LinkedIn 很棒,招聘人员可以提供帮助。然而,我也发现在不寻常的在线论坛——如 Discord、Slack 和 Twitter——招聘中取得了巨大成功。
但是不要搞错:招聘数据科学家是一项全接触的运动!很乱。你必须迅速行动。简化面试流程对于快速发现人才至关重要。仔细想想你希望你的技术面试是什么样的,应该持续多长时间。因为在不到一周的时间内,理想的候选人就会从你的手下被雇用!
角色和级别
在我的团队中,我们既有数据科学家,也有机器学习工程师。关于这两者之间的区别有很多讨论,这种讨论自然也发生在我的团队中。在我到来之前,它的结构是这样的,我一直保持着这种结构:
数据科学家:自己创建模型的人。
机器学习工程师 (MLEs,在其他地方也被称为“数据工程师”):为数据科学家开发的模型创建管道的 MLOps 人员。
我可以告诉你,雇佣数据科学家比 MLEs 容易得多。教授基本的数据科学技能很容易,而且很多都可以在您的本地机器或小型云实例上完成。然而,如果你想一想,让学生访问包含大量数据的复杂云管道是复杂和昂贵的。所以预计需要一段时间才能找到一个有经验的 MLE!
就均衡而言,我的团队有三个级别:数据科学家/MLE、高级和负责人。我现在正在更新我们的水*指南。总的来说,我认为入门级别的角色是那些了解主题基础并能够完成分配给他们的特定任务的人。对我来说,高层就是拥有一个项目,给你一个问题,把它分解成一系列的任务,编码完成它。最后,负责人自己识别问题,指导团队解决这些问题,并创建高层次的解决方案来帮助团队解决问题。
另一方面,我的工作是让团队能够完成他们的工作,同时与其他经理和利益相关者合作,确定问题的范围并交流解决方案。在包括技术和非技术的许多环境中,像“经理/高级经理”和“主管”这样的角色是有区别的前者主要是向下管理,处理团队的日常“照顾和喂养”,而后者是向下管理和向上管理之间的一个奇怪的中间地带。我发现,在我目前的职位上,向下管理和向上管理各占一半。
给求职者的建议
首先,认真阅读招聘广告。看期望的技能是什么。以上面的角色为例,在工作描述中,你可能是你之前的角色塑造模型中的 MLE。然而,因为这些职称模糊不清,你可能在其他地方被认为是数据科学家。
第二,FAANG 公司希望你在高压力的环境下回答非常复杂的问题、结对程序和/或白板。关于如何准备这种类型的面试,有很多博客帖子。这些面试很紧张,需要几个月的学习。但是对于世界上的其他人来说,这不是标准(也不实际),你真的不会被期望在你的工作中那样工作。做好基础准备。保持简单,易于沟通。
最后,保持简历简洁明了。信不信由你,招聘经理看简历的*均时间是 6 到 7 秒。(不信的话,看这个。)不要在分散 6-7 秒注意力的内容上浪费空间,比如目标陈述。快点吃肉。如果你不知道那是什么,招聘广告会告诉你。
结论和我认为未来 6 个月我可能会期待的事情
我头 6 个月的大部分时间都花在了学习非科技实体的数据科学工作方式以及招聘和雇用上。我学会了新的方法来看待数据科学和基础设施与整体业务的关系,以及如何向非技术经理传达投资回报(ROI)。我也学到了在招聘时既有创造性又积极主动的重要性。FAANG 公司可能不需要宣传他们雇佣了数据科学家,但我需要。我在招聘方面的大部分成功来自于在不寻常的地方张贴我的招聘广告。
虽然我没有预测未来的水晶球,但有些事情我想我可以满怀信心地说,未来 6 个月会是什么样子。
首先,很难确定最*的技术裁员会对我的招聘产生什么影响。然而,一些被解雇的人已经找到了我,所以我无法想象不会有影响。第二,我真的不应该在提到“招聘”和“雇用”的时候不包括“保留”这个词。但是,留住人才也需要考虑整个科技就业环境中正在发生的事情。最后,与任何类型的人一起工作都是复杂的。任何一个经理都把这种考虑作为他们工作的一部分。然而,我认为在这方面管理数据科学家面临一些独特的挑战。例如,这个领域发展得非常快,可能比其他软件开发领域更快。当我开始做集成电路的时候,那些尖端的工具现在已经过时了。新的工具和方法不断出现。让数据科学家团队对所有这些进步保持新鲜和最新是我一直在想的。这很可能是它自己的博客文章。
敬请期待!
我在实现计算机视觉论文时学到了什么
原文:https://towardsdatascience.com/what-i-learned-while-implementing-computer-vision-papers-42f4fd730a97
同时练习多种技能的有效方法
Emile Perron 在 Unsplash 上的照片
作为计算机视觉工程师,我的一个朋友和我在想一种新的方法,可以同时提高多项技能,既有效又省时。我们想到了在 GitHub 上实现计算机视觉论文的想法。在这篇短文中,我想谈谈我们在这个过程中遇到的所有有趣的细节,我们遇到的所有积极和消极的发现。
首先是正面。
计算机视觉技能
要完成一篇论文,你需要理解它的每一个细节。有些章节你可能需要读 10 遍以上。有时候,要理解一个小概念,可能需要看很多其他的参考论文。结果,您获得了 T 形知识:您试图实现的主题的广泛知识,以及特定模型和技术的更深入的知识。
编程技巧
社区面前的责任来了。当你在做一个开源项目时,你觉得有责任让其他人更容易理解。为了编写一小块代码,你开始花越来越多的时间去寻找最佳的、可理解的、有用的和有效的方法。
其他你认为不会提高的技能
首先,看起来你在两个方向努力:深度学习知识和编程技能。然而,事实证明,要做到这一点,你需要学习很多东西。
- 为整个过程创建工作流程的项目管理技能:创建任务并确定其优先级,相互分配任务等。
- 沟通技巧:与合作者沟通,互相帮助,审查代码。
- 所有权和责任:拥有所有权和责任,使团队工作更有效,对你的任务和整个项目负责。
还有很多需要学习和提高的地方,在这个过程中你会发现的。
与全世界合作
GitHub 和其他*台的最大优势是它可以帮助你分享你的作品,并获得他人的帮助。当世界各地的人们在不了解你个人和你的技能的情况下开始和你一起工作,为了一个目的:社区贡献,这是一种奇妙的感觉。
群体反应和兴趣
社区贡献对我们每个人来说都是一个绝佳的机会。从想要使用你的库的人那里得到反馈是非常有价值的。许多问题、请求和未解决的问题会对你的工作产生巨大的影响。
现在让我们深入探讨一下我们遇到的不利因素。
由 Unsplash 上 Elisa Ventur 拍摄的照片
论文结构和内容
许多论文很难实现,因为作者可以接受的写作方式。有时候,为了理解一个小概念,你可能需要上下百万次才能找到一个答案。许多论文甚至不包含实验部分:他们如何做实验,设置实验的元素,以及模型和技术描述的一些一般元素。你需要假设许多细节,或者查阅其他类似的论文、参考资料来理解这些细节。
计算问题
现在,来自最好的研究实验室的许多计算机视觉论文看起来像一个收集并结合了来自其他论文的不同概念的拼图。他们的主要不公*优势之一是他们拥有的计算能力。他们可以使用大量不开放的数据,以及我们无法负担的巨大计算能力。这就是为什么有时不可能重复他们的实验并检查他们的结果。
结论
尽管在实现过程中你可能会面临一些挑战,但这是值得做的,因为你将提高技能,并从这个过程中获得乐趣。尤其是当你看到来自社区的支持和帮助时,你肯定会明白你为什么要这么做。我建议每个人都把这个练习作为他们学习过程的一部分。找到你喜欢并想学的东西,并开始为之努力。如果你需要帮助,社区会帮助你。
GitHub 库:https://github.com/LilitYolyan
在使用卡尔曼滤波器进行目标跟踪时,我错过了什么
不测量时如何估计物体的速度
由 Jure Zakotnik 在 Unsplash 上拍摄的照片
介绍
卡尔曼滤波器是一种复杂的算法,在大多数情况下,人们在没有完全理解其方程的情况下使用它。
当我开始使用卡尔曼滤波器时,我也是这样做的。我阅读了一堆试图直观地解释算法的教程,但这样做,忽略了关于协方差矩阵的作用的关键部分。
我正在开发的产品是一个基于检测的物体追踪器。其中,卡尔曼滤波器用于预测和更新给定视频流中对象的位置和速度,以及对每一帧的检测。在某些情况下,我们还想通过调整给定运动角度的对象的位置来考虑摄像机的倾斜和*移。当然,物体的速度应该不受这种摄像机运动的影响。
但是,当开始实施这一调整时,我意识到我并不真正理解速度是如何估算的。我假设在这个过程中的某个地方,有一个给定的先前和当前位置的速度的显式计算(在我们的例子中,速度从来没有被直接测量)。我还假设这个速度和位置的处理方式是一样的。令我惊讶的是,这两个假设都被证明是错误的。
这让我深入卡尔曼滤波器的方程,试图尽可能直观地找出到底发生了什么,但不要过于简化。这个博客总结了我在这个过程中学到的东西。
由于这不是一个介绍性的博客,我将假设你熟悉概率论的基本概念,如概率分布函数,高斯分布和贝叶斯定理。此外,我们将使用矩阵乘法和加法进行一些计算。所以如果你也熟悉这一点就更好了。
概观
卡尔曼滤波器是一种算法,设计用于在给定这些变量的连续测量值以及这些测量值中的不确定性量的情况下,估计一段时间内测量变量的值。卡尔曼滤波器还考虑了估计变量之间的给定关系。
让我们以在视频中跟踪乒乓球的过程为例,给定球的 2D 包围盒检测。检测可能包含给定 bbox 的坐标中的一些不准确性,或者由假阳性/假阴性引起的不准确性。
对几个连续帧的典型检测。bboxes 并不总是完美的,有时会完全丢失(假阴性)。(视频由 cottonbro 提供)
为了更*滑地跟踪球,我们将想要跟踪测量的 bbox 的中心坐标( x 、 y )、宽度和高度。假设一个运动的球的速度可以在短时间间隔内*似为常数,我们也想跟踪 x 和 y 的速度( v_x , v_y ),希望得到这些预测:
卡尔曼滤波器的预测是绿色的,*滑检测(红色)。(视频由 cottonbro 提供)
通常,当试图解释卡尔曼滤波器时,人们会使用一个使用位置和速度测量来跟踪对象的例子(例如 GPS 和速度计)。在我们的例子中,我们没有速度的直接测量。相反,卡尔曼滤波器使用测得的位置和我们注入到其方程中的关于我们期望的运动行为(在这种情况下为恒定速度)的先验知识来推断该速度。
为了简单起见,从现在开始我们只讨论 x 和v _ x的跟踪(1D 跟踪的一个例子)。理解了 1D 发生的事情后,逻辑可以很容易地扩展到二维和三维,因为在我们的例子中,每个维度都完全独立于其他维度。
假设
使用卡尔曼滤波器时有两个重要假设:
- 传感器有噪声,其输出和噪声可以通过高斯概率分布函数(PDF) 精确建模。
- 我们对实际状态的初始先验知识也是高斯 PDF。
在我们的示例中,传感器输出由 1D 高斯表示,其中均值等于实际传感器输出,方差是传感器的不确定性(主要根据经验测量)。
先验高斯是二维的(一个用于位置,一个用于速度)。使用 6 个数字可以完整地描述 2D 高斯:2 个用于其中心坐标向量(也称为*均值),另外 4 个用于 2x2 协方差矩阵。
协方差矩阵的对角线对应于每个维度的方差,2 个非对角线元素是位置和速度之间的实际协方差。由于协方差的对称性,非对角线元素总是相同的,即,x 和 y 之间的相关性与 y 和 x 之间的相关性相同(我们将在后面更详细地讨论这个元素)。
不同协方差矩阵对应的 2D 高斯分布
卡尔曼滤波器将尝试使用输入检测来更新*均值和协方差。常见的术语是将这种分布称为系统状态。
在我们的例子中,我们将使用下面的初始状态:
*均位置 μ_x 取自第一个检测到的 bbox 的 x 位置,我们假设一些初始速度 μ_v 。我们还假设,最初速度和位置之间没有协方差。我们可以用图形将这种初始状态绘制如下:
典型的初始状态。在这个阶段没有相关性(这将随时间变化),因此高斯曲线具有轴对齐的椭圆形。
算法步骤
为了发挥它的魔力,卡尔曼滤波器有两个步骤:预测,在这个步骤中,它试图预测当前的状态,给定先前的状态和从那时起已经过去的时间。更新,尝试将预测状态与输入测量值结合。让我们用我们的例子来看看这是如何发生的。
预测步骤方程
给定经过的时间,为了预测下一个状态,卡尔曼滤波器使用状态转移矩阵( F ),(也称为物理模型),该矩阵将前一个状态与当前状态联系起来。在我们的例子中,由于我们假设在短时间间隔内速度恒定(大约几帧),状态转移矩阵为:
这样,如果我们把它乘以我们的状态均值向量,我们得到预测的均值:
预测新的*均值是不够的。我们预计,如果时间已经过去,那么协方差矩阵(代表状态的不确定性)也将改变。为了预测新的协方差,我们将使用随机变量的线性变换公式(参见此处了解详情)并添加一个噪声对角矩阵。这种噪声被称为“过程噪声”,它包含了自我们上次更新状态以来经过的时间所产生的不确定性,并且在我们的物理模型中没有考虑到。因此,在我们的例子中,它可以表示非恒定速度和相机运动。通常用 Q 表示。因此协方差预测方程如下:
如果我们为初始状态解这个方程:
注意,除了过程噪声增加的额外不确定性之外,位置方差也增加了一个系数:
这个因素源于我们在将 F (物理模型)定义为非对角矩阵时引入的位置和速度之间的相关性。可以这样理解:给定预测位置是状态速度的函数,这个预测位置的不确定性就是我们之前状态的不确定性加上速度的不确定性乘以它们耦合的因子(*方,单位为)。
这里需要注意的另一件事是新引入的协方差因子:
这意味着我们的高斯维度不再独立。这更容易用图形来解释,所以我们就这么做吧。
预测步骤直觉
从图形上看,更新步骤如下所示:
这里发生了什么?为什么我们的状态突然横过来了?这是因为位置和速度不是两个独立变量。状态的速度直接影响预测的位置。直觉上,这意味着更高的速度应该对应更远的位置,反之亦然。从数学上来说,这由我们的状态转移矩阵(F)不是对角的这一事实来表示。非对角线元素δt 将位置和速度联系在一起。
由于这种耦合,每个更新步骤都会在协方差矩阵中引入非对角元素,这在图形上对应于我们的分布的移动,如上面的 GIF 所示。
更新步骤直觉
这一步在数学上有点复杂,但直觉上也很简单。在该步骤中,卡尔曼滤波器将接收两个可能的状态作为输入(定义为高斯 pdf ),并输出一个新的状态,该状态结合了来自两者的信息。
在深入描述这一过程的方程之前,这里有要点:以统计最优的方式组合来自两个(或更多)pdf 的信息,相当于将它们相乘。由于高斯分布的特殊性质,这种乘法的乘积是另一种具有均值和协方差的高斯分布,可以通过(相对)简单的方程获得。
现在了解更多细节。更新过程可以被认为是贝叶斯推理。如果我们将我们正在跟踪的物体的实际位置(我们实际上不知道)定义为 x ,并且将实际测量的位置定义为 m ,我们得到以下更新等式:
卡尔曼滤波器中使用的贝叶斯定理
让我们在卡尔曼滤波器的背景下理解这些术语:
- 后验:给定测量,实际位置的概率分布。这就是我们想要使用更新步骤来推断的内容。
- 可能性:给定实际位置,测量的概率分布。这被假设为实际位置周围的高斯分布(如“假设”部分所述)。
- 先验:在测量之前,尽我们目前所知的实际位置的概率分布(也称为预测状态)。这最初也被假设为高斯分布。
- 归一化:测量概率分布,对所有可能的位置求和。在这种情况下,不计算这部分,因为我们只关心更新均值和协方差,而不关心高斯振幅。
从这里我们可以推断出,更新后的状态将是预测状态和测量状态的产物(关于似然函数的更多信息,请查看本博客,关于卡尔曼滤波器中的似然性的更多信息,请查看本书的第 4 章)。因为我们在这里处理的是高斯分布,这种分布的乘积将是另一种高斯分布,它的均值和协方差有封闭的方程。
如果我们有位置和速度的测量值(我们没有),更新步骤会是这样的:
预测状态取自上述过程。测量的状态,类似于我们的初始状态,有一个轴对齐的椭圆形。这就是说,测量的位置和测量的速度来自两个独立的传感器,每个传感器的不确定性由高斯方差捕获。
但是,因为在我们的视频跟踪示例中,我们只有一个位置测量值,没有速度测量值,所以被测状态的概率只会在位置维度上衰减,但在速度维度上,它将具有均匀分布,因此看起来像这样:
在这里,您可以看到一个测量位置,其*均值高于预测值。当然,更新状态的位置将介于两者之间。但是请注意,尽管我们只测量了位置,更新状态的*均速度相对于预测状态也增加了。如果我们回想一下预测状态的位置和速度是相关的,这意味着更远的位置与更高的速度相关联,就可以直观地理解速度的这种变化。有了这个性质,为什么测量某个位置会导致我们对*均速度的信念发生改变就变得很清楚了。
考虑两个高度相关的概率分布:例如,云量概率分布和降雨量概率分布。我们知道,大量的云与更多的雨密切相关。现在假设我们必须猜测昨天巴黎下了多少雨。在没有任何先验知识的情况下,你会猜测,比如说,3 毫米的降雨量(你猜测的*均值)。现在,有人告诉你昨天非常多云。利用这一先验知识,你肯定会更新你对降雨量的猜测。这正是卡尔曼滤波器中发生的情况。给定一个远位置测量,我们也将速度更新到一个更高的值。
均值更新方程
在这篇博客中,我们不会试图推导出“更新”方程(为此你可以在这里查看),而是我们将展示它们并试图理解它们。
首先是一些定义:
我们使用 R 到来表示测量的状态协方差矩阵,因为这是卡尔曼滤波器教科书中常用的表示方法。在这个例子中,由于我们的测量是 1D,测量的状态可以用两个标量来表示:
因为我们的测量和状态具有不同的维度,为了将两者结合起来,我们需要一个线性变换,将我们从状态空间带到测量空间。我们用矩阵 H 来表示这个转换。在我们的例子中,我们的测量只有一个维度(位置),而状态有两个维度(位置&速度),因此要在它们之间转换,我们可以使用:
这样,如果我们将预测*均值乘以 H ,我们将只得到*均值的测量部分:
现在是真正的方程式。我们将首先给出更新状态的均值和协方差的完整方程,然后将它们分解成更有意义的分量,以便我们可以更好地理解发生了什么。
完全更新的均值等式(对于我们的 1D 视频跟踪示例)为:
这是一个相当复杂的等式,所以让我们来分解它。首先,我们将传感器“创新”定义为:
其仅仅是测量位置和*均预测位置之间的差。它被称为创新,因为它可以被认为是我们从传感器获得的新(创新)信息。
其次,我们将“卡尔曼增益”定义为:
卡尔曼增益是我们将新的传感器信息合并到更新的状态中的因子。
将这些定义代入等式,我们得到:
让我们进一步细分到位置更新和速度更新。对于更新后的位置我们得到:
这个等式很有道理。更新的*均值将是预测的和测量的*均值的加权*均值,权重因子与它们各自的相对不确定性成比例。
假设我们有一个完美的零方差传感器。这将导致预测的测量值等于传感器测量值(这是应该的——这是完美的。).另一方面,如果与预测状态的方差相比,传感器噪声很大(高度不确定性),则情况正好相反,完全忽略测量,仅使用预测位置。正如你所料。
现在对于*均速度更新:
在这种一般形式下没有太多意义(至少我想不到),所以让我们尝试插入我们之前导出的单个协方差预测步骤的结果,看看是否有帮助。如果我们假设零过程噪声(Q=0,这是不现实的,但对于更简单和更直观的方程是好的),我们得到预测的协方差是:
记住“ t ”上标只是“上一步”的意思;进入速度更新,我们得到:
我们将分子和分母乘以δt,得到:
让我们想想这个等式的不同部分以及它们所包含的内容。最后一部分:
是速度创新。就像位置创新一样,这是预测的状态速度和我们实际到达测量位置所需的速度之间的差异。现在,我们希望更新后的状态中包含多少这种创新?这取决于我们之前状态下速度的不确定性,相对于测量速度的不确定性。但是等等,我们没有测到速度!从位置测量中推断出。那么我们如何定义这个推断速度的不确定性呢?
速度是使用先前的位置和测量的位置来推断的,因此它的不确定性是它的两个分量的不确定性的总和是有意义的。因此,我们可以将推断的速度不确定性定义为:
如果我们回忆一下:
我们还可以定义一个广义的预测速度不确定性,该不确定性也考虑了自上次更新以来所经过的时间,如下所示:
将这些定义代入等式,我们得到:
这个等式更直观。也就是说,更新的速度将等于预测的速度加上速度创新的一部分。当推断的速度不确定性非常大(相对于预测的速度)时,这个分数将接*零,而当反过来时,这个分数将接* 1。
协方差更新方程
完整的协方差更新方程如下所示:
我们可以插入上面获得的卡尔曼增益和以下事实:
获得:
我们将相对测量不确定度定义为:
这个常数就是相对于位置总不确定度的测量不确定度。如果我们把这个代入方程(在我会告诉你更多的代数之后),我们会得到:
我们来分解一下:更新后的位置不确定度是预测位置不确定度和测量位置不确定度的调和*均值。调和*均值是一种通过接*两个元素中较小的一个来组合两个元素的*均值。所以如果:
然后:
反之亦然。
更新的位置-速度协方差也是直观的。它是预测协方差的缩小版本,比例因子是相对测量不确定性。因此,对于完美的测量,这些元素将接*零,而对于噪声测量,它们将保持不变。
现在更新速度方差。乍一看,这似乎没有多大意义,因此,正如我们之前所做的那样,让我们插入之前导出的单个协方差预测步骤的结果。
我们可以再次使用我们上面定义的推断速度不确定性和广义速度预测不确定性来获得:
我们再次得到更新的方差是推断速度不确定性和广义速度预测不确定性的调和*均值。所以基本上总是接*两者中较小的一个。
最后,我们有:
让我们总结一下从这个等式中可以学到什么。位置方差和速度方差都可以表示为两个不确定性(每个不确定性都有与之相关的不确定性)的调和*均值。位置-速度协方差也随着我们对测量相对于先验的确定程度而缩小。如果你回到显示更新过程的图表,这也是非常直观的原因。
总结
在这篇博客中,我试图把我试图直观理解卡尔曼滤波方程的过程写下来。这是图形和数学直觉的混合体,在我看来,它们是相辅相成的。希望它能帮助你更好地理解“引擎盖下”到底发生了什么,也许现在这个复杂的算法变得更容易理解了。
这里要补充一点,物体跟踪等算法不可掉以轻心。这些算法,在错误的人手中,可能被用来犯下侵犯公民权利的罪行,因此只能由专业人士开发,并受到严格的监管。
当我开始我的计算机科学之旅时,我希望我已经知道了什么
在我开始计算机科学和软件开发的旅程之前,我希望我已经知道的所有事情
当我开始我的旅程时,我发现很难得到关于这个话题的一些像样的建议,而且它分散在互联网上,有许多不同的观点。
我在这个过程中犯了一些错误,这些错误可能是我现在所知道的我不会犯的,我写这篇文章是希望我能帮助其他人避免这个问题,同时也为所有正在寻找它的人提供一些建议。
在这篇文章中,我将谈论我的旅程中的经历,以及如果我知道这一切,我可以做得更好。
当我们提到学习编程时,我们指的是学习有效地学习。
这是因为作为一名开发人员,你在不断变化的技术世界中工作,你将不得不在你的整个职业生涯中不断学习,这一切都是从第一步开始的,如果你开始错了,那么它可能是一条崎岖的道路,而如果你开始正确,那么它将是一帆风顺的。
考虑到这一点,我编写了一个完整的指南,介绍在成为开发人员的过程中需要掌握的最重要、最简单的方面,以及一些我希望能帮助你的资源。
每天写代码。
也许整个旅程中最重要的部分是身体的练习。
你应该努力每天写一些代码,即使写代码的一半时间花在调试上,这是正常的,但如果你不练习,你永远不会把它变成肌肉记忆。
就我个人而言,当我经历我的旅程时,我发现自己是如此专注和担心我还不知道的事情,以至于我花了更多的时间阅读和研究不同的课程和编程语言,而不是实际动手。
直到我意识到我没有足够的能力继续下去,没有真正的建立一些东西,我才发现什么一直就在我面前。你只有通过实践才能真正学到东西。
这就是为什么我说这是最重要的因素,不管多少,你只能通过每天写代码和调试代码来快速提高。
知识没有价值,除非你把它付诸实践。 —安东·契诃夫
解决问题前仔细计划。
虽然每天编写代码极其重要,但培养处理新问题的最佳心态也同样重要。
这意味着在编写物理代码之前,要计划好如何着手解决问题。
事实是,当在现实世界中工作时,编写代码的行为可能只占工作的百分之二十,其余的都是计划、调查和不可避免的调试。
然而,如果您正确地计划和调查,那么您应该能够减少调试代码所花费的时间。
因此,在处理新问题时,培养清晰思考和耐心的能力是非常重要的。合理利用你的时间,在尝试实施之前计划好你要做的事情。
首先,我发现最好的方法是用你的母语以简洁明了的方式写下来,然后翻译成伪代码并仔细阅读,同时思考,“这有可能出错吗?”,并且只有当你对此完全满意时,才把它实现成实际的代码。
随着时间的推移,这一过程将成为你的第二天性,你不必走到这一步,但一开始就进行长时间的思考过程来适当地训练你的思维是有好处的。
如果你没有计划,你就是在计划失败。 —本杰明·富兰克林
测试一切!
我知道,我知道。如果当我们测试我们写的所有代码时,我们不得不再次做,为什么我们要经历所有的计划?
因为我们是人,我们会犯错!不管你对自己的能力有多自信,我保证你会犯错误,避免这些错误的唯一方法是彻底测试一切。
我坚信,在测试时,你应该尽你所能让代码以一种意想不到或不想要的方式运行,这样你就可以找到你可能已经错过的错误。
将来,随着您技能的发展,您将学习如何通过自动化测试来测试您的代码,在自动化测试中,您将测试您能想到的所有可能的边缘情况,但在此之前,您应该已经教会您的大脑去思考可能会出错的地方。
坚持不懈,打造你个人投入的东西。
调试是很难的,面对一个问题,连续几天都找不到解决方案会令人沮丧,这是完全正常的,如果你没有这样做,尤其是在开始的时候,那么这可能更令人担忧。
重要的是在面对未知时变得舒适,并开发分析技能来帮助你克服这一点,毕竟调试是一项需要努力的技能,如果不是比实际编写代码更多的话。
正是因为这个原因,建议初学者找到一个真正帮助他们的项目或者他们对自己的第一个项目充满热情是很正常的。
这将有助于你保持完成项目的决心,而不是在项目变得太困难时放弃它。
我的第一个项目是一个 web 应用程序,它可以帮助我更好地完成当时的工作,主要是组织、跟踪和评分我所教的英语课。
我不仅对改善我的工作环境,而且对改善公司使用的整个系统充满热情,以至于我花了大约四个月的时间开发这个应用程序,使它达到我当时认为足够好的水*。
有目标。
这在构建您的第一个应用程序时同样重要,因为事实上您可以对任何流程或应用程序进行的改进是无止境的,但您也需要知道何时撤回并专注于学习更多来提高您的技能。
我在前面提到的应用程序中经历了这一点,我花了几个月的时间在上面工作,发现自己在不断改进。但是每当我回头看我写的代码时,我知道我可以用我学到的东西来改进它。
最终,我意识到我太专注于这些小细节了,以至于我忘记了看更大的画面,也忘记了我开始这个过程的原因。
就在那时,我认识到我们需要为我们正在构建的流程设定一个清晰简明的目标,虽然这可能会随着时间的推移而改变,但这是很自然的,我们不能忘记后退一步,看看更大的图景,以知道何时说它已经完成。
学会问正确的问题,正确使用谷歌。
当你经历许多课程并试图解决不同的问题时,通常,你会求助于 google 和 StackOverflow 来帮助找到一些解决方案。
这是开发人员的一项基本技能,在调查问题时非常重要,你需要学会问正确的问题,在找到解决方案时,不要在没有完全理解的情况下将你发现的内容复制粘贴到你的代码中,这一点非常重要。
这不仅危险,而且对你的进步毫无帮助。
我并不是说你不应该使用你在网上找到的解决方案,而是说你应该在自己实现之前完全理解他们是如何得到那个解决方案的,以及他们是如何处理代码的。
这样做将有助于你提高你的知识,甚至对你正在做的事情有更深的理解,这也将有助于你避免在应用程序中实现潜在的危险代码。
不要担心语言,但首先要坚持一种。
如前所述,当我开始学习时,我一直担心我应该学习哪种语言,先学习哪种语言是最好的,我应该知道一种以上的语言,等等。
最后,事实是这并不重要。学习一门低级语言或静态类型语言确实会让以后学习动态类型语言变得更容易,但真正的事实是,首先学习哪种语言并不是最需要担心的事情。
你应该担心的是选择一种与你将来想做的事情一致的语言,然后使用这种语言来学习对于大多数编程语言和面向对象编程来说都是真实的基础概念。
一旦你有了这些概念,不要改变语言,尽管你可能认为你很了解它,但你并不了解。
一旦你学会了这些概念,并能在所选的语言中自如地使用它们,那么这就是你可以真正开始学习更特定于语言的概念,并真正建立你在语言中的经验,直到你熟练掌握为止。
为什么我建议在此之前坚持使用一种语言?
我这样建议是因为如果你从一种语言过渡到另一种语言,只是达到一个肤浅的水*,那么你永远也不能说你懂这些语言中的任何一种,如果你想被雇佣并获得报酬,你需要对他们希望你工作时使用的语言有更深入的了解。
因此,我建议,如果你想成为一个可雇佣的人,并以一种更好的方式积累你在该领域的知识,那么选择任何一种与你未来想做的事情相一致的语言。使用它来学习面向对象编程和计算机科学的概念,然后在扩展到其他语言之前加深您在这种语言中的知识。
资源
有了以上所有的建议,你应该有了在你的旅程中前进所需的所有工具,但你也有很多要学的,你也需要一些资源来学习。
在这一节中,我将回顾我在整个旅程中发现非常有用的资源,以及我为什么发现它们有用。
StackOverflow
我不能充分地陈述这一点,StackOverflow 是你可能遇到的最好的资源!这是一个致力于开发人员互相帮助并回答他们遇到的问题的网站。
你肯定应该有一个账户,当你需要答案的时候,它会成为你第一个要找的地方。
一旦你有建设性地参与其中,这个网站的一个稍微不太重要的功能也会显现出来,这就是他们的实时聊天,让你可以用所有编程语言与令人惊叹的开发人员进行实时交流,在这里你可以汇集你的知识并互相帮助。
我应该声明一个免责声明,你永远不应该显示不属于你的代码来分享,相反,如果你面临一个问题,你应该建立一个快速的 最小可重复的例子 ,你可以安全地使用它来找到解决方案。很多时候,在构建这个例子的过程中,您需要自己找到解决方案。
CS50 的在线课程
到目前为止,这些都是计算机科学起步时,甚至是接触新领域时的最佳资源,如网络编程、游戏开发或人工智能。
它们都非常紧张,有你必须完成的附带项目,最重要的是,它们为你提供了足够的信息来启动这些项目,但也让它们变得足够困难,以至于你不得不研究你正在做什么来找到解决方案。
免费代码营
自由代码营是另一个令人惊奇的资源,你可以用它来学习许多主题,也可以找到一些有趣的、相对简单的项目。
我确实发现,在整个学习过程中,他们握着你的手对我来说有点太多了,但同时,它提供的每门课程都提供了许多关于不同主题的深入细节,而且你必须再次完成多个项目才能完成这门课程。
HackerRank ,leet code&&CodeWars
虽然 CS50 和自由代码营是提供惊人课程的惊人资源,但它们不仅仅是提供一个练习解决问题的技能和知识的地方。
这就是这三者发挥作用的地方。它们是极好的资源,为你提供了许多不同的挑战,你可以用来练习和磨练你的技能,而不必把时间投入到整个课程中。
我倾向于每周利用这些时间来练习一些解决问题的技巧,或者在学习一门新语言的时候变得更加自在。
C 结论
在你的旅程中,有许多概念和技能需要你去掌握,但你也需要记得去享受它,并在你穿越无尽的科技世界时获得乐趣。
根据我在这篇文章中所说的一切,你应该有一个良好的开端,如果你只是记得每天写代码,仔细计划,测试一切,坚持不懈,有一个目标,问正确的问题,那么你应该会发现自己进步很快。
希望这篇帖子对你有所帮助。
如果……apply()太慢?
原文:https://towardsdatascience.com/what-if-apply-is-too-slow-a9f89b4d73e8
有时我们需要在 Python 中通过使用 Pandas 数据帧的列作为函数的输入,对 Pandas 数据帧应用一些函数。不过,用的最多的方法 。对整个数据帧应用() 可能会比预期花费更长的时间。我们做什么呢
如果您正在使用 Python 处理数据,Pandas 一定是您使用最多的库之一,因为它具有方便和强大的数据处理特性。
如果我们想对 Pandas 数据框中一整列的值应用相同的函数,我们可以简单地使用。应用()。Pandas 数据框和 Pandas 系列(数据框中的一列)都可以与一起使用。应用()。
但是你有没有注意到?当我们有一个超级大的数据集时,apply()会非常慢?
在本文中,我将讨论当您想要对列应用一些函数时,加速数据操作的技巧。
对单个列应用函数
例如,这是我们的玩具数据集。
import pandas as pd
import numpy as np
import timeit
d = {'category': ['apple', 'pear', 'peach'], 'radius': [3, 4, 2], 'sweetness': [1, 2, 3]}
df = pd.DataFrame(data=d)
df
如果我们希望根据半径列中的值向数据框中再添加一列“直径”,其中基本上直径=半径* 2,我们可以继续使用。在此应用()。
df['diameter'] = df['radius'].apply(lambda x: x*2)
df
然后,我们计算执行命令行 10k 次的时间,
# Timing
setup_code = """
import pandas as pd
d = {'category': ['apple', 'pear', 'peach'], 'radius': [3, 4, 2], 'sweetness': [1, 2, 3]}
df = pd.DataFrame(data=d)
"""
mycode = '''
df['radius'].apply(lambda x: x*2)
'''
# timeit statement
t1 = timeit.timeit(setup=setup_code,
stmt = mycode,
number = 10000)
print(f"10000 runs of mycode is {t1}")
产生 0.55 秒。还不错,嗯..?但请记住,这只是一个 3 行的玩具数据。如果我们有几百万行呢?
你可能已经注意到我们不需要使用。apply()在这里,您可以简单地执行以下操作,
df['diameter'] = df['radius']*2
df
我们可以看到输出与使用。应用()。如果我们计算 10k 运行的执行时间,
# Timing
setup_code = """
import pandas as pd
d = {'category': ['apple', 'pear', 'peach'], 'radius': [3, 4, 2], 'sweetness': [1, 2, 3]}
df = pd.DataFrame(data=d)
"""
mycode = '''
df['radius']*2
'''
# timeit statement
t1 = timeit.timeit(setup=setup_code,
stmt = mycode,
number = 10000)
print(f"10000 runs of mycode is {t1}")
总共给了我们 0.32 秒,比。apply()函数。
注意,我们可以简单地避免使用。这里只使用 apply(),因为我们使用一个非常简单的函数来计算一个乘以 2 的值。但是在大多数情况下,我们需要对列应用一个更复杂的函数。
例如,我们希望为每个观测值在半径和常数(比如 3)之间添加一个较大值的列。如果你简单地做以下事情,
max(df['radius'],3)
它将生成下面的错误消息,
因此,我们需要在 apply()函数中编写比较代码。
df['radius_or_3'] = df['radius'].apply(lambda x: max(x,3))
df
让我们计算一下执行时间,
# Timing
setup_code = """
import pandas as pd
d = {'category': ['apple', 'pear', 'peach'], 'radius': [3, 4, 2], 'sweetness': [1, 2, 3]}
df = pd.DataFrame(data=d)
"""
mycode = '''
df['radius'].apply(lambda x: max(x,3))
'''
# timeit statement
t1 = timeit.timeit(setup=setup_code,
stmt = mycode,
number = 10000)
print(f"10000 runs of mycode is {t1}")
给了我们 0.56 秒。但是如果数据有几百万行,需要多长时间呢?这里没展示,不过要几十分钟。这么简单的操纵是不能接受的吧?
应该怎么加快速度?
下面是通过使用 NumPy 而不是。apply()函数。
df['radius_or_3'] = np.maximum(df['radius'],3)
这里的 NumPy 函数最大值是一个比。应用()。让我们计算一下时间。
# Timing
setup_code = """
import pandas as pd
import numpy as np
d = {'category': ['apple', 'pear', 'peach'], 'radius': [3, 4, 2], 'sweetness': [1, 2, 3]}
df = pd.DataFrame(data=d)
"""
mycode = '''
np.maximum(df['radius'],3)
'''
# timeit statement
t1 = timeit.timeit(setup=setup_code,
stmt = mycode,
number = 10000)
print(f"10000 runs of mycode is {t1}")
它产生 0.31 秒,比。apply()函数吧?
因此,要点是,在简单地使用。对所有内容应用()函数。
将函数应用于多列
有时我们需要使用数据中的多个列作为函数的输入。例如,我们希望创建一列列表,记录“半径 _ 或 _3”和“直径”之间的可能大小。
我们可以利用。将()应用于整个数据帧,
df['sizes'] = df.apply(lambda x: list(range(x.radius_or_3,x.diameter)), axis=1)
df
这一步实际上非常耗时,因为我们实际上在。apply()函数。执行时间是,
# Timing
setup_code = """
import pandas as pd
import numpy as np
d = {'category': ['apple', 'pear', 'peach'], 'radius': [3, 4, 2], 'sweetness': [1, 2, 3]}
df = pd.DataFrame(data=d)
df['diameter'] = df['radius']*2
df['radius_or_3'] = np.maximum(df['radius'],3)
"""
mycode = '''
df.apply(lambda x: list(range(x.radius_or_3,x.diameter)), axis=1)
'''
# timeit statement
t1 = timeit.timeit(setup=setup_code,
stmt = mycode,
number = 10000)
print(f"10000 runs of mycode is {t1}")
给了我们 1.84 秒。我会告诉你,对于一个数百万行的数据帧来说,这需要 20 多分钟。
我们能找到更有效的方法来完成这项任务吗?
答案是肯定的。我们唯一需要做的就是创建一个函数,根据需要接受尽可能多的 NumPy 数组(pandas 系列)作为输入。
def create_range(a,b):
range_l = np.empty((len(a),1),object)
for i,val in enumerate(a):
range_l[i,0] = list(range(val,b[i]))
return range_l
df['sizes'] = create_range(df['radius_or_3'].values,df['diameter'].values)
df
这段代码有一个函数, create_range ,它接受两个 Numpy 数组,并通过一个简单的 for 循环返回一个 Numpy 数组。并且返回的 Numpy 数组可以自动转换为 Pandas 系列。
让我们检查一下我们节省了多少时间。
# Timing
setup_code = """
import pandas as pd
import numpy as np
d = {'category': ['apple', 'pear', 'peach'], 'radius': [3, 4, 2], 'sweetness': [1, 2, 3]}
df = pd.DataFrame(data=d)
df['diameter'] = df['radius']*2
df['radius_or_3'] = np.maximum(df['radius'],3)
"""
mycode = '''
def create_range(a,b):
range_l = np.empty((len(a),1),object)
for i,val in enumerate(a):
range_l[i,0] = list(range(val,b[i]))
return range_l
create_range(df['radius_or_3'].values,df['diameter'].values)
'''
# timeit statement
t1 = timeit.timeit(setup=setup_code,
stmt = mycode,
number = 10000)
print(f"10000 runs of mycode is {t1}")
它给了我们 0.07 秒!!!!
看到了吗?它的速度比。对整个数据框应用()函数!!
外卖食品
- 如果你想用。将()应用于 Pandas 数据框中的单个列,尝试找到更简单的执行,例如 df['radius']*2。或者尝试为任务找到现有的 NumPy 函数。
- 如果你想用。将()应用于 Pandas 数据框中的多个列,尽量避免。应用(,轴=1)格式。并编写一个独立的函数,它可以将 Numpy 数组作为输入,然后直接在。熊猫系列的值(数据框的列)。
为了方便起见,这是本文中代码的完整 Jupyter 笔记本。
https://github.com/jiananlin/what_if_apply_too_slow/blob/main/apply_too_slow.ipynb
这就是我想分享的全部!干杯!
如果你喜欢我的文章,别忘了订阅我的邮件列表或者成为 Medium 的推荐会员!!
如果数据成为每个人的事情会怎样?
原文:https://towardsdatascience.com/what-if-data-became-everybodys-business-85b7c20d6ab7
在未来的数据经济中取得成功的新思维
马文·迈耶在 Unsplash 上的照片
当你看到下面的统计数据时,你和我一样震惊吗?
组织中目前有高达 97%的数据未被使用。
事实上,并不是所有的数据都是用来分析的。公司为了记录和法规遵从性而汇集数据。但是 97%,真的吗?![1].虽然利用不断增长的可用企业数据的业务优势是不可能的,但我们必须问自己的一个问题是,我们是否有潜力做得更多。
大规模收集数据后新时代的曙光
大数据的技术进步使得公司能够以前所未有的规模收集、存储和处理数据。“数据是新的石油”的意思是说,原始数据就像原油一样,本身没有价值,而是在收集和连接其他相关数据时创造的价值。但是,如果我们将石油转化为石油,却没有足够的人来驾驶我们提供燃料的汽车,那又有什么用呢?
我们已经达到了这样一个点,我们收集数据的能力超过了我们能够分析和处理可用数据的能力。在未来的数据经济中,成功不再由你拥有的数据量来衡量,而是由有权使用数据的人数来衡量。为了取得成功,公司必须从获取收集和处理大量企业数据的正确技术转变为支持全体员工协作处理提供给他们的数据。那些未能扩大谁有权处理数据的范围的企业将会错失良机。
企业数据协作:前路坎坷
Qlik & Accenture 进行的一项大规模数据素养研究发现,67%的全球员工可以使用商业智能工具,而 75%的员工可以使用数据分析软件[2] 。
企业正在意识到让更多员工在工作中利用数据的机会。很明显,这是朝着正确方向迈出的一大步,但却让我们许多人步履蹒跚。同一项研究发现,增加数据分析和 BI 工具的投资并没有让人们在处理数据时变得更加自信。
- 74%的员工表示在处理数据时感到不知所措或不开心
- 在使用数据分析和商业智能工具时,全球 59%的员工表现出倦怠症状(感觉效率低下、沮丧或有压力)
- 全球 36%不堪重负的员工表示,他们每周至少花一个小时在与数据相关的任务上
- 14%的人会完全回避这项任务
说真的,这是怎么回事?简单地说,技术进步已经超过了人们的应对能力。让人们独自访问数据是一种有压力的体验,因为数据本身是不方便的,没有额外的上下文,嗯,只是数据。无论我们能够获得什么样的技术堆栈,将数据转化为洞察力最有可能始终是一项跨学科的工作,它需要利用分散在一个组织中许多负责人身上的不同技能和知识。通常情况下,知道如何分析数据的人并不具备判断数据正确性和相关性的背景和商业头脑。完全不同的人将知道在后端何处定位这些数据。在数据隐私和合规性方面,其他人将不得不参与进来。长长的名单还在继续。虽然协作是成功的关键,但组织很难做到这一点。HBR 最*的一项研究将组织孤岛视为组织向数据驱动型企业转型的头号组织障碍[3]。据 Statista 称,员工认为缺乏组织一致性是采用大数据的最大挑战[4]。
最终,如果用户不会使用,最好的技术也是无用的。与此同时,如果使用的工具不适合协作,伟大的人才也无法发挥作用。按照现在的方式继续下去的机会成本是巨大的。
数据成为每个人的事情的那一刻
现在,几乎所有员工都有望在自己的岗位上使用数据。在当前的现实中,数据探索掌握在一小群代表其他所有人处理数据的专家手中,而大多数员工只能在一旁观看,直到他们的分析需求得到满足。在这种主要是事务性的设置中,员工对数据的信任度、执行分析请求的速度以及在任何给定时间点可以处理的分析请求的数量都严格取决于可用专家的数量。
在另一个现实中,任何背景的人都可以就数据进行合作和交流。当数据成为每个人的事情时,这些指标就会飙升。各种业务和 IT 利益相关者之间的跨学科对话为理解和信任数据提供了必要的背景。让不同的配置文件贡献知识变得可行,不仅会提高输出的质量——特别分析、仪表板、分析应用程序,等等——还会提高企业对数据进行操作的规模和速度。就像在足球比赛中,不是每个人都应该是前锋,不是每个人都需要在数据驱动的项目中部署代码和构建复杂的模型。但要达到这一点,所有球员都需要沟通和合作,才能把球传到球场上。如果你设法找到更多的前锋,很好,但如果你的整体游戏性没有改善也不要惊讶。真正的挑战将是让所有参与者尽最大努力,因为数据是一项团队运动。
让每个人都轻松的数据协作:一个新兴的商业机会?
公司积累了大量的数据和工具来进行分析。随着等式中人的部分被抛在后面,这些投资今天没有回报。无解的痛?当然不是!让我们考虑一些新兴业务,它们以消除组织障碍为己任,让协作成为新的规范。
虽然过去两年疫情对企业协作进行了压力测试,但像壁画、米罗和图玛这样的软件工具为公司提供了令人难以置信的补救措施,将创意研讨会和设计会议引入数字领域,在这个领域,人们之间的协作被降级为在家工作。为了应对处理数据的特殊挑战,软件*台 Deepnote 和 detective.solutions 正在重新思考跨学科数据协作在组织环境中的实施方式。围绕 Deepnote 的团队提供了一个 Jupyter 兼容的数据科学笔记本环境,用于在机器学习模型开发上进行实时协作。虽然前者面向精通技术的人员,但 detective.solutions 提供了一个数字合作画布,无需代码即可访问大数据。这是为了帮助任何背景的企业用户掌握数据驱动项目的协作和通信密集型阶段。
正如所有创新尝试的情况一样,时间会证明这种*台是否会继续存在。但有一点是明确的:数据分析项目,无论是处于概念阶段还是已经深入数据和算法,都依赖于商人和数据工作者在数据上的合作。如果做不到这一点,就会降低一家公司从过去几年精心制作的数据中赚到大钱的几率。
参考
[1] AWS Executive Insights (2018) —数据驱动型企业的力量—https://AWS . Amazon . com/Executive-Insights/content/The-Power of-The-Data-Driven-Enterprise/
[2]埃森哲& Qlik(2020)——数据扫盲对人类的影响——https://www . Accenture . com/_ ACN media/PDF-118/Accenture-The-Human-Impact-Data-literacy . PDF # zoom = 50
[3]HBR(2018)——数据驱动型企业的一个着力点——https://HBR . org/sponsored/2018/11/An-拐点——数据驱动型企业
[4]Statista(2019)-截至 2019 年美国和全球企业采用大数据的最大挑战-https://www . Statista . com/statistics/742983/world wide-survey-corporate-big-data-adoption-barriers/
什么是计算机内核?
原文:https://towardsdatascience.com/what-is-a-computer-kernel-2320b9330eef
了解 Jupyter 笔记本电脑内核的概念
安基特·辛格在 Unsplash 上的照片
内核,或称系统核心,确保操作系统在计算机中*稳运行,是软件和硬件之间的接口。它用于所有带有操作系统的设备,例如电脑、笔记本电脑、智能手机、智能手表等。
内核执行哪些任务?
内核主要是操作系统(即软件)和设备中的硬件组件之间的接口。这导致必须完成各种任务。然而,对于最终用户来说,这项工作是不可见的,只能通过所有程序是否正确运行来表示。
当我们在计算机上使用程序时,比如 Excel,我们在所谓的图形用户界面(GUI)上处理它。该程序将每一次按钮点击或其他动作转换成机器代码,并发送给操作系统内核。如果我们想在 Excel 表格中添加一个新列,这个调用会到达系统核心。这又将调用传递给计算机处理单元(CPU ), CPU 执行该动作。
如果几个程序同时运行,系统核心还确保程序的请求被一个接一个地处理,并且给用户进程同时运行的感觉。因此,在我们的示例中,如果浏览器窗口与 Excel 同时打开,系统内核会确保程序对 CPU 和其他硬件的需求以协调的方式得到处理。
此外,还有其他更详细的任务,例如:
- 管理外部连接的设备,如键盘、鼠标或显示器及其正常运行。
- 解决内存使用错误,例如,当程序的内存使用增加过多时。
- 优化 CPU 的使用
内核由哪几层组成?
内核在几个相互构建的层中工作。其中包括:
- 硬件:最底层形成了操作系统可以访问的系统硬件的接口。这包括例如 PCI Express 控制器或存储器。
- 内存管理:在下一层,专用的可用内存量被分配给正在运行的进程。此外,虚拟主存储器也可以分布在这里。
- 流程管理:在这一层,程序的时间被管理,传入的请求被定时,这样它们对我们这些用户来说是并行的。
- 设备管理:在这一层,进行设备管理。与硬件层相反,这涉及外部连接的设备,如显示器或打印机,它们的通信通过特殊的驱动程序来保证。
- 文件系统:在最顶层,进程被分配到硬盘上的指定区域,即 HDD 或 SSD。
这些层的运作方式是,每一个更高的层都依赖并建立在它下面的层之上。例如,进程管理层也访问硬件层中的进程。然而,反之则不然。
内核类型有哪些?
通常,根据可以同时管理的进程和用户的数量来区分三种不同的内核类型。
微内核
微内核只执行最少的任务,比如内存管理和 CPU 进程管理。其他功能,如文件系统或设备管理,被外包给操作系统本身。优点是它不会像 Windows 那样导致整个系统的故障。
例如,苹果电脑的操作系统 macOS 就是基于微内核架构的。
整体内核
单片内核集中处理已经描述过的所有任务,负责所有内存和进程管理,还处理外部连接设备的硬件管理。Windows 操作系统基于单一内核。
由于采用中央设计,单片内核通常比微内核快得多,但如果单个进程运行不正常,这也会导致系统崩溃。
混合内核
顾名思义,混合内核是这两个概念的混合。它基本上也是一个大的内核,可以接管所有的任务,但是更加紧凑,可以分成不同的模块。
Jupyter 笔记本的内核是如何工作的?
在处理数据和机器学习时,人们经常会求助于 Jupyter 笔记本。它是一个基于网络的*台,用于创建和共享编程代码。它经常用于数据科学应用,因为可以执行单独的代码块,并且它们的结果(例如,图形)是直接可见的。当接下来的编程步骤依赖于先前的结果时,这对于模型创建或数据集分析尤其有利。
当使用 Jupyter Notebook 时,还会启动一个内核,这有时会导致问题,例如在下面的示例中建立连接时。然而,这与本文中所描述的操作系统完全不同。
Jupyter Notebook 内核是一个执行笔记本代码的引擎,专用于特定的编程语言,比如 Python。然而,它不执行迄今为止描述的全面的接口功能。
在处理 Jupyter 笔记本内核时,以下命令特别有用:
- 中断:该命令停止单元中当前正在运行的进程。例如,这可用于停止模型的训练,即使尚未到达所有训练时期。
- 重启&运行全部:该命令可以再次执行所有单元,删除之前的变量。如果您想将一个较新的数据集读入现有程序,这可能会很有用。
- 重启:单一的“重启”命令导致相同的结果,但并不是所有的单元都被再次执行。
重新连接:在训练大型模型时,内核会因为内存已满而“死亡”。那么重新联系是有意义的。 - 关机:只要内核还在运行,它也会占用内存。如果您要并行运行其他程序来释放内存,那么“Shutdown”命令是有意义的。
这是你应该带走的东西
- 内核确保操作系统在计算机中*稳运行,是软件和硬件之间的接口。
- 它被分成不同的层,这些层相互构建。
- 这些任务包括管理并行运行的进程或外部连接设备的正常运行。
- Jupyter Notebook 内核不是所描述的系统内核,因为它只用于执行编程代码。
如果你喜欢我的作品,请在这里订阅https://medium.com/subscribe/@niklas_lang或者查看我的网站* 数据大本营 !还有,medium 允许你每月免费阅读 3 篇 。如果你想让无限制地访问我的文章和数以千计的精彩文章,请不要犹豫,通过点击我的推荐链接:【https://medium.com/@niklas_lang/membership】每月花$5获得会员资格*
** https://medium.com/codex/understanding-the-backpropagation-algorithm-7a2e3cb4a69c **
什么是数据布道者?
原文:https://towardsdatascience.com/what-is-a-data-evangelist-f9dc068dc10a
以及如何成为一个…
简介:数据传播者——什么?
因此,让我们从数据传道者的真正含义开始。
数据传播者是通过以博客、教程、讲座、视频等形式提供技术内容来谈论数据和技术重要性的人。其目标是传播有关数据技术的知识,以及数据行业和使用特定工具的最佳实践。最终的结果是,人们爱上了它们,并自然而然地开始使用它们。
一些类似的角色包括开发者倡导者或开发者关系角色,他们有一个共同点。担任这些角色的人通常都有很强的技术背景,并且喜欢与他人分享他们的知识。
数据传道者并不是你在每个公司都能找到的典型角色,但*年来它变得越来越受欢迎。
那我是怎么成为其中一员的呢?
我的故事
我在 2008 -2013 年期间在爱丁堡大学学习人工智能。因此,我担任了几个技术角色,开始了我的职业生涯。我做过 Java 开发人员、自然语言处理工程师和数据科学家。所有这些角色都非常令人满意,并帮助我发展了技术专长,在这个阶段,我没有真正与任何人分享。
图片由 www_slon_pics 发自 Pixabay
当我在一个著名的在线训练营担任数据科学导师时,这种变化就出现了。突然,我开始与他人分享我的知识,并意识到我真的很喜欢它。这进一步促使我创建了这个媒体账户和我的个人博客。
在某种程度上,我已经成为一名数据传播者,因为我分享了我的技术专长和知识,希望其他人相信数据的力量,并从我的文章中了解更多关于 ML 和数据科学的知识。
直到 2021 年 10 月,我加入了 Toloka ,数据传道者成为我的正式工作头衔。Toloka 在人工智能和人工智能行业工作了很长时间,对人工智能有着和我自己相似的看法,特别是关于最*以数据为中心的方法。
那么,作为一名数据传播者,我典型的一天是怎样的呢?
我认为数据传道者没有典型的一天:)
事实是,角色是如此多样,每天都是不同的,但总的来说,我花了很多时间准备技术讲座和演示,撰写技术文章和教程,并致力于 Toloka 与其他 ML 和 AI 产品和*台的技术集成。
在过去的九个月里,我已经在八个不同的数据科学会议、聚会和其他 ML 社区活动上发表了演讲。他们中的大多数都有在线网络研讨会的形式,其中一些是面对面的会谈,比如这次关于以数据为中心的人工智能的会谈。
我还参与了四个 ML 产品的整合。你可以在这篇关于弹性人在回路管道的中型文章中看到这种合作的结果。其他三个仍在开发中,将在接下来的几个月内发布。
值得一提的是,作为数据传播者,我不仅从事纯技术和传播工作,还参与了活动的组织工作。今年,我帮助发起并运行了这个关于数据驱动人工智能的在线会议系列。
每周我还会花时间和 Toloka 的用户交流。这包括帮助他们解决他们面临的技术问题,特别是如果他们是机器学习性质的。这正是我过去的数据科学背景帮助很大的时候,因为我可以在我们的请求者的情况下轻松地定位自己。最后,当我作为一名 NLP 工程师或数据科学家工作时,我已经解决了多年类似的挑战。
此外,作为一名数据传播者,我还通过提出自己的观点和提供机器学习和数据科学家社区对行业的一般观点来塑造和影响我公司的 ML 产品的开发。
总结
正如你所看到的,这个角色非常多样化,需要技术和沟通技巧的结合。如果你已经在数据科学或 ML 行业工作了一段时间,并且你喜欢知识共享和公开演讲,这可能是你的正确选择。
对我来说,这是一个*稳的过渡,我相信数据传道者的角色比数据科学中的许多传统角色更适合我的个性。
那么如何开始呢?
我认为最重要的转变是从知识消费向知识创造转变。你可能已经阅读并关注了数百个在线教程,但是你有没有想过写一个呢?
即使你是这个领域的初级学生,也有一些你已经知道的东西,你可以和比你落后一步的人分享这些经验。如果你在网上分享你的作品,随着时间的推移,更多正式的机会将会到来!
PS:我正在 Medium 和https://www.aboutdatablog.com/上撰写深入浅出地解释基本数据科学概念的文章。你可以订阅我的* 邮件列表 每次我写新文章都会收到通知。如果你还不是中等会员,你可以在这里加入https://medium.com/@konkiewicz.m/membership。***
下面是一些你可能会喜欢的帖子
**💔-great-slack-data-science-communities-to-join-this-year-9d1bb1f51682> **
什么是数据可靠性工程师——你需要吗?
原文:https://towardsdatascience.com/what-is-a-data-reliability-engineer-and-do-you-need-one-4db24d7505a7
随着数据团队继续专业化,一个新的角色出现了:数据可靠性工程师。
数据可靠性工程师确保高质量的数据在整个组织中随时可用,并且始终值得信赖。图片由 Shutterstock.com的 Tamas Gabor 提供
随着软件系统在 21 世纪后期变得越来越复杂,合并开发和运营(DevOps)是显而易见的。
一半是软件工程师,一半是操作管理员,DevOps professional 的任务是在构建高性能系统和使它们安全、可伸缩和可访问之间架起一座桥梁。这不是一件容易的工作,但总得有人去做。
随着 DevOps 变得越来越流行和广泛,这个曾经新生的领域开始再次专门化。很快,站点可靠性工程师、基础设施工程师和安全工程师出现了,为软件开发带来了额外的专业知识层,允许公司快速移动,打破(许多)东西,并仍然构建更可靠和可伸缩的应用程序。
数据和分析正处于类似的十字路口:曾经的新兴职业,数据分析,以及最*的数据工程,现在是大多数认真使用数据的技术组织的重要组成部分。
“数据十年”让位于另一个专业领域:分析工程师。一部分是分析师,一部分是数据工程师,分析工程师负责将流程、框架和技术与业务利益相关者的数据需求保持一致。
这些趋势表明了一个在技术专业人士中普遍认可的真理:当一个领域的子集开始消耗如此多的时间、精力和资源时,组织和个人进行专业化就变得更加高效和有效。
那么,预计下一个主要的数据专业化是什么?数据可靠性工程师。以下是你的团队投资一个项目的原因和是否有意义。
让我们开始吧。
什么是数据可靠性工程师?
在过去几年中,随着雪花、红移和数据块等云数据仓库和湖泊的兴起,数据管道变得越来越分散和复杂,公司吸收的运营数据和第三方数据比以往任何时候都多。随着越来越多的利益相关者在数据的整个生命周期中与数据进行交互,确保高质量的数据已经成为数据团队的首要基本需求。
尽管如此,数据可靠性是更容易渴望比实现。毕竟,数据可能因为数百万个原因而损坏,从操作问题到不可预见的代码更改。Gartner 指出,仅在 2021 年,数据质量差的成本就高达每年 1290 万美元。这还没有考虑到机会成本的损失。
在过去几年与数百个团队交谈后,我们发现数据工程师和数据科学家至少花了 30%的时间处理数据质量问题。
这种对信任的高度需求导致了跨数据团队的数据工程子类的出现,称为数据可靠性工程。
数据可靠性工程师负责帮助组织在从接收到最终产品的整个数据生命周期中提供高数据可用性和质量:仪表板、机器学习模型和生产数据集。
因此,数据可靠性工程师通常会应用 DevOps 和现场可靠性工程的最佳实践,例如持续监控、设置SLA、事件管理以及对数据系统的可观察性。
数据可靠性工程师是做什么的?
这个新兴领域仍处于早期阶段,但像 DoorDash 、迪士尼流媒体服务和 Equifax 这样的公司已经开始雇佣数据可靠性工程师。
数据可靠性工程师最重要的工作是确保高质量的数据在整个组织中随时可用,并且在任何时候都值得信赖。
当损坏的数据管道出现时(因为它们总会在某一点出现),数据可靠性工程师应该是第一个发现数据质量问题的人,尽管情况并不总是如此。很多时候,坏数据首先是在仪表板和报告的下游被发现的,而不是在管道中——甚至在此之前。由于数据很少处于理想的、完全可靠的状态,数据可靠性工程师更经常的任务是将工具(如数据可观察性*台和测试)和流程(如 CI/CD)放在适当的位置,以确保当问题发生时,它们得到快速解决,并将影响传递给需要知道的人。
就像站点可靠性工程师是软件工程团队的自然延伸一样,数据可靠性工程师是数据和分析团队的延伸。
许多数据可靠性工程师在数据工程、数据科学甚至数据分析方面都有很强的背景。该角色需要对复杂的数据系统、计算机编程语言和框架(如 dbt、Airflow、Java、Python 和 SQL)有深刻的理解。
数据可靠性工程师还应该有使用流行云系统的经验,如 AWS 、 GCP 、雪花或 Databricks,并了解扩展数据*台的行业最佳实践。
数据可靠性工程师职位描述示例
有三种常见的数据可靠性工程职称,表示不同级别的资历。
通常,数据可靠性工程师拥有 3 年以上的数据工程经验,并且对整个数据生态系统有着大致的了解。
高级数据可靠性工程师通常有 5-7 年以上的经验,对数据工程最佳实践有丰富的知识,可以负责从构思到完成的任务。高级数据可靠性工程师通常负责围绕分布式数据团队和相关利益相关方的构建系统、流程和工作流制定策略。
数据可靠性工程经理往往拥有超过十年的经验,并且担任数据工程师至少 3-5 年以上。经理负责增加、扩展和雇佣数据可靠性工程时间,同时保持设计和构建更安全和可扩展的数据系统的高标准。
(当然,对这些任期建议要有所保留。我们曾与伟大的数据工程领导者共事过,他们在相关领域的经验要少得多。
虽然数据可靠性工程师的主要职责是确保您的组织拥有高质量的数据并最大限度地减少数据停机时间,但他们还有其他职责。这里有三个数据可靠性工程师职位描述我们发现它们有效地描述了这个职位。
在拥有 6000 名员工的食品配送公司 DoorDash ,一名数据可靠性工程师负责:
- 开发和实施新技术,以确保不断提高数据可靠性和数据可观察性。
- 定义决定数据质量的业务规则,协助编写验证业务规则的测试,并执行严格的测试以确保数据质量。
- 与应用程序、数据*台和数据工程团队紧密合作,重新配置数据接收管道,使其更加可靠并受到持续监控。
- 与跨职能团队一起管理数据事件并推动无过失事后分析。
对于拥有 2,600 名员工的娱乐巨头迪士尼流媒体服务公司,一名数据可靠性工程经理负责:
- 领导一个专注于解决端到端可靠性改进的数据可靠性工程师团队。
- 拥有事故管理流程,以确保事故得到快速解决,并执行和理解根本原因分析,以防止重复发生。
- 帮助团队向用户提供出色的服务,使公司更加以数据为导向。
对于全球上市信用风险评估公司 Equifax,高级数据可靠性工程师负责:
- 监控数据存储和数据分析系统的性能和可靠性,提出改进性能和可靠性的建议。
- 维护数据管道和其他大数据处理系统的基础设施可靠性。
- 主要致力于维护数据库、数据管道、部署和这些系统的可用性。
顶级数据可靠性工程师面试问题
如今,大多数工程面试都是通过视频会议进行的。图片由 Shutterstock.com菲兹克斯 提供。
雇佣一名数据可靠性工程师并不是一件容易的事情。尤其是如果这是你第一次招聘和/或申请这个职位,你可能不知道该问什么问题或期望回答什么问题。
以下是数据可靠性工程师在面试该职位时经常要回答的一些常见问题:
- 你最喜欢使用哪种编程语言?
- 数据可靠性工程师最重要的职责是什么?
- 你如何与组织中的跨职能团队沟通?
- 服务水*协议(SLA)和服务水*目标(SLO)之间有什么区别?
- 组织如何提高可观察性?
- 你能给我举个例子,说明你什么时候发现了一个以前没有发现的数据质量问题,以及你是如何传达这个影响的吗?
- 您将如何建立事故管理工作流程?
- 您如何使用您的工具来沟通和衡量数据质量的影响?
作为面试过程的一部分,也要考虑一些 leet 编码或应用程序设计的问题。你甚至可能会被要求在一个虚拟的环境中工作,这个环境包含了你未来雇主的数据堆栈中的工具,比如 Airflow 或者 dbt 。
您如何应用数据可靠性生命周期?
如前所述,数据可靠性工程师负责管理有助于提高数据*台可扩展性和可操作性的流程、技术和工作流。
事实上,许多数据团队正在从 DevOps 生命周期转向数据,并利用一个名为数据可靠性生命周期的适应流程来管理可靠数据的可用性。
数据可靠性生命周期是一种全组织范围的方法,通过将 DevOps 的最佳实践应用于数据管道,持续主动地改善数据健康状况并消除数据质量问题。
数据可靠性生命周期由三个阶段组成:检测、解决和预防。图片由巴尔·摩西提供。
通过将该框架应用于数据管道,数据可靠性工程师可以率先发现数据质量问题,充分了解影响,确切了解管道中的数据中断位置,采取行动,并收集经验教训以防止未来出现类似问题。
这种关键方法有三个主要阶段:
检测:数据可靠性工程师依靠自动监控和警报来发现新鲜度、容量、模式、沿袭和分发数据问题。借助自动化警报,当数据事件发生时,您的团队将能够更快地行动和高效地工作。
解决:在此步骤中,数据可靠性工程师应与下游利益相关方沟通,告知数据存在潜在问题,他们正在努力解决该问题。理想情况下,在 Slack、微软团队或者甚至是一个专门的网页中可能会有一个中心频道,用户可以跟随它来获取更新。
预防:在这一阶段,数据可靠性工程师处理他们的学习成果,并依靠来自其数据管道的历史数据,将它们转化为可操作的步骤以向前推进。从本质上讲,数据可靠性工程师给出了发生的变化的适当背景,以及它们是否是有意的。
例如,一家电子商务公司可能会在节日期间看到销售额的增长;因此,数据仓库中包含每日销售额的表每 12 小时更新一次。但与此同时,意外的模式更改确实会发生,当工程师将更新推送到生产环境时,原本是 daily_sales 的表意外地变成了 daily_sale 的表应该被标记出来。
随着时间的推移,随着您的数据可靠性团队的成长和数据堆栈的发展,您的测试和监控应该会自动调整和更新,以满足业务需求并最终减少中断的数据管道。像数据观察*台这样的机器学习工具会有所帮助。
数据可靠性工程师如何衡量成功?
在我们的 SRE 同行中流传着这样一句话:“如果你不能衡量它,你就不能管理它。”而且,随着数据系统的复杂性不断发展,对组织的重要性不断增加,我们可以将同样的说法应用于数据可靠性工程师。
众所周知,企业始终拥有可靠的数据是多么重要。为了衡量您的数据可靠性工程工作的成功,我们建议您衡量以下 KPI:数据信任、数据采用,以及针对数据质量问题的检测时间(TTD)、和解决时间(TTR) 。
数据信任和采用
对于数据可靠性工程师来说,最好的迹象之一是看到数据采用的全面增加。如果利益相关者使用数据进行决策,他们很可能会信任他们随时可以获得的数据的质量。
数据可靠性工程师需要了解关键数据计划的运营分析,如数据治理、数据质量、性能和成本。图片由蒙特卡洛提供。
尽早与利益相关方保持一致并就衡量整个公司数据质量的基准指标达成一致至关重要,因为这通常是主观的衡量,并且会因使用数据的团队而异。
一旦您定义了跨不同部门的高质量数据,您将更好地理解如何测量它,并可以定期与利益相关者进行核对,以与您团队的数据质量计划保持一致。过去,我见过数据团队向业务利益相关方发送季度调查,要求他们对可用数据的质量进行评级,或者利用运营分析*台来监控使用了哪些数据集、哪些团队使用了最多的数据,以及数据存储是否经过优化以最佳管理*台成本。一些数据工程师甚至使用数据质量测试的数量、最“活跃”的数据质量监视器,以及其他关注可观察性的统计数据,这些统计数据告知治理和数据质量过程是否实际工作。
数据停机时间
对于数据可靠性工程师来说,数据信任是另一个关键的“KPI ”,但实际上如何衡量呢?对于任何努力实现数据驱动的公司来说,测量数据停机时间是必不可少的。
数据停机时间是指数据损坏、丢失或出现其他错误的时间段,消耗了数据工程师 40%以上的时间,从许多方面来说,这是对数据可靠性工程师影响的最准确的衡量。
数据停机时间由三部分组成:
- 数据事件的数量(N) —鉴于您依赖于团队“外部”的数据源,这一点总是不在您的控制之下;然而,它无疑是数据正常运行时间的驱动因素。数据事件是指数据产品(例如,查看者仪表板)不准确的情况,这可能是由各种原因造成的。
- 检测时间(TTD) —当事故发生时,您的团队能多快意识到?如果没有适当的检测方法,不良数据结果中的隐性错误会导致贵公司和客户做出代价高昂的决策。
- 解决时间(TTR) —当事故发生时,您的团队解决问题的速度有多快?理想情况下,这个数字应该尽可能的低,并且沿袭的自动化工具使得追踪上游和下游的依赖关系更加容易。
为了衡量数据停机时间,我们推荐以下 KPI:
数据停机时间=数据事故数量
X
(检测时间+解析时间)
通过测量数据停机时间,您的团队可以确定数据的可靠性,看看他们是否可以将数据用于分析、ML 和其他生产用例,或者数据是否需要进一步处理和清理。
数据服务级别协议
通过制定数据质量服务水*协议(SLA ),数据可靠性工程师可以更好地定义(最重要的是,衡量)他们为企业其他部门提供的服务水*。
SLA 将有助于数据可靠性工程师与组织的其他部门就数据中最重要的内容达成一致,并有助于对传入的请求进行优先级排序。它们还应该包括服务级别指标(sli)和商定的服务级别目标(SLO)。
以 Red Ventures 为例——他们的子公司之一 Red Digital 依靠人工智能驱动的数字营销、顶级分析和来自其内容网络的数据来帮助他们的客户吸引和获得最有价值的客户。因此,广告公司需要及时准确的数据,以免影响收入。
Red Ventures 的高级数据科学家 Brandon Beidel 每周与每个业务团队会面,讨论团队如何使用数据以及数据质量如何影响他们的工作。
Beidel 发现,最好用简单的商业术语来组织对话,并关注数据的“谁、什么、哪里、何时、为什么和如何”。
他发现自己创建的以下模板在与业务利益相关方进行 SLA 对话时很有帮助。
以上是一个数据 SLA 模板,由 Red Ventures 的 Brandon Beidel 创建并经其许可使用。
为数据 SLA 准备一个简单的结构允许他的团队在满足不同团队对数据的需求方面不断发展,而不会被请求淹没。
数据可靠性工程的未来是什么样的?
LinkedIn 今年早些时候报道称,网站可靠性工程师是过去五年中增长最快的职位之一;同样,商业内幕报道称,数据科学家是 2022 年第二受欢迎的工作。显然,对洞察力和可靠性的需求从未如此之高。
数据工程师和分析师越来越多地承担起确保数据系统可靠性和质量的任务。随着堆栈变得越来越复杂,数据需求增加,公司将开始采用新的(经过战斗考验的)技术、流程和文化来跟上步伐。
数据可靠性工程师会跟进吗?只有时间能证明一切。
但是我们知道我们在哪里下注。
有兴趣了解更多关于数据可靠性工程的知识吗?伸出手去 格伦利奥 ,其余的 蒙特卡洛团队 了解更多信息。
本文由格伦·威利斯合著。
什么是机器学习工程师?
原文:https://towardsdatascience.com/what-is-a-machine-learning-engineer-597ff778e57b
意见
试图理解人工智能/人工智能行业中模糊定义的角色
作者创作的标题卡
我是一家财富 50 强公司的首席机器学习(ML)工程师,我最常被问到的问题之一就是这篇文章标题中的问题:“什么是 ML 工程师?”事实是,似乎没有一个放之四海而皆准的答案。虽然我肯定没有积极寻找新的角色,但我实际上喜欢看其他公司的招聘信息,只是为了了解其他公司在 ML 工程师技能方面的需求。现实是,当谈到像数据科学家、ML 工程师,甚至某些类型的软件工程师这样的角色时,在技能组合的期望方面有很多重叠。公司 A 定义 ML 工程师的方式可能与公司 B 定义数据科学家的方式完全相同,尽管头衔不同,但每个角色都执行完全相同的活动。这些定义的范围确实很广!
也就是说,我不会试图给 ML 工程师下一个非常精确的定义。(因为我敢肯定,如果我试图这么做,我会让某人发疯的!)相反,我认为一个更有用的考试应该是理解通常与 ML 工程师相关的技能。在分析了这些技能组合之后,我们将具体地将一般 ML 工程师和一般数据科学家的技能组合并列,特别是因为我最常听到的一个问题是,“数据科学家和 ML 工程师之间的区别是什么?”最后,我们将通过对行业发展方向的分析来总结一下,这样你就可以为未来做好最好的准备。
ML 工程师的基本技能
虽然很难确定一个 ML 工程师的精确定义,但我们至少在技能组合中看到了足够的共性,我们可以将它们大致分为三类:机器学习/深度学习、软件工程和技术架构。下面我们将更详细地分析这三个类别的含义。在继续之前,我确实想解决一个你可能会奇怪地注意到从列表中遗漏的技能:数据工程。我故意在这个列表中省略了数据工程,因为我实际上发现这种技能通常需要自己的角色,所以虽然 ML 工程师在他们的角色中执行数据工程肯定不是不可能的,但它更经常被归入像数据分析师或数据工程师这样的角色。
机器学习/深度学习
这是最简单的;就在题目里!这涉及到一个人使用机器学习和深度学习算法建立一个预测模型来解决某种商业问题。我们将在下一节更深入地探讨这一点,但实际上似乎 ML 工程师更关注最终集成到实时系统中的更复杂的计算问题。换句话说,我听到更多的人工智能工程师专注于更深入的学习问题,如计算机视觉或自然语言处理(NLP),而不是解决涉及结构化表格数据的问题。同样,这并不是说 ML 工程师从不为表格数据建立预测模型。我相信一个 ML 工程师经常花更多的时间在构建更复杂的计算模型上的部分原因是因为它需要我们的下一个技能…
软件工程
特别是当涉及到深度学习时,对于一个 ML 工程师来说,拥有一套软件工程技能是绝对“必须”的。不管你是选择使用 TensorFlow、PyTorch,还是其他计算复杂度较低的算法库,几乎所有的机器学习都以软件工程代码的形式出现。大多数 ML 工程师需要特别理解 Python 编码语言,但是如果构建 iOS 应用程序,要求 ML 工程师理解 Swift 之类的第二语言,或者如果构建 Android 应用程序,要求 ML 工程师理解 Java 之类的第二语言,这并不罕见。此外,因为应用机器学习将自己表现为软件产品,所以 ML 工程师通常需要理解与任何其他一般软件工程师角色相关的基本内容:单元测试、安全扫描、CI/CD 管道等等。
技术架构
因为应用机器学习/深度学习表现为软件产品,所以 ML 工程师拥有技术架构技能集是非常常见的。这就是构建一个“蓝图”的全部思想,这个“蓝图”展示了整个系统是如何协同工作并恰当地发挥功能的。这种工作通常不是在真空中完成的。在我自己作为 ML 工程师的角色中,我与其他更通用的技术/软件工程师合作,以了解我的机器学习 API 和批量推理解决方案如何在整个总体系统中发挥作用。因为许多公司正在向云迁移,所以一家公司要求一名 ML 工程师在相当复杂的层面上理解像亚马逊网络服务(AWS)、谷歌云*台(GCP)或微软 Azure 这样的云服务是很常见的。通常需要 ML 工程师知道这些云*台中的多个服务如何一起工作,以便适当地部署机器学习解决方案。
将数据科学家角色与 ML 工程师并列
在进入下一部分之前,请允许我再次重申,公司对这些角色的定义相当模糊,所以如果这些定义与你的经验不符,请不要感到惊讶。我经常听到的一个问题是“数据科学家和 ML 工程师的区别是什么?”或者更简洁地说,“数据科学家和 ML 工程师之间有区别吗?”我认为后一个问题的答案是肯定的,但“在沙地上画出那条线”是一项艰巨的任务。
让我们退一步来理解数据科学一般是什么。数据科学之所以被称为数据科学,是因为它反映了科学方法。是的,这和你可能在高中生物课上学到的科学方法是一样的。本质上,数据科学通过设置实验组和对照组并分析它们之间的概率差异(p 值)来了解是否有任何统计意义,从而在数据中寻找模式。如果我们能找到统计意义,那么我们就能建立预测模型,对未来的数据进行推断。
在这种形式下,数据科学与机器学习没有直接的、一对一的关联。换句话说,我们不必总是使用机器学习来建立预测模型。尤其是保险行业,在不需要机器学习的情况下,使用广义线性模型(GLMs)等数学算法已经超过一个世纪,取得了巨大的成效。事实上,由于这个原因,许多精算分析师和统计学家最*被重新命名为“数据科学家”,我同意这是一个非常公*的行动。(公*,但对我来说,它更像是一种营销/招聘工具。😂)
有了对数据科学的这种理解,你可以开始看到数据科学家和 ML 工程师的技能组合之间的二分法。数据科学家通常需要更强的数学背景,而不是软件工程背景,因为他们可以依赖“低代码”工具来完成工作,如业界最喜欢的 SAS 工具。我很高兴在许多顶尖大学指导数据科学专业的本科生和研究生,他们会告诉你这绝对是重点。奇怪的是,在我交谈过的学生中,没有一个人把重点放在软件工程或技术架构上。当谈到机器学习时,学生们经常花费大量时间用 C++编程语言从头开始编写机器学习算法(例如,支持向量机、朴素贝叶斯、梯度提升树)。
ML 工程师角色的未来
我想非常小心,以免听起来像是我在贬低传统数据科学家角色的价值。数据科学家仍然非常有价值,因为他们通过构建这些为公司提供大量价值的伟大预测模型,一次又一次地证明了自己的价值。归根结底,是不是机器学习并不重要:商业价值就是商业价值。(需要明确的是,许多数据科学家确实使用机器学习来获得商业价值。)
也就是说,我们已经看到新技术的出现,这些新技术需要软件工程和技术架构的额外技能,而这些技能在传统的数据科学家角色中是找不到的。在我对各大公司招聘信息的分析中,我看到更多的是强调这些额外的工程技能,因此对 ML 工程师的需求总体上也在增长。当然,他们可能不一定被冠以“ML 工程师”的头衔,但你绝对可以期待看到对具有上述三种技能组合的个人的持续兴趣。
好消息是,如果你现在是一名拥有强大数学背景的数据科学家,我个人认为这是最难获得的技能。是的,转向一个新的技能组合并不容易,但我认为对于一个具有强大数据科学背景的人来说,获得一个软件工程技能组合要比反之更容易。
希望你喜欢这篇文章!最后一次重申:你对如何定义 ML 工程师角色的体验会有所不同。我个人非常享受担任这个角色的时光!它提供了右脑创造力的巨大中间地带,当构建模型时,用左脑工程实现这些模型来解决真正有趣的问题。看到我们行业的未来走向,我非常激动!😃
什么是感知器?
原文:https://towardsdatascience.com/what-is-a-perceptron-5ac56720d8cf
了解神经网络的构建模块
拉蒙·萨利内罗在 Unsplash 上的照片
感知器是来自监督学习领域的算法,代表了神经网络的基本构建模块。在其最简单的形式中,它由一个使用加权输入值计算输出值的单个神经元组成。
https://medium.com/nerd-for-tech/basics-of-ai-supervised-learning-8505219f07cf
感知器是如何工作的?
感知器最初是一个数学模型,由于它学习复杂关系的能力,后来才被用于计算机科学和机器学习。在其最简单的形式中,它由一个所谓的神经元组成,模仿人脑的结构。
感知器有几个输入端,它在这些输入端接收数字信息,即数值。根据应用的不同,输入的数量可能会有所不同。输入具有不同的权重,这表明输入对最终输出的影响程度。在学习过程中,权重被改变以产生可能的最佳结果。
感知器的结构|来源:作者
然后,神经元本身形成输入值乘以输入权重的总和。这个加权和被传递给所谓的激活函数。在神经元的最简单形式中,正好有两个输出,因此只能预测二进制输出,例如,“是”或“否”或“活动”或“不活动”等。
Sigmoid 函数曲线|来源:作者
如果神经元具有二进制输出值,则使用其值也在 0 和 1 之间的函数。经常使用的激活函数的一个例子是 sigmoid 函数。函数值在 0 和 1 之间变化,实际上几乎只取这些值。除了 x = 0,还有一个陡升,从 0 跳到 1。因此,如果感知器的加权和超过 x = 0,并且感知器使用 sigmoid 作为激活函数,则输出也相应地从 0 变为 1。
哪个例子说明了感知器是如何工作的?
作为一个感知机如何工作的例子,让我们仔细看看一个政治家的工作。她是国会议员,一项新的法律必须投票表决。因此,政治家必须决定她是否同意该法案(在我们的例子中弃权是不可能的)。因此,感知器有一个二进制输出,即批准或拒绝。
政治家们可以从各种信息来源中获得决策所需的信息。一方面,有一份由议会发布的背景资料的资料文件。此外,政治家可以在互联网上了解各种问题,或者与同事讨论这些问题。这位政治家根据她认为可靠的程度来衡量她的输入,即她的信息来源。例如,她给议会信息文件的权重相对较低,因为她担心研究不够详细,应该已经倾向于某个方向。然后,她将可用信息的总和与权重一起传递给激活函数。
在这个例子中,我们可以把这个想象成我们政治家的头。她现在决定,根据输入的信息,她是否应该同意拟议的法律。即使输入的小细节也能导致政治家观点的巨大变化。
什么是多层感知器?
这个简单的模型已经可以用于许多应用程序,但在理解和学习更复杂的关系时很快就达到了极限。因此,在实践中,重点主要是几层感知器,然后将它们组装起来,形成所谓的人工神经网络。
https://medium.com/illumination/intuitive-guide-to-artificial-neural-networks-5a2925ea3fa2
这些所谓的多层感知器以这样一种方式相互连接,即只有第一层神经元接收来自网络外部的输入。另一方面,在后续层中,先前层的输出充当当前层的输入。只有神经网络最后一层的神经元是输出,然后被用作实际结果。
神经网络结构|来源:作者
与我们的政策例子相关,我们可以更仔细地观察政治家的信息来源。例如,议会的信息文件由各种研究助理的工作组成,他们的加权工作已被纳入最终产品。反过来,这些合作者也可以表示为网络中的个体感知器。
有哪些偏向神经元?
在多层感知器中,使用所谓的偏置神经元。这些是特殊的输入神经元,然而,它们没有外部意义,而是假定一个在学习过程中也会改变的恒定值。这允许激活函数的曲线向下或向上移动。
例如,偏差类似于线性回归中使用的常数,有助于模型更好地拟合输出值,从而改善结果。
哪些应用使用了感知器?
神经网络基于感知机,主要用于机器学习领域。这里的目标主要是学习以前数据中的结构,然后预测新的值。一些例子是:
- 图像中的物体识别 : 人工神经网络可以识别图像中的物体或将图像归入某一类。例如,公司在自动驾驶中使用这一属性来识别汽车应该做出反应的对象。另一个应用领域是在医学中,例如,当检查 X 射线图像以检测癌症的早期阶段时。
- 顾客情感分析 :通过互联网,顾客有很多渠道公开对品牌或产品的评价。因此,公司需要跟踪客户是否大部分满意。有了一些被分类为好或坏的评论,可以训练高效的模型,然后这些模型可以自动对大量评论进行分类。
- 垃圾邮件检测:在许多邮件程序中,有可能将具体的电子邮件标记为垃圾邮件。这些数据用于训练机器学习模型,这些模型直接将未来的电子邮件标记为垃圾邮件,这样最终用户甚至不会看到它们。
感知器的优缺点是什么?
感知器的使用具有以下优点和缺点。
优势
- 借助单层感知器,特别是多层感知器,即所谓的神经网络,可以在监督学习的领域中学习复杂的预测。
- 根据数据,可以很容易地增加输入的数量,以便在预测中包含不同的相关值。
- 受过训练的感知器相对容易解释,学习到的权重可以用来说明输入有多重要。
不足之处
- 单个感知器很少能提供真正好的结果。对于强大的模型,通常必须建立具有许多神经元的不同层。
- 尤其是多层感知器只对大型数据集有效。
- 训练多层感知器通常是耗时且资源密集的。
- 在许多层中,权重的可解释性丧失了,并且形成了一个“黑箱”,其良好的预测无法真正得到解释。
这是你应该带走的东西
- 感知器是来自监督学习领域的算法,代表神经网络的基本构建块。
- 当单个感知器被构建并连接成多层时,它被称为多层感知器或神经网络。
- 感知器由输入、权重、激活函数和输出组成。
- 它可以用来学习数据中的复杂关系,并将它们应用到新的、以前看不到的数据中。
如果你喜欢我的作品,请在这里订阅https://medium.com/subscribe/@niklas_lang或者查看我的网站* 数据大本营 !此外,媒体允许你每月免费阅读三篇文章。如果你想让无限制地访问我的文章和数以千计的精彩文章,不要犹豫,通过点击我的推荐链接:【https://medium.com/@niklas_lang/membership】每月花$ 5 获得会员资格*
** https://medium.com/codex/understanding-the-backpropagation-algorithm-7a2e3cb4a69c **
什么是量子计算机?
原文:https://towardsdatascience.com/what-is-a-quantum-computer-f1c44e87a379
量子计算机是一项将产生重大影响的新兴技术
图 1: IBM 量子系统一号(CES 2020) /来源链接 (CC BY-ND 2.0)
量子计算和人工智能可以结合起来,产生更大的影响。这篇博文的目标是介绍量子计算机的基本概念,并试图揭开它们的神秘面纱。量子计算机使用在微观(亚原子)水*上观察到的物质属性来执行计算和解决问题。相比之下,目前的计算机(自 20 世纪 50 年代以来)在相对宏观(半导体元素)的水*上使用物质的属性。量子计算机的进展将在不久的将来产生重大影响。它可以使当前的互联网加密标准变得无用,减少药物开发时间,改变人工智能等等。量子计算机已经展示了(例如, 肖尔算法 )与非量子(又名经典计算机)计算机相比的指数加速。这篇文章概括了以下内容。
- 量子计算背后的物理学
- 它将如何/为什么超越基于芯片的计算
- 会更好地解决哪些问题
经典到量子物理学
通过利用硅半导体的独特特性,向数字世界的过渡成为可能。它只有在满足某些条件后才导电,否则就像绝缘体一样。这种行为被用来执行基本级操作,例如与/或逻辑、基本算术运算等。通过硅门。计算机就是建立在这些基础之上的。
经典物理学在元素水*(如硅、铜)描述物质的属性,我们控制并使用这些属性进行计算、数据存储和信息处理及传输。
同样,量子物理/力学在微观亚原子水*上解释物质的性质,即电子和光子。量子计算机在亚原子水*上控制和利用物质的属性来执行计算。经典物理和量子物理的区别不仅仅在于尺度或大小。经典物理学的规则在量子层面失效了。我们需要一套全新的方法和工程来建造量子计算机。
表 1:经典物理和量子物理之间的高度差异
自从量子力学的框架第一次被开发出来已经有一个多世纪了,但是科学家们对量子水*上的观察的含义还没有达成共识。 哥本哈根解释 ,这是归功于尼尔斯·玻尔和维尔纳·海森堡的最普遍接受的版本。甚至阿尔伯特·爱因斯坦也没有完全接受哥本哈根解释。事实上,爱因斯坦的广义相对论并不符合量子力学,他最初拒绝量子力学,因为它的不确定性。
硅基计算的终极之路
1965 年,戈登·摩尔预测计算机的速度大约每两年翻一番。它被编码为摩尔定律,至今仍被证明是正确的。在此期间,硅晶体管的尺寸不断缩小。最初的尺寸是一个拇指指甲的大小,即 1950 年代的 1cm。现在在 2022 年,它是 3 纳米(即小于 1cm 的~7 个数量级),接*硅原子的大小(. 2 纳米)。物理上不可能将硅晶体管的尺寸缩小到原子尺寸以下来获得进一步的加速。因此,一些人呼吁终止基于半导体计算的摩尔定律。计算创新的下一阶段可能由量子计算机引领。
图 2:对数标度中的摩尔定律图表/来源:ourworldindata.org&卡尔鲁普(CC BY 4.0)
量子解
更高级软件和架构的创新,例如机器学习和分布式/并行计算的形式,已经提供了克服一些计算限制以解决更困难问题的手段。但与这些解决方案不同,量子计算机从头开始提供计算增益。它有可能引领计算领域的下一波创新,以解决棘手的问题。量子计算的计算收益将比摩尔定律预测的快几个数量级。由于加速发生在基础层,它可以与更高层次的创新相结合,如机器学习,如 量子机器学习 (例如 谷歌量子人工智能 ),以及作为托管云服务提供的商品化&(例如 亚马逊 Braket 量子计算机 s) 。
量子特性
量子计算的两个基本属性是:
- 叠加
- 纠缠
在我们进入它们之前,掌握一个量子位的概念是很重要的。
量子位(vs 比特)
经典计算、存储和通信中的信息单位是一个位,用二进制数 0 或 1 表示。它们是硬件(硅晶体管)级别的低电荷和高电荷(电压)的数字表示。硬件单元的状态总是 0(低电压)或 1(高电压)。在量子水*上,事情并不是那么分散的。在亚原子粒子被观察到(测量到)之前,它处于 0 和 1 两种状态,也就是说,一个电子可以向上或向下旋转。量子系统中的这种信息或状态单位被称为量子位。
a)叠加
这种在量子系统中同时为 0 和 1 的现象被称为叠加。叠加表示量子比特(qubits)的所有可能状态。不同状态的叠加在测量过程中坍缩成特定的状态。这在薛定谔的猫的思想实验中得到了说明,在这个实验中,一只猫和一个放射源一起被放在一个密封的盒子里,在人们观察盒子里的情况之前,它被认为是既活又死的。
b)纠缠
这是一种现象,其中两个或更多的亚原子粒子具有相同的状态属性(例如,0 或 1),尽管它们之间有距离。没有人能解释这是为什么或如何发生的。如果亚原子粒子之间存在某种通信来实现这一点,信号的传播速度必须超过光速,根据爱因斯坦的相对论,这是不可能的。爱因斯坦将纠缠称为“超距幽灵行动”。
量子计算机与经典计算机
量子计算机有多个处于纠缠态的量子比特,同时进行所有可能的量子比特组合。它们被折叠成所需的状态以解决特定的问题。由于一个量子位可以同时处于 0 或 1 状态,一台 n 量子位量子计算机可以同时处理 2ⁿ 状态。经典计算机需要双倍的位数(内存)或处理速率来实现双倍的速度。在量子计算机中,只需再增加一个量子比特(即量子比特),速度就会翻倍。因此,它可以比一次处理一个状态的经典计算机获得指数级的加速。理论上,一台 28 量子位的量子计算机相当于超过 268 百万位(2 ⁸)的硅基经典计算机,如表 2 所示。
量子优势是量子计算机可以在合理的时间内解决经典计算机无法解决的问题的既定目标。2019 年 10 月,谷歌声称他们用 54 量子位实现了量子优势。
表 2:基于比特/量子比特大小比较经典计算机和量子计算机
表 2:第 1 列和第 2 列摘自来源[ 1 和[ 2 ]。第三列是基于量子特性的外推。第四栏是我的理论比较,不代表任何官方价值。事实上,我的值可能被低估了,因为谷歌证实了他们在 2019 年实现量子优势的 54 量子位(表 2 第 5 行)量子计算机在 200 秒内完成了一项超级计算机需要 10,000 年才能完成的任务。
将量子位添加到架构中并不是一件容易的事情,因为它们对环境条件非常敏感,这会导致量子属性的损失。量子计算机需要接*绝对零度的温度,即大约-460 华氏度,才能运行。
量子计算机用例
并不是所有的问题都会受益于量子计算机,正如我在之前的帖子中所讨论的,机器学习与传统软件开发相比,并不是所有的问题都能得到更好的解决。
https://ajay-shrestha.medium.com/machine-learning-vs-software-development-4b23cc182742
值得注意的是,目前量子计算机的使用仅限于特定的问题,包括一些 NP 难题,这需要在大的搜索空间中筛选。量子计算机已经在一些领域有所作为:
- 药物发现
- 加密破解
- 最佳化
由于叠加性质,量子计算机可以在一个周期内模拟整个解搜索空间的所有组合,而经典计算机需要多次迭代。因此,量子计算机最适合搜索和组合优化问题。上面列出的用例就属于这一类。
摘要
量子计算机非常有前途,已经开始解决现实世界的问题。只要我们能够通过控制亚原子粒子运行的环境来保持它们的量子特性,我们就能够在架构中添加更多的量子位。确定哪些问题更适合量子计算机和构建量子算法是活跃的研究领域。迄今为止, 格罗弗算法 和 肖尔算法 是最受欢迎的量子算法,与非量子算法相比,它们分别提供了多项式和指数加速。
在未来,经典计算机和量子计算机将共存,并将相互补充。经典计算机更适合于顺序任务(例如,在我的笔记本电脑上写这篇博客)和事务性任务(例如,计算购物车余额),而量子计算机将用于解决具有大解决方案搜索空间的更困难的问题。
资源
- https://en.wikipedia.org/wiki/Quantum_supremacy
- https://analyticsindiamag . com/race-quantum-supreme-complete-timeline/
- 量子叠加——维基百科
- 波粒二象性——维基百科
- 量子机器学习—维基百科
- 谷歌量子人工智能
- https://research.ibm.com/quantum-computing
- 亚马逊 Braket 量子计算机——亚马逊网络服务
- 亚马逊 Braket——量子计算入门| AWS 新闻博客
- 肖尔算法—维基百科
- https://en.wikipedia.org/wiki/Grover's_algorithm
- 非结构化问题的量子加速:解决两个二十年前的问题——微软研究
- 哥本哈根解读—维基百科
- 测不准原理—维基百科
- https://phys . org/news/2015-11-quantum-迭加原理-事件. html
- https://www . scientific American . com/video/how-do-a-quantum-computer-work/
【https://en.wikipedia.org/wiki/Schrödinger's_cat】T21 - https://www . scientific American . com/article/quantum-computers-competition-for-supremity/
- https://www . popular mechanics . com/science/green-tech/a 30915638/quantum-memory-entangled/
- https://phys . org/news/2015-11-quantum-迭加原理-事件. html
- https://www . mcgill tribune . com/sci-tech/the-universe-at-odds-quantum-mechanics-vs-general-relativity 040418/
- https://www . technology review . com/2019/01/29/66141/什么是量子计算/
- 【https://en.wikipedia.org/wiki/NP-hardness
- https://Cambridge quantum . com/the-journal/future-quantum-drug-discovery/
在 Keras 和 Tensorflow 中为 NLP 项目实现 SimpleRNN、GRU 和 LSTM 模型
阿特·哈廷顿在 Unsplash 上拍摄的照片
在 Keras 和 Tensorflow 中为 NLP 项目实现 SimpleRNN、GRU 和 LSTM 模型
递归神经网络介绍及情感分析中三种递归神经网络在 Tensorflow 和 Keras 中的实现
递归神经网络(RNNs)是深度学习中最先进的算法之一,尤其适用于序列数据。它被用于许多备受瞩目的应用,包括谷歌的语音搜索和苹果的 Siri。它变得如此受欢迎的原因是它的内存。RNNs 是第一个可以记住输入的深度学习算法。在 LSTM 和 GRU 发明之后,rnn 变得非常强大。在本文中,我们将使用所有这三种类型的 rnn 进行一个自然语言处理项目。
我们将讨论 RNNs 如何工作,并在深度学习领域带来如此多的效率。对于情感分析任务,将有一个简单的 RNN、GRU 和 LSTM 的实际实现。
我将非常简要地讨论一个简单的递归神经网络如何为复习者工作,然后深入到实现中。如果您愿意,可以跳过这一部分,直接进入 Tensorflow 实现部分。
什么是递归神经网络?
因为递归神经网络有内部记忆,所以可以从输入和前几层记住重要的东西。这就是它比常规神经网络更有效的原因,rnn 是文本数据、时间序列、金融数据、天气预报等序列数据的首选算法。
递归神经网络如何工作?
为了真正理解递归神经网络如何工作以及它为什么特殊,我们需要将它与常规的前馈神经网络进行比较。
以下是常规前馈神经网络的图片演示:
作者图片
在前馈神经网络中,信息从一层移动到另一层。我们使用来自输入层的信息来计算隐藏层。如果有几个隐藏层,则仅使用前一个隐藏层的信息来计算下一个隐藏层。计算输出图层时,仅使用前一图层的信息。因此,当我们计算输出层时,我们忘记了输入层或其他层。
但是,当我们处理文本数据、时间序列数据或任何其他顺序数据时,记住前面的层中有什么也很重要。
在 RNN,信息在内部循环。因此,当 RNN 计算输出图层时,它会考虑前一个图层以及前一个图层。因为它有短期记忆。这里有一个图片演示:
作者图片
如图所示,信息在这一层循环。当循环发生时,它具有来自最*过去的信息。下面是 RNN 结构的展开版本,可以更好地理解它的工作原理:
作者图片
这里,x0、x1 和 x2 表示输入。H0、H1 和 H2 是隐藏层中的神经元,y0、y1 和 y2 是输出。
如上图所示,每个时间戳都从前一个神经元和输入中获取信息。信息在一层中循环。
这非常重要,因为前一个神经元可能包含关于下一个神经元的重要信息。例如,考虑这个句子,
天空是蓝色的
如果我只知道“是”这个词,我无法想象接下来会发生什么。但是如果我知道两个连续的单词“sky is ”,那么我们可能会想到单词“blue”。
但这也是递归神经网络的一个局限。RNNs 只有短期记忆。但是短期记忆始终不足以发现接下来会发生什么。举个例子,
她是中国人,她的语言是…
在这里,仅仅记住前面的两三个单词并不能让我们知道语言是什么。我们要一路走来记住“中国人”这个词。只有到那时,我们才能预测这种语言的名称。
这就是长短期记忆(LSTM)或门控循环单元(GRU)有所帮助的时候。它们都是简单 RNN 的更高级版本。解释它们的机制超出了本文的范围。本文的重点是展示如何在 TensorFlow 中实现它们。
资料组
我将使用 Tensorflow 附带的 IMDB 数据集。这是一个大型电影评论数据集。数据是文本数据,标签是二进制的。它已经为我们分离了 25000 个训练数据和 25000 个测试数据。点击了解关于该数据集的更多信息。对于练习一些自然语言处理任务来说,这是一个非常好的数据集。该数据集的每一行都包含预期的文本数据,标签为 0 或 1。所以,它代表好的情绪或坏的情绪。
让我们深入研究这个项目。
以下是进口货:
import numpy as np
import tensorflow as tf
import tensorflow_datasets as tfds
我正在导入 IMDB 数据集及其信息:
imdb, info = tfds.load("imdb_reviews",
with_info=True, as_supervised=True)
在单独的变量中设置训练和测试数据:
train_data, test_data = imdb['train'], imdb['test']
数据预处理
将所有文本作为一个列表,将标签作为一个单独的列表将会很有帮助。因此,训练句子和标签以及测试句子和标签作为列表被检索如下:
training_sentences = []
training_labels = []testing_sentences = []
testing_labels = []for s,l in train_data:
training_sentences.append(str(s.numpy()))
training_labels.append(l.numpy())for s,l in test_data:
testing_sentences.append(str(s.numpy()))
testing_labels.append(l.numpy())
将标签转换为 NumPy 数组:
training_labels_final = np.array(training_labels)
testing_labels_final = np.array(testing_labels)
在这里,我设置一些重要的参数是必要的模型。我将在此之后解释它们是什么:
vocab_size = 10000
embedding_dim=16
max_length = 120
trunc_type= 'post'
oov_tok="<OOV>"
这里,vocal_size 10000。这意味着这个模型将使用 10000 个独特的单词。如果 IMDB 数据集超过 10000 个单词,多余的单词将不会用于训练模型。所以,通常情况下,我们会小心翼翼地取这个数。请随意尝试不同的 vocab_size。
下一个参数是‘embedding _ dim’。它表示将用于表示每个单词的向量的大小。这里 embedding_dim 是 16 意味着,大小为 16 的向量将表示每个单词。您也可以在此尝试不同的号码。
每段文本或预测标签的最大长度为 120 个单词。这就是 max_length 参数所表示的内容。如果文本比原来大,它将被截断。
下一个参数 trunc_type 设置为‘post’。这意味着文本将在末尾被截断。
如果有一个未知单词将由 oov_tok 表示。
数据预处理从标记 NLP 项目中的文本开始。
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequencestokenizer = Tokenizer(num_words = vocab_size, oov_token=oov_tok)
tokenizer.fit_on_texts(training_sentences)
word_index = tokenizer.word_indexword_index
以下是 word_index 的部分输出:
{'<OOV>': 1,
'the': 2,
'and': 3,
'a': 4,
'of': 5,
'to': 6,
'is': 7,
'br': 8,
'in': 9,
'it': 10,
'i': 11,
'this': 12,
'that': 13,
'was': 14,
'as': 15,
'for': 16,
'with': 17,
'movie': 18,
因此,每个单词都有一个唯一的整数值。这里我们用这些整数值代替单词来安排句子。此外,如果句子少于我们设置的 max_length 120 个单词,请使用填充。这样,我们将为每个文本提供相同大小的向量。
sequences = tokenizer.texts_to_sequences(training_sentences)
padded = pad_sequences(sequences, maxlen=max_length,
truncating = trunc_type)testing_sequences = tokenizer.texts_to_sequences(testing_sentences)
testing_padded = pad_sequences(testing_sequences, maxlen=max_length)
数据预处理完成。
模型开发
这是有趣的部分。
简单的 RNN
第一个模型将是简单的递归神经网络模型。
在这个模型中,第一层将是嵌入层,其中句子将通过嵌入向量表示为 max_length。下一层是一个简单的 RNN 层。然后是致密层。这是模型
model = tf.keras.Sequential([
tf.keras.layers.Embedding(vocab_size, embedding_dim,
input_length=max_length),
tf.keras.layers.SimpleRNN(32),
tf.keras.layers.Dense(10, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.summary()
输出:
Model: "sequential_8"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding_8 (Embedding) (None, 120, 16) 160000
_________________________________________________________________
simple_rnn (SimpleRNN) (None, 32) 1568
_________________________________________________________________
dense_16 (Dense) (None, 10) 330
_________________________________________________________________
dense_17 (Dense) (None, 1) 11
=================================================================
Total params: 161,909
Trainable params: 161,909
Non-trainable params: 0
_________________________
看每一层的输出形状。第一层输出形状为(120,16)。记住我们每个句子的 max_length 是 120,嵌入维数是 16。请随意更改这些数字并检查结果。
在第二层中,我们将 32 作为 SimpleRNN 层中的参数,输出形状也是 32。
这里,我们将使用 binary_crossentropy 的损失函数、“adam”优化器以及作为准确性的评估度量来编译模型。
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
我将训练 30 个纪元的模型。
num_epochs=30
history=model.fit(padded, training_labels_final, epochs=num_epochs, validation_data = (testing_padded, testing_labels_final))
输出:
Epoch 1/30
782/782 [==============================] - 17s 20ms/step - loss: 0.6881 - accuracy: 0.5256 - val_loss: 0.6479 - val_accuracy: 0.6355
Epoch 2/30
782/782 [==============================] - 15s 19ms/step - loss: 0.5035 - accuracy: 0.7632 - val_loss: 0.4880 - val_accuracy: 0.7865
Epoch 3/30
782/782 [==============================] - 15s 20ms/step - loss: 0.2917 - accuracy: 0.8804 - val_loss: 0.5812 - val_accuracy: 0.7457
Epoch 4/30
782/782 [==============================] - 16s 20ms/step - loss: 0.1393 - accuracy: 0.9489 - val_loss: 0.6386 - val_accuracy: 0.7952
Epoch 5/30
782/782 [==============================] - 15s 19ms/step - loss: 0.0655 - accuracy: 0.9768 - val_loss: 0.9400 - val_accuracy: 0.7277
Epoch 6/30
782/782 [==============================] - 16s 20ms/step - loss: 0.0360 - accuracy: 0.9880 - val_loss: 0.9493 - val_accuracy: 0.7912
Epoch 7/30
782/782 [==============================] - 15s 20ms/step - loss: 0.0273 - accuracy: 0.9900 - val_loss: 1.1033 - val_accuracy: 0.7491
Epoch 8/30
782/782 [==============================] - 16s 20ms/step - loss: 0.0993 - accuracy: 0.9639 - val_loss: 1.1237 - val_accuracy: 0.5752
Epoch 9/30
782/782 [==============================] - 15s 19ms/step - loss: 0.2071 - accuracy: 0.9136 - val_loss: 1.0613 - val_accuracy: 0.6309
Epoch 10/30
782/782 [==============================] - 15s 20ms/step - loss: 0.0267 - accuracy: 0.9928 - val_loss: 1.4416 - val_accuracy: 0.6720
Epoch 11/30
782/782 [==============================] - 16s 20ms/step - loss: 0.0031 - accuracy: 0.9996 - val_loss: 1.6674 - val_accuracy: 0.6721
Epoch 12/30
782/782 [==============================] - 15s 20ms/step - loss: 5.8072e-04 - accuracy: 1.0000 - val_loss: 1.8338 - val_accuracy: 0.6714
Epoch 13/30
782/782 [==============================] - 15s 19ms/step - loss: 2.5399e-04 - accuracy: 1.0000 - val_loss: 1.8619 - val_accuracy: 0.6824
Epoch 14/30
782/782 [==============================] - 15s 20ms/step - loss: 1.4048e-04 - accuracy: 1.0000 - val_loss: 1.8995 - val_accuracy: 0.6927
Epoch 15/30
782/782 [==============================] - 15s 20ms/step - loss: 8.4974e-05 - accuracy: 1.0000 - val_loss: 1.9867 - val_accuracy: 0.6934
Epoch 16/30
782/782 [==============================] - 15s 20ms/step - loss: 5.2411e-05 - accuracy: 1.0000 - val_loss: 2.0710 - val_accuracy: 0.6940
Epoch 17/30
782/782 [==============================] - 17s 22ms/step - loss: 3.2760e-05 - accuracy: 1.0000 - val_loss: 2.1278 - val_accuracy: 0.6980
Epoch 18/30
782/782 [==============================] - 16s 20ms/step - loss: 2.0648e-05 - accuracy: 1.0000 - val_loss: 2.2035 - val_accuracy: 0.6988
Epoch 19/30
782/782 [==============================] - 15s 19ms/step - loss: 1.3099e-05 - accuracy: 1.0000 - val_loss: 2.2611 - val_accuracy: 0.7031
Epoch 20/30
782/782 [==============================] - 15s 20ms/step - loss: 8.3039e-06 - accuracy: 1.0000 - val_loss: 2.3340 - val_accuracy: 0.7038
Epoch 21/30
782/782 [==============================] - 16s 20ms/step - loss: 5.2835e-06 - accuracy: 1.0000 - val_loss: 2.4453 - val_accuracy: 0.7003
Epoch 22/30
782/782 [==============================] - 16s 20ms/step - loss: 3.3794e-06 - accuracy: 1.0000 - val_loss: 2.4580 - val_accuracy: 0.7083
Epoch 23/30
782/782 [==============================] - 20s 26ms/step - loss: 2.1589e-06 - accuracy: 1.0000 - val_loss: 2.5184 - val_accuracy: 0.7112
Epoch 24/30
782/782 [==============================] - 18s 23ms/step - loss: 1.3891e-06 - accuracy: 1.0000 - val_loss: 2.6400 - val_accuracy: 0.7055
Epoch 25/30
782/782 [==============================] - 20s 25ms/step - loss: 8.9716e-07 - accuracy: 1.0000 - val_loss: 2.6727 - val_accuracy: 0.7107
Epoch 26/30
782/782 [==============================] - 20s 25ms/step - loss: 5.7747e-07 - accuracy: 1.0000 - val_loss: 2.7517 - val_accuracy: 0.7105
Epoch 27/30
782/782 [==============================] - 17s 22ms/step - loss: 3.7458e-07 - accuracy: 1.0000 - val_loss: 2.7854 - val_accuracy: 0.7159
Epoch 28/30
782/782 [==============================] - 18s 23ms/step - loss: 2.4265e-07 - accuracy: 1.0000 - val_loss: 2.8592 - val_accuracy: 0.7158
Epoch 29/30
782/782 [==============================] - 17s 22ms/step - loss: 1.5808e-07 - accuracy: 1.0000 - val_loss: 2.9216 - val_accuracy: 0.7172
Epoch 30/30
782/782 [==============================] - 17s 22ms/step - loss: 1.0345e-07 - accuracy: 1.0000 - val_loss: 2.9910 - val_accuracy: 0.7174
30 个周期后,训练精度变为 1.00 或 100%。完美,对吧?但验证准确率为 71.74%。没那么糟。但是巨大的过度拟合问题。
这将是很好的,看看如何精度和损失随着每个时代的变化。
import matplotlib.pyplot as pltdef plot_graphs(history, string):
plt.plot(history.history[string])
plt.plot(history.history['val_'+string])
plt.xlabel("Epochs")
plt.ylabel(string)
plt.legend([string, 'val_'+string])
plt.show()plot_graphs(history, 'accuracy')
plot_graphs(history, 'loss')
作者图片
验证精度在开始时波动很大,然后稳定在 71.74%。另一方面,训练精度稳步上升到 100%,除了一个下降。
但是验证的损失曲线看起来很糟糕。它一直在上升。我们希望损失减少。
门控循环单元(GRU)
这是 RNN 模型的改进版本。它比简单的神经网络模型更有效。它有两个门:复位和更新。在本次演示中,我将用具有相同数量单位的双向 GRU 层替换 SimpleRNN 层。
这是模型
model = tf.keras.Sequential([
tf.keras.layers.Embedding(vocab_size, embedding_dim,
input_length=max_length),
tf.keras.layers.Bidirectional(tf.keras.layers.GRU(32)),
tf.keras.layers.Dense(10, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.summary()
输出:
Model: "sequential_6"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding_6 (Embedding) (None, 120, 16) 160000
_________________________________________________________________
bidirectional_6 (Bidirection (None, 64) 9600
_________________________________________________________________
dense_12 (Dense) (None, 10) 650
_________________________________________________________________
dense_13 (Dense) (None, 1) 11
=================================================================
Total params: 170,261
Trainable params: 170,261
Non-trainable params: 0
正如你所看到的,除了 GRU 层,所有层的输出形状与前一层完全相同。因为是双向的,所以这里 32 变成了 64。
我将使用与之前完全相同的参数来编译模型,并为相同数量的时期训练模型。
model.compile(loss="binary_crossentropy",
optimizer='adam',
metrics=['accuracy'])history=model.fit(padded, training_labels_final, epochs=num_epochs,
validation_data = (testing_padded,testing_labels_final))
输出:
Epoch 1/30
782/782 [==============================] - 50s 60ms/step - loss: 0.5664 - accuracy: 0.6990 - val_loss: 0.4313 - val_accuracy: 0.8025
Epoch 2/30
782/782 [==============================] - 43s 56ms/step - loss: 0.3638 - accuracy: 0.8440 - val_loss: 0.3667 - val_accuracy: 0.8394
Epoch 3/30
782/782 [==============================] - 44s 56ms/step - loss: 0.2852 - accuracy: 0.8882 - val_loss: 0.3695 - val_accuracy: 0.8420
Epoch 4/30
782/782 [==============================] - 43s 55ms/step - loss: 0.2330 - accuracy: 0.9120 - val_loss: 0.3979 - val_accuracy: 0.8381
Epoch 5/30
782/782 [==============================] - 42s 54ms/step - loss: 0.1942 - accuracy: 0.9323 - val_loss: 0.4386 - val_accuracy: 0.8334
Epoch 6/30
782/782 [==============================] - 44s 56ms/step - loss: 0.1573 - accuracy: 0.9472 - val_loss: 0.4546 - val_accuracy: 0.8290
Epoch 7/30
782/782 [==============================] - 44s 57ms/step - loss: 0.1223 - accuracy: 0.9612 - val_loss: 0.5259 - val_accuracy: 0.8244
Epoch 8/30
782/782 [==============================] - 44s 56ms/step - loss: 0.0897 - accuracy: 0.9729 - val_loss: 0.6248 - val_accuracy: 0.8234
Epoch 9/30
782/782 [==============================] - 44s 57ms/step - loss: 0.0690 - accuracy: 0.9788 - val_loss: 0.6511 - val_accuracy: 0.8169
Epoch 10/30
782/782 [==============================] - 50s 64ms/step - loss: 0.0514 - accuracy: 0.9847 - val_loss: 0.7230 - val_accuracy: 0.8223
Epoch 11/30
782/782 [==============================] - 45s 57ms/step - loss: 0.0402 - accuracy: 0.9882 - val_loss: 0.8357 - val_accuracy: 0.8167
Epoch 12/30
782/782 [==============================] - 52s 67ms/step - loss: 0.0323 - accuracy: 0.9902 - val_loss: 0.9256 - val_accuracy: 0.8140
Epoch 13/30
782/782 [==============================] - 49s 63ms/step - loss: 0.0286 - accuracy: 0.9915 - val_loss: 0.9685 - val_accuracy: 0.8184
Epoch 14/30
782/782 [==============================] - 45s 58ms/step - loss: 0.0232 - accuracy: 0.9930 - val_loss: 0.8898 - val_accuracy: 0.8146
Epoch 15/30
782/782 [==============================] - 44s 57ms/step - loss: 0.0209 - accuracy: 0.9927 - val_loss: 1.0375 - val_accuracy: 0.8144
Epoch 16/30
782/782 [==============================] - 43s 55ms/step - loss: 0.0179 - accuracy: 0.9944 - val_loss: 1.0408 - val_accuracy: 0.8131
Epoch 17/30
782/782 [==============================] - 45s 57ms/step - loss: 0.0131 - accuracy: 0.9960 - val_loss: 1.0855 - val_accuracy: 0.8143
Epoch 18/30
782/782 [==============================] - 43s 55ms/step - loss: 0.0122 - accuracy: 0.9964 - val_loss: 1.1825 - val_accuracy: 0.8105
Epoch 19/30
782/782 [==============================] - 45s 57ms/step - loss: 0.0091 - accuracy: 0.9972 - val_loss: 1.3037 - val_accuracy: 0.8097
Epoch 20/30
782/782 [==============================] - 44s 56ms/step - loss: 0.0089 - accuracy: 0.9972 - val_loss: 1.2140 - val_accuracy: 0.8125
Epoch 21/30
782/782 [==============================] - 45s 58ms/step - loss: 0.0076 - accuracy: 0.9976 - val_loss: 1.2321 - val_accuracy: 0.8136
Epoch 22/30
782/782 [==============================] - 45s 58ms/step - loss: 0.0119 - accuracy: 0.9962 - val_loss: 1.1726 - val_accuracy: 0.8072
Epoch 23/30
782/782 [==============================] - 46s 59ms/step - loss: 0.0093 - accuracy: 0.9969 - val_loss: 1.2273 - val_accuracy: 0.8029
Epoch 24/30
782/782 [==============================] - 45s 57ms/step - loss: 0.0065 - accuracy: 0.9978 - val_loss: 1.3390 - val_accuracy: 0.8118
Epoch 25/30
782/782 [==============================] - 50s 64ms/step - loss: 0.0053 - accuracy: 0.9984 - val_loss: 1.2323 - val_accuracy: 0.8088
Epoch 26/30
782/782 [==============================] - 44s 56ms/step - loss: 0.0081 - accuracy: 0.9973 - val_loss: 1.2998 - val_accuracy: 0.8123
Epoch 27/30
782/782 [==============================] - 44s 57ms/step - loss: 0.0043 - accuracy: 0.9986 - val_loss: 1.3976 - val_accuracy: 0.8098
Epoch 28/30
782/782 [==============================] - 41s 53ms/step - loss: 0.0039 - accuracy: 0.9989 - val_loss: 1.6791 - val_accuracy: 0.8043
Epoch 29/30
782/782 [==============================] - 42s 54ms/step - loss: 0.0037 - accuracy: 0.9987 - val_loss: 1.4269 - val_accuracy: 0.8101
Epoch 30/30
782/782 [==============================] - 41s 53ms/step - loss: 0.0059 - accuracy: 0.9982 - val_loss: 1.4012 - val_accuracy: 0.8150
如您所见,30 个时期后,训练集的最终准确度为 0.9982 或 99.82%,验证准确度的准确度为 81.50%。训练精度略低于简单的 RNN 模型,但验证精度显著提高。
仍然存在过度拟合的问题。但是在 NLP 项目中,一些过度拟合是正常的。因为不管你的训练集里有什么词库,验证数据可能还是会有一些新词。
每个历元的精度和损耗图将更好地显示每个历元的精度和损耗是如何变化的。我将使用上一节中的 plot_graphs 函数来绘制图形。
plot_graphs(history, 'accuracy')
plot_graphs(history, 'loss')
作者图片
训练的准确率逐渐提高,随着 epochs 的增加达到 99%以上。但是验证准确率上升到了 85%,并保持相当稳定。
如您所见,验证损失仍在上升。但是如果你注意 y 轴上的数字,对于简单的 RNN,验证损失从 0.5 变成了 3.0。但是对于这个 GRU 模型,它从 0.4 上升到 1.7。因此,总体验证损失要小得多。
长期短期模型(LSTM)
我还想展示一个 LSTM 模型的实现。LSTM 模型和 GRU 模型的主要区别是,LSTM 模型有三个门(输入、输出和遗忘门),而 GRU 模型有两个门,如前所述。
在这里,我将只取代 GRU 层从以前的模型,并使用 LSTM 层。模型如下:
model = tf.keras.Sequential([
tf.keras.layers.Embedding(vocab_size, embedding_dim, input_length=max_length),
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(32)),
tf.keras.layers.Dense(10, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
model.summary()
输出:
Model: "sequential_5"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding_5 (Embedding) (None, 120, 16) 160000
_________________________________________________________________
bidirectional_5 (Bidirection (None, 64) 12544
_________________________________________________________________
dense_10 (Dense) (None, 10) 650
_________________________________________________________________
dense_11 (Dense) (None, 1) 11
=================================================================
Total params: 173,205
Trainable params: 173,205
Non-trainable params: 0
模型摘要看起来几乎接*于上一节中的 GRU 模型。输出形状完全相同。但是 params #在 LSTM 层是不同的。因为如前所述,LSTM 模型有三个门,而不是两个门。我会再训练 30 个纪元:
num_epochs=30
history = model.fit(padded, training_labels_final, epochs=num_epochs, validation_data = (testing_padded, testing_labels_final))
输出:
Epoch 1/30
782/782 [==============================] - 46s 54ms/step - loss: 0.4740 - accuracy: 0.7665 - val_loss: 0.3732 - val_accuracy: 0.8413
Epoch 2/30
782/782 [==============================] - 38s 48ms/step - loss: 0.3010 - accuracy: 0.8789 - val_loss: 0.3687 - val_accuracy: 0.8397
Epoch 3/30
782/782 [==============================] - 37s 48ms/step - loss: 0.2380 - accuracy: 0.9079 - val_loss: 0.4850 - val_accuracy: 0.8311
Epoch 4/30
782/782 [==============================] - 38s 48ms/step - loss: 0.1890 - accuracy: 0.9306 - val_loss: 0.4697 - val_accuracy: 0.8355
Epoch 5/30
782/782 [==============================] - 41s 53ms/step - loss: 0.1453 - accuracy: 0.9494 - val_loss: 0.4581 - val_accuracy: 0.8305
Epoch 6/30
782/782 [==============================] - 42s 54ms/step - loss: 0.1118 - accuracy: 0.9622 - val_loss: 0.7176 - val_accuracy: 0.8212
Epoch 7/30
782/782 [==============================] - 41s 53ms/step - loss: 0.0952 - accuracy: 0.9676 - val_loss: 0.7107 - val_accuracy: 0.8230
Epoch 8/30
782/782 [==============================] - 41s 52ms/step - loss: 0.0769 - accuracy: 0.9753 - val_loss: 0.6845 - val_accuracy: 0.8205
Epoch 9/30
782/782 [==============================] - 39s 49ms/step - loss: 0.0567 - accuracy: 0.9824 - val_loss: 0.9333 - val_accuracy: 0.8163
Epoch 10/30
782/782 [==============================] - 42s 54ms/step - loss: 0.0564 - accuracy: 0.9826 - val_loss: 0.8228 - val_accuracy: 0.8171
Epoch 11/30
782/782 [==============================] - 42s 54ms/step - loss: 0.0466 - accuracy: 0.9862 - val_loss: 0.9426 - val_accuracy: 0.8177
Epoch 12/30
782/782 [==============================] - 44s 56ms/step - loss: 0.0445 - accuracy: 0.9861 - val_loss: 0.9138 - val_accuracy: 0.8144
Epoch 13/30
782/782 [==============================] - 44s 57ms/step - loss: 0.0343 - accuracy: 0.9897 - val_loss: 0.9876 - val_accuracy: 0.8149
Epoch 14/30
782/782 [==============================] - 42s 53ms/step - loss: 0.0282 - accuracy: 0.9919 - val_loss: 1.0017 - val_accuracy: 0.8152
Epoch 15/30
782/782 [==============================] - 41s 52ms/step - loss: 0.0251 - accuracy: 0.9932 - val_loss: 1.0724 - val_accuracy: 0.8158
Epoch 16/30
782/782 [==============================] - 41s 53ms/step - loss: 0.0267 - accuracy: 0.9912 - val_loss: 1.0648 - val_accuracy: 0.8117
Epoch 17/30
782/782 [==============================] - 43s 55ms/step - loss: 0.0258 - accuracy: 0.9922 - val_loss: 0.9267 - val_accuracy: 0.8109
Epoch 18/30
782/782 [==============================] - 40s 51ms/step - loss: 0.0211 - accuracy: 0.9936 - val_loss: 1.0909 - val_accuracy: 0.8104
Epoch 19/30
782/782 [==============================] - 38s 49ms/step - loss: 0.0114 - accuracy: 0.9967 - val_loss: 1.1444 - val_accuracy: 0.8134
Epoch 20/30
782/782 [==============================] - 38s 48ms/step - loss: 0.0154 - accuracy: 0.9954 - val_loss: 1.1040 - val_accuracy: 0.8124
Epoch 21/30
782/782 [==============================] - 38s 49ms/step - loss: 0.0196 - accuracy: 0.9941 - val_loss: 1.2061 - val_accuracy: 0.8128
Epoch 22/30
782/782 [==============================] - 41s 53ms/step - loss: 0.0093 - accuracy: 0.9971 - val_loss: 1.3365 - val_accuracy: 0.8032
Epoch 23/30
782/782 [==============================] - 42s 54ms/step - loss: 0.0155 - accuracy: 0.9953 - val_loss: 1.2835 - val_accuracy: 0.8123
Epoch 24/30
782/782 [==============================] - 43s 55ms/step - loss: 0.0168 - accuracy: 0.9948 - val_loss: 1.2476 - val_accuracy: 0.8160
Epoch 25/30
782/782 [==============================] - 38s 48ms/step - loss: 0.0108 - accuracy: 0.9967 - val_loss: 1.0810 - val_accuracy: 0.8091
Epoch 26/30
782/782 [==============================] - 39s 50ms/step - loss: 0.0132 - accuracy: 0.9960 - val_loss: 1.3154 - val_accuracy: 0.8118
Epoch 27/30
782/782 [==============================] - 42s 54ms/step - loss: 0.0056 - accuracy: 0.9985 - val_loss: 1.4012 - val_accuracy: 0.8106
Epoch 28/30
782/782 [==============================] - 40s 51ms/step - loss: 0.0046 - accuracy: 0.9986 - val_loss: 1.4809 - val_accuracy: 0.8134
Epoch 29/30
782/782 [==============================] - 40s 51ms/step - loss: 0.0074 - accuracy: 0.9977 - val_loss: 1.4389 - val_accuracy: 0.8104
Epoch 30/30
782/782 [==============================] - 41s 52ms/step - loss: 0.0126 - accuracy: 0.9958 - val_loss: 1.2202 - val_accuracy: 0.8124
如你所见,训练精度和验证精度非常接* GRU 模型。剧情是这样的:
plot_graphs(history, 'accuracy')
plot_graphs(history, 'loss')
作者图片
验证损失这次更好。
结论
在这篇文章中,我想解释什么是递归神经网络,以及为什么对于序列数据它比常规神经网络更好。然后演示了一个简单的 RNN、GRU 和 LSTM 模型的实现,该模型使用相同的数据集执行自然语言处理任务。这是一个特别的情感分析项目。
这篇文章展示了 GRU 和 LSTM 模型的准确性结果看起来相似。但这并不是一个普遍的结论。对于不同的项目,您可能会看到不同的结果。事实上,如果你改变一些参数,如神经元的数量,GRU 或 LSTM 单位,层数,你可能会看到这个项目的结果有很大的不同。
请随时在 Twitter 、脸书页面上关注我,并查看我的新 YouTube。频道。
更多阅读
</30-very-useful-pandas-functions-for-everyday-data-analysis-tasks-f1eae16409af>
什么是关系知识图?
原文:https://towardsdatascience.com/what-is-a-relational-knowledge-graph-bb747b27ff3f
探索图形数据库和知识图的未来
图片作者。背景图片,由米卡·鲍梅斯特 在 Unsplash| Unspash.com 拍摄的免版税照片
如果关系知识图这个术语还没有出现在你的雷达上,我想它很快就会出现了。Bob Muglia 是雪花公司的前首席执行官,现在是一家推广新模式的初创公司的董事会董事。
在 FactEngine 工作时,我早期的命名思想倾向于引入术语图形数据库,在 FactEngine 中,我在寻找一个术语来充分描述图形和关系数据库的合并,而不是术语多模型数据库。
无论从哪个角度看,图形数据库和关系数据库的合并变得越来越明显,我相信关系知识图这个术语将会一直存在。
属性图模式工作组的出现标志着图形数据库市场的成熟,例如,将关系数据库中常见的特性引入图形数据库和知识图。
这个由研究人员和图形数据库供应商组成的小组已经认识到,现存的图形数据库缺乏支持关系数据库的正式形式的技巧,并且没有意识到要将 21 世纪的现象带入 21 世纪。在网上搜索这个团体的名字,会返回各种各样的宣言和支持。
尽管您可能听不到该组织吹捧该组织是关系数据库领域标准的领导者,但我怀疑就像《动物庄园》中的场景一样,盛大的声明将是“现在我们有了这些标准,一些数据库比其他的更*等”。
关系知识图采用了一种完全不同的观点,即任何数据库都可以被看作是图数据库,甚至是关系数据库,如果你采用一种支持这种观点的体系结构,那么你就可以拥有两个世界的优点。
图形数据库供应商长期以来一直吹捧图形数据库在某些查询中比关系数据库更快。当你考虑到微软吹嘘它拥有世界上最快的数据库,SQL Server,一个支持图形结构/查询的关系数据库时,这种说法是可疑的。
在理论层面上,声称在许多图形数据库中数据存储在硬件层面的方式加快了图形查询的速度也是可疑的。例如,即使关系数据库在硬件级存储为一组列分隔的固定结构矩形/表状结构,也无法阻止将硬件级数据作为图形结构加载到内存中,并针对内存中的图形结构运行查询,除了分页之外,需要将查询恢复到仍在磁盘上的数据的图形数据库目前也面临同样的问题…以图形方式将图形结构加载到内存中以执行这些快速查询。
那么,是什么阻碍了关系数据库采用这种架构,并在图形数据库的游戏中击败它们呢?图数据库和关系数据库在元模型级别上真的有概念上的区别吗?
输入相关知识图表
普通关系数据库的元模型阻止了普通图形数据库的图形查询。例如,外键关系缺少自然语言谓词,告诉您诸如“雇员为公司工作”之类的事情,其中雇员和公司是表/节点,而图形数据库供应商可能有一个结构为“雇员为公司工作”。
早在 1985 年,ORACLE 的 Richard Barker 的“ Case Method,Entity Relationship modeling”在描述关系数据库的实体关系图中允许这样做,但是由于缺少关系数据库上的图形查询语言,这从未(据我所知)在关系数据库的元模型级别上实际实现用于查询,因为关系数据库的查询语言Structure Query Language(SQL)无论如何都不支持在其语法中使用自然语言谓词。
带有自然语言谓词的风格化 Barker 实体关系图,图片由作者提供。
关系知识图是数据库或数据库之上的架构,其中数据库可以被视为图形数据库或关系数据库。
当我们考虑一个在经典关系视图(实体关系图)和图形视图(属性图模式)之间变化的实际模式时,我们可以直观地理解这是如何工作的:
图形数据库的支持者经常说“在图形数据库中没有多对多的表”(正如上面 ERD 视图中的 PersonLikesFilm 表)。这预先假定了其他关系数据库的数据不会作为图形存储在内存中以供查询,并且忽略了图形数据库中的“是的”这种类型,但是“多对多表数据”通常在硬件级别存储为链表(扁*表),而在概念内存级别将概念化为图形。
这种观点还预先假定,没有一种概念上的方法既有多对多(或多对多……同样)的关系,也有有效的优势。这可以通过采用类似的对象角色建模来克服:
对象-角色模型及其对应的属性图模式。图片作者。
对象-角色模型及其对应的属性图模式和实体关系图。图片作者。点击放大。
我们到达了目的地:关系知识图允许你将你的数据库概念化为关系数据库或图形数据库。选择权在你。
这意味着您可以在数据库上编写 SQL 查询或图形查询。选择权在你。
有经验的玩家会很快说:“我们不是已经得到了吗?SQL Server 之类的产品不是已经满足了 SQL 和图形查询的需求吗?”
简单的回答是,大部分情况下没有,因为我看到的所有包含图形特性的关系数据库都采用了添加特殊的表类型来管理图形查询,结果导致数据库的多语言混乱,可能会使任何使用它的人感到困惑。我几年前写过这个。也就是说,许多关系数据库供应商仍然将图形与表关系分开处理。
关系知识图的不同之处在于,不需要在其他关系数据库上采用不同的图表集来进行图表查询,您只需要在现有数据库结构上有一个语义层来满足图表查询的编写……并让数据库管理系统来考虑如何在底层数据库结构上处理这些查询。不久前,我在《走向数据科学》上写过这个。
也就是说,关系知识图同样可以被称为 图知识关系 ,但是在知识图炒作周期的当前状态下,它可能听起来不那么酷。也就是说,关系知识图并不预先假定数据如何存储在硬件层,以及这个或那个数据库声称拥有世界上最快的数据库,无论它们如何在硬件层存储数据。**
关系知识图的优势是什么?
关系知识图的主要优势在于:
- 在决定项目使用什么样的数据库时,只需要考虑数据库的硬件级实现,以及它的查询执行速度(如果这是先决条件的话);
- 在概念层次上,你可以选择如何描绘你的数据库;作为图形数据库或关系数据库;
- 自然语言语义内置于语义层,在数据库的核心元模型上运行,帮助您理解模型;
- 根据您实现关系知识图的方式,您可以选择要使用的数据库。关系知识图可以与数据库管理系统无关。也就是说,从概念上来说,当涉及到实现时,您并不局限于一种或另一种数据库技术。然而,关系知识图供应商可能会限制您使用一个底层数据库;
- 实体/节点类型可以有一个多列/属性主键,而不是像当前图形数据库中常见的只有一个 object-id 或属性;和
- 在 FactEngine 的情况下,你可以在你的数据库上写受控的自然语言查询。我觉得这将成为关系知识图的标准;
概括起来
- 关系知识图是一个术语,在不久的将来,这个术语很可能会出现在你的雷达上,这完全是因为推广这个术语的新参与者的重要性。
- 行业趋势是图形数据库采用关系数据库的结构和严密性,这种方式必然会导致关系数据库理论和图形数据库理论的概念合并;
- 关系知识图允许您从概念上摆脱数据库在硬件级别的存储方式;和
- 关系知识图,或知识关系图充分强调,通过采用描述存储什么数据而不是如何存储数据的语义层,推动力是添加到数据库的知识。**
感谢阅读。如果时间允许,我会写更多关于知识图表、图表数据库、语义建模和关系数据库的文章。
— — — — — End — — — —
什么是供应链数字孪生?
原文:https://towardsdatascience.com/what-is-a-supply-chain-digital-twin-e7a8cd9aeb75
使用 python 创建代表供应链网络的模型,以优化您的运营并支持战略决策。
(图片由作者提供)
数字孪生是物理对象或系统的数字复制品。
供应链数字模型是一种计算机模型,代表供应链中涉及的各种组件和流程,如仓库、运输网络和生产设施。
使用 Python 的供应链数字双胞胎—(图片由作者提供)
在以前的文章中,我分享了为特定应用设计的 python 模型的例子,如运输路线优化、供应链网络设计或生产计划。
在本文中,我们将尝试后退一步,构建一个供应链数字双胞胎,它将代表您从生产到商店交付的完整的端到端操作。
💌新文章直接免费放入你的收件箱:时事通讯
什么是供应链数字孪生?
面向目标的网络
供应链是一个由流程和库存点组成的面向目标的网络,用于向客户交付货物和服务。
要使用 Python 创建供应链的数字双胞胎,首先需要定义组成供应链的各种组件和流程。
端到端供应链网络—(图片由作者提供)
这可能包括创建数据结构来表示仓库、运输操作和生产设施,并定义这些组件之间的关系。
数据和参数
接下来,您需要收集供应链各种组件和流程的数据,例如
- 仓库的位置和 容量
- 交通网络的路线和容量
- 生产设备的生产率
- 顾客和商店需求
工厂参数—(图片由作者提供)
这些数据可以存储在数据库或其他数据存储系统中,或者直接连接到您的仓库管理系统和 ERP。
模拟块
一旦有了供应链组件和流程的数据,就可以使用 Python 创建复制供应链行为的算法和模拟。
其他优化模型—(图片由作者提供)
这可能涉及使用优化算法来
- 使用来自商店模型的补货订单(输入)确定到(输出)的最高效路线将商店交付
- 改进您仓库的拣货流程 【输出】准备门店补货订单 【输入】
- 根据商店销售历史数据(输入)建立的需求预测,安排生产(输出)
构建块的示例
总的来说,用 Python 创建一个供应链数字双胞胎将涉及数据收集和分析、算法开发和模拟建模的组合。
这可能需要对供应链管理的深刻理解和 Python 编程的经验。
让我们举三个用 Python 构建的基本块的例子。
如何模拟仓库操作?
我们定义了一个仓库类,它具有仓库的位置、容量和库存的属性。
add_inventory 和 remove_inventory 方法可以分别用于从仓库的库存中添加和删除项目。
这是一个简单的例子,你可以通过考虑流程生产率、仓库成本结构、劳动力管理或拣货流程来添加额外的属性和方法来改进模型。
在这个阶段,确保让运营团队和持续改进工程师参与进来,以确保您的模型能够复制实际的运营。
现实生活中发生的瓶颈、非生产性任务和质量问题必须包含在您的模拟中,以验证您的模型。
💡不要忘记“双胞胎” 如果你的模型离现实太远,就会失去可信度。
事实上,如果你的最终目标是使用你从这个模型中获得的洞察力,确保用于构建它的假设和参数得到所有利益相关者的验证。
这意味着匆忙设计一个带有粗略假设的快速而肮脏的模型是没有用的。
如果您使用这些结果来推动持续改进计划或挑战他们的管理,您可以确信运营部门会仔细分析这些结果。
例如,确保考虑:
- 您的工厂和仓库中每个工人的合理生产率和容量
- 评估运营稳健性时的外部约束,如假期、劳动法规或设备采购限制(例如,您不能在一天内将提货能力翻倍)
- 运输限制,如卡车采购、道路限制或交通堵塞
如何模拟公路运输?
我们定义了一个卡车类,它具有卡车的位置、容量和负载的属性。
move_to 方法可用于将卡车移动到新的位置,而 load_cargo 和 unload_cargo 方法可分别用于装载和卸载货物。
上述解决方案可以通过添加装载和卸载时间、用于提前期计算的时间戳、成本参数或详细说明处理单元(托盘、纸箱……)来改进。
如何模拟门店库存管理?
我们定义了一个 Store 类,它具有商店位置和库存的属性。
place_order 方法可用于订购给定的商品和数量。
- 如果商店库存中有足够的商品,订单将被履行,库存也将相应地更新。
- 否则,将打印一条错误消息。
您可以通过以下方式改进它
外向销售将代表最重要的参数,因为它与需求相关联。
您可以通过以下方式测试供应链的弹性
- 模拟该需求的可变性(例如使用正态分布)
- 创造季节性和高峰期,复制促销和系列发布
- 预测未来的销售和新店开张,对你的网络进行压力测试,并获得如何改进的见解
需求可变性对不良库存规则的影响示例—(图片由作者提供)
后续步骤
关注我的媒体,获取更多与数据分析和供应链管理相关的文章
连接积木
现在你已经完成了基本的独立积木,你需要把它们连接起来
并添加外部参数如客户需求或原材料供应约束。
模拟几个场景来回答业务问题
场景 1:商店需求翻倍
- 对仓库容量会有什么影响?
- 为了避免商店缺货,我们需要多少天的库存?
场景 2:您将所有本地仓库合并到一个中央配送中心:
- 对服务水*会有什么影响?
- 能否通过工厂直接发货(针对部分 SKU)来降低运输和仓储成本?
场景 3:您希望减少 25%的仓库库存
- 工厂的最大补货周期应该是多少?
- 避免缺货所需的需求计划的最低精确度是多少?
- 对工厂生产水*的稳定性会有什么影响?
场景 4:您希望停止空运以减少二氧化碳排放
- 对商店的补货提前期会有什么影响?
- 配送计划员需要提前多长时间创建补货订单?
对于每种情况,您可以操作与问题相关的参数,看看您的整体性能会降低多少。
然后,您可以调整其他指标(仓库容量、补货提前期等),直到您重新达到初始目标。
这将向您展示供应链中的改进,以获得适应这些新业务需求的稳健性水*。
供应链网络设计方法—(图片由作者提供)
你可以从供应链网络设计的方法论中获得灵感(本文中的),我们尝试模拟 50 种场景的需求波动,假设需求呈正态分布。
对于每个场景,我们使用 python 的线性编程来寻找工厂的最佳组合,以最低的成本生产和向市场交付产品。
50 个场景的结果—(图片由作者提供)
您可以决定您希望实现哪种组合来提高健壮性,同时降低成本。
数字孪生 x 可持续性:绿色库存管理
(图片由作者提供)
绿色库存管理可以定义为以环境可持续的方式管理库存。
对于分销网络而言,这可能涉及一系列旨在减少订单传输、准备和交付的环境影响的流程和规则。
(图片由作者提供)
如果我们降低商场补货频率,会对二氧化碳排放量产生什么影响?
使用数据分析来模拟商店补货频率的变化,并衡量对整体环境影响的影响。
https://www.samirsaci.com/green-inventory-management-case-study/
数字孪生 x 可持续发展:时尚循环经济
(图片由作者提供)
循环经济是一种旨在最大限度减少浪费和最大限度提高资源效率的经济模式。
它包括设计注重寿命、重复使用和回收的产品和工艺。
(图片由作者提供)
一些公司已经实施了一种订阅模式,在这种模式下,客户支付一笔固定费用,就可以在的特定时期内获得一种产品或服务。
使用数据分析来模拟循环订阅模式的几种情况对快速时尚零售商的减排和用水的影响。
https://www.samirsaci.com/how-sustainable-is-your-circular-economy/
供应链分析
现在您已经有了供应链的副本,您可以使用参数并使用数据来执行
描述性分析:使用仪表盘和可视化工具监控您的流程
一套工具,提供可见性和整个供应链的单一事实来源,以跟踪您的货件、检测事故并衡量您的运营绩效。
诊断分析:自动化根本原因分析流程
这可以概括为事件根本原因分析。
- 使用数据分析的物流绩效管理,Samir Saci
- 交付周期可变性和供应链弹性,Samir Saci
预测和说明性分析:将预测和优化模型添加到您的数字双胞胎中,以改进订购规则或计划
支持运营,以了解最有可能的结果或未来情景及其业务影响。因此,您可以协助运营解决问题,优化资源,以达到最佳效率。
- 零售销售预测的机器学习—特征工程,Samir Saci
- 如何:机器学习驱动的需求预测,尼古拉斯·范德普特
- 利用 Python 、Samir Saci 进行生产固定水*规划
- 使用 Python 、Samir Saci 优化仓库增值服务
- 使用 Python 的寻路算法提高仓库生产率,Samir Saci
- 商店交付计划的机器学习,Samir Saci
欲知详情,
您的数字孪生可以被视为一个核心模型,您可以在其中添加解决特定问题的模型。
关于我
让我们在 Linkedin 和 Twitter 上连线,我是一名供应链工程师,正在使用数据分析来改善物流运营并降低成本。
如果你对数据分析和供应链感兴趣,可以看看我的网站
什么是机器学习中的张量?
原文:https://towardsdatascience.com/what-is-a-tensor-in-deep-learning-6dedd95d6507
张量、数组和矩阵的区别
作者图片
张量到底是什么?
大多数深度学习实践者都知道它们,但无法精确指出一个精确的定义。
TensorFlow,PyTorch:每个深度学习框架都依赖于同一个基本对象: tensors 。它们被用来存储深度学习中的几乎所有东西:输入数据、权重、偏见、预测等。
然而,他们的定义非常模糊:仅维基百科类别就有超过 100 页与张量相关。
在本文中,我们将对以下问题给出一个明确的答案:什么是神经网络中的张量?
💻计算机科学中的张量
那么为什么会有这么多定义呢?
很简单:不同的字段有不同的定义。数学中的张量与物理中的张量不太一样,与计算机科学中的张量不同。
作者图片
这些定义可以分为两类:作为数据结构的张量或作为对象的张量(在面向对象编程的意义上)。
这就是为什么你看到很多人(有时相当学究气地)说“张量是 不是 n 维数组/矩阵”:他们说的不是数据结构,而是具有属性的对象。
甚至同样的单词也有不同的意思。例如,在计算机科学中,2D 张量是一个矩阵(它是一个秩为 2 的张量)。在线性代数中,二维张量意味着它只存储两个值。秩也有一个完全不同的定义:它是其线性无关的列(或行)向量的最大数量。
在计算机科学中,我们只对专注于数据结构的定义感兴趣。从这个角度来看,张量确实是矩阵的 n 维的推广。
但是当我们在深度学习的背景下谈论张量时,我们仍然忽略了一个重要的细微差别...
深度学习中的🧠张量
Freepik 和 smashingstocks 创建的图标— Flaticon
那么为什么它们被称为“张量”而不是“多维数组”呢?好吧,是短了点,但这就是全部了吗?实际上,人们在谈论张量时会做一个隐含的假设。
PyTorch 的官方文档给了我们一个实用的答案:
numpy 数组和 PyTorch 张量最大的区别是 PyTorch 张量既可以运行在 CPU 上,也可以运行在GPU 上。
在深度学习中,我们需要以高度并行的方式计算大量矩阵乘法的性能。这些矩阵(以及一般的 n 维数组)通常在 GPU 上存储和处理,以加快训练和推理时间。
这是我们之前的定义中所缺少的:深度学习中的张量不仅仅是 n 维数组,还有一个隐含的假设,即它们可以在 GPU 上运行。
⚔️·努皮 vs 皮托奇
让我们看看 NumPy 数组和 PyTorch 张量的区别。
作者图片
这两个对象非常相似:我们可以用几乎相同的语法初始化一个 1D 数组和一个 1D 张量。它们还共享许多方法,可以很容易地相互转换。
你可以在这个地址找到这篇文章中使用的代码。
**NumPy Array**: [1 2 3]**PyTorch Tensor**: tensor([1, 2, 3])
初始化 2D 数组和 2D 张量并不复杂。
**NumPy Array**: [[1 2 3]
[4 5 6]]**PyTorch Tensor**: tensor([[1, 2, 3],
[4, 5, 6]])
我们说过张量和数组的唯一区别是张量可以在 GPU 上运行。所以说到底,这种区分是基于性能的。但这种推动有那么重要吗?
让我们比较一下 NumPy 数组和 PyTorch 张量在矩阵乘法上的性能。在下面的例子中,我们随机初始化 4D 数组/张量,并将它们乘以。
>>> **1.32 s**
>>> **25.2 ms**
正如我们所看到的,PyTorch 张量完成的性能优于 NumPy 数组:它们完成乘法的速度比快 52 倍!
我们可以将这种表现归因于不同的因素,例如:
- NumPy 数组使用 float64 格式,而 PyTorch tensors 则利用了更高效的 float32 格式。然而,即使当 NumPy 数组转换为 float32 时,PyTorch 张量仍然快 40 倍。
- PyTorch 张量存储在 GPU 上,不像 NumPy 数组。但是,如果我们在 CPU 上重复同样的实验,PyTorch 张量仍然能够*均快 2.8 倍。
即使将这两个因素结合起来,PyTorch 张量也被证明要快 1.4 倍,这表明 NumPy 数组对于矩阵乘法来说性能确实较差。
这就是张量的真正力量:它们快得惊人!性能可能会因维度、实现、和硬件而异,但这种速度是张量(而不是数组)在深度学习中如此常见的原因。
📝结论
在本文中,我们根据以下内容编写了张量的定义:
- 它们在计算机科学(数据结构)中的用途;
- 更具体的说,在深度学习(他们可以在 GPU 上运行)。
我们可以用一句话来总结:
张量是 n 维数组 隐含假设它们可以 在 GPU 上运行。
最后,我们看到了张量和数组之间的性能差异,这激发了深度学习对张量的需求。
所以下一次有人试图向你解释张量不完全是矩阵的推广,你会知道他们在张量的特定定义中是正确的,但在计算机科学/深度学习中不是。
如果你在寻找更多 n 维的数据科学和机器学习内容,请在 twitter 上关注我@ maxime labanne。你可以在这个地址找到本文中使用的代码。📣
什么是训练有素的模特?
原文:https://towardsdatascience.com/what-is-a-trained-model-5c872cfa8448
或者……什么叫“训练一个 ML 模型”?
杰森·古德曼在 Unsplash 上的照片
W 当谈到机器学习时,我们总是谈论“训练模型”或“训练模型”,但是……那到底是什么意思呢?
什么是训练有素的模特?我们训练模特的时候都做些什么?我们总是要训练一个模特吗?
在本文中,我们将回答所有这些问题,讨论监督和非监督学习,我们将了解训练机器学习模型在何种意义上不同于训练人类。
1.训练一个人工智能模型不同于训练一个人(或动物)
如果我们在字典中搜索动词“训练”,我们会找到这样的内容:
通过一段时间的练习和指导教会(人或动物)一种特殊的技能或行为
但是还有更重要的事情。事实上,我更喜欢:
教导以使适合、合格或熟练
通过指导、训练或操练来形成
为技能测试做准备(如通过练习)
这三个有“隐藏”的含义:当一个人(或动物)被训练时,他/她/它在某一点上变得独立。我的意思是,受过训练的人/动物在某一点上可以独立完成训练的任务(没有训练员)。
例如,如果你曾经尝试过任何运动,你就知道它是如何运作的:在开始时,教练会在第一个动作中帮助你,甚至在身体上帮助你。然后,在某一点上(当你被训练的时候!)你自己去吧!
那么,我们如何训练计算机呢?
训练一个 ML 模型并不意味着拿一个机器人,让它骑上自行车,训练它循环移动它的腿并告诉它“上下移动你的腿,你就可以走了!”。这就是我们对人类所做的,但人类(和动物)与计算机有着天壤之别。
因此,在训练 ML 模型时,我们必须将讨论分成两部分:
- 监督学习
- 无监督学习
让我们来看看细节。
2.训练一个 ML 模型:监督学习
监督学习(SL)旨在作为人类训练 ML 模型的方式。这意味着人类(数据科学家、机器学习工程师或其他任何人)在一组已知数据中训练 ML 模型。换句话说,引用维基百科:
监督学习是基于示例输入-输出对学习将输入映射到输出的函数的机器学习任务
因此,在监督学习中,我们有一组数据,其中我们知道输入和输出(我们也说:数据被标记为 ) ,我们训练 ML 模型来预测看不见的数据的输出。
我们举个简单的例子。考虑一个简单的分类问题,比如我做的这个简单的项目。这里我有一个与糖尿病相关的数据集:输入是患者的各种医疗状况,输出是:患者有糖尿病(1)患者没有糖尿病(0)。这意味着一个重要的事实:有人测量了患者的状况,并将其存储在某个地方,还报告了他们是否患有糖尿病。在这种情况下,ML 模型的目的是在给定一些输入条件(他/她可能有的医疗条件)的情况下,预测患者是否可能患有糖尿病。
在这种情况下,我训练了两个不同的 ML 模型(K-nearest neighborhood 和 Decision Three ),以决定哪一个对看不见的数据提供最好的性能。但是如果我们有一个已知数据的数据集,我们如何处理未知数据呢?在有监督的情况下训练一个 ML 的过程非常简单:
- 我们得到了数据集,知道了输入和输出
- 我们将数据集分成两个数据集:训练数据集和测试数据集
- 我们在训练数据集上训练 ML 模型
- 我们在测试数据上评估了 ML 模型的性能。
因此,测试数据是看不见的数据(对于我们的 ML 模型是“看不见的”),我们可以评估我们的 ML 模型的性能,并选择我们认为最好的一个。
因此,在监督学习中,你明确地告诉 ML 模型它应该为每个输入产生的输出,如果它没有产生输出,那么你调整它的(超)参数,以便下一次它更有可能为该输入产生正确的输出。
这是在监督学习案例 : 中训练 ML 的本质:调整(超)参数(也称为“超参数调整”),以便 ML 模型产生尽可能接*期望输出的输出(这是已知的!).
3.训练一个 ML 模型:无监督学习
在无监督学习 (UL)案例中数据没有被标记。如果我们考虑之前的案例,我们有一个病人健康状况的数据集,我们知道他们是否患有糖尿病,在无监督学习的情况下,我们只有病人的医疗状况。句号。我们对他们(可能的)糖尿病状况一无所知。
那么,在这种情况下,培训是如何进行的呢?
无监督学习使用机器学习算法来分析和聚类(意思是“分组”)未标记的数据集。这些算法在不需要人为干预的情况下发现数据中隐藏的模式,这也是案件“无人监管”的原因。因此,无监督学习模型可以自己发现未标记数据的“固有”结构。这意味着一件简单的事情:没有关于无监督学习案例的训练。在这种情况下,该算法自行寻找如何对(未标记的)数据进行分组,因此人类不训练该模型。
结论
在本文中,我们学习了机器学习中的一个重要概念;这就是我们所说的训练。训练 ML 模型意味着屏幕后面的人调整模型的超参数,使得模型可以预测尽可能接*真实输出的输出。这意味着,作为人类(训练者),我们必须知道实际的输出,这就是为什么我们只在我们所谓的“监督学习”中训练 ML 模型。
在无监督学习中,ML 模型自行学习,不需要训练。当然,在可能的情况下,评估我们的无监督模型所做的事情总是一个好主意;为了做到这一点,我们在已知数据上训练一个监督的 ML 模型(但是,正如我之前所说的,这并不总是可能的…否则,就不需要无监督的模型了!).
我们一起连线吧!
LINKEDIN(向我发送连接请求)
如果你愿意,你可以 订阅我的邮件列表 这样你就可以一直保持更新了!
考虑成为会员:你可以免费支持我和其他像我一样的作家。点击 这里 成为会员。
什么是活动元数据,为什么它很重要?
原文:https://towardsdatascience.com/what-is-active-metadata-and-why-does-it-matter-add3408c228
活跃的元数据就像热门的八卦。原因如下。
马修·费尼在 Unsplash 上的照片
就像数据网格或度量层一样,活动元数据是数据世界最新的热门话题。正如在数据堆栈中流行的每一个新概念一样,突然出现了供应商更名为“活动元数据”的爆炸式增长,广告无处不在,以及……混乱。
每个人都在谈论活动元数据,这一定很容易理解,对吗?
亨宁·霍尔格森在推特上发推文。来源。
安德鲁·帕迪拉在推特上发推文。来源。
显然不是!我谈论活动元数据已经有一年多了,但是我仍然经常看到这样的问题。
活动元数据听起来可能有点可怕,但事实并非如此。它是现代数据工具箱中的必备工具,所以如果您仍然想知道它的含义,那么这篇文章就是为您准备的。
我已经用尽可能少的术语分解了活动元数据背后的思想。请继续阅读,了解什么是活动元数据,它看起来像什么,您实际上可以如何使用它,它如何适应现代数据堆栈,以及它为什么如此重要。
什么是活动元数据?
我可以在这里开始说一些术语,但是你和我都会在几秒钟内睡着。所以让我们来打个比方。
想象一下,你得到了一条最有趣的科技八卦——苹果正在向娱乐性大麻领域扩张,以真正帮助人们“改变思维”。
你不可能把这么激动人心的事情保密。世界必须知道。所以你把它贴在你的博客上,blogspot.applefansunite.com。完成了,对吧?
就像 Hyperloop 隧道中的汽车一样,我们都知道它不会去任何地方。你不能只是把故事放在某个地方,然后希望人们会发现它。你必须把它送到人们手中。
你磨砺你的公关能力,将新闻发送给科技记者和新闻网站,你瞧,很快它就无处不在了。已经被迷化了,你爷爷刚刚还问为什么苹果农在你们群聊上说这个莫莉姑娘。
元数据就是这样的信息。如果它被动地坐在自己的小世界里,没有人看到或分享它,这有什么关系吗?但是如果它主动移动到人们已经在的地方,它就成为一个更大的对话的一部分,并为其添加背景。
主动元数据和被动元数据有什么区别?
被动元数据是将元数据聚合和存储到静态数据目录中的标准方式。这通常包括基本的技术元数据——模式、数据类型、模型等。
把被动元数据想象成在个人博客上发布信息。偶尔,它会被发现并在黑客新闻上疯传。但是大部分时间它只是被忽视和不被使用,即使人们确实需要知道它。
活动元数据使元数据能够轻松快速地在整个数据堆栈中流动,在数据堆栈中的每个工具中嵌入丰富的上下文和信息。它通常比被动元数据更复杂,包括操作、业务和社会元数据以及基本的技术信息。
把活动元数据想象成一个病毒故事。它出现在你已经生活过的每一个地方,看起来就像是几秒钟。它会立即与其他信息进行交叉检查和结合,将一个相关背景的网络整合到一个更大的趋势或故事中。它引发了对话,最终让每个人变得更加博学和见多识广。
元数据的四种主要类型。(图片由作者提供。)
为什么活动元数据很重要?
简单来说,没有人愿意去另一个网站“浏览元数据”。
随着我们拥抱互联网,数据在早期爆炸,公司意识到他们需要管理所有的新数据。
我们进入了元数据管理的黄金时代。像 Informatica 、 Collibra 和 Alation 这样的新公司诞生了,他们大肆宣传数据目录的重要性。人们需要一种方法来整理他们所有的选择,所以我们得到了像 Gartner 的元数据管理魔力象限这样的报告。数十亿美元的公司出现了,公司在元数据管理上花费了数亿美元。
然而就在去年,Gartner 发布了他们的活动元数据市场指南,并宣称“传统的元数据实践是不够的……”
这是因为被动数据目录通过添加…另一个工具解决了“工具太多”的问题。他们从数据栈的不同部分聚集元数据,并且它停滞在那里。用户采用受到影响,这些令人兴奋的工具变成了昂贵的货架。
活动元数据将元数据发送回数据堆栈中的每个工具,随时随地为人们提供他们需要的数据上下文——在 BI 工具中,当他们想知道指标的实际含义时,在 Slack 中,当有人发送数据资产的链接时,在查询编辑器中,当他们试图找到正确的列时,在吉拉中,当他们为数据工程师或分析师创建票证时。
活动元数据如何融入现代数据堆栈?
活动元数据作为现代数据堆栈之上的一层。
它利用开放 API 连接数据堆栈中的所有工具,并在双向流中来回传送元数据。这使得活动元数据可以带来上下文,比如说,从雪花到 Looker,Looker 到 Slack,Slack 到吉拉,吉拉又回到雪花。
现代数据栈中的活跃元数据。(图片由作者提供。)
活动元数据的 4 个特征
根据 Gartner 新的活动元数据市场指南,活动元数据是一个永远在线、智能驱动、面向行动、API 驱动的系统,与其被动、静态的前身相反。
这可以分解为活动元数据的四个关键特征。
- 始终开启:活动元数据始终开启。这意味着不需要等待人们手动输入或解析元数据,而是在现代数据堆栈的每个阶段不断收集元数据,包括日志、查询历史、使用统计等。
- 智能:活动元数据不仅仅是收集元数据。它是关于不断处理元数据来连接这些点,并从中创造情报。这意味着使用活动元数据,随着时间的推移,随着人们更多地使用它和观察更多的元数据,系统只会变得更加智能。
- 面向行动:主动元数据不仅仅止于智能。它应该通过管理建议、生成警报并使人们更容易做出决策来推动行动,甚至在没有人工干预的情况下自动做出决策,如在检测到数据质量问题时停止下游管道。
- 默认打开:主动元数据*台使用 API 来挂钩现代数据栈的每一部分。这使得神奇的用户体验成为可能,将数据从业者从无休止的工具和上下文切换中解救出来。这被称为嵌入式协作,即工作发生在你最不费力的地方。
活动元数据的 5 个使用案例
有几十个,如果不是几百个,活动元数据的用例。(足够自己写几篇文章了—即将推出!)让我们来看几个我最喜欢的。
- 清除陈旧或未使用的资产:使用活动元数据定期计算每项资产(如数据表、仪表板等)上次使用的时间和/或使用它的人数。如果它是在过去 30 天内使用的,太好了!如果某项资产在过去 60 天内未被使用,请自动将其归档。如果在过去的 90 天或 120 天内没有人接触过它,请彻底清除它。
- 动态分配计算资源:假设 90%的用户在一个财务季度的最后一周登录了一个 BI 工具。活动元数据可用于在该周之前自动扩大计算资源,并在之后再次缩小计算资源。
- 丰富 BI 工具的用户体验:使用活动元数据将上下文带入仪表板,而不是在 BI 工具和数据目录之间切换。相关的元数据(如业务术语、描述、所有者和血统)可以被推入 BI 工具。然后,当有人在查看每个表时,他们可以了解谁拥有它,数据来自哪里,等等。这些信息甚至可以在自动生成的报告中用作标签。
用活动元数据丰富 BI 工具。(图片来自作者。)
- 识别流行资产:使用活动元数据为每个资产创建一个定制的相关性分数。这可以基于来自查询日志、沿袭和 BI 仪表板等地方的使用信息。那么最受欢迎的相关资产应该更频繁地出现在搜索中,并更频繁地检查数据质量问题。
- 通知下游消费者:如果首席执行官最终在数据团队面前看到一个坏掉的仪表板,那就太糟糕了。活动元数据可用于在数据存储发生变化时检查问题,并通知下游数据用户潜在的问题。例如,当数据存储被爬行时,新的元数据将与以前的元数据进行比较。如果有任何潜在的重大变更(例如,添加或删除列),沿袭可以用于查找谁拥有该数据存储,并通过 Slack、吉拉、电子邮件等通知他们。
活动元数据的未来
随着元数据成为大数据,大数据成为庞然大物,活动元数据不仅仅是一个美好的梦想。这是必要的,也是理解当今数据的唯一方式。
管理、处理和分析元数据是现代数据团队的新常态。然而,被动地手动完成这项工作是不可能的。这就是为什么看到活动元数据在去年成形并成为人们对现代元数据期望的事实上的标准是如此令人兴奋。
所有这些用例——像自动调整的管道、自动数据质量警报和持续验证的计算——在几年前听起来几乎是不可能的。今天,它们实际上触手可及。随着活动元数据在未来几年继续发展,我非常兴奋地看到智能数据梦想成为现实。
想了解更多关于第三代数据目录和活动元数据兴起的信息吗? 查看我们的电子书 。
觉得这个内容有帮助?在我的时事通讯《元数据周刊》上,我每周都写关于活动元数据、数据操作、数据文化和我们的学习建设的文章。 在此订阅。
什么是即席分析,为什么要关注它?
原文:https://towardsdatascience.com/what-is-ad-hoc-analytics-and-why-should-you-care-d59a45d466fe
将所有数据消费归入自助服务并不像我们希望的那样有效
在 20 世纪 80-90 年代的美国,有一段时间,全世界都梦想建造越来越复杂的汽车仪表盘。我记得在《回到未来》中,我看着克里斯托弗·洛伊德的时光机德罗宁,我想我(和世界上的其他人)潜意识里认为,只要我们增加足够多的屏幕和开关,一个简单的汽车仪表盘可以做任何事情。
左图:20 世纪 80 年代著名的时光机 DeLorean 仪表盘回到了未来。右图:另一款来自《霹雳游侠》的充满未来感、仪表板厚重的 80 年代汽车内饰。来源:维基共享资源( 1 和 2 )。
但是[对我们所有 8 岁的孩子来说,不幸的是],仪表板从来没有像我们希望的那样成为导航需求的最终解决方案。我们现在通常在驾驶时利用两种截然不同的数据来源:仪表板,当然,还有手机。虽然仪表盘帮助我们评估我们的汽车在运输途中的状态(我们的汽车怎么样?),手机在帮助我们决定去哪里以及如何到达那里方面有着独特的优势。我们的导航需求压倒了我们 80 年代的梦想,我们获取汽车数据的方法也相应地出现了分歧。
企业决策很像开车。强大的企业同样利用数据来回答我们的仪表板和电话回答的同样两个问题:我们做得怎么样(仪表板),我们要去哪里(电话)?分析团队负责为这些目的提供和解释隐喻电话和仪表板,它们分别是:
- 即席分析:直接回答问题的工作。
示例:一次性工作、数据拉取请求、利益相关方问题。 - 自助分析:让系统回答问题的工作。
例子:仪表盘、数据 app。
电话=即席分析。仪表板=自助服务分析。图片作者。
但就像我们 80 年代和 90 年代的内心孩子一样(也许下意识地听从他们的暗示),数据行业一直在追逐一个谬论,即日益复杂的仪表板是我们决策需求的万能药方,导致大量无人维护的仪表板,让人想起未来 80 年代的汽车设计。但是,就像在驾驶时一样,您需要数据来告知您要去哪里和如何做,以便作为一个组织做出正确的决策,因此,临时和自助服务分析是使组织能够做出数据驱动的决策的关键。
自助工作使涉众能够自己进行基本的探索,而临时分析帮助他们回答不可避免地会出现的更复杂的问题。
在接下来的内容中,我将阐述为什么 ad hoc analytics 需要成为一等公民,并且我们将讨论为此我们可以做些什么。
你为什么要在乎?
临时工作需要提升有三个主要原因:
1。临时分析对于做出数据驱动的决策至关重要
我们开车很长一段时间都没有手机,但现在很难想象在没有手机的情况下决定去哪里以及如何到达那里。我们要用纸质地图吗?求我们的朋友推荐?多么古老!
即席分析就像电话。它们通过回答最关键的问题来帮助我们在企业决策的世界中导航:“我们应该投资哪个收购渠道?”,“如果没有 A/B 测试,我们如何评估这个特性的成功?”这类问题通常不能单独通过仪表板来回答,而只能通过仔细的特别分析、与利益相关者的深入合作以及专家分析师的框架和解释来回答。
2。临时工作可能是分析工作中最痛苦或最有收获的部分
并非所有的临时工作都是相同的。分析界很少讨论的一点:有两种不同的特别请求:战略 分析和快速问题。快速问题是对数据和单独数据的请求,而战略分析是对解释的请求。快速问题的大量涌入可能导致低工作满意度,分析师被视为 SQL 猴子,而战略分析工作可能导致高工作满意度,分析师被视为有价值的思想伙伴。这里的诀窍是:在每个快速问题的背后,总有一个战略要求。
找到快速问题背后的战略要求可以提升分析的角色,使其更具战略性,而不是被动反应。图片作者。
为分析团队构建流程和最佳实践,以有意识地发现数据拉取请求背后的战略问题,可以大幅提高工作满意度。但这只有在临时工作被视为合法的工作流程,而不是被掩盖时才会发生。
3。临时工作占用了多的时间
我们在 Twitter、LinkedIn 和个人网站上对人们进行了调查,发现大约 40-50% 的分析师时间花费在临时请求上,即使使用健壮的工具来实现自助服务行为(Looker、metabase、dbt 等)。).临时工作不仅痛苦,还会占用大量时间。
大约 40-50%的分析时间花在临时工作上。图片作者。
你能做些什么呢?
1.使特设工作成为一等公民。
仅仅认识到临时工作是有效的工作会有很大的帮助。对于团队领导,确保将临时工作适当纳入分析师的绩效评估中。对于 ICs,学习如何有效地做到这些:避免被动地、不假思索地响应请求,而是在编写一行 SQL 之前,与利益相关者合作,让自己参与到揭示潜在的战略目标中。对于利益相关者,要学会问问题,让分析师更深入地参与决策过程。
2.建立临时工作的制度和标准。
临时工作需要流程化和标准化。为分析师构建模板以确保工作标准化,推动利益相关方遵循他们自己的流程以简化对话,将工作存储在一个集中、可发现的位置。我们构建了 hyperquery 正是为了更容易地完成和共享战略性的临时工作,但目标是流程改进,而不是工具。
结论
虽然自助式仪表板世界肯定比过去几代人的数据沙漠更好,但仍有许多工作要做,并且将所有数据消费归入自助式服务并不像我们希望的那样有效。临时工作的策略需要成为任何强大的分析计划的关键部分。
有兴趣了解更多关于超级支持您的临时工作流的信息吗?通过 联系我 Robert @ hyperquery . ai,通过hyperquery . ai查看我们专用的即席分析*台。
什么是 API?容易解释
原文:https://towardsdatascience.com/what-is-an-api-easily-explained-d153a736a55f
应用程序编程接口介绍
Emile Perron 在 Unsplash 上的照片
应用程序编程接口(API)是一个概念,它支持并简化软件程序之间的通信。它定义了从应用程序中提取或向应用程序发送数据的方式和格式。
应用编程接口是用来做什么的?
API 通过允许发送、请求、删除或修改信息来实现不同程序和应用程序之间的通信。
这种结构使模块化复杂的软件应用成为可能,它使单个程序部分独立,然后通过编程接口相互通信。这意味着代码的各个功能彼此之间是明确分离的,并且可以很容易地交换或更改。
比如 Docker 容器就是基于这个原理。这些容器可以在集群中的不同计算机上启动,并执行单独的代码段。为了将它变成一个正常运行的应用程序,它们从其他容器接收数据,并通过 API 将自己的结果发送给下游容器。
哪些应用程序使用 API?
我们已经在很多地方遇到了编程接口。例如,调用一个网站只不过是在提供商的 web 服务器上查询一个应用程序编程接口。因此,许多网站提供 API 来访问他们的数据就不足为奇了。提供这样的数据检索接口,例如:
通过提供 API,网站也可以保护自己免受所谓的网络抓取。对于许多用户来说,从网站上自动阅读信息是很有趣的。如果提供商不为此提供接口,通常会采取抓取网站的方式。为了做到这一点,一个机器人调用页面并在几毫秒内读出它。这会给网站带来巨大的负载,从而导致性能下降。
例如,在电子商务环境中,Paypal 的接口用于向客户提供这种支付选项。商店如何向 Paypal 发送数据有一个明确的结构。这意味着这种支付选项可以快速轻松地集成到各种电子商务商店中。
在线天气信息网站也依靠编程接口来提供服务。像 wetter.com这样的网站,提供了检索世界上几乎任何地方的天气预报的可能性。提供信息并不完全简单,因为它涉及到咨询各种区域气象服务并集中整理它们的数据。
应用程序编程接口用于标准化这一过程。这使得网站可以自动接收区域数据,并采用预定义的数据结构。
编程接口有哪些类型?
基本上,有不同的方法将编程接口分组。最常见的情况是,API 根据其可访问性进行区分,即谁被授权访问数据。对以下三种类型进行了区分:
- 内部 API :这些是专门为公司内部使用的编程接口。它们对外部用户不可见,当然也不可检索。例如,销售部门可以通过 API 访问来自内部客户关系管理(CRM)工具的数据。在任何情况下都不能让外人接触到这一敏感信息。
- 合作伙伴/客户 API :这些编程接口保存了应该被选定的一组人访问的数据。身份验证在这里起着重要的作用,因为它确保用户确实被授权查看信息。例如,一些在线商店提供通过 API 检索客户自己的订单或交付信息的选项,以便客户可以在自己的环境中使用它。在这些应用中,必须确保每个客户只看到与他们的客户号相关的订单。
- 公共/开源 API :这种类型的应用编程接口通过互联网向公众开放。这些数据是公众感兴趣的,这就是运营商提供公众访问的原因。但是,根据使用情况,可能会对数据传输收费,以维护所提供的基础架构。公共 API 包括,例如,谷歌地图接口。
除了通过可访问性进行区分之外,一些源还使用界面定向来创建不同的组:
- 面向功能的:这个组中的接口使程序能够直接访问设备的硬件,以启用那里的特殊功能。例如,可以通过操作系统 API 请求硬件的组件。
- 面向文件的:这允许访问计算机硬盘的请求,并允许输出特定的文件或目录。访问权限通过操作系统进行管理。
- 面向对象:在许多编程语言中,就像在 Python 中,复杂的应用程序被分成不同的类。面向对象的接口允许这些类(也称为对象)之间的通信,并且比面向函数的接口灵活得多。
- 面向协议:面向协议的应用编程接口完全独立于操作系统和硬件,因为它们使用协议和库工作。
API 有什么优势?
使用编程接口可以实现无数的优势。其中很大一部分可以归结为这样一个事实:在接口的帮助下,应用程序不再容易出错,更容易维护,因此需要更便宜的基础设施。我们将在接下来的章节中解释这些优势是如何产生的。
应用程序编程接口使得软件应用程序(例如 Docker 应用程序)能够模块化。为此,整个应用程序被重写为更小的子任务,以便这一部分可以自主运行。与上游和下游流程步骤的通信仅通过应用程序编程接口进行。
一方面,这提供了这样的优势,即计算密集型处理步骤可以切换到功能更强大的计算机,而其他步骤可以切换到集群中更便宜的组件。此外,整体应用程序非常抗错。只要所有单独的组件通过一个接口接收正确的输入,并通过一个接口输出正确的输出,整个程序就能正常运行。
这种架构使得维护子应用程序、更新它们或者甚至用全新的系统替换它们变得更加容易。
REST API 是如何工作的?
我们在互联网上看到的内容几乎完全基于 API 查询。在互联网的早期,简单对象访问协议(或简称 SOAP)被用于此目的,它发送 XML 文档。然而,在 21 世纪初,REST 接口(表述性状态转移)成为了 web 服务的基础。
使用 SOAP 的问题在于,服务器通信必须遵守严格的规范,XML 的处理也相当麻烦。另一方面,REST 使用更清晰的 JSON 文件。此外,它提供了灵活的格式,并且在数据传输方面非常高效,这在当今的 web 中扮演着重要的角色。
这是你应该带走的东西
- 应用程序编程接口(API)是一个使软件程序能够相互通信的概念。
- 例如,它们被用于网站的建设。
- 使用这样的接口是有利的,因为它允许程序模块化。
如果你喜欢我的作品,请在这里订阅https://medium.com/subscribe/@niklas_lang或者查看我的网站* 数据大本营 !还有,medium 允许你每月免费阅读 3 篇 。如果你希望有无限制的 访问我的文章和数以千计的精彩文章,不要犹豫,点击我的推荐链接:【https://medium.com/@niklas_lang/membership】每月花$5***获得会员资格**
* *
什么是 MLP,你为什么要关心?
原文:https://towardsdatascience.com/what-is-an-mlp-and-why-should-you-care-bfa06741a183
检查基本神经网络算法的内部工作方式
阿诺·弗朗西斯卡在 Unsplash 上的照片
想象一下:你正坐在办公桌前,将你的数字文件分类到文件夹中……再一次。一点一点,你把它们放入桌面上不同的文件夹,突然两个小时过去了。对我们大多数人来说,这可能很有关系,但不一定是这样。如果有一个电脑程序可以帮你整理这些文件会怎么样?几乎可以独立思考?并且有完美的准确性?遇见…请击鼓…神经网络!🎉
神经网络是一种可以确定数据集模式的计算机程序,通过这种方式,可以训练它以比普通计算机程序更快的速度完成某些任务。它通过观察你提供给它的成千上万个不同的例子来学习预测某个数据的结果。
MLP 或多层感知器是一种由许多不同的互连感知器或数学方程组成的神经网络。每个感知器都与其他感知器相连,它们之间的连接有强度或权重,会影响神经网络的输出。你可能听说过 MLPs 以前作为前馈人工神经网络。
神经网络🧠
神经网络是一种人工智能,简称 AI。人工智能现在就在你的周围——在你的亚马逊 Alexa 设备中,在 Waymo 的自动驾驶汽车中,在交通灯中,在网上购物推荐中,在药物发现中,在面部识别中,在 Roomba 吸尘器中,等等。神经网络使用一系列数学算法来识别一组数据中的潜在模式,并使用这些模式来预测新数据的结果。人工神经网络试图模仿人脑的运作方式。神经网络由 神经元— 组成,每个神经元都是一个简单的等式,它接受输入,将这些输入乘以一组权重,然后将输出传递给下一个神经元。现在,这可能听起来像一堆胡言乱语,但我会进一步解释这些概念。
神经元?重量?这是什么魔法?🧙♂️
你可能想知道所有这些花哨的单词到底是什么。相信我,我也有同感!首先,理解人类大脑如何工作的基础很重要,因为这是人工智能程序员建模他们的神经网络的目的。人类大脑由大约 860 亿个 神经元 组成,当面对不同的刺激时,神经元之间会发出电⚡️。大脑的不同部分负责不同的事情,如情绪、推理和记忆。所有这些部分都由神经元组成。
信用:昆生
一个人工神经网络试图复制人脑的工作方式,尽管不是完全相同的方式。由于人脑如此复杂,程序员不得不大幅简化思维过程,将其归结为一组数学方程,数据通过这些方程产生输出。
MLPs
MLPs 是人工神经网络的最基本形式。他们使用一系列的 感知器 ,或者带有输入、输出和权重的方程,将一系列的输入变成 0 到 1 之间的单一输出。该输出然后被馈送到另一层感知器,并且该过程继续,直到它到达单个输出(或一组输出,取决于 MLP 的功能)。MLP 至少有三个图层-输入图层、至少一个隐藏图层和输出图层。隐藏层使您更容易区分无法线性分类的数据,例如,如下所示:
信用:塔拉普罗尔
划分蓝色和红色数据点的线不会是线性的,它们必须是弯曲的,以便最好地对数据进行分类。这是 MLP 非常适合的数据集类型。
信用:塔拉普罗尔
MLP 最重要的部分是重量。神经网络的每个输入都经过“层”,其中输入乘以不同的权重(用字母 W 表示)。权重表示两条数据之间的联系强度。
我喜欢把重量想象成一个家庭。在家谱上,你的兄弟比你的堂兄弟更接*你。你的母亲在树上比你的远房表亲离你更*。家谱上这些“相关度”的数量对应于感知器的权重——较高的权重表示兄弟姐妹,较低的权重表示类似于第三代表亲的东西。权重对应于连接的强度。
下图显示了这在神经网络中的工作原理:
信用:塔拉普罗尔
权重真正决定了神经网络的输出是什么,因为它们提供了数据点和想法之间的每个连接的强度。这里有另一个类比:MLP 的重量就像绳子,一些绳子比另一些更结实。如果重量很轻,绳子可能是一根极细的细线。但是如果重量真的很大,绳子可能有 3 英尺粗!
上图中还有一个你可能已经注意到的重要因素,那就是偏差。偏差仅仅是带有权重的等式的最终结果的偏移。根据具体情况,有时您需要这个偏移量来获得正确的输出。例如,如果偏差为 1,则每个输入的最终输出及其权重将增加 1 以中和输出。
回到上一张图片,如果您的输入全部为 1,权重全部为 1,偏差为 1,您的网络将如下所示。
信用:塔拉普罗尔
最后,我们需要了解每个神经元的输出是如何计算的。
首先,神经元计算输入的加权和,并在最后加上偏差。
信用:塔拉普罗尔
例如,如果输入是:
信用:塔拉普罗尔
权重为:
信用:塔拉普罗尔
然后像这样计算加权和,将每个输入乘以其各自的权重,然后将所有的乘积相加。
信用:塔拉普罗尔
然后我们把偏差加到加权和上…
信用:塔拉普罗尔
…最后,该值被输入激活函数,然后准备输出。激活函数只是一个数学方程,它将输入标准化,将其转换为 0 到 1 之间的值,以便计算机读取。您可以使用 sigmoid 函数、ReLU 函数或 Tanh 函数。通常,sigmoid 函数是最佳选择,因为它提供了零和一之间的*滑过渡以及感知器输出之间的更多可变性。
乙状结肠函数。信用:塔拉普罗尔
如果你对其他类型的激活功能感兴趣,可以随意查找或者阅读这篇文章。
回到我们之前的例子,看起来像这样:
每个输入(为了简单起见,让我们把它们都设为 1)将乘以各自的权重,在本例中为 1。
信用:塔拉普罗尔
然后,加权输入被加在一起以产生加权和。
信用:塔拉普罗尔
然后我们把偏差加到加权和上…
信用:塔拉普罗尔
…并计算最终产品。
一旦你把它传递给激活函数,你会得到一个介于 0 和 1 之间的数字,这取决于你使用哪个函数。我通过 sigmoid 函数传递数字 5,得到数字 0.993307149076——这个数字然后四舍五入到两位小数,得到 0.99。
这个介于 0 和 1 之间的数字就是神经元的“亮度”——越接* 0 越暗,越接* 1 越亮。这个“亮度”表示神经元的强度。
如果你对这些概念有困难(我知道这很难理解),我推荐你看一下这个 Youtube 视频!
这就是每个单个神经元(也称为感知器)的工作方式——它是如何与整个网络联系起来的?
MLPs——一个复杂的感知器系统
神经网络可以像这样简单:
鸣谢:Wiso,公共领域,通过维基共享资源
或者像这样复杂:
Zufzzi,公共领域,通过维基共享
这完全取决于你在网络中使用了多少这样的神经元或感知器。MLP 的主要思想是感知器的输出成为下一层感知器的输入之一。通过这样做,输出的可能性被缩小,直到输出的选择是最小的和简洁的。
训练 MLP
当然,神经网络第一次不会完美地工作。我们从随机权重开始,很明显这不是很好。所以我们必须用一系列的练习输入来“训练”网络,这样它就可以调整它的权重以达到最佳的准确度。为此,我们用它应该给出的输出来标记一大组 训练数据 。(这被称为监督学习——也有无监督学习,没有标签,这是一个完全不同的话题。)我们通过我们的 MLP 运行这些训练数据,如果答案是错误的,就调整权重和偏差。这个过程一遍又一遍地重复,直到 MLP 能够正确地分类所有的训练数据。在这之后,我们运行一些新的数据,叫做 测试数据 ,通过它从未见过的神经网络。
把这想象成一次数学考试。在考前的学习期间,你的老师会给你很多练习题。你学会掌握这些问题,并很快知道如何解决所有这些问题。当你进行期末考试时,你会看到一些你从未见过的新问题,你会尽最大努力用回答练习题的方式来回答这些问题。
在神经网络中,训练数据类似于练习题,测试数据类似于数学测试。
那么,为什么这很重要呢?
MLP 是自动分类数据的有效方法。一旦你训练了一个神经网络,这个程序将比你或你的普通计算机程序更快地准确分类数据。MLPs 可以在日常生活中节省大量的时间,而且它们比你想象的更普遍。
图像的像素可以减少到一长行数据,并输入 MLP。然后,可以根据图像中发现的模式对图像进行分类。文档中的单词也可以缩减为一长行数据,并输入 MLP。MLP 可以根据它看到的模式对文章的大意进行分类。
MLPs 可用于非常广泛的任务;例如,简单的图像识别、文件和数据分类、在线购物推荐、社交媒体等等!
MLP 在许多不同的领域都很有用,现在你对它们有了更多的了解🤩
https://taraprole.substack.com/subscribe
什么是人工智能?
原文:https://towardsdatascience.com/what-is-artificial-intelligence-79bbcde38998
了解人工智能、机器学习和深度学习的区别
安德烈亚斯·菲施格尔在 Unsplash 上的照片
人工智能(简称:AI)描述了试图教会计算机人类学习和思考。与算法相反,机器应该能够解决它没有直接编程的学习任务。
什么是人工智能?
人工智能的概念出现的时间比大多数人预期的要长。早在 1950 年,艾伦·图灵就在他的研讨会论文《计算机器与智能》中使用了这个术语,并在其他内容中探讨了机器是否能思考的问题。
他还开发了著名的“图灵测试”,这是第一个决定计算机是否是“人工智能”的方法。测试设置相对简单。测试人员向第二测试人员和计算机询问特定应用领域内的不同问题。之后,提问的参与者收到答案,却不知道哪个来自人类,哪个来自计算机。
现在它必须试着决定哪个答案是人类的,哪个不是。如果它在超过 50%的情况下不能正确地做出这种分配,计算机被认为是人工智能的,因为它的答案在一半的情况下被认为与人类的答案一样。
虽然图灵的工作被认为是人工智能发展的基石,但*年来其他定义也开始出现。这本书由 Stuart Russell 和 Peter Norvig ( 人工智能,一种现代方法)撰写,已经成为文学的基石之一。
在本书中,作者定义了他们眼中人工智能应该实现的四个不同目标:
人工智能的定义|来源:作者
不管人工智能的定义是什么,它都是计算机科学的一个子领域,使用大型数据集和统计方法来尝试学习关系,并将其应用于新数据。
人工智能有哪些类型?
窄 AI(也称为弱 AI 或人工窄智能(ANI))指的是针对特定用例进行训练并为其取得非常好结果的模型。在这个特定的领域,它们甚至可以比人类更优秀。今天已经围绕在我们周围的大多数人工智能系统都被归类为狭义人工智能。其中包括,例如,亚马逊的 Alexa 或苹果的 Siri 等语音系统,以及自动驾驶汽车中的驾驶助手。
这与所谓的广义 AI (也称为强 AI 或人工通用智能(AGI))形成对比,后者目前仍是一种理论现象。这个术语指的是拥有与人类智力相当的智能的计算机。这意味着该模型可以在学习的同时独立地很好地解决各种各样的应用。
人工智能为什么重要?
人工智能已经在许多领域扮演了重要角色。例如,公司能够做出更好的决策,改进他们的流程,并使他们的产品更好地适应客户的需求。与此同时,使用人工智能的产品在许多情况下使我们的生活变得更容易,例如在驾驶时或购物时提出建议时使用语音助手。
一般来说,人工智能非常重要,原因包括:
- 接管重复性的任务:人工智能不仅可以自动化重复性的过程,例如在生产中,还可以持续改进它们。人类可以从这些通常繁琐的任务中解脱出来,可以全身心地投入到其他任务中。
- 提高现有产品的效用:我们周围的许多应用和产品已经达到了高质量水*。然而,人工智能可以进一步改善它们,并使它们适应需求。例如,语音系统可以通过消除搜索某些功能和直接回答问题的需要来增加手机、计算机甚至网站的可用性。
- 使用来自数据的上下文:使用人工智能,特别是深度学习开辟了识别大量数据中的相关性并应用它们的可能性。这些也可能是我们人类甚至没有意识到的关系。这产生了我们可以利用的新知识。
人工智能有哪些应用?
今天,我们已经在有意识和无意识地使用各种人工智能模型。以下列表是最普遍的系统的执行情况:
- 语音识别:无论是在车上、手机上,还是用亚马逊 Alexa 等特殊设备,现在很多设备都内置了语音识别。借助人工智能训练出来的各种模型作为基础。
- 计算机视觉:机器识别物体或解读图像的能力也是因为人工智能。例如,它已经被用于在 x 光的基础上进行医学诊断,或者在照片中识别和标记人。
- 推荐:无论是在 YouTube、电子商务门户网站,还是网飞,这些提供商都试图做出尽可能精确的推荐,这样我们作为客户,要么在*台上停留更长时间,要么购买更多产品。这些建议基于各种人工智能算法和模型。
人工智能有哪些领域?
人工智能这个术语是一个总括术语,包括所有旨在教会机器或计算机人类行为的领域。还包括机器学习的领域,它试图借助统计方法,如主成分分析或决策树,一步步改进其结果,以及一个学习过程。
人工智能领域|来源:作者
最后还有深度学习,也是机器学习的一个子领域。它使用一个神经网络的结构来计算其结果。与机器学习领域中的简单模型相比,这些多层网络还使得学习更复杂的关系成为可能。
深度学习与机器学习
深度学习是机器学习的一个子领域,与机器学习不同的是,学习过程中没有人类参与。这是基于这样一个事实,即只有深度学习算法能够处理非结构化数据,如图像、视频或音频文件。另一方面,其他机器学习模型需要人类的帮助来处理这些数据,例如,告诉它们图像中有一辆汽车。另一方面,深度学习算法可以自动将非结构化数据转换为数值,然后将这些数据纳入预测,并识别结构,而无需任何人类互动。
此外,深度学习算法能够处理大量数据,因此也能够处理比传统机器学习模型更复杂的任务。然而,这是以深度学习模型的训练时间明显更长为代价的。同时,这些模型也很难解释。也就是说,我们无法理解一个神经网络是如何做出一个好的预测的。
这是你应该带走的东西
- 人工智能是指试图教会计算机像人类一样思考。
- 弱人工智能和强人工智能是有区别的。前者指的是在单个用例中交付非常好的结果的模型。而强 AI 则是堪比人类的智力。
- 如今,我们已经在各种应用中遇到了人工智能,如推荐系统、语音识别或计算机视觉。
如果你喜欢我的作品,请在这里订阅https://medium.com/subscribe/@niklas_lang或者查看我的网站* 数据大本营 !还有,媒体允许你每月免费阅读 3 篇 。如果你想让无限制地访问我的文章和数以千计的精彩文章,不要犹豫,通过点击我的推荐链接:*https://medium.com/@niklas_lang/membership获得会员资格,每个月只需支付 5**
***</8-machine-learning-algorithms-everyone-new-to-data-science-should-know-772bd0f1eca1> ***
目标检测和定位算法的*均精度是多少,如何计算?
理解目标检测和定位算法的*均精度的一步一步的可视化指南
什么是物体检测和定位?
物体检测和定位是机器学习中发展最快的领域之一。这种算法是标准分类算法的扩展。对于给定的输入图像,分类算法将输出感兴趣类别的概率分布。旨在不仅检测图像中感兴趣类别的存在,而且使用包围盒来定位它们。此外,它还可以处理同一图像中多个类的存在。
考虑下图,该图将分类算法与对象检测和定位进行了比较。
分类与检测定位算法的区别——图片由作者修改自 Steve Tsang 在 Unsplash 上的照片、 Priscilla Du Preez 在 Unsplash 上的照片
因此,它不仅预测了类标签,还告诉我们预测的类在图片中的位置。因此,为了评估对象检测和定位算法的性能,我们需要评估预测的类是否是实际的类,以及预测的边界框有多接*地面事实。
评估指标
目标检测和定位算法的性能通过称为*均精度(AP)(和*均*均精度)的度量来评估。在我们进入 AP 是什么的细节之前,让我们先弄清楚它不是什么。
AP 不是不同类的*均精度。
AP 是在 IoU、混淆矩阵(TP、FP、FN)、精度和召回率等其他几个指标的帮助下计算出来的,如下图所示。
要理解 AP,我们首先需要理解这些指标。
1.并集交集(IoU):
IoU 量化了两个边界框(地面真实和预测)的接*程度。它是一个介于 0 和 1 之间的值。如果两个边界框完全重叠,则预测是完美的,因此 IoU 为 1。另一方面,如果两个边界框不重叠,则 IoU 为 0。IoU 的计算方法是取两个键合框的相交面积与并集面积之比,如下所示。
并集上的交集—作者图片
2.真阳性、假阳性、假阴性:
如果预测边界框和基本真实边界框的类别标签相同,并且它们之间的 IoU 大于阈值,则预测被认为是正确的。
基于 IoU、阈值和基本事实的类别标签以及预测的边界框,我们计算以下三个度量
- 真阳性:模型预测某个位置存在边界框(阳性),并且是正确的(真)
- 假阳性:模型预测一个边界框存在于一个特定的位置(阳性),但它是错误的(假)
- 假阴性:该模型没有预测到某一位置的边界框(阴性),并且它是错误的(假的),即在该位置存在地面真实边界框。
- 真否定:模型没有预测到一个边界框(否定),它是正确的(真)。这对应于背景,没有边界框的区域,并且不用于计算最终度量。
下面的例子将有助于澄清 TP、FP 和 FN。
IoU、TP、FP、FN —作者图片
3.精确度,回忆
基于 TP、FP 和 FN,对于每个标记的类,我们计算两个参数:精度和召回率。
- Precision: 告诉我们我们的模型有多精确,即在检测到的所有猫中,有多少是真正的猫。因此,它是真阳性与由模型做出的 cat 预测总数(相当于真阳性和假阳性之和)之间的比率,如下所示。
- 回忆:告诉我们模型从图像中回忆类别的能力,即在输入图像中的所有猫中,模型能够检测到多少只。因此,它是由如下所示的模型产生的真阳性和地面真实猫的总数(相当于真阳性和假阴性的总和)之间的比率。
机器学习中的精确度和召回率—作者图片
从上图可以看出,分类器在预测时是 精确 。当它说它是猫(狗)的时候,它 80%的时候都是正确的。然而,如果图像中有一只猫(狗),分类器只能在 50% (80%)的时候检测到它。于是模特有了不好过的 回忆 猫。
4.精确回忆曲线
理想情况下,我们希望精确度和召回率都很高,即无论检测到什么都是正确的,并且模型可以检测到一个类的所有出现。精确度和召回率的值取决于模型检测到多少真阳性。指定边界框 TP、FP 和 FN 取决于以下两点
- 预测标签与基本事实标签的比较
- 两个盒子之间的借据
对于多类分类问题,模型输出包围盒属于某一类的条件概率。类的概率越大,边界框包含该类的机会就越大。概率分布连同用户定义的阈值(在 0 到 1 之间)用于分类边界框。
这个概率置信阈值越小,模型做出的检测的数量就越多,错过真实标签的机会就越低,因此的召回率就越高** (通常,但不总是)。另一方面,置信度阈值越高,模型对其预测越有信心,因此精确度 (通常,但不总是)。我们希望精确度和召回率都尽可能高,因此,基于置信度阈值的值,在精确度和召回率之间存在折衷。**
精确度-召回率曲线绘制了不同置信度阈值的精确度值与召回率的关系。
有了精确召回曲线,我们可以直观地看到什么样的置信度阈值对我们是最好的(对于我们给定的应用程序)。下面是 PR 曲线的一个过于简化的例子
精确召回曲线—作者图片
5.*均精度
为您的应用程序选择一个置信度值可能很难,而且很主观。*均精度是一个关键的性能指标,它试图消除对选择一个置信度阈值的依赖性,其定义如下
*均精度是 PR 曲线下的面积。
AP 将 PR 曲线总结为一个标量值。当精确度和召回率都很高时,*均精确度就很高,而当精确度和召回率中的任何一个在置信阈值范围内很低时,*均精确度就很低。AP 的范围在 0 到 1 之间。
*均精确度是精确度-召回曲线下的面积-作者提供的图像
以下两种方法通常用于求 PR 曲线下的面积。
方法 1 —用矩形*似 PR 曲线:
- 对于每个精确召回对(j=0,…,n-1),PR 曲线下的面积可以通过使用矩形*似曲线来找到。
- 这种矩形的宽度可以通过取两个连续召回值(r(k),r(k-1))的差来找到,而高度可以通过取所选召回值的精度的最大值来找到,即 w = r(k)-r(k-1),h = max(p(k),p(k-1))
- AP 可以通过这些矩形的面积之和来计算,如下所示
从 PR 曲线计算*均精度—作者提供的图像
方法 2 —插值法和 11 点*均法
- 计算从 0.0 到 1.0 的 11 个召回值的精度值,增量为 0.1
- 在右图中,这 11 个点可以被视为橙色样本
- AP 可以通过取这 11 个精度值的*均值来计算,如下所示
从 PR 曲线计算*均精度—作者提供的图像
6.*均精度:
可以为每个类计算 AP 值。*均精度是通过对所有考虑的类取 AP 的*均值来计算的。即
*均*均精度-所有 k 类的*均精度(AP)的*均值-按作者分类的图像
摘要
*均精度(mAP)量化了目标检测和定位算法的性能。为了理解 mAP,我们需要理解 IoU、真阳性、真阳性、假阳性、假阴性、回忆、精度和精度-回忆曲线是什么。在本文中,我们详细介绍了这些概念,以及它们如何帮助我们计算地图。
如果这篇文章对你有帮助,或者你想了解更多关于机器学习和数据科学的知识,请关注Aqeel an war,或者在LinkedIn或Twitter上联系我。你也可以订阅我的邮件列表。
Python 的“with”语句背后是什么?
原文:https://towardsdatascience.com/what-is-behind-the-python-with-statement-89c74be3a6bd
您可以编写支持“with”语句的定制函数和类
我相信你一定曾经在 Python 中使用过“with”语句,只要你不是几天前才开始学习的 Python 新手。众所周知,我们可以使用 with 语句创建资源的“上下文”,而不必担心随后关闭或释放它。
由于这种语法在 Python 中是独一无二的,您有没有想过幕后到底发生了什么?在本文中,我将深入介绍 Python with 语句,并提供一些在程序中灵活使用它的想法。
1.为什么使用“with”语句?
让我们从一些基本的开始。with-statement 最常见的用例之一是在 Python 问题中打开文件。假设我们想打开一个文本文件并向其中写入一些内容,然后关闭它。最简单的代码如下。
1.1 一个不好的例子
# Bad Example
f = open('my.txt', 'w')
f.write('Hello!')
f.close()
上面的代码将打开一个名为my.txt
的文件,然后将字符串Hello!
写入其中。然后,我们需要关闭文件流来释放这个资源,以避免内存泄漏之类的问题。
然而,这是一个不好的例子。如果在我们操纵文件的过程中出了问题,程序将永远不会到达close()
方法。
1.2“常规”解决方案
因此,更好的解决方案是将close()
方法放在 finally-block 中,后面跟着一个 try-except 块。
# Try Except
f = open('my.txt', 'r')
try:
print(f.readline())
except:
pass
finally:
f.close()
上面的代码这次以读取模式打开文件,然后读取第一行并打印出来。“finally”块确保close()
方法被保证执行,即使可能有错误。
1.3 推荐的解决方案
推荐的解决方案是在 Python 中使用 with 语句。代码非常简单,如下所示。
# With Statement
with open('my.txt', 'r') as f:
print(f.readline())
我们将该文件作为变量f
打开,然后我们可以在这个 with-statement 块中使用该文件来做我们想做的任何事情。我们不会费心关闭文件。它也保证最终会被摧毁。同样,我们不能在上下文之外使用变量f
。
另外值得一提的是,从 Python 3.1 开始,我们可以在 with 语句中放置多个逗号分隔的上下文表达式。
with open('my.txt', 'r') as f_source, open('my_new.txt', 'w') as f_dest:
f_dest.write(f_source.readline() + ' Again')
此外,从 Python 3.10 开始,我们可以使用括号将多个表达式分组,这样代码就可以分成多行,从而提高可读性。
with (
open('my.txt', 'r') as f_source,
open('my_new.txt', 'w') as f_dest
):
f_dest.write(f_source.readline() + ' Again')
顺便说一下,上面的代码打开原始文件my.txt
作为源文件,打开一个新文件my_new.txt
作为目标文件。然后,它从源文件中读取并写入作为目标的新文件。
2.“带”定制类
所有的回顾都已经在前面的章节中完成了。现在我们应该从一些深入的东西开始。为什么open()
方法支持 with-statement?我们能创建支持它的定制课程吗?
2.1 简单的例子
答案是肯定的。让我们从一个简单的类开始作为例子。
class Person: def __init__(self, name):
self.name = name
def greeting(self):
print(f'Hello, my name is {self.name}!')
类Person
只有两个方法,一个是 init 方法,它将name
值作为类的属性。然后,还有一个greeting()
方法,用这个人的名字打印一条问候消息。
我们试试它的greeting()
方法。
Person('Chris').greeting()
现在,假设我们想在使用 with 语句的上下文中创建这个人。我们能做到吗?
with Person('Chris') as p:
p.greeting()
显然,我们不能。然而,错误提醒了我们应该做什么。
2.2.enter 和 exit 方法的实现
为了能够使用 with 语句,我们需要实现__enter__()
方法。事实上,还有另一个叫做__exit__()
的方法是可选的。让我们看看下面的代码。
class Person: def __init__(self, name):
self.name = name
def greeting(self):
print(f'Hello, my name is {self.name}!') def __enter__(self):
print('Creating a person object in a context...')
return self def __exit__(self, exc_type, exc_value, exc_tb):
print("exception type:", exc_type)
print("exception value:", exc_value)
print("exception traceback:", exc_tb)
print('Object disposed')
这里,当使用 with 语句创建对象时,将执行__enter__()
方法。它必须返回对象,也就是它自己。
当上下文结束并且需要释放对象时,将调用__exit__()
方法。它还有 3 个参数,如果有异常,这些参数将捕捉异常的一些细节。
现在,让我们再试一次代码。
with Person('Chris') as p:
p.greeting()
从输出中我们可以看到,__enter__()
方法在其他任何事情之前被调用,然后执行 with 语句的主体,也就是问候消息。最后,调用__exit__()
方法并释放对象。
2.3 在 With 语句中处理异常
上面的代码中没有发生异常,所以所有与异常相关的参数都是None
。
with Person('Chris') as p:
a = 1/0
p.greeting()
在这段代码中,我添加了a = 1/0
,这肯定会导致错误。让我们看看 with-statement 将如何表现。
异常类型、值和追溯现在可用,因为有一个异常。这些回调参数使我们能够相应地处理异常。
3.“带”定制功能
图片来自 Pixabay 的 Uwe Baumann
好吧,大多数时候我们可能想在函数中使用 with 语句,而不是创建一个对象。open()
函数就是这样一个例子。也就是说,我们用这个函数写一个 with 语句,并给出我们想要打开的文件名。然后,它在这个上下文中打开文件,当离开上下文时,连接被破坏。
我们可以使用 Python 内置的contextlib
来做到这一点。具体来说,我们需要在这个模块中使用contextmanager
。
from contextlib import contextmanager
然后,我们可以用contextmanager
作为装饰来定义函数。
假设我们要与一个数据库建立连接。让我们用伪代码来做这件事。
[@contextmanager](http://twitter.com/contextmanager)
def get_db_connection(connection_str):
db_con = 'connected to' + connection_str
try:
yield db_con
finally:
print('the connection is closed')
该代码模拟连接到一个数据库。请注意,我们需要使用yield
关键字来返回数据库连接。此外,我们需要使用 try-except 块,并确保异常得到处理,并且应该在 finally 块中释放资源。
现在我们可以在 with 语句中使用这个函数。
with get_db_connection('mysql') as con:
print(con)
摘要
图片来自 Pixabay 的 garageband
在这篇文章中,我已经介绍了我们什么时候需要使用 with 语句以及如何使用它。还解释了这种语法背后的机制。除此之外,我还介绍了如何编写一个支持 with 语句的类或函数。通过以这种方式实现一个类或一个函数,我们可以以一种非常 Pythonic 化的方式简化接口的使用。
https://medium.com/@qiuyujx/membership
如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)
除非另有说明,所有图片都是作者的
一个通用模型和多个专用模型哪个更好?
比较针对不同组训练几个 ML 模型与针对所有数据训练一个唯一模型的有效性
[图片由作者提供]
我最*听到一家公司宣称:
"我们有 60 个生产中的客户流失模型."
我问他们为什么这么多。他们回答说,他们拥有在 12 个国家运营的 5 个品牌,因为他们想为每个品牌和国家的组合开发一个模型,所以总共有 60 个模型。
所以,我问他们:
“你试过只用一种型号吗?”
他们认为这没有意义,因为他们的品牌彼此非常不同,他们经营的国家也是如此:“你不能训练一个单一的模型,并期望它对品牌 A 的美国客户和品牌 B 的德国客户都很好。
由于我在业内经常听到这样的说法,我很好奇调查这一论点是否反映在数据中,或者这只是没有事实依据的猜测。
这就是为什么在本文中,我将系统地比较两种方法:
- 将所有数据输入到一个模型中,即一个一个通用模型;
- 为每个细分市场建立一个模型(在前面的例子中,是品牌和国家的组合),又名多个 专门模型。
我将在 Pycaret(一个流行的 Python 库)提供的 12 个真实数据集上测试这两种策略。
通用模型与专用模型
这两种方法到底是如何工作的?
假设我们有一个数据集。数据集由预测器矩阵(称为 X )和目标变量(称为 y )组成。此外, X 包含一个或多个可用于分割数据集的列(在前面的示例中,这些列是“brand”和“country”)。
现在让我们试着用图形来表示这些元素。我们可以使用 X 的其中一列来可视化分段:每种颜色(蓝色、黄色和红色)标识一个不同的分段。我们还需要一个额外的向量来代表训练集(绿色)和测试集(粉红色)的分裂。
训练集的行用绿色标记,而测试集的行用粉色标记。X 的彩色列是细分列:每种颜色代表不同的细分市场(例如,蓝色代表美国,黄色代表英国,红色代表德国)。[图片由作者提供]
考虑到这些因素,下面是这两种方法的不同之处。
第一种策略:通用模型
在整个训练集上拟合唯一的模型,然后在整个测试集上测量其性能:
通用模型。所有分段(蓝色、黄色和红色)都被馈送到同一个模型。[图片由作者提供]
第二种策略:专业化模式
第二个策略包括为每个片段建立一个模型,这意味着重复训练/测试程序 k 次(其中 k 是片段的数量,在本例中为 3)。
专门的模型。每个部分都被提供给不同的模型。[图片由作者提供]
注意,在实际的用例中,段的数量可能是相关的,从几十到几百。因此,与使用一个通用模型相比,使用专用模型存在一些实际缺点,例如:
- 维护工作量更大;
- 更高的系统复杂度;
- 较高的(累积)训练时间;
- 更高的计算成本;
- 存储成本更高。
那么,为什么会有人想这么做呢?
对通用模型的偏见
专业化模型的支持者声称,一个独特的通用模型在某个特定的细分市场(比如美国客户)上可能不够精确,因为它也已经了解了不同细分市场(比如欧洲客户)的特征。
我认为这是因使用简单模型(如逻辑回归)而产生的错误认知。我举个例子解释一下。
假设我们有一个汽车数据集,由三列组成:
- 汽车类型(经典或现代);
- 车龄;
- 汽车价格。
我们希望使用前两个特征来预测汽车价格。这些是数据点:
一个玩具数据集,包含两个部分(经典和现代汽车),显示与目标变量相关的非常不同的行为。[图片由作者提供]
如你所见,基于车型,有两种完全不同的行为:久而久之,现代车降价,而老爷车加价。
现在,如果我们对整个数据集进行线性回归训练:
linear_regression = LinearRegression().fit(df[["car_type_classic", "car_age"]], df["car_price"])
得出的系数为:
玩具数据集上训练的线性回归系数。[图片由作者提供]
这意味着对于任何输入,模型将总是预测相同的值 12。
一般来说,如果数据集包含不同的行为(除非你做额外的特征工程),简单模型就不能很好地工作。因此,在这种情况下,人们可能会尝试训练两个专门的模型:一个用于老爷车,一个用于现代车。
但是,让我们看看,如果我们使用决策树,而不是线性回归,会发生什么。为了使比较公*,我们将生长具有 3 个分裂(即 3 个决策阈值)的树,因为线性回归也具有 3 个参数(3 个系数)。
decision_tree = DecisionTreeRegressor(max_depth=2).fit(df[["car_type_classic", "car_age"]], df["car_price"])
这是结果:
在玩具数据集上训练的决策树。[图片由作者提供]
这比我们用线性回归得到的结果好得多!
关键是基于树的模型(如 XGBoost、LightGBM 或 Catboost)能够处理不同的行为,因为它们天生就能很好地与特性交互。
这就是为什么没有理论上的理由来支持几个专门化模型而不是一个通用模型的主要原因。但是,一如既往,我们不满足于理论解释。我们还想确定这个推测是由真实数据支持的。
实验的细节
在这一段中,我们将看到测试哪种策略效果更好所需的 Python 代码。如果你对细节不感兴趣,你可以直接跳到下一段,我在那里讨论结果。
我们旨在定量比较两种策略:
- 训练一个通用模型;
- 培养许多专业模特。
比较它们最明显的方法如下:
- 取一个数据集;
- 根据一列的值选择数据集的一个段。
- 将数据集分成训练数据集和测试数据集;
- 在整个训练数据集上训练通用模型;
- 在属于该片段的训练数据集的部分上训练专用模型;
- 比较通用模型和专用模型的性能,两者都在属于该段的测试数据集部分上。
图形化:
X 中的彩色列是我们用来对数据集进行分层的列。[图片由作者提供]
这很好,但是,因为我们不想被偶然的机会愚弄,我们将重复这个过程:
- 对于不同的数据集;
- 使用不同的列对数据集本身进行分段;
- 使用同一列的不同值来定义段。
换句话说,这就是我们将要做的,用伪代码:
for each dataset:
train general model on the training set
for each column of the dataset:
for each value of the column:
train specialized model on the portion of the training set for which column = value
compare performance of general model vs. specialized model
实际上,我们需要对这个程序做一些小的调整。
首先,我们说了我们正在使用数据集的列来分割数据集本身。这适用于分类列和数值很少的离散数值列。对于剩余的数字列,我们必须通过宁滨使它们分类。
其次,我们不能简单地使用所有的列。如果我们这样做,我们将会惩罚专门化的模型。事实上,如果我们选择一个基于与目标变量没有关系的列的段,就没有理由相信专门化的模型可以表现得更好。为了避免这种情况,我们将只使用与目标变量有某种关系的列。
此外,出于类似的原因,我们不会使用分段列的所有值。我们将避免过于频繁的值(频率超过 50%),因为期望在大部分数据集上训练的模型与在整个数据集上训练的模型具有不同的性能是没有意义的。我们还将避免测试集中少于 100 个案例的值,因为结果肯定不重要。
有鉴于此,这是我用过的完整代码:
for dataset_name in tqdm(dataset_names):
# get data
X, y, num_features, cat_features, n_classes = get_dataset(dataset_name)
# split index in training and test set, then train general model on the training set
ix_train, ix_test = train_test_split(X.index, test_size=.25, stratify=y)
model_general = CatBoostClassifier().fit(X=X.loc[ix_train,:], y=y.loc[ix_train], cat_features=cat_features, silent=True)
pred_general = pd.DataFrame(model_general.predict_proba(X.loc[ix_test, :]), index=ix_test, columns=model_general.classes_)
# create a dataframe where all the columns are categorical:
# numerical columns with more than 5 unique values are binnized
X_cat = X.copy()
X_cat.loc[:, num_features] = X_cat.loc[:, num_features].fillna(X_cat.loc[:, num_features].median()).apply(lambda col: col if col.nunique() <= 5 else binnize(col))
# get a list of columns that are not (statistically) independent
# from y according to chi 2 independence test
candidate_columns = get_dependent_columns(X_cat, y)
for segmentation_column in candidate_columns:
# get a list of candidate values such that each candidate:
# - has at least 100 examples in the test set
# - is not more common than 50%
vc_test = X_cat.loc[ix_test, segmentation_column].value_counts()
nu_train = y.loc[ix_train].groupby(X_cat.loc[ix_train, segmentation_column]).nunique()
nu_test = y.loc[ix_test].groupby(X_cat.loc[ix_test, segmentation_column]).nunique()
candidate_values = vc_test[(vc_test>=100) & (vc_test/len(ix_test)<.5) & (nu_train==n_classes) & (nu_test==n_classes)].index.to_list()
for value in candidate_values:
# split index in training and test set, then train specialized model
# on the portion of the training set that belongs to the segment
ix_value = X_cat.loc[X_cat.loc[:, segmentation_column] == value, segmentation_column].index
ix_train_specialized = list(set(ix_value).intersection(ix_train))
ix_test_specialized = list(set(ix_value).intersection(ix_test))
model_specialized = CatBoostClassifier().fit(X=X.loc[ix_train_specialized,:], y=y.loc[ix_train_specialized], cat_features=cat_features, silent=True)
pred_specialized = pd.DataFrame(model_specialized.predict_proba(X.loc[ix_test_specialized, :]), index=ix_test_specialized, columns=model_specialized.classes_)
# compute roc score of both the general model and the specialized model and save them
roc_auc_score_general = get_roc_auc_score(y.loc[ix_test_specialized], pred_general.loc[ix_test_specialized, :])
roc_auc_score_specialized = get_roc_auc_score(y.loc[ix_test_specialized], pred_specialized)
results = results.append(pd.Series(data=[dataset_name, segmentation_column, value, len(ix_test_specialized), y.loc[ix_test_specialized].value_counts().to_list(), roc_auc_score_general, roc_auc_score_specialized],index=results.columns),ignore_index=True)
为了更容易理解,我省略了一些实用函数的代码,比如get_dataset
、get_dependent_columns
和get_roc_auc_score
。然而,你可以在这个 GitHub repo 中找到完整的代码。
结果
为了对通用模型和专用模型进行大规模的比较,我使用了 Pycaret (一个拥有 MIT 许可的 Python 库)中提供的 12 个真实世界的数据集。
对于每个数据集,我找到了显示与目标变量存在某种显著关系的列(p-value < 1% on the Chi-square test of independence). For any column, I have kept only the values that are not too rare (they must have at least 100 cases in the test set) or too frequent (they must account for no more than 50% of the dataset). Each of these values identifies a segment of the dataset.
For every dataset, I trained a general model (CatBoost, with no parameter tuning) on the whole training dataset. Then, for each segment, I trained a specialized model (again CatBoost, with no parameter tuning) on the portion of the training dataset that belongs to the respective segment. Finally, I have compared the performance (area under the ROC curve) of the two approaches on the portion of the test dataset that belongs to the segment.
Let’s take a glimpse at the final output:
Results of the simulation on 12 real datasets. Each row is a segment, which is identified by the combination of dataset, column, and value. [Image by Author]
In principle, to elect the winner, we could just look at the difference between “roc_general” and “roc_specialized”. However, in some cases, this difference may be due to chance. So, I have also calculated when the difference is statistically significant (see 本文详细介绍了如何判断两个 ROC 得分之间的差异是否显著)。
因此,我们可以在两个方面对 601 比较进行分类:一般模型是否优于专门模型,以及这种差异是否显著。这是结果:
601 比较的摘要。“一般>专业”是指一般模型的 ROC 曲线下面积比专业模型高,“专业>一般”则相反。“显著”/“不显著”表示这种差异是否显著。[图片由作者提供]
很容易看出,通用模型在 89%的情况下都优于专用模型(601 中的 454 + 83)。但是,如果我们坚持重要的案例,通用模型在 95%的情况下优于专用模型(87 次中的 83 次)。
出于好奇,让我们也将 87 个重要案例可视化在一个图中,专业化模型的 ROC 得分在 x 轴上,一般模型的 ROC 得分在 y 轴上。
比较:专业模型的 ROC 与一般模型的 ROC。仅包括显示显著差异的片段。[图片由作者提供]
对角线上方的所有点表示通用模型比专用模型表现更好的情况。
但是,怎么更好呢?
我们可以计算两个 ROC 分数之间的*均差。结果发现,在 87 个显著案例中,通用模型的 ROC *均比专用模型高 2.4%,这是很多!
结论
在本文中,我们比较了两种策略:使用在整个数据集上训练的通用模型与使用在数据集的不同部分上专门训练的许多模型。
我们已经看到没有令人信服的理由使用专门的模型,因为强大的算法(如基于树的模型)可以自然地处理不同的行为。此外,从维护工作、系统复杂性、培训时间、计算成本和存储成本的角度来看,使用专门的模型会带来一些实际的复杂性。
我们还在 12 个真实数据集上测试了这两种策略,总共有 601 个可能的片段。在这个实验中,通用模型在 89%的时间里表现优于专用模型。如果只看有统计学意义的病例,这个数字会上升到 95%,ROC 评分*均增加 2.4%。
你可以在 this GitHub repo 中找到本文使用的所有 Python 代码。
感谢您的阅读!我希望你喜欢这篇文章。如果你愿意, 在 Linkedin 上加我 !
缺少什么 CDP 身份解析?
原文:https://towardsdatascience.com/what-is-cdp-identity-resolution-missing-301edafd4d6a
提示:您的大部分客户数据
作者图片
如果你在一家数据驱动的公司或组织中工作,你可能会遇到这样的挑战:创建客户的单一视图,以便根据他们的数据更准确有效地与他们沟通。也许你试图在数据仓库中解决它,或者通过使用第三方客户数据*台(CDP)。您能自信地说您已经解决了身份解析问题,并对您的客户有了一个单一的看法吗?一旦你做到了,分析和激活你的客户数据就很容易了。如果你还没有到达那里,不要害怕——你并不孤单!让我们一起深入了解身份解析的基础,并找出为什么数据仓库是构建这一基础的最佳场所,以及为什么 CDP 不能让您了解全貌。
设身处地为你的顾客 Mia 想想。Mia 通过许多不同的方式与您的组织进行沟通。如果她对产品或服务有疑问,她可以致电客户支持。她可能会浏览你的网站或应用程序,并采取任何数量的行动。她可能会(也可能不会)打开你的营销或销售团队发来的电子邮件或短信。这些交互中的每一个都会在数据库中创建一个记录。身份解析是协调这些记录以创建 Mia 的单一视图的行为。如果你能准确地做到这一点,你就有办法把你对 Mia 的所有了解结合起来,这样你就能以一种对她和你的组织都更有价值的方式与她交流。如果你不能准确地做到这一点,你可能会把别人误认为 Mia,给她发送不相关的垃圾信息,或者向 Mia 透露一些你不应该透露的信息。在最好的情况下,这对您的客户来说是令人沮丧的,对您的组织来说是低效的。另一方面,如果你在一个受监管的行业运营,这甚至意味着治理或法律问题。无论哪种方式,你都要努力把这件事做好。
一些数据领导者选择将身份解析问题外包给他们的客户数据*台(CDP)合作伙伴。今天,我们看到许多创新的数据和分析领导者不再使用基于 CDP 的身份解析,而是将这一重要流程构建到他们的现代客户数据堆栈的核心。让我们看一下关于身份解析的几个关键主题,以便在您与 Mia 和您的其他客户更好地合作时,帮助您和您的团队取得成功:
- 缺少什么 CDP 身份解析
- 身份解析如何工作
- 选择匹配算法
- 底线:处理数据仓库中的身份解析
缺少什么 CDP 身份解析:您的大部分客户数据
CDP 是位于网站和应用程序之间的系统。总体思路是,您的前端工程师在您的所有酒店中部署一组通用的标签和 SDK 元素,然后 CDP 集中将这些事件和用户元数据转换为许多下游服务(如 Google Analytics、脸书、Adobe Analytics、Optimizely 等)的正确格式,而不是为下游服务实施每个 SDK。事件收集和跟踪是 CDP 的谋生之道,他们做得很好,但这些 CDP 公司最*除了事件跟踪之外,还大肆宣传他们的身份解析能力。
即使 CDP 可能完美地执行身份解析(他们不能),也有一个大问题:CDP 不能访问您已经在数据仓库或数据湖中收集的大多数客户数据。
如果您的整个身份识别策略是使用您的 CDP(上面的 x ),您将错过许多渠道的身份识别,在这些渠道中,您的客户在网站和应用程序活动之外进行互动。最好是在数据仓库(上面的 1000)中最终解决这个问题,所有的客户数据都在数据仓库中。—作者图片
让 CDP 成为您的身份解析策略的基础,类似于让您的 CRM 或电子邮件*台来解决这个问题。这些*台只能看到你的客户数据的一小部分。如果您采用这种方法,在一个或多个边缘*台中优先考虑身份解析,您将无法实现单一客户视图的目标—您解析了客户的 web 属性视图,但仍有很大一部分有价值的客户数据被锁定在数据仓库中未解析的记录中。如果您想要检查或激活与 CDP 中可用数据无关的客户数据,这可能会有问题。例如,如果您想在 Tableau 中构建一个收入仪表板,按客户类型显示收入,而您的 CDP 不能访问您公司的交易数据,那么基于 CDP 的身份解析就不会对您有很大帮助。任何身份解析策略都需要以客户数据的聚合地为基础。在现代客户数据栈中,那就是数据仓库。
在收集客户数据的边缘*台(如 CRMs 和 CDP)中,强大的数据验证非常重要,跨 web 属性的身份解析也很有价值,但所有这些都应该是构建在数据仓库之上的中央身份解析策略的输入。
身份解析的工作原理
问题是
上面介绍的例子中,Mia 解决了人们的身份解析问题。我们感兴趣的是解析所有与我们交流的人的身份。在这个例子中,“人”是我们试图为其解析身份的实体。您还可以选择为不同的实体解析身份。如果 Mia 为您销售的公司工作,您可能希望维护一个公司或帐户实体,并跨公司或帐户解析身份。可能存在管理多个账户或公司的母账户或母公司,它们可能是另一个实体。您可以将实体视为您的组织或业务用来构建和运营组织的名词(客户或用户、交易、产品、事件等)。对于身份解析,我们关心您的组织可能想要与之通信的实体——如用户或客户或潜在客户或人;账户或人群;父帐户或帐户组。为了建立身份解析的基础,我们需要回答一个看似显而易见的问题:如何定义这些实体?
还是用人吧。当你查看数据库中的记录时,你如何定义一个人?Mia 记录中的某些字段可能如下所示:
样本客户记录—按作者分类的图片
那么这里哪个字段定义了 Mia?或许是电子邮件?我们可以把它形式化为一个规则,说所有具有相同电子邮件地址的行代表同一个人。嗯,如果 Mia 随着时间的推移更改了她的电子邮件地址,会发生什么情况?或者 Mia 是否和她家里的某个人共用一个电子邮件地址?让我们来看看这组记录:
为身份解析准备的样本记录—按作者分类的图像
直觉上,看起来前两行代表同一个人,第三行不是。如果我们天真地决定仅使用电子邮件字段来解析身份,我们不会得出相同的结论,我们会认为第一行和第三行代表同一个人,而第二行代表不同的人。天真地使用一个列来解析身份似乎是一种有限的方法。如果你仔细观察,你会发现,如果我们选择“电话”领域,我们也会同样失败。
标识解析是使用匹配规则或算法来确定哪些记录代表同一实体的过程。
身份解析的第一个关键问题是选择规则或算法。
匹配的类型
当选择用于身份解析的规则或算法时,您可以在一个轴上从简单到复杂地考虑一系列选项。
匹配算法复杂性连续体—作者图片
在我们上面的例子中,使用一个像“电子邮件”或“电话”这样的字段会在左边。另一方面,你可以使用非常复杂的东西,比如用最先进的转换器(机器学习模型)进行分类。下面是 GPT-3 达芬奇(在撰写本文时接*最先进水*)在给出几个例子后确定两个记录是否代表同一个人:
GPT-3 达芬奇解决一个身份解析问题|鸣谢:OpenAI Playground OpenAI.com—作者提示的帐户和示例
在这两个极端之间,有许多方法非常适合您的数据生态系统。我们来看几个。
单字段匹配—如上所述
这种方法使用一个简单的规则,比如如果 email=email 跨越两个记录,它们代表同一个人。因此,实现该方法的一种方法可能如下所示:
- 收集所有包含客户记录的源表。
- 对将要匹配的字段中的源表进行重复数据删除。
- 编写一个查询,将所选匹配字段上的所有表联接起来。
- 决定从每个表中选择哪些附加字段
- 对于只存在于一个源表中的字段,您可以简单地选择它们
- 对于跨表存在的字段,将每个源中的每个字段与您想要的等级或优先级结合起来
复合字段匹配
在这里,我们开发了一个更严格的规则,即只有当几个字段在记录中匹配时才存在匹配。以下是数据仓库中组合键标识解析的关键步骤:
- 识别匹配关键字 : 第一步是确定您将使用哪些字段或列来确定哪些个体在源内和跨源是相同的个体。匹配关键字的典型例子可能是电子邮件地址和姓氏。
- 创建一个组合键:当您确定了匹配键后,您可以在每个数据源中将它们组合成一个组合键,从而将匹配键组合成一个字段。一种简单的重复数据删除方法是使用组合键来查找重复项,并按照从最*到最早的更新时间戳的顺序对重复项进行排序,但是在为每个记录分配源排序时有几种选择。将这些新字段写入新版本的源表。
- 聚合源表:下一步是将先前创建的表合并到一个源查找表中,该表包含所有源表中的所有客户记录。我们称之为查找表。
- 定义一个优先矩阵:现在我们将需要跨源解析身份,因为我们应该有一些跨源的重叠,其中有来自不同源的具有相同组合键的记录,其中源等级指示它是来自每个源的最新或最好的。在这里,我们可以定义一个优先矩阵,为每个匹配关键字和其他字段确定我们信任该字段的源的顺序。例如,数据源 A 可能是电子邮件字段的最佳来源,然后是数据源 C,最后是数据源 b,但是对于电话号码字段,顺序可能不同。
- 分配客户 ID : 最后一步是简单地获取具有相同匹配键的记录,并为匹配的客户记录组生成一个唯一的客户标识符。生成的每个客户 ID 都可以用于将客户源链接在一起。我们现在已经解决了跨源问题,为数据仓库中的每个唯一客户创建了一个黄金记录。这个过程是这样的:
组合键实体关系示例-作者图片
使用组合键匹配时,即使在给定的源中更新了底层的匹配字段,也要决定是否希望随着时间的推移持久化 id,这一点很重要。例如,如果某个 Salesforce 联系人在 Salesforce 中更改了其电子邮件地址,由于该联系人的 Salesforce ID 没有更改,您希望将此人视为数据仓库中的同一个人还是不同的人?我们已经看到它是根据业务规则以两种方式实现的。
概率匹配
这种方法使用概率对记录的相似程度进行评分。然后,根据您已经知道代表或不代表同一个人的一些示例的分数,为这个分数设置一个阈值。如果一对记录的得分达到或超过阈值,则认为它们代表同一个人;如果他们的得分低于,他们被认为是独一无二的。
在身份解析中有许多用于概率匹配的评分方法。以下是一些受欢迎的选择:
模糊字符串匹配
- Levenshtein 距离算法:大致基于匹配字符串所需的编辑次数
- 汉明距离算法:大致基于字符串中不同字符的数量,基于位置
- 仿射间隙距离算法:类似于汉明,但删除或插入被给予一点休息
- Jaro-Winkler 距离算法:字符串中相似位置出现的字符的大致数量,不包括乱序的字符
语音匹配
- 变音算法
- 桑迪克斯
级联确定性启发式匹配(级联规则)
级联试探法或级联规则是一种身份解析算法,您可以按照从最严格到最不严格的顺序应用不同的规则或子算法。
一个例子可能是这样的:
在电子邮件、姓氏、出生日期上完全匹配记录
对于所有不匹配的记录
- 尝试将它们与电子邮件中先前匹配的记录以及姓氏的前三个字母进行匹配
- 尝试将它们与电子邮件中的其他未匹配记录以及姓氏的前三个字母进行匹配
对于所有仍然不匹配的记录
- 尝试仅将它们与电子邮件地址上先前匹配的记录进行匹配
- 尝试仅将它们与电子邮件地址上的其他剩余不匹配记录进行匹配
级联规则示例-按作者排序的图像
高级机器学习匹配
虽然概率匹配可以被认为是一种基本类型的机器学习匹配,但是还有许多其他更高级的机器学习方法也可以用于身份解析。这是类固醇的概率匹配。想想聚类算法和深度神经网络给你的答案往往是无法解释的。这使得审计具有挑战性,并且对您的业务利益相关者来说就像一个黑盒。使用上面显示的 Transformer 示例,您可以有效地训练神经网络,以给出与人类相似的结果,只要人类标记训练数据。
考虑这种方法时的一个关键问题是,您的团队中是否有一些人,您可以信任他们来决定记录是否匹配?在您的组织中,有没有人是您如此信任以至于将组织的信誉置于危险境地的?如果这些人存在,你应该让他们不时地标记你的训练数据和审核推理管道。如果这些人不存在,这可能不是一个很好的解决方案。
级联混合启发式匹配(包括概率性)
级联混合试探法是一种身份解析算法,您可以按照从最严格到最不严格的顺序应用不同的规则或子算法,也可以包括概率匹配。
下面的示例使用了前面的级联确定性匹配示例,但增加了最终的概率匹配步骤:
在电子邮件、姓氏、出生日期上完全匹配记录
对于所有不匹配的记录,
- 尝试将它们与电子邮件中先前匹配的记录以及姓氏的前三个字母进行匹配
- 尝试将它们与电子邮件中的其他未匹配记录以及姓氏的前三个字母进行匹配
对于所有仍然不匹配的记录,
- 尝试仅将它们与电子邮件地址上先前匹配的记录进行匹配
- 尝试仅将它们与电子邮件地址上的其他剩余不匹配记录进行匹配
对于所有仍然不匹配的记录,
- 尝试将它们与之前在发音相似的电子邮件字符串上匹配的记录进行匹配(概率匹配)
- 尝试将它们与语音相似的电子邮件字符串中其他剩余的不匹配记录进行匹配(概率匹配)
级联混合启发式示例-按作者排序的图片
所以我们用这些例子映射的连续体看起来有点像这样:
各种匹配算法的复杂度分布—按作者分类的图片
其中一些的顺序还可以讨论,但是这对于我们在这里的讨论来说已经足够了。
选择匹配算法
假阳性和假阴性
在身份解析的上下文中,我们可以认为误报是不应该发生的匹配。例如,合并两个不是同一个人的数据。想象一下金融行业中的一个例子,误报可能意味着银行错误地告诉某人他们已经透支了他们的账户,或者在医疗保健行业中,将 HIPAA 敏感信息披露给了错误的患者。这对客户和您的公司来说可能是灾难性的。
另一方面,假阴性会遗漏本应匹配的对象。在客户服务领域,这可能代价高昂,因为客户可能无法获得重要信息。通常在销售和营销领域,这意味着一小部分收入留在桌面上,因为某个特定活动的目标受众较少。
除了高风险、关键客户服务使用案例之外,误报通常比漏报更糟糕。让我们想想我们的匹配算法和它们的误报倾向。
对于确定性选项,如单字段匹配、复合字段匹配和级联确定性试探法,假阳性率通常很低。该比率与您的数据质量密切相关,不会更差。如果您有关于您的客户的最新信息,并且在您的客户与您通信时进行了强有力的验证,确定性选项将使您的误报率最低,因此这通常是一个好方法。
对于概率选项,如模糊/语音字符串匹配、高级 ML 和级联混合试探法,假阳性率通常更高。这是因为速率取决于实施和阈值选择(除了数据质量之外)。在这里,您从与确定性选项相同的基线开始,即数据的质量和新鲜度,并且可能会由于对确定匹配的分数设置宽松的阈值而受到进一步的负面影响。典型地,概率选项给出了更高的误报率,并且对于该决策标准来说通常是更差的方法。
每种类型的匹配算法产生的误报的相对数量,大约-按作者排序的图片
费用
让我们先考虑一下成本。上面那个花哨的 GPT-3 匹配示例使用 OpenAI 的 API……一次调用花费了大约 0.01 美元。就其本身而言,一便士听起来可能不算多,但请考虑一个拥有 10 万名客户的数据库。假设我们有这 100,000 名客户的记录,这些记录来自三个不同的来源——product _ users、salesforce_contact 和 marketo_leads。使用 GPT-3 的身份解析的简单实现可能如下所示:
- 遍历 product_users 表中的每个客户记录(100,000)
- 对于每条记录,使用 GPT-3 匹配(100,000)将该记录与 salesforce_contact 表中的每条记录进行比较
- 遍历所有匹配和不匹配的记录(100,000–200,000)
- 对于每条记录,使用 GPT-3 匹配(100,000)将该记录与 marketo_leads 表中的每条记录进行比较
在每个 API 调用 0.01 美元的情况下,您的小型身份解析项目将获得 2 亿到 3 亿美元的投资。这还不包括每个源中的重复数据消除和合并。客户数量相对较少,只有 10 万人。哎哟。
有一些技术可以避免这些天真的穷举循环。一种流行的方法叫做阻塞。分块就是限制用于比较的数据块的大小,而不牺牲太多的准确性。一种简单的阻塞形式如下所示:
- 按照要用于匹配的字段对所有来源进行排序
- 从源 a 中选择一条记录,我们称之为记录 R
- 仅将该记录与源 B 和 C 中距离位置为+/- 1000 条记录的记录进行比较,如果记录 R 位于排序顺序中的适当位置,则它将在该源中。
封锁可以帮助大幅降低先进技术的成本,但与替代方案相比,它们仍然非常昂贵。
对于一些更简单的方法,您可以在数据仓库或数据湖中对数据使用原生 SQL 查询来完成所有或几乎所有的处理。云数据仓库解决方案之间存在非常良性的竞争,这降低了基于 SQL 的计算成本,并使基于 SQL 的身份解析方法从成本角度来看更具吸引力。
下面是不同匹配策略的成本比较的大概情况:
各种匹配算法的相对成本,取决于实现—图片由作者提供
就地处理与内存处理
除了使用 SQL 在数据仓库或数据湖中就地处理带来的成本优势之外,这还是一种非常数据治理和数据透明友好的身份解析管理方式。
数据治理
就地处理是一种治理友好的方法,因为使用这种方法,数据永远不会因为身份解析而离开数据仓库。当您使用数据仓库或数据湖的本机 SQL 引擎处理数据时,客户数据的副本存储在其他地方的可能性比我称之为内存中处理的可能性要小。数据仓库引擎也使用内存,但我们在这里使用内存中是指将数据从数据仓库或数据湖中取出,放入其他一些内存中并进行一些处理。
这方面的一个例子是在 Kubernetes 集群上运行一些 python 身份解析代码。假设您正在使用一种级联方法,并决定将当前级联步骤的结果存储在一个 blobstore(如 S3 或谷歌云存储桶)中,以供后续级联步骤参考。如果您不小心管理 blobstore,这可能是一个治理问题。
在 GDPR 和 CCPA,客户有权在请求删除后的 30-45 天内删除其数据。即使问题仅限于数据仓库中的数据,管理这些请求也是一项挑战。如果您在 S3 有可能包含客户数据的文件,那么当这些删除请求(有时称为“清理请求”)到来时,您也需要监视和搜索这些文件。一个好的原则是尽可能将数据保存在数据仓库或数据湖中,将管理这些请求的问题集中到一个地方。如果您确实有文件浮动的存储桶,一个好的做法是将存储桶的生存时间限制为 14 天或更短,以便在 30-45 天的时间限制内自动删除它们。
数据透明度
如果您将数据发送到他们的 SaaS *台进行处理,有一些第三方服务,如客户数据*台(CDP),可以为您进行身份解析。这种方法存在一些挑战,但我们经常听到的是,这可能是一个不透明的“黑盒”。组织通常无法了解身份解析是如何进行的,这可能会导致对流程缺乏信心、不可移植性和供应商锁定—即使您不再需要 CDP 提供的其他服务。
就地处理与内存处理—按作者分类的图片
将所有这些放在一起—选择匹配算法
在评估匹配算法选项时,对于我接触过的数百家组织中的大多数来说,有两个选择最为突出:
复合字段匹配和级联确定性启发式匹配
这两种方法都提供了较低的误报率和相对较低的成本,并且可以实现为使用 SQL 就地处理数据。这两者之间的权衡是实施的简单性和成本—复合字段匹配提供了更简单的实施和更低的成本,代价是通常更高的假阴性率(为活动定位留下了更多机会)。
底线:处理数据仓库中的身份解析
如今,业界围绕身份解析开展了大量工作。许多 CDP 提供商将在数据仓库之外提供具有黑盒实施的通用解决方案,这可能不适合您的业务。虽然您可以选择实现哪些匹配算法来进行身份解析,但是实现身份解析解决方案的位置更加明确。在现代客户数据堆栈中,身份解析是在数据仓库之上实现的。
现代客户数据堆栈—作者图片
最常见的是,我们看到这是在开源工具中实现的,如用于声明性 SQL 的 dbt,并通过 Airflow 进行编排,但也有许多工具可用于定义和安排您的身份解析解决方案。只要有可能,就将您的身份解析工作集中在聚集客户数据的数据仓库或数据湖上。这提供了最准确、最灵活和最有效的方法来确保身份解析考虑到您拥有的每个客户的所有数据。借助一个考虑到所有客户数据的强大身份解析策略,您可以在未来几年与客户进行更有效、更有价值的沟通。
什么是临床数据科学?(第一部分)
原文:https://towardsdatascience.com/what-is-clinical-data-science-part-1-ebe135efb462
对不断发展的临床数据科学领域的温和介绍
欧文·比尔德在 Unsplash 上的照片
在本文和随后的其他系列文章中,我将深入挖掘临床数据科学的本质。
本系列讨论的要点概述如下:
- 临床数据科学导论
- 临床数据科学及相关领域
- 临床数据的来源
- 监管约束
什么是临床数据科学
临床数据科学是一个专注于将数据科学应用于医疗保健的领域,目标是改善患者和医疗保健系统的整体福祉。牢记这一目标,临床数据科学家利用医疗保健系统每天生成的海量数据来解决与健康相关的挑战。
临床数据科学与生物医学数据科学、医疗保健分析和生物医学信息学等领域有着密切的联系,尽管有某些区别。在继续之前,我想用下面几行来指出这些领域之间的区别,以便更好地了解讨论的主要领域。
生物医学数据科学涉及对大规模生物数据集进行分析,以便理解和提出健康相关问题的解决方案。根据维基百科的说法,医疗保健分析是指医疗保健核心领域产生的数据,包括索赔和成本数据、制药和研究&开发数据、临床数据、患者行为&情感数据,可以进行的分析活动。换句话说,与临床数据科学相比,我们可以认为健康分析的范围更小。另一方面,生物医学信息学通过采用计算和传统方法,关注生物医学信息、数据和知识的最佳使用,以解决问题和做出决策。
在理解了这些领域的细微差别之后,现在让我们开始研究临床数据科学最重要的组成部分之一,电子健康记录(EHR)。与其他数据科学领域一样,数据就像推动任何分析操作引擎的燃料,没有它,我们就无法进行任何分析。在当今世界,我们被一系列可以记录临床数据的联网设备所包围。由于数据科学的整个领域都是基于操纵数据以获得洞察力,因此收集这些数据是数据科学的核心。
EHR 是参与患者护理的个人的所有信息的综合集合。这包括来自临床医生、实验室、放射成像、健康保险、社会人口统计、基因测序数据等的记录。另一个通常与 EHR 互换使用的术语是电子病历(EMR)。虽然 EHR 更复杂,但电子病历非常受限制,因为它主要集中在单一实践中的患者医疗和治疗历史。EMR 是临床医生办公室中传统纸质记录的电子版本。
一般来说,EHR 的信息来源可以归结为四点。谁记录了什么信息什么时候和为什么被记录下来。“谁”回答记录信息的医护人员。这可能是内科医生、药剂师、护士、实验室科学家、放射学家等。这些人员获取的数据的性质差异很大,因此信息的类型(即内容)由记录者决定。例如,临床医生可以记录关于患者的医疗和治疗历史的信息,药剂师记录关于药物治疗的信息,护士可以记录诸如体重和身高测量的临床观察数据,实验室科学家记录诸如实验室测试订单和实验室测试结果等实验室数据。“什么”回答了具体的时间戳,如门诊/医院就诊、入院时记录的数据以及出院时记录的数据。“为什么”回答了记录数据的原因。
值得注意的是,大量信息被整合到 EHR 系统中,因为它涵盖面很广。概括地说,我们可以根据记录数据的人员将这些数据分类成不同的形式。我们可以有药物治疗数据、临床观察数据、社会人口统计数据、实验室数据、包含账单信息的数据等。
原始临床数据保存在数据库中,无论是关系数据库还是非关系数据库,以便进行充分的记录(即存储)和简单的检索。根据他们的需求,一些管理临床数据库的组织有他们自己的方法(模型)来存储和访问他们的数据。因此,对现有模型的熟悉以及对如何在必要时设置自定义模型的深刻理解是临床数据科学家工作的重要组成部分。临床数据模型的示例包括集成生物学和床边的信息学(i2b2)、PCORnet(以患者为中心的结果研究网络)、观察健康数据科学和信息学(OHDSI,管理 OMOP[观察结果医疗合作]数据模型)、Sentinel 等。所有这些模型都有特定的目标,因此它们的架构在某些方面有所不同。将原始数据(来自源)转换成特定模型的过程被称为“提取、转换和加载”(ETL)过程。
作者图像:临床数据流的图像表示
临床数据一旦以被认为最合适的格式保存,无论是为了解决各种临床相关问题还是为了其他类型的研究,科学家们都会采用各种方法来获取数据。我们利用一组查询形式的标准从数据库中检索所需的数据,数据库管理系统(DBMS)随后从数据库中提取所请求的数据。一种查询语言,最常见的是结构化查询语言(SQL ),用于指定这组需求。然后,获得的数据可用于进一步的分析操作。
我们可以使用检索到的数据来回答关于整个数据库中个人特征的问题,并使用它来研究特征如何随时间变化。我们可以回答这样的问题:
- 被诊断为肥胖的患者*均体重是多少?
- 糖尿病视网膜病变在诊断为糖尿病的患者中的发病率是多少?
- 高血压患者有多大比例的高血压视网膜病变?
- 冠心病患者*均住院时间是多少?
如您所见,如果数据存在于数据库中,我们的查询可以回答许多问题。
在处理临床数据时,法规限制是一个主要问题。《1996 年联邦健康保险流通与责任法案》是相关机构为实现这一目标而实施的法律之一(HIPAA)
处理临床数据时的一个核心问题是法规约束。与医疗保健专业人员一样,临床数据科学家也应该遵循最佳实践,并建立标准来保证患者隐私得到认可和保护。1996 年联邦健康保险可携带性和责任法案(HIPAA)和欧盟通用数据保护条例是相关当局为实现这一目标而实施的一些法律。在 EHR,涉及患者数据和其他敏感数据的研究也受机构特定指南和管理机构(如机构审查委员会(IRB ))的管辖,部分原因是担心机构和医疗保健提供商的责任。因此,最常见的临床数据集是去身份化(即匿名化)和 HIPAA 限制的数据集。
去识别的临床数据集是观察患者数据的集合,这些数据已经去除了所有直接的患者健康信息(PHI)成分。IRB 许可对于访问去识别的临床数据集是不必要的。
具有 HIPAA 限制的临床数据集包括观察性患者信息,如入院、出院、服务、出生和死亡日期,以及城市、州、五位数或更多位数的邮政编码,以及以年、月、日或小时表示的年龄。未经患者同意或 HIPAA 豁免,HIPAA 限制的临床数据集可用于或共享研究、公共卫生或医疗保健业务。
结论
在这篇介绍性文章中,我解释了临床数据科学需要什么,以及它与其他密切相关的学科之间的差异。此外,我们还观察到了 EHR 在临床数据科学领域的重要性。为了解决与临床相关的问题,我们研究了产生临床数据的来源,以及如何在数据库中存储和检索这些数据。最后,我们检查了临床数据使用中的法规约束。在本系列的后续文章中,以临床数据科学为背景,重点将放在数据检索之后的“进一步分析操作”上。
参考
https://www.healthit.gov/buzz-blog/electronic-health-and-medical-records/emr-vs-ehr-difference https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3824370/ https://bmcmedinformdecismak.biomedcentral.com/articles/10.1186/s12911-019-0837-5
https://bmcmedethics.biomedcentral.com/articles/10.1186/s12910-017-0184-y
什么是 CLIP,为什么它会成为病毒?
原文:https://towardsdatascience.com/what-is-clip-and-why-is-it-becoming-viral-d3ba20c0068
当神经网络使用如此多的数据时,它就变得“通用”了
图一。数十亿张图片存储在互联网上的云端。将它们用于机器学习可能会非常有帮助。从https://unsplash.com/photos/M5tzZtFCOfs检索的图像。
预定义的类和类别:这是新的类在重新训练后只能由机器学习和神经网络进行分类的限制。一段时间以来,这种再培训和微调程序几乎已经成为“标准”——这是一种如此普遍的做法,以至于人们忘记了这仍然是一个有待解决的问题……至少在引入 CLIP 之前是如此。
那么,到底什么是剪辑?
CLIP(对比语言-图像预训练)是一种不同于视觉社区中常见实践的训练过程。在一段时间内,模型/训练方法的能力在跨越 1000 个类的 ImageNet 数据集上进行了基准测试。我们在 ImageNet 的子集上进行训练,并在不同的子集上进行测试,以测量模型的泛化能力。虽然简单明了,但这种约定忽略了互联网上的指数级图像集合及其可能带来的潜在好处;剪辑,确实表明,这是我们错过了很多。
图二。剪辑预训练方法。图片来自 https://arxiv.org/abs/2103.00020。
除了网上检索的大量图像,CLIP 还利用了文本,这在它提出的时候是一种有点非正统的设置。与使用图像编码器(例如,CNN)和分类器(例如,全连接网络)的传统模型相反,CLIP 联合训练图像编码器和文本编码器,以促进通过对比学习形成一对的编码器之间的紧密嵌入空间,如图 2 所示。如果你对对比学习不熟悉,请参考这篇文章这里。
图 3。剪辑分类管道。从图 1 中检索的图像。剪辑预训练方法。从https://arxiv.org/abs/2103.00020检索的图像。
成功的训练将导致文本和图像指向非常接*的同一物体。例如,句子“一张小狗的照片”的嵌入将在实际的狗图像附*。在对一组有限的类进行推理时(图 3。),我们可以简单的把类名放到一个句子里,找到最接*查询图像的文本嵌入。
因为 CLIP 是在极其庞大的 4 亿图文对上训练的,所以几乎成了“零拍”。你能想到的任何类几乎肯定是这个庞大数据集的一部分;你不需要任何再培训,任何课程,任何额外的数据。
我们如何使用剪辑?
尽管它很简单,但我们大多数人都无法访问硬件来处理 4 亿个图像-文本数据集,也无法访问数据集本身。但是由于其零触发能力,预训练检查点对于所有后续分类任务是通用的。 OpenAI 在他们的 GitHub 上公布了训练和检查站的代码:
https://github.com/openai/CLIP
只需遵循安装程序并运行图像编码器和文本编码器即可获得它们各自的功能。
超越简单的分类
图像之外的许多数据集也包含文本标签。因此,文本和图像的精确匹配可以用于其他领域。下面我们列出了 CLIP 的几个有趣的扩展:
音响化
图 4。将结果声音化。从https://arxiv.org/abs/2112.09726中检索到的图像。
Lin 等人试图通过 CLIP 将最接*的声音标签与视频本身进行匹配,来缓解视频编辑过程中在视频上叠加声音所耗费的时间。有关该方法的详细信息,请参见此处的。
夹子锻造
图 5。剪辑伪造结果。从https://arxiv.org/abs/2110.02624检索到的图像。
CLIP-Forge 将文本与形状渲染进行匹配,以使用未标记的 3D 对象数据集实现零射击 3D 形状生成。有关该方法的详细信息,请参见此处的和。
结束注释
CLIP 是 vision 社区中的一股清新之风,它鼓励我们重新思考互联网上越来越多的可用资源。毫无疑问,在不久的将来,更多新奇有趣的应用将会从这个优雅的想法中衍生出来。
感谢您坚持到现在🙏!我不断写关于计算机视觉和深度学习的文章,所以 订阅 到 Medium 通过我了解更多:)
余弦相似度是什么?如何在 Python 中比较文本和图像
机器学习的伟大工具
内森·杜姆劳在 Unsplash 上的照片
在构建机器学习应用程序时,计算相似性非常有用。如果您需要根据内容的相似程度对文档进行聚类,或者如果您正在构建一个模型来匹配图像,您将需要一种方法来确定哪些相似哪些不相似。使用数字数据很容易做到这一点,但是我们如何确定文档或图像的相似性呢?
余弦相似度是一种计算两个向量相似度的方法,取点积并除以每个向量的大小,如下图所示:
作者图片
使用 python,我们实际上可以将文本和图像转换成矢量,并应用同样的逻辑!Scikit-learn、PIL 和 Numpy 使这一过程更加简单。在本文中,我将通过几个例子展示如何使用余弦相似性,以及如何使用 python 计算余弦相似性。
与文本数据的余弦相似度
将文本转换为向量的过程在自然语言处理中非常常见。有许多不同的方法来矢量化文本,本文很好地解释了其中一些方法。每种方法都有优点和缺点,但它们本质上都实现了相同的结果:将文本转换成数字。
图片由 Edpresso 团队在 Educative.io 上拍摄
让我们在 python 中尝试一下——首先,我们需要加载我们的文本数据,并使用 sklearn 的文本计数矢量器来创建这个向量。对于这个例子,我想比较两个相似的段落,所以我将使用“蜜蜂”维基百科页面的第一段和蜜蜂电影的第一行。
作者 Jupyter 笔记本截图
现在我们已经得到了这些文本向量,我们可以使用一种叫做术语频率逆文档频率 (TFIDF)的计算方法来比较每个文本向量的相似性和差异。我知道这听起来很混乱,但这基本上是一种衡量某个单词相对于文档中其他所有单词的独特性的方法。这是在 0-1 的范围内计算的,最常用的词接* 0,最独特的词接* 1。这是我们的 bee 文档的样子:
一旦我们有了这个数据框架,我们只需要运行余弦相似度函数,我们就会得到结果
作者 Jupyter 笔记本截图
这意味着根据余弦相似度,蜜蜂电影的第一行与“蜜蜂”维基百科页面的第一段只有 19%的相似度。乍一看,这似乎很低,但是让我们将第一个文档与其他文档进行比较,看看有什么不同。
作者 Jupyter 笔记本截图
这两个文档只有 7.6%的相似性,这是有道理的,因为单词“Bee”在第三个文档中甚至没有出现过一次。
对于较大的文档,这一过程可以很容易地放大,从而减少计算中的统计误差。如果两个 50 个单词的文档有 50%相似,这可能是因为一半的单词是“the”、“to”、“a”等。但是,当你在 1000 字的文档中有 50%的相似性时,你可能在处理剽窃。余弦相似度对于分析文本非常有用-作为一名数据科学家,您可以选择什么%被视为太相似或不够相似,并查看该临界值如何影响您的结果。
还有其他确定文本相似性的方法,如 Jaccard 的索引,这很方便,因为它没有考虑重复的单词。
与图像的余弦相似度
你大概能猜到,这个过程和上面那个很像。幸运的是,我们不必做所有的 NLP 的东西,我们只需要上传图像,并将其转换为 RGB 值的数组。多亏了 PIL 和 Numpy,这个过程非常简单!对于这个例子,我将比较两张狗的图片,然后比较一只狗和一只青蛙,以显示得分差异。
这是我将要比较的两张狗的照片:
左图由布鲁诺塞尔韦拉在像素上拍摄,右图由凯文罗哈斯在像素上拍摄
下面是我用来上传图片并将其转换成矢量的代码:
为了向您展示计算余弦相似性的另一种方法,我将使用 Scipy 和 spatial.distance 函数。余弦距离和余弦相似度的计算几乎相同,只有一个微小的差异。John R. Ladd 的这篇文章很好地解释了这种差异以及它们与欧氏距离的关系,但对于这个例子,我们需要知道的是
作者图片
现在我们知道了这一点,我们可以使用 Scipy 计算余弦距离,然后将其转换为余弦相似度。我是这样做的:
作者 Jupyter 笔记本截图
这意味着这些狗的照片有 81%相似,这是有道理的,只要看着它们,你就可以知道它们有基本相同的主题和调色板。如果我们拍一张完全不同的照片,并与第一张狗的照片进行比较,会怎么样呢?大概是这样的:
左图由布鲁诺·塞尔韦拉在像素上拍摄,右图由格莱布·科罗夫科在像素上拍摄
作者 Jupyter 笔记本截图
正如所料,这两幅图像明显不如前两幅相似。30%仍然相对较高,但这可能是因为它们都在左上角有大面积的黑暗区域,以及一些小的颜色相似性。就像文本示例一样,您可以确定什么是“足够相似”的临界值,这使得余弦相似性非常适合聚类和其他排序方法。
也可以使用 HSL 值而不是 RGB,或者将图像转换为黑白,然后进行比较,这可能会产生更好的结果,具体取决于您正在处理的图像类型。无论你是想建立一个人脸检测算法,还是一个能从青蛙图像中准确分类狗图像的模型,余弦相似度都是一个方便的计算方法,可以真正改善你的结果!
结论
我希望这篇文章很好地介绍了余弦相似性以及使用它来比较数据的几种方法。作为数据科学家,我们有时会忘记数学的重要性,所以我相信学习一些理论并理解我们的代码如何以及为什么工作总是有好处的。希望你能从这些例子中得到一些概念,并制作出你自己的酷项目!
如果你有兴趣了解更多关于余弦相似性的知识,我强烈推荐这段 youtube 视频。或者如果你想了解更多关于自然语言过程的知识,你可以看看我的关于情感分析的文章。我也很乐意在未来讨论更多类似的主题,如果您有兴趣了解更多关于某个函数、方法或概念的信息,请告诉我。
感谢您的阅读!
想从我这里得到更多?
- 在 Medium 上跟随我
- 通过使用我的推荐链接注册媒体来支持我的写作
- 在 LinkedIn 和 Twitter 上与我联系
通过交叉验证评估和改进模型性能
原文:https://towardsdatascience.com/what-is-cross-validation-in-machine-learning-14d2a509d6a5
了解什么是交叉验证——构建通用模型的基本技术
图片作者。
交叉验证的概念直接来源于我上一篇文章中提到的过度拟合。
交叉验证是避免过度拟合和更好地理解预测模型性能的最有效技术之一。
当我写过度拟合时,我将我的数据分为训练集和测试集。训练集用于训练模型,测试集用于评估模型的性能。但是这种方法通常应该避免,并且不应该应用在真实世界的场景中。
这是因为如果我们长时间训练我们的模型,直到我们找到正确的配置,我们可能会在测试集中引起过度拟合。这个概念被称为数据泄露,是该领域最常见、最具影响力的问题之一。事实上,如果我们训练我们的模型在测试集上表现良好,那么它将只对那个测试集的有效。
我说的配置是什么意思?每个模型由一系列超参数表征。这里有一个定义
模型超参数是一种外部配置,其值无法从数据中估计。更改超参数会相应地更改模型在数据上的行为,从而提高或降低我们的性能。
例如,Sklearn 的决策树分类器树,有 max_depth 作为管理树深度的超参数。改变这个超参数会改变模型的性能,不管是好是坏。除非通过实验,否则我们无法预先知道 max_depth 的理想值。除了 max_depth,决策树还有很多其他的超参数。
当我们选择在数据集上使用的模型时,我们需要了解哪些是最好的超参数配置。该活动称为超参数调整。
一旦我们找到了最佳配置,您就可以将具有最佳配置的最佳模型带到“真实”世界,即由模型从未见过的数据组成的测试集。
为了在不直接测试测试集的情况下测试配置,我们引入第三组数据,称为验证集。
总的流程是这样的:
- 我们在训练集上训练模型
- 我们在验证集上测试当前配置的性能
- 当且仅当我们对验证集的性能满意时,我们才在测试集上测试。
但是,为什么要增加一套额外的性能评估来使我们的生活变得复杂呢?为什么不使用经典的训练测试集分割?
原因很简单,但却极其重要。
机器学习是一个迭代的过程。
我所说的迭代是指一个模型可以而且必须用不同的配置评估几次,以便我们理解哪一个是性能最好的条件。验证集允许我们测试不同的配置,并为我们的场景选择最佳的配置,而没有过度拟合的风险。
但是有一个问题。通过将我们的数据集分成三部分,我们也减少了可用于我们训练模型的例子数量。此外,由于通常的分割比例为 50–30–20,因此模型结果可能随机取决于数据在不同集合中的分布情况。
交叉验证通过从等式中移除验证集并保留模型可用于学习的示例数量来解决这个问题。
什么是交叉验证?
交叉验证是机器学习中最重要的概念之一。这是因为它允许我们创建能够泛化的模型— 也就是说,即使对不属于训练集的数据也能够创建一致的预测。
能够概括的模型是有用的、强大的模型。
交叉验证意味着将我们的训练数据分成不同的部分,并在这些部分的子集上测试我们的模型。测试集继续用于最终评估,而模型性能在交叉验证生成的部分上进行评估。这种方法被称为 K 倍交叉验证,稍后我们将看到更详细的内容。
下面是一张图,总结了到目前为止的这句谚语。
来源:Sklearn (BSD 许可证)
k 倍交叉验证
交叉验证可以用不同的方式完成,每种方法适用于不同的场景。在本文中,我们将研究 K 倍交叉验证,这是目前最流行的交叉验证技术。其他流行的变体是分层交叉验证和基于组的交叉验证。
训练集被分成 K 个部分(我们称之为“部分”),模型在 k-1 部分进行训练。剩余部分用于评估模型。
这一切都发生在所谓的交叉验证循环中。这里有一张来自 Scikit-learn.org 的图片清楚地展示了这个概念
来源:Sklearn (BSD 许可证)
在通过每次分割进行交互后,我们将得到最终的*均表现结果。这增加了性能的有效性,因为在训练数据集的每个部分上训练了“新”模型。然后,我们将得到一个总结了模型在许多验证步骤中的性能的最终分数——与查看单次迭代的性能相比,这是一个非常可靠的方法!
让我们来分解这个过程:
- 随机化数据集的每一行
- 将数据集分成 k 个部分
- 对于每组
1。创建测试部分
2。将剩余部分用于培训
3。对模型进行训练,并在上述设备
4 上对其进行评估。拯救表演 - 通过在流程结束时取*均分数来评估整体绩效
k 的值通常是 5 或 10,但是斯特奇斯法则可以用来建立更精确的分裂数
拆分数量= 1 + log2(N)
其中 N 是样本总数。
交叉验证循环
我刚才提到了交叉验证循环。让我们更深入地了解这个基本但经常被年轻分析师忽视的概念。
做交叉验证,本身就已经很有用了。但在某些情况下,有必要更进一步,测试新的想法和假设,以进一步改善你的模型。
所有这些都必须在交叉验证循环中完成,这是上面提到的流程的第 3 点。
每个实验都必须在交叉验证循环中进行。
由于交叉验证允许我们多次训练和测试模型,并在最后以*均值收集整体性能,我们需要在交叉验证循环中插入所有改变模型行为的逻辑。如果做不到这一点,就无法衡量我们假设的影响。
现在让我们看一些例子。
在 Python 中实现 K-Fold 交叉验证
这里有一个在 Python 中应用交叉验证的模板。我们将使用 Sklearn 为分类任务生成虚拟数据集,并使用准确性和 ROC-AUC 分数来评估我们的模型。
图片作者。
结论
交叉验证是进行机器学习时要考虑的第一步,也是最重要的一步。
永远记住:如果我们想做特性工程,添加逻辑或测试其他假设——a总是先用 KFold 分割数据,然后在交叉验证循环中应用这些逻辑。
如果我们有一个良好的交叉验证框架,其中的验证数据代表现实和训练数据,那么我们就可以创建良好的、高度通用的机器学习模型。
很高兴你来了。希望您会发现这篇文章很有用,并在您的代码库中实现它的片段。
如果你想支持我的内容创作活动,请随时关注我下面的推荐链接,并加入 Medium 的会员计划。我将收到你投资的一部分,你将能够以无缝的方式访问 Medium 的大量数据科学文章。
https://medium.com/@theDrewDag/membership
什么是以数据为中心的 AI 工程?
原文:https://towardsdatascience.com/what-is-data-centric-ai-engineering-d29b3468062e
重塑 MLOps 加速 AI 民主化
人工智能/人工智能的过去十年是历史性的。随着机器感知的突破性里程碑和 AlphaGo 的梦幻般胜利,AGI(人工通用智能)和 SSL(自我监督学习)也上路了。普华永道预测,到 2030 年,人工智能将为全球经济贡献15.7 万亿美元。IDC 预测,到 2024 年,人工智能研究和应用投资将达到 5000 亿美元。
人工智能可以显著提高组织和个人的性能和可扩展性。人工智能的应用和民主化势在必行。运营 ML 自动化已经成为在生产中服务 AI 模型的良好实践。开源 MLflow 和 Kubeflow 和亚马逊 SageMaker 是 ML 运营的领先工具。
MLOps 够吗?
根据 wiki 的说法,MLOps 是一套在生产中可靠有效地部署和维护 ML 模型的实践。MLOps 够吗?让我们重温一下人工智能的两个独特特征:
AI/ML 从 2016 年开始快速进化。我们对正在进行的人工智能里程碑感到兴奋,例如 DeepMind 的 AlphaFold 和 OpenAI 的 GPT-3 和 DALL E 2。此外,扬·斯托伊察指出,超大规模计算需求的增长速度几乎是著名的摩尔定律的 17.5 倍。这种快速增长要求人工智能运营成为可扩展的开放*台,这为运营自动化和人工智能应用更新带来了挑战。
此外,AI 应用吸引眼球。越来越多的企业开始采用人工智能来提高运营效率和实现数字化转型。但速度和能力成为许多组织在人工智能转型中的瓶颈。
因此 MLOps 对于 ML 部署和服务操作可能是足够的。协调从系统到数据生成、特性、模型、价值和业务的 ML 生命周期变得很困难。
人工智能民主化的挑战
将人工智能民主化对于推进人工智能并使其造福全人类至关重要。这项工作似乎是一项长期的任务,因为有五个已知的挑战。
- 第一个挑战是如何分享新的算法和框架,并使它们在其他用例中可用。有两个细节:如何工程化这些算法,快速规模化;以及如何通过开源、商业 API 或其他方式提供专有建模。
- AI 民主化也意味着数据民主化,然后如何在治理下共享数据(包括数据安全和隐私)变得和模型共享一样重要。
- 第三个是人工智能伦理,一个负责任的人工智能的考虑因素的广泛集合,包括安全、安保、人类关注和环境考虑。
- 人工智能最*的胜利与释放其全部潜力相比相形见绌。下一个飞跃期待 AGI,自我监督学习和 RL。每个里程碑都具有挑战性和意义。
- 最后,随着数据和模型的指数级增长,人工智能基础设施和*台对许多用户来说已经变得非常昂贵,尽管云解决方案可以缓解这一点。
什么是以数据为中心的 AI?为什么重要?
数据为食品的 AI/ML。以数据为中心的人工智能是一个转折点,同时面临以模型为中心的挑战。以数据为中心的人工智能意味着以数据为中心的思维模式,有三种数据实践:数据优先实践、智能数据架构和数据合规性。数据优先实践优先考虑数据质量、数据可用性和数据可观察性。数据质量可以用以下七个指标来衡量:
- 准确性:定义的准确数据
- 一致性:引用和管道中定义相同的数据
- 完整性:没有缺失的记录或值
- 元数据:语义和可观察性的丰富数据
- 及时性:最新的数据和及时的服务反馈
- 相关性:满足要求的相关数据
- 有效性:数据大小现在很重要
好的数据比只有大数据更重要。以数据为中心的人工智能源于 ML 建模和操作的数据质量。数据可用性表示 AI 实验、建模、训练和服务的数据就绪性 SLA(服务水*协议)。它在数据质量上不同于数据及时性,即保持数据本身(数据值)是最新的。云计算人员可能认为处理人工智能的数据可用性很简单。但是,如果你训练过一个超级大的模型,或者为一个大规模的模型提供特色服务,你就会改变主意。与处理 S3 可用性相比,这是一个不同的世界。数据可观察性探索数据属性和模式,并提供对数据谱系、度量、统计和状态的可见性,然后可用于调试系统。
数据合规确保数据被正确用于 AI。它可以根据法规解决安全和隐私问题。可能对联邦学习有借鉴意义。
以数据为中心的人工智能解释(作者)
引入以数据为中心的人工智能工程
人工智能工程是一个开发和实践领域,旨在提高、操作和扩大人工智能/人工智能在生产中的规模。人工智能工程可以解决人工智能转型和人工智能民主化中的上述挑战。它是人工智能研究和应用之间的桥梁。从数据收集和特征工程到建模、培训、验证、服务和监控,它超越了 ML 运营自动化的 MLOps。它可以系统地解决数据质量、模型优化、用户有效性,以及工程学科的数据和模型治理。
智能数据架构可以用智能增强 AI 工程。在数据科学和模型训练之前,我们首先需要收集数据,进行预处理,并正确存储。AI/ML 过程包括许多步骤,从数据收集到特征工程、建模、训练、验证和服务。所有这些都依赖于数据*台和架构。高效的数据管道和有效的数据栈是 AI/ML 成功的关键。这需要一个用于数据工程的智能现代数据堆栈。
有了上面的阐述,以数据为中心的 AI 工程就是以数据为中心的 AI 的工程框架。它可以系统地编排人工智能的生命周期。并且可以用三个工程级别来描述:studio(或 IDE)、低代码/无代码、智能嵌入式。每一级都可以分为子级。例如,亚马逊 SageMaker Studio 支持笔记本/IDE、数据牧马人(用于功能工程)、自动驾驶(AutoML 功能)和 JumpStart(预构建的解决方案和预训练的模型)。Amazon SageMaker Canvas 就是一个低代码或者无代码 ML 服务的例子。从亚马逊 EML (Elastic ML)演变而来的 SageMaker 是一个领先的 MLOps 框架,但 AI 工程的旅程才刚刚开始。智能嵌入式是一个完全集成和管理的人工智能解决方案,其中智能是数据的一部分,无需明确的培训和服务。这可能意味着开箱即用的智能体验。所有这些级别都需要可靠、高效和可扩展,尽管它们可能处于不同的操作自动化程度,并且关注不同的用户。
TL;速度三角形定位法(dead reckoning)
以数据为中心的人工智能工程是人工智能转型的有效解决方案,可以推动人工智能民主化。针对 AI 成熟度模型在组织中开发和应用人工智能也是一个很好的实践。
想了解更多以数据为中心的人工智能工程吗?关注我或在 LinkedIn 上联系 【陆晖】胡 。
额外资源
- 吴恩达,MLOps:从以模型为中心到以数据为中心的人工智能:https://www . deep learning . AI/WP-content/uploads/2021/06/MLOps-From-Model-centric-to-Data-centric-AI . pdf
- 使用 TensorFlow 和 Amazon SageMaker 创建、训练和部署万亿字节数据的十亿参数语言模型:https://AWS . Amazon . com/blogs/machine-learning/create-train-and-deploy-a-billion-parameter-language-model-on-terabytes-of-data with-tensor flow-and-Amazon-SageMaker/
什么是数据泄露,在机器学习中如何避免?
虽然机器学习中使用的指标可以在测试集上显示出令人印象深刻的结果,但除非彻底理解,否则它们有时会产生误导。
在执行了机器学习的所有任务和工作流程之后,例如数据收集、数据可视化、数据处理、数据操纵和训练,您还需要执行一项有趣的任务,即分析您的模型并评估它们的性能。为了做到这一点,您将整个数据分为两部分,其中第一部分通常包括大多数样本,用于训练机器学习模型,而剩余的样本用于测试它们在测试数据或模型之前未见过的数据上的表现如何。
在执行训练并等待 ML 模型在分类和均方误差、*均绝对误差和均方根误差以及回归情况下的 R *方误差的情况下,在准确度、精确度、召回率和 F1 分数等各种指标上产生良好的结果之后,您决定部署在测试集中表现最佳的机器学习模型。但是,应该注意,在实时部署模型之前,应该了解一个重要的机制。虽然 ML 模型在测试数据的情况下表现非常令人印象深刻,但如果在部署前没有理解或检查数据泄漏的现象,那么实时部署它有时会对该算法创造的价值有害。
什么是数据泄露?
丹·卡尔森在 Unsplash 上拍摄的照片
在开始我们将要训练一个机器学习模型的时候,隐含的是我们把数据分成 3 部分,即训练、交叉验证、和测试集。在训练模型并让算法学习最重要的参数以获得良好性能之后,我们使用交叉验证来调整这些超参数,以确保我们为这些调整的超参数获得更好的性能。最后,我们用我们的测试集来看看模型在测试集上的表现如何,并且监控它的表现。
在做这些步骤之前,人们有时会对整个数据集使用 one hot encoding 或特征标准化,而不是仅将其应用于训练集。通过将这些过程应用于整个数据集,存在信息泄漏,因为模型正在学习测试集具有与训练数据相关联的一些信息,因此,由于它实际上在训练集上被很好地训练的事实,它也可以在测试集上很好地执行。通过这种方式,我们往往会在测试集上获得良好的性能,这使我们相信我们做得很好,并为我们实时部署模型提供积极的指导。然而,该模型在部署时实际上可能会表现得更差。因此,在部署后监控ML 模型的预测以处理这种现象也很重要。
尽管如此,当相同的模型被实时部署时,我们往往会看到性能下降,因为存在许多不确定性,并且没有关于整个数据*均值的先验信息,这是测试阶段数据泄漏的结果。因此,在我们能够实际实时部署一个更高质量的模型之前,在机器学习中考虑这种现象并进一步理解它是很重要的。
克服数据泄漏的方法
有多种方法可以防止数据泄露,我们将在接下来的几个段落中详细介绍。
k 折叠交叉验证
消除数据泄漏的最好方法之一是执行 k 重交叉验证,其中整体数据被分成k 个部分。分成 k 个部分后,我们把每个部分作为交叉验证数据,剩下的部分作为训练数据。在测量了每组 k 个零件的性能后,我们用*均值来表示模型的整体性能。
丢弃重复项
用于训练和交叉验证的数据也可能包含重复的值。这意味着我们有相同的行,这有时会影响我们对模型性能的夸大的描述。例如,假设我们将所有数据分为训练集和测试集。当我们有重复的行时,有可能其中一个重复的行在定型数据中,而另一个在测试集中。在这种情况下,由于该模型已经使用此行的训练数据进行了训练,并且它也存在于测试集中,因此我们在测试集中获得了提高的性能,但这实际上并不正确。因此,最好检查数据集是否包含任何重复值。
移除与输出或目标变量高度相关的特征
当我们执行机器学习分析时,通常可以假设给定特征与目标或输出标签的相关性越高,ML 模型的预测就越好。虽然这可能是真的,并且在开发模型时应该加以考虑,但是经常会有我们不能实时获得该特性的情况。
考虑一个银行交易和一个 ML 模型的例子,该模型被部署来监控和检查给定客户是否将超过每天的交易限额。在这种情况下,如果我们有一个特性,如总体日常开支,它可以与输出特性直接相关。当该模型被实时部署时,如果我们不知道客户在该时刻的日常支出是多少,该模型就没有最重要的信息来决定客户是否会在特定的一天超出交易限额。在这种情况下,我们主要依靠特征“日常费用”来预测客户是否会超出交易限额。因此,“日常费用”这一特征很好地表明了客户是否超出了交易限额。此功能导致数据泄漏,可以通过删除它来避免。
在时间序列预测的情况下执行时间排序
当实际执行诸如随机分裂的方法时,我们随机置换或重新排列行,以便我们能够将数据分成训练集和测试集。在时间序列预测的情况下,由于目标变量(输出变量)对当前输入值的时间依赖性以及之前的时间步长,不应执行该方法。如果我们随机分割数据,ML 模型已经存在未来信息,可以做出最佳预测。因此,我们将在所考虑的指标(,例如精度)方面获得非常好的性能。因此,在时间序列预测的情况下,我们必须小心,在时间上而不是随机地分割数据,以避免数据泄漏。
结论
总而言之,我们已经看到了这样的情况,即泄漏数据的存在可能导致我们相信模型在测试集上表现得相当好,而这远非事实。因此,可以采取措施,通过定期检查我们是采用整个数据的*均值还是仅采用训练数据来执行数据标准化来确保没有数据泄漏。对于一键编码也必须进行类似的程序,这样可以确保测试数据没有数据泄漏。在本文中,我们还研究了减少数据泄漏的方法。感谢您花时间阅读这篇文章。
以下是您联系我或查看我作品的方式。谢了。
GitHub: 苏哈斯·马达利(Suhas Maddali)(github.com)
LinkedIn: (1)苏哈斯·马达利,东北大学,数据科学| LinkedIn
培养基: 苏哈斯·马达利—培养基
什么是数据素养?
原文:https://towardsdatascience.com/what-is-data-literacy-9b5c3032216f
…为什么它很重要?
数据素养是一个很难界定的术语。它可以用来包含太多的东西,因此它可能会失去意义——如果它是所有与数据相关的东西,那么这个术语就没有什么帮助了。
在 canva 上创建的图形
我认为定义数据素养的最佳方式是从素养的定义开始,然后将其应用于数据世界。这有助于我理解这个话题,因为一般读写能力是我更熟悉的一个概念。艾伯塔教育部将识字定义为:
“… 在日常生活的各个方面,运用语言获取、构建和交流意义的能力、信心和意愿。【1】
在本文中,我将解构这句话,并将它的每一部分应用于数据,以便对“什么是数据素养?”这个问题给出一个全面的答案
1.处理数据的能力
能够在学校或组织中处理数据(至少)需要什么?
首先,数据必须存在。这可能像 Excel 电子表格一样简单,也可能像包含数百个数据库的基于云的数据湖一样复杂。不管来源是什么,它一定是以某种方式收集或生成的。
理想情况下,还会有围绕数据存储和检索的治理。这使得数据是可靠的,并且最终用户在处理数据时有信心。
在 canva 上创建的图形
因此,在一个人成为组织中的“数据素养”之前,这三个要素是必需的:数据收集/生成、数据存储系统和数据治理。回到我们的比喻,这类似于说我们需要首先有一种语言和有组织的系统(如字典)来存储我们的语言,然后人们才能识字。
2.愿意与数据打交道
在成为“数据专家”之前,他们必须看到执行数据分析的价值。如果对他们来说没有价值,那么他们为什么愿意走这条学习之路呢?
对我来说,有很多方法可以鼓励与数据的互动。我心目中最大的两个是 1。展示数据分析的可能性;2 .传达拥有数据进行决策的切实好处。
当我看到用数据讲述故事的酷酷的 Tableau 仪表盘时,它激励我努力提高自己的技能,这样我就能创造出更有用、更有趣的视觉效果。它也可以挑战我对数据和数据软件的先入之见。
再举一个例子:如果你从事金融行业,我告诉你,利用你现有的数据创建一个更好的预测方法可以让你的底线提高 __%,你为什么不愿意试一试呢?听到成功案例和有积极成果的案例研究肯定会增加整个组织使用数据的意愿。
3.处理数据的信心
在 canva 上创建的图形
大多数技能都需要训练和实践来培养自信,数据技能也不例外。为了让组织中的员工掌握数据知识,必须提供培训和学习机会。
我喜欢在我现在的公司 Stanley Black & Decker,我有足够的机会学习和实践新的软件和概念。这无疑增加了我在日常工作中处理数据的信心(和能力)。
我不指望任何人不练习和向他人学习就能成为有文化的人。事情不是这样的——就像睡在你的数学课本上不会通过渗透或其他方式增加你的数学知识。
4.从数据中获取和构建意义
好了,现在我们开始说正经事了。
从数据中构建意义是一个巨大的飞跃——就像从知道西班牙语词汇到能够构建一个连贯的句子。这比拥有您需要的数据、工具和技能更进了一步。这需要真正理解数据及其含义。
为了在数据中找到意义,你需要专业知识来了解数字告诉你什么(以及期望值是什么)。通常,这包括与公司中“最接*”数据的人会面。虽然他们可能不知道如何建立一个仪表板,但他们可以告诉你数据的含义和它应该是什么样子。然后,你必须利用这些知识来指导你分析过程的每一步,以确保你得到一个有意义的结果。
5.从数据中传达意义
在 canva 上创建的图形
在数据扫盲之旅的最后一步,您能够将数字“告诉”您的内容告诉其他人。这包括了解您的受众,并能够与报告和仪表板简洁地交流。
与我们的识字概念相比,最后一步是从写下一个有意义的句子到对另一个人说一个句子,记住他们的理解能力(即,他们是否和你说同样的俚语,你是否给了他们足够的语境来理解你的观点,等等)。)
同样,如果是给高管和销售经理的,你会设计出不同的报告。为了传达你的结果,你必须考虑他们已经知道什么和他们想知道什么(以及他们可能想要多少细节)。
从数据分析实践中传达有意义的结果是让企业走出去并真正做出改变的原因。这是推动持续改进的动力,也是数据分析/数据科学团队对公司有价值的原因。
信息图表摘要
为了使我的交流更简洁,这里有一张信息图,是这篇文章的摘要!我希望这对您的组织或您个人的学习有所帮助。
在 canva 上创建的图形
什么是数据可观测性,为什么需要它?
原文:https://towardsdatascience.com/what-is-data-observability-and-why-do-you-need-it-87463f054bea
数据可观察性意味着什么,为什么它至关重要,以及为什么组织和数据团队需要关注它。
塞巴斯蒂安·斯坦尼斯在 Unsplash 上的照片
介绍
几年前,大多数组织使用简单的数据管道,并采用数据基础设施来处理从少数内部来源提取的少量运营数据和几乎不变的数据。如今,这种说法已不再相同— 组织现在拥有越来越多的数据用例,许多数据产品现在依赖于数十甚至数百个内部或外部数据源。一方面,现代组织采用大数据基础架构和先进技术来满足这些不断增长的需求。
另一方面,数据堆栈日益复杂,生成和收集的数据速度快、种类多、数量大,为 未知的未知 和更复杂的问题铺*了道路,例如模式更改、意外漂移、数据质量差、数据停机、重复数据等等。众多的数据管道、各种数据存储选项和一系列企业应用程序也增加了数据管理的复杂性。
如今,负责构建、维护和操作数据基础设施和系统的数据/分析工程师和业务主管往往不堪重负。通常情况下,他们会尽可能保持数据系统的正常运行。不幸的是,没有什么是完美的,大量的数据不可能总是 100%没有错误。无论数据团队在云上投入了多少资金,或者分析仪表板有多先进,如果不可靠的数据被摄取、转换和向下游推送,所有计划都是徒劳的。
此外,现代数据管道在某种程度上是互连的,并且不直观。因此,内部和外部数据可能会出现故障、不一致、不准确、丢失、突然改变,并最终影响其他相关数据资产的正确性。当发生这种情况时,数据和分析团队需要能够深入研究,找出问题所在,以及如何解决数据问题。
但是,如果没有对整个数据堆栈和生命周期的整体和全面的洞察力和可见性,实现这一点将成为一场噩梦。这就是数据可观察性派上用场的地方,它是数据团队和组织确保数据质量以及日常业务运营中有效可靠的数据流所需的宝贵工具。
在研究和阅读了一些资料后,我决定分享我对数据可观察性的看法,为什么数据可观察性很重要,为什么组织和数据团队需要关注数据可观察性。我的目标受众包括希望在新的一年实现其数据驱动愿景并成为数据驱动型企业的数据团队和组织。对于对数据感兴趣的软件工程师来说,这也是一本好书。
什么是数据可观测性?
可观察性主要用于软件系统和工程,但在数据领域也很重要。软件工程师使用 AppDynamics、DataDog 和 NewRelic 等工具监控其应用程序的运行状况,数据团队也需要这样做。
Forbes 将数据可观察性定义为一套工具,允许数据和分析团队跟踪企业数据系统的健康状况,在出现问题时识别、排查和修复问题。换句话说,数据可观察性指的是组织通过跟踪、监控和故障排除事件来保持其数据系统持续脉动的能力,以最大限度地减少并最终防止数据问题、停机时间并提高数据质量。
数据可观察性由一系列技术和活动组成,这些技术和活动共同允许数据和分析团队跟踪与数据相关的故障路径,逆流而上并确定质量、基础架构、处理和计算级别的故障。最终,这将帮助数据团队衡量数据的有效使用,同时帮助他们了解企业数据生命周期的每个阶段都发生了什么。
在某种程度上,我希望将数据可观察性想象为一种状态,在这种状态下,数据专业人员(即数据科学家、工程师、架构师、高管、分析工程师等)可以快速识别和解决数据问题,进行实验以改进和扩展数据系统,优化数据管道以满足业务需求和策略。
与可观察性的三大支柱一样,数据可观察性包括以下五大支柱— 每个支柱都提供了一系列问题的答案,使数据团队能够在组合和一致监控时获得数据健康和管道的整体视图。
- 所有的数据都到了吗?是最新的吗?省略/包含哪些上游数据?最后一次提取/生成数据是什么时候?数据准时到达了吗?
- 卷:数据都到了吗?数据表是否完整?
- 分发:数据被投递到哪里?数据有多完整和有用?数据可靠、可信、准确且一致吗?数据是如何转换的?数据值是否在可接受的范围内?
- 血统:给定数据资产的下游吸收者和上游来源是什么?谁在生成数据?谁将使用这些数据做出商业决策?下游的摄入者在哪个阶段使用数据?
- 模式:数据的格式是否正确?数据模式改变了吗?谁更改了数据?
在下一节中,我将简要概述数据可观察性的重要性,以及为什么每个数据团队都应该将它整合到他们的数据堆栈和策略中。
数据可观察性的重要性
“你不监控的,你不能测量的,你不能测量的,你不能管理或改进的”是我在起草这篇文章时创造的一个短语,并就采用数据可观察性驱动的文化的重要性进行了头脑风暴。
这就是说,如果没有对数据管道和基础设施的可见性,数据和分析团队将只是盲目飞行(即,他们无法完全了解管道的健康状况和/或了解数据输入和输出之间发生了什么)。对于数据团队和组织来说,无法了解数据生命周期中发生的事情会带来一些不利因素。
随着组织变得更加以数据为导向,他们的数据团队也变得更加庞大和专业化。在这种情况下,复杂的数据管道和系统更有可能由于团队成员的不充分协调、沟通错误或并发变更而中断。通常,数据工程师不会从事创收活动,因为他们总是在解决一个数据或管道问题,或者试图理解为什么业务仪表板看起来不正常。我知道这有时会让人头疼。
从侵蚀客户信心、信任和体验到收入损失、团队士气下降、生产力和合规风险,当数据管道中断时,组织会损失惨重。随着企业数据系统变得多层和更加复杂,数据可观察性回答了管道破裂背后的“为什么”问题,并通过避免不必要的过度配置和优化数据基础架构,帮助组织加快创新、提高效率并最终降低 IT 成本。
此外,数据可观察性有助于数据和分析团队通过保持数据分布、量、值、元数据、沿袭和新鲜度的持续脉动来监控数据的健康状况。当与警报和监控的有效实施相结合时,数据可观察性可以使组织及其数据团队快速识别和恢复由数据质量问题引起的计划外停机,并增加数据产品的采用。
此外,数据可观察性提供了数据管道的端到端视图,并通过对管道应用可观察性和开发的最佳原则来消除数据停机时间(,即使用分类、警报和自动监控来识别和评估可发现性和数据质量问题)。修复数据问题或损坏的数据管道就像大海捞针。当数据团队不知道数据管道中出现了问题或数据被更改,更不用说它是如何发生的,他们更有可能损害实验、分析和利益相关者信任的完整性。
最后,我认为组织和数据团队需要数据的可观察性,以确保数据质量、准确性、价值和可信度不会受到损害,数据管道不会中断。如果没有强大的数据可观察性方法,数据和分析团队将仍然难以使用迭代和敏捷的方法来确保一致的数据和管道可靠性,或者执行有针对性的根本原因分析,从而快速有效地解决问题。
结论
数据可观察性是成为数据驱动的关键。随着数据可观察性技术的进步,曾经是“”理念的数据治理策略和数据质量框架现在可以付诸实施了。在很大程度上,我非常同意蒙特卡洛数据公司的这篇文章,它指出数据可观测性是数据可靠性的先驱之一,也是数据工程的下一个前沿。
当数据和分析团队测量和监控数据管道时,他们可以控制静态数据和动态数据。团队还减少了解决或调试数据管道问题的时间,将更多时间用于重要的数据计划。最终,这将增加整个组织对数据产品的采用和信任(),即更多的员工成为数据消费者,知道如何以及在哪里访问他们工作所需的数据。企业和首席执行官们也学会停止事后分析,变得更加依赖数据来做出商业决策。
什么是“图像超分辨率”,我们为什么需要它?
原文:https://towardsdatascience.com/what-is-image-super-resolution-and-why-do-we-need-it-9c3bd9dc233e
对该领域、其应用和当前问题的介绍
你有没有见过旧的单色图片(通常是灰度)有几个人工制品,然后被彩色化,看起来好像是最*用现代相机拍摄的?这是图像恢复的一个例子,它可以更一般地定义为在给定损坏图像的情况下检索基础高质量原始图像的过程。
图像恢复的例子,包括着色和去除诸如噪声和模糊之类的伪影。图片来自维基媒体
许多因素会影响图像的质量,最常见的是次优的拍摄条件(例如,由于运动模糊、照明条件差)、镜头属性(例如,噪声、模糊、镜头眩光)和后处理伪影(例如,有损压缩方案,即以不可逆的方式执行压缩从而导致信息丢失的方法)。
另一个影响图像质量的因素是分辨率。更具体地说,低分辨率(LR)图像包含少量表示感兴趣对象的像素,这使得很难分辨出细节。这可能是因为图像本身很小,或者是因为物体远离相机,从而导致它在图像中占据很小的区域。超分辨率(SR)是人工智能(AI)的一个分支,旨在解决这个问题,由此给定的 LR 图像可以被放大以检索具有更高分辨率的图像,从而获得更可辨别的细节,然后可以用于下游任务,如对象分类、人脸识别等。LR 图像的来源包括可能输出低质量图像的摄像机,如移动电话和监控摄像机。
一个模因强调了一个讽刺,即能够捕捉数十亿公里外的行星的高质量图像,而在地球上拍摄照片,而距离相机仅几米远的物体几乎无法分辨。图片作者,灵感来自对脸书的讽刺。由 NASA 在 Unsplash 拍摄的海王星照片,由 Vitaliy Izonin 在 Pexels 拍摄的持枪者照片。
在本文的其余部分,将讨论以下内容:
- 那么为什么不使用更好的相机呢?
- 不是已经有了可以放大图像的工具吗?
- 基于深度学习的图像超分辨率
- 我们如何检查超分辨率方法是否有效?
- 如何获得用于训练和评估超分辨率方法的低分辨率图像?
- 超分辨率的应用
- 道德考量
- 可以做些什么来消除这些担忧?
- 结论
那么为什么不用更好的相机呢?
在这一点上,你可能会问自己“为什么我们不使用质量更好的相机,而不是去开发可以给我们同样结果的算法?”
这是一个很好的观点,但确实存在实际的考虑。例如,虽然现代移动电话相机确实捕捉相当好质量的图像,但是它们仍然产生几个缺陷,主要是由于需要使用足够紧凑以适合电话而不使其太笨重的镜头和图像传感器,同时还相对便宜。
就闭路电视而言,不难理解的是,摄像机的成本通常会随着质量的提高而增加,而质量更高的镜头也需要更多的存储空间(除非使用激进的压缩方案来显著降低图像质量,从而使高质量摄像机的使用变得毫无意义),从而导致额外的成本。这对于需要几十个、几百个、甚至几千个摄像机的建筑尤其重要;在这种规模下,任何成本都会成倍增加,并可能导致这种系统缺乏吸引力,以至于不能完全安装,从而危及安全性。
最后——也许是最明显的——已经存在大量用低质量相机拍摄的图像,这些图像可能包含重要信息。因此,至少,我们需要一种方法来提高这些现有图像的质量。
不是已经有可以放大图像的工具了吗?
你也可能会问自己“但是我们不能用基本的图像编辑软件程序,比如微软画图,来增加图像的尺寸吗”?
事实上,诸如双线性插值和双三次插值之类的插值方法通常是许多应用程序中的首选工具,包括通常使用双线性插值的 web 浏览器。然而,这些算法相对简单,速度很快,从而满足了用户对软件程序快速反应的要求,但却不能产生高保真图像。事实上,合成的图像往往包含大量的像素,实际上并没有使它更容易辨别细节。
提高分辨率意味着增加像素数量,这也意味着需要以某种方式推断缺失的信息。这可能是插值等简单技术无法产生令人满意的结果的主要原因,因为它们没有利用从查看其他类似样本中获得的任何知识来学习如何推断缺失的数据并创建高质量的图像,而这正是 SR 方法的设计目的。
超分辨率任务概述:给定低分辨率图像,超分辨率网络的任务是提高图像质量,以产生超分辨率图像。这些图像可以描绘任何东西,从建筑物到人脸,到卫星图像等等。为了进行比较,展示了原始的高分辨率图像,上面的照片由索拉萨克在 Unsplash 拍摄,下面的照片由拉尔斯·博·尼尔森在 Unsplash 拍摄。作者创作的低分辨率和超分辨率图像。
新信息的产生也意味着 SR 任务是一个重要的不适定问题,因为有多种方法来超分辨图像。换句话说,对于任何给定的 LR 图像,可能存在几个似是而非的图像。在存在上述进一步降低图像质量的其他因素的情况下,该问题变得更加复杂,其中传感器噪声、模糊和压缩是最常见的。尽管如此,大多数方法只输出单一的超分辨率图像,尽管最*的一系列研究也在探索为给定的 LR 图像生成多个似是而非的图像的方法。
超分辨率的问题:许多高分辨率图像可以降采样为单个低分辨率图像 …
基于深度学习的图像超分辨率
研究人员长期以来一直在开发允许使用各种技术(例如基于稀疏表示的方法)来检索底层高质量图像的方法。然而,可以说是深度学习和卷积神经网络的出现带来了最重大的飞跃,开创性的工作是董等人在 2014 年提出的超分辨率卷积神经网络(SRCNN) 。从那以后,人们不仅在神经网络的设计和结构方面,而且在用于训练和评估这些网络的数据方面做了大量的工作。
各种 SR 方法产生的结果的例子,包括简单的双三次插值和被认为是第一个基于深度卷积神经网络的 SRCNN 方法。图片来源于王等 (2018)提出 ESRGAN 的论文。
众所周知,基于深度学习的方法需要大量的数据来进行稳健的训练,通常需要在监督设置中的地面实况,以便模型知道最终目标是什么。在 SR 的情况下,这意味着具有原始高分辨率图像和低分辨率图像;然而,在现实世界中很难获得这样的图像对——通常一张照片要么是高分辨率的,要么是低分辨率的,并且它们不能同时被捕获。
虽然可以使用不同的相机设置或不同的相机来捕捉两个图像(一个捕捉高质量的图像,另一个捕捉低质量的图像),但实际上这并不是一项容易的任务,因为图像理想地需要具有相同的内容。这避免了增加额外的复杂性,这可能使网络更难训练。例如,一个捕获和另一个捕获之间的场景可能存在差异,例如移动的车辆或鸟,而图像不太可能彼此完全对齐。
我们如何检验超分辨率方法是否有用?
训练和评估 SR 方法时的图像质量通常使用客观度量来判断,例如峰值信噪比(PSNR) 和结构相似性指数(SSIM) ,它们被称为全参考图像质量评估(FR-IQA)度量。
虽然对这些方法的详细解释超出了本文的范围,但足以说明的是,FR-IQA 算法通常试图通过计算高分辨率图像中的像素与待评估图像中的对应像素之间的差异来产生与人类主观质量感知相关的质量评级,并因此假设图像完全对准;因此,即使是垂直或水*方向上最小的偏移也可能造成严重破坏,并导致指标显示所评估的图像质量差,即使它实际上与高分辨率图像相同。这就是为什么要比较的图像彼此完全对齐很重要的主要原因。
虽然确实存在仅使用待评估的图像(即,不将其与高分辨率对应物进行比较)来预测主观质量的无参考(NR-IQA)度量,例如 BRISQUE 和 NIQE ,但是这些度量往往是不可微分的,因此不能在神经网络的训练期间使用。然而,在已开发的 SR 方法的评估过程中,这种度量被更频繁地使用。
如何获得用于训练和评估超分辨率方法的低分辨率图像?
为了解决上述问题,通常使用退化模型对高分辨率图像进行综合退化,定义要应用于数据集中的图像的伪影的类型和大小,以便产生相应的合成低分辨率图像。由于降质图像是直接从高分辨率图像中获取的,因此这些图像对被完美地对齐,并且可以结合 FR-IQA 度量用于训练和评估。
然而,这样的图像可能并不真正代表真实世界的图像,因此在合成图像上训练的模型在真实世界的应用中往往会崩溃。因此,也有一些努力,例如“零拍摄”SR (ZSSR) 方法,该方法试图在自监督设置中避免使用低/高分辨率图像对,其利用的观察结果是图像往往在不同的尺度和位置具有重复出现的模式。这允许仅在低分辨率图像上训练算法。然而,有人认为不是所有的图像都符合这种假设(例如,图像具有大量不同的内容,或者相反,具有大量一致的区域),导致这种类型的方法不适用于这种图像。
超分辨率的应用
超分辨率方法可以应用于几乎任何类型的图像内容,无论是自然场景、建筑物,甚至是动画图像。为这些内容类型设计的超分辨率方法通常更多地针对娱乐行业,例如通过改善图像质量来改善最终用户体验,从而使观看体验更加愉悦。
还存在更多针对安全和执法的应用,例如人脸图像的超分辨率、车辆牌照和多光谱卫星图像等。
9 幅 SkySat 图像的真实多重曝光序列的超分辨率;具有不同曝光的原始低分辨率图像显示在顶部,使用五种不同方法的结果显示在中间一行。最后一行显示了对图像特定区域的详细观察。图片来自 Nguyen 等人(2022)
到目前为止,上述方法已经被假定为一次对一幅图像进行操作,因此它们被称为单幅图像 SR (SISR)方法。然而,也可以对视频序列中的图像(在这里它们被称为“帧”)执行 SR,除了空间信息(即图像内容)之外,还允许利用时间信息(即跨时间的信息)。当与仅使用单个图像相比时,附加信息应该能够实现更好的结果。
总之,给定一个低质量的图像——无论来源如何——可以设计和实现能够提高图像质量的方法,以便产生更清晰的细节和更有用的信息。
道德考量
在大多数应用中,需要考虑伦理问题。这与图像超分辨率特别相关,因为整个图像基本上是由机器生成的。
如果没有约束,超分辨率模型理论上可以生成与原始图像毫无关系的图像。虽然这听起来有点牵强,但这实际上是一些方法的问题,尤其是那些基于生成对抗网络(GANs) 的方法。
基于 GAN 的方法通常被训练为通过使用鉴别器来优先生成永久令人满意的图像,该鉴别器被训练为区分“真实”图像和“虚假”图像。它的目的是驱动发生器(负责创建图像的网络的一部分)产生更逼真的图像,这些图像能够欺骗鉴别器,使其认为这些图像是真实的照片。然而,这可能以损失一些对原始图像内容的保真度为代价,尤其是如果要超分辨率的图像质量特别差的话。
这一特性实际上是某些应用程序所需要的,比如使用语义分割遮罩或文本描述的图像合成,就像流行的 DALLE 2 系统所做的那样。
然而,有些应用需要更多的关注,例如安全和执法。当超分辨率图像或视频包含识别犯罪者的潜在有用信息时,产生原始图像中不存在的信息是不可接受的。例如,汽车牌照的超分辨率不能产生实际上不在犯罪现场附*的车辆的信息。
当涉及到人的时候,这一点可能更加重要。具体来说,算法不能输出不在场景中的人的面部。在这些情况下,至关重要的是,所采用的任何方法都必须能够保留主体的身份,以确保嫌疑人被绳之以法,同时避免身份的改变,以免错误的人被错误地指控和定罪——而实际的罪犯仍然逍遥法外。
法院的程序也是如此,一个案件可能会因使用超分辨率图像而受到损害,在这种情况下,可以推断出无关的信息。即使正确的罪犯受到审判,任何对不利于罪犯的证据的怀疑都可能导致他们被释放。因此,这些方法的稳健性至关重要,不仅可以确保公*审判,还可以避免指控错误的人,避免根据错误信息进行调查的风险。
超分辨率图像出现的方式——以及以可能不好看为代价创建忠实于原始内容的图像,或者创建看起来令人愉快但可能包含与原始图像中描述的不同细节的图像之间的*衡——在很大程度上由所谓的损失函数控制。
损失函数本质上是在神经网络被训练时评估它们的输出,并且一次可以使用多个。事实上,损失函数的选择是 GANs 问题的一部分,其中一个函数倾向于测量生成图像的真实性。用更专业的术语来说,假设 GAN 本质上重新创建了概率分布,那么损失函数确定了生成的分布和正在建模的真实数据的分布之间的差异。
然而,这种损失函数不能单独使用,这是由于神经网络可能采取简单的方式,生成看起来很好但与原始图像没有相似之处的图像。因此,也采用测量像素级差异的函数(典型地使用均方误差(MSE) 和密切相关的峰值信噪比(PSNR) ),试图约束模型的输出至少与原始图像相似。
然后由模型的设计者决定如何使用损失项的权重,这取决于预期的应用。因此,仍然可能的是,更多的重要性被给予在感觉上令人愉快的内容,而不是对原始内容的忠实再现。
大多数超分辨率方法采用至少一个基于像素的损失,以防止明显的属性,如皮肤或头发颜色发生剧烈变化。然而,眼睛颜色等较小的细节很容易在退化过程中丢失,然后由超分辨率算法来确定要使用的颜色。因此,这将受到训练集中受试者眼睛颜色分布的很大影响。
然而,也有人研究设计超分辨率模型,不仅处理低分辨率图像,而且利用图像中描绘的人的属性。这有可能通过消除在没有任何信息的情况下需要使用的一些猜测工作来提高超分辨率算法的鲁棒性。
执法人员已经要求目击者描述一些特征,比如这个人的性别、年龄、有无胡须等等。这些照片有时被用来制作法医素描,这些素描可以向公众传播,这样任何认出素描中描绘的嫌疑人的人都可以提供导致逮捕的信息。
人们还创造了一些方法,通过将草图与现实世界的照片进行比较,自动确定草图中描绘的对象的身份,这些方法适用于各种草图类型,例如使用软件程序获得的草图和由法医艺术家手绘的用于现实世界调查的草图。
这些属性也可以用作辅助信息,以帮助指导超分辨率模型产生更能代表实际高分辨率图像的图像。
但是如果提供了错误的属性会发生什么呢?至少在于等人 (2018) 的作品中,这种效果通常相当微妙,其中属性的变化更多地是为了微调最终结果。也就是说,性别等一些属性会导致明显不同的结果,如图于等 (2018) 图 4 所示。因此,必须小心确保不提供错误的属性,或者至少记住属性可能是不正确的,因此在解释超分辨率图像时最终结果可能受到负面影响。
然而,调整属性的能力允许创建多个图像(与仅生成一个图像的大多数超分辨率方法相反),因此当确切属性未知或不确定时,通过产生多个似是而非的例子而不是一个图像,实际上可以允许更大的鲁棒性。
用来训练模型的数据呢?对超分辨率模型的性能有什么影响?众所周知,基于深度学习的方法需要大量的数据来避免诸如 过度拟合 之类的影响,其中模型调整其参数的方式使得它在训练数据上工作得非常好,但在对看不见的数据进行测试时却崩溃了。因此,用于训练这些模型的数据越多,这种风险就越低。
过度拟合的示例,训练错误显示为蓝色,验证集错误显示为红色。这两个误差都是训练周期数的函数。当验证集的误差开始增加,而训练集的误差继续减小时,模型很可能过度拟合。图片由维基共享资源上的大可~commonswiki 拍摄。
另一个问题是如何选择各种 超参数 。超参数控制着网络的训练方式,因此仔细调整它们非常重要。具体来说,数据集中的数据通常分为三个部分:一个训练集、一个验证集和一个测试集。
顾名思义,训练集用于训练模型,而测试集仅用于评估模型在从未见过的数据上的性能。这有助于确定模型的通用性,以及是否出现过拟合等现象。
同时,验证集包含用于在训练时评估模型性能的数据。因此,在训练模型时,它可以被视为代表一个测试集。应该在这个集合上调整参数,以防止性能偏向于训练集合中的数据(这可能不会使模型具有通用性),并且还防止性能根据测试数据进行调整(测试数据为我们提供了关于看不见的数据的真实世界性能的指示,因此它仅用于评估目的是至关重要的;否则,实际应用程序的性能可能会比预期的差)。
另一个主要问题涉及数据中各种属性和组的表示(在数量方面)的任何差异,通常称为 类别不*衡 。在人脸超分辨率的情况下,这些属性的范围可以从每个对象的图像数量到属于特定人口统计组的对象数量。例如,许多数据集往往比任何其他人口统计数据包含更多的“白人”,这可能导致模型在这些图像上表现良好,但在代表性不足的类上表现不佳。
虽然在超分辨率领域中没有很好地研究这些效应(特别是在客观性能度量方面),但是当更详细地研究超分辨率图像时,可以进行一些观察。如上所述,眼睛颜色的潜在差异就是这样一种观察结果。还观察到,如果在包含涂有口红的许多女性对象的数据集上训练该模型,并且该模型确定该对象是女性,则男性的嘴唇可能看起来有口红。受试者的年龄也可能受到训练数据集中年轻受试者与年长受试者的比例的影响;例如,如果数据集主要包含年轻的主题,模型可能会使主题看起来更年轻(这不一定总是坏事……)。
在其他领域中也进行了工作来抵消由给定数据集中的类别不*衡引起的问题。例如, 数据扩充 常被用作人为增加数据使用量的手段。此外,用于确定模型稳健性的函数也可以进行调整,以适应任何类别失衡。“*衡数据集”如 FairFace 和野外*衡脸(BFW) ,其中人口统计组由相同数量的受试者代表,也已经被创建,因此可以帮助确保任何由阶级代表差异引起的偏见几乎被消除。
可以做些什么来消除这些担忧呢?
有几种方法可以用来避免为特别敏感的应用程序生成错误信息。前一节已经给出了一些可能的解决方案,但现在还将考虑一些其他方法。
也许防止产生错误数据的最明显的方法之一是在这样的应用中避免使用 GANs。虽然它们确实倾向于产生看起来相当真实的图像,但是如果其中的信息不正确,它们将毫无用处。因此,更传统的基于 CNN 的方法可能更合适。然而,如果在这种架构中使用 感知损失 ,则必须小心,这也旨在使图像看起来更有吸引力。
另一个相当明显的方法是使用专门为手头的任务训练和开发的模型。例如,如果任务是超分辨率人脸图像,那么使用在普通场景上训练的模型不能期望产生可靠的结果。
如上所述,损失/损失函数的选择也很关键。应该使用测量像素级差异的损失来帮助确保超分辨率结果在纹理、结构和颜色方面与原始高分辨率图像中的内容有很大的相似性。
可以考虑的另一种方法是使用更大量的训练数据。众所周知,基于深度学习的模型往往需要大量的数据来避免诸如过拟合之类的问题,但使用更多样化的数据也可以帮助网络学习更多的可能性,如如何超解析图像,并在对其训练集之外的图像(即,对其没有遇到的图像)进行操作时使其更加鲁棒。
如前所述,最*的一系列研究正在探索开发超分辨率方法的途径,这些方法能够预测看似合理的超分辨率图像的空间,因为信息的丢失实际上意味着多个图像可能会被降级以产生相同的低质量图像。这意味着,不是像通常那样只生成一个图像,而是可以输出多个图像。图像之间的差异将降低仅基于一个潜在错误结果得出任何结论的风险。
能够使用补充信息的模型也可以用于产生具有不同细节的一系列图像(而不仅仅是单个图像),例如在上面提到的于等人 (2018) 的工作中,其可以使用描述人脸的属性来实现人脸超分辨率。
属性不需要仅仅与图像内容相关,但是它们也可以描述图像中的退化。例如,已经设计了一些方法来将这些信息整合到现有的基于深度学习的方法中,以帮助指导超分辨率模型逆转影响图像的退化,并产生更好的图像。
退化信息可以输入到现有的基于深度学习的图像超分辨率模型中,例如使用元注意块
最后,可以考虑原始图像的质量水*。例如,如果质量太低(如上所述,可以使用 IQA 度量主观地或客观地确定),则图像可以被直接丢弃。然而,考虑到要处理的数据量可能有限,丢弃有限的可用数据可能是不可取的。在这种情况下,图像仍然可能是超分辨率的,但需要记住的是,结果可能不完全可信。
结论
我希望这篇文章让您了解了超分辨率领域,这个领域已经变得非常广阔,有大量的方法可以应用于几乎任何类型的低质量图像,如人脸图像、汽车牌照、卫星图像和旧照片,有许多应用程序,包括安全和执法等重要领域。
然而,软件无线电还不是一个已经解决的问题(与你在电影和电视剧中所相信的相反),仍然有许多挑战需要解决。在下一篇文章的中,我将更深入地研究现代软件无线电方法中使用的各种技术,以及剩余的挑战和未来工作的方向。
你对这篇文章有什么想法吗?欢迎直接在 LinkedIn 上留言、评论或给我发消息!
此外,确保 关注 me,以确保您在未来文章发表时得到通知。
作者目前是马耳他大学https://www.um.edu.mt/*的博士后研究员Deep-FIR项目,该项目是与* Ascent 软件 合作完成的,由马耳他科学委员会&技术(MCST)资助,代表科学基金会&技术,通过 FUSION: R &
什么是可解释的机器学习?
原文:https://towardsdatascience.com/what-is-interpretable-machine-learning-2d217b62185a
IML 介绍——旨在使机器学习模型为人类所理解的领域
(用 DALLE Mini 创建)
我们应该永远相信一个表现良好的模型吗?
一个模特可能会拒绝你的抵押贷款申请或者诊断出你患有癌症。这些决定是有后果的。后果严重。即使他们是正确的,我们也会期待一个解释。
人类可以给一个。人类能够告诉你,你的收入太低,或者一群细胞是恶性的。为了从一个模型中得到类似的解释,我们把目光投向了的可解释机器学习领域。
我们探索这个领域,了解它的目标是什么。我们讨论提供解释的两种主要方法:
- 本质上可解释的模型
- 模型不可知的方法
我们还讨论不太突出的方法:
- 因果模型
- 反事实的解释
- 对立的例子
- 非不可知方法
最后,我们谈谈从技术解释到人性化解释需要做些什么。
什么是 IML?
可解释的机器学习是一个研究领域。它旨在建立人类可以理解的机器学习模型。这包括开发:
- 解释黑盒模型的方法
- 建模方法用于构建易于解释的模型
向不太懂技术的观众解释机器学习的方法也属于 IML 的领域。
IML 的目标是建立人类能够理解的模型
理解一个模型意味着理解个体预测是如何做出的。我们称这些为本地解释。有了这些,我们想知道每个单独的模型特征是如何对预测做出贡献的。
这也意味着理解一个模型作为一个整体是如何工作的。也就是理解模型用来做预测的趋势。我们称这些为全球诠释。
本质上可解释的模型
第一种方法是构建内在可解释的模型。这些是人类能够理解的简单模型。这不需要额外的方法。我们只需要查看模型的参数或模型摘要。这些将告诉我们预测是如何做出的,模型捕捉到了什么趋势。
内在可解释=无需额外方法即可理解
例如,我们在图 1 中有一个决策树。它被训练来预测某人是否会在汽车贷款上违约(是)或不违约(否)。这是一个内在可解释的模型。
为了理解为什么会做出某种预测,我们可以沿着树往下看。观察不同的划分,我们可以看到模型捕捉到的趋势——较低的年龄、较低的收入和学生身份都与较高的违约风险相关。
图 1:决策树的例子(来源:作者)
其他例子有线性和逻辑回归。为了理解这些模型是如何工作的,我们可以看看赋予每个模型特征的参数值。参数*特征值给出了该特征对预测的贡献。参数的符号和大小告诉我们特征和目标变量之间的关系。
使用这些模型会让我们远离机器学习。我们转向一种更加统计的思维模式来构建模型。建立一个内在可解释的模型需要更多的思考。我们需要在功能工程上投入更多的时间,选择一小组不相关的功能。好处是有一个易于解释的简单模型。
有些问题不能用简单的模型来解决。对于像图像识别这样的任务,我们转向更难解释的或黑盒模型。我们可以在图 2 中看到一些这样的例子。
图 2:本质上可解释的模型与黑盒模型(来源:作者)
黑盒模型太复杂,人类无法直接理解。为了理解随机森林,我们需要同时理解所有的决策树。类似地,神经网络会有太多的参数,无法一次理解。我们需要额外的方法来窥探黑盒。
模型不可知的方法
这就把我们带到了模型不可知的方法。这些方法包括 PDP、ICE 图、ALE 图、SHAP、LIME 和 Friedman 的 h-statistic。这些方法可以解释任何模型。该算法实际上被视为一个黑盒,可以替换为任何其他模型。
使用代理模型和置换,模型不可知的方法可以解释任何模型
一种方法是使用代理模型。 这些方法从使用原始模型开始进行预测。然后,我们根据这些预测训练另一个模型(即代理模型)。也就是说,我们使用原始模型的预测,而不是目标变量。通过这种方式,代理模型了解了用于进行预测的原始模型的特征。
重要的是代理模型本质上是可解释的。比如我们上面讨论的模型之一。这允许我们通过直接查看代理模型来解释原始模型。
另一种方法是使用排列。这涉及到更改/置换模型特征。我们使用该模型对这些置换特征进行预测。然后我们可以理解特征值的变化如何导致预测的变化。
排列方法的一个好例子是PDP 和 ICE Plots 。你可以在图 3 中看到其中一个。具体来说,冰图由所有单独的线给出。在我们的数据集中,每个观察值都有一行。为了创建每条线,我们置换一个特征的值并记录结果预测。我们这样做的同时保持其他特性的值不变。粗黄线是 PDP 。这是所有单独线条的*均值。
图 3: PDP 和 ICE 图示例(来源:作者)
我们可以看到,*均而言,预测随着特征而降低。观察冰图,有些观察结果并不符合这一趋势。这表明我们的数据中存在潜在的相互作用。
PDP 和 ICE 图是全球解释方法的一个例子。我们可以用它们来理解模型捕捉到的趋势。它们不能用来理解个人预测是如何做出的。
沙普利值可以。如图 4 所示,每个模型特征都有一个值。它们告诉我们,当与*均预测E[f(x)】相比时,每个特征如何对预测 f(x) 做出贡献。
图 Shapley 值的例子(来源:作者)
过去,Shapley 值是用排列来*似的。最*一种叫做 SHAP 的方法显著提高了这些*似的速度。它使用排列和代理模型的组合。单个观察值的特征值被置换。然后根据这些值训练线性回归模型。该模型的权重给出了*似的 Shapley 值。
通常,这种方法被称为本地代理模型。我们根据个别预测而不是所有预测的排列来训练代理模型。石灰是另一种使用这种方法的方法。
其他 IML 方法
内在可解释模型和模型不可知方法是 IML 的主要方法。其他一些方法包括因果模型、反事实、解释和对立例子。事实上,任何旨在理解模型如何做出预测的方法都属于 IML 的范畴。已经为特定模型开发了许多方法。我们称这些为非不可知方法。
IML 包括任何用于理解模型如何做出预测的方法
因果模型
机器学习只关心相关性。一个模型可以使用原产国来预测患皮肤癌的几率。然而,真正的原因是每个国家不同程度的日照。我们称原产地为日照量的代表。
在构建因果模型时,我们的目标是只使用因果关系。我们不想包含任何代表真正原因的模型特征。要做到这一点,我们需要依赖领域知识,并在特征选择上投入更多的精力。
建立因果模型并不意味着模型更容易解释。这意味着任何解释都将忠实于现实。特征对预测的贡献将接*事件的真正原因。你给出的任何解释也会更有说服力。
你为什么诊断我得了皮肤癌?
“因为你来自南非”,并不是一个令人信服的理由。
反事实解释
反事实的解释可以被认为是一种排列方法。它们依赖于特征值的排列。重要的是,他们专注于寻找改变预测的特征值。例如,我们想知道从阴性诊断到阳性诊断需要什么。
更具体地说,反事实解释是我们为了改变预测而需要对特征值做出的最小改变。对于连续目标变量,变化将是预定义的百分比或数量。
反事实解释对于回答相反的问题很有用。客户将他们的当前位置与潜在的未来位置进行比较的问题。例如,在贷款被拒绝后,他们可以问:
“我怎么才能被接受?”
对于反事实的解释,我们可以回答:
“你需要增加 200 美元的月收入”或者“你需要减少 10000 美元的现有债务”。
对抗性例子
对立的例子是导致非直觉预测的观察。如果人类看了这些数据,他们会做出不同的预测。
寻找对立的例子类似于反事实的解释。不同的是,我们想要改变特征值来有意欺骗模型。我们仍在试图理解这个模型是如何工作的,但不是提供解释。我们希望找到模型中的弱点,并避免对抗性攻击。
对立的例子在像图像识别这样的应用中很常见。有可能创建对人类来说看起来完全正常的图像,但是导致不正确的预测。
例如,谷歌的研究人员展示了引入一层噪声如何改变图像识别模型的预测。看着图 5 ,你可以看到,对于人类来说,这层噪声甚至是不可察觉的。然而,这个模型现在预测熊猫是一只长臂猿。
图 5:对抗的例子(来源: I. Goodfellow 等。艾尔。)
非不可知方法
已经为特定的黑盒模型开发了许多方法。对于基于树的方法,我们可以计算每个特征的分裂次数。对于神经网络,我们有像像素分解和深度提升这样的方法。
尽管 SHAP 被认为是模型不可知的,但它也有非不可知的*似方法。例如,TreeSHAP 只能用于基于树的方法,而 DeepSHAP 只能用于神经网络。
明显的缺点是非不可知方法只能用于特定的模型。这就是为什么研究一直指向不可知论的方法。这些为我们选择算法提供了更大的灵活性。这也意味着我们的解释方法是经得起未来考验的。它们可以用来解释尚未开发的算法。
从解释到说明
我们讨论的方法都是技术性的。数据科学家使用它们向其他数据科学家解释模型。实际上,我们将被期望向非技术观众解释我们的模型。这包括同事、监管者或客户。为此,我们需要弥合技术解释和人性化解释之间的差距。
您需要:
- 根据观众的专业知识调整级别
- 仔细考虑要解释哪些特征
一个好的解释不一定需要解释所有特征的贡献。
我们将在下面的文章中更深入地讨论这个过程。作为一个例子,我们走过如何使用 SHAP 特征贡献来给出一个令人信服的解释。
IML 是一个令人兴奋的领域。如果您想了解更多,请查看下面的教程:
我希望这篇文章对你有帮助!如果你想看更多,你可以成为我的 推荐会员 来支持我。你可以访问 medium 上的所有文章,我可以得到你的部分费用。
https://conorosullyds.medium.com/membership
你可以在|Twitter|YouTube|时事通讯上找到我——注册免费参加 Python SHAP 课程
图像来源
所有图片都是我自己的或从www.flaticon.com获得的。在后者的情况下,我拥有他们的保费计划中定义的“完全许可”。
参考
C.莫尔纳尔、可解释机器学习 (2021)、https://christophm.github.io/interpretable-ml-book/
南 Masís,用 Python 进行可解释的机器学习 (2021)
莫拉法、卡拉米、郭、拉格林和刘,2020 年。机器学习的因果可解释性——问题、方法和评估。https://arxiv.org/abs/2003.03934
微软,因果关系与机器学习,https://www . Microsoft . com/en-us/research/group/causal-inference/
分析不干净的数据是什么感觉?
原文:https://towardsdatascience.com/what-is-it-like-to-analyze-unclean-data-efaffa9a6803
用户功能的 4 个用户体验级别
亚伦·米查姆在 Unsplash 上拍摄的照片
有一天,我在 Reddit 上看到了 这张图片 ,它让我放声大笑。我们数据人做“数据洗衣”的时间有多长?
【这张图片最初出现在这本关于数据分析的教科书中。]
有人称之为“数据清洗”、“数据清洗”或“数据准备”,但这都指向同一个根本挑战:我们如何从杂乱的数据中获得更准确的洞察?
为大型、结构化和可预测的数据做数据准备是一回事。当您知道会发生什么时,您可以在 ETL 管道中构建自动化的数据清理作业,并且如果您构建它是为了重复使用,那么它肯定是划算的。
但是在有些情况下,ETL 管道的投资是不合理的,在这种情况下,您必须求助于手动清理:
- 短暂或暂时的数据:不值得建立新的工作岗位。
- 实时数据:不想等太久处理。
- 小数据:同事分享的电子表格。
在这篇文章中,我想讨论一个在结构不良、实时或小数据的环境中处理数据清理的框架。我们将从考虑好的数据清理的理想特性和可用选项开始。
数据清理中的用户体验
抽象地说,理想的数据清理过程应该具有以下三个特征:
- 分布式:能够处理无限大小的数据,响应时间延迟可预测(低)。
- 实时:能够快速准确的处理移动窗口的流数据。
- 功能:它将有能力在一种通用编程语言中运行用户定义的 ETL 逻辑(有限制)。
在*台特性中,功能是与“数据清理”相关的主要特性,数据分析师通常有四个*台提供的主要选项:
- 无代码:直观的 UI 帮助用户启用转换/提取逻辑,通常只需点击几下鼠标。
- 公式:用户可以应用于数据集的预定义函数,常见于 Excel、Google Sheets 等类似*台。
- COMMON-LANG :一种流行的编程语言,比如 Python、R 或 JavaScript,允许分析师编写代码来执行特定的 ETL 逻辑。
- SPECIAL-LANG :为用户学习编写数据处理逻辑而设计的特殊语言。
从用户体验的角度来看,上面的选项提供了更好的体验,但是下面的选项提供了更好的控制和可定制性。一个好的用于处理结构不良、实时或小数据的分析产品应该以顶级选项为目标,同时试图通过使用户能够从产品中获得他们需要的东西来取得*衡。选项#4 对于处理这种类型的数据并不理想。
个案研究
我们将跳过演示被许多 Excel 和 Google 电子表格用户广泛使用的公式。类似地,我们也跳过说明特殊语言,dax guide是一种被称为 DAX 的特殊语言的很好参考,这种语言被许多 Power BI 用户使用。
Columns.ai 正在通过优先考虑用户体验而不是功能集来构建一个简单、快速和可访问的数据分析工具。让我们看看它如何在其简单的数据分析器中支持无代码和通用语言的两个例子。
案例 1(无代码)-存储一列并按存储桶分组。
将一列分成直方图列表是一个常见的任务,通常,人们希望了解每个桶的具体指标,例如回答“每个消费范围的客户数量”、“每个 GDP 范围的州数”等问题。由于它非常常见,用户不需要编写代码,只需使用 UI 中的 bucketing 滑块,参见此演示:
使用动态存储桶分析指标
这种无代码体验,我们认为是用户以超快的方式进步的最好(一级用户体验)。
案例 2(公共语言)—编写代码来转换脏列
编写一些逻辑来从混乱的文本中提取关键字是一项普通的任务,使用 regex 是一种常见的方法,Javascript 是一种日益普及的流行语言。互联网上有大量容易找到的资源,可以学习如何编写一个简单的 JS 代码片段来完成一些转换工作。
这个例子分析了这个 Google 电子表格中出现的一个杂乱的数据。加载之后,我们可以编写一个简单的函数来提取#key1、#key2 和#key3 的所有散列键,并获得这些键的度量。JS 函数如下所示:
const func = () => {
const d = nebula.column('dirty');
const m = d.match(/^.*(#[a-z0-9]+).*$/);
if(!m || m.length <1) return 'none';
return m[1];
};columns
.apply('clean', columns.Type.STRING, func)
.select('clean',sum('value'))
.run();
您可以将上面的代码复制并粘贴到这个可视化工具的控制台中,并进行生动的试验:数据可视化工具。
如果这样做,结果将与本演示中所示的一样:
支持像 Javascript 这样的通用语言是一种第三级用户体验以在他们的分析问题上取得进展,并且它有巨大的容量允许用户在他们的分析中实现任何逻辑。
摘要
在这篇文章中,我们探讨了数据清理对数据分析师有多重要。有时候并不好玩……但是如果我们做得好,还是可以实现很好的用户体验。
我们通过几个例子来感受在支持功能方面不同层次的用户体验,帮助用户在数据清理方面取得进步。
最后,感谢您阅读到目前为止,我希望“数据清理”是有趣的,很容易在我们的定期数据分析。
如果你喜欢这篇文章,请以任何方式关注我们这里列出的。
什么是 K-fold 交叉验证?
原文:https://towardsdatascience.com/what-is-k-fold-cross-validation-5a7bb241d82f
假设你训练了一个机器学习模型。现在,你需要找出这个模型的表现如何。是否足够精确到可以使用?它与其他型号相比如何?有几种评估方法可以确定这一点。一种这样的方法叫做 K-fold 交叉验证。
K-fold 交叉验证将数据样本分割成更小的样本,照片由Jackson smelle在 Unsplash 上拍摄
交叉验证是机器学习中使用的一种评估方法,用于了解您的机器学习模型对未知数据的预测效果。这是一种易于理解的方法,适用于有限的数据样本,并且提供了一种更少偏见的评估,使其成为一种流行的选择。
数据样本被分割成“K”个更小的样本,因此得名:K 重交叉验证。您可能还会听到像四重交叉验证或十重交叉验证这样的术语,这实际上意味着样本数据被分别分割成四个或十个更小的样本。
k 重交叉验证是如何进行的?
一般策略非常简单,可以采用以下步骤:
- 首先,混洗数据集并分成 k 个子样本。(尽量使子样本大小相等,并确保 k 小于或等于数据集中的元素数,这一点很重要)。
- 在第一次迭代中,第一个子集被用作测试数据,而所有其他子集被视为训练数据。
- 使用训练数据训练模型,并使用测试子集对其进行评估。保留评价分数或错误率,去掉模型。
- 现在,在下一次迭代中,选择一个不同的子集作为测试数据集,并使其他所有东西(包括我们在上一次迭代中使用的测试集)成为训练数据的一部分。
- 使用训练数据重新训练模型,并使用新的测试数据集对其进行测试,保留评估分数并丢弃模型。
- 继续迭代上述 k 次。每个数据子样本将在每次迭代中使用,直到所有数据都被考虑。你最终会得到 k 个评估分数。
- 总错误率是所有这些单独评估分数的*均值。
Gufosowa-Own 工作的 k 倍交叉验证图,CC BY-SA 4.0,【https://commons.wikimedia.org/w/index.php?curid=82298768
如何确定 K-Fold 交叉验证中‘K’的最佳值?
选择一个好的 k 值很重要。k 值过低会导致对模型能力的评估过低。换句话说,它可能会导致模型的测量能力被高估(高偏差)或根据所使用的训练数据发生很大变化(高方差)。
一般来说,有三种选择 k 的方法:
- 设 k = 5,或者 k =10。通过实验,已经发现选择 k 为 5 或 10 会产生足够好的结果。
- 设 k = n,其中 n 是数据集的大小。这确保了每个样本都用于测试数据集中。
- 另一种方法是选择 k,使每个分割数据样本足够大,确保它们在更大的数据集中得到统计表示。
交叉验证的类型
交叉验证可以分为两大类:
- 穷举,其中该方法学习和测试将数据集分成训练和测试子集的每一种可能性。
- 非穷举交叉验证方法,其中所有分割样本的方式都是而不是计算的。
详尽的交叉验证
遗漏交叉验证是一种彻底的交叉验证方法。这里,p 个观察值(或样本数据集中的元素)被排除在训练数据集之外,其他的都被认为是训练数据的一部分。为了更清楚,如果你看上面的图像,p 等于 5,如“测试数据”中的 5 个圆圈所示。
留一交叉验证留 p 交叉验证法的一种特殊形式,其中 p = 1。这也是 k 重交叉验证的一个特例,其中 k = N(样本数据集中的元素数量)。
非穷举交叉验证
K-fold 交叉验证其中 k 不等于 N,分层交叉验证和重复随机子采样验证是非穷举交叉验证方法。
分层交叉验证:选择分区,使得每个分区包含每个类标签的大致相同数量的元素。例如,在二进制分类中,每个分裂具有大约 50%属于类 0 和 50%属于类 1 的元素。
重复随机子采样验证(蒙特卡罗交叉验证):将数据分成多个随机子集,并为每次分割训练和评估模型。结果是分割的*均值。与 k-fold 交叉验证不同,训练集和测试集大小的比例不依赖于数据集的大小,这是一个优势。然而,缺点是一些数据元素永远不会被选择作为测试集的一部分,而一些可能被选择多次。当随机分裂的数量增加并接*无穷大时,结果倾向于类似于留 p-out 交叉验证的结果。
结论
交叉验证用于评估模型的性能,并客观地比较不同的模型。例如,我们可以确定在相同的数据集上,支持向量机(SVM)是否比 K *邻(KNN)模型表现得更好。这是一个简单明了且较少偏见的方法,使得交叉验证成为一个流行的评估工具。然而,交叉验证有一些缺点,例如必须重新运行训练算法 k 次,这会占用大量的计算和时间。
如果你觉得这篇文章有用,可以考虑订阅给我,加入媒体。你的会员支持我和你直接阅读的其他作家。
感谢您的阅读!在以后的帖子中再见。
什么是机器学习?
原文:https://towardsdatascience.com/what-is-machine-learning-716dfa72f2bc
高层次概述
迈克尔·泽兹奇在 Unsplash 上的照片
机器学习来自于这样一种想法,即机器可以学习自己编程,而不是必须人工编程。这是因为,最初,为了通过逻辑路线找到答案,程序员不得不手动创建 if、elif 和 else 语句,以便计算机遵循这些语句来获得最佳答案(参见吉尔·莱珀的惊人之作 if/then)。这对程序员来说是一个沉重的负担,尤其是当逻辑非常复杂的时候。这种负担导致了计算机能够根据现有数据自己学习这种逻辑的想法。在这样做的过程中,计算机实际上会为逻辑流程分配权重、值或语句,以获得与手动编程类似或更好的答案。这既能减轻程序员的负担,又能开发出比人类能开发的更复杂、更精确的程序。
自从机器学习的最初想法以来,这个领域已经有了相当大的发展,包含了各种不同的技术和算法。这包括多种模型,如用于识别数据点组的 Kmeans 聚类、用于预测单个值的随机森林回归以及用于预测数据点所属组的支持向量机。虽然这些模型随着时间的推移而发展,但可以说关键的发展是通过开发大量开源包和开源数据集的广泛可用性实现机器学习的民主化。这意味着任何拥有计算机的人(可以说甚至不再需要计算机了)都可以在数据集上实现机器学习解决方案。然而,各种各样的技术和易用性有时会使机器学习的世界变得非常困难。这篇文章旨在提供一个高层次的帮助来导航这个广阔的、持续发展的社区。
首先,机器学习可以分为两条主线:监督学习和非监督学习。在前者中,向计算机传递已经定义的目标点或结果,模型可以用来学习,而在后者中,没有定义的目标,最终结果可以公开解释。这可以进一步划分,因为监督学习包括回归问题(其中目标变量是连续的)和分类问题(其中目标变量是分类的)。然后,在无监督学习下,我们有聚类,其目的是在没有预先定义的目标的情况下,从数据中找到模式和/或组。这些组可以定义如下:
回归
回归是最常见的机器学习任务。这组模型的目的是能够预测和/或模拟目标变量的精确值。这方面的例子包括根据卧室数量、位置、厕所数量和大小等因素预测房价,或根据经济、社会和环境因素对个人身高进行建模。关键是目标变量是连续的,我们的目标是用指定的输入来模拟精确的值。
在这种情况下遇到的第一种方法是线性或多元线性回归。虽然这种方法属于传统统计学的范畴,实际上它已经存在了一段时间,但它也属于机器学习模型的范畴,因为计算机可以“学习”权重。这里,模型将尝试学习分配给输入变量的最佳权重,以最大化或最小化与输出相关的指标。在线性回归的情况下,这是使用最小*方距离(所有值的*方和)来减小实际值和预测值之间的距离。由此,我们可以提取输入变量和目标变量之间关系的强度和方向,并使用它来尝试预测看不见的值。
这意味着我们通常会有一系列数字输入值(自变量),用于对目标值(因变量)进行建模。这通常看起来像:
作者图片
其中左侧显示数据输入,右侧显示模型的预期外观。
除了线性回归,机器学习中还有许多不同类型的回归,包括:
- 里脊回归
- 套索回归
- 决策树回归
- 随机森林回归
- 神经网络
其中每一个都有不同的复杂性、实现和最佳用例。例如,如果您希望关系是线性的,您可能应该使用一系列线性回归模型,如线性回归、岭回归或 Lasso 回归。如果您预计这种关系是非线性的,那么决策树回归、随机森林回归或神经网络可能是首选。
你选择的模式也将取决于你的目标是什么和你有什么资源可用。在大多数情况下,最好尝试模型的组合,看看哪个最适合,并从最简单的模型开始,通常是线性回归。
分类
分类是机器学习工作流中常用的另一种受监督的机器学习任务。这种算法的目的是能够确定一个数据点可能属于哪个组或类,而不是一个确切的值。这意味着我们使用分类变量作为我们的目标变量,而不是连续变量。正在使用的这种技术的例子包括模拟患者是否患有糖尿病,图片是否包含狗或猫,或者用户将来是否会重新订阅该*台。
在这种情况下,一种常见的方法是支持向量机。这是因为,至少只有两个因变量,它可以很容易地形象化和理解。其工作方式是找到数据点之间的边界,作为不同组之间的分界线。然后,通过找出数据点位于边界的哪一侧,该边界可用于预测新数据属于哪个组。该边界可以采取多种形式,例如线性、非线性或由用户定义,但是可以容易看到、实现和理解。模型创建的边界示例如下所示。
这意味着,对于分类,我们通常会有一组输入,无论它们是数字还是类别,用于预测最终类别。这意味着这些模型的数据输入通常采用以下形式:
作者图片
其中左侧显示数据输入,右侧显示模型可能的样子。
属于这一范畴的标准算法包括:
- 逻辑回归
- 支持向量机
- 决策树分类器
- 随机森林分类器
- 神经网络
这些方法的复杂性和实现方式各不相同,这意味着一些算法将适用于不同的问题。例如,线性决策边界可能是最好的,那么具有线性边界的支持向量机可能是可取的。然而,当关系可能更复杂且线性度更低时,随机森林分类器可能是该实现的首选。
您选择的模式还取决于您的目标和可用的资源。与回归一样,在大多数情况下,如果可以的话,最好尝试多种方法的组合,以获得最佳结果,并理解为什么不同的算法可能表现得更好或更差。
使聚集
与上述两组机器学习相反,聚类算法是无监督的机器学习算法。这意味着他们没有一个预定的目标。相反,这些算法组的目的是能够根据相似的特征从数据中识别组。当我们想要识别一组具有不同行为的组时,通常使用这种方法。这方面的例子包括识别购物者群体,例如单身个人、年轻家庭或夫妇,识别用户通常一起观看的不同表演群体,或者对音乐品味进行分组。一旦这些群体被识别出来,这就能告诉我们更多关于行为的信息,并能导致有针对性的发明。这可以包括向团体发放优惠券,以推动他们采取新的行为或加强现有的行为,或者能够向观众提供电影或电视节目方面的建议。
这个领域中的一种常见算法是 K 均值聚类算法。该算法能够通过根据数据点彼此之间的距离对数据点进行分组来定义不同的组/聚类。为此,数据科学家必须首先定义要识别的目标组数量。然后,该算法在数据中设置随机点,并通过寻找该组的质心,根据点相对于其他组的相互距离来寻找每组内点的最佳分组。由于数据科学家通常事先不知道组的最佳数量,并且通常没有预定义的目标,因此结果通常可以有多种解释。有一些方法可以确定最佳的聚类数,但是这些方法的结果会有所不同。
这意味着一系列数字输入被输入到聚类算法中,而没有预定义的目标变量。这通常看起来像是:
作者图片
其中左侧显示数据输入,右侧显示模型可能的样子。
该领域中的常见算法包括:
- k 均值聚类
- DB 扫描
- 分层聚类
- 光学
- 均值漂移
与回归和分类算法一样,这些方法的复杂性和实现方式各不相同,这意味着有些算法比其他算法更适合不同的问题。由于聚类结果本身可能是高度主观的,并且容易解释,因此通常最好尝试多种不同的聚类方法,以查看哪些结果最有意义。这应该意味着这些组是*衡的,通过它们的*均值或中间值清楚地定义,并且对于非专家来说容易标记或解释。
结论
机器学习是一个过程,在这个过程中,不是数据科学家定义数据的规则,而是机器自己学习这些规则。这可以分为监督学习和非监督学习,前者有算法努力的明确目标,而后者没有。回归和分类都属于监督机器学习算法的范畴,而聚类属于非监督机器学习的范畴。当实现这些算法中的任何一个时,如果您有时间和资源,通常最好尝试实现多个算法,同时尽量保持简单。这将确保你会仔细检查你的结果,并尽可能使用最少的资源来进行有效的学习。
虽然机器学习的想法已经存在了很长时间,甚至一些机器学习算法的实现也已经存在了一段时间,但机器学习的广泛使用才刚刚开始。*年来,跨多种语言的深度和广度开源数据科学生态系统的发展促进了这一点,使任何拥有笔记本电脑的开发人员(在某些情况下,你甚至不再需要它)都可以开始实施自己的机器学习算法。在 Python 中,这包括开发和集成各种库,如 pandas、matplotlib、sklearn、statsmodels、tensorflow、keras 等,以及开放数据源,如 Kaggle、谷歌云公共数据集、Data.gov 等。
这意味着数据科学实践仍在发展,尽管已经建立了坚实的基础。有很多机会以各种不同的方式为这个不断增长的生态系统做出贡献,我们每天都会看到这种情况。抱着这样的想法,我非常期待未来会发生什么!
如果您想查看上述任何主题的实际示例,请随意查看我的文章《面向初学者的完整数据科学课程》。
如果你喜欢你所读的,并且还不是 medium 会员,请使用下面我的推荐链接注册 Medium,来支持我和这个*台上其他了不起的作家!提前感谢。
https://philip-wilkinson.medium.com/membership
或者随意查看我在 Medium 上的其他文章:
什么是机器学习:我如何向新人解释这个概念
什么是机器学习,它的应用的例子和在这个领域做什么
马库斯·温克勒在 Unsplash 上的照片
解释什么是机器学习相对简单,但讨论必须根据对话者进行校准。一些术语可以根据上下文有不同的解释,所以寻找尽可能通用的词汇表是正确的。
这篇文章将针对该领域的新人:对定量分析知之甚少,但出于各种原因希望开始接*这个主题的人。特别希望这篇文章能帮助青年学生在大学和工作空间中定位。
什么是机器学习?
机器学习是人工智能的一个分支,人工智能又是计算机科学的一个分支。
在机器学习中,数值数据用于训练计算机完成特定任务。其结果是一种算法,该算法反过来使用现象的模型来找到问题的解决方案。术语训练是最基本的,也是最能体现该领域特点的活动。稍后我们将详细了解这意味着什么。
一个应用特定规则来解决任务的软件(例如,如果一个句子包含单词“home”,在 Excel 电子表格中创建一个“housing”类别)和一个机器学习算法的区别在于后者不需要显式编程来解决问题。
机器学习算法使用 模型从数学上推断数据中的规则,从而能够找到问题的通用解决方案。
所以我们来给什么是机器学习下一个大概的定义:
机器学习是人工智能的一个分支,它允许软件使用数字数据来找到特定任务的解决方案,而无需显式编程。
这些解决方案可能或多或少是精确的,并且很难达到与人类相当的性能。
然而,这不应该引起关注:机器学习面临的大多数问题都提供了满足一般用例的性能。只要想想亚马逊或 Gmail 的垃圾邮件检测上的产品推荐就知道了。我们很快就会看到例子。
让我们定义什么是算法、模型和性能
在继续之前,我们先澄清一些概念。
一个算法只不过是计算机遵循的一系列指令。这当然是一个目前被过度使用的词(脸书算法、Twitter 算法等等),但它实际上是一个非常简单的概念。
一个模型是嵌入算法的软件——我们需要它来找到问题的解决方案。由于我们经常不知道真正的解决方案,这些被称为预测。
在用于解决重要问题之前,一个模型要经过一系列的测试来评估它的性能。只有当我们有一个允许我们将真实观察值与模型预测值进行比较的数据集时,才能计算出这个值。
如果性能令我们满意,那么我们将在所谓的“生产”环境中使用该模型(也就是说,在真实世界的应用程序或类似的环境中),否则我们可以决定再次训练该模型或丢弃它并寻求另一个解决方案。
机器学习管道的例子
“培养”一个模特意味着什么?
正如我们所提到的,数字数据被提供给一个模型来寻找可推广的解决方案。向模型展示数据并让它从中学习的行为称为训练。
在训练期间,模型会根据某些假设尝试学习数据中的模式。例如,概率算法的运算基础是在某些数据存在的情况下推断事件发生的概率。
训练是通过超参数控制的,超参数允许我们调整和校准模型解释数据的方式等等。每个模型都有自己的超参数。
数据科学家工作中最重要的一个方面是为给定模型找到正确的超参数集。这通常是一项非常耗时的任务。
一旦模型得到调整和训练,我们就可以计算它的性能,以评估它的预测是否与真实的观察值有很大差异。如果我们对结果满意,培训阶段就完成了,我们继续下面的发展阶段。
一个经过训练的模型的行为就像任何其他软件一样:它接收输入并返回输出。输入将是现象的数据,而输出将是预测。
机器学习的类型
机器学习可以分为三个领域:有监督、无监督和强化学习。我们来看看这些算法的训练是如何根据所属的子类别而有所不同的。
机器学习的类型
监督学习
基于监督学习的算法需要在数据上进行训练,这些数据包含问题的准确答案,以便它们理解后者和现象之间的关系。
例如,监督任务的数据集可能包含房地产数据和每项财产的价格。如果我们想预测一处房产的价格,就必须对算法进行训练,以理解房屋特征(如房间数量、大小等)与价格之间的关联。
用技术术语来说,我们说一个现象的特征是特征集的一部分(用 X 表示,一个独立的随机变量)。被预测的变量是因变量(因为它取决于特性),通常用 y 表示。
我们用一句话总结一下什么是监督学习。
监督学习是机器学习的一个子类,包括需要 X 和 y 形式的数据的算法。X 是现象的特征集,y 是我们想要预测的观察结果。
监督算法学习 X 和 y 之间的关系,并且能够在给定不属于训练集的 X 的情况下预测新的 y。
定义的最后一部分可能有点难以理解,所以我将尝试更好地解释 X 不属于训练集是什么意思。
监督机器学习算法的目标是在给定一个现象的特征集的情况下预测某事。在训练期间,预测模型学习这些数据之间的关系,并评估其性能。
打个比方,
预测模型就像一个在学校为考试而学习的孩子。在练习(训练)过程中,孩子可以获得正确的答案,因此能够改进他的学习。在最后的测试中,孩子会被问到一些他无法找到正确答案的问题。
X(最终测试问题)不是训练集(练习问题)的一部分,因此,孩子(预测模型)将不得不根据他之前接受的学习找到最精确的解决方案(y)。
回归(数值的预测)和分类(类别的预测)是监督学习的例子。
无监督学习
在这种情况下,我们的算法不需要访问数据集中的正确答案,因此只需要一个特征集 x。
怎么可能呢?因为这些算法的逻辑与监督算法完全不同。并非所有的机器学习模型都必须表现得像隐喻中的孩子一样。事实上,无监督学习算法试图发现数据中的隐藏模式,以某种方式对数据进行分组、分离或操纵。
这些算法的美妙之处在于,它们不需要人为干预来完成工作。我们只需以正确的格式向他们提供我们的数据,就大功告成了。
无监督的任务是聚类、信号和异常、检测和降维。
还有一些算法部分以监督方式工作,部分以非监督方式工作(它们被称为半监督算法),但这些算法通常是由大公司或非常大的团队创建的特定算法。
强化学习
强化学习通常被视为机器学习的一个困难领域,并与上述两种方法相分离。潜在的概念实际上非常简单:我们编写一个名为代理的软件,来学习如何在特定的环境中完成某个任务,我们根据它的表现提供奖励或惩罚。
这个想法是当代理取得好的结果时奖励它,或者当它做了阻碍他实现它的事情时惩罚它。以迭代的方式,模型学习最大化适应度函数的规则,这是定义奖励的数学函数,并最小化错误,这是惩罚。这允许类似人类的学习:基于试验和错误。
Sentdex 是 YouTube 上机器学习方面的领先内容创建者。我强烈推荐关注他的频道和观看这个播放列表,在那里他编写了一个 RF 算法来玩星际争霸 2 的游戏。
另一个特别有效地传达强化学习力量的视频是这个,展示了很酷的机器人:)
机器学习应用示例
为了巩固我们对什么是机器学习的理解,让我们看看它在日常生活中如何使用的一些实际例子。这些用例中的每一个都由数据科学团队实现,如果您选择在该领域工作,您也可以从事这样酷的项目!
异常检测
当你的银行应用程序通知你一个异常交易,并多次询问你的许可以确保你确实授权了它,你熟悉吗?我知道你是。
异常检测算法是一种程序,它使用数据来捕获与通常行为有很大不同的行为。在银行环境中,它们对于阻止未经授权的交易极其有用,在监控自然现象(如地震和飓风)时也同样有用。
图像和文本分类
你有没有想过 iPhone 如何使用自拍来实现 FaceID 这样的功能?虽然这不是唯一的机制,但苹果使用机器学习来分类来自我们相机的图像。在这种情况下,分类是二进制的:图像中存在或不存在已识别的面部。
Gmail 拥有最著名的反垃圾邮件算法之一。只需打开您的电子邮件帐户,查看充满恶意邮件的垃圾邮件收件箱。谷歌如何知道一封邮件是潜在有害的,并在没有我们干预的情况下将其放入垃圾邮件文件夹?
它利用经过训练和校准的机器学习算法来分类我们电子邮件的文本内容。如上所述,模型性能不一定要完美,才能给用户带来真正的价值。事实上,有时我们可能会发现自己不得不手动将垃圾邮件放入适当的框中。
价格预测
机器学习允许我们预测数值,比如物体的价格。
这看起来像是魔术,但在房地产行业,c 公司使用机器学习算法来预测房屋价格,从而完善他们的买卖策略并获得竞争优势。
自定义内容和 UX
亚马逊等网站跟踪我们的购买和互动行为。这使得他们可以训练机器学习模型,这些模型可以理解我们喜欢购买的东西,以便系统可以推荐那些可能的选择,从而消除搜索的需要。
事实上,亚马逊经常根据推荐和聚类算法向我们推荐“我们可能会喜欢”的产品。实施这样的解决方案并不容易,但为我们的客户提供这样的体验确实会有所不同。
如果你感兴趣,我在这里分享一个视频,列出了其他机器学习应用程序
怎么能从事机器学习领域的工作?
要在机器学习领域工作,你需要具备计算机科学、数学和统计学方面的知识。这些知识越具体,你找到一份高薪且令人满意的工作的机会就越大。事实上,数据科学家,也就是参与这个领域的主要人物,恰恰工作在这三个学科的交叉点。
数据科学家主要通过编写代码来完成工作,通常是用 Python 或 r。因此,您必须对软件开发逻辑、数据结构和算法有很好的了解。
数学最重要的领域当然是线性代数,它允许数据科学家利用矩阵的性质和运算,微积分,研究函数及其优化和概率 T21。
成为一名数据科学家似乎非常困难,但是对你想要工作的行业有具体的了解甚至更重要。
事实上,不需要记住上述领域的所有概念,但知道基本知识并帮助公司或客户抓住其所在行业中最有利可图的机会就足够了。
如今,一些大学为年轻学生从事数据科学行业做准备。他们的课程各不相同,但都涵盖了上述学科。
然而,对于自学者来说,有一些非常好的在线课程,可以帮助他们开始并巩固在该行业工作所需的知识。忍不住分享一下 吴恩达的机器学习入门教程 Coursera 。这当然是在开始深入数据世界的旅程之前要完成的第一步。
如果你想支持我的内容创作活动,欢迎点击我下面的推荐链接,加入 Medium 的会员计划。我将收到你投资的一部分,你将能够以无缝的方式访问 Medium 的大量数据科学文章。
https://medium.com/@theDrewDag/membership
推荐阅读
对于感兴趣的人来说,这里有一个我为每个与 ML 相关的主题推荐的书籍列表。在我看来,有一些必不可少的书籍对我的职业生涯产生了巨大影响。
免责声明:这些是亚马逊会员链接。我会收到亚马逊为你推荐这些项目的一小笔佣金。你的体验不会改变,你也不会被收取更多费用,但它将帮助我扩大业务规模,围绕人工智能制作更多内容。
- ML 简介 : 自信的数据技能:掌握处理数据的基本原理,为你的职业生涯增压 作者:基里尔·叶列缅科
- sk Learn/tensor flow:使用 Scikit-Learn、Keras 和 TensorFlow 进行动手机器学习
- NLP : 文本即数据:机器学习和社会科学的新框架 作者 Justin Grimmer
- Sklearn / PyTorch : 用 PyTorch 和 Scikit 进行机器学习——Learn:用 Python 开发机器学习和深度学习模型Sebastian Raschka
- Cole Knaflic 著数据即 : 用数据讲故事:商务人士数据可视化指南
有用的链接(我写的)
- 了解如何在 Python 中执行顶层探索性数据分析:Python 中的探索性数据分析——一步一步的过程
- 学习 TensorFlow 的基础知识:tensor flow 2.0 入门—深度学习入门
- 用 Python 中的 TF-IDF 进行文本聚类 : 用 Python 中的 TF-IDF 进行文本聚类
什么是机器学习系统设计面试,如何准备
作者图片
使用模板准备 ML 系统设计面试的详细指南
什么是 ML 系统设计?
机器学习面试涵盖编码、机器学习、概率/统计、研究、案例研究、演示等多种技能。其中一个重要的机器学习面试就是系统设计面试。
ML 系统设计面试分析候选人针对给定用例设计端到端机器学习系统的技能。
这样做是为了衡量候选人理解开发一个完整的 ML 系统的能力,考虑大多数必要的细节。大多数 ML 候选人擅长理解 ML 主题的技术细节。但当涉及到将它们联系在一起时,他们无法辨别设计一个完整的 ML 系统的复杂性和相互依赖性,从数据收集一直到模型评估和部署,因此在这种面试中表现不佳。
在这样的面试中最重要的是有组织的思考过程。这样的组织思维过程需要准备。在有限的面试时间里,这类问题的通用模板可以派上用场。这保证了你把注意力集中在重要的方面,而不是长时间谈论一件事或者完全错过重要的话题。
📓模板:
大多数 ML 系统设计面试问题可以按照下面的模板来回答
机器学习系统设计——模板(图片由作者提供)
在本文中,我们将按照上面提到的每个模块关键资源的六步模板来浏览 ML 设计面试的组织流程。
1.理解问题并提出澄清性问题
在你着手解决这个问题之前,你必须确保你有足够的信息。ML 设计问题大部分时间是开放式的。设计高效模型的关键是收集尽可能多的信息。面试官会用最少的信息提出问题。当遇到问题时,您必须确保自己正确理解了问题,并询问一些澄清性问题,如极限情况、数据大小、数据/内存/能源限制、延迟要求等。
2.数据收集/生成
ML 模型直接从数据中学习,因此数据的来源和收集策略非常重要。有多种方法可以为您的 ML 系统收集数据。有几种方法
- 用户与现有系统的交互(如果有)
- 人工贴标/众包
- 专业贴标机
- 综合数据
如果你和面试官一起讨论这些问题,会有所帮助。另一件重要的事情是分析什么样的数据可供你使用,并论证是否有足够的通用性。您应该意识到 ML 中不*衡数据集的含义,并在必要时解决它。确保正样本和负样本是*衡的,以避免过度适合一个类别。此外,在数据收集过程中不应该有任何偏见。问问你自己,这些数据是否是从足够大的人群中抽取的,以便更好地概括。
3.探索性数据分析
一旦你有了原始数据,你就不能直接使用这些数据来输入 ML 系统。你总是要分析和修剪它。这种预处理包括数据清理、过滤和去除冗余参数。有几种方法可以做到这一点
- 研究特征(均值、中值、直方图、矩等。)
- 探索特征之间的关系(协方差、相关性等)
- 应用降维(如 PCA)去除冗余参数
最终目标是探索哪些特性是重要的,并去掉多余的特性。不必要的特征往往会在模型训练中产生问题,通常被称为维数灾难。
4.模型和 KPI 选择
不要选择复杂的模型,总是从简单的开始。针对给定的问题和数据分析模型,然后不断改进。面试官感兴趣的是你的思维过程,以及你是否能意识到自己的错误并加以改进。在讨论模型时,请确保您讨论了
- 模型类型(回归、树、人工神经网络、随机森林等。)
- 如果你选择了 DNN,讨论它的结构、层数、层数等
- 您是否喜欢一种类型的网络/块,而不是另一种类型,如 AlexNet、VGGNet、ResNet 和 inception。
- 确保谈论你的网络的内存和计算使用情况
模型的选择取决于可用数据和性能指标。确保谈论不同的 KPI 以及它们之间的比较。此类 KPI 包括但不限于
- 分类问题:准确度、精确度、召回率、F1 评分、ROC 下面积(AUROC)
- 回归: MSE,MAE,R *方/调整后 R *方
- 目标检测/定位:交集超过并集(IoU),*均精度(AP)
- 强化学习:累积奖励,回报,Q 值,成功率。
- 系统/硬件:延迟、能量、功率
- 业务相关 KPI:用户留存、日/月活跃用户(DAU、MAU)、新用户
下面的文章将帮助你理解 ML 模型的不同部分
5.模特培训
这是评估技术知识的地方。确保你熟悉 ML 培训的不同方面,并能自如地深入讨论它们。面试官甚至可能会问你如何应对过度拟合,或者你为什么不用正则化,如果你用了哪一种,为什么等等。主题包括但不限于
- 损失函数选择:交叉熵、MSE、MAE、Huber 损失、铰链损失
- 正则化: L1,L2,熵正则化,K 倍 CV,辍学
- 反向传播: SGD,ADAGrad,Momentum,RMSProp
- 消失渐变以及如何解决它
- 激活函数:线性、ELU、RELU、双曲正切、乙状结肠
- 其他问题:不*衡数据、过拟合、归一化等
以下文章将有助于您深入理解上面提到的一些主题
6.估价
训练模型的最终目标是在手头问题的真实场景中表现良好。它如何处理看不见的数据?角落里的箱子被盖住了吗?为了分析这一点,我们需要进行离线和在线评估。
- 离线评估:模型对数据集保留样本的性能。在数据集收集期间,数据被划分为训练、测试和验证子集。这个想法是为了分析模型对未知数据集的概括程度。还可以进行 K 重交叉验证,找出不同数据子集下的性能。选择对所选 KPI 表现良好的模型来实现和部署。
- 在线评估:在真实场景中部署训练好的模型的第一步(在它已经被离线评估之后)是进行 A/B 测试。经过训练的模型不会很快面对现实世界的数据。这太冒险了。相反,该模型被部署在一小部分场景中。例如,假设设计的模型是为了匹配优步司机和骑手。在 A/B 测试中,该模型将只部署在较小的地理区域,而不是全球。该模型的测试版将在更长的时间内与现有模型进行比较,如果它能够提高业务相关 KPI 的性能(例如优步应用程序的更多 DAU/MAU,更好的用户保留,最终提高优步的收入),那么它将在更大的规模上实施。
总结:
如果在任何一步你走错了方向,面试官会跳出来,试图把你引向理想的方向。确保你领会了面试官提供的暗示。ML 系统设计应该是一个讨论,所以每当你陈述某事时,问面试官他们对此有什么想法,或者他们是否认为这是一个可以接受的设计步骤。一旦你完成了这 6 个步骤的讨论(过程中有所改进),确保用几句话概括最终的系统设计参数,并提到过程中的关键要点。
总结:
在本文中,我们看到了一种回答 ML 系统设计问题的有组织的方法。没有一个正确的答案,这次面试的目的是分析候选人设计端到端系统的思维过程。话虽如此,深入了解各种 ML 话题是在这次面试中取得成功的必要条件。以下备忘单将有助于更新这些主题。
https://medium.com/swlh/cheat-sheets-for-machine-learning-interview-topics-51c2bc2bab4f
如果这篇文章对你有帮助,或者你想了解更多关于机器学习和数据科学的知识,请关注【Aqeel an war】,或者在LinkedIn或Twitter上联系我。你也可以订阅我的邮件列表。
什么是 MLOps?
原文:https://towardsdatascience.com/what-is-mlops-8dff3a6ec94c
DevOps 满足数据和机器学习
你有没有在 Instagram 上喜欢过某样东西,然后几乎立刻就在你的 feed 上有了相关内容?或者在谷歌上搜索某样东西,过一会儿就收到垃圾广告?这些都是日益自动化的世界的征兆。在幕后,它们是最先进的 MLOps 流水线的结果。我们来看看 MLOps 以及如何有效地部署机器学习模型。
来源: flaticon
我们首先讨论 DevOps 的一些关键方面。然后我们解释引入数据和模型是如何破坏标准实践的。这导致了 MLOps。现有做法,如 CI/CD 管道,需要调整。引进了新的做法,如持续培训。最后,我们讨论了管制环境中的 MLOps 以及它与模型可解释性的关系。
DevOps
DevOps 是一套最佳实践、工具和公司文化,旨在提高软件开发、测试、部署和监控的效率。您可以拥有一个致力于实施最佳实践的开发运维团队。然而,它涉及许多团队之间的参与和有效沟通。每个公司都有不同的开发运维方法。目标总是一样的——快速部署好的软件。
CI/CD 管道
所有软件在使用前都需要开发、彻底测试和部署。DevOps 试图通过构建和自动化 CI/CD 管道来提高这一过程的效率。持续集成(CI)包括围绕开发软件的过程。持续部署/交付(CD)涉及将软件投入生产的过程。最佳实践和文化嵌入到这些管道的管理中。
让我们考虑如何处理第一个方面,持续集成。通常,这需要开发人员定期将代码更改推送到远程存储库。然后,运行自动化的单元和集成测试,以立即识别代码中的任何问题。DevOps 将定义实施这些步骤的最佳实践。我们使用工具来实现它们,比如 git 来推送变更,或者 junit 来运行单元测试。要做到这一点,需要一种定期提交代码的文化。对大多数人来说,这不是天生的。
监视
一旦软件发布,我们需要确保它运行良好。这包括根据系统延迟数据创建指标。DevOps 寻求自动化这一过程,并使开发人员能够轻松地访问这些指标。它还可以包括使用预定义的度量临界值创建自动警告。最终目标是一个持续的监测系统。这将实时提供所有应用程序的指标。
沟通
传统上,开发人员和运营团队是孤立的。在这种情况下,开发人员将合作开发软件。一旦完成,他们将把它传递给一个要部署的操作团队。开发和生产环境是不同的。这可能会导致移交过程中出现大量问题。最坏的情况是,您可能会发现软件根本无法部署。DevOps 寻求打破这些团队之间的壁垒,建立一种沟通文化。
MLOps = DevOps +数据+模型
MLOps 出生于 DevOps。上面讨论的许多方面将会延续下去。关键的区别在于,对于机器学习应用,我们需要数据和模型。这意味着我们不能再依赖现有的实践和工具。在图 1 中,您可以看到数据和模型如何适应现有 DevOps 管道的概述。我们将讨论这些新的方面,以及它们如何影响现有的 DevOps 实践。
图 1: MLOps 概述
数据和模型开发
没有数据,就没有机器学习。数据需要在正确的时间放在正确的位置。对于数据科学家来说,这意味着需要有足够的历史数据来训练模型。我们还需要更*的数据来做预测。在极端情况下,我们可能需要实时数据。由数据工程师来管理进入数据仓库的数据流。对于 MLOps,这是通过 CI/CD 数据管道完成的。数据工程师将需要新的工具来开发这些。
数据为生产工作流程添加了一个新元素。同样,开发模型不同于开发软件。在您决定最终模型之前,通常会有数千次迭代。我们在模型开发管道中进行这些迭代。这条管道应该使数据科学家评估模型变得容易。它还应该有助于跟踪所有不同的模型版本。应该很容易比较模型来决定最好的一个。
CI/CD 管道
一个模型可能看起来像一个神秘的东西,但是一旦它被训练,它就和普通的代码没有什么不同。它是一组接受输入(即数据)并给出输出(即预测)的指令。一旦开发完成,我们就可以将最终的模型推送到主要的 CI/CD 管道。然后运行自动化单元测试和集成测试,以确保新模型没有问题。
CI/CD 管道的设计使得如果新代码出现问题,我们可以很容易地恢复到旧版本。同样,我们应该能够恢复到一个旧版本的模型。如果我们发现模型没有按预期运行,我们会这样做。也就是说,如果它在新数据上表现不佳或做出有偏见的预测。为了保护公司和客户,我们必须尽快恢复旧模式。
监视
对于计算资源,监控模型类似于监控软件。我们需要确保模型按照预期使用 CPU、RAM、带宽和磁盘空间。模型预测不应该产生任何延迟问题。现有的开发运维实践解决了这些挑战中的大部分。监控模型准确性方面的性能带来了新的挑战。
不像软件,模型会退化。模型捕获的基础关系会随着时间的推移而改变。这将导致模型做出不太准确的预测。我们需要引入新的指标来监控数据和模型准确性的变化。与典型的系统指标不同,最终用户将是数据科学家。他们将使用这些指标来帮助决定我们何时需要重新开发一个模型。
持续培训
一旦我们标记了一个重新开发的模型,数据科学家就会介入。通常,会有一个手动过程来收集训练数据、创建特征和重新训练模型。在某些情况下,这个过程可以完全自动化。这就把我们带回了文章开头的反问句。没有人参与更新你的 Instagram feed。当你喜欢新内容时,支持你的建议帖子的模型会自动更新。
这就是所谓的持续训练。这里,MLOps 不仅寻求模型部署的自动化,而且寻求模型训练的自动化。某些事件将启动模型重新开发。这可能是因为有新数据可用,或者模型性能可能已经下降。在这种情况下,CI/CD 管道可能看起来非常不同。我们不再只是部署代码。我们正在部署一个部署另一个服务(即模型)的系统(即 ML 管道)。
沟通
就像 DevOps 一样,我们不能只使用花哨的工具来实现有效的 MLOps。这也不仅仅是一个团队的责任。它需要许多团队之间的协作。这些人包括领域专家、数据科学家、数据工程师、软件开发人员和 DevOps 团队。有了 MLOps,现在有更多的团队参与进来。这使得有效的沟通更具挑战性。
监管和可解释性
有效的 MLOps 是一个目标。组织需要不断改进系统、工具和沟通来实现目标。不同的组织将面临不同的挑战。旧的组织将不得不改进或替换现有的流程。新组织的优势在于能够立即实施最佳实践。对于一些行业来说,不仅有技术上的挑战,还有法律和道德上的挑战。
例如,保险业和银行业都受到严格监管。在这种环境下开发的模型将被仔细检查。在我们部署模型之前,需要其他团队(如合规)和外部监管机构的签准。你需要向这些团队汇报,并向他们解释这个模型。这将在模型开发过程中增加手动步骤。最终,自动化模型训练和部署在技术上是可能的,但是这样做是非法的。
您可以使用的模型类型也是可以调整的。这可能会影响您自动化模型开发过程的能力。使用 XGBoost 和 random forests 这样的模型更容易做到这一点。在这里,您可以通过调整超参数来自动化模型选择过程。在保险业或银行业,你可能需要使用回归。为了建立一个好的回归模型,你需要选择 8 到 10 个不相关特征的最佳集合。这个过程更难自动化,我们将在下面的文章中详细讨论。
对可解释性的需求通常是模型以这种方式被管理的原因。如果你不彻底解释你的模型,它们可能会产生意想不到的结果。同样,如果你不进行彻底的算法公*性分析,他们可能会产生有偏见的结果。解释模型和公*性总是需要一些人工干预。对于具有高影响的模型,自动化这些过程的好处被风险超过了。
我希望这篇文章对你有帮助!你可以成为我的 推荐会员 来支持我。你可以访问 Medium 上的所有文章,我可以得到你的部分费用。
https://conorosullyds.medium.com/membership
推特 | YouTube | 时事通讯 —注册免费参加 Python SHAP 课程
图像来源
所有图片都是我自己的或从www.flaticon.com获得。在后者的情况下,我拥有他们的保费计划中定义的“完全许可”。
参考
米(meter 的缩写))特雷维尔等人。艾尔。、MLOps 简介:机器学习如何在企业中规模化 (2020)、https://www . oreilly . com/library/view/Introducing-MLOps/9781492083283/
AWS,什么是 DevOps?(2022)https://aws.amazon.com/devops/what-is-devops/
AWS,什么是持续集成?( 2022)、https://aws.amazon.com/devops/continuous-integration/
AWS,什么是连续发货?(2022)https://aws.amazon.com/devops/continuous-delivery/
IBM,什么是 CI/CD 管道?(2021)https://www.ibm.com/cloud/blog/ci-cd-pipeline
RevDeBug,单元测试与集成测试(2021)https://revdebug.com/blog/unit-tests-vs-integration-tests/
米(meter 的缩写))阿纳斯塔索夫, CD 管道:温柔的介绍 (2022),https://semaphoreci.com/blog/cicd-pipeline
O.Itzary 和 L. Nahum,机器学习的持续培训——成功战略的框架 (2021),https://www . kdnugges . com/2021/04/Continuous-Training-Machine-Learning . html
什么是 MLOps?
原文:https://towardsdatascience.com/what-is-mlops-996f3d30aacf
MLOps 解决了哪些问题和最佳实践
图片由 layer.ai
构建一个机器学习模型包括创建模型、训练模型、调整模型和部署模型。这个过程应该是:
- 可攀登的
- 合作的
- 可再生的
例如,构建了一个优秀的模型,却不能在生产环境中重现结果,这将是令人遗憾的。确保构建机器学习模型可伸缩、协作和可复制的一套原则、工具和技术被称为 MLOps 。在软件工程的世界里,这些实践被称为 DevOps。
开发运维与微运维与数据运维的对比
DevOps 是一套确保持续交付高质量软件的原则。在机器学习领域,这些实践被称为 MLOps。DataOps 涉及一组规则,这些规则确保高质量的数据可用于分析和训练机器学习模型。可以认为 DataOps 与 MLOps 紧密集成。
图片由 layer.ai
MLOps 解决什么问题?
MLOps 中定义的工具和技术集旨在使数据科学家和机器学习实践者的生活更加轻松。让我们来看看 MLOps 解决的一些问题。
版本控制
版本控制是软件工程中的一种常见做法,其中使用了 Git 和 GitHub 等工具来对代码进行版本控制。除了对代码进行版本控制,机器学习中还需要对其他东西进行版本控制。这些项目包括:
- 模型训练中使用的数据
- 模型工件
对模型和数据进行版本控制可以确保机器学习实验的可重复性。
监控模型性能
投入生产的模型会随着时间的推移而退化。这是由训练数据和测试数据的差异造成的。这通常被称为数据漂移。通过监控模型的性能,可以快速识别和解决这些问题。
特征生成
创建要素可能是一项耗时且计算密集型的任务。应用适当的 MLOps 技术可确保生成一次的要素可根据需要多次重复使用。这使得数据科学家可以专注于设计和测试模型。
MLOps 需要哪些技能?
MLOps 是一个相当广泛的领域,需要相当多的技能。幸运的是,你不需要具备所有这些技能。专攻几个领域更有意义。然而,以下是 MLOps 团队成功交付机器学习项目所需的技能:
- 阐明业务问题和目标的能力
- 收集解决已发现问题所需的数据
- 准备和处理数据,以便机器学习模型可以接受
- 创建对问题重要的特征
- 构建和训练机器学习模型
- 开发用于获取数据、生成要素、训练和评估模型的管道
- 部署模型,以便实际用户可以使用它。这也可以是上述管道的一部分
- 监控模型在现实世界中的表现
了解了这些基础知识之后,现在让我们来看看 MLOps 的主要组件。
MLOps 的组成部分
尽管这个领域相当广泛,但几个部分组合在一起就成了一个整体。在本节中,我们将探索这些部分。
图片由 layer.ai
功能存储
也被称为特征工厂,它存储用于训练机器学习模型的特征。这是 MLOps 的关键部分,因为它确保在创建特征时没有重复。如有必要,还可以提取特征并用于构建其他模型或进行一般分析。在要素存储中,要素也会被版本化,以确保用户可以恢复到特定的要素版本,从而获得更好的模型。
数据版本化
除了版本化功能,用于创建特定模型的整个数据集也可以进行版本化。版本化数据确保了在创建模型的过程中具有可再现性。这在审计期间也是必不可少的,因为它使得识别用于开发各种模型的数据集变得更加容易。
ML 元数据存储
为了摆脱创建机器学习模型的魔力,人们必须记录一切。记录对于再现性至关重要。要记录的一些基本项目包括:
- 分割数据时使用的种子。这可以确保您在创建定型集和测试集时使用相同的拆分
- 用于初始化模型的随机状态。随机状态影响模型训练的再现性
- 模型度量
- 超参数
- 学习曲线
- 培训代码和配置文件
- 用于生成特征的代码
- 硬件日志
出于各种原因,存储模型元数据至关重要:
- 用不同的模型构建仪表板
- 启用基于超参数的模型的可搜索性
模型版本控制
版本化模型很重要,因为它支持模型之间的实时切换。除此之外,可以同时向用户提供多个模型来监控性能。例如,一旦一个新模型可用,它可以提供给几个用户,以确保在向每个人推广之前它能按预期执行。从法规遵从性、治理和历史的角度来看,版本控制也很重要。
模型注册表
一旦模型被训练,它就被存储在模型注册表中。由于上述原因,注册表中的每个模型都将有一个版本。每个模型还应配有:
- 超参数
- 韵律学
- 用于创建模型的特征版本
- 用于定型模型的数据集版本
..举几个例子
上面提到的模型元数据对于以下方面非常重要:
- 符合法规
- 模型的管理
- 确定生产中模型的端点
模型工件通常会根据您使用的 MLOps 工具自动保存。您还可以指示该工具保存最佳模型检查点,并将它们上传到注册表。
模型服务
一旦模型在注册中心,它就可以被部署并提供给用户。服务模型意味着创建可用于在模型上运行推理的端点。模型工件也可以下载并与应用程序打包在一起。然而,部署 API 端点使得在各种应用程序中使用该模型变得更加容易。也就是说,在移动应用程序等应用程序中打包模型可以减少推理延迟。
模型监控
一旦部署了机器学习模型,就必须监控它们的模型漂移和生产偏差。当训练数据和推断数据之间的统计差异以意想不到的方式发生变化时,就会发生模型漂移。模型的性能因此降低。通过监视训练和预测数据的统计属性,可以及早发现这些问题。
当服务模型与离线模型相比表现不佳时,就会出现生产偏差。这可能是由训练过程中的错误、服务错误以及训练和推理数据中的差异引起的。
应监控模型漂移和生产偏差,以确保模型按预期运行。
模型再训练
机器学习模型可以被重新训练有两个主要原因:
- 为了提高模型的性能
- 当新的训练数据变得可用时
你的机器学习管道应该检测新数据的可用性或模型的惨淡表现,并触发模型的重新训练。该系统还应该检测和废弃不会从再训练中受益的模型。
CI/CD
机器学习中的持续集成和持续部署确保了经常创建和部署高质量的模型。连续交付确保了代码被频繁地合并到一个实现自动化构建和测试的中央存储库中。在机器学习中,这不仅包括测试代码,还包括最终的模型。它还需要将模型打包以备实际用户使用。
连续交付包括自动将代码变更部署到一个阶段化或生产环境中。在机器学习管道中,这将涉及到将模型部署到测试和/或生产服务器。频繁的部署是非常重要的,因为它们确保代码和模型在进入生产环境之前经常得到严格的测试。
如何实现 MLOps
您可以创建一个系统来实现我们上面提到的项目。或者,您可以使用机器学习管道编排*台,这将使您的工作流程更加简单。让我们来发现一些可以用于 ML 管道编排的最佳工具。
MLOps 解决方案
机器学习编排工具的选择将取决于几个因素,包括:
- 你的团队的技能
- 你的预算
- 无论您想要自动化部分管道还是整个管道
- 集成新工具的容易程度
仅举几个例子。
现在,让我们来介绍一些可以用来协调机器学习管道的最佳工具。
- MLflow 是一个管理机器学习生命周期的开源*台。该*台可用于 ML 实验跟踪、部署以及中央模型注册。
- 神圣是一个开源库,可以用来组织、记录和复制机器学习实验。它不附带网络用户界面。 Omniboard 是一个受欢迎的神圣的前端库。
- ModelDB 是一个开源工具,用于版本化模型、存储模型元数据和管理机器学习实验。它可用于使 ML 管道可再现,以及显示模型性能仪表板。
MLOps 最佳实践
MLOps 是一个相对较新的领域;然而,当坚持时,一些最佳实践将导致您的机器学习编排过程的成功。让我们举几个例子:
- 使用协作工具。这使得团队中的每个人更容易访问代码、数据和关于项目的信息,例如,生成的特性。这也使得提出和跟踪问题变得更加容易。
- 从一个简单的模型开始。从简单的模型开始可以给你足够的时间来确保基础设施是正确的。一个复杂的模型意味着你必须调试一个复杂的模型并优化它运行的基础设施。
- 刚刚发射。不要花几个月的时间来构建和部署机器学习模型。最好尽快推出该模型,开始在实际用户身上进行测试。您可以将模型提供给少量用户,以开始获得初步反馈。该反馈可用于在必要时迭代模型和基础设施。
- 执行自动化回归测试。这对于确保新代码不会在现有代码中引入错误至关重要。没有通过测试的代码不会合并到主源代码中。回归测试确保新代码不会破坏现有的功能。
- 自动化模型部署。这确保了通过某些测试的新模型可以自动提供给用户。它还将工程师从为生产包装模型的手工过程中解放出来。该过程包括将模型及其依赖项自动打包,并将它们交付到生产或试运行环境中。应该持续监控模型,并在它们表现不佳时自动回滚。
- 将预测附加到模型版本和数据上。这使得跟踪特定模型和数据的每个预测变得更加容易。这对于可追溯性、可再现性和合规性非常重要。记录带有数据和模型版本的预测还可以在出现意外行为时轻松调试模型。
- 测量训练和发球偏斜。当用于看不见的数据时,机器学习模型可能不总是如预期的那样执行。因此,衡量训练表现和看不见的数据之间的差异是至关重要的。如果您的标准不能接受这种差异,那么您将不得不实现一种方法来减轻这种差异,例如,返工特性。
- 实现阴影制作。这包括使用生产数据对模型进行预测。然而,这些预测并不用于现实世界的决策。它们与由现有决策系统做出的决策进行比较,即使该系统是人工的。当模型做出的决策可以接受时,就可以提升为做出真正的决策。
- 超参数调优 。手动选择和搜索最佳模型参数可能是一件令人头疼的事情。自动化过程将加速你的机器学习实验过程。然后可以比较超参数优化的结果,并为生产选择最佳算法和参数。
最后的想法
这篇文章是机器学习操作世界的入门,通常被称为 MLOps。我们已经介绍了 MLOps 的各个方面以及一些最佳实践。我们还了解了一些可以用来自动化 MLOps 流程的工具。更具体地说,你已经学会了:
- 什么是 MLOps
- MLOps 和 DevOps 的区别
- MLOps 解决的问题
- 在 MLOps 领域运营所需的技能
- MLOps 的各种组件
- 端到端 MLOps 解决方案
仅举几个例子。
在 LinkedIn 上关注我获取更多技术资源。
原发布于https://learn . layer . ai .
图片由 Layer 提供,获得许可。
什么是 NetCDF 数据,为什么有趣?
原文:https://towardsdatascience.com/what-is-netcdf-data-and-why-is-it-interesting-ec26bcece19d
NetCDF 数据格式的简单介绍——如何使用 Python 库(如 Xarray 和 netCDF4)读取和操作它。
我想你是一名科学家(或者只是一名气候爱好者),你想研究全球变暖的影响。很自然,你会想收集温度、降雨量等数据。你正在研究的地方。这可能是一个城市,一个国家,或者整个地球。为了进行准确的分析,您需要收集几十年的数据。
现在,我们有了一些要求,综合所有这些要求,我们可以得出结论,数据集应该包含:
- 空间信息—地球表面的位置。
- 时间信息-在一天或一年中的什么时间进行测量。
- 科学价值——如温度、降雨量等。我们之前讨论过。
上述特性导致了数据集的巨大规模,我们希望它具有可伸缩性和可追加性(因为每天都有新数据生成)。
简单地说,这就是 NetCDF 数据格式的作用。它以易于阅读的方式保存纬度和经度、时间以及科学测量等形式的空间信息。
网络通用数据格式(简称 NetCDF)是一种数据格式,也是一套软件库,旨在帮助科学界,尤其是地球科学。
首先,让我们下载一些 NetCDF 文件,我们可以开始探索它们。我更喜欢从哥白尼那里免费下载。哥白尼是一个由欧盟及其机构管理的地球监测项目。他们提供了一个名为气候数据存储的 API 来下载与任何气候变量相关的任何数据。
我从这个链接下载了一个示例.nc
文件。我选择了 2020 年 12 月的“2 米温度”(地球表面以上 2 米的空气温度)。我获得的文件大小是 1.4 GB,这是巨大的。所以当你下载 NetCDF 文件时要小心。
下载完成后,可以使用两个库——Xarray 和 netcdf 4——在 Python 中轻松访问数据集。我更喜欢使用 Xarray,因为它简单并且提供了更多操作数据集的功能。
NetCDF 文件使用格式
.nc
存储
使用 Xarray
import xarray as xr
ds = xr.open_dataset('test.nc')ds = xr.open_mfdataset(['test1.nc','test2.nc']) #for multiple files
您可以使用open_dataset
方法和open_mfdataset
读取单个.nc
文件,如果您正在处理多个.nc
文件的话(这是通常的情况)。
Xarray 中的 NetCDF 数据(作者提供照片)
数据集有 3 个坐标,即经度、纬度和时间。经度的范围从 0 到 360,步长为 0.25,纬度的范围从 90 到-90,步长相同。我们只有一个名为“t2m”的数据变量,它被映射到 3 个坐标。
注意:你应该小心坐标惯例。例如,经度可以从 0°到 360 °(就像我们数据集的情况)或从-180°到 180°来表示。
您可以使用以下方法检索数据集的属性:
ds.dims
ds.attrs
ds.coords
ds.data_vars
使用 netCDF4
这个库的语法与 Xarray 的语法相似。
import netCDF4 as nc
ds = nc.Dataset('test.nc')ds = nc.MFDataset(['test1.nc','test2.nc']) #for multiple files
要访问数据集的属性,您可以使用:
ds.dimensions
ds.variables
它的工作原理与 Xarray 略有不同。
数据操作
改变经度惯例
要将经度的约定从 0-360 更改为-180–180,我们可以使用以下代码:
ds.coords['longitude'] = (ds.coords['longitude'] + 180) % 360 - 180
ds = ds.sortby(ds.longitude)
现在,让我们检查 Xarray 中的一些切片方法。
分时
为了选择特定时间的网格数据,我们可以利用 Xarray 的.sel
和.isel
方法。
时间以datetime64
格式编码,所以我们可以利用datetime
库来检索它。
检索 2020 年 12 月 15 日 13:00 的值的代码如下:
import datetimemytime = datetime.datetime(2020, 12, 15, 13, 0, 0)ds.sel(time = mytime)
要选择日期范围,请执行以下操作:
time_start = datetime.datetime(2020, 12, 15, 13, 0, 0)
time_end = datetime.datetime(2020, 12, 16, 13, 0, 0)ds.sel(time=slice(time_start, time_end))
您可以使用ds.isel(time=0)
选择使用时间索引而非实际值的数据集。
切片纬度和经度
目前,我们在数据集中有整个地球的坐标。但是如果你想玩属于某个国家或者某个地方的数据呢?为此,我们可以对横向、纵向网格进行切片,这是一个简单的过程。
第一步:获取你想要切片的区域的边界。作为一个例子,我将使用美国的边界(不包括阿拉斯加和夏威夷)。
步骤 2:使用以下代码进行切片:
# US coordinate bounds
min_lon = -128
min_lat = 19
max_lon = -67
max_lat = 50# mask the coordinates
mask_lon = (ds.longitude >= min_lon) & (ds.longitude <= max_lon)
mask_lat = (ds.latitude >= min_lat) & (ds.latitude <= max_lat)# clip the dataset for only lat,lon inside US
ds.where(mask_lon & mask_lat, drop=True)
还有一些其他的数据操作技术,比如重采样、插值等(我将单独写一篇关于这些方法的文章)。
绘制 NetCDF
我们发现了什么是 NetCDF 以及如何操作它的一些特性。数据可视化是您可以做的有趣的事情之一,在这里,您可以使用 Xarray 的.plot()
方法简单地绘制数据。
由于这是一个静态图像,我们将随机选择一个日期(2020 年 12 月 1 日),然后进行可视化。
使用 Xarray 的图
mytime = datetime.datetime(2020, 12, 1, 0, 0, 0)
ds.sel(time = mytime).t2m.plot(cmap='gist_rainbow_r',figsize=(10,5))
Xarray 情节(作者照片)
我们绘制了 2020 年 12 月 1 日午夜的全球气温图。不出所料,两极的温度很低,而赤道附*(热带)的温度较高。
这个就不多赘述了。我们可以使用名为 Basemap 的不同库来生成类似的图,并控制可视化中显示的内容。
使用底图
from mpl_toolkits.basemap import Basemapmytime = datetime.datetime(2020, 12, 1, 0, 0, 0)
ds_sel = ds.sel(time=mytime)
lat = ds_sel.latitude.values
lon = ds_sel.longitude.values
t2m = ds_sel.t2m.valuesmp = Basemap(projection='cyl',resolution='l')
lon,lat = np.meshgrid(lon,lat)
x,y = mp(lon,lat)plt.figure(figsize=(10, 5),dpi=300)
mp.pcolor(x,y,t2m,cmap='gist_rainbow_r')
mp.drawcoastlines()
mp.drawcountries()
mp.colorbar(label="Temperature (in K)")
plt.show()
底图绘图(作者提供的照片)
我们刚刚在之前的可视化中添加了国家轮廓和海岸线,现在看起来更好了。使用底图,我们可以很好地控制输出可视化,并且调整设置更简单。
我们观察到在喜马拉雅山脉、西伯利亚以及中国和中亚的部分地区附*有冷点。澳大利亚通常在一年中的这个时候比较暖和。
绘制区域图
看到整个地球的可视化(等高线图)是很有趣的。现在,我们将看到如何为某个区域制作可视化效果。
首先,使用边界对纬度、经度网格进行切片(在感兴趣的地方形成一个假想的矩形)。然后我们使用这些边界来裁剪数据集。
# US coordinate bounds
min_lon = -128
min_lat = 19
max_lon = -67
max_lat = 50# mask the coordinates
mask_lon = (ds.longitude >= min_lon) & (ds.longitude <= max_lon)
mask_lat = (ds.latitude >= min_lat) & (ds.latitude <= max_lat)# clip the dataset for only lat lon inside US
da = ds.where(mask_lon & mask_lat, drop=True)# select the time
mytime = datetime.datetime(2020, 12, 1, 0, 0, 0)
ds_sel = da.sel(time=mytime)lat = ds_sel.latitude.values
lon = ds_sel.longitude.values
t2m = ds_sel.t2m.valuesmp = Basemap(projection='cyl',
llcrnrlon=min_lon,llcrnrlat=min_lat,
urcrnrlon=max_lon,urcrnrlat=max_lat,resolution='i')
lon,lat = np.meshgrid(lon,lat)
x,y = mp(lon,lat)plt.figure(figsize=(10, 5),dpi=300)
mp.pcolor(x,y,t2m,cmap='gist_rainbow_r')
mp.drawcoastlines()
mp.drawcountries()
mp.colorbar(label="Temperature (in K)")
plt.show()
美国及其邻国的区域图(作者照片)
现在我们有一个显示美国及其邻国的区域图。请注意,颜色条与之前的可视化效果相比,具有不同的最小值和最大值。这是因为我们现在使用的是属于我们裁剪区域的局部最小值和局部最大值。
如果要使用全局值,则应避免裁剪过程,而只使用底图参数中的边界。
选择其他变量
我选择了2m Temperature
作为例子,但是你有各种各样的气候变量可以选择。下面显示的是各种气候变量的选择,你可以从哥白尼网站免费下载。
气候变量(哥白尼计划)
结论
几个月前,我开始探索 NetCDF 等与气候相关的数据集,并发现它们非常有趣。通常,数据科学家没有机会探索如此多样的数据格式,除非他们在不同的领域工作,如气候。所以我想把它分享给社区是个好主意。
如果您喜欢这篇文章,您可能会对阅读我如何使用 NetCDF 数据集制作 NFT 感兴趣。这里可以看。
感谢阅读,干杯!
**Want to Connect?** You can reach me on [LinkedIn](https://www.linkedin.com/in/rohithteja/), [Twitter](https://twitter.com/rohithtejam), or [GitHub](https://github.com/rohithteja).
什么是神经-符号整合?
原文:https://towardsdatascience.com/what-is-neural-symbolic-integration-d5c6267dfdb0
走向深度关系学习
深入了解象征性人工智能与深度学习相结合的历史
神经-符号整合的主要目的是用神经网络捕捉符号和逻辑推理。(图片来自 pixabay )
*十年来,深度学习一直是人工智能领域大部分进展、成功和炒作背后的推动力量。它接管这个领域的速度如此之快,以至于许多人通常会将这两个领域混淆为等同的。
人工智能⊃机器学习⊃深度学习
虽然深度学习目前的成功和采用在很大程度上盖过了前面的技术,但这些技术仍然有一些有趣的功能。在本文中,我们将研究一些原始的符号人工智能原则,以及它们如何与深度学习相结合,以利用这两种看似不相关(甚至矛盾)的学习和人工智能方法的优势。
人工智能历史一瞥
从历史上看,AI 的象征性和次象征性立场的两个包含流以很大程度上独立的方式演变,每个阵营都专注于自己选定的狭隘问题。最初,研究人员倾向于对人工智能采用离散的、符号化的方法,目标是从知识表示、推理和规划到自动定理证明的问题。
虽然符号人工智能中的特定技术变化很大,但该领域在很大程度上是基于 数学逻辑 ,这被视为符号操作的大多数底层概念的适当(“简洁”)表示形式。考虑到这种形式主义,人们过去常常为人工智能设计大型知识库、专家和产生式规则系统以及专门的编程语言。
这些符号逻辑表示随后也被普遍用于机器学习(ML)子领域,特别是以归纳逻辑编程(在以前的文章中讨论过)的形式,它引入了将背景知识整合到学习模型和算法中的强大能力。
这种基于逻辑的方法对 ML 的主要优点是对人类透明、演绎推理、包含专家知识和从小数据中进行结构化概括。
然而,也有一些主要的缺点,包括计算复杂性,无法捕捉现实世界的噪音问题,数值,和不确定性。由于这些问题,大多数符号化的人工智能方法仍然停留在它们优雅的理论形式上,从未真正在应用中看到任何更大的实际采用(与我们今天看到的相比)。
与此同时,随着计算能力和可用数据量的进步,另一种人工智能方法开始获得动力。 统计机器学习 ,原本针对回归、分类等“狭义”问题,已经开始深入 AI 领域。
这只是随着 深度学习 (DL)时代的到来而升级,随着这个时代的到来,这个领域完全被亚符号、连续、分布式的表征所主宰,似乎结束了符号人工智能的故事。
深度学习的兴起
神经网络的概念(在深度学习“重塑品牌”之前被称为神经网络)实际上已经存在了几十年,经历了各种起伏。它可以追溯到 1943 年,第一个计算神经元问世[1]。将这些一层层堆叠起来,在 20 世纪 80 年代和 90 年代已经非常流行了。然而,在那个时候,他们仍然在与更成熟的、理论上更有根据的学习模型(如支持向量机)的竞争中失利。
神经网络的真正复兴始于 2010 年在提高语音识别任务准确性方面的快速实证成功[2],开启了现在公认的现代深度学习时代。不久之后,神经网络也开始在计算机视觉中展示同样的成功。
面对神经网络在这些机器感知标准基准上不可否认的有效性,研究人员慢慢地(有时不情愿地)开始放弃他们为支持向量机设计的高级特征提取管道,转而采用神经架构制作的新实践。
随着这种范式的转变,许多 80 年代和 90 年代的神经网络变体被重新发现或新引入。受益于现代 GPU 并行处理能力的大幅提升,以及不断增加的可用数据量,深度学习一直在稳步铺*道路,以完全主导(感知)ML。
吸收张量样本的卷积神经网络中共享权重的典型(对称)模式。图片由作者提供。
CNN 上的间奏曲。 最成功的神经网络架构之一是卷积神经网络(CNN)[3]⁴(追溯到 1982 年的 Neocognitron [5])。CNN 引入的显著特征是使用了共享权重和共享的思想。
此处由卷积滤波器的应用引起的共享权重引入了等方差 w.r.t .滤波器的相应变换,同时通过池化在顶部并入聚合函数,将其进一步扩展到该变换不变性。这种技术已经被证明在涉及翻译(移位) 对称的各种任务中非常有用。 (我们将在后续文章中更详细地探讨这些概念。)
可微分规划
在实验成功的巨大推动下,DL 在很大程度上从最初的生物大脑启发的感知智能模型转向“任何在实践中有效的”工程方法。本质上,这个概念演变成一种非常通用的方法,使用梯度下降来优化几乎任意的嵌套函数的参数,许多人喜欢将这个领域重新命名为可微分编程。这种观点为各种新算法、技巧和调整提供了更多的空间,这些新算法、技巧和调整以各种吸引人的名字引入底层功能块(仍然主要由基本线性代数运算的各种组合组成)。
但是随着这种演变,我们也开始看到深度学习社区对结构化、类似程序的符号表示的兴趣,尽管可能是以一种意想不到的方式。事实上,现代神经架构不再是在越来越大的数据集上堆叠越来越多的完全连接的层,而是以某种结构偏差的形式将越来越多的先验知识整合到可区分的程序中,以便完成需要更高抽象水*的更复杂的任务。⁷
究竟有多少这种先验知识要包含在模型中,一直是人工智能研究人员之间许多激烈辩论的主题。⁸
神经符号整合
虽然在超人的感知水*上慢慢饱和,但我们已经看到 DL 进一步扩展到最多样的领域,这些领域最初实际上被认为是象征性的——从玩游戏和语言建模开始,然后发展到编程、算法推理,甚至定理证明。
虽然现在看起来经过足够的调整,大型神经网络正在解决手头的每一个人工智能问题,但指出神经网络的概念本身缺乏许多被认为是人工智能系统的基本功能可能是好的,例如捕捉关系和组合结构,抽象概念的符号推理,鲁棒性和透明性[9](见 Gary Marcus 在 medium 上关于该主题的帖子!).
另一方面,这些能力是由基于逻辑的方法自然提供的。因此,试图以有效的方式整合这两个互补的人工智能流已经成为研究人员的极大兴趣。⁰
现在,许多人认为,深度学习与符号化、基于逻辑的方法中存在的高级推理能力相结合,是迈向更通用的人工智能系统的必要条件[9,11,12]。
W 虽然主流(深度学习)社区对人工智能的符号方面的兴趣是相当新的,但实际上在一个名为 用于学习和推理的神经符号整合 (NSI)的相当小的社区中,已经有一长串专注于该主题的研究[12]。
NSI 传统上专注于在神经网络内模拟逻辑推理,为符号和子符号表示与计算之间的对应关系提供各种视角。从历史上看,该社区的目标大多是分析的一致性和理论模型的表现力,而不是实际的学习应用(这可能是他们被主流研究边缘化的原因)。
然而,鉴于前面提到的神经/深度学习概念的最*发展,NSI 领域现在正获得比以往任何时候都更大的势头。
从符号到神经元
也许令人惊讶的是,由于早期讨论的符号人工智能的优势,神经和逻辑演算之间的对应关系在历史上已经很好地建立起来了。
再仔细观察一下,麦卡洛克和皮茨[1]在 1943 年的论文“对神经活动中固有思想的逻辑演算”中首次提出的计算神经元,我们可以看到,它实际上被认为是在输入(二进制值)命题上模仿逻辑门。这个想法是基于这样一个事实,即合取和析取的逻辑连接词可以很容易地通过带权重的二进制阈值单元进行编码——即感知器,这是一种优雅的学习算法,不久后将推出。
逻辑 AND 和 OR 函数可以简单地用单个阈值神经元(感知器)来表示。(图片来自[13]作者的学生马丁·克鲁茨基)
这种线性感知器不能计算逻辑 XOR 函数被认为是一个重要的限制,对该领域产生了深远的负面影响。众所周知,这可以通过将多个这样的感知器相互堆叠来轻松解决,从而能够表示更复杂的逻辑嵌套函数。然而,当时缺少这种“神经网络的权重的有效学习算法,导致大多数研究人员(和资金)放弃了这种连接主义的想法,转而支持符号和其他统计方法。⁴
XOR 函数可以被认为是 OR 和 NAND 的组合,它只能通过将神经元堆叠成具有隐藏层的神经网络来表示。(图片来自[13]作者的学生马丁·克鲁茨基)
直到 20 世纪 80 年代,用于嵌套函数微分的链规则作为反向传播方法被引入,以计算这种神经网络中的梯度,而这种神经网络又可以通过梯度下降方法进行训练。然而,为此,研究人员不得不用可微分的激活函数取代最初使用的二进制阈值单元,如 sigmoids,这开始在神经网络和它们清晰的逻辑解释之间挖掘一条鸿沟。
从逻辑到深度学习
在深度学习的现代背景下,单个神经元和逻辑连接词之间的这些老派相似之处可能看起来很奇怪。
然而,有趣的是,即使是深度学习的现代思想最初也不仅仅局限于神经网络,而是普遍适用于“对有用概念的分层组合进行建模的方法”,这些方法在来自输入样本的目标变量的不同推理路径中被重用[15]。
虽然这些概念通常通过深度学习中隐藏神经元/层的计算来实例化,但这种分层抽象对于人类思维和逻辑推理来说通常也很常见。
- 事实上,逻辑是从更简单的前提中以层次(嵌套)的方式演绎有用概念的科学。当在逻辑中构造一个证明时,辅助引理经常被创建来以非常相似的方式在范围上降低理论的复杂性。
因此,虽然抽象的层次级别通常由神经网络的隐藏层表示,但它们也可以被认为是"复杂的命题公式,重用了许多子公式 "
(引自 Y. Bengio 的《学习 AI 的深度架构》摘要【15】)。
从 NSI 的角度来看,这不仅仅是一些隐喻,而是反映这种范式的许多实际系统在整个 90 年代继续明确地展示了逻辑推理的层次结构和经典神经网络之间的对应关系,例如流行的基于知识的人工神经网络(KBANN) [16]。
KBANN 方法的例子:(a)命题规则集;(b)被视为与或依赖图的规则;每个命题被表示为一个单元(额外的单元也被添加以表示析取定义,例如 b),并且它们的权重和偏差被设置为使得它们实现 and 或 or 门,例如,权重 b->a 和 c->a 被设置为 4,单元 a 的偏差(阈值)被设置为-6;(d)在各层之间添加低权重链接作为未来学习的基础(例如,可以通过增加这些权重中的一个来向规则添加前提)。由理查德·麦克林拍摄的图片,配有原始说明。
- KBANN 是一个建立在连接主义学习技术之上的混合学习系统,它按照所提出的精神,将由命题逻辑程序表示的特定于问题的“领域理论”映射到前馈神经网络,然后使用反向传播来提炼这个重构的知识。
这个想法后来也通过提供从学习网络中提取符号知识的相应算法得到了扩展,完成了在 NSI 社区中被称为“神经符号学习循环”的过程。
神经符号学习循环的概念。首先,数据(D)用于创建或学习(P)符号模型(S)。然后,这被翻译(R)成神经网络(N),在该神经网络上执行结构(T)和权重(W)学习改进,并且符号模型被提取(E)回来。然后,循环可以继续迭代地改进模型。图片由作者的同事 Martin Svatos 从[18]获得,在那里对该想法进行了实验评估。
然而,正如本吉奥所想象的那样,这种直接的神经-符号对应不可避免地局限于前述的命题逻辑设置。由于缺乏用关系逻辑表示对涉及抽象知识的复杂现实生活问题建模的能力(在我们的上一篇文章中解释过),命题神经-符号整合的研究仍然是一个小领域。
关系级 NSI 的问题
虽然前面提到的命题逻辑公式和神经网络之间的对应非常直接,但将相同的原理转移到关系设置中是 NSI 研究人员传统上一直在努力应对的一个主要挑战。问题是,在命题设置中,只有现有输入命题的(二进制)值在变化,而逻辑程序的结构是固定的。
这很容易被认为是位于命题解释(特征向量)之上的布尔电路(神经网络)。然而,相关的程序输入解释不再被认为是固定(有限)数量的命题上的独立值,而是给定世界中真实的相关的事实的无界集合(“最小 Herbrand 模型”)。因此,在这种表示之上的逻辑推理的结构也不能再由固定的布尔电路来表示。
- 因此,核心障碍是,还是,将关系推理结构的可能无限变化编码成神经网络的某个有限的固定结构。⁹
经典神经网络无法捕捉命题表达之外的逻辑推理,这种情况通常被称为命题固定,由约翰·麦卡锡创造【20】。
从那时起,NSI 社区提出了许多理论观点来处理关系逻辑的非约束性质,然而,这些理论观点比上面概述的基于知识的神经网络建模方法更加奇特,并且从未真正在实践中得到广泛采用。
从更实际的角度来看,许多成功的 NSI 作品利用各种形式的命题化(和“张量化”)将关系问题转化为方便的数字表示[24]。然而,这种基于固定大小的数字向量(或张量)表示的方法有一个原则性的问题,因为它们本质上不足以捕捉关系逻辑推理的无约束结构。因此,所有这些方法仅仅是真实的底层关系语义的*似。
- 请注意,这个问题与上一篇文章中讨论的关系学习问题密切相关。毫不奇怪,为了用神经网络捕捉关系逻辑表达,许多 NSI 研究人员转向了 ML 从业者用来处理关系数据表示的类似技术(例如,命题化)。
动态神经计算
然而,与此同时,一种基于 动态计算图 的新的神经架构流在现代深度学习中变得流行,以处理各种序列、集合和树的(非命题)形式的结构化数据。最*,对任意(不规则)图的扩展变得非常流行,成为图神经网络 (GNNs)。
这些动态模型最终能够跳过将关系表示(如关系逻辑程序的解释)转换为固定大小的向量(张量)格式的预处理步骤。它们通过将输入数据结构中的变化有效地反映到神经模型自身结构中的变化中来实现,其中受反映相应模型先验的某个共享参数化(对称)方案的约束。
虽然到目前为止介绍的特定动态深度学习模型,如 GNNs,仍然只是某种程度上特定的图传播试探法,而不是通用的(逻辑)推理器,但动态神经计算的范式最终打开了一扇门,以正确反映神经网络中的关系逻辑推理,在上面概述的命题 NSI(例如,KBANN)的经典精神中。⁵
在下一篇文章的中,我们将探索如何用这种动态神经建模方法来实现广受欢迎的关系型 NSI。特别是,我们将展示如何使神经网络直接学习 关系 逻辑表示(超越图形和 GNNs),最终受益于 ML 和 AI 的符号和深度学习方法。
[1]麦卡洛克,沃伦和沃尔特皮茨。"对神经活动中固有思想的逻辑演算."数学生物物理学通报 5.4(1943):115–133。
[2] Hinton,Geoffrey 等人,“用于语音识别声学建模的深度神经网络:四个研究小组的共同观点” IEEE 信号处理杂志29.6(2012):82–97。
[3] LeCun,Yann 等,“基于梯度的学习在文档识别中的应用”美国电气和电子工程师学会会议录 86.11(1998):2278–2324。
4.我们在这里强调 CNN,因为它们的原则在的后续文章【T5(s)】中会更加重要。
[5]福岛、国彦和三宅一生。" Neocognitron:视觉模式识别机制的自组织神经网络模型."神经网络中的竞争与合作。施普林格,柏林,海德堡,1982。267–285.
[6]翁、鞠扬、纳伦德拉·阿胡贾和黄煦涛。" Cresceptron:自适应增长的自组织神经网络."【Proceedings 1992】ij CNN 国际神经网络联合会议。第一卷。IEEE,1992 年。
7.请注意,在这里,在归纳逻辑编程方法中使用背景知识与关系 ML 相似。
8.虽然许多宣誓的深度学习支持者会争辩说,不应该有这样的先验偏见,所有的知识都应该直接从原始数据中学习,但基于深度学习主导特征工程的先例,看看 CNN 也许是有益的,它以翻译不变性的形式准确地编码了这样的结构偏见。
[9]加里·马库斯。"人工智能的下一个十年:迈向强大人工智能的四个步骤."arXiv 预印本 arXiv:2002.06177 (2020)。
10.然而,经典神经模型的黑盒性质(对其学习能力的大多数确认是通过经验而非分析完成的)使得与符号系统的一些直接集成(可能提供缺失的能力)变得相当复杂。
从统计关系到神经符号人工智能。arXiv 预印本 arXiv:2003.08316 (2020)。
[12] Besold,Tarek R .等人,“神经符号学习和推理:调查和解释” arXiv 预印本 arXiv:1711.03902 (2017)。
[13]马丁,克鲁茨基。探索深度学习中的对称性。理学学士论文。布拉格的捷克技术大学,2021。
14.有趣的是,我们注意到,即使在现代深度学习中,简单的逻辑异或函数实际上仍然很难正确学习,我们将在后续文章中讨论这一点。
[15]本吉奥,约舒阿。学习人工智能的深度架构。现在出版公司,2009 年。
16 Towell,Geoffrey G .和 Jude W. Shavlik。"基于知识的人工神经网络."人工智能70.1–2(1994):119–165。
[17]麦克林,理查德 F. 从指导和经验中学习:将过程域理论整合到基于知识的神经网络中的方法。威斯康星大学麦迪逊分校计算机科学系,1995 年。
[18] Svatos,Martin 和 Sourek,Gustav 和 Zelezny,Filip。"重温神经符号学习循环."神经-符号整合研讨会@ IJCA,2019 年。
19.注意与我们在上一篇文章中讨论的命题和关系机器学习的相似性。
[20]约翰·麦卡锡。"联结主义的认识论挑战."行为和脑科学 11.1(1988):44–44。
21.然而,公*地说,这是任何标准学习模型的情况,例如支持向量机或树集成,它们本质上也是命题的。
22.例如,一个突出的想法是用实数(向量)对逻辑程序的(可能是无限的)解释结构进行编码,并基于通用*似定理将关系推理表示为它们之间的(黑盒)映射。然而,这假设未绑定的关系信息隐藏在基础实数的未绑定的小数部分中,这对于任何基于梯度的学习来说自然是完全不切实际的。
23.我们注意到,这是当时的状况,*年来情况发生了相当大的变化,一些现代国家统计机构的办法现在相当恰当地处理了这个问题。
[24]frana、Manoel VM、Gerson Zaverucha 和 Artur S. d'Avila Garcez。"使用人工神经网络的底部子句命题化的快速关系学习."机器学习94.1(2014):81–104。
25.同时,GNNs 最*也被 NSI 社区认为是一个有前途的未来方向:
Lamb,Luis C .等.图形神经网络与神经符号计算相遇:综述与展望。“arXiv 预印本 arXiv:2003.00330 (2020)。
什么是无代码数据科学,它是否意味着不再需要数据科学家了?
意见
无代码数据科学*台可以为数据科学项目带来新的未来
Dion Tavenier 在 Unsplash 上拍摄的照片
就像科技领域的其他专业一样,数据科学在某个时候注定会发展。
这些演变中最*的一次涉及到无代码运动。
*几十年来,无代码*台为各种技术领域提供了拖放式编码服务,其中许多简化了公司的网站和软件开发要求。无代码*台让个人有机会创建自己的网站或开发自己的软件,而无需了解一点代码。
或许令人惊讶的是,由于其复杂性,无代码*台已经开始提供以数据为中心的服务,包括公司开始进行数据分析或开发机器学习模型的机会,而无需了解数据科学的复杂性。
自然,这引发了一个问题:随着无代码数据科学服务的不断改进,对数据科学家的需求是否会消失?无代码数据科学服务似乎为每个人提供了机会,无论其背景或教育程度如何,都能够开展数据科学活动。然而,您可能会惊讶地发现,数据科学家甚至可以使用无代码数据科学*台来提高他们的工作流程效率,并跟上公司不断增长的需求。
什么是无代码数据科学?
无代码数据科学涉及使用图形用户界面中呈现的模板、逻辑序列和拖放功能来处理和操纵数据,以产生数据分析、机器学习模型、数据转换等。
传统上,任何数据科学工作都需要通过使用 Python、R、SQL 或各种其他编码语言编写代码来完成。然而,无代码能力允许任何人在不使用任何代码的情况下执行数据操作。无代码工具通过在一个简单的图形界面中展示它们的功能来利用代码的力量,该界面允许用户专注于设计和逻辑,而不会被从头编写代码带来的复杂性所困扰。
无代码*台通过四种重要方法执行其功能:
- 通过拖放技术提供开发、更改或实现流程的可视化或图形化方式。
- 创建可用于定制流程或深入了解给定数据集的数据过滤器和查询。
- 使用 API 从各种来源收集数据进行分析。
- 让非技术人员能够以一半的学习曲线和同样的灵活性和能力开展数据科学活动。
无代码数据科学能提供什么样的未来?
无代码数据科学允许团队更快地移动并使用更便宜的资源
如上所述,无代码数据科学*台的易用性和简单性使个人用户和整个团队能够更快地行动,并使用更便宜的资源来开展数据相关活动。
无代码数据*台允许团队以比手工编写代码更快的速度讨论和处理数据。不仅如此,当具有现有数据科学背景的用户使用时,无代码*台可以通过自动化重复和耗时的任务来提高团队的生产力,从而让用户专注于产生更大投资回报的活动。
对于那些没有数据科学背景的人来说,无代码*台允许个人使用简单的拖放功能从事数据驱动的活动,这些功能负责数据的收集、清理、分析和呈现。目前市场上的许多无代码*台允许任何人发现对他们数据的见解,这为较小的公司提供了一个廉价的替代方案,以雇佣一个专业的数据科学家团队。
无代码数据科学可以跟上数据科学项目指数级增长的需求
“数据是新的石油”,这意味着随着一切事物的数据变得越来越容易获取,未来几十年对数据科学项目的需求将呈指数级增长。
感谢无代码数据*台为数据科学家和非数据科学家提供的速度和轻松,这些分析的需求将能够通过产生结果的适当级别的攻击来满足。
此外,无代码数据科学将为组织内的每个部门提供简单的数据科学能力,这些部门希望解决问题或开发对使用数据的流程的理解。越来越多的非技术人员将开始需要数据分析能力作为他们日常工作的一部分,这意味着无代码数据*台将对一个组织的日常运营变得更加重要。由于学习曲线较低,任何人都将能够快速高效地进行价值生成分析,而不必回到学校学习数据科学。
无代码数据科学选项为公司提供了测试数据驱动解决方案的能力,而无需大量投入
或许,无代码数据解决方案所能提供的最大未来是,组织能够测试出数据驱动的解决方案,而无需大量投入。
通常情况下,组织会投资于数据驱动的项目,该项目有望解决所有问题,优化日常流程,并节省大量资金。不幸的是,组织试图解决的问题往往定义不清,让数据科学家在没有具体想法的情况下使用数据解决棘手的问题。然而,无代码数据科学可以让数据科学团队能够快速有效地产生问题的解决方案,并将其提交给组织,以查看这是否是他们正在寻找的。这不仅允许组织测试不同的解决方案或快速尝试解决问题,还允许他们这样做,而不必在为期六个月的数据科学项目上投入大量资金,最终产生冲突或错误的结果。
此外,无代码数据科学使小型企业能够有效地分析他们的数据,而不必承诺雇用整个数据科学家团队。这有助于小型企业了解如何改善日常运营和增加收入,而不必花钱接受数据科学教育或在团队中增加一名六位数的数据科学家。
无代码数据科学是否意味着数据科学家的终结?
不编码并不意味着知道如何编码的数据科学家会被淘汰。事实上,恰恰相反。
无代码*台是使用代码创建的,这意味着数据科学家将有更多的工作机会,而不仅仅是执行典型的数据科学任务。数据科学家现在可以选择使用他们的技能和专业知识为创建这些无代码解决方案的公司工作。知识渊博的数据科学家将能够利用他们的经验为该领域找到更好的解决方案,包括开发为每个人提供数据科学能力的无代码解决方案。
此外,熟练的数据科学家可以使用无代码数据科学*台来处理数据,速度比传统工作方式快得多,并且还允许数据科学家完善他们的逻辑,产生更多数据相关项目的输出,还可以测试数据驱动的解决方案,而无需在项目得到证明之前就大量投入项目。
此外,无代码数据*台可以自动完成繁琐的任务,这些任务常常会迫使数据科学家辞职。这些单调的任务是工作的自然组成部分,可以由无代码系统完全快速地处理,使数据科学家在一天中有更多的时间专注于更令人兴奋的工作方面。根据帕累托原理,数据科学家对公司的影响有 80%是通过他们 20%的日常任务实现的。通过消除 80%的冗余或繁琐的工作,数据科学家将有更多的时间致力于提供最大投资回报的任务。
最后的想法
无代码数据科学不应该吓到现有的数据科学家——如果有的话,它应该让他们兴奋,因为未来可以摆脱单调、耗时的任务。
无代码数据科学几乎不会终结数据科学家的存在,相反,它提供了快速、高效的工具,可以提高公司内数据科学家的生产力和影响力。
此外,无代码数据*台为每个人,无论是否有数据科学背景,都提供了获得数据驱动的见解的机会,而不必花钱接受进一步的教育或参加训练营。
无代码数据*台还可以帮助组织更快地移动,使用更少的资源来开发数据洞察力,允许公司内的数据科学团队跟上数据相关项目的指数级增长需求,并让公司有机会测试数据驱动的解决方案,而无需大量投入。
订阅让我的故事直接发到你的收件箱:故事订阅
请成为会员,使用我的推荐链接获得无限制的媒体访问权限(我将免费向您收取少量佣金):媒体会员
通过捐赠来支持我的写作,以资助更多像这样的故事的创作:捐赠
什么是 ODBC?
了解数据库管理系统的 API
卡斯帕·卡米尔·鲁宾在 Unsplash 上的照片
开放式数据库连接(简称:ODBC)是一个用于 SQL 数据库的标准化接口,允许人们访问不同的数据库管理系统并执行查询。目标是拥有一个独立于所选数据库工作的编程接口,从而可以连接到各种现有的数据库。
开放式数据库连接是如何工作的?
ODBC 于 1992 年首次推出。当时很难在数据库和应用程序之间建立通信,因为没有可用的标准化工具。
ODBC 的发展使得编写独立于数据库的应用程序成为可能。为此,使用了因数据库而异的驱动程序。他们将一般的查询翻译成关系数据库的特定语言。因此,还必须为每个数据存储安装单独的驱动程序。
这允许程序员提出一个标准的开放式数据库连接数据请求,然后根据驱动程序为正在使用的数据库进行翻译,例如 MySQL 。此外,对存储器的访问权限也存储在驱动程序中,例如用户名和密码。
ODBC 在哪个架构中使用?
假设一个应用程序使用来自两个不同关系数据库的数据,比如 MySQL 和 PostgreSQL。两个数据存储都包含只有在合并后才有价值的信息。但是,不可能将两个表存储在同一个数据库中。
ODBC 可以用来直接查询和合并数据,而不是费力地从一个表中复制信息并将其连接到另一个数据库。这是通过在数据库服务器上安装适当的驱动程序来实现的。然后,使用 SQL 查询,可以根据需要读取和合并信息。从该接口,合并的数据可以被进一步处理或转发。
用起来有什么好处和坏处?
ODBC 为开发人员提供了编写通用应用程序的可能性,因为它们独立于具体的数据库。只要内存遵循关系概念,接口就是可用的。如果一个人想要编程软件并出售它,这是特别有利的。
同时,人们可以用几个不同的应用程序访问同一个开放式数据库连接接口,因此更加灵活。然而,这种高灵活性的缺点是查询有时加载相对较慢,这会延迟事务的执行。因此,它不太适合加载时间非常重要的高性能应用。
此外,一些准备工作是必要的,以充分利用开放的数据库连接。对于每个数据源,必须安装适当的驱动程序,每个数据源的驱动程序各不相同。在复杂的系统环境中,这有时会很复杂,驱动程序也必须定期更新。
此外,驱动程序基于微软和 Windows。尽管 Linux 和 macOS *台的驱动程序已经同时添加,但在个别情况下可能会出现问题,因为 ODBC 是为 Windows 开发和优化的。
OLEDB 是什么?
OLEDB 也是微软开发的,为数据库提供应用编程接口(简称:API)。它提供了与 ODBC 相同的可能性,因此也被认为是开放式数据库连接的继承者。然而,它可以在更高的层次上获取数据,从而也可以查询非关系数据库,这被认为是相对于 ODBC 的一大优势。
一旦应用程序访问多个数据库(不仅仅是关系数据库),就应该使用 OLEDB。
这是你应该带走的东西
- ODBC 是关系数据库的标准化接口,它允许编程不依赖于特定数据库技术的应用程序。
- 这个接口为程序员提供了以简单和不复杂的方式组合几个数据库及其信息的可能性。
- 但是,使用它会导致比直接访问更长查询时间。此外,系统必须预先为数据库配备适当的驱动程序。
如果你喜欢我的作品,请在这里订阅https://medium.com/subscribe/@niklas_lang或者查看我的网站* 数据大本营 !还有,medium 允许你每月免费阅读 3 篇 。如果你希望有无限制的 访问我的文章和数以千计的精彩文章,不要犹豫,点击我的推荐链接:【https://medium.com/@niklas_lang/membership】每月花$5***获得会员资格**
* *
机器学习中什么是过拟合?
原文:https://towardsdatascience.com/what-is-overfitting-in-machine-learning-dc7e4de1c892
了解过度合身的基本知识
安妮·斯普拉特在 Unsplash 上的照片
过度拟合是数据科学领域的一个术语,描述了模型过于适应训练数据集的特性。因此,该模型在新的、看不见的数据上表现不佳。然而,机器学习模型的目标是一个很好的泛化,所以新数据的预测成为可能。
什么是过度拟合?
术语“过度拟合”用在预测模型的上下文中,这些模型对于训练数据集来说过于具体,因此会学习数据的分散性。当模型对于底层数据来说结构过于复杂时,通常会出现这种情况。问题在于,经过训练的模型泛化能力很差,也就是说,对新的、看不见的数据提供的预测不充分。另一方面,在训练数据集上的性能非常好,这就是为什么人们可以假定模型质量很高。
一些因素可能预示着早期即将过度拟合:
- 小数据集:如果训练中只有几个单独的数据集,那么这些数据集很有可能只是被记住了,而且可用的信息太少,无法学习底层结构。模型的训练参数越多,问题就越多。例如,一个神经网络在每个隐藏层上都有大量的参数。因此,模型越复杂,数据集就应该越大。
- 训练数据集的选择:如果数据集的选择已经不*衡,那么很有可能模型会对其进行训练,从而泛化能力较差。从人群中抽取的样本应始终随机选取,以避免出现选择偏差。为了在选举期间进行推断,不仅应该调查一个投票站的选民,因为他们不能代表整个国家,而只能代表该选区的意见。
- 多个训练时期:一个模型训练几个时期,每个时期的目标是进一步最小化损失函数,从而提高模型的质量。然而,在某一点上,只有通过更多地适应训练数据集才能实现反向传播的改进。
如何识别过度拟合?
不幸的是,没有一个中心分析可以确定一个模型是否过度拟合。然而,有一些参数和分析可以提供即将发生的过度拟合的指示。最好也是最简单的方法是查看迭代过程中模型的误差曲线。
如果训练数据集中的误差继续减小,但验证数据集中的误差又开始增大,这表明模型与训练数据太接*,因此泛化能力很差。可以用损失函数进行相同的评估。
为了构建这样一个图,你需要所谓的验证或测试集,即模型的看不见的数据。如果数据集足够大,通常可以分割出 20–30%的数据集,并将其用作测试数据集。否则,也有可能使用所谓的 k 倍交叉验证,这在某种程度上更复杂,因此也可用于较小的数据集。
数据集被分成 k 个大小相等的块。随机选择其中一个块作为测试数据集,其他块依次作为训练数据。然而,在第二训练步骤中,另一个块被定义为测试数据,并且重复该过程。
k 倍交叉验证示例|来源:作者
块的数量 k 可以任意选择,并且在大多数情况下,选择 5 到 10 之间的值。过大的值会导致模型偏差较小,但过度拟合的风险会增加。太小的 k 值会导致更有偏差的模型,因为它实际上对应于保留方法。
如何防止过度拟合?
有许多不同的方法可以防止过度拟合,或者至少降低过度拟合的可能性。根据以下建议,在许多情况下,两个就足以降低过度拟合的风险:
- 数据集:数据集在避免过拟合方面起着非常重要的作用。它应该尽可能大,包含不同的数据。此外,应该在数据准备过程中花费足够的时间。如果不正确或缺失的数据出现得太频繁,复杂性就会增加,过度拟合的风险也会相应增加。另一方面,干净的数据集使模型更容易识别底层结构。
- 数据扩充:在许多应用中,例如图像识别,使用单独的数据集,并将其稍加修改后提供给模型用于训练。例如,这些更改可以是图像的黑白副本,也可以是带有一些拼写错误的相同文本。这使得模型更加稳定,并帮助它学习处理数据变化,变得更加独立于原始训练数据集。
- 停止规则:当开始一个模型时,你指定一个最大的历元数,在此之后训练结束。此外,在早期阶段停止训练可能是有意义的,例如,如果它在几个时期内没有取得任何实际进展(损失函数不再减小),因此存在模型陷入过拟合的风险。在 TensorFlow 中,可以为此定义单独的回调:
callback = tf.keras.callbacks.EarlyStopping(monitor='loss', patience=3)
- 特征选择:数据集通常包含各种作为模型输入的特征。当模型不够复杂以至于不能代表底层结构时,就会出现这种欠拟合。另一个问题可能是计算关系所需的数据集中缺少重要的特征。然而,并非所有这些都是预测正确结果所真正需要的。一些特征甚至可能相关,即相互依赖。如果有大量特征可用,则应借助合适的算法进行预选。否则,模型的复杂性增加,过度拟合的风险也很高。
过度拟合与欠拟合
然而,在避免过度拟合时必须小心,因为它也可能漂移到另一个极端,即所谓的欠拟合。当模型不能从给定的数据中识别出潜在的结构时,我们称之为欠拟合,因此在泛化方面的结果也很差。可以通过训练误差停滞在高水*并且不再降低的事实来识别拟合不足。
当模型不够复杂以至于不能代表底层结构时,就会出现这种欠拟合。另一个问题可能是计算关系所需的数据集中缺少重要的特征。
这是你应该带走的东西
- 过度拟合是数据科学领域中的一个术语,它描述了一个模型的属性,即它对训练数据集的适应性太强。
- 通常可以通过测试数据集中的误差再次增加,而训练数据集中的误差继续减少这一事实来识别。
- 其中,可以通过插入早期停止规则或通过提前从数据集中移除与其他特征相关的特征来防止过度拟合。
如果你喜欢我的作品,请在这里订阅https://medium.com/subscribe/@niklas_lang或者查看我的网站* 数据大本营 !还有,medium 允许你每月免费阅读 3 篇 。如果你希望有无限制的 访问我的文章和数以千计的精彩文章,不要犹豫,点击我的推荐链接:【https://medium.com/@niklas_lang/membership】每月花$5***获得会员资格**
* *
如何使用量子神经网络模型对加密数据进行分类
量子机器学习初学者指南
经许可使用,来源
自然不是经典的,该死的,如果你想模拟自然,你最好做量子力学的!
——理查德·费曼
量子计算机是一种新型的高级计算机,它依靠量子力学定律来解决经典计算机无法解决的问题。我们现在正在进入一个激动人心的时代,量子计算机正在变得强大和高性能,足以在几分之一秒内完成传统计算机需要几年才能完成的任务!
例如:谷歌的 Sycamore 量子处理器拥有大约 50 个量子位,能够在几百秒内完成一次超级计算机需要 9000 多年才能完成的计算!这是嘈杂的中等规模量子 (NISQ)计算时代的开始,在未来的几年里,具有数百个量子位的量子硬件有望出现,从而使各种量子算法,如肖尔的因式分解算法或格罗弗的搜索算法得以大规模实施。
量子计算机具有巨大的潜力来解决优化、量子模拟、机器学习和密码学等学科中一些最具挑战性的问题,因为它们以量子形式存储和处理数据。在本文中,我们将讨论量子机器学习,并将构建一个量子神经网络模型,该模型可以以超过 90 %的准确率对加密的手写数字图像进行分类!
什么是量子机器学习(QML)?
量子机器学习通过利用量子计算的潜力,加速和改进在我们每天使用的“经典”计算机上进行的机器学习。他们使用在量子设备(如量子计算机)上执行的算法来补充、加速或支持传统机器学习程序执行的工作。下面是量子机器学习的几个应用:
- 新型机器学习算法的设计。
- 量子神经网络的发展,它可以用很少的步骤和灵活的处理能力发挥作用。
- 使用量子放大强化学习,其中机器学习的算法通过与量子环境交互来获取知识
- 可以提高识别和分类模式的能力。
在深入构建量子神经网络模型之前,我们必须了解量子力学和量子计算的一些基本原理。
量子位和叠加
与经典计算机不同,量子计算机使用量子位,或量子位来存储数据,这是利用量子物理定律来操纵的。一个量子位可以同时有几种状态,取值范围从 0 到 1,不像一个比特只能有两种状态(0 或 1)。让我们借助一个例子来理解这一点:
想象一下,扔一枚有两面的硬币——正面(1)和反面(0)。在扔硬币的过程中,我们无法决定硬币的方向,除非我们阻止它,或者它掉在地上。通过参考下面的抛硬币,我们可以说,根据我们的观点,它有两种状态。
经许可使用
一个量子系统在被测量之前处于多个状态的这种能力,被称为两个状态的 叠加 。叠加时测到 0 或 1 的概率既不是 0.0 也不是 1.0。简单地说,一个量子位同时处于多种状态,当叠加态崩溃时,它只能处于单一状态(掷硬币实验中的正面或反面)。
布雷克记号
在量子力学中, Bra-ket 记号(也称为 Dirac 记号)用于描述由尖括号(**〉和竖线(|)组成的量子态,并用于构造 bras 和 kets。**
例如:
〈x|
这叫做 胸罩 ,它在数学上表示一个线性函数
x: V → C
这是一个线性映射,将 V 中的每一个向量映射到复*面 C 中的一个数。
|y 〉
这被称为 ket ,数学上它表示复向量空间 V. 中的一个向量 y
这是当一个线性函数(x |)应用于一个向量( |y 〉 )时的样子。
】x | y〉⍷c
使用 Bra-ket 符号,我们可以表示量子位的叠加态:
- 测量前:|ψ〉=α| 0〉+β| 1〉**
- 测量后:| 0〉或 |1 〉
布洛赫球
作者创建的图像
受启发来源
使用 布洛赫球 对量子位进行数学符号化。典型长度为 1 的二维向量用于表示量子位的状态。这个向量由两个元素组成——一个实数 α 和一个复数 β 。
量子纠缠
在距离的鬼魅动作!
—阿尔伯特·爱因斯坦
当物体变得极小或达到量子领域时,会出现一种奇异的现象,这就是量子纠缠。让我们用一个例子来为量子位理解这一点:想象有一个盒子,里面有一双鞋。我们从箱子里取出一只鞋,然后把剩下的箱子运到另一个国家。后来发现,选择的鞋子是正确的;因此,无论我们把盒子里的鞋子放在哪里,它永远都是左边的那只。
与此类似,如果我们取两个量子比特,其中一个处于自旋向上的位置,我们可能确定另一个处于自旋向下的位置。不存在两个量子位处于相同位置的情况。这就是所谓的 量子纠缠 。
量子退相干
量子退相干是量子系统的信息因系统与其环境的相互作用而改变的过程。量子比特叠加会导致量子退相干之类的问题。这些不必要的坍塌不规则地、有机地发生,作为最终导致计算误差的系统扰动的结果。当我们对一个我们认为处于叠加态但实际上不是的量子比特进行操作时,结果不会是我们所预期的那样。这就是为什么我们重复运行相同的程序。
量子编程的目的是控制你的量子位的量子状态,以达到对感兴趣的特定问题的解决方案。制作量子电路是量子计算机编程的初始阶段。一旦我们选择了一个特定的问题,并确定了量子计算机将如何解决它,我们就需要构建一个电路,概述一组将在量子计算机中的量子位上执行的操作。
一般来说,量子电路是展示如何在量子计算机上进行量子计算来解决给定问题的图。这是一个量子电路的例子:
N. David Mermin 的《量子计算机科学——简介》第 53 页,经许可方许可转载
这个图表就像一张乐谱一样,从左到右阅读。图中的盒子代表应用于一个或多个量子位的量子门,这取决于一个盒子连接了多少根导线。量子门是告诉量子计算机发送控制信号的指令,以便对量子比特执行特定的量子动作。如果我们有一个量子电路图,我们可以用它向我们的量子计算硬件发送微波脉冲和指令,然后它将执行量子门并读出结果。
量子电路图可能看起来很吸引人,但是如果我们必须为在量子计算机上执行的每个量子计算创建图表,并且如果我们的量子程序特别长,那么它将变得非常难以完成。为了解决这个问题,研究人员已经创建了框架来创建描述量子电路的更传统风格的程序。我们可以使用各种框架来构建量子电路,包括 Qibo 、 Pennylane 、 Qiskit 、 Cirq 和草莓地。今天我们将学习如何使用 Cirq 创建一个量子电路!
让我们构建我们之前看到的相同的量子电路!
注:
上面的量子电路图描述了Bernstein–vazi rani算法的一个实例。
在开始之前,请确保使用以下命令安装 cirq:
此外,导入它将允许您确定它是否安装正确:
先说电路的结构。正如我们看到的,总共有 6 个量子位,让我们逐个创建它们:
注意:
由于在 python 中索引是从 0 开始的,所以我将我的量子位命名为 qubit_0、qubit_1 等等。
您可以通过简单地打印来检查您的初始化量子位:
这种制造量子位的方法并不总是可行的。如果我们想要创造数百个量子位而不是几个呢?
嗯,我们可以通过使用range
函数来做到这一点,它创建了一个提到的量子位数量的列表。
有时,我们可能更关心量子电路在一个量子位网格上的功能,而不是一行量子位。此外,当使用量子硬件时,这变得尤其重要。这是谷歌 Sycamore 量子处理器的图像和处理器上物理量子位网格的图像:
经许可使用,来源
经许可使用,来源
当定义量子硬件的操作时,我们将使用类似于上图所示的量子位网格。
在 Cirq 中,我们可以使用以下命令创建一个量子位网格:
与线量子位相比,对于网格量子位,我们需要提到两个参数而不是一个——X 坐标和 Y 坐标,以指定 X-Y *面中量子位的位置。
我们也可以创造不同形状的量子位,像长方形和正方形。
同样,我们以正方形的方式创建网格量子位:
在这里,我们可以看到量子位是以矩形和正方形网格形状生成的,其中“cirq”中的x
和y
。GridQubit(x,y)"表示 x 坐标和 y 坐标。
让我们回到构建我们的量子电路。在我们的量子电路中,我们可以看到有两种类型的方盒子,标记为 H — 代表 阿达玛 门, X — 代表 CNOT(受控非) 门。如果你希望了解更多关于量子门的知识,请参考这篇。
如果我们仔细看看我们的量子电路图,我们可以看到所有的量子位都已经初始化为状态 0,除了最后一个,它已经初始化为状态 1。在 Cirq 中,默认情况下,状态被初始化为状态 0,因此我们不需要对前五个量子位进行任何更改,除了最后一个需要从 0 翻转到 1。在量子计算中,这可以通过应用 X 门来实现。
在上面的代码中,我们首先创建了一个电路,在最后一个量子位上应用了一个 X 门,然后我们将 H 门应用于它们中的每一个。我们可以做一个循环来加速这个过程,而不是一次应用一个门。
接下来,我们可以看到有一系列的 CNOT 门,从量子位 4 到量子位 5,量子位 1 到量子位 5,量子位 0 到量子位 5。
最后,我们应用六个 哈达玛 门。
嗯,这个电路图看起来不像预期的,对吧?我们可以看到所有的哈达玛门都尽可能地放在左边。这是因为每当我们向量子位添加新操作时,Cirq 默认使用这种插入策略。但是如果我们不想使用这个默认的插入策略呢?
我们可以通过明确定义所需的力矩的数量来做到这一点。让我们从头开始:
现在我们可以看到,我们的量子电路与图表中的电路完全匹配!
既然我们的量子电路现在已经准备好了,那就让我们在一台完美的量子计算机上模拟一下吧!该模拟基本上给出了在应用相应的门之后关于量子位的状态的信息,因此我们需要的结果应该是 1、1、0、0、1 和 1。
现在我们已经完全具备了所有需要的知识和技能,让我们开始构建一个量子神经网络模型,使用 TensorFlow Quantum 对手写数字的加密图像进行分类!
经许可方许可,通过 PLSclearLet 进行复制。从安装和配置必要的软件包开始!!
注意: TensorFlow Quantum 需要 TensorFlow 版本 2.7.0,因此在虚拟环境或 Google Colab 中工作是可行的。
导入必要的包:
更新包资源以管理版本更改:
考虑到 MNIST 数据集包含 60,000 幅图像,为了节省时间,我们将处理二进制分类,这将对数字 3 和 6 进行分类,而不是多分类(数字 0-9)。
注:
下面的量子神经网络模型是基于这篇由谷歌和麻省理工学院(MIT)联合发表的研究论文。
数据预处理 :
现在让我们创建一个只保留数字 3 和 6 的函数。此外,由于这种分类是二进制的,我们将把它转换为 True (3)和 False (6)。将其转换为 0 和 1 是实现这一点的另一种方法。
让我们看看第一个例子:
经许可使用,(邓梨,“用于机器学习研究的手写数字图像 mnist 数据库”)来源
目前,我们的图像大小为 28 x 28 像素,当前的量子计算机不足以处理它。因此,我们必须将它缩小到 4 x 4 像素的大小。
经许可使用,(邓梨,“用于机器学习研究的手写数字图像 mnist 数据库”),来源
根据这篇研究论文的第 3.3 节,数字 3 由 797 个不同的 16 位字符串组成,数字 6 由 617 个不同的 16 位字符串组成,197 个不同的图像被标记为 3 和 6。因此,我们需要通过消除矛盾的例子或属于两类的图像来过滤数据集。
注:
结果可能不一定与研究论文中提到的报告结果相符。
如前所述,在量子计算机上处理任何事情都需要通过量子电路,图像也不例外。根据论文,已经用一个量子位来表示每个像素,状态根据像素的值而变化。将信息转换成二进制编码是实现这一目标的第一步。
现在,我们将把我们的训练集和测试集转换成量子电路。此外,像素索引值超过阈值的量子位通过 X 门旋转。
图片由作者提供,灵感来自来源
图片由作者提供,灵感来自来源
注意:
通过使用
SVGCircuit
,我们可以用一种更吸引人的方式来描绘我们的量子电路
由于普通大众无法使用量子计算机,我们将使用模拟全连接、无噪声量子系统的模拟器。尽管事实上我们正在模拟一台量子计算机,但模拟所需的所有计算都将在经典计算机上进行。由于计算变得太复杂,经典计算机无法处理,我们将把量子电路转换成张量。
量子神经网络模型:
现在,数据预处理部分已经完成,让我们开始构建我们自己的量子神经网络模型!
由于分类是基于读出量子位的假设,我们将使用两个量子位,读出量子位总是起作用,正如在论文中提出的。
让我们创建一个示例电路层:
示例电路(图片来自作者,灵感来自来源)
现在,让我们创建一个与电路大小相同的模型,其中包括必要的操作。
将电路封装在 tfq-keras 模型中,该模型将从x_train_circuit
获得 量子数据 ,该数据将对经典数据进行编码。它使用参数化量子电路层在量子数据上训练模型电路。我们不会显式地模拟模型,因为每次使用模型(用于训练或测试)时都会进行模拟。模拟由参数化量子电路层(tfq.layers.PQC
)负责。
在编译我们的模型之前,我们需要注意两件事:
- 由于我们将使用铰链损失,我们需要将标签从布尔(真/假)转换为铰链损失所期望的
[-1,1]
。
2.我们将需要一个定制的hinge_accuracy
指标,因为我们使用的是铰链损耗的修改版本。
注意:
将输出范围更改为
[0, 1]
,并将其视为模型分配给类别 3 的概率,这是另一种可能的策略。对于这种方法,可以使用tf.losses.BinaryCrossentropy
loss。
训练模型:
注:
如果您没有足够的时间或计算能力,可以随意使用数据的子集进行训练。
让我们评估一下我们模型的准确性:
太棒了。🥳
我们现在有了一个量子神经网络模型,可以以大约 91 %的准确率对手写数字图像进行分类!
推论:
让我们在一个 加密的 图像上试验我们的模型,现在模型已经被创建、训练和评估了!
在执行推理之前,让我们编写一些必要的函数:
进口:
用于加密、解密、图像呈现和推断的功能:
注意:
出于本文的考虑,我将对图像进行加密和解密,但实际上数据可能已经加密了。
我们将使用 Fernet ,一个对称加密的实现,来加密图像。Fernet 可以通过 密码术 — 一个 Python 模块,让 Python 程序员可以访问密码原语。这是我的样本图像:
经许可使用,(邓梨,“用于机器学习研究的手写数字图像 mnist 数据库”),来源
加密图像:
注意:
这个秘密密钥只是为了本文而显示的;实际上,这应该是保密的。
加密后,我们将得到一个加密的图像和一个私钥:
现在我们有了一个加密的图像,让我们解密它并执行推理:
让我们检查一下我们是否得到了我们的解密图像:
经许可使用,(邓梨,“用于机器学习研究的手写数字图像 mnist 数据库”),来源
调整图像大小:
注意:
由于图像的大小不同于我们用来训练模型的图像,因此调整大小是必不可少的。
预处理和推断(预测):
好极了! 🥳
最后,我们有一个量子神经网络模型,可以以大约 91 %的准确率对手写数字的加密图像进行分类!
本文中使用的所有代码都可以在我的 GitHub 上找到。
GitHub 资源库链接:https://github.com/saurav935/Quantum-Machine-Learning
如果您希望了解更多关于此主题的信息,请随意浏览以下资源:
享受量子计算! ✌️
什么是关系机器学习?
原文:https://towardsdatascience.com/what-is-relational-machine-learning-afbe4a9c4231
走向 深度关系学习
深入研究特征向量之外的学习表示基础
关系学习旨在从具有 复杂 内部和/或外部关系的结构化数据中学习。(图片来自 pixabay )
从 AI 到 ML
所有智能生命形式都本能地模仿它们周围的环境,以便用它们的行动积极地在其中导航。在人工智能(AI)研究中,我们试图理解并自动化生命系统的这一有趣能力,以机器学习 (ML)为核心。
- 一般来说,推导复杂系统的数学模型是任何科学学科的核心。研究人员总是试图提出控制他们感兴趣的系统行为的方程,范围从物理、生物到经济学。
机器学习然后实例化搜索最适合观察数据的数学假设(模型)的科学方法。然而,由于计算的进步,它允许进一步自动化这一过程,以大量数据驱动的方式搜索大型预制假设空间。这在复杂系统的建模中特别有用,对于复杂系统,潜在假设空间的结构太复杂,或者甚至是未知的,但是大量数据是可用的。
- 公*地说,一种被称为“模型识别”的类似方法也是控制理论的传统部分,其中描述底层系统动态的微分方程的参数是从通常也是复杂的系统范围内测量的输入-输出数据中估计的。有了一个精确的模型,就可以得出最优的控制行为,从而引导系统朝着理想的目标度量发展,这很大程度上符合现在所谓的人工智能的精神(少用数学,多用宣传)。
特征向量的来源
虽然复杂系统的数学建模问题的方法以各种各样的、很大程度上独立的方式发展,但有一个方面仍然几乎是通用的——数据表示。事实上,虽然假设和模型的数学形式传统上变化很大,从控制理论中使用的分析表达式和微分方程,一直到现在 ML 中使用的决策树和神经网络,但输入输出观察传统上被限制为数字向量的形式。
这似乎很自然。自从计算机出现以来,我们已经非常习惯于将任何感兴趣的属性转化为数字,从物理测量,如力或电压,一直到颜色、情绪或对番茄酱而非芥末的偏好。
给定可以在感兴趣的系统上测量的多个这样的输入( X )和输出( Y )变量,从发电厂到人,然后每个这样的测量减少到特定的数字向量,通常称为 特征向量 。
但是还有另一个很好的理由来解释为什么特征向量非常吸引人。将每个数据样本(测量)视为 n 维空间中的一个独立点允许直接采用线性代数的标准机制,这是由来自其他领域的数百年的先前工程所证明的。
具有独立身份特征向量(n 维点)的经典机器学习“只是”多元统计...图片由作者提供。
由于这种假设从一些联合 Pxy 分布中独立相同地抽取(i.i.d .)样本的表示,机器学习研究也可以直接建立在来自概率浓度界限(例如 Hoeffding)的已知统计结果上,以提出“可能*似正确”(PAC)学习的标准 ML 理论。因此,许多经典的机器学习,至少在适当研究时,属于 多元统计 。
作为结果,任何经典的 ML 方法现在都期望以 表格 的形式输入数据,其中每一列对应于一个特征 X 或目标变量 Y ,每一行对应于单个示例测量。然后,最一般的任务是估计生成观察数据的联合概率分布 Pxy ,或者更常见地,在监督 ML 中,仅估计条件 Py|x 。这些也是统计学长期以来普遍研究的课题。
对关系表示的需求
我们现在已经习惯于将我们的数据预处理成这样一个数字表(或张量),这是几乎任何 ML 库中的输入格式,甚至很难想象这不是无所不包的数据表示。然而,只要环顾四周,看看真实世界的数据是什么样子的。它不是存储在数字向量/张量中,而是存储在互联网页面、社交网络、知识图表、生物、化学和工程数据库等的互连结构中。这些是固有的 关系 数据,它们自然地以图形、超图和关系数据库的结构化形式存储。
现实世界中的大部分数据都存储在关系数据库中。(图片来自 pixabay )。)
但是等等,难道我们不能把这些结构变成特征向量,然后一切恢复正常吗?
嗯,人们这样做肯定是出于前面提到的(方便)原因,直到最*,这还是用这些数据结构做 ML 的主要方式,通常被称为 命题化 。例如,可以在结构上计算各种统计数据,例如从一个图中计算出节点、边或子图(也可以利用各种内核方法对这些进行操作)。
从实践的角度来看,从关系结构中加工特性并没有错,但是意识到这种方法背后有一个普遍的认知偏差是有好处的:
"如果你只有一把锤子,所有的东西看起来都像钉子."
S o,我们能不能跳过这个从关系数据构建特征向量的阶段?如果你现在考虑“深度学习来拯救”,重要的是要认识到,直到最*,所有经典的深度学习方法还局限于固定大小的数字向量(或张量)形式的表示。深度学习背后的思想是“仅仅”跳过从“低级”(输入)表示向量手动构建“高级”表示向量,但你仍然需要后者来开始!
而且,从理论的角度来看,将关系数据转换成向量表示有一个很深的问题,因为在这个预处理(命题化)步骤中,没有办法将一个非绑定的关系结构映射成任何固定大小的表示而不丢失(不希望的)信息。
此外,即使我们将自己限制在固定大小的结构中,以数字向量或张量的形式设计一个合适的表示仍然是一个很大的问题。以图表数据为例,它是关系数据的一种特殊形式。如果有一种明确的方法将一个图映射成一个(固定大小的)数字向量(或张量)的标准学习形式,这将轻松解决图同构问题。
- 因为要测试两个图是否同构,将它们转换成这样的向量并比较它们的等式就足够了。当然,我们进一步假设创建这样的载体将是有效的(即,不是 NP 完全的)。
因此,在固定大小的数字向量(或张量)的经典空间之外,对于具有这种不规则拓扑的数据,存在根本不同的学习表示形式的内在需求。那么,我们真的可以通过各种网络、(知识)图表和关系数据库的形式来学习关系数据表示吗?
GNNs 上的间奏曲。 当然,到现在为止,你可能已经听说过 图神经网络 (GNNs),最*提出要处理图结构数据——不要担心,我们将在 后续文章 中讨论这些!现在,只需注意 gnn 是处理一种形式的关系表示(一个图)的一种特定方式,它植根于一种针对图同构问题的特定(非常好的)启发式方法(Weisfeiler-Lehman)。现在让我们继续从更广阔的角度来看。
关系机器学习
最*的许多深度学习研究都是关于发现模型和学习表示,以各种形式的集和图捕捉数据。然而,很少有人承认,这些结构化学习表示在 关系机器学习 中已经被研究了很久(作为特例)。
您可能还记得,关系是定义在一些对象集合上的笛卡尔乘积的子集。因此,每个集合仅仅是某个(一元)关系的退化情况。然后,每个图可以被视为同一组对象(节点)上的二元 关系的实例化。高于二进制的关系则对应于经典的关系表,也称为超图。在对象上添加多个这样的关系(表),你就有了一个关系数据库。
许多真实世界的数据都存储在这样的关系数据库中,您以前肯定遇到过这种情况。现在想象一下,您的学习样本并没有很好地准备为单个表中的行,而是分布在数据库的多个相互链接的表中,其中不同的样本由不同类型和数量的对象组成,每个对象由不同的属性集表征。这种情况实际上在实践中并不少见,但是您究竟如何将这样的东西放到您最喜欢的 SVM/xGBoost/NN 模型中呢?
虽然这些数据表示本质上不属于标准向量(张量)形式,但实际上有另一种表示形式非常自然地涵盖了所有这些格式。就是 关系逻辑 。
事实上,关系逻辑是所有结构化(关系)表示的通用语言。在实践中,许多为结构化数据设计的标准格式(如 ERM & SQL ),从集合到数据库,都直接遵循关系逻辑(和关系代数)。
虽然你可能已经从 CS 101 中熟悉了关系逻辑/代数形式,但很可能你从未在机器学习的上下文中听说过它。然而,除了是一个伟大的数据操作和表示形式,关系逻辑也可以用来直接处理复杂的关系机器学习场景,就像上面概述的那样。
用逻辑学习
除了机器学习主流之外,还有一个归纳逻辑编程 (ILP)社区,关注从具有复杂关系结构的数据中学习可解释的模型。
如上所述,ILP 利用关系逻辑形式的表达能力来捕获这些数据结构(包括关系数据库等等)。然而,有趣的是,这里的关系逻辑也被用来表示模型本身。在 ILP 中,这些采用逻辑 theories⁴的形式,即由所使用的逻辑关系形成的逻辑规则集。
此外,ILP 引入了 背景知识 的基本概念,得益于基于逻辑的表示,该概念可以优雅地作为关系归纳偏差直接合并到模型中。
几十年后或几十年后【3】这种相当非正统的关系型 ML 方法当时是利用数据样本进行学习的首要场所,这些数据样本不会屈服于标准形式的独立身份特征向量。这使得 ILP 能够探索一些操作结构化数据表示的非常普遍的学习问题,包括参与关系、动作和事件的不同属性的对象,超出了标准统计 ML 的范围。
举例。举例来说,让我们看看最*探索的图结构学习问题可以如何用关系逻辑来处理。为了表示一个图,我们简单地定义一个二元的'边'关系,对于图中所有相邻的节点 x,y 有一组实例化的边(x,y) 。此外,我们还可以使用其他(一元)关系来为节点集分配各种属性,例如' red(x)' 等。
以关系逻辑编码的标记图结构的示例(左),以及通过路径的(学习的)递归模型的查询“ path(d,a)”的两种可能的推断(右)。图片由作者( 来源 )。
模型,即逻辑规则,通常表达要在数据中搜索的关系模式。这涵盖了从寻找分子中特有的亚结构到网络中的路径的所有事情。由于关系逻辑中的高表达性、声明性和递归的固有使用,学习到的模型通常非常紧凑和优雅。例如,一个完美地捕捉图中路径的(学习的)模型,比如你从 X 到 Y 的地铁连接,通常看起来像
path(X,Y) <= edge(X,Y).
path(X,Y) <= edge(X,Z), path(Z,Y).
这可以用基本的 ILP 系统从几个例子中很容易地学会。
我有趣的是,这与例如用可微分神经计算机处理相同的问题形成了直接的对比——这是最* Deepmind 的亮点之一,它需要大量的例子和额外的黑客技术(例如,删除无效的路径预测)来处理带有“不适当的”张量(命题)表示(模拟可微分的记忆)的任务。
统计关系学习
虽然在表现上更具表达性,但仅用逻辑学习并不适合处理噪音和不确定性。⁵为了解决这个问题,出现了许多方法来合并从 ILP 采用的关系逻辑的表达能力和从经典统计学习采用的概率建模,在 统计关系学习【srl)⁶,它涵盖了从展示不确定性和丰富的关系结构的复杂数据中学习模型。特别是,SRL 通过在非逻辑学习世界中受到启发的技术,如基于内核的方法和图形模型,扩展了 ILP。
总的来说,SRL 有两大主流方法——概率逻辑编程和提升建模,这将作为我们进一步探索 深度关系学习 概念的基础。
举起的模型
与标准(也称为“地面”)机器学习模型相反,提升模型 不指定特定的计算结构,而是指定一个模板,在给定关系输入数据(也可能是背景知识)的变化上下文的情况下,标准模型从该模板展开作为推理(评估)过程的一部分。
例如,(可以说)最流行的提升模型——一个马尔可夫逻辑网络(MLN)【7】可以被看作是经典马尔可夫网络的一个模板。对于预测和学习,MLN 与描述输入数据(例如,数据库)的一组特定的相关事实相结合,并展开经典的马尔可夫网络。让我们仔细看看。
举例。例如,这样的 MLN 模板可以表达“吸烟者的朋友往往是吸烟者”和“吸烟可能导致癌症”的一般先验。学习数据然后可以描述具有被如此标记的吸烟者子集的人的社交网络。MLNs 的提升建模范例然后允许基于他们的社会关系归纳所有其他人的吸烟概率,就像通过常规马尔可夫网络建模一样,但是系统地概括不同结构和大小的社会网络!
给定两个人{a,b},编码关于吸烟习惯的直觉的马尔可夫逻辑网络模板展开成具有共享权重的标准马尔可夫网络。图片由作者(来源,受【7】启发)。
重要的是,这也允许被提升的模型在学习 problems⁸时捕捉固有的,例如通过绑定它们的参数,跨越网络中所有不同人的友谊关系的规律性。
然后,这种参数共享可以显著减少必须学习的权重的数量,并且允许提升的模型传达问题的高度压缩的表示,因为所有的常规关系模式(对称性)都由单个模板联合参数化。这反过来允许更好的一般化。
- 此外,利用这种提升建模方法的对称性也可以显著加快评估本身,这在 SRL 通常被称为“提升推理”。
SRL 社区提出了许多有趣的概念,然而,随着表达能力的提高,它们也继承了 ILP 的计算复杂性问题。此外,由于主要集中在概率(图形)模型上,开发的系统通常缺乏效率、健壮性和深度表示学习能力,就像我们习惯享受的神经网络一样。
因此,它们在现实生活应用中的使用与我们目前看到的深度学习相去甚远。另一方面,神经模型仍然极大地局限于固定大小的张量(命题)表示,正如本文所解释的那样,它不能正确地捕捉结构化学习表示的自由、动态和不规则的性质,对于这种性质,关系逻辑形式主义是自然的选择。
在的下一篇文章中,我们将浏览“神经-符号整合的历史,旨在将符号逻辑与神经网络相结合。这将为我们实现现代结构化深度学习模型(如图形神经网络)的期望统一的路径提供一些进一步的背景,其中关系逻辑成为表达性的深度关系学习。
1.通常也称为谓词或一阶逻辑(另外还引入了这里不需要的逻辑功能符号)。
2.关系逻辑甚至不限于关系数据库,而是进一步允许覆盖所有丰富的知识库和花哨的演绎本体。
[3] Cropper,a .,duman ci,s .,Evans,r .等30 岁时的归纳逻辑编程。马赫学习(2021)。https://doi.org/10.1007/s10994-021-06089-1
4.这些形成了 Datalog 和 Prolog 等语言中逻辑编程的基础,对于这些语言,这种 ML 方法在概念上接*于程序综合领域(由于所学习模型的高表达能力)。
5.关系学习中的不确定性自然产生于许多层面上的数据,从关于对象的属性值的传统不确定性到关于其类型、关系中的成员关系以及范围内的对象和关系的总数的不确定性。
6.这个研究领域的一些其他术语包括多关系学习/数据挖掘或概率逻辑学习。结构化预测模型也可以被视为 SRL 的一个实例。
[7]理查森、马修和佩德罗·多明戈斯。马尔可夫逻辑网络。《机器学习》62.1–2(2006):107–136。
8.后来也外推(由佩德罗多明戈斯,再次)到神经网络中:
一族,罗伯特,和佩德罗多明戈斯。深度对称网络。神经信息处理系统进展 27(2014):2537–2545。
什么是监督学习?
原文:https://towardsdatascience.com/what-is-supervised-learning-fd86d704d855
了解监督学习的应用和问题
蒂姆·莫斯霍尔德在 Unsplash 上的照片
监督学习是人工智能和机器学习的一个子类。其特征在于训练数据已经包含正确的标签。这允许算法学习为新的数据对象预测这些标签。与此相反的是所谓的无监督学习,其中这些标签不存在于数据集中,算法必须进行不同的训练。
监督学习是如何工作的?
监督学习算法使用数据集从输入中学习相关性,然后做出所需的预测。最佳情况下,预测和数据集的标注是相同的。训练数据集包含输入和正确的输出。模型可以使用这些在几次迭代中学习。准确度反过来表明从给定的输入中预测正确输出的频率。这是使用损失函数计算的,并且该算法试图最小化它,直到获得满意的结果。
你可以把它想成一个想学英语,已经会说德语的人。有了德-英词典或词汇书,这个人可以通过覆盖英语栏,然后试图从德语单词“预测”英语单词,相对容易地自己学习。她将重复这种训练,直到她能够足够多次地正确预测英语单词。这个人可以通过计算她翻译错误的单词数,并将其与她翻译的所有单词的比例来衡量她的进步。随着时间的推移,这个人将试图最小化这个比率,直到她能够正确地将所有德语单词翻译成英语。
监督学习可以分为两大类:
- 分类用于将新的数据对象分配到一个或多个预定义的类别中。该模型试图从代表类别分配的输入中识别相关性。这方面的一个例子是要被识别然后被分配到一个类别的图像。然后,该模型可以预测图像,例如,是否可以在图像中看到狗。
- 回归 解释称为自变量的输入和称为因变量的输出之间的关系。例如,如果我们想预测一家公司的销售额,并且我们有前一年的营销活动和*均价格,则回归可以提供关于营销努力对销售额的影响的信息。
监督学习有哪些应用?
有多种商业应用可以受益于监督学习算法。下面我们简单总结了最受欢迎的几个:
- 图像中的物体识别 :监督学习模型的一个用例是识别图像中的物体,比如一辆汽车前面是否有另一辆汽车。已经有数不清的模型架构在对象识别甚至分类方面提供了很好的结果。除了其他方面之外,这一特性还用于自动驾驶,以便能够对如何做出最佳反应做出估计。
- 预测:如果公司能够非常准确地预测未来的情景或状态,他们可以很好地权衡不同的决策选项,并选择最佳的一个。例如,对下一年预期销售额的高质量回归分析可用于决定分配多少预算给营销。
- https://databasecamp.de/en/use-case/bert-sentiment-analysis:如今,许多公司都面临着从各种渠道获取产品评论的挑战。很少有顾客利用这个机会在自己的电子商务商店里描述评论。相反,他们自己的产品也会在社交媒体评论、YouTube 视频或博客文章中得到评级,这些评级有时可能与他们自己网站上的评级相差很大。这就是为什么可以自动将文本分类为正面或负面的模型是一个很好的选择。例如,这使得处理许多评论和快速获得社交媒体上的情绪概览成为可能。
- ****垃圾邮件检测:许多电子邮件程序已经有了训练有素的垃圾邮件程序。这将检查收到的电子邮件,并计算它们是垃圾邮件的概率,即包含广告或用户不想要的邮件。为了识别这些邮件,会使用其他用户已经手动标记为垃圾邮件的数据。然后,这些数据被用来训练一个监督学习模型,以自动标记电子邮件。
监督学习有什么问题?
不幸的是,监督学习模型在许多情况下取得的良好结果也具有这些算法带来的一些缺点:
- 如果分类还不可用,在许多情况下给培训数据贴标签是一个费力且昂贵的过程。例如,很少有图像被分类为其中是否有狗。这必须首先手动完成。
- 训练监督学习模型可能非常耗时。
- 人类的错误或辨别力也是可以学习的。因此,如果用于对求职者进行分类的训练数据集歧视某些社会群体,该模型很可能会继续这样做。
监督和非监督机器学习的比较
假设我们想教一个孩子一门新的语言,比如英语。如果我们根据监督学习的原则来做这件事,我们简单地给他一本字典,上面有英语单词和他的母语的翻译,例如德语。孩子会发现开始学习相对容易,并且通过记忆翻译可能会进步很快。然而,除此之外,他在阅读和理解英语文本方面会有问题,因为他只学会了德-英翻译,而没有学会英语句子的语法结构。
根据无监督学习的原理,这个场景看起来会完全不同。例如,我们会简单地给孩子五本英语书,他必须自己学习其他的东西。当然,这是一项更加复杂的任务。在“数据的帮助下,例如,孩子可以识别出单词“I”在文本中相对频繁地出现,并且在许多情况下也出现在句子的开头,并且由此得出结论。
这个例子也说明了监督和非监督学习的区别。监督学习在许多情况下是一种更简单的算法,因此通常具有更短的训练时间。然而,该模型仅学习明确存在于训练数据集合中并作为模型的输入给出的上下文。例如,学习英语的孩子将能够相对较好地将单个德语单词翻译成英语,但不会学会阅读和理解英语文本。
不同机器学习类别的概述|图片:作者
另一方面,无监督学习面临更复杂的任务,因为它必须独立地识别和学习结构。这样一来,训练的时间和精力也更高。然而,其优势在于,经过训练的模型也能识别出没有明确教授给它的上下文。在五本英语小说的帮助下自学英语的孩子可能会阅读英语课文,将单个单词翻译成德语,还能理解英语语法。
这是你应该带走的东西
- 监督学习是人工智能的一个子类,描述了在已经包含正确输出标签的数据集上训练的模型。
- 监督学习算法可以分为分类模型和回归模型。
- 公司将这些模型用于各种各样的应用,如垃圾邮件检测或图像中的对象识别。
- 监督学习并非没有问题,因为标记数据集是昂贵的,并且可能包含人为错误。
如果你喜欢我的作品,请在这里订阅https://medium.com/subscribe/@niklas_lang或者查看我的网站* 数据大本营 !此外,媒体允许你每月免费阅读 3 篇 。如果你想让无限制地访问我的文章和数以千计的精彩文章,不要犹豫,通过点击我的推荐链接:https://medium.com/@niklas_lang/membership获得会员资格,每个月只需支付 5***
*****</8-machine-learning-algorithms-everyone-new-to-data-science-should-know-772bd0f1eca1> *****
什么是供应链分析?
原文:https://towardsdatascience.com/what-is-supply-chain-analytics-42f1b2df4a2
使用 python 进行数据分析,在战略和运营层面实现数据驱动的诊断和决策,从而提高运营效率
(图片由作者提供)
供应链可以被定义为以满足客户需求为最终目标的多方物流、信息流或资金流的交换。
信息和货物的流动—(图片由作者提供)
由于信息扮演着重要的角色,供应链分析已经成为组织用来从与价值链中包括的所有流程相关的数据中获得洞察力的方法和工具。
在本文中,我们将介绍 Python 中不同类型的供应链分析,并了解它们对端到端运营的效率的影响。
💌新文章免费直入你的收件箱:时事通讯
**SUMMARY**
**I. Scenario** *Example of a Supply Chain for a Fashion Retailer*
**II. What are the different types of Supply Chain Analytics?** *1\. Descriptive analytics
2\. Diagnostic analytics
3\. Predictive analytics
4\. Prescriptive analytics* **III. Why is it so important?
IV. What skills do you need?**
如果你喜欢看,看看 Youtube 教程
方案
网络
让我们以一个在世界各地都有商店的国际服装集团为例。
该公司在亚洲的工厂生产服装、包包和配饰。
售出的 SKU 示例—(图片由作者提供)
门店从本地仓库发货,由工厂直接补货。
供应链网络—(图片由作者提供)
货物流动
- 仓库补充了来自工厂的散装货物
- 商店订单从当地仓库挑选、包装和运输
信息的流动
- 销售和营销团队从商店收集销售数据
- 规划团队提供需求预测并支持生产计划
- 供应计划员使用 ERP 向工厂发送订单,进行仓库补货
- 配送计划员向仓库管理系统(WMS) 创建商店补货订单
现在,让我们利用现有的信息,探索什么样的工具可以用来优化货物的流动。
作为介绍,大家可以看看这个简短的讲解视频
不同类型的供应链分析?
供应链分析可以表示为一组工具,这些工具将使用信息流来回答问题和支持决策过程。
四种类型的供应链分析—(图片由作者提供)
对于每一种类型,你都需要具体的方法、数学概念和分析工具来回答这个问题。
描述性分析
一套工具,提供可见性和整个供应链的单一事实来源,以跟踪您的货件、检测事故并衡量您的运营绩效。
示例—(图片由作者提供)
最终的可交付成果通常是一组仪表板,可以使用 PowerBI/Tableau 放在云上,比如
👨💼 POSITIONS INVOLVED
Supply Chain Engineers, Data Analysts, Data Architects, Data Engineers, Product Managers and Business Intelligence Experts**🧰 TOOLS** Cloud computing, Python processing libraries (Pandas, Spark), BI Visualisation tools (Tableau, PowerBI, Google Studio)
诊断分析
这可以概括为事件根本原因分析。让我们以供应链控制塔为例。
时间戳—(图片由作者提供)
由于您的数据架构,您可以在物流链的每一步跟踪您的货件。
截止时间分析—(图片由作者提供)
例如,在上面的图表中,您可以看到较长的清关时间直接导致了延迟交货。
👨💼 POSITIONS INVOLVED
Supply Chain Engineers, Data Analysts, Data Engineers, Product Managers**🧰 TOOLS** Cloud computing, Python processing libraries (Pandas, Spark), BI Visualisation tools (Tableau, PowerBI, Google Studio)
如果货物交付延迟,根本原因分析包括检查每个时间戳,以查看您的货物在哪里错过了截止时间。
分析流程由运营团队设计,由数据工程师实施,以实现完全自动化。
预测分析
支持运营,以了解最有可能的结果或未来情景及其业务影响。
预测分析示例—(图片由作者提供)
例如,通过使用预测分析,您可以估计未来促销对商店销量的影响,以支持库存管理。
👨💼 POSITIONS INVOLVED
Supply Chain Engineers, Data Scientists, Business Experts **🧰 TOOLS** Cloud computing, Python processing libraries (Pandas, Spark), BI
Machine Learning, Statistics
在上面的示例中,数据科学家将与业务专家合作,了解哪些功能有助于提高销售预测的准确性。
规定性分析
协助运营解决问题,优化资源以达到最佳效率。
说明性分析示例—(图片由作者提供)
大多数时候,说明性分析与优化问题有关,在优化问题中,您需要考虑几个约束条件来最大化(或最小化)目标函数。
👨💼 POSITIONS INVOLVED
Supply Chain Engineers, Data Scientists**🧰 TOOLS** Cloud computing, Python processing libraries (Pandas, Spark), BI
Machine Learning, Statistics, Linear Programming, Operations Research tools
通常,操作问题与一个众所周知的问题相关联,该问题的解决方案可在文献中找到。
例如,旅行推销员或车间作业问题就用在上面的例子中。
为什么重要?
作为供应链经理,您的职责范围包括
- 了解并最小化风险
- 优化运营以降低成本
- 提供资源规划的可见性
- 为未来场景做准备
供应链优化分析—(图片由作者提供)
因此,您需要描述性和诊断性分析来了解当前的情况。
预测分析将让您了解未来,而规范分析将支持您的决策。
需要什么技能?
欢迎关注我的 medium,获取更多与数据分析和供应链管理相关的文章
描述性分析
这将取决于你的职位所涉及的分析类型。
在任何情况下,你都需要基本的编程技能来使用 Python 或 VBA 处理非结构化数据。
大多数时候,数据是非结构化的(在 excel 文件、pdf 报告中)或者来自异构系统。
供应链分析工作流程—(图片由作者提供)
第一个强制性步骤是处理和协调这些不同来源的信息,并建立描述能力。
因此,即使从数学的角度来看这是最容易的部分,描述性分析也会占用你很大一部分精力(和预算)。
超出
创建干净可靠的数据源后,您可以开始为诊断、预测或处方构建模型。
如果你想了解更多细节,你可以看看我的 Youtube 频道上的播放列表供应链分析
您可以在下面列出的文章中找到案例研究的例子
描述性分析
诊断分析
- 使用数据分析的物流绩效管理,Samir Saci
- 交付周期可变性和供应链弹性,Samir Saci
预测分析
- 零售销售预测的机器学习—特征工程,Samir Saci
- 如何:机器学习驱动的需求预测,尼古拉斯·范德普特
规定性分析
- 使用 Python 、Samir Saci 进行生产固定水*规划
- 利用 Python 、Samir Saci 优化仓库增值服务
- 使用 Python 的寻路算法提高仓库生产率,Samir Saci
- 商店送货计划的机器学习,Samir Saci
关于我
让我们在 Linkedin 和 Twitter 上连线,我是一名供应链工程师,正在使用数据分析来改善物流运营并降低成本。
如果你对数据分析和供应链感兴趣,可以看看我的网站