什么是好的分析课程?
最近,我有幸采访了来自播客的约翰·大卫·阿里森。
我很感激约翰·大卫调查了我的背景,以了解哪些话题适合我们讨论。其中之一——课程创建——是我有自己的观点,但我从来没有用一个基本问题的答案来表达它们:“什么是好的分析课程?
以下是我在播客上的回答:
因为我从来没有写下我对什么是好的课程的想法,所以我想这是做这件事的地方:下面我详细阐述我对这个节目的想法。
一门优秀的分析课程…
…指导您完成数据清理
https://pix abay . com/photos/girl-glasses-mop-cleaning-clean-1531575/
高达 80%的数据分析师时间都花在清理数据上。虽然在数据清理上花这么多时间可能有些过分,但这一事实应该得到承认,甚至值得庆贺。
在一门课程中跳过数据分析的这一部分是如此诱人——在课堂环境中很难模拟数据清洗,大多数老师不喜欢教它,大多数学习者也不喜欢学它。这不是数据分析的“迷人”部分。
然而,数据分析讲师有义务为学生拉开帷幕,向他们展示数据分析项目的真实情况。在所有很酷的分析发生之前,还有很多乏味的工作。
…有一个上下文
这个世界不需要再一次冷静地点名分析工具中的每一个特性和功能。一门好的分析课程应该有一些具体的学习成果,并让学生尽可能线性地学习。
在分析程序中,有多种方法可以做几乎任何事情。
重要的不是学生学会每一个,而是他们开始建立智慧,知道什么时候使用什么工具。这需要将工具情境化的能力,这意味着强调一些工具而不强调其他工具,这意味着 20 小时的关于世界上一切事物的课程而不是给你情境化的智慧。
…有交付成果
就像掩盖数据清理更容易一样,讲师也更容易仔细阅读各种示例和数据集,以提取简单的演示示例。
然而,一门好的课程会带领学生创建他们自己的端到端交付内容。毕竟,创造力是布鲁姆分类法的顶端。
从一个主题跳到另一个主题,从一个数据集跳到另一个数据集,没有将数据清理作为数据分析管道的必要部分,也没有帮助学生了解不同的工具如何整合到一个项目中,也没有给学生留下他们创造了任何东西的感觉。这是一条便宜的捷径。
还有什么是好的?
现在轮到你了——一门优秀的分析课程有哪些特征?或者,有哪些分析课程“做对了”而你却说不出为什么的例子?
请在评论中告诉我。
为了让对话继续下去,我对这篇文章做了一个视频回顾。请在下面查看:
你可以从下面的视频中下载幻灯片。
什么是高票房电影?
分析 44 年来最好的电影能告诉我们是什么造就了一部伟大的电影吗?
我发现了一个 Kaggle 数据集,我认为深入研究它会很有意思:票房最高的 10 部电影(1975 年至 2018 年) —这是一个很好的突破,远离了充斥着我们信息的新冠肺炎新闻!
我想从这些数据中回答 3 个问题:
- imdb 评分越高的电影票房就越高吗?
- 票房较高的电影是因为它们面向更广泛的观众吗?
- 电影票房能否在上映前根据数据集中的参数进行预测?
这是我正在使用的数据的快照:
原始数据集的样本。
让我们假设我们已经清理了所有的数据(关于探索和清理数据的细节,你可以查看这篇文章):它是我想要的格式,我知道那里有什么…现在让我们开始回答问题的有趣部分。
问题 imdb 评分越高的电影票房就越高吗?
为此,我比较了 IMDB 评级和全球总票房,看看是否有某种趋势。希望一个简单的情节能在这里给我们一个明确的答案…
IMDB 评分与每部电影的全球总票房之比
遗憾的是,从这个情节中我们真的看不出太多东西。似乎根本没有明显的趋势。从图上看,这很可能是因为在 7.8 的收视率和 27 亿的总票房之间有一个明显的异常点。那一点可能会扭曲图表…如果我们移除那一点,或许还有一些希望。
IMDB 评分与每部电影全球总票房的比较(不包括异常)
这里我们可以看到,除去异常的结果,我们仍然看不到太多的趋势。
回答 1:不,我们不能说票房收入越高的电影在 imdb 上的评分就越高。
问题 2:票房高的电影是因为它们面向更广泛的观众吗?
对于这一个,我正在看电影的适当观众年龄组的指定评级和电影的全球总收入。这将是一个有趣的问题,因为理论上分级为 G 的电影可以被任何人观看,而分级为 R 的电影只能被 18 岁以上的人观看。
每个收视率类别的全球总票房柱状图
在上图中,我们可以看到每个评级类别的总收入分布。最初,当你看剧情的时候,你可能会惊讶于向更多观众开放的电影比那些 PG-13 级别的电影票房低。
但是仔细想想,我们应该感到惊讶吗?
对这种趋势的一种可能的解释是,分级为 G 和 PG 的电影,尽管所有观众都可以观看,但很可能特别针对儿童。因此,大多数成年观众对它们不感兴趣。r 级电影自然不包括年轻人,而且经常被评为 r 级电影,因为其中的暴力、脏话和色情镜头可能会让观众倒胃口。
PG-13 电影可能对许多年轻观众(实际上是 13 岁以上)有合适的中间立场,但对更保守的成年观众来说不会太令人反感。PG-13 电影拥有最广泛的现实观众,而不仅仅是纸上谈兵,适合可以观看的年龄。
答案 2:是的(某种程度上),吸引最多观众(即 PG-13)而不是理论上最多观众的电影是票房最高的电影。
问题 3:电影票房能否在上映前根据数据集中的参数进行预测?
这是一个要解决的复杂问题…数据集中有很多数据,关键是要找出什么对预测一部电影的成功有用。
我们可能都有自己对成功电影的理解——也许我们认为大多数人会去看动作片?或者实际上,理想的电影长度是 100 分钟左右,因为它足够长,可以让你安定下来,但又不会太长,让你感到无聊?但是到底是什么影响了一部电影的票房呢?
根据过去的数据,这是一个关于电影预发行的已知事物及其成功程度的关联图:
数据集中参数的相关性
具体来看我们真正关心的栏目:全球总收入。嗯,看起来电影的长度是电影成功的最大影响因素——它在两个不同变量之间有最高的正值 0.34。尽管如此,考虑到最高相关性是 1,它也不是那么高。
当使用这些参数来尝试和预测一部电影的成功时,事情并不像希望的那样顺利!预测相当糟糕,也许是因为我们知道的预发行的不同东西和最终的全球总票房之间的相关性很低。
回答 3:不,我们不能预测一部电影预发行的成功。至少不仅仅是这个数据集中的数据。
最后的话
看着这个数据集,44 年来每年票房最高的 10 部电影,我们可以确定以下几点:
- imdb 评分越高的电影票房就越高吗?否
- 票房收入高的电影是因为它们面向更广泛的观众吗?是的(算是)
- 电影票房能否在上映前根据数据集中的参数进行预测?否
那些崭露头角的电影制作人真不幸——看起来没有简单的公式可以让你赚到数百万!
全部结果
如果你想看我的完整分析,你可以在我的 GitHub 库中找到。或许你可以创建一个更强大的模型来预测一部电影的全球票房?
是什么让一首歌伟大?第二部分
是什么让一首歌如此伟大
通过 Spotify 的 Python 分析滚石的 500 首最棒的歌曲
约翰·马特丘克在 Unsplash 上拍摄的照片
【这是 系列三篇文章中的第二篇
在第 1 部分中,我们研究了如何从网络上检索数据。在本文中,我们将更多地关注与 API 的交互和使用 Pandas。
从 Spotify API 获取数据。
以前我们使用网络抓取来获得一个包含滚石乐队有史以来 500 首最伟大歌曲的数据框架。如果我们想创建一个 Spotify 播放列表呢?或者,更好的是,从 Spotify 获得更多数据来补充我们的数据?我们可以通过查询并发布到 Spotify 的 API 来实现。最简单地说,应用程序编程接口(或“API”)只是服务器的一部分,当您的浏览器或应用程序从互联网发送和检索数据时,它会与服务器进行交互。当你在 Spotify 中将一首歌添加到播放列表中,或者查看一首歌的时长时,你正在与它的 API 进行交互。
这是了解更多信息的良好起点:
你有没有听说过“API”这个词,并想知道这到底是什么?你是否有一个模糊的想法,但是…
medium.com](https://medium.com/@perrysetgo/what-exactly-is-an-api-69f36968a41f)
步骤 1:设置
前往 Spotify 的 API 仪表盘,用你的标准账户登录,点击“创建应用”。从那里你应该复制客户端 id 和客户端秘密。这些将是您登录 API 所需的凭证。将它们粘贴到一个.txt
文件中是个好主意(我的文件叫做Spotify.txt
——见下文)。
现在我们可以连接到 API,如下所示(T2 行是避免忘记关闭文件的简洁方法):
file = 'Spotify.txt'# replace this with the path and file name you use
with open(file,'r') as f:
f = f.read().splitlines()
cid = f[0].split(':')[1]
secret = f[1].split(':')[1]client_credentials_manager = SpotifyClientCredentials(client_id=cid, client_secret=secret)
sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager)
Python 有一个很棒的库叫做spotipy
(就是上面代码中的sp
),这使得这比平常容易得多。在这里你可以阅读文档。或者像我一样,你可以通过阅读 Medium 上的一篇文章来了解一下——我推荐这篇:https://Medium . com/@ samlupton/spot ipy-get-features-from-your-favorite-songs-in-python-6d 71 f 0172 df 0。
步骤 2:检索数据
现在让我们开始有趣的部分。为了从 Spotify 下载数据,我们首先检索 500 首歌曲中每一首的track id
。让我们以我的女孩为例,由诱惑创作。
我们将从数据帧中提取艺术家和歌曲名称,并将结果传递给spotipy
的.search()
方法。
artist = df.Artist[412]
track = df['Song title'][412]
artist, track('The Temptations', 'My Girl')track_id = sp.search(q='artist:' + artist + ' track:' + track, type='track')
track_id{'tracks': {'href': 'https://api.spotify.com/v1/search?query=artist%3AThe+Temptations+track%3AMy+Girl&type=track&offset=0&limit=10',
'items': [{'album': {'album_type': 'album',
'artists': [{'external_urls': {'spotify': 'https://open.spotify.com/artist/3RwQ26hR2tJtA8F9p2n7jG'},
'href': 'https://api.spotify.com/v1/artists/3RwQ26hR2tJtA8F9p2n7jG',
'id': '3RwQ26hR2tJtA8F9p2n7jG',
'name': 'The Temptations',
'type': 'artist',
'uri': 'spotify:artist:3RwQ26hR2tJtA8F9p2n7jG'}],
'available_markets': ['AD',
'AE',
'AL',
'AR',
'AT',
'AU',
'BA',
[...]
'previous': None,
'total': 143}}
虽然这看起来很可怕,但它是一个 JSON 对象,它的行为非常像一个 Python 字典。稍微检查一下就会发现,例如,如果一个列表本身是第一个键-值对(例如{tracks : ...}
)中键items
的值,那么实际的id
是作为第一个项目中键 id
的值嵌套的。同样,稍微挖掘一下,我们就能找到这首歌的popularity
属性。
id_ = track_id['tracks']['items'][0]['id']popularity = track_id['tracks']['items'][0]['popularity']
现在我们可以把所有东西放进一个函数里。因为一些搜索可能没有结果,我们将使用try... except...
块处理异常。注意第 4 行中使用了.zip()
函数,以避免更复杂的迭代。然后,我们检索数据并将其添加到我们的数据帧中。
def get_spotify_data(dataframe):
"""
Takes a dataframe as input.
Returns a list of track ids and a list of popularity scores from the Spotify API.
"""
from numpy import nan # we import np.nan to handle empty queries
track_ids = []
popularities = []
for [artist, song] in list(zip(dataframe['Artist'], dataframe['Song title'])):
try:
song_data = sp.search(q='artist:' + artist + ' track:' + song, type='track')
track_id = song_data['tracks']['items'][0]['id']
popularity = song_data['tracks']['items'][0]['popularity']
track_ids.append(track_id)
popularities.append(popularity)
except:
track_ids.append(nan)
popularities.append(nan)
return track_ids, popularitiestrack_ids, popularities = get_spotify_data(df)df['Spotify id'] = track_ids
df['Popularity'] = popularitiesdf.head()
很好。让我们使用 pandas 的.isnull()
来检查我们的函数是否返回了任何丢失的值:
df.isnull().sum()Artist 0
Song title 0
Writers 0
Producer 0
Year 0
Spotify id 13
Popularity 13
dtype: int64
我们的查询没有返回 13 个项目。为了简洁起见,我将把它们从数据帧中删除。我可能会在稍后阶段添加一个解决方法。
df.dropna(inplace=True)
步骤 3:获取数据帧中的音频特征
Spotify 还跟踪音频功能,如可跳舞性、拍号、速度。我们可以通过将一个轨迹的 id 传递给它的audio_features
方法来访问那些带有spotipy
的。我将向你展示两种做这件事的方法。首先,我使用 Python 的列表理解,这是一个稍微高级一点的特性,允许你以非常简洁的方式迭代地创建列表。但是如果感觉更舒服的话,你可以使用标准的for
环。
点击这里了解 Spotify 音频功能的更多信息。
# using list comprehension
features = [sp.audio_features(id_) for id_ in df['Spotify id']]
features[0]#using a 'for' loop
features_2 = []
for id_ in df['Spotify id']:
feature = sp.audio_features(id_)
features_2.append(feature)*# Look at an example*features_2[0][{'danceability': 0.365,
'energy': 0.668,
'key': 7,
'loudness': -12.002,
'mode': 1,
'speechiness': 0.817,
'acousticness': 0.836,
'instrumentalness': 2.58e-05,
'liveness': 0.911,
'valence': 0.216,
'tempo': 53.071,
'type': 'audio_features',
'id': '2eOFGf5MOA5QHGLY9ZlOfl',
'uri': 'spotify:track:2eOFGf5MOA5QHGLY9ZlOfl', 'track_href': 'https://api.spotify.com/v1/tracks/2eOFGf5MOA5QHGLY9ZlOfl',
'analysis_url': 'https://api.spotify.com/v1/audio-analysis/2eOFGf5MOA5QHGLY9ZlOfl',
'duration_ms': 217720,
'time_signature': 4}]
我们有一个列表列表,每个列表对应一首歌,包含一个字典。下面是我们如何将每个功能添加到数据框中的相应列:
- 创建特征列表
- 遍历列表创建一个字典。键将对应于列名,值将是包含实际音频特性的列表
- 接下来,遍历特性列表,用字典的 items()方法检索音频特性的标签和值对。追加到我们创建的字典中。
- 用 for 循环将字典中的每一项作为新列添加
#STEP 1
k = list(features[0][0].keys())# STEP 2
dict_list = {}
for key in k:
dict_list[key] = []# STEP 3
for i in features:
item = i[0].items()
for pair in item:
key, value = pair
dict_list[key].append(value)# STEP 4
for key in dict_list.keys():
df[key] = dict_list[key]
因为我们不需要一些列,所以我会去掉它们,看看我们的数据框架。
columns_to_drop = ['tempo', 'type', 'id', 'uri', 'track_href', 'analysis_url']
df.drop(columns_to_drop, axis=1, inplace=True)df.head()
完整的数据帧
我们都准备好了。在下一篇文章中,我们将最终开始探索和可视化我们的数据集。我希望你喜欢并学到了一些有用的工具。**
是什么造就了好酒…好酒?
利用机器学习和部分依赖图寻找好酒
我不知道你怎么样,但我现在肯定想喝点酒。但不是一般的酒,而是好酒。品尝起来平衡、复杂而悠长的葡萄酒。很难说这些实际上是什么意思,Buzzfeed 的这些家伙肯定很难用语言描述好酒。
BuzzFeed 视频
当然,葡萄酒的复杂性和深度是难以捉摸的概念。但是,如果我们能够用数字准确地描述是什么让葡萄酒如此令人愉快呢?
在这篇博文中,我会
- 使用 UCI 葡萄酒质量数据集,定性解释葡萄酒的化学特性为何令人满意。
- 解释如何使用部分相关图来解释葡萄酒的哪些化学特性是理想的。
- 在数据集上建立机器学习模型。
- 用 python 绘制并解释部分依赖图。
所以我做了一点研究,从一个化学家的角度观察了品酒的世界。
1.用数据理解好酒
葡萄酒的什么化学特性使它令人向往?
为了理解是什么造就了一款好酒,我使用了 UCI【1】的葡萄酒质量数据集。该数据集包含了 1599 个葡萄酒样品的化学性质和口味测试结果。这项研究中的葡萄酒是葡萄牙 Vinho Verde 葡萄酒的红色和白色变种,尽管我在这篇文章中只使用红色变种的数据。
葡萄酒由以下成分组成。
葡萄酒的成分。作者插图
- 酒精。葡萄酒通常含有 5-15%的酒精。这就是让我们热爱葡萄酒的化合物。
- 酸:酸赋予葡萄酒独特的酸味。缺乏固定酸度的葡萄酒被认为是平淡的或松软的 T21,这意味着它们的味道是单一的。葡萄酒中的酸度有两种来源。一种是天然存在于葡萄中的酸,用于发酵葡萄酒并带入葡萄酒中(固定酸*)。二、酵母或细菌发酵过程中产生的酸(挥发性酸)。*
- 固定酸度。这些“固定酸”是不容易蒸发的酸。它们是酒石酸、苹果酸、柠檬酸或琥珀酸,它们大多来源于用来发酵葡萄酒的葡萄。
- 挥发性酸度。“挥发性酸”是在低温下挥发的酸。这些主要是醋酸,能让酒尝起来像醋。
- 柠檬酸。柠檬酸被用作一种酸补充剂,增加葡萄酒的酸度。
柠檬酸是水果中常见的天然酸。照片由莱斯利·戴维森在 Unsplash 拍摄
*3.**残糖。*发酵过程中,酵母消耗糖分产生酒精。酵母发酵葡萄酒后剩下的糖量称为残糖。不出所料,残糖越高,酒味越甜。另一方面,尝起来不甜的酒被认为是干的。
*4.**含硫化合物。*二氧化硫是酿酒中常用的化合物。它可以防止葡萄酒氧化和坏细菌的渗透,使其成为葡萄酒的神奇防腐剂。这些硫化合物可以进一步分为以下几种:
- **游离二氧化硫。当二氧化硫添加到葡萄酒中时,只有 35-40%以游离形式产生。当以较大数量和较小批次添加时,可获得较高的游离 SO2 浓度。在其他条件不变的情况下,游离二氧化硫含量越高,防腐效果越强。
- 固定二氧化硫。游离 SO2 与葡萄酒中的微生物强烈结合,产生固定 SO2。如果葡萄酒中固定二氧化硫含量很高,这可能意味着氧化或微生物腐败已经发生。
5。氯化物。葡萄酒中氯化物盐的含量。不同地理、地质和气候条件的出产的葡萄酒会有所不同。例如,靠近海边的葡萄园生产的葡萄酒比远离海边的葡萄酒含有更多的氯化物。
2.利用机器学习预测好酒
如何用偏相关图解释预测的葡萄酒质量
有了对葡萄酒令人满意的原因的这种理解,我们可以建立一个机器学习模型,根据葡萄酒的化学性质来预测葡萄酒的高质量和低质量。机器学习模型的结果可以使用部分相关图来解释,部分相关图在机器学习模型的所有特征中“隔离”个体特征,并告诉我们个体特征如何影响葡萄酒质量预测。
M 更正式地说,部分依赖图可视化了一个特性对机器学习模型预测结果的边际效应[2]。
这似乎有点难以理解。我们从视觉上分解一下。
部分相关图的可视化指南
想象一下,我们有一个经过训练的机器学习模型,它接受一些特征(酒精百分比、硫酸盐含量、pH 值和密度),并输出对葡萄酒质量的预测,如下所示。
假设我们有以下表格格式的数据点。
我们把这个输入到训练好的机器学习模型中。瞧,模型根据这些特征预测葡萄酒质量得分为 5。
现在,我们增加数据点的数量,这样我们就有 5 个数据点,而不是 1 个数据点。
假设我们对酒精含量如何影响模型对葡萄酒质量的预测感兴趣。为了使“酒精含量”分布的模型边缘化,我们计算了所有其他特征(即硫酸盐含量、pH 值和密度)的平均值,如下表最后一行所示。
然后,我们将每种葡萄酒的酒精含量,以及硫酸盐含量、pH 值和密度的平均值输入机器学习模型。
使用这个逻辑,我们制作了部分相关图的如下表格表示。
然后我们可以用模型预测的葡萄酒质量对葡萄酒的酒精含量来绘制图表。这被称为部分依赖图。
部分相关图背后的数学
下面是部分相关图的更严格的定义,它可以跳过而不损失连续性。
我们首先假设机器学习模型是一个函数 f,它接受所有特征 x 并输出一个预测 f(xs)。我们感兴趣的是发现输入特征 xs 的之一对预测的影响,而我们对所有其他输入特征 xc 对预测的影响不感兴趣。换句话说,我们希望隔离输入特征 xs。为此,我们在特征 xc 的分布上边缘化机器学习模型,这被视为 P(xc)。在这样的边缘化之后,我们获得机器学习模型对特定特征 xs 的部分依赖函数。**
在统计学中,我们可以通过大数定律用 xc 的所有值的和来近似 xc 的分布上的积分。这里,n 是数据集中的数据数量,而 xc 是来自我们不感兴趣的特征的数据集中的实际值。
让我们在数据集中应用这个公式。为了获得特征 酒精 对预测结果 质量的部分依赖图,我们使用以下等式。
请注意,在其他特征(如 pH 值、密度、硫酸盐)上有一个上标 i ,但在酒精上没有这样的上标 i 。这是因为我们对其他特征求和以获得其他特征的平均值。这些特征中的每一个的平均值与酒精的第 I 个值一起被输入到机器学习模型中以产生预测,如下例所示。
4.构建葡萄酒质量预测的机器学习模型
数据导入
既然我们理解了什么是部分相关图,让我们将它应用于我们的数据集。首先,我们把数据下载到 UCI 站点。
*import pandas as pddf = pd.read_csv('winequality-red.csv',delimiter=';')*
数据探索
数据集不包含任何丢失的数据,并且被认为足够干净,可以按原样使用。因此,我们可以从一些数据探索开始:
- 我们看到数据集主要包含中等质量的葡萄酒(得分为 5-6)。
*import seaborn as sns
import matplotlib.pyplot as pltplt.figure(figsize=(10,5))
sns.distplot(df['quality'],hist=True,kde=False,bins=6)
plt.ylabel('Count')*
3.我们看到一些变量,如硫酸盐、酒精和柠檬酸含量似乎与质量相关。
*fig = plt.figure(figsize=(15, 15))
var = 'sulphates' #or alcohol, citric acid
sns.boxplot(y=var, x='quality', data=df, palette='Reds')*
4.我们还观察到,一些变量似乎与质量的相关性较弱,如氯化物和残糖含量。
模型结构
让我们快速建立一个机器学习模型,根据葡萄酒的所有化学性质来预测葡萄酒的质量分数。
这里,我们使用 25–75 的训练-测试分割比将数据分割成训练和测试数据集。
*# Using Skicit-learn to split data into training and testing sets
from sklearn.model_selection import train_test_split# Split the data into training and testing sets
features = df.drop(['quality','pH','pH_class'], axis=1)
labels = df['quality']train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size = 0.25, random_state = 42)*
然后,我们将训练数据输入随机森林回归器。这里,没有进行超参数调整,因为这不是本文的重点。
*from sklearn.ensemble import RandomForestRegressor
est = GradientBoostingRegressor()
est.fit(train_features, train_labels)*
现在,让我们看看如何在 python 中使用!幸运的是,我们有一个优雅的包——PDP box 包——,它允许我们轻松地绘制部分相关性图,该图可视化了某些特征对所有 SKlearn 监督学习算法的模型预测的影响。太神奇了!
让我们首先安装 pdpbox 包。
*!pip install pdpbox*
接下来,我们绘制每个变量对质量分数的部分依赖图。
*features = list(train_features.columns)for i in features:
pdp_weekofyear = pdp.pdp_isolate(model=est, dataset=train_features, model_features=features, feature=i)
fig, axes = pdp.pdp_plot(pdp_weekofyear, i)*
各特征对葡萄酒质量的偏相关图
酸性
**
我们先来了解一下如何看这个图。纵轴是特征对目标变量预测的贡献,而横轴是数据集中特征的范围。例如,我们看到大约 7.8 的固定酸度(上面的第一张图表)将为预测的葡萄酒质量分数贡献大约 0.75。
品酒师似乎更喜欢 pH 值较低(酸度较高)的葡萄酒。特别是,他们似乎喜欢在葡萄酒中加入柠檬酸。这并不奇怪,因为好酒应该是酸性的(即不是平的)。然而,他们不喜欢挥发性酸(挥发性酸让葡萄酒尝起来像醋!)
酒精含量
葡萄酒的主要吸引力之一是它能帮助人们放松——这就是酒精的作用。品酒师似乎喜欢酒的酒精含量更高。
硫酸盐含量
**
- 硫酸盐含量越高,模型对其质量达到某一阈值的预测就越高。为什么会这样呢?2018 年《自然》杂志的一项研究表明,二氧化硫与葡萄酒中的其他化学化合物(代谢物)反应生成亚硫酸盐化合物,这是最古老葡萄酒的化学特征。看起来品酒师似乎喜欢较高的亚硫酸盐化合物,这可能使葡萄酒尝起来更陈年。
- 另一方面,模型认为二氧化硫含量高的葡萄酒质量较低。这并不奇怪,因为二氧化硫含量高通常与氧化和葡萄酒中细菌的存在有关。
糖和氯化物
**
***一般来说,氯化物和残糖的量似乎对葡萄酒质量的预测影响不大。*我们观察到,两个图都在特征的小幅度处具有聚类点,并且在特征的较高幅度处具有异常值。忽略异常值,我们看到特征量的变化似乎不会很大地改变质量预测,即点的梯度相对较小。因此,特征的改变不会导致葡萄酒质量预测的改变。
二氧化硫+ pH 水平对预测葡萄酒质量的影响
我还对二氧化硫和 pH 值对预测质量的综合影响感兴趣。
为了对此进行研究,让我们首先将 pH 值分成 4 个具有相同数量数据点的区间。这一步不是完全必要的,尽管它使部分依赖图的可视化更容易。
*pd.qcut(df['pH'],q=4)
>> [(2.7390000000000003, 3.21] < (3.21, 3.31] < (3.31, 3.4] < (3.4, 4.01]]# Create a categorical feature 'pH_class'
cut_labels_3 = ['low','medium','moderately high','high']
cut_bins= [2.739, 3.21, 3.31, 3.4, 4.01]
df['pH_class'] = pd.cut(df['pH'], bins=cut_bins, labels=cut_labels_3)# One-hot encode the categorical feature 'pH class' into 4 columns
pH_class = pd.get_dummies(df['pH_class'])# Join the encoded df
df = df.join(pH_class)*
然后,我们也可以绘制两个变量对预测的部分依赖图作为等值线图。
*inter_rf = pdp.pdp_interact(
model=est, dataset=df, model_features=features,
features=['total sulfur dioxide', ['low','medium','moderately high','high']]
)fig, axes = pdp.pdp_interact_plot(inter_rf, ['total sulfure dioxide', 'pH_level'], x_quantile=True, plot_type='contour', plot_pdp=True)*
当我们改变 y 轴上的 pH 值(分类变量)和总二氧化硫含量(数值变量)时,等高线图的颜色显示了预测的质量。
蓝色区域表示低预测质量,而黄色区域表示高预测质量。这告诉我们,葡萄酒的 pH 值越低,二氧化硫含量越低,葡萄酒的质量越高(这对应于图表的左下角)。另一方面,超过二氧化硫含量的某个阈值(~66),我们看到 pH 不再对预测的质量分数有影响,因为在图表右侧的等高线图上只有垂直线。
该喝一杯了!
恭喜你坚持到现在。既然你是品酒的行家,是时候运用你的知识了。喝一杯,看看你能否将从部分依赖情节中学到的知识运用到实际中。(微妙的暗示:我随时都可以喝一杯——只要在 LinkedIn 上联系我就行了!)
Gojek 的数据分析师](https://www.linkedin.com/in/voon-hao-tang/)
PS/如果你对模型的可解释性感兴趣,一定要看看我的另一篇关于使用石灰解释黑盒模型对乳腺癌数据的预测的文章。
参考
[1] Paulo Cortez,葡萄牙吉马雷斯米尼奥大学,http://www3.dsi.uminho.pt/pcortezA . Cerdeira,F. Almeida,T. Matos 和 J. Reis,葡萄牙波尔图 Vinho Verde 地区葡萄栽培委员会
【2】Friedman,Jerome H .【贪婪函数逼近:梯度提升机器】统计年鉴(2001):1189–1232。
插图由作者完成。*
亚马逊 SageMaker 非常适合机器学习的 10 个理由
学习 SageMaker 使构建、训练和部署您的 ML 模型的过程更加容易。
Amazon Web Services 是世界上最常用的云提供商,数据科学家越来越需要像 DevOps 人员一样了解云服务。数据科学家需要建立和使用数据管道,使用数据仓库,在云中训练和托管 ML 模型等。在这篇博客中,我们将专注于机器学习模型的开发。
亚马逊 SageMaker 使得在全球范围内扩展 ML 模型成为可能[ 来源
亚马逊 SageMaker 是 AWS 提供的一项强大服务,用于构建、训练和部署你的机器学习模型。它由 AWS 于 2017 年发布,并迅速获得了很大的人气,然而,没有多少数据科学家在使用这项服务,因为它相当新。在这篇博客中,我们将讨论 SageMaker 以及如何在您的机器学习项目中使用它——不仅用于构建和训练模型,还用于部署您的模型以供成千上万的用户使用。
SageMaker 的一个伟大之处是它的模块化设计。如果您喜欢在其他地方进行培训,而只是使用 SageMaker 进行部署,那么您可以这样做。如果您只是喜欢训练您的模型并使用其超参数调整功能,您也可以这样做。这是我真正喜欢 SageMaker 的地方。考虑到这一点,让我们开始了解亚马逊 SageMaker。我们将涵盖 SageMaker 帮助的 3 个广泛领域:模型构建、模型培训和模型部署——以及每个领域的 3 个优势。
模型结构
在最基本的层面上,SageMaker 提供了 Jupyter 笔记本。您可以使用这些笔记本来构建、培训和部署 ML 模型。许多数据科学家使用这些笔记本进行探索性数据分析和模型构建阶段。您可能想开始使用类似熊猫的东西来探索数据集—您有多少丢失的行?数据的分布是什么样的?有没有数据不平衡之类的?您可以构建许多不同的模型,从来自 Scikit Learn 的逻辑回归或决策树到来自 Keras 的深度学习模型,并快速获得基准性能。因此,当您使用 SageMaker 时,笔记本界面保持不变,没有任何区别!
那么你可能会问的一个问题是→使用 SageMaker 笔记本而不是本地或者某处 EC2 服务器上托管的笔记本有什么优势?嗯,SageMaker 允许您决定您喜欢的机器类型,因此您不需要管理任何复杂的 ami 或安全组——这使得入门非常容易。SageMaker 还提供对 GPU 和具有大量 RAM 的大型机器的访问,这在本地设置中是不可能的。
让我们把 SageMaker 对于建模的所有优势罗列出来:
**1。**从 2 核和 4GB 的机器到 96 核和 768GB RAM 的机器,您只需点击一下按钮就可以访问这些机器,笔记本电脑就托管在这些机器中,无需您付出任何额外的努力。您不必管理任何安全组或 ami,也不必管理机器的 IP 地址或任何东西。下面列出了不同类型的笔记本电脑,以及全天候运行时每月的价格。
不同 AWS 实例的 CPU/GPU 数量、RAM 和定价[ 定价、[计算](http://Source 2)
2。第二个优势是它附带预配置的环境——您不需要单独安装 TensorFlow 或其他公共库。
**3。**另一个优势是,您可以将您的 Github 帐户与这些笔记本相关联,这样您就可以在构建模型时继续使用 Github repo,而无需担心下载和上传文件以进行版本控制!这可通过 SageMaker 笔记本电脑的 JupyterLab 界面获得。我真的很喜欢这个功能。
模特培训
下一步是模特训练。您可以使用相同的笔记本来训练模型,并在 S3 存储模型工件和文件,然后移动到模型部署的下一步。但是,如果你正在做一个需要几个小时训练的模型,比如说,带有复杂 LSTM 模型的语言翻译模型,该怎么办呢?在这种情况下,您可以从 Sagemaker notebook 本身调用一个 GPU 来训练模型,而不是使用可能在小型实例上运行的 notebook 本身。这样,您可以在运行笔记本电脑的同时节省成本,因为大多数任务都是围绕构建、检查和探索模型进行的。同样,对于培训模型培训本身,您可以使用另一台机器,该机器不同于用于运行笔记本的机器。
所以使用 SageMaker 进行模型训练的优势有:
**1 .**你可以在非 GPU t2.medium 上运行笔记本电脑,价格约为 40 美元/月,但你可以使用 p2.xlarge GPU 实例,价格约为每小时 1.2 美元——只有用于实际训练模型的秒数才会向你收费。这可以节省大量成本。通常你会用 GPU 启动 EC2 服务器——安装所有的东西,运行你的脚本,并且必须记住关闭它。在这里,你是自动按秒计费的实际训练时间。所以重复一遍,你可以使用一个便宜的实例来托管你的笔记本电脑,它可以运行 24 小时,不会花很多钱,但然后使用 GPU 来训练笔记本电脑本身的模型。
**2。**sage maker 用于模型训练的另一个特性是超参数调优。您可以创建超参数调整作业,以便您的模型可以在一夜之间调整,并在早上向您显示最佳超参数。
**3。**另一个优势是你可以使用亚马逊自己的预建模型,这些模型已经过高度优化,可以在 AWS 服务上运行。这些模型是预先构建的,您不需要做太多的工作来构建和检查模型。您可以使用预构建的 XGBoost 或 LDA 或 PCA 或 Seq to Seq 模型,所有这些都可以通过名为sagemaker
的高级 Python SDK 获得。这是一个很好的机会来提一下,也有一个低级别的 SDK 来访问 SageMaker,它是使用boto3
— boto3
编写的,是访问 Python 中其他 AWS 服务的常用方法。
模型部署
最后,我最喜欢使用 SageMaker 的原因是为了模型部署。即使您的模型可能不太复杂,并且可以在您的本地机器上轻松地进行训练,您仍然需要在某个地方托管该模型。然后是关于扩展模型的问题→你能建立一个服务来服务你的 ML 输出,可以被成百上千的用户同时使用吗?潜伏期呢?如果需求突然激增怎么办?对于所有这些,SageMaker 非常棒,因为它允许您在端点后托管模型。这个端点是一个运行在某个隐藏的 EC2 服务器上的服务。当然,您仍然需要选择您喜欢的实例类型。但是您不需要担心设置这个服务器——在创建端点的过程中,您可以选择诸如自动扩展组、您想要多少个服务器等等。
所以使用 SageMaker 进行模型部署的优势是:
**1。**在一个端点中托管 ML 模型——然后你可以从任何其他用通用语言编写的代码中调用这个端点。你也可以从 Lambda 函数中调用这个模型。这样,您的 web 应用程序就可以调用 Lambda 函数,该函数可以调用模型端点。如果您在某个地方托管自己的 API,那么 API 代码可以调用这个端点。您还可以配置 API Gateway 来接收 HTTP 请求,该请求调用 Lambda 函数,然后该函数调用 SageMaker 端点,如下所示:
使用 API 网关、Lambda 和 SageMaker 端点部署 ML 模型
注意:Amazon 将 SageMaker 模型托管在一个一天 24 小时运行的物理服务器上——服务器不会根据收到请求的时间而打开/关闭。因此,SageMaker 在无服务器领域处于 EC2 和 Lambda 的中间。服务器像 EC2 一样一直运行,但是你不能像 Lambda 一样配置和管理它。
**2。**另一个很大的优势是你可以在同一个端点上托管多个模型。为此,您需要创建一个定制的 Docker 容器映像。这相当复杂,但是 AWS 的 Github 中有启动代码。您将需要创建您自己的映像并在 ECR 中托管它,然后在托管多个模型时使用该映像。多模型端点允许您托管多个模型,并且实例被预先配置为处理多个模型的负载,而您不必担心这方面的开发。
多型号终端可以为您节省大量成本
**3。**您所有的日志都可以轻松存储在 CloudWatch 日志中。您不需要创建自己的日志管道,这是另一个优势。您可以监控机器上的负载,并根据需求扩展机器。
但是,有什么问题呢?SageMaker 价格昂贵,比 AWS 的同等 EC2 服务器选项贵 30%到 40%。一个 t2.medium 的价格是 33 美元/月,但是 SageMaker 的同等 ml.t2.medium 的价格是 40 美元/月。但我觉得所有这些优势在总体上造成了很大的成本差异——你只需为你在昂贵的服务器上使用的模型训练时间按秒收费。这让我想到了第十个优势,即亚马逊不断创新,并带来了新功能,如SageMaker Studio——因此,当您在模型管道中使用 sage maker 时,您将能够获得所有这些优势。
我觉得它可能会遇到 SageMaker 是一个神奇的药丸,可以解决你可能遇到的每个 ML 问题。我要说,这不是一个神奇的药丸,而是一个非常有用的工具。您仍然需要使用“handler”函数来配置预处理和后处理管道,并弄清楚您想要如何为多模型端点配置 Docker 容器。所有这一切都不容易,AWS 文档也不是那么好——因此,我建议您从小处着手,部署 MNIST 端点,然后从那里开始构建。SageMaker 是一个很好的工具,但我想描绘出完整的画面——很高兴听到你如何使用它,也让我知道我是否在这一集错过了什么。通过 LinkedIn 或 T2 的电子邮件或下面的评论联系我。祝你的 ML 之旅一切顺利!
如果你更喜欢听这个博客的音频版本,我也为这个博客录了一段播客——在这里我会更详细地介绍每一点。你可以在苹果播客、 Spotify 或 Anchor.fm 上听,或者在我最喜欢的播客应用之一:阴天上听。
对于评论/反馈/问题,或者如果你认为我在这一集里错过了什么,请通过sanket@omnilence.com或 LinkedIn:https://www.linkedin.com/in/sanketgupta107/联系我
资源:
1。亚马逊 SageMaker 端点的无服务器前端
2。多模型端点
3。超参数调整作业
是什么让光变轻
速度很重要。
照片由 Shiro hatori 在 Unsplash 上拍摄
梯度增强决策树(GBDT)是一种性能非常好的算法,它已经成为许多先进算法的基础,如 XGBoost、LightGBM 和 CatBoost。
在这篇文章中,我们将关注是什么让 LightGBM 变得又轻又快。LightGBM 是由微软的研究人员创建的,旨在建立一个比其他正在使用的 GDBT 更有效的实现。
让我们先简要讨论一下 GBDT 算法是如何工作的。我们将关注 LightGBM 的特别之处。
梯度提升意味着以这样一种方式顺序地组合弱学习器,即每个新学习器都符合来自前一步骤的残差。因此,每个新的学习者都会改进整个模型。最终的模型汇总了每一步的结果,从而形成了一个强学习者。在 GBDT 的例子中,弱学习者是决策树。
GBDT 的弱学习器决策树通过基于特征值分割观察值(即数据实例)来学习。该算法寻找将导致最高信息增益的最佳分割。
事实证明,寻找最佳分裂是决策树学习过程中最耗时的部分。GBDT 的先前实现使用预先排序或基于直方图的算法来寻找最佳分割。
- 预先排序:特征值预先排序,并评估所有可能的分割点。
- 基于直方图:连续特征被分成离散的箱,并创建特征直方图。
基于直方图的算法比预先排序的算法更有效。随着数据集在观测值和要素方面的增大,这两种方法的速度都会变慢。
LightGBM 从基于直方图的算法开始,因为它是更有效的算法。
基于直方图的算法的问题是扫描所有数据实例以找到关于信息增益的最佳分割。对每个特征都这样做。因此,基于直方图的算法的复杂性取决于数据实例和特征的数量。
为了解决这个问题,LightGBM 使用了两种技术:
- 梯度单侧采样
- EFB(独家功能捆绑)
下面我们来详细介绍一下这些技术的作用,以及它们是如何让 LightGBM 变得“轻”的。
梯度单侧采样
扫描所有数据实例以找到最佳分割是一种蛮力,这肯定不是最佳的。我们需要找到一种方法,以某种方式根据信息增益对数据实例进行采样。
一种方法是根据权重对数据进行采样。但是,它不适用于 GBDT,因为在 GBDT 没有样品重量。
GOSS 采用的解决方案是使用梯度对数据进行采样。梯度告诉我们:
- 小梯度:该算法已经在这种情况下进行了训练,与此相关的误差很小。
- 大梯度:与该实例相关的误差很大,因此它将提供更多的信息增益。
梯度小的数据实例提供不了多少东西。因此,我们可以排除梯度小的实例,只关注梯度大的实例。但是,在这种情况下,数据分布将会改变。我们不希望这样,因为这将对学习模型的准确性产生负面影响。
GOSS 提供了一种基于梯度的数据采样方法,同时考虑了数据分布。
选择具有较大梯度的数据实例。从具有较小梯度的剩余数据实例中,仅选择随机样本。小梯度的随机样本乘以一个常数以保持数据分布。
如您所见,只对数据集的一部分进行了采样。这就是该算法被称为“单侧采样”的原因。
GOSS 最终实现的是,模型的重点倾向于导致更多损失(即训练不足)的数据实例,而不会对数据分布产生太大影响。
EFB(独家功能捆绑)
简而言之,EFB 以一种新特征携带组合特征的信息的方式组合稀疏特征。
具有大量要素的数据集可能具有高稀疏性(即大量零值)。稀疏特征通常是互斥的,这意味着它们不会同时具有非零值。
例如,在典型的稀疏特征空间中,一行可能仅在一列中具有非零值(例如,编码文本数据)。
EFB 是一种使用贪婪算法将这些互斥特征组合(或捆绑)成单个特征(例如,互斥特征束)并因此降低维度的技术。
EFB 减少了 GDBT 的训练时间,而不太影响准确性,因为创建特征直方图的复杂性现在与束的数量而不是特征的数量成比例(束的数量远小于特征的数量)。
EFB 面临的挑战之一是找到最佳捆绑包。微软的研究人员设计了一种算法,将捆绑问题转化为图形着色问题。
在图着色问题中,将特征作为顶点,在不互斥的特征之间添加边。然后,使用贪婪算法来产生束。
更进一步,该算法还允许捆绑很少同时具有非零值(即几乎互斥)的特征。这意味着牺牲少量信息来加快训练速度。
捆绑的特性需要以智能的方式创建。考虑一组 3 个特性。捆绑特性的值应该能够为我们提供前 3 个特性的值。LightGBM 利用基于直方图的算法创建的离散箱。
包中特性的唯一值放在不同的容器中。这是通过向原始特征值添加偏移来实现的。
戈斯和 EFB 都让 LightGBM 快速运行,同时保持相当高的精确度。在一个典型的现实生活中,我们可能有大型数据集,所以效率和准确性一样重要。
感谢您的阅读。如果您有任何反馈,请告诉我。
是什么让逻辑回归成为一种分类算法?
进入现实世界
对数优势,基线的逻辑回归解释。
凯勒·琼斯在 Unsplash 上拍摄的照片——已编辑
—所有图像(情节)均由作者生成和修改。
很可能,对于每一个数据从业者来说, 线性回归 恰好是实现机器学习的起点,在这里你了解到为给定的独立规则集预言一个连续值。
为什么是逻辑的,不是线性的?
让我们从最基本的一个开始,在二元分类中,模型应该能够预测因变量为两个可能类之一,可能是 0 或 1 。如果我们考虑使用线性回归*,我们可以预测给定规则集的值作为模型的输入,但它将预测连续值,如 0.03、+1.2、-0.9 等。这不适于将其归类到两类中的一类,也不适于将其识别为预测一类的概率值。*
例如 当我们要预测一个网站是否是恶意的当 URL 的长度作为一个特征给定时,响应变量有两个值,良性和恶意。
分类数据的线性回归—按作者
如果我们试图将线性回归模型拟合到二元分类问题,模型拟合将是一条直线,并且可以看出为什么它不适合使用相同的直线。
为了克服这个问题,我们使用了一个 sigmoid 函数 ,它试图用指数曲线拟合数据来建立一个好的模型。
Logistic/Sigmoid 函数
逻辑回归可以用逻辑函数来解释,也称为 Sigmoid 函数,它接受任何实际输入 x ,并输出 0 和 1 之间的概率值,该概率值定义为:
使用上述逻辑函数的模型拟合可以如下所示:
分类数据的逻辑回归—按作者
此外,对于任何给定的自变量 t,让我们将其视为单变量回归模型中的线性函数,其中 β0 是截距, β1 是斜率,由下式给出:
输出 0 和 1 之间的值的通用逻辑函数 p 将变成,
我们可以看到,可分为两类的数据可以使用逻辑函数对线性函数中的给定变量进行建模。但是输入变量 x 和输出概率之间的关系不容易用 sigmoid 函数来解释,我们现在引入了Logit*(log-odds)函数,使得该模型可以用线性方式来解释。*
对数概率函数
对数赔率函数也称为赔率的自然对数*,是标准逻辑函数的逆函数,可以定义并进一步简化为:*
在上述等式中,术语如下:
- g 是 logit 功能。对于 g(p(x)) 的等式表明 logit 等价于线性回归表达式
- ln 表示自然对数
- p(x) 是因变量落入两类 0 或 1 之一的概率,给定预测值的某种线性组合
- β0 是线性回归方程的截距
- β1 是回归系数乘以预测值
通过进一步简化上述方程并对两边进行指数运算,我们可以推导出概率与线性模型之间的关系如下:
左项称为 赔率 ,定义为等价于线性回归表达式的指数函数。在两边都有 ln (对数基数 e)的情况下,我们可以将对数优势和独立变量 x 之间的关系解释为线性。
为什么要回归?
概率 p(x) 随变量 x 的变化不能直接理解,因为它是由 sigmoid 函数定义的。但是通过上面的表达式,我们可以解释变量 x 的对数几率的变化是关于变量 x 本身的线性变化。具有线性方程对数优势图可以被看作是,
对数优势与独立变量 x——作者
因变量的概率结果表明,线性回归表达式的值可以从负无穷大变化到正无穷大,然而,在用 sigmoid 函数进行变换之后,所得的概率表达式 p(x) 的范围在 0 和 1 之间,即 0 < p < 1。因此,这就是使逻辑回归成为回归分类算法的原因,它根据决策边界将线性回归的值分类到特定类别。
判别边界
决策边界被定义为一个阈值值,它帮助我们将 sigmoid 函数给出的预测概率值分类到一个特定的类别中,积极的或消极的。
线性决策边界
当两个或多个类别可以线性分离时,
线性决策边界—作者
非线性边界
当两个或多个类别不能线性分离时,
非线性决策边界—作者
多类分类
多类和二元逻辑回归背后的基本直觉是一样的。但是,对于一个多类分类问题,我们遵循一个 一个 v/s 全部分类 。如果该模型有多个独立变量,则传统方程被修改为:
这里,对数优势可定义为当线性回归变为使用 m 个外植体的多元回归时,与存在的多个独立变量线性相关。
如果我们必须预测天气是晴天、雨天还是刮风,我们正在处理一个多方面的问题。我们把这个问题转化为三个二元分类问题,即是否晴天、是否下雨和是否刮风。我们对输入要素独立运行所有三个分类,概率值相对于其他分类最大的分类成为解决方案。**
结论
逻辑回归是最简单的机器学习模型之一。它们容易理解,可解释,并且能给出相当好的结果。每一个使用逻辑回归的从业者都必须知道对数概率,这是这种学习算法背后的主要概念。考虑到业务需求和关于模型如何在模型中使用不同独立变量的解释,逻辑回归非常容易解释。这篇文章旨在提供一种简单的方法来理解回归背后的思想和逻辑回归提供的透明性。
感谢阅读。你可以在这里找到我的其他机器学习相关的帖子。
希望这篇帖子有用。我感谢反馈和建设性的批评。如果你想谈论这篇文章或其他相关话题,你可以在这里或在 LinkedIn 给我发短信。
探索和分析贷款违约背后的驱动因素,即,使贷款审批流程风险…
towardsdatascience.com](/insightful-loan-default-analysis-in-lending-credit-risk-model-b16bbfc94a2f)**
使用 LIME 解释文本分类器结果
是什么让你的问题在 Quora 变得不真诚?
Jules Bss 在 Unsplash 上的照片
在之前关于在现实世界应用中利用可解释性的帖子中,我简要介绍了 XAI(人工智能中的可解释性),它背后的动机,以及可解释模型在现实生活场景中的应用。
在这篇文章中,我将介绍 LIME,这是最著名的本地可解释模型之一,以及如何应用它来检测使 Quora 平台中的问题不真诚的术语。
什么是石灰,它是如何工作的?
作者在[1]中提出了 LIME,它是一种算法,通过用一个可解释的模型局部地近似它们,以一种可靠和可理解的方式解释任何分类器或回归变量的单个预测。
例如,ML 模型使用一组特征(喷嚏、体重、头痛、无疲劳和年龄)预测患者患有流感,而 LIME 突出显示了患者历史中导致预测的症状(最重要的特征)。打喷嚏和头痛被认为是导致流感的原因,而没有证据表明疲劳会导致流感。有了这些解释,医生就可以做出是否相信模型预测的明智决定。
来源:“我为什么要相信你?”
解释任何分类器的预测[1]
解释预测是呈现文本或视觉工件,提供对实例组件(例如文本中的单词、图像中的补丁)和模型预测之间关系的定性理解[1]。
石灰背后的直觉
LIME 是一个局部代理模型,这意味着它是一个经过训练的模型,用于近似底层黑盒模型的预测。但是,它的想法是将数据的变化生成到机器学习模型中,并测试预测会发生什么,使用这种扰动的数据作为训练集,而不是使用原始的训练数据。
换句话说,LIME 生成一个新的数据集,由置换样本和黑盒模型的相应预测组成。在这个新的数据集上,LIME 然后训练可解释的模型(例如,Lasso、决策树等等),该模型通过采样实例与感兴趣实例的接近度来加权。
加粗的红叉是正在解释的例子。LIME 对实例进行采样,使用黑盒模型(由蓝色/粉色背景表示)获得预测,并通过与被解释的实例的接近程度(此处由大小表示)对它们进行加权。虚线是学习过的局部解释[1]。
将 LIME 应用于 Quora 数据集和逻辑回归模型
Quora 虚假问题分类任务的数据集可以从这个链接下载。训练数据包括被问的问题,以及它是否被识别为不真诚。
我们来看这个数据集的两个问题和对应的类(1 为不真诚,0 为真诚的问题):
- 不真诚的问题:为什么特朗普相信普京告诉他的一切?他是共产主义者,还是愚蠢透顶?
- 真诚的问题:纬度和繁荣之间的强相关性可以部分地用另一个(如果被证明存在的话)有利的环境温度和大脑着迷之间的相关性来解释吗?
预处理步骤包括将数据分为训练集和验证集,然后将问题矢量化为 tf-idf 向量。
预处理代码。
黑盒模型是一个逻辑回归模型,以 tf-idf 向量作为输入。
作为黑箱模型的逻辑回归。
现在是时候应用 LimeTextExplainer 函数来为预测生成局部解释了。该函数需要解释的问题(索引 130609)、从黑盒模型(逻辑回归)生成的问题的预测标签以及用于解释的特征数量作为参数。
使用 LimeTextExplainer 为一个实例生成解释。
上述代码的结果如下:
Question:
When will Quora stop so many utterly stupid questions being asked here, primarily by the unintelligent that insist on walking this earth?
Probability (Insincere) = 0.745825811972627
Probability (Sincere) = 0.254174188027373
True Class is: insincere
分类器把这个例子做对了(它预测言不由衷)。
使用以下说明,以加权特征列表的形式给出解释:
结果是:
[('stupid', 0.3704823331676872),
('earth', 0.11362862926025367),
('Quora', 0.10379246842323496),
('insist', 0.09548389743268501),
('primarily', -0.07151150302754253),
('questions', 0.07000885924524448),
('utterly', 0.040867838409334646),
('asked', -0.036054558321806804),
('unintelligent', 0.017247304068062203),
('walking', -0.004154838656529393)]
这些加权特征是一个线性模型,它近似于测试实例附近的逻辑回归分类器的行为。粗略地说,如果我们从问题中删除“愚蠢”和“地球”,预测应该向相反的类别(真诚)移动大约 0.48(两个特征的权重之和)。我们来看看是不是这样。
结果是:
Original prediction: 0.745825811972627
Prediction after removing some features: 0.33715161522095155
Difference: -0.40867419675167543
不出所料,在从实例词汇表中删除了“地球”和“愚蠢”这两个词后,这个类现在变得真诚了。
结果可以显示在不同类型的可视化石灰。
注意,对于每一类,线上右边的单词是正的,左边的单词是负的。因此,“愚蠢”对不真诚是积极的,但对真诚是消极的。
您还可以使用下面的代码获得解释的条形图:
摘要
LIME 能够在本地解释任何类型的分类器(SVM、神经网络等)的预测。在这篇文章中,我将其应用于 Quora 问题数据集,以解释是什么使 Quora 中的问题不真诚,但它也可以集成到图像和结构化数据分类器中。您可以通过此链接访问更多代码和示例。
如果你有问题,欢迎在下面评论或通过邮箱或 Linkedin 提问。我会回答的。
我会继续张贴关于 XAI 和其他有趣的话题。敬请期待!!
参考
[1]里贝罗,M. T .,辛格,s .,& Guestrin,C. (2016 年 8 月)。“我为什么要相信你?”解释任何分类器的预测。《第 22 届 ACM SIGKDD 知识发现和数据挖掘国际会议论文集》(第 1135-1144 页)。
石灰码:https://github.com/marcotcr/lime
速配中什么最重要?
如今约会很复杂,所以为什么不获取一些快速约会技巧,同时学习一些简单的回归分析呢?
今天是情人节——人们思考爱情和关系的日子。人们相遇并建立关系的方式比我们父母或祖父母那一代要快得多。我敢肯定,你们中的许多人都被告知过去是怎样的——你遇见某人,和他们约会一段时间,求婚,结婚。在小城镇长大的人也许有一次寻找爱情的机会,所以他们确保不会把它搞砸。
今天,找到一个约会对象不是一个挑战——找到一个合适的对象可能是个问题。在过去的 20 年里,我们经历了从传统约会到在线约会,再到快速约会,再到在线快速约会。现在你只要向左或向右滑动,如果你喜欢的话。
在 2002 年至 2004 年间,哥伦比亚大学进行了一项速配实验,他们跟踪了 21 次速配会议,这些会议主要是年轻人与异性的会面。我在这里找到了数据集和数据的关键:http://www . stat . Columbia . edu/~ gel man/arm/examples/speed . dating/。
我感兴趣的是在短暂的互动中发现某人的什么,这决定了某人是否认为他们是匹配的。如果你以前从未做过,这是一个练习简单逻辑回归的好机会。
速配数据集
上面链接中的数据集非常庞大——超过 8000 个观察值,每个观察值有近 200 个数据点。然而,我只对速配约会本身感兴趣,所以我简化了数据,上传了一个较小版本的数据集到我的 Github 账户这里。我将把这个数据集拉下来,并对其进行一些简单的回归分析,以确定是什么因素影响了人们是否认为他们是匹配的。
让我们提取数据,快速浏览前几行:
library(tidyverse)
library(corrplot) download.file("https://raw.githubusercontent.com/keithmcnulty/speed_dating/master/speed_data_data.RDS", "speed_dating_data.RDS") data <- readRDS("speed_dating_data.RDS") head(data, 3)
我们可以从这个关键算出:
- 前五列是人口统计数据——我们以后可能要用它们来查看子群。
- 接下来的七列很重要。评估人决定此人是否匹配。然后我们在六个特征上打满分:吸引力、真诚、聪明、有趣、雄心和共同的兴趣。
like
栏是总体评分。prob
列是关于评价者是否相信对方会喜欢他们的评级,最后一列是关于两人是否在快速约会之前见过面的二元数据,较低的值表示他们以前见过面。
我们可以在任何分析中忽略前四列。我们这里的结果变量是dec
。我对其余的潜在解释变量感兴趣。在我开始做任何分析之前,我想检查一下这些变量中是否有高度共线的——也就是说,有非常高的相关性。如果两个变量测量的是差不多一样的东西,我可能应该去掉其中一个。
corr_matrix <- data %>%
dplyr::select(attr, sinc, intel, fun, amb, shar, like, prob, met) %>%
as.matrix() M <- cor(corr_matrix, use = "complete.obs") corrplot::corrplot(M)
好吧,很明显,当你快速约会时,会有迷你光环效应。但是没有一个升得很高(例如超过 0.75),所以我要把它们都留在这里,因为这只是为了好玩。如果我的分析有严重的后果,我可能想在这个问题上多花一点时间。
对数据运行逻辑回归
这个过程的结果是二进制的。回答者决定是或否。我给你说,这太苛刻了。但是对于一个统计学家来说,这很好,因为它直接指出二项式逻辑回归是我们的主要分析工具。让我们运行一个逻辑回归模型来分析我上面提到的结果和潜在的解释变量,看看结果。
model <- glm(dec ~ attr + sinc + intel + fun + amb + shar + like + prob + met, data = data, family = "binomial") summary(model)
所以,感知智力并不重要。(这可能是被研究人群的一个因素,我相信他们都是哥伦比亚大学的本科生,所以我怀疑他们的 s at 平均分都很高——所以智力可能不是一个区分因素)。你以前是否见过某人也一样。其他一切似乎都扮演着重要的角色。
更有趣的是每个因素在多大程度上扮演了 T2 的角色。上面模型输出中的系数估计告诉我们每个变量的影响,假设其他变量保持不变。但在上面的表格中,它们是以对数优势表示的,我们需要将它们转换成常规优势比,以便更好地理解它们,所以让我们调整我们的结果来做到这一点。
ctable <- coef(summary(model))
odds_ratio <- exp(coef(summary(model))[ , c("Estimate")]) (coef_summary <- cbind(ctable, as.data.frame(odds_ratio, nrow = nrow(ctable), ncol = 1))) %>% knitr::kable()
所以我们有一些有趣的观察结果:
- 不出所料,受访者对某人的总体评价是他们是否决定与之匹配的最大指标。
- 吸引力似乎是婚姻的主要正面指标。
- 有趣的是,真诚和雄心降低了匹配的可能性——它们似乎让潜在的约会对象扫兴。
- 其他因素也发挥了较小的积极作用,包括被调查者是否认为利益是对等的。
比较性别
当然,人们很自然地会问,在这些动态中是否存在性别差异。因此,我将对这两个性别子集重新进行分析,然后创建一个图表来说明任何差异。
# females only model_f <- glm(dec ~ attr + sinc + intel + fun + amb + shar + like + prob + met, data = data %>% dplyr::filter(gender == 0), family = "binomial") ctable_f <- coef(summary(model_f))
odds_ratio_f <- exp(coef(summary(model_f))[ , c("Estimate")])
coef_summary_f <- cbind(ctable_f, as.data.frame(odds_ratio_f, nrow = nrow(ctable_f), ncol = 1)) # males onlymodel_m <- glm(dec ~ attr + sinc + intel + fun + amb + shar + like + prob + met, data = data %>% dplyr::filter(gender == 1), family = "binomial") ctable_m <- coef(summary(model_m))
odds_ratio_m <- exp(coef(summary(model_m))[ , c("Estimate")]) coef_summary_m <- cbind(ctable_m, as.data.frame(odds_ratio_m, nrow = nrow(ctable_m), ncol = 1)) chart_data <- coef_summary_f %>%
dplyr::add_rownames() %>%
dplyr::left_join(coef_summary_m %>% dplyr::add_rownames(), by = "rowname") %>%
dplyr::select(rowname, odds_ratio_f, odds_ratio_m) %>%
tidyr::pivot_longer(cols = c("odds_ratio_f", "odds_ratio_m"), names_to = "odds_ratio") %>%
dplyr::mutate(
Effect = value - 1,
Gender = ifelse(odds_ratio == "odds_ratio_f", "Female", "Male"),
Factor = dplyr::recode(rowname, amb = "Ambitious", attr = "Attractive", fun = "Fun", intel = "Intelligent", like = "Liked", met = "Never met\nbefore", prob = "Believe\nthey like\nme", shar = "Shared\nInterests", sinc = "Sincere")) ggplot(data = chart_data %>% dplyr::filter(rowname != "(Intercept)"), aes(x=Factor, y=Effect, fill=Gender)) + geom_bar(stat="identity", color="black", position=position_dodge()) + theme_minimal() +
labs(x = "", title = "What matters in speed dating?") + scale_fill_manual(values=c('#FFC0CB', '#0000FF'))
我们发现了一些有趣的差异。不出所料,外表吸引力似乎对男性更重要。根据长期以来的信念,智力确实对女性更重要。与男性相比,它有着显著的积极作用,而男性似乎没有发挥有意义的作用。另一个有趣的区别是,你以前是否见过某人对两组人都有显著影响,但我们以前没有看到,因为它对男性和女性有相反的影响,所以平均起来是不重要的。男人似乎更喜欢新的互动,而女人喜欢看到熟悉的面孔。
正如我上面提到的,整个数据集非常大,所以这里有很多可以探索的地方——这只是可以收集到的一小部分。如果你最终用它来玩,我对你的发现很感兴趣。
最初我是一名纯粹的数学家,后来我成为了一名心理计量学家和数据科学家。我热衷于将所有这些学科的严谨性应用到复杂的人的问题上。我也是一个编码极客和日本 RPG 的超级粉丝。在 LinkedIn 或Twitter上找我。也可以看看我在drkeithmcnulty.com的博客。
谋杀和冰淇淋与数据驱动的产品管理有什么关系?
unsplash.com
答案是:混杂因素。
研究表明谋杀率和冰淇淋销量之间有一种虚假的关系。( 1
这种虚假的关系并不意味着一个导致另一个。接下来会发生什么?是温暖的天气导致人们买更多的冰淇淋,变得更加暴力——“温暖的天气”是我们的混淆因素。( 2 )
这与数据驱动的产品管理有什么关系?
你的数据驱动软件产品依赖于很好地利用从原始数据中推断出来的洞察力和特性的能力(显然还有其他因素,比如设计等)。识别和整合的相关混杂因素越多,你的洞察力就越强。因此,你的产品功能越好,顾客越满意,业务表现越好。当产品管理团队拥有变量选择(独立变量、相关变量和混杂变量)方面的专业知识,并结合领域知识时,就会出现这种情况。
在成为数据驱动的项目经理的过程中,最初的步骤是艰难的,但从长远来看,它会变得更容易。以下是数据驱动的产品管理可以如何开始(这不包括业务方面):
- 阐明产品将解决或填补的问题或市场空白。
- 从基于数据的产品构思开始,而不是从产品的视觉方面开始。(这一点非常重要,尽管跳到 PowerPoint 并画出产品的样子以及路线图非常有诱惑力,因为这让业务领导层更容易理解)。
- 考虑数据来源、所有权、合同方面、隐私和 GDPR。
- 接近相应的团队:除了软件开发等常见的团队,还要接近 DevOps、数据科学、数据工程、法律团队等。并向他们介绍新产品。
- 询问有关数据字段、数据新鲜度、外部和内部数据集成能力、管道、可用性、数据收集、法律方面的所有权、技术方面的所有权的技术细节。
- 咨询内部领域专家,询问还有哪些混杂因素会影响你的产品洞察力。
- 请务必与外部领域专家进行交叉检查,而不要提供与产品细节相关的内部数据。询问与你潜在产品的洞察力有任何关系的变量。这将有所帮助,因为外部专家不会因任何性质的内部公司信息而产生偏见。
- 与数据科学和数据工程团队交叉检查新信息。问什么是可能的。
- 创建数据的产品/业务工作流,直至洞察。
- 索要软件、基础设施和数据架构设计图。这将使产品管理人员能够创建各种依赖关系的整体图,并主动采取行动。
- 明确数据集成和收集选项——尤其是在数据湖可用的情况下。
- 让 UX /用户界面专家根据现有的工作流程和数据来完成他们的工作。有了可用的数据和数据驱动,UX/UI 的工作变得简单多了。
- 规划和设计数据,这些数据将在产品推出和收集新的数据功能后提供。这将有助于您的新产品功能避免最终的冷启动问题。
- 进一步的步骤是大多数 PM 团队的标准。
如果可能,并且你已经准备好了,与最终用户协商,并采纳反馈,特别是当产品开始有设计的时候。
我相信今天最常见的方法,但幸运的是逐渐消失,是从用户界面开始一个产品。不过以我的经验来看,这类产品的成功率是比较低的。从全局来看,这并不一定是坏事——想想从失败中学习,快速迭代,拥抱失败,等等。一些企业可以忍受迭代许多 POC/MVP,直到最后,很少一部分成功进入产品。然而,以学习的名义提供高的软件产品实验失败率似乎正在消失。理想情况下,成功/尝试的比率必须尽可能接近值 1(例如在开发成 POC 的 10 个产品创意中,有 5 个已经投入生产并获得成功:成功/试用比率等于 0.5)。
**建议:**作为一家公司,记录 PoC 级别的所有产品计划,并查看有多少计划最终被推向市场(附带持续成功指标)。可接受的比率必须由企业定义。我认为有道理的经验法则是,所有试验的成本不得超过劳动力支出的 20%。这种方法的主要好处之一是,产品管理将非常容易呈现数据驱动的成功结果,并要求更多的预算。
如果产品是增量开发的,那么产品成功的机会更大;大量基于数据、领域专业知识、用户反馈和科学。因为可以更好地控制成本,所以公司对基于各方面数据创建的产品感兴趣:自有原始数据、市场数据、客户数据、业务数据、要收集的数据、第三方数据等。
让我们回到这篇文章的核心,混杂因素。这里有一个例子。
想象一下,你的公司开发了一个软件,可以为员工推荐奖金。你的软件看工资率,以前的表现,性别,工作任期(任何角色)。你的软件使用机器学习来推荐奖金(使用协同过滤)。这是一个转折。机器学习模型是有偏见的,因为公司的文化建立在性别歧视的基础上,它倾向于高薪员工,它倾向于更长的工作任期。这意味着,推荐者将向职位最高、在公司工作时间最长、在加入公司时表现出色但现在不一定表现出色的男性员工推荐最高奖金。推荐者将会错过一位高产的中层管理女商人,她已经在公司工作了几年,而且一直表现出色。
你的软件使用机器学习并且是数据驱动的…或者是吗?
有很多因素会影响这些建议。考虑时间是一个混杂因素。如果 ML 模型将加权时间维度整合到工作任期和以前绩效的函数中,则推荐会更好。请注意,时间有它的关系方面。更长的工作任期不一定意味着更好的绩效,但机器学习模型可能会基于公司习惯而变得有偏见,以奖励更老的任期员工(见下文的人力资本理论)。绩效评估越老,与今天的奖金就越不相关,这需要反映在你的模型参数中,也许作为一个衰减参数。
以下引用说明了组织可能采用的不同方法。
人力资本理论表明,随着知识和技能随着任期的延长而增加,工作绩效也会提高。相比之下,关于工作设计的文献表明,随着工作年限的增加,员工可能会变得更加无聊,工作积极性更低。( 3
对于产品经理来说,在将精力投入到路线图、工作流程、功能和设计之前,考虑尽可能多的数据变量是非常重要的。尽管混杂因素通常很难识别和整合,但它们很可能会给你的产品带来备受追捧的秘方。
作为思考的食粮,这里有几个问题。如果我们能够控制气候变暖的干扰因素,让它一直保持在零,会发生什么?你能消除或控制使你的产品见解复杂化或使你的产品贬值的混淆因素吗?
冠状病毒期间我们听什么音乐?使用数据科学的报告
一切都变了,我们的音乐习惯也不例外。
西蒙·诺在 Unsplash 上的照片
大约20 亿人现在被隔离,我们生活的方方面面都因病毒而改变。娱乐和其他的没什么不同。网飞达到了历史上的巅峰。人们用 Zoom 开派对和新闻媒体推荐隔离 Spotify 播放列表。隔离播放列表的报道不是巧合。我给其中的几个投稿,并在我的社交媒体流上发现了几十个。人们正在制作许多冠状病毒主题的播放列表。这一切让我很好奇。在冠状病毒时代,我们在听什么?
我决定从 Spotify 播放列表中收集包含疫情相关词汇的数据,并对其进行分析。我想发现热门歌曲的频率,并将它们的音乐特征与隔离前我们听的歌曲进行比较。
谢天谢地,Spotify 有一个有用的 API。在这里,我将描述收集数据然后嵌入代码的过程。
首先,我们将使用 API 来收集包含我们想要的术语的所有播放列表。我搜索了四个术语,尽量做到包罗万象。我用来收集数据的术语是“COVID”、“corona”、“Quarantine 2020”和“Coronavirus”。搜索分别返回了 7940、9322、9383 和 2830 个结果。但是这里出现了第一个问题。用 Spotify API 每次搜索只能得到两千个结果。
坏消息是由于限制,我们只能得到一些数据。所以,我们讨论的一切都是关于数据的样本。
好消息是,先前的数字是重叠的,因此真正唯一的总数没有那么高,样本将是足够的。
经过四次请求,我们获得了 7085 个唯一播放列表。
结果的一个样本能够适合这里
让我们看看播放列表。平均一个播放列表有 103 首歌曲和一个非常有创意的名字。好吧,也许最后一个没有被科学证明。最大的播放列表包含 8846 首歌曲,有人听完它们的可能性为零,最短的播放列表包含 3 首歌曲。
现在我们想使用 API 来收集关于播放列表的数据。我们想得到他们包括的歌曲和关于歌曲的数据。
运行代码后,我们发现播放列表包含 725,824 首曲目和 275,316 首独特的歌曲。有很多歌曲,其中大多数只在几个播放列表中,这表明它们与情况无关。我想为将要进一步分析的数据添加一个过滤器。我决定一首好的第一个过滤器是一首歌至少在 10 个播放列表中;这给了我 10K 周围的歌曲,所以我只收集这些歌曲的元数据。元数据主要是音频特征。
我想解释一些关键的音频特性,我们稍后需要了解。
- 速度:音轨的速度,单位为每分钟节拍数(bps)
- 效价:衡量音轨音乐积极性的一个指标,效价越大,歌曲越积极
- 音量:一首歌的音量有多大,单位是分贝(dB)
- 可跳舞性:一条赛道有多适合跳舞
- 声音度:音轨的声音置信度
- 能量:歌曲强度和活跃程度的量度
在 API 的文档中有更多关于它们的信息。
获取上述数据的脚本
现在让我们来玩我们的数据。
这是排名前 100 的歌曲列表。从他们的名字来看,他们中的大多数人都很清楚为什么他们会出现在这个播放列表中。
但是让我们更深入地了解一下 10K 歌曲排行榜。由于所施加的过滤器,一首歌曲最多出现 1091 次,最少出现 10 次。平均出现 29 次,75%的歌曲出现次数少于此。这意味着另外的 25%包含了更大的价值。下面的直方图可以更好的解释。
我们有 1954 年发行的最古老的歌曲和 2020 年发行的最新歌曲。大多数歌曲来自过去十年,但这并不意味着它们是我们播放列表中最受欢迎的,正如我们在下面的直方图中看到的那样。
按年份划分的歌曲直方图
按发行年份排列的外观散点图
我们可以做的进一步分析是将它们的音频特征与一些基线进行比较。我决定使用 2019 年播放列表的顶级曲目作为基线。这是我们在危机前听到的一小部分内容。
我用箱线图比较了三个数据集的主要音频特征,即 2019 年的前 100 首歌曲和我们数据的前 10k 首歌曲。
顶级 10K 数据集非常庞大,范围太广,最后的歌曲只出现在 7k 的 10 个播放列表中,因此具有更大范围的值和更少的信息是合乎逻辑的。
音频分析
在我们的数据中,效价更大,所以似乎我们听的是更积极的歌曲。
可跳舞性略低,这不应该让我们感到惊讶,跳舞和社交距离不是很好。
速度似乎与数据集无关。
在我们的数据中,速度是另一个稍低的指标。我有一种感觉,这是因为最近(包括 2019 年)我们有很多嘻哈/说唱的点击量,而我们的数据也包括前几十年的数据和更多样化的音乐流派。
像速度一样,响度似乎不会改变。
我们的数据具有较低的声音和略高的能量,我们可能处于锁定状态,但我们尽量不停机!
对歌曲频率和音频特征的分析导致了一些非常有趣的模式的发现…似乎我们在经历非常艰难的经历时,用音乐来帮助我们变得积极。
该项目可以有更多的功能。我能想到的第一件事是对播放列表的标题和描述做一些自然语言处理。欢迎在评论中提出更多想法,甚至写一篇关于它们的文章,并在那里贴上链接。
谢谢你对我的作品感兴趣。我希望你喜欢这篇文章,并学到了一些新东西。
待在家里。注意安全。
“没有免费的午餐”在机器学习中真正意味着什么
揭开这个经常被误解的定理。
Riccardo Bergamini 在 Unsplash 上拍摄的照片
谁不爱免费的午餐?你不用做饭,也不用花你的任何血汗钱。对任何人来说都很划算!事实是,除非你算上研究生院承诺免费披萨的特殊讲座和演讲,否则在机器学习领域就没有免费的午餐。
监督机器学习的“没有免费的午餐”(NFL)定理本质上暗示了没有单一的机器学习算法是普遍适用于所有问题的最佳算法。这是我在上一篇关于 XGBoost 局限性的文章中探讨的一个概念,XGBoost 是一种算法,由于它在学术研究和机器学习竞赛中的表现,在过去五年中获得了巨大的流行。
XGBoost 和其他基于树的算法的一个关键限制。
towardsdatascience.com](/why-xgboost-cant-solve-all-your-problems-b5003a62d12a)
本文的目标是利用这个经常被误解的定理并解释它,以便您可以欣赏这个定理背后的理论,并理解它对您作为机器学习实践者或数据科学家的工作的实际影响。
归纳的问题
奇怪的是,启发 NFL 定理的想法是由 18 世纪的一位哲学家首先提出的。是的,你没看错!不是数学家或统计学家,而是哲学家。
18 世纪中期,一位名叫大卫·休谟的苏格兰哲学家提出了他所谓的归纳 的 问题。这个问题是一个哲学问题,问归纳推理是否真的引导我们走向真知。
归纳推理是一种推理形式,我们根据过去的观察得出关于世界的结论。奇怪的是,这正是机器学习算法所做的。如果神经网络看到 100 张白天鹅的图像,它可能会得出所有天鹅都是白色的结论。但是如果神经网络看到一只黑天鹅会怎么样呢?现在,算法学习的模式突然被一个反例推翻了。这个想法通常被称为黑天鹅悖论。
Yuvraj Yadav 在 Unsplash 上拍摄的照片
休谟用这种逻辑来强调归纳推理的局限性——我们不能将一组特定的观察结果应用到一组更普遍的观察结果上。
“没有论证可以证明,那些我们没有经历过的实例,类似于那些我们经历过的实例。”——大卫·休谟在《人性论》中
同样的想法成为 200 多年后机器学习的 NFL 定理的灵感。
Wolpert 在机器学习中的应用
在他 1996 年的论文学习算法之间缺乏先验区分中,Wolpert 为监督机器学习引入了 NFL 定理,并在论文开头引用了 David Hume 的话。该定理指出,给定无噪声数据集,对于任何两个机器学习算法 A 和 B,A 和 B 的平均性能在从均匀概率分布中抽取的所有可能的问题实例上将是相同的。
为什么会这样呢?这又回到了归纳推理的概念。**对于机器学习问题,每个机器学习算法都预先假设特征和目标变量之间的关系。**这些假设通常被称为先验假设。机器学习算法在任何给定问题上的性能取决于算法的假设与问题的现实相符程度。**一种算法可能对一个问题表现得很好,但这并不意味着我们有理由相信,在同样的假设可能不起作用的另一个问题上,它也会表现得一样好。**这个概念基本上就是机器学习背景下的黑天鹅悖论。
**你在选择任何算法时做出的限制性假设就像你为午餐支付的价格。**这些假设将使你的算法在某些问题上自然更好,同时在其他问题上自然更差。
偏差-方差权衡
统计学和机器学习中与 NFL 定理密切相关的一个关键思想是偏差-方差权衡的概念。这一概念探讨了任何模型的两种误差源之间的关系:
- 模型的偏差是来自模型中潜在错误的先验假设的误差。这些假设导致模型错过了关于机器学习问题的特征和目标之间的关系的重要信息。
- 模型的方差是来自模型对训练数据微小变化的敏感度误差。
具有高偏差的模型通常过于简单并导致欠拟合,而具有高方差的模型通常过于复杂并导致过拟合。
过度拟合与欠拟合。来源: Edpresso ,根据 CC BY-SA 4.0 授权。
如上图所示,具有高偏差的模型无法正确拟合训练数据,而具有高方差的模型则很好地拟合了训练数据,以至于它记住了这些数据,却无法正确地将学到的知识应用到新的真实数据中。给定问题的最优模型介于这两个极端之间。它有足够的偏差来避免简单地记忆训练数据,并且有足够的方差来实际拟合训练数据中的模式。这种优化模型是通过优化偏差-方差权衡来实现对给定问题的测试数据的最低预测误差的模型,如下所示。
偏差-方差权衡。来源:临床数据科学基础,4.0 授权 CC 下。
显然,每个机器学习问题都有一个不同的点,在这个点上,偏差-方差的权衡被优化,预测误差被最小化。正因如此,没有一个超级算法能比每一个其他算法更好地解决每一个机器学习问题。每种算法都做出假设,创造不同类型和水平的偏差,从而使它们更适合某些问题。
“没有免费的午餐”对你意味着什么
所有这些理论都很棒,但对于作为数据科学家、机器学习工程师或只想开始学习机器的人来说,“没有免费的午餐”意味着什么?
是不是说所有算法都是平等的?不,当然不是。实际上,所有的算法并不都是平等的。这是因为整个机器学习问题集是 NFL 定理中的一个理论概念,它比我们实际尝试解决的实际机器学习问题集要大得多。在某些类型的问题上,一些算法可能通常比其他算法表现得更好,但是由于算法的先验假设,每个算法都有缺点和优点。
像 XGBoost 这样的算法可能会赢得数百场 Kaggle 比赛,但在预测任务中却惨败,因为基于树的模型中涉及到有限的假设。当涉及到图像分类和语音检测等复杂任务时,神经网络可能表现得非常好,但如果没有正确训练,就会因其复杂性而遭受过拟合。
实际上,这就是“没有免费的午餐”对你的意义:
- 没有一种算法会比其他算法更好地解决你所有的机器学习问题。
- 在选择要使用的算法之前,确保你完全理解一个机器学习问题和所涉及的数据。
- 所有模型的好坏取决于创建它们时的假设以及用来训练它们的数据。
- 逻辑回归等更简单的模型偏差更大,容易欠拟合,而神经网络等更复杂的模型方差更大,容易过拟合。
- 给定问题的最佳模型位于两个偏差-方差极值的中间。
- 为了找到解决问题的好模型,您可能需要尝试不同的模型,并使用稳健的交叉验证策略对它们进行比较。
来源
- 《斯坦福哲学百科全书》,归纳的问题,(2018)。
- 迪派,黑天鹅悖论定义,(2020),deepai.org。
- D.休谟,人性的论述,(1739),古腾堡计划。
- D.H.Wolpert,学习算法之间缺乏先验区分,(1996),CiteSeerX。
非数据科学家需要了解的数据科学知识
黑盒并不是数据科学被非专业人士视为魔法的唯一原因。从局外人的角度来看,缺乏对数据科学流程和数据科学构成要素的理解会增加神秘感(或海市蜃楼)。虽然保留数据科学的魅力可以增强自我,但这应该是你最终想要解决和消除神秘感的事情。这里有 5 件重要的事情,你应该告诉你的非数据科学同行,让你的生活更轻松。
数据科学是迭代的
在数据科学中,您计划遵循一个流程,但是您将许多决策外包给了您正在使用的工具。你从一个清晰的问题陈述开始,但是在你开始处理数据之前,你将使用的方法和你在每个阶段花费的时间在很大程度上是未知的。这种方法会比你的其他同行少很多确定性。你需要让这些利益相关者明白这一点——来管理你的团队的期望。
通过这样做,你将能够减少与组织和解释你的工作相关的摩擦,并让你专注于获得结果。这也将为你赢得空间和时间来进行必要的实验。
学习是这份工作的一大部分
被视为无所不知当然很好,但是做桌面研究来填补你知识的“空白”并保持更新是这份工作的一大部分。研究给定方法的最佳实践是非常耗时的——特别是考虑到最佳实践比其他领域发展得更快。同样,为了管理期望,如果清楚地理解了这一点,并且如果您计划任何时间进行桌面研究,在库/包之间进行比较,并且在与您的利益相关者一起计划一项工作时阅读相关文档,这将是很有帮助的
毕竟,如果 Excel 用户通过在堆栈溢出上发布他们的查询来解决他们的问题,那么人们肯定应该理解,像数据科学这样的更密集的过程需要花费更多的时间来进行桌面研究,并与同事合作来解决特定项目的问题。
数据科学这个术语在传统上一直很模糊,可能涵盖多种技能
数据科学正被非数据科学家甚至一些数据科学家用作一个包罗万象的术语,通常涵盖广泛的任务和计划。隔离纯数据科学活动可以帮助您的非数据科学同行了解什么构成了数据科学,什么没有。进行这样的对话尤其有助于做出招聘决定。它还可以帮助您确定可以利用的其他团队,以执行数据科学领域要求的一些工作。
再说一次,不被认为是数据万事通最终符合你的最佳利益,进行这些对话可以帮助你雇佣适合目标的新员工,管理期望,并确定可以将非数据科学相关的数据任务委派给哪些团队。
数据科学包括大量的前期工作
你花在数据科学上的时间有一半以上是在为未来的任务准备环境,主要是数据。教授非数据科学家将向他们展示在实际着手解决问题之前,准备和清理数据的准备工作有多深入。这样做还可以让您开始对话,展示任何数据集的局限性,并概述可以从数据集做出哪些决策以及在做出这些决策时需要考虑的事项。它还让你有时间和空间来完成这项重要的工作,达到所需的详细程度,而不必过早地处理结果或成果。
它还可以帮助您确保他们的参与,帮助您定义您正在使用的分类变量中可能会出现的大量业务术语,以及您将从业务中要求的其他方向,以确保您围绕期望的结果优化您的流程。
我相信,对您的利益相关者进行这 4 个方面的最低限度的培训,有助于提高您的工作效率,以及数据科学领域和其他领域之间的跨团队协作。
它可以帮助揭开人们将数据科学与一些“魔法”联系在一起的神秘面纱。就你的工作需要做什么进行诚实的对话,将使你专注于核心数据科学活动,并释放不得不身兼数职的压力
这个故事和其他类似的故事最初发表于 这里
皮特·布蒂吉格对数据驱动的决策有什么看法
数据驱动的决策制定
前民主党总统候选人和“技术市长”坚信数据和分析。
加里·里格斯在维基共享资源
印第安纳州南本德市前市长皮特·布蒂吉格在作为 2020 年总统候选人竞选时获得了全美国的欢迎。
他成功筹集了大量资金,并在爱荷华州和新罕布什尔州取得了惊人的好成绩。在未能保持住势头后,他退出了民主党竞选。不过,在第一次听说他的故事后,我还是很感兴趣。
出生在铁锈地带,他获得了哈佛和牛津的学位,在麦肯锡担任顾问,在阿富汗战争中服役,并在 29 岁时成为南本德市长。尽管在他的两届市长任期内面临争议,但他已经说服居民和利益相关者,他的家乡不仅仅是一个以前的制造业所在地。
我拿起他的书 【回家的捷径】 ,惊讶地发现他是数据驱动决策的坚定信徒。他认为,分析性分析有助于城市变得更加高效和以事实为导向,而不是基于直觉做出决定。
咨询出身的他首先认为,更多的数据和分析对他的政府总是有益的。但很快,他意识到许多资源可能会被浪费,因为生成的数据要么没有被使用,要么只给出了已知的信息。
他必须确保数据不仅是生成的,而且是有用途的。
我想和你们分享一下皮特·布蒂吉格在担任市长期间学到的六条重要经验。
1.报告和解决问题是有区别的。
有时候,报告和解决问题可以齐头并进。
例如,皮特·布蒂吉格政府安装了 ShotSpotter 技术,使用麦克风来发现整个城市的枪声。一方面,政府获得了关于开枪地点的可靠数据。这一点至关重要,因为当枪声响起时,一些居民区没有报警。另一方面,警察可以更快地处理枪支暴力案件。
但通常情况下,对问题了解得更多并不能帮助解决问题。
例如,前市长参加了一次会议,会上一家初创公司介绍了一种可以自动检测污水中阿片类物质模式的产品。政府很清楚南本德的阿片类药物使用问题,但缺乏资金来照顾精神健康和成瘾资源。在获得阿片类药物检测产品的过程中,管理部门会收集更多关于这个问题的数据。但是,这也会从解决这个问题的计划中拿走宝贵的资源。
因此,他在书中认为,当一个人已经意识到一个问题并有办法解决它时,他应该专注于解决这个问题。这并不意味着报告问题是不必要的,但也不足以解决问题。
2.响应速度和效率是有区别的。
在皮特·布蒂吉格担任市长期间,他不得不在快速反应和提高效率之间做出选择。
在扫雪的情况下,他可以决定扫雪人员总是首先被赶到街道上,因为那里的居民会打电话来。这将使这些街道上的居民非常高兴,但这不是一个有效的方法。
为什么?因为这些人会在城市中穿梭。通过使用基于区域的方法,扫雪机工作人员可以更快地处理所有街道。但这意味着并不是每一条无法通行的路都被直接照顾到了。
在其他时候,皮特·布蒂吉格认为有求必应是最有效的事情。例如,涂鸦一旦被报道就应该被处理,因为其他人可能会被激励去模仿或超越这种涂鸦。还有,如果是直接打理,不鼓励涂鸦者污损公物。
罗伯特·v·鲁杰罗在 Unsplash 上的照片
3.诚实地说出你是否愿意跟随数据的走向。
为了这次学习,这位前市长必须决定如何控制垃圾账单率。
他向他的一位公共工程主管寻求帮助。他得到了各种各样的想法:出售垃圾桶上的广告空间,根据垃圾量向客户收费,或者引入使用机械臂的自动化垃圾车。
自动垃圾车是最好的解决方案,部分消除了人工垃圾收集和减少受伤率。数据清楚地表明,这项新技术将导致更低的垃圾账单率。
这是一个艰难的决定。用机器代替人类往往意味着一些人会失业。
他决定推进这一提议,一半被解雇的工人能够转到城市提供的其他工作岗位。
在其他时候,皮特·布蒂吉格并没有做好遵循数据的准备。
人们可以去缴纳水费的办公室似乎是另一个时代的事情了。人们可以通过电话或电子邮件在线支付。那么,为什么仍然需要这种昂贵的基础设施呢?因为特别是低收入的居民没有银行账户。他们需要一个可以支付现金的地方,即使这对城市来说很昂贵。
当然,人们可以跟踪这个案例的数据,但这将意味着对这些低收入居民的严重伤害。那么,你真的愿意跟着数据走吗?
4.数据可以显示你从未问过的问题的答案。
有时候,寻找一个答案可以引出另一个问题的答案。
还记得枪击技术的例子吗?收集这些数据和更快地获得枪击案件的帮助有助于回答另一个关键问题。邻里信任警察到什么程度?打电话的邻居越少(如果有的话),警察的合法性就越低。
此外,这使得即使没有人打电话,警察也能出现。邻居们认为警察不会在意他们地区的枪声。通过来到这些社区,警察能够增加信任。
因此,问自己这样一个问题是有帮助的:“有没有另一个问题我可以用这些数据来解决?”
5.技术和道德问题的混淆。
回答技术问题似乎很容易,因为它们通常是对或错的问题。但当涉及道德问题时,让一个人过得更好而不让另一个人过得更糟通常是不可能的。
例如,城市决定得到这些新的自动垃圾车。虽然这降低了浪费率,但也导致了裁员。居民们不再把垃圾桶放在小巷里,而是被迫把垃圾桶拖到前面的路边。当然,工人和居民对这一变化并不满意。
皮特·布蒂吉格对这一决定的陈述是,没有数学公式来解决这种权衡。因此,他们必须做出决定,并向受影响的人解释他们为什么做出这一决定。
6.例外很重要。
数据驱动的决策以规则为中心。并且如果规则不充分,则可以实现子规则。但有时这还不够。一个更好的方向不是遵循规则,而是创造一个例外,即使你无法解释或辩护这个例外。
例如,一位老人打电话到市里,请求帮助处理一只死去的浣熊。遵循规则本应该有一个明确的答案:城市没有义务帮助这个人,因为浣熊在这个人的私人院子里。
但是很明显,这个男人打电话是因为他控制不住自己。一名委员会成员没有遵守规则,而是开车去了那个人的家,把浣熊拖到了街上,并确保案件得到处理。
结论
归根结底,皮特·布蒂吉格相信数据驱动的决策。他认为,它可以使人们做出更聪明、更公平的决定。然而,他很清楚数据是有局限性的,并不是所有的问题都可以用它来解决。此外,他认为有些决定必须遵从他或她的直觉。
我喜欢读他的书有几个原因。虽然我对他关于数据驱动决策的章节(第 11 章——潜意识运作)感到兴奋,但我也学到了更多关于美国政治和铁锈地带斗争的知识。
如果您有任何问题或意见,请在下面留下您的反馈。另外,如果你想和我联系,你可以通过 LinkedIn 联系我。
如果你对基于我自己经历的文章感兴趣,请随时查看。
如何学习编码的可行策略?
towardsdatascience.com](/how-190-students-and-i-have-learned-data-science-55da9e0e5c6b) [## 如何提高预测模型的可解释性
从商业角度的实用见解。
towardsdatascience.com](/how-to-increase-the-interpretability-of-your-predictive-model-b786d72365f1)
皮特·布蒂吉格(2019),《回家的最短路径:一个市长的挑战和美国未来的模式》,Liveright,第 388-418 页。
机器学习在死亡率建模中有什么地位?
见习精算师的视角
人类的死亡不是一个确定的过程(除非你碰巧生活在科幻反乌托邦中,剩余寿命被用作货币)。因此,对未来死亡率的估计是精算师为客户提供的许多建议中的核心假设之一。我们投入了巨大的努力,将所有最新的数据整合到人类预期寿命的模型中,并预测随着时间的推移,我们对未来的预测将如何演变。
虽然我们对导致人们寿命延长或缩短的因素有一个大致的了解,但似乎总有随机因素。伴随这种随机因素而来的是寿命风险——这是那些现金流依赖于人们寿命的组织特别关注的事情。例如,养老金计划需要知道其成员能活多久,这样才能有效地管理其负债,并确保做出正确的投资决策。同样,人寿保险公司需要合理准确地预测投保人死亡率,以便能够设定适当的保费水平——足够高以获得一些利润,但又足够低以向客户提供价值并在人寿保险市场保持竞争力。
目前,设定死亡率假设的过程可能如下所示:
- 选择一个基础表——一个公认的相当令人沮丧的个人死亡概率列表;
- 选择死亡率预测——这将决定每个年龄的死亡率如何随时间演变;最后
- 执行额外的分析来定制所选的表和投影,以匹配感兴趣人群的特定人口统计特征。
这些基本表格和预测经常更新(例如,连续死亡率调查每年更新其预测)。此外,新的参数正在被添加到模型中,以使其对假设设置者更加灵活(例如,查看 2019 年 3 月发布的 *CMI_2018、*上的简报,其中介绍了新的“死亡率改善的初始增加”参数)。事实上,我们正在不断修正我们的死亡率模型和估计,这足以证明根据历史数据预测人们的寿命实际上是相当困难的。似乎有数不清的变量与生活方式、社会经济状况甚至基因有关。我们应该做些什么来最好地捕捉驱动个人预期寿命的最重要因素——以及它随时间的演变——从而使我们能够推广到更大的人群?
机器学习开始发挥作用了
数据驱动的机器学习方法似乎很适合这类问题。预期寿命是一个经过充分研究的现象,已经收集了大量数据来帮助我们理解人类死亡率的“规则”。机器学习已经产生了许多无监督的算法,这些算法专门设计用于识别相似的数据点(聚类)和发现数据中的模式和相关性(可以说属于关联规则学习的领域)。如果有人认为人口学家会全面掌握这一新兴工具,并以各种创造性的方式使用它来加深我们对决定预期寿命的复杂关系的理解,这是可以理解的。
然而在现实中,到目前为止,机器学习在人口结构变化研究中的应用还是有限的。在他们的 2019 年论文中,Levantesi 和 Pizzorusso 提出,这种缺乏受欢迎程度是因为机器学习模型通常被视为“黑盒”,其结果很难解释和解读。诚然,这是一个合理的担忧——在机器学习社区中有大量正在进行的工作和讨论,涉及解释如何和为什么一个人工智能算法得出它所确定的结论的重要性,以及研究向利益相关者证明一个模型正在做出明智和合理的决定的实用方法。
尽管如此,研究人员继续总结了迄今为止利用机器学习方法对死亡率建模领域做出的贡献:
- 评估和改进标准随机死亡率模型产生的估计值的拟合优度( Deprez 等人,2017);和
- 应用神经网络来识别预测死亡率的重要因素,并扩展标准死亡率模型( Hainaut,2018 和 Richman 和 Wüthrich,2018 )。
Levantesi 和 Pizzorusso 在同一篇论文中继续证明,他们能够通过引入一个“ML 估计量”参数来捕捉标准死亡率模型中无法识别的模式,该参数被他们的算法识别为具有预测能力。通过这样做,当他们的机器学习模型的输出用于支持标准死亡率模型时,他们能够提高预测质量。
你会注意到,上述论文中的一个关键主题是使用机器学习来支持,而不一定是取代传统的死亡率建模方法。在我看来,这是一种明智的前进方式。如果我们想进一步了解预期寿命的驱动因素,来自机器学习和人口学的领域专家需要能够交流和合作。
传统方法和机器学习方法在自然语言处理领域一直存在着著名的分歧,在这个领域,理论驱动和基于规则的方法最初几乎被抛弃,而支持数据驱动的方法——以至于它导致了 IBM 研究员弗雷德里克·耶利内克的名言:“每当我解雇一名语言学家,语音识别器的性能就会提高。”但是,即使在 NLP 社区内,也有迹象表明钟摆可能会摆回另一边,并且有人问,如果更多的语言学家参与 NLP 研究,我们是否会取得更大的进展(相关 TWiML talk )。
不需要太多的想象力就能看出 NLP 研究和人口学/死亡率建模之间的相似之处:每个领域都研究某种系统,在该系统中,基于理论和基于规则的方法产生(显然)合理且有用的结果——尽管也有大量的数据,我们能够从这些数据中建立完全适当的模型,而无需具备如此深入的领域专业知识。
我建议最好采取一种平衡的观点——如果手工设计的基于规则的方法不断被替代方法(如机器学习提供的方法)超越,那么对这些方法过于感情用事是没有用的,但是我们应该对这样一个事实保持开放的态度,即我们总是需要领域专家来告知我们设计和操作模型的方式。
结论
机器学习和人工智能在识别和预测死亡率趋势方面有其一席之地。毋庸置疑,这些技术是检测数据点中及数据点之间的模式和关联的强大工具,将这种分析与现有的更经典的死亡率建模方法相结合是有价值的。不可避免的是,只有在更经典的、基于规则的方法和更现代的、数据驱动的机器学习方法之间找到平衡时,最佳结果才会出现。
死亡率建模将永远是相关的——除非 a) 你碰巧发现了青春之泉, b) 你已经知道如何将你的意识永远上传到云中,或者 c) 你生活在前面提到的科幻反乌托邦中(尽管这可能是一个公平的交易,如果这也意味着你可以成为贾斯汀·汀布莱克)。现在,我们的世界不是一个反乌托邦,但我们一直面临着甚至连专家都没有预见到的预期寿命的新趋势,我们还面临着一系列新的挑战,因为我们要应对人口老龄化的后果。
我们很可能需要死亡率建模方面的进步,以成功管理我们肯定会因人口结构变化而面临的问题——只有我们的专家能够抛开他们的学术忠诚,为了每个人的利益而共同努力,我们才能做到这一点。所以是的,我们必须勇敢——我们必须适应和探索新技术——但是如果我们不记得我们从哪里来,我们会很快发现自己迷失了。
学分和更多信息
Andrew Hetherington 是英国伦敦的一名见习精算师和数据爱好者。
讨论的论文:机器学习在死亡率建模和预测中的应用。风险 2019 、 7 、26。
沙漏照片由阿伦视觉拍摄。闹钟照片由 Icons8 团队拍摄。两者都在 Unsplash 上。
什么 Python 包最适合从 Twitter 获取数据?比较 Tweepy 和 Twint。
回顾 Tweepy 和 Twint——两者的优缺点、代码片段、潜在用例以及我的建议。
Kon Karampelas 在 Unsplash 上拍摄的照片
Twitter 对于任何数据科学家来说都是绝对的宝库,无论他们是专业人士、学生还是业余爱好者。它将各行各业的人联系在一起,无论你是一名有抱负的音乐家还是 T4·泰勒·斯威夫特,无论你是一名职业篮球运动员还是勒布朗·詹姆斯,从当地政客到美国现任总统和前任总统。
它的用户群有多广,产生了多少数据?截至 2019 年第三季度,Twitter 的每日活跃用户群约为1.45 亿人,2018 年每天发出 5 亿条推文。即使有 280 个字符的限制,Twitter 数据提供了一片可以收获数据见解的沃土也就不足为奇了。
但是,我们如何收集这些数据呢?事实上,由于各种原因 Twitter 数据的预编译库是有限的(参见此链接进行讨论)。Twitter 本身在特殊场合可能会提供自己的数据汇编,但这种情况很少。它们甚至可能不会公开提供——只对特定的开发人员和研究人员开放,比如这个与新冠肺炎相关的数据集。
这就是为什么我想在这篇文章中花些时间比较两个流行的第三方 Python 包, Tweepy 和 Twint 。
这两个库都非常受欢迎,正如你在下面 GitHub 受欢迎程度的图表中看到的。
Twint 和 Tweepy — GitHub 星史(【https://star-history.t9t.io/】T4)
我在这里http://tweetdash.jphwang.com建立了自己的 Twitter 数据分析应用,为此我尝试了从两个库收集数据。
来自我的 Twitter 的屏幕截图数据分析应用程序(链接)
和其他工具一样,它们并不完美,在我看来,Tweepy 和 Twint 各有优缺点。但是,它们是优秀的工具,即使以我有限的经验,我认为你的大部分 twitter 数据需求可以用一个或这些库的组合来满足。
事不宜迟,让我们开始吧!
总体差异
使用方法/认证
因此,我认为最大的区别是——Tweepy 是一个用于访问官方 Twitter API 的 Python 库——因此,您需要申请开发者访问权限并从 Twitter 获得密钥。
另一方面,Twint 是一个抓取工具,旨在抓取 tweets 并克服 API 的限制。
(注意:我不会进入关于网络抓取是否合法的讨论,或者 Twitter 的 TOS 关于抓取的说法。这只是对每个工具的讨论。)
证明文件
Tweepy 的文档在我看来,是顶尖的。它的文档包括从身份验证到流的所有教程,还包括所有方法的 API 参考。
从零经验开始,您应该能够立即开始使用 Tweepy,立即下载时间线、用户信息或执行搜索。
另一方面,浏览 Twint 的文档会给你一种感觉,觉得这个包已经超过了文档的速度,或者他们只是还没有找到时间。
有趣的是,twint 可以从 shell 命令行使用——因此,如果用户愿意,他们可以直接运行 Twint,而无需进入 Python shell 或编写 Python 脚本。
这一切意味着什么?实际上,如果你想做的唯一的事情是收集大量的 Twint 可能是一个更好的工具,而 Tweepy 更适合收集更丰富的元数据,对于那些使用官方 API 的人来说,它具有灵活性和潜在的可扩展性。
这可能还是有点抽象。让我们继续看一些更具体的例子。
抓取推文
与 Tweepy
一旦你建立了你的开发者账户,你的密钥和令牌——这段代码片段将为你提供一组推文——在这种情况下,我将从勒布朗·詹姆斯的推特账户中抓取 200 条最新推文。
import tweepyauth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
screenname = 'KingJames'
tweets = api.user_timeline(screenname, count=200)
带 Twint
要用 Twint 做同样的事情,您实际上可以从命令行/shell 运行这个命令:
twint -u KingJames --limit 200 > testtwint.txt
要在 Python 中做到这一点,应该是这样的:
import twintc = twint.Config()
c.Limit = 200
c.Store_csv = True
c.Username = usernamec.Output = fname
twint.run.Search(c)
所以这两者都相对简单。它们都或多或少地包含了你可能想知道的关于每条推文的所有信息。
Tweepy 用这些列生成数据:
['created_at', 'id', 'id_str', 'full_text', 'truncated', 'display_text_range', 'entities', 'extended_entities', 'source', 'in_reply_to_status_id', 'in_reply_to_status_id_str', 'in_reply_to_user_id', 'in_reply_to_user_id_str', 'in_reply_to_screen_name', 'user', 'geo', 'coordinates', 'place', 'contributors', 'is_quote_status', 'retweet_count', 'favorite_count', 'favorited', 'retweeted', 'possibly_sensitive', 'lang']
另一方面, Twint 用这些列生成数据:
['id', 'conversation_id', 'created_at', 'date', 'time', 'timezone', 'user_id', 'username', 'name', 'place', 'tweet', 'mentions', 'urls', 'photos', 'replies_count', 'retweets_count', 'likes_count', 'hashtags', 'cashtags', 'link', 'retweet', 'quote_url', 'video', 'near', 'geo', 'source', 'user_rt_id', 'user_rt', 'retweet_id', 'reply_to', 'retweet_date', 'translate', 'trans_src', 'trans_dest']
对,是很多列。很混乱。但好消息是,这两组或多或少是相同的。他们必须这样,因为理论上他们都从 Twitter 上下载相同的数据。
性能差异
根据我的经验,在任何文本处理方案中,抓取推文所花的时间或多或少是无关紧要的。在我的体验中,Twint 要慢一点——这对我来说是有意义的,因为它利用 Twitter 的搜索功能进行抓取,而不是通过 Twitter 的原生 API。
这就引出了我的下一个观点…
限制
Tweepy 的最大限制是 Twitter API 的限制。Twitter 的 API 有各种限制,取决于你的账户等级(定价),最重要的是,Twitter 的 API 限制你在一个时间线内只能发布最后 3200 条推文。
另一方面,Twint 的主要限制是,它真的只是为了抓取推文而设计的,仅此而已。如果你想与 Twitter 互动——发布推文、屏蔽/屏蔽他人、发送 DM 等——这些都是 Twitter API 的领域,你应该求助于 Tweepy。
其他使用案例
正如所预示的那样,除了抓取一堆推文进行分析之外,对于几乎所有其他用例,我都会推荐 Tweepy 而不是 Twint。还有哪些用例?这里有一些例子。
自动跟踪
也许你想偶尔确保跟踪跟踪你的每个人:
auth = tweepy.OAuthHandler("consumer_key", "consumer_secret")
redirect_user(auth.get_authorization_url())
auth.get_access_token("verifier_value")
api = tweepy.API(auth)for follower in tweepy.Cursor(api.followers).items():
follower.follow()
自动转发
也许你想建造一个机器人,当提到它的名字时,它会自动转发——你很幸运,因为这个机器人已经在这里被建造了(由查尔斯·胡珀)。
在线教程
或者你可能想跟随这个关于 RealPython 的教程。,并了解他们如何制作可以根据你的意愿自动收藏或转发的应用程序。
Twitter API 不仅提供了大量的例子,还提供了大量的例子来构建你自己的应用。这在 Twint 中是不可能的。Twint 或多或少做一件事,而且做得很好。但仅此而已。
推荐
还记得我说过我建立了自己的 Twitter 数据分析应用程序(http://tweetdash.jphwang.com)?嗯,我的经验是 Twint 是一个很好的工具,可以为构建这个演示应用程序获取数据。
另一方面,学习和使用 Twint 的过程非常痛苦,因为它的文档非常少。当我试图做示例代码中没有显示的任何事情,或者偏离示例代码时,它需要的时间比我使用 Tweepy 时多几个数量级。
使用 Tweepy,我可以依赖它的官方文档、其他人的教程或示例项目。和以往一样,你的里程可能会有所不同,但这只是我的经验。
所有这些都是说尽可能多地使用 Tweepy 只有当你在获取原始推文方面碰壁时,看看 Twint 是否可以替代。我认为这样可以省去很多麻烦,而且很少会需要比 API 允许的更多的数据。
今天到此为止。
如果你喜欢这个,比如说👋/关注 twitter ,或点击此处获取更新。如果你错过了,看看这篇关于用 Plotly Dash 构建 web 应用的文章:
[## 使用 Python 在几分钟内构建一个 web 数据仪表板
通过将您的数据可视化转换为基于 web 的仪表板,以指数方式提高功能和可访问性…
towardsdatascience.com](/build-a-web-data-dashboard-in-just-minutes-with-python-d722076aee2b)
这个比较金融市场的 API:
作为一名数据科学家,如果你想分析金融市场数据(股票市场或加密数据),请从这里开始
towardsdatascience.com](/comparing-the-best-free-financial-market-data-apis-158ae73c16ba)
因为一些私人的事情,我已经离开写作很多时间了,但是我很高兴回到这里。:)下次见!
你的 ML 论文的作者顺序应该是怎样的?
回答这个问题有时比 P=NP 问题更难。
模糊的、主观的、有争议的——这些是人们用来描述他们按照正确的顺序排列作者的逻辑的词语。事实上,每个人都需要估计其他人应得的荣誉,同时最好不要大声说出来,因为这会在作者之间造成紧张,分散他们的研究注意力,然后以某种方式默默地同意,是的,这个顺序是有意义的。
所以我问那些拥有数百份出版物的大老板们,他们是如何解决这种情况的,从我得到的信息来看,似乎每个人都有自己的特别方法,很少有每个人都同意的事情。总的来说,我仍然没有最终的方法来分配学分,然后根据他们应得的学分来放置作者,所以如果你知道一个,请给我发消息。但至少我知道我不是唯一一个问这个问题的人,下面是一些值得一问到底的问题的答案。
ML 论文的顺序重要吗?
有点像,但以一种令人困惑的方式。基本上每个人都同意 ML 论文的第一作者是最值得的人,这个人做了大部分的工作,实验,数字,表格——他接触了所有的东西,这是他的宝贝。他不仅在提交前完成了大部分工作,而且在接受后还负责回复电子邮件、修复 bug 和开源代码。这与数学等其他学科不同,在其他学科中,顺序是按字母顺序排列的,除非放在相应的部分,否则贡献是隐藏的。
如果只有一个作者(啊,梦),事情就简单了,但实际上,通常有 2、3、5 或 10 个其他的合著者。那么他们呢?好吧,让我们首先处理主管,也就是“为演出付钱的人”。一般来说,似乎最后一个位置是一个甜蜜点,是留给导师的,除非你的论文有几个导师。那么如果人多怎么办呢?
不同的选择。有人说最后一个是第一作者的导师,有人说你应该按辈分来对待他们,把大的放在最后。对于一些人来说,这个问题应该在主管之间私下讨论,但底线是,对于这种能力的人来说,这可能没什么关系。
不过,重要的似乎是人们对论文作者数量的看法。有人说 2 个人,5 个人,或者 50 个人——都一样,论文做好了,价值没有被稀释。对于这样的人来说,如果有一个随机的怪人出现在报纸上,因为他的笑话很有趣,嘿,他毕竟是一个好人,这其实并不重要。相反,一些人认为作者越少,每个人得到的价值越多,2-3-4 个作者是最佳数量,除非有一个大型强子对撞机来支持一些疯狂的假设。因此,取决于你属于哪个阵营,左派还是右派,要么你认为“是的,让我们邀请所有人来参加聚会”,并根据他们的贡献在中间排序,要么你认为“世界应该知道这是我们的报纸”,所以让我们非常精确地知道谁做了什么。
好了,订单很清楚了。那么,学分分配呢?
这也是一个非常有偏见的观点,但非正式地说,论文作者要么是厨师(如主管),要么是工人(如学生),每个人都有自己的一套职责,并因此得到分数。
厨师带领工人去一家新的出版社。(图片来源
对厨师来说,一系列的职责是清楚地知道应该完成什么,提供资源,协调工人,解决冲突,引导团队朝着正确的方向前进,等等。厨师被放在名单的最后,所以虽然我们可以在每个特定的案例中计算他们的积分,但他们的位置不会有太大的变化。
相反,对于工人,信用分配更加微妙。有实验,有小有大,有数字,有文字,有想法,有定理要证明,有调度,还有成吨的其他细节。天哪,当工人真不容易。很难估计哪个更重要,但这里有一个我用来粗略估计学分的启发式方法。
模型和主要实验= 40%
支持性主张和次要实验= 10%
文本和演示文稿= 15%
理论和分析= 30%
想法、时间安排、动机= 5%
当然,并不是所有的论文都有理论部分,在这种情况下,你有更多的实验,这是值得表扬的。当然,在其他情况下,这是一个定理,在这种情况下,实验只是支持它。但是你得到的思路是:把工作按桶拆分,给每个桶分配权重,得到权重之和作为每个合著者的功劳。
同样取决于你的阵营,你可以决定将一个合著者纳入论文的门槛(或者有一个正式的理由去掉那个问了太多问题的可怜家伙)。你总共得了 20%,你被录取了。你达到了 50%,获得了第一名。但更有可能的是,第一个作者完成了近 80%,剩下的将在 5 个粉丝之间分配。
最后,也许最重要的事情是你的论文被接受并被广泛引用,对于一篇论文来说,你的立场可能并不重要。随着时间的推移,在你周围建立一个值得信任的团队是非常重要的,它将无缝地解决这样的问题。所以,建立你的关系网,祝你的研究好运!
P.S .我会继续写关于机器学习、论文和所有这些爵士,所以如果你有兴趣,请在 medium 上关注我或订阅我的 电报频道 或 我的 twitter 。
接下来该读什么?
一个使用 surprise 的协同过滤图书推荐系统
苏珊·尹在 Unsplash 上的照片
推荐系统快速介绍
推荐系统是一个强大的工具,是亚马逊、网飞、Spotify 和许多其他成功公司的核心。它们旨在预测用户对产品或项目的评分或偏好,基于的标准包括用户搜索过的项目、过去评分较高的项目或他们喜欢的歌曲或电影。目标是向用户展示他们更有可能参与或购买的新商品。
有不同的方法来实现推荐系统。它们基本上分为基于内容的和协同过滤系统。基于内容的系统是根据项目本身的特征信息构建的。它是当你被提供“像这样的其他项目”时你所看到的。它们可能非常有用,因为用户可能喜欢与他们正在搜索的书或电影相似的另一本书或电影。这种类型的系统的一个缺点是一些人工或半人工标记是必要的。
另一方面,协同过滤系统基于用户对项目的评级。它们是通过使用用户对项目的评级集合来计算的。其背后的思想是相似的用户将有相似的偏好,并且用户有喜欢彼此相似的项目的倾向。这种类型的推荐系统可以使用两种不同的方法来计算这种相似性,我们将在这篇文章中尝试这两种方法。这种类型的系统的一个缺点是所谓的冷启动,这意味着系统需要相当数量的初始用户评级,以便能够做出良好的预测。
目前使用的最先进的推荐系统应用几种不同方法的组合来给出最准确的结果,包括自然语言处理和卷积神经网络,但在这篇文章中,我将带你通过一个简单的协同过滤推荐系统,应用一个叫做 surprise 的伟大库。
来源: KDnuggets
所以回到我手头的问题,接下来该看什么书?为了回答这个问题,我们将使用 surprise 和在 Kaggle 上找到的这个数据集构建一个简单的协同过滤推荐系统,该数据集由 53,424 个独立用户对 10,000 本书的大约 600 万个评级条目组成。除了评分数据,我们还可以访问书籍的元数据、书籍类型和其他标签,以及用户标记为“待读”的书籍。
协作过滤系统有两种不同的工作方式。基于记忆或邻域的协作过滤方法试图量化用户和项目彼此之间的相似程度,然后基于该相似性度量提供前 N 个推荐。另一方面,基于模型的方法基于这样的概念,即用户的偏好可以由少量的隐藏因素或潜在变量来确定。我们可以使用单值分解(SVD)来帮助提取这些潜在因素,帮助我们理解用户和项目之间的关系。它将我们的任务转化为一个优化问题,我们希望最小化预测中的误差。
用惊喜创造推荐系统
首先,如果你没有惊喜,你需要安装它。这就像在您的终端上运行pip install surprise
一样简单。惊喜带有两个内置数据集,便于练习,但也支持使用您自己的自定义数据(注意,它不支持隐式评级或基于内容的信息)。我们将加载我们的数据,在我们为建模做准备并开始该任务之前,我们必须进行一些数据探索和分析。人们应该在一般的数据分布中寻找空值、异常值等等。
我加载了评级数据集和图书元数据。我们的评分数据没有空值,每个用户的评分分布接近正常,每个用户的平均评分数为 111.87 本书,每个用户评分的中位数为 111 本书。
另一方面,每本书的收视率分布,正如这类问题所预期的那样,是一种长尾分布。少数几本书很受欢迎,收视率很高,而大多数书的收视率较低。每本书的平均评分数和中值评分数之间的差异(分别为 597.65 248)证实了这一点。这就是为什么推荐系统如此重要和有用的原因!帮助用户发现那些不太受欢迎的书,如果他们知道这些书,他们肯定会喜欢的。
这本书的评分从 1 到 5 不等。我想知道 Goodreads 用户在他们的评级中有多挑剔。让我们看看收视率分布是否不平衡。
该图显示,用户在评分方面相当慷慨,很少有书被评为低评分。看起来他们的书友会运气不错!
数据科学家将在数据探索和分析上花费更多的时间,但是为了这篇文章的简洁,我们将继续从建模开始。要想惊喜地使用我们的数据,我们需要将其加载到正确的格式中。您需要用您的评级标准定义一个阅读器,并通过正确的列加载您的数据。
# define reader
reader = Reader(rating_scale=(1, 5))# load dataframe into correct format for surprise library
data = Dataset.load_from_df(ratings[['user_id', 'book_id', 'rating']], reader)
接下来,我们将数据分成训练集和测试集,以评估我们的模型并避免数据泄漏。我正在分离 20%的数据进行测试。
# Split into train and test set
trainset, testset = train_test_split(data, test_size=0.2, random_state=0)
您可以检查数据中用户和项目的总数。
# confirm number of items and users in data
print('Number of users: ', trainset.n_users, '\n')
print('Number of items: ', trainset.n_items, '\n')Number of users: 53424
Number of items: 10000
基于记忆或邻域的方法
我们将开始尝试一种基于邻域的方法。由于我们的用户比条目多,我们将通过计算条目间的相似性来解决这个问题。另一种选择是计算用户之间的相似性。我们可以使用不同的度量来计算相似性,我们知道不同的度量会产生不同的结果。我将尝试使用两个相似性度量标准——余弦相似性和皮尔逊相关性——以及来自 surprise library 的基本 KNN 模型,看看哪一个性能更好。我们将使用均方根误差(RSME)作为我们的评估指标。
# define a cosine metric for item-item
sim_cos = {'name':'cosine', 'user_based':False}# define and fit a basic KNN model with a cosine metric
basic = knns.KNNBasic(sim_options=sim_cos)
basic.fit(trainset)# make predictions
predictions = basic.test(testset)# check accuracy
accuracy.rmse(predictions)RMSE: 0.8827
现在,我们将使用皮尔逊相关相似性度量进行同样的操作。
# define fit and evaluate a KNN basic model with pearson correlation metric
sim_pearson = {'name':'pearson', 'user_based':False}
basic_pearson = knns.KNNBasic(sim_options=sim_pearson)
basic_pearson.fit(trainset)
predictions = basic_pearson.test(testset)
accuracy.rmse(predictions)RMSE: 0.8724
太好了,皮尔逊相关性似乎对我们的数据更有帮助。我们还可以尝试使用其他更先进的模型:KNN 均值模型,它考虑了每个项目的平均评级,以及 KNN 基线模型,它考虑了基线评级(全局均值)。让我们看看他们的表现。
# KNN with means model
sim_pearson = {'name':'pearson', 'user_based':False}
knn_baseline = knns.KNNWithMeans(sim_options=sim_pearson)
knn_baseline.fit(trainset)
predictions = knn_baseline.test(testset)
accuracy.rmse(predictions)RMSE: 0.8406# KNN baseline model
sim_pearson_baseline = {'name': 'pearson_baseline','user_based':False}#'shrinkage':50, 'min_support':5,
knn_baseline = knns.KNNBaseline(sim_options=sim_pearson)
knn_baseline.fit(trainset)
predictions = knn_baseline.test(testset)
accuracy.rmse(predictions)RMSE: 0.8371
基于模型的协作过滤
现在让我们尝试一种不同的方法,一种基于矩阵分解的方法,带有基于模型的协作过滤,看看它是否能更好地处理我们的数据。
# define a base singular value decomposition model
svd = SVD()# fit and test algorithm
predictions = svd.fit(trainset).test(testset)# evaluate model
print(accuracy.rmse(predictions))RMSE: 0.8306
这已经比我们最好的基于邻居的模型好一点了。我们可以尝试用网格搜索来微调我们的超参数,这可以进一步提高我们的模型性能。我还想将我的数据的一部分作为验证集,一部分作为未知的测试集,我们将使用它们进行预测。做这件事的方法是从惊奇库文档这里复制的。
raw_ratings = data.raw_ratings# shuffle ratings
random.shuffle(raw_ratings)# A = 90% of the data, B = 20% of the data
threshold = int(.8 * len(raw_ratings))
A_raw_ratings = raw_ratings[:threshold]
B_raw_ratings = raw_ratings[threshold:]data.raw_ratings = A_raw_ratings # data is now the set A# define parameter grid and fit gridsearch on set A data
param_grid = {'n_epochs': [5, 10], 'lr_all': [0.002, 0.005]}
grid_search = GridSearchCV(SVD, param_grid, measures=['rmse'], cv=3)
grid_search.fit(data)best_svd = grid_search.best_estimator['rmse']# retrain on the whole set A
trainset = data.build_full_trainset()
best_svd.fit(trainset)# Compute biased accuracy on A
predictions = best_svd.test(trainset.build_testset())accuracy.rmse(predictions)RMSE: 0.7786# Compute unbiased accuracy on B
testset = data.construct_testset(B_raw_ratings) # testset is now the set B
predictions = best_svd.test(testset)
print('Unbiased accuracy on B,', end=' ')
accuracy.rmse(predictions)Unbiased accuracy on B, RMSE: 0.7924
这是一些很好的改进。我们现在可以使用这个模型为新用户做预测,并为每个用户推荐 N 个商品。令人惊讶的文档向我们展示了如何使用我们最好的模型来做到这一点。
如果你有兴趣查看这篇文章所基于的全部代码,你可以在 Github 上找到它 。
哪些 SQL 课程没有让我们为真实世界的数据集做好准备
从商业角度使用 SQL 进行快速数据验证的指南
在您的数据职业生涯中,您可能听说过 SQL,或者对它进行了深入的研究,以至于了解了一切,甚至掌握了表连接的概念。
当你进入真实世界的数据集时,惊喜就来了。大多数时候它们并不干净,到处都有丢失的值和重复的记录。无论我们身处哪个行业,我们都经历过这种情况——花大量时间调查违规行为,只是为了发现底层数据是罪魁祸首。
尽管有这些挑战,我们所经历的大多数 SQL 课程倾向于用干净的数据集来教导我们,而很少给我们这种现实的指导。
布鲁克·卡吉尔在 Unsplash 上的照片
鉴于我们角色的一个方面是确保业务决策基于一天结束时的准确分析和上述挑战,进行数据检查和验证无疑是现实世界数据集不应忽视的基本概念之一。它与决定任何分析和随后的商业决策成败的质量有关。
现在,您已经掌握了 SQL 技能,让我们看看如何将 SQL(及其带来的逻辑)和业务视角结合在一起的一些基本想法,以告知我们如何在任何分析之前执行数据检查和验证。
首先,让我们设置一些零售业务的背景
照片由 Mehrad Vosoughi 在 Unsplash 上拍摄
在数据世界中,通常被认为等同于你在货架上看到的产品的东西或多或少是一个产品表。
如果我们仔细看看产品表,它通常包含产品 ID(也称为产品条形码)和相关信息,如产品描述和产品类别,当然数据字典对于查看使每个数据行彼此唯一的关键字段非常有用。然而,在现实中,如果获得它很困难,并且您在时间上很紧张,该怎么办呢?
最终,我们需要确保数据的准确性,一个快捷的方法是检查产品记录中是否有重复。为此,我们根据经验推测 product_id 是关键字段,并使用 COUNT()和 COUNT(DISTINCT)如下:
**SELECT** **COUNT**(product_id), **COUNT**(**DISTINCT** product_id) **FROM** product;
如果我们的猜测是正确的,我们应该期望两个数字相等,因为这意味着没有重复,并且每一行都是唯一的。
在现实世界中,我们希望使用这个经过验证的表进行连接,并对主要的客户交易进行进一步的数据分析,例如,查看给定客户交易中的产品类型。为了完整起见,我们还假设希望保留交易表中的所有记录,以查看是否有任何交易产品没有记录在产品表中。然后,在连接之后,可以在结果表上扩展上面相同的验证概念,如下面的 SQL 所示。理想情况下,计数应该是相同的,假设列 transaction_id 对于事务表中的所有行都是唯一的。
**SELECT ** **COUNT**(*), **COUNT**(**DISTINCT** t.transaction_id)
**FROM** transaction t
**LEFT JOIN** product p
**ON** t.product_id = p.product_id;
但是如果这些数字不一样呢?
首先,不要妄下结论说数据是错误的,这背后可能有一些商业原因。也许您正在处理的产品表基于全球产品目录,这意味着可能有一种产品以相同的条形码(或产品 ID)在不同的国家销售,或者零售商只是简单地回收了他们的内部产品条形码,等等。
我们先来看看全球产品目录的案例…
处理大型数据集可能涉及到可以用自然分割线分隔的部分。对于全球或区域参与者,不同的市场可能是一个天然的分割线,我们可以使用它来分离数据集以进行不同的分析。有时,产品表作为包含所有市场中产品列表的单个表出现。在这种情况下,我们需要添加另一列来指示要测试的市场,我们的 SQL 现在将是:
**SELECT ** market
, **COUNT**(product_id)
, **COUNT**(**DISTINCT** product_id)
**FROM** product
**GROUP BY** market;
如果这为我们提供了每个市场的相同计数,那么您就已经成功了——产品表是按产品条形码和市场排列的。还要记住,在将该表联接回主客户事务以进行分析时,现在列 product_id 和 market 都是必需的,因此联接时可能如下所示:
**SELECT ** *
**FROM** transaction t
**LEFT JOIN** product p
**ON** t.product_id = p.product_id
**AND** t.market = p.market;
如果数字仍然不相等,那么您需要查看其他列,并开始假设使每个数据行唯一的其他可能的字段。我希望你明白我的意思,这是关于观察数据,反复建立一个假设并测试它。
数据验证是一个迭代过程。它从设定一个假设开始,然后检验它。如果测试失败,应考虑额外的信息,并将结果反馈到更新的假设和后续测试中。(图片由作者提供)
现在我们来看第二个例子,一家零售商回收了他们的内部产品条形码…
有些人可能想知道这是怎么发生的。根据我的经验,一些零售商有他们所谓的“条形码回收”,这对于私人管理的产品来说很常见。想想看,当你购买一个羊角面包或超市自己制作的熟食时,没有所有超市都同意的通用产品条形码,因为它是在商店内制作的,而不是像国家品牌产品那样由通用的第三方供应商制造的。
一段时间后,您可能会看到这些条形码被重新用于另一种产品,主要是为了提高运营灵活性或避免额外的上市费用。这也是产品表中同一条形码下有 2 个本质不同产品条目的原因之一。
在这种情况下,我们想知道的是这些条形码生效的时间段,因为这使我们能够区分两个重复的条形码。同时,这为数据库设计带来了一些改进的机会,可以引入缓慢变化的维度——但这值得单独讲述。
回到这个话题,假设您现在有了重复产品条形码生效的时间段,如下所示。
该表显示了两个不同产品的两个记录的示例,这两个记录共享随着时间的推移被回收的相同产品条形码。有效时间段列显示每个应用的时间段。(图片由作者提供)
实现 SQL 验证的方式可能如下所示。这时,您假设使每一行唯一的是产品条形码、有效开始日期和有效结束日期的组合。
**SELECT ** **COUNT**(*)
, **COUNT**(**DISTINCT** product_id + effective_start_date +
effective_end_date)
**FROM** product;
检查计数是否相等后,如何将经过验证的产品表联接回客户事务表,如下所示。
**SELECT ** **COUNT**(*)
, **COUNT**(**DISTINCT** transaction_id)
**FROM** transaction t
**LEFT JOIN** product p
**ON** t.product_id = p.product_id
**WHERE** t.transaction_date
**BETWEEN** p.effective_start_date **AND** p.effective_end_date
请注意,现在我们需要在 WHERE 语句中添加一个时间段条件,以确保为具有回收条形码的产品提取正确的产品信息,并且计数应该始终相等,否则这表明回收产品存在重叠的有效时间段,我们需要在开始分析之前纠正这一点。
总结一下…
格伦·卡斯滕斯-彼得斯在 Unsplash 上的照片
进行数据检查和验证是我们一切工作的基础。它与准确的业务决策背后的数据和分析质量直接相关。同时,不要在没有充分考虑背后的商业原因的情况下,仅仅因为验证是这样说的,就妄下结论说数据是错误的。
尽管本文并不打算面面俱到,但我希望给出的几个示例能或多或少地阐明 SQL 或通过 SQL 显示的逻辑可以与业务角度结合使用来处理真实数据集的可能领域。
学校教给我们什么故事?
公共核心英语课程的统计分析
自教育倡议于 2010 年启动以来,共同核心州标准已经决定了全国公立学校的课程。特别是,这些指南已经整理了小学、初中和高中的图书馆书架,通过精心挑选的不到 80 本推荐书籍,有效地塑造了未来的领导者和书虫。
作为书籍和数据新闻的爱好者,我受到启发,尝试“按数字”看待这些共同的核心标准。考虑的因素包括一本书作者的性别、出版日期以及基于 Goodreads 评论数据的受欢迎程度。
这些标题的完整列表可以在PDF中找到,也可以通过本文底部的交互式表格找到。我还制作了最终的数据集,用于生成可用的分析和可视化这里。
性别
虽然共同核心州标准倡议(CCSI)适用于从幼儿园开始的学生,但本分析将侧重于该计划为 6 至 12 年级学生提出的建议。英语语言艺术推荐可以分为两类:“文学:故事,戏剧,诗歌”和“信息文本:文学非虚构和历史,科学和技术文本。”同样值得注意的是,通用核心标准已经被大多数(但不是全部)州采用。
在这七年的教育中,共同核心标准推荐学生阅读 38 种特定的文本。在这份名单中,26%的书是由女性写的(10/38),74%的书是由男性写的(28/38)。
图片作者:斯潘塞·迪恩
当只考虑信息文本时,这种性别差异变得更加明显,这些信息文本包括原始资料和历史文献,如“弗雷德里克·道格拉斯的生活叙事”或亚伯拉罕·林肯的“葛底斯堡演说”在所有的信息文本中,只有一篇是女性写的——安·皮特里的《哈丽雅特·塔布曼:地下铁路的售票员》
反之,文学类内的比例更为均匀。 12 课文是男人写的,而 8 是女人写的。
图片作者:斯潘塞·迪恩
出版日期
接下来,我检查了推荐文本是什么时候写的。下面的可视化显示了一个时间线,其中书籍被分成 50 年的跨度。如图所示,公共核心课程中的大多数题目都是在 19 世纪或 20 世纪编写的。出版日期的中间值是 1920 年(T0)和 1920 年(T1),尽管如果忽略《麦克白》(1592)的异常值,这个中间值会上升到 1925 年(T3),正好是司各特·菲茨杰拉德出版《了不起的盖茨比》的那一年
这张图表也显示了更多的书籍是如何从特定的历史重要时代中挑选出来的。例如,三个信息文本围绕美国独立战争(1775-1783)的日期聚集在一起。
完整的 38 本书中,只有一本出版于 21 世纪:裘帕·拉希莉 2003 年的小说《同名》
图片作者:斯潘塞·迪恩
流行
由于每年全国的学生都被分配这些相同的书籍,有些比其他的更能激发热情,我很好奇这些课程的重点到底有多受欢迎。为了这个任务,我求助于 Goodreads ,这是一个由用户生成评论和评级的在线图书数据库。
注:由于 Goodreads 数据缺失,9 篇文章(包括一些文章和演讲记录)被排除在本次分析之外。
平均而言,Goodreads 用户对普通核心书籍的评分为 4.02 分(5 颗星中的 4.02 分)。榜单上最受欢迎的标题是马丁·路德·金的《来自伯明翰监狱的信》,排名 4.53 位。最不受欢迎的是劳伦斯·耶普 1975 年的小说《龙翼》,在 3500 多条用户评论中,这部小说平均获得了 3.53 颗星。
讨论和方法
尽管确切的英语语言艺术课程在不同的学区有所不同,但从这份建议清单中仍然可以得出一些值得注意的结论,该清单声称“让所有学生在高中毕业时为大学、职业和生活的成功做好准备”很明显,虽然似乎做出了一些努力来呈现更多样化的观点(从莎士比亚到艾米莉·狄金森,再到洛林·汉斯贝里),但女性撰写的故事和历史在共同核心目录中的代表性不成比例,特别是在信息类文本中。
学校总是可以在他们选择教授的角度上争取更多的多样性。这一目标的重要性不仅体现在性别上,还体现在种族、性和国籍等话题上。关于多元文化和国际文学,通过儿童书籍教学中心主任横田顺子写道:“很明显,多元文化文学可以而且应该成为学生学习的核心,精心挑选的高质量文学可以对学生的自我意识和他人意识产生影响。"
熟悉这份名单上的作者表明,大多数文本是由美国白人写的,但具体数字需要用更详细的数据集进行另一次分析。
对于我使用的数据集,信息首先直接从公共核心网站中提取,然后在 Excel 中进行清理和预处理,最后通过独立研究添加新字段(主要是在互联网上搜索作者简历和维基百科页面)。所有图表都是用 DataWrapper 和 Adobe XD 制作的。
结论
如果某个学校采用了共同核心制定的标准,他们的英语学生在 6 到 12 年级之间将会阅读 38 本书。在这 38 本书中,10 本将由女性撰写,28 本由男性撰写。这些作品中的大部分,无论是历史文献还是文学经典,都将在 19 世纪或 20 世纪初至中期出版。他们最喜欢什么?根据 Goodreads 用户的说法,人们可能会说“来自伯明翰监狱的信”,或者米歇尔·沙阿拉的“杀手天使”
至于除了性别之外的作者多样性的测量,像种族这样的人口统计学不在这个项目的范围之内。然而,在这个问题上正在进行重要的研究。对于那些有兴趣了解更多关于课堂阅读中的表现的人,我建议去看看合作课堂中心和合作儿童图书中心,该中心出版儿童文学年度评论。
探索数据:
垄断的数据哪里出错了
使用马尔可夫链评估垄断中的获胜策略——并解决常见的误解
[编辑:这里的是这篇文章中的结果的一个全面且完美的可视化,由 Garrhett Petrea 在 Tableau 中创建。]
对垄断策略的研究引发了关于如何最大化一个人获胜机会的无休止的讨论。由于大富翁游戏是由运气驱动的,游戏中少数能影响玩家的方面已经被研究得死去活来。或许不出所料,同样的结论不断冒出:橙色房产最好从不买公用设施买 3 套房子等等。
作为一个狂热的大富翁玩家,我自然很好奇这些结果是如何达到的,以及我是否可以自己复制它们。尽管我确实得出了一些相同的结论,我的分析在方法论和关注点上有三点不同于我看过的大多数作品:
- 着陆概率是从第一回合开始累积的:我认为前 10 回合内的着陆概率基本上是不相关的,因为玩家不太可能在游戏早期获得完整的颜色设置或建造房屋。
- 有一个投资收支平衡的重点:垄断是通过让其他玩家破产而赢得的;因此,给定资产的盈亏平衡点是次要的,它有助于导致对手破产。
- 交易的作用被忽视了:交易是垄断最重要的方面,玩家可以在其中做出战略决策。在这篇文章中,我的可行建议集中在对贸易交易进行数学评估,以取得成功。
我所有的代码和数据都可以在这里访问。Python、Excel 和 Datawrapper 被用来生成和可视化我所处理的数据。
将垄断建模为马尔可夫过程
模特垄断的复杂性可以归功于它的两个特点:a)机会和社区公益金卡和 b)滚动双打。我们可以使用蒙特卡罗方法来解决这个问题,但是确定相关概率的真实值的分析方法也是可行的。
首先,简要说明一下回合和掷骰子的情况:大多数回合(准确地说是 5/6)都以掷骰子结束。然而,如果掷出双倍,骰子必须在同一回合内再次掷出。连续掷出 3 次双打的玩家(在任何给定的回合中 P = 1/216)会直接进监狱。数据中已经考虑到了这一点。
平均圈数约为 1.2 圈。没有相关的理由来计算旋转而不是滚动,后者将有助于简化分析。
我的第一步是用 Python 创建一个 40x 40的转换矩阵,前三行如下。每行代表在给定不同起始位置的情况下,到达棋盘上每个空格的概率。绿色的 0 表示这个起始位置,前两行持有的非零值距离这个初始状态只有 2-12 个空格,代表不同的可能掷骰子及其不同的概率。
棋盘上的第三个空间恰好是公共空间。一个在公共空间的玩家在掷骰子后,面临着相似的落在 2-12 个空间之外的概率;然而,有 2/16 的社区公益金卡会将玩家送到棋盘上的其他位置。为了适应这种情况,我在每个空格的条目上加了 1/16(红色),然后每隔一个条目乘以正常进行的概率,14/16。
然后我将一个初始状态矩阵(Go 上开始的概率是 1)乘以转移矩阵 40 次,记录结果。排除前十次投掷(因为通常还没有建造房屋,所以它们无关紧要),我添加了每个给定空间的 31 个剩余着陆概率,以得出累积数字。然后我用这些除以 31 来确定每次投掷落在每个给定空间的真实概率。
我已经决定停在 40 点,因为这个来源表明,平均每个玩家的垄断游戏持续大约 30 回合,这相当于不到 40 回合。从我在 iOS 应用程序上玩“大富翁”游戏的个人经历来看,这似乎相当准确。
结果数据如下图所示,红色空间表示低着陆概率,反之亦然。为了增加最可能属性和最不可能属性之间的对比,我将最可能登陆的空间“监狱”和第二可能登陆的空间“围棋”都涂上了相同的绿色。这些概率包括玩家落地的任何空间,包括坐牢(尽管这导致在监狱中结束回合)。
我注意到的第一点是监狱空间是目前为止最常登陆的地方,这是由于去监狱的磁贴以及送玩家去那里的机会和社区公益金卡。数据中也有一些特性,如铁路 1 空间的着陆概率远远高于其周围环境。像这样的异常值通过将玩家发送到特定的空间,证明了机会和社区公益金卡在确定着陆概率中的重要性。
我已经用红色(低概率)到绿色(高概率)的比例在游戏板上可视化了相同的数据。为了更好地展示地产集之间着陆概率的变化,我从比例中排除了监狱空间,将其着色为与第二大热门空间 Go 相同的绿色。
作者图片
这让我更清楚地看到了橙色和红色的优点。然而,这种可视化是专门设计来增加数据点之间的差异。唯一真正影响游戏结果的是着陆概率如何影响预期租金。
计算每卷租金
通过将每个资产的着陆概率乘以其租金,可以确定预期租金/滚动。
您可以在此查看完整的数据集。如下表所示,我已经将每种颜色的物业的租金/租金加在一起。
虽然橙色和红色的场景是最常被参观的,但是黄色和绿色的场景会带来更多的租金/租金。令人惊讶的是,对于 4 栋房子或一家酒店来说,深蓝色套装的排名低于橙色。这是因为深蓝系列中只有两处房产——尽管每处房产的租金都很高,但深蓝系列作为一个整体消耗对手的速度比看起来要慢。
一个被数据推翻的普遍观点是,你应该总是首先升级一个集合中最昂贵的属性。例如,如果一个玩家在黄色的地产上各有三栋房子,并打算购买一栋额外的房子,将它放在黄色 1 上会比将房子放在黄色 3 上增加租金/掷骰数。然而,这种例外只在 110 种可能的排列中的 6 种中出现,所以升级一组中最昂贵的属性仍然是一个伟大的经验法则。
收支平衡
要达到收支平衡,对手掷骰子的次数只有在有其他可用投资的情况下才真正重要,可以使用下面的公式从租金/掷骰子中很容易地计算出来。
结果显示如下。这清楚地表明,建造房屋是获得房地产回报的唯一可行途径。然而,这些数字并不太现实。一个战略玩家会很快将租金收入再投资于购买更多的房子,这意味着需要时间来恢复最初花在某一特定财产上的现金是一个毫无意义的数字。
计算每局基本收入
每张牌的预期收入由 pass Go、两个税区和机会/社区公益金组成。因为通过运气和公益金获得/失去的钱取决于未知的变量,如玩家的数量,玩家是否拥有特定的财产等。所有牌的平均值大约相等。不管怎样,最后一个因素将被忽略。
以前的计算很容易用转移矩阵来实现。然而,通过围棋的平均掷骰数是一个更复杂的问题。为了回答这个问题,我用 Python 创建了一个蒙特卡洛模拟,它考虑了所有的纸牌和去监狱的空间。
通过蒙特卡洛模拟,确定了通过 Go 并获得$200(不坐牢,使玩家失去获得奖金的资格)所需的平均掷骰数为 5.86。
至于所得税和奢侈品税空间,每个空间的每卷预期付款是每卷着陆概率和在那里着陆损失的钱的乘积。
每卷的基本收入(垄断的未成熟版本的 UBI!)大约是 28 美元。如果一个玩家的对手共同拥有的财产的预期租金总额超过每局 28 美元,则该玩家平均每回合都会输钱。
与上面的租金/滚动表一起,28 美元的数字为一个直观的结果提供了支持:如果不拥有至少一套彩色电视机和建造房屋,就极不可能赢得垄断。这是因为,滚动滚动,一个对手将获得更多的钱传球去比他们将支付租金。
由于酒店的棕色组合的总租金/卷少于 28 美元,单独赢得棕色资产是极不可能的。除了酒店之外,浅蓝色的房子也是如此,其他的每处房产少于 3 栋的房子也是如此。
每个对手掷 28 美元是游戏早期和中期的一个基准。一旦玩家达到这个数字,现金的持续增加就不再有保证了。为了省钱,尽可能长时间呆在监狱里也可能成为一种策略。
租/掷同样有助于确定哪个玩家处于最有利的位置。交易会让你的租金/成交量比对手增加更多。以我的经验来看,双方最终都拿到全套彩色电视机的交换很常见;在每个玩家把他们的闲钱花在房子上之后,预测他们的租金/滚动将决定谁将处于有利的位置。
3 个外卖
- 购买和构建每套颜色的价格应与可用的现金量进行比较。这意味着没有颜色设置是游戏中“最好的”。例如,橙色和红色组的对手掷骰数最少,可以达到平衡。然而,如果你有足够的现金将绿色的房产升级到每套 3 所房子(1800 美元),这比购买橙色或红色的房子更好,因为绿色的房子需要更高的租金。**在个人策略的背景下,不要进行会让现金充裕的玩家满盘皆输的交易。相反,给一个现金匮乏的对手一整套——即使是橙色或红色——也不一定是坏事,只要它能让你迅速获得高租金/筹码。**话虽如此,但无可争议地存在一些不好的特性。浅蓝色的房子租金很低(直到酒店建成),深蓝色的房子少了一套房产,棕色的房子有上述两个问题。
- 如果你拥有另一套全彩色电视机(因此可以把你的钱花在其他投资上),你应该每处房产只买 3 套房子。否则,升级到每家 4 套甚至酒店是最优的。
- 你的对手越多,你就越愿意在交易中花更多的钱来获得你的第一套颜色组合,因为在游戏过程中会有更多的掷骰子。这意味着随着玩家数量的增加,保护你的现金储备就不那么重要了。相反,当只面对 1-2 个对手时,囤积现金非常重要。这也适用于其他属性。同时购买效用 1 和效用 2 被广泛认为是一个糟糕的决定,因为这些资产的盈亏平衡期分别是 90 和 81。然而,在 5 人以上的游戏中,90 次掷骰子相当于每个对手 19 次,这意味着公用事业可能会产生少量利润。
结论
垄断最终是一种平衡——试图提高自己的收入,同时保持足够的现金支付其他玩家的财产租金。也就是说,对平均租金/滚动的关注无疑揭示了游戏的独特视角。
虽然实际数字会随着每一次掷骰子而变化,但仍然有可能使用期望值的数学概念和一些关于一般游戏的合理假设来制定策略。
任何一个在第三个小时里已经厌倦了无休止地围着垄断商标打转的人都很清楚,这是一场消耗战。
关于机器翻译,数据告诉我们什么
软件算法正在超越人类语言学家吗?
对神经机器翻译模型的状态以及它们如何相互比较以及与人类翻译进行简要的历史调查。
图片来源:Pixabay.com
神经机器翻译的最新发展会不会很快让人类翻译人员过时?为了回答这个问题,我们将简要调查一下机器翻译的当前技术水平。我们将考虑各种翻译引擎在翻译各种类型的内容时的表现,并考虑成功翻译外语存在的差异。我们将考虑历史趋势来评估这样一个普遍假设,即机器正在迅速缩小曾经将它们与人类语言学家分开的质量差距。我们将看看最近的一些发展,以评估它们在提高机器翻译准确性和性能方面的意义。
2015:机器翻译拐点
直到 5 年前,机器翻译还是基于短语的。一个算法将按顺序考虑一个段落。我们说话的时候这种语言已经被翻译了。基于短语的翻译方法的问题是没有文章上下文的初始知识。没有上下文,误解和不正确翻译的几率就会增加。这有点像盲人和大象的问题。如果一个人开始触摸躯干、腿、长牙和耳朵,他可能会误以为触摸的是哪只野兽。只有将所有的部分结合起来,一个人才能把握整体,即完形。
然而,从 2015 年开始,被称为神经网络的人工智能结构开始被应用于机器翻译任务。在这种方法中,要翻译的整篇文章都是通过数据结构和算法输入和处理的,用于各种内部和外部连接。这样,即使在处理单个部分、单词和句子之前,也可以通过语言和结构的联系来理解整体。
神经机器翻译技术的细微差别
在不涉及太多细节的情况下,神经机器翻译使用向量表示法——对于给定段落的单词和内部状态的“嵌入”和“连续空间表示法”。该结构比基于短语的方法更简单:基于整个源句子的深度学习和表示学习技术,单个序列模型一次预测一个单词。
起初,这是使用递归神经网络(RNN)完成的,该网络双向编码,然后解码以预测目标语言中的单词。后来,卷积神经网络(Convnets)在使用所谓的基于“注意力”的方法进行改进后,接替了 RNNs。
商业、社区和竞争中的神经机器翻译
到 2016 年,NMT 方法赢得了几乎所有的主要奖项。Yandex、IBM 和 PROMT AI 驱动的翻译工具现在使用神经网络。谷歌将自己的方法命名为 GNMT,并在谷歌翻译中使用。微软在它的翻译器和 Skype 中应用它的版本。哈佛大学的 NLP 小组发布了一个开源的 NMT (ONMT)。
近年来,脸书的人工智能小组利用数十亿 FB 用户的对话和帖子的无与伦比的数据库,在 2019 年第四届机器翻译大会(被称为 WMT)的几项任务中击败了竞争对手。扎克伯格的社交网络模型在新闻翻译的几项语言任务中赢得了第一名,包括竞争最激烈的英语到德语的任务。对于这个语言方向,它的翻译被 WMT 组织者宣布为“超人”:人类评估者比人类语言学家做的翻译更喜欢它们。
微软 NMT 的进步导致该公司在 2018 年宣布与专业人工翻译平起平坐,至少在困难的汉英翻译类别中是如此。尽管如此,这仍然是一个开放的领域,特别是在不太受欢迎的语言方面,波罗的海地区的新贵 Tilde 击败了谷歌、微软和其他公司,赢得了 WMT 2019 年英语-立陶宛语比赛。
数据科学与翻译质量评估
具有讽刺意味的是,对 NMT 数据质量的评估是由人类专家通过比较机器和人类的翻译来完成的。这些通常通过主观评分来完成。实际上,人类专家被要求站在反对他们物种的一边。越来越多的结果表明,物种忠诚度退居专业语言评估之后。
人类语言学家对数据科学的态度本质上并不乐观,因此人们倾向于认为统计结果甚至可能偏向于人类翻译。这篇文章太短,无法真正深入了解这些数字,但取代 BLEU 的测量标准是一种叫做 LEPOR 的东西。这种测量方法将 NMT 相互之间以及与人类进行比较。分析公司 INTENTO 在 2019 年 1 月的一项研究中比较了 48 种语言对的表现,将谷歌和亚马逊评为覆盖范围最好的。新贵 DEEPL 在少数几种语言中表现最好,而 YANDEX 做得最划算。
机器语言翻译者注定是最好的人类语言学家吗?
翻译的未来会被神经网络驱动的 AI 机器人所主宰吗?对于新闻、天气、体育和其他广泛使用的高度结构化的语言格式来说是如此,对于政府、法律和金融报告来说也是如此。可能这一点已经过去了。机器和数据科学似乎还远远达不到的领域仍然是创造性写作:诗歌、小说和非小说。这些算法还有很长的路要走,即使有最好的编程和众所周知的百万(十亿?万亿?)猴子。
就连非正式对话的翻译似乎也将被机器所主宰,步脸书处理用户聊天、评论和帖子的后尘,不管用户是否知情。下一代神经机器翻译引擎的真正考验可能是对被称为色情短信的新型在线对话的翻译。如果机器翻译的色情短信比人工翻译更能引起评价者的注意,我们可能真的有理由担心。
怎么回事?
好好看看机器学习的‘f’字,以及为什么不能忽略它!
声明:所有表达的观点都是我自己的。
我知道你很想知道这个“f”字到底是什么。别走开,我们很快就会到达。我可以马上告诉你的一件事是,不管你对机器学习的熟悉程度如何,理解这个‘f’字将有助于你理解大多数机器学习是怎么回事。
在此之前,我们先来玩一点角色扮演。你是一名数据科学家,你的初创公司让你与一名营销同事合作,以提高公司产品的销量。你必须建议“营销人员”如何调整三种不同媒体渠道的广告预算——电视、广播和报纸。
你看一下过去的数据(图 1),你可以用肉眼看出,很明显,你在每个媒体渠道——电视、广播和报纸——上投入的广告金额对产品的销售有影响。
图 1:每个广告媒体的销售额(以千单位计)与预算(以千美元计)
作为一名数据科学家,您希望了解并解释这三者是如何共同影响销售的。换句话说,我们希望将销售建模为电视、广播和报纸预算的 函数 。是的,这就是我们难以捉摸的“f”字——函数。
“销售是电视、广播和报纸预算的一个功能”的说法。
这个 f 是什么意思?
简而言之,你可以把 f 想象成一个输入 X 产生输出 y 的东西,一个很好的类比例子就是洗衣机。你把脏衣服(X)放进洗衣机(f),它会把洗好的衣服(Y)还给你。
在产品销售和广告媒体预算的上下文中,函数 f 将电视、广播和报纸预算(分别由 X1、X2 和 X3 表示)作为输入,并将销售额 Y 作为输出。(我们以组合形式表示 X1、X2 和 X3——作为向量 X)
剧透警报!许多机器学习实际上只是提出一个好的 f,它可以接受一些输入数据并返回一个可靠的输出。
我们为什么要这个 f?
我们想找一份好工作有三个主要原因:
- 有了一个好的 f,我们可以输入所有 3 种媒体的预算,并预测销售额。
- 我们可以了解哪些预测因素(如电视、广播、报纸预算)对 y 有重要影响。我们可能会发现,在报纸上花钱实际上是一种浪费,因为报纸广告并不能大幅提高销售额。
- 我们也许能够理解每个预测因子是如何影响 y 的。例如,我们可能会发现投资电视广告比投资报纸广告有效 5 倍。
玩笑开够了。….我如何找到这个 f?
在回答这个问题之前,我们需要问自己以下问题:
在广阔绚丽的宇宙中,是否存在某种完美的 f?
嗯,也许不是一个“完美”的 f,但有一个理想/最佳的 f。如果我们看一下图 2,我们会注意到一些奇怪的事情——对于 X 轴上的一个点(报纸预算),在某些情况下似乎有多个对应的 Y(销售)值。例如,对于图 2 中绘制的数据,对于 x = 6.4,在 Y 轴上有两个相应的值:y =11.9 和 y = 17.3。
图 2:销售额与报纸预算
因此,理想函数可以简单地是对应于特定 x 的所有 y 值的平均值,换句话说,对于上图:
用更“数学”的术语来说,所有 Y 在任一 X 处的平均值称为期望值 E(Y)。因此,取任意 X 处所有 Y 值的平均值的过程可以是我们的“理想”函数。我们的理想 f 可以用下面的方式来表达:
(不要担心 Y|X…这只是“给定 X 等于某个特定值 X,Y”的一种“数学”说法
好吧…但是为什么我们需要机器学习呢?
可悲的是,因为我们生活在“现实世界”里。
在“现实世界”中,我们并不具备使用上述平均思想可靠估算 Y 所需的所有数据。甚至对于销售广告数据,你可以看到在图 2 中,对于 x=77.5,x=95,x=110 等,没有相应的 Y 值。
解决缺失数据问题的一个简单方法是使用邻域的概念。
这意味着,不是严格在 x=77.5 取 Y 值的平均值,我们可以取在 x=77.5 附近的所有 Y 值的平均值。因此,可能的邻域可能是这样的,从 x=75 到 x=80(参考图 3 中的蓝色垂直线)。
图 3:对于 f(77.5),我们取 75≥x≤80 的所有 Y 值的平均值
我们的定义和符号有一点改变,以反映我们不再局限于恰好出现在给定点 X=x 的 Y 值,而是现在查看出现在 X=x 的 邻域 中的 Y 值
这很好,直到我们遇到两个主要问题:
- 当除了报纸预算之外还有多个预测因素时会发生什么(例如:电视、广播、脸书广告、谷歌广告……)。在这种情况下,问题扩展到多个维度(不仅仅是 x 轴和 y 轴),定义我们宝贵的小“邻居”变得越来越困难。(这个问题有个很厉害的名字:维度的诅咒)
- 当邻近区域没有数据时会发生什么?例如,在图 3 中,没有从 x=115 到 x=145 及以上的数据。
机器学习拯救世界!
为了不受上述两个问题的约束,我们转而使用机器学习来估计 f。虽然有各种各样的机器学习模型可供选择,但让我们考虑一个简单而有效的模型——线性回归模型。在线性回归模型中,输入 X1(电视预算)、X2(广播预算)、X3(报纸预算)分别乘以 w1、w2 和 w3,然后相加得到 y
在上面的等式中,w0、w1、w2、w3 是参数,其值通过训练和拟合数据上的模型来学习。换句话说,这些参数的值是通过“观察”数据和反复猜测来改变的,随着时间的推移,猜测变得越来越准确,直到我们得到一个足够好的 f。
结论
选择哪个(些)模型来估计 f、如何执行学习过程以及“足够好”的 f 意味着什么是机器学习实践者在处理特定问题时反复研究的重要问题。机器学习实践者通常依靠经验、领域知识和经验证据来尝试回答这些问题。尽管如此,不管问题的背景和性质如何,找到一个好的 f 是使用机器学习进行预测、推理和解决问题的基础。
参考/灵感
- 加雷斯·詹姆斯,丹妮拉·威滕,特雷弗·哈斯蒂,罗伯特·蒂布拉尼。统计学习介绍:在 R 中的应用。纽约:施普林格,2013 年。
- 哈斯蒂、特雷弗、罗伯特·蒂布拉尼和 j·H·弗里德曼。统计学习的要素:数据挖掘、推理和预测。第二版。纽约:斯普林格,2009 年。