TowardsDataScience-博客中文翻译-2020-一百一十四-
TowardsDataScience 博客中文翻译 2020(一百一十四)
多通道神经网络

神经网络可以,而且应该,在多种类型的特征上被训练。本教程将介绍如何使用 Keras Functional API 来扩展您的网络。
神经网络广泛应用于多个领域,如计算机视觉、音频分类、自然语言处理等。在大多数情况下,它们在这些领域中被单独考虑。然而,在现实生活中,这很少是最佳配置。更常见的是有多个通道,意味着几种不同类型的输入。类似于人类如何使用广泛的感官输入(听觉、视觉等)来提取洞察力。),神经网络可以(也应该)在多个输入上进行训练。
让我们以情感识别的任务为例。
人类不使用单一输入来有效地分类对话者的情绪。例如,他们不仅仅使用对话者的面部表情(视觉)、声音(听觉)或词语的含义(文本),而是混合使用。类似地,神经网络可以对多个输入进行训练,例如图像、音频和文本,并进行相应的处理(通过 CNN、NLP 等。),以得出对目标情绪的有效预测。通过这样做,神经网络可以更好地捕捉难以从每个通道单独获得的微妙之处(例如讽刺),类似于人类。
系统结构
考虑到情绪识别的任务,为简单起见,我们将其限制为三类(积极、消极和中性),我们可以将该系统想象为如下:

该系统通过麦克风拾取音频,将声音的 MEL 声谱图计算为图像,并将其转录为一串文本。这两个信号然后被用作模型的输入,每个信号被馈送到它的一个分支。事实上,神经网络由两部分组成:
- 左分支,通过卷积神经网络进行图像分类
- 右分支,使用嵌入对文本执行 NLP。
最后,每一侧的输出被馈送到一组公共的密集层,其中最后一层具有三个神经元,以分别对三个类别进行分类(阳性、中性和阴性)。
设置
在本例中,我们将使用 MELD 数据集,该数据集由带有相关情绪标签的简短对话组成,表明陈述的情绪是积极的、中立的还是消极的。数据集可以在这里找到。
你也可以在这里找到这篇文章的完整代码。
图像分类处
声音采集完成后,系统会立即计算音频信号的声谱图。音频分类的最新特征是 MEL 频谱图和 MEL 频率倒谱系数。对于这个例子,我们将使用 MEL 谱图。
首先,我们显然会从包含音频的文件夹中加载数据,在培训、验证和测试中进行拆分:
import gensim.models as gm
import glob as gb
import keras.applications as ka
import keras.layers as kl
import keras.models as km
import keras.optimizers as ko
import keras_preprocessing.image as ki
import keras_preprocessing.sequence as ks
import keras_preprocessing.text as kt
import numpy as np
import pandas as pd
import pickle as pk
import tensorflow as tf
import utils as ut
# Data
Data_dir = np.array(gb.glob('../Data/MELD.Raw/train_splits/*'))
Validation_dir = np.array(gb.glob('../Data/MELD.Raw/dev_splits_complete/*'))
Test_dir = np.array(gb.glob('../Data/MELD.Raw/output_repeated_splits_test/*'))
# Parameters
BATCH = 16
EMBEDDING_LENGTH = 32
然后,我们可以遍历这三个文件夹中的每个音频文件,计算 MEL 频谱图,并将其作为图像保存到新文件夹中:
# Convert Audio to Spectrograms
for file in Data_dir:
filename, name = file, file.split('/')[-1].split('.')[0]
ut.create_spectrogram(filename, name)
for file in Validation_dir:
filename, name = file, file.split('/')[-1].split('.')[0]
ut.create_spectrogram_validation(filename, name)
for file in Test_dir:
filename, name = file, file.split('/')[-1].split('.')[0]
ut.create_spectrogram_test(filename, name)
为此,我们在实用程序脚本中创建了一个用于训练、验证和测试的函数。该函数使用 librosa 包加载音频文件,对其进行处理,然后将其保存为图像:
import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np
import path as ph
import pydub as pb
import speech_recognition as sr
import warningsdef create_spectrogram(filename, name):
plt.interactive(False)
clip, sample_rate = librosa.load(filename, sr=None) fig = plt.figure(figsize=[0.72, 0.72])
ax = fig.add_subplot(111)
ax.axes.get_xaxis().set_visible(False)
ax.axes.get_yaxis().set_visible(False)
ax.set_frame_on(False) S = librosa.feature.melspectrogram(y=clip, sr=sample_rate)
librosa.display.specshow(librosa.power_to_db(S, ref=np.max))
filename = 'img/Train/' + name + '.jpg' plt.savefig(filename, dpi=400, bbox_inches='tight', pad_inches=0)
plt.close()
fig.clf()
plt.close(fig)
plt.close('all')
del filename, name, clip, sample_rate, fig, ax, S
一旦我们将每个音频信号转换为表示相应频谱图的图像,我们就可以加载包含每个音频标签信息的数据集。为了正确地将每个音频文件链接到它的情感,我们创建一个 ID 列,包含该样本的图像文件的名称:
# Data Loading
train = pd.read_csv('../Data/MELD.Raw/train_sent_emo.csv', dtype=str)validation = pd.read_csv('../Data/MELD.Raw/dev_sent_emo.csv', dtype=str)test = pd.read_csv('../Data/MELD.Raw/test_sent_emo.csv', dtype=str) # Create mapping to identify audio files
train["ID"] = 'dia'+train["Dialogue_ID"]+'_utt'+train["Utterance_ID"]+'.jpg'validation["ID"] = 'dia'+validation["Dialogue_ID"]+'_utt'+validation["Utterance_ID"]+'.jpg'test["ID"] = 'dia'+test["Dialogue_ID"]+'_utt'+test["Utterance_ID"]+'.jpg'
自然语言处理处
同时,我们还需要获取与音频信号相关的文本,并使用 NLP 技术对其进行处理,将其转换为数字向量,以便神经网络可以对其进行处理。既然我们已经有了 MELD 数据集本身的文本信息,我们就可以继续了。否则,如果信息不可用,我们可以使用文本转换库,比如谷歌云的语音识别:
# Text Features
tokenizer = kt.Tokenizer(num_words=5000)
tokenizer.fit_on_texts(train['Utterance'])
vocab_size = len(tokenizer.word_index) + 1
train_tokens = tokenizer.texts_to_sequences(train['Utterance'])
text_features = pd.DataFrame(ks.pad_sequences(train_tokens, maxlen=200))
validation_tokens = tokenizer.texts_to_sequences(validation['Utterance'])
validation_features = pd.DataFrame(ks.pad_sequences(validation_tokens, maxlen=200))
我们首先标记每个音频中的句子,然后将它们转换成长度为 200 的数字向量。
数据管道
整合多媒体输入最棘手的一个方面是创建一个定制的数据生成器。这个结构基本上是一个函数,每次被调用时,它能够迭代地返回到模型的下一批输入。使用 Keras 的预制生成器相对容易,但没有实现允许您将多个输入合并在一起,并确保两个输入并排无误地输入到模型中。
下面的代码足够通用,可以在不同的设置中使用,而不仅仅是与这个例子相关。具体来说,它需要一个文件夹位置(图像所在的位置)和一个“普通”数据集(行中有样本,列中有要素)。然后,在这种情况下,它迭代地提供图像和文本特征的下一个样本,这两个样本都是相同大小的批次:
# Data Pipeline
def train_generator(features, batch):
# Image Generator
train_generator = ki.ImageDataGenerator(
rescale=1\. / 255.) train_generator = train_generator.flow_from_dataframe(
dataframe=train,
directory="img/Train/",
x_col="ID",
y_col="Sentiment",
batch_size=batch,
seed=0,
shuffle=False,
class_mode="categorical",
target_size=(64, 64)) train_iterator = features.iterrows()
j = 0
i = 0 while True:
genX2 = pd.DataFrame(columns=features.columns) while i < batch:
k,r = train_iterator.__next__()
r = pd.DataFrame([r], columns=genX2.columns)
genX2 = genX2.append(r)
j += 1
i += 1 if j == train.shape[0]:
X1i = train_generator.next() train_generator = ki.ImageDataGenerator(
rescale=1\. / 255.) train_generator = train_generator.flow_from_dataframe(
dataframe=train,
directory="img/Train/",
x_col="ID",
y_col="Sentiment",
batch_size=batch,
seed=0,
shuffle=False,
class_mode="categorical",
target_size=(64, 64)) # Text Generator
train_iterator = features.iterrows()
i = 0
j=0
X2i = genX2
genX2 = pd.DataFrame(columns=features.columns)
yield [X1i[0], tf.convert_to_tensor(X2i.values, dtype=tf.float32)], X1i[1] X1i = train_generator.next()
X2i = genX2
i = 0
yield [X1i[0], tf.convert_to_tensor(X2i.values, dtype=tf.float32)], X1i[1]
神经网络体系结构
最后,我们可以创建输入图像(声谱图)和文本(转录)的模型,并对它们进行处理。
输入
输入包括由 64x64 像素和 3 个通道(RGB)组成的图像,以及长度为 200 的“正常”数字特征,表示文本的编码:
# Model
# Inputs
images = km.Input(shape=(64, 64, 3))
features = km.Input(shape=(200, ))
图像分类(CNN)分部
影像分类分支由初始 VGG19 网络和一组自定义图层组成。通过使用 VGG19,我们可以利用迁移学习的优势。特别是,由于该模型已经在 ImageNet 数据集上进行了预训练,它已经从初始化为对图像分类任务有意义的值的系数开始。然后,输出被输入到一系列层中,这些层可以学习这类图像的具体特征,然后输出到下一个公共层:
# Transfer Learning Bases
vgg19 = ka.VGG19(weights='imagenet', include_top=False)
vgg19.trainable = False
# Image Classification Branch
x = vgg19(images)
x = kl.GlobalAveragePooling2D()(x)
x = kl.Dense(32, activation='relu')(x)
x = kl.Dropout(rate=0.25)(x)
x = km.Model(inputs=images, outputs=x)
文本分类分支
NLP 分支使用长短期记忆(LSTM)层和嵌入层来处理数据。为了避免模型过度捕捞,还添加了脱落层,类似于 CNN 分支机构所做的工作:
# Text Classification Branch
y = kl.Embedding(vocab_size, EMBEDDING_LENGTH, input_length=200)(features)
y = kl.SpatialDropout1D(0.25)(y)
y = kl.LSTM(25, dropout=0.25, recurrent_dropout=0.25)(y)
y = kl.Dropout(0.25)(y)
y = km.Model(inputs=features, outputs=y)
公共层
然后,我们可以将这两种输出结合起来,输入到一系列密集层中。一组密集层能够捕捉仅当音频和文本信号组合时才可用的信息,并且不能从每个单独的输入中识别。
我们还使用学习率为 0.0001 的 Adam 优化器,这通常是一个很好的组合:
combined = kl.concatenate([x.output, y.output])
z = kl.Dense(32, activation="relu")(combined)
z = kl.Dropout(rate=0.25)(z)
z = kl.Dense(32, activation="relu")(z)
z = kl.Dropout(rate=0.25)(z)
z = kl.Dense(3, activation="softmax")(z)
model = km.Model(inputs=[x.input, y.input], outputs=z)
model.compile(optimizer=ko.Adam(lr=0.0001), loss='categorical_crossentropy', metrics='accuracy')
model.summary()
模特培训
然后,可以使用我们之前通过执行以下操作创建的训练和验证生成器来训练该模型:
# Hyperparameters
EPOCHS = 13
TRAIN_STEPS = np.floor(train.shape[0]/BATCH)
VALIDATION_STEPS = np.floor(validation.shape[0]/BATCH)
# Model Training
model.fit_generator(generator=train_generator(text_features, BATCH),
steps_per_epoch=TRAIN_STEPS,
validation_data=validation_generator(validation_features, BATCH),
validation_steps=VALIDATION_STEPS,
epochs=EPOCHS)
模型评估
最后,在一组数据上评估模型,例如单独的验证集,然后保存为文件,以便在“实时”场景中使用时加载:
# Performance Evaluation
# Validation
model.evaluate_generator(generator=validation_generator(validation_features, BATCH))
# Save the Model and Labels
model.save('Model.h5')
摘要
总的来说,我们构建了一个能够接受多种类型输入(图像、文本等)的系统。),对它们进行预处理,然后将它们馈送到由每个输入的一个分支组成的神经网络。每个分支单独处理其输入,然后汇聚成一组公共层,预测最终输出。
具体步骤是:
- 数据加载
- 分别预处理输入(频谱图、符号化)
- 创建自定义数据生成器
- 构建模型架构
- 模特培训
- 性能赋值
要阅读更多类似的文章,请关注我的 Twitter ,LinkedIn或我的 网站 。
流行歌曲的音乐相似性-一篇评论文章
使用数据可视化来解释概念

https://unsplash.com/photos/1oKxSKSOowE
“音乐是我所知道的唯一没有任何规则的东西。”- 乔希·霍姆
2014 年,史努比·道格问 50 Cent 他最怀念过去的什么,当时嘻哈“就是它”50 美分回答“真实性”,导致 Snoop 臭名昭著的模仿当今说唱歌手:https://pudding . cool/2018/05/similarity/assets/videos/video _ Snoop . MP4
我坚信,当谈到创造力时,无论是音乐、绘画还是写作,都没有规则可言。然而,尽管艺术作品具有不确定性,但人们必须从作品中挖掘出某些元素,以便对比和分析世界各地艺术家的努力。一个如此美丽的艺术量化,特别是流行音乐,在布丁的文章中显而易见,“ 热门歌曲的音乐多样性越来越少了吗?
这篇文章以这样一个论点开始,即当我们从 20 世纪 80 年代进入当今时代时,大多数热门歌曲的“声音”往往是相似的。但是如何比较无形数据呢?显示了一个条形图,解释了一个粗略但合理的特征,如 1980-1986 年期间歌曲中合成器的比例,这表明合成器的使用明显增加。

快照来自 布丁文章
或者,人们可以研究复杂的数据集,如 音乐基因组计划 ,它使用数百种属性如速度、流派、音调等为歌曲评分。

作者的故事基于的 8 个数据点,如“声学”、“舞蹈性”、“能量”、“乐器性”、“活性”、“响度”、“语音性”和“化合价”。这 8 个点中的每一个都有 0-1 之间的值,每个因素都有两个独特的例子来详细解释。因此,歌曲被简化为 8 维实体,可以使用像欧几里德距离这样的度量标准进行比较。

快照来自布丁文章
有趣的是,歌曲的简单矢量表示为音乐产业的详细分析打开了一扇窗。我们观察到,从 1960 年到 2010 年,歌曲的相似度稳步上升。
另一个有说服力的评估歌曲的方法是记录每首热门歌曲的平均词曲作者数量。虽然有人会说这与音乐同质性的上升没有直接关系,但作者提供了令人信服的证据来证明一首歌中作家数量的增加会抵消他们的个人品质,导致歌曲不那么独特。以下是这篇文章的摘要:

我的观点:
虽然故事呈现得很优雅,但增加一个互动层,读者可以输入他们选择的任何两首歌曲来获得相似性得分,这将是蛋糕上的樱桃。(对于我的 UI 忍者朋友来说,这可能是一个有趣的项目想法)
选择比较你最喜欢的音乐不仅能吸引听众,还能让他们对流行趋势形成个性化的看法。此外,我想探索 2D 可视化(使用像 PCA 这样的降维技术生成)显示相似歌曲集群的形成。
总的来说,作品中充满了相关歌曲的片段,让读者参与进来,产生了令人信服的影响。它让我们得出两个合乎逻辑的结论——要么这一趋势将持续加速(从纯粹的统计角度来看),要么它将成为原创音乐从音乐排行榜上脱颖而出的前所未有的机会,因为对于音乐盒变平的听众来说,这将是一种“开箱即用”的体验。
(几乎)每个 ETL 管道中使用的 MySQL 函数
记住这些功能。

ETL 管道介绍
“ETL”代表什么?为了回答这个问题,让我们考虑一下每个数据科学家都知道的 80/20 法则:一个数据科学家 80%的时间被分配给 E 提取、 T 转换和 L 加载数据,20%的时间被分配给同时观看办公室重新运行和亚马逊 Prime 的杰克·瑞恩,以此来对比约翰·卡拉辛斯基令人难以置信的范围。
在这篇博客中,我们将研究一些最常用的 MySQL 函数,准确地说是五个函数,没有特定的顺序,每个 SQL 初学者都应该记住它们。
管道
因为这篇博客的目的是关注经常使用的 SQL 命令,所以我们将只关注管道的数据提取过程。
首先,让我们导入 Pandas 和 Sqlite3,并定义一个“游标”光标对象允许我们调用。execute()方法来执行 SQL 命令。

光标对象允许我们调用。execute()方法来执行 SQL 命令
现在我们已经连接到数据库,这是一个名为“data.sqlite”的本地文件,我们可以开始提取数据了。但是首先,让我们检查一下数据库模式:

我们的数据库模式
正如我们所看到的,我们有多个表,其中一些有一对一的关系,一些有一对多的关系(更多关于那个这里和这里)。
功能 1:选择
选择功能允许我们获取所需的数据。假设我们需要 orderdetails 表中的每一列。我们可以编写如下查询:
query = """SELECT od.orderNumber,
productCode,
quantityOrdered,
priceEach,
orderLineNumber
FROM orderdetails;"""
然而,我们可以简单地使用星号来抓取每一列,而不是写出每一列。
query = """SELECT * FROM ordertails;"""
现在,如果您的数据包含重复条目,您可以调用 DISTINCT 在将数据放入 dataframe 之前只获取唯一的数据点。

SELECT DISTINCT 查询示例
聚合器函数:COUNT()、SUM()、MIN()、MAX()、AVG()
请注意,上述数据帧的前四行具有相同的 orderNumber。我们可以看到每个 orderNumber 包含多个 productCodes,每个都有自己的数量和价格。比方说,对于每份订单,我们都想知道客户花费的总金额——请注意,我们没有每种产品的总计列。这就是聚合函数派上用场的地方。请注意,在使用聚合函数时,始终包含 GROUP BY 函数(稍后将详细介绍)是非常重要的,这样就可以知道聚合数据的内容,在本例中是 orderNumber。

聚合器函数 SUM()和别名函数作为查询示例
使用 SUM() 函数允许我们创建一个名为“orderTotal”的新列(使用别名函数作为),我们可以看到前五个订单分别为$10,222.83、$10,549.01、$5,494.78、$50,218.95 和$40,206.20。挺有用的。
功能二:加入
JOIN 命令用于使用一个公共列(也称为外键)从不同的表中选择多行。我们将关注四个最常见的连接子句:outer、inner、left 和 right。注意,必须使用上的或使用上的来定义公共列。上的语法将是…ON table 1 . common _ column _ name = table 2 . common _ column _ name,而 USING 的语法只是… USING (common_column_name)。
外部连接
外部连接返回左表或右表中匹配的数据。

图片来自:https://www.w3schools.com/sql/sql_join.asp
内部连接
一个内部连接返回在左表和右表中都匹配的数据。

图片来自:https://www.w3schools.com/sql/sql_join.asp
左连接
一个左连接返回左表中的所有记录以及右表中的匹配行。

图片来自:https://www.w3schools.com/sql/sql_join.asp
右连接
一个右连接返回右表中的所有记录以及左表中的匹配行。

图片来自:https://www.w3schools.com/sql/sql_join.asp
现在让我们看一个例子。使用我们以前的模式,假设我们需要每个雇员的雇员号、名、姓和邮政编码。我们可以使用 officeCode 作为外键来执行 employees 表和 offices 表的一个简单的内部连接(这只是许多方法中的一种)。

内部联接示例查询
注意,使用联接时,必须指定从哪个表中提取列。这可以通过在 SELECT 子句中使用语法 table_name.column_name 来完成。这可能很繁琐,所以更常见的方法是为每个表分配一个昵称。上面的代码将 employees 表标记为“e ”,将 offices 表标记为“o ”,以避免为所需的每一列键入完整的表名。
功能 3:在哪里
当我们想要对我们想要的数据设置某个条件时,使用 WHERE 函数。此外,您可以在之间使用 WHERE 连同 AND,OR,NOT,LIKE ,and 来设置数据的具体要求。让我们看几个简单的例子(这些查询没有使用原始的模式,纯粹是说明性的)。
与,或,与非
#all males that weigh more than 200lbs
query = """ SELECT patient_id, height, weight, age, sex, region
FROM patients
WHERE sex = 'M' AND weight > 200;"""#all patients that weigh more than 200 or are older than 50
query = """ SELECT patient_id, height, weight, age, sex, region
FROM patients
WHERE weight > 200 OR age > 50;"""#all patients not from the Northeast
query = """ SELECT patient_id, height, weight, age, sex, region
FROM patients
WHERE region NOT 'NE';"""
喜欢
#all patients whose patient_id starts with A100
query = """ SELECT patient_id, height, weight, age, sex, region
FROM patients
WHERE patient_id LIKE 'A100%';"""
在...之间
#all patients who weigh between 195 and 255 lbs
query = """ SELECT patient_id, height, weight, age, sex, region
FROM patients
WHERE weight BETWEEN 195 and 255;"""
功能 4:排序依据
ORDER BY 命令按照指定的列以升序(默认)或降序组织我们的数据。让我们重温一下我们的原始模式,看一个简单的例子。
升序(ASC)
让我们从 customers 表中获取 customerName、creditLimit、addressLine1、city、state、postalCode 和 country。我们将按照州和城市的字母顺序对结果进行排序。最后,我们将只考虑信用限额超过 25,000 美元的美国客户。

按升序排序的查询示例
下降(DESC)
让我们查询完全相同的数据,只是这次我们将按 creditLimit 对行进行排序,并且只查看前 5 个 credit LIMIT(使用 LIMIT 子句)

按降序排序的查询示例
功能 5:分组依据
如前所述, GROUP BY 函数通常与聚合函数一起使用,以便按一列或多列对“结果”数据进行分组。下面是一个简单的例子,说明我们如何按一列分组,以便查看应用于不同列的聚合函数。具体来说,假设我们想了解我们在美国哪五个州开展的业务最多。这可能涉及到按州对数据进行分组,并对我们之前计算的 orderTotal 列求和。

分组依据和限制查询示例
请注意,在上面的代码中,您可以传递 1、2 等。而不是 column_name。这指定了对结果进行分组的列的位置(相对于选择原因)。所以在上面的例子中,我们可以说“GROUP BY 1”而不是“GROUP BY state ”,因为 state 位于 SELECT 子句的 1 位置

GROUP BY 1 查询示例
通过功能与组共同使用的另一个重要功能是 HAVING。具有功能的类似于 WHERE 功能,它创建了一个需要满足的条件,以便将一行包含在结果中,但不同之处在于具有子句的通过命令将条件直接分配给组。这可能有点令人困惑,所以让我们试着用一些代码来阐明这一点。
下面的代码为我们提取了任何累计订购了 10 个或更多产品的客户的 customerName、customerNumber、productName、productCode 和 totalOrdered。请注意, HAVING 子句的作用类似于此处的 WHERE 子句,但仅适用于 GROUP BY 1(客户名称)、4(产品代码)。

GROUP BY 和 HAVING 查询示例
最后一个技巧:子查询!
子查询基本上是查询中的查询。它们可以用在许多方面来解决许多不同的问题。但是最终,当您的条件变得复杂并且需要多个 JOIN 命令和/或多个 WHERE 命令时,您需要使用子查询。
例如,如果我们想获得少于 5 名雇员的办公室中每个雇员的名字、姓氏和城市,该怎么办?处理这种情况的一种方法是,首先查询一个少于 5 名雇员的办公室的结果集,然后只考虑其办公室代码在结果集中的雇员的名字、姓氏和城市。让我们看看代码是什么样子的:

子查询示例
小抄
在这篇博客中,我们介绍了典型 ETL 管道中最常用的 5 个 MySQL 函数,以及它们对应的所有子句/命令。让我们快速回顾一下。
函数 1: SELECT、SELECT DISTINCT、SELECT +聚合函数和 AS(在输出中应该调用的列的别名)
功能 2: JOIN(外/内/左/右)+ ON 或 USING
功能 3: WHERE +和/或/NOT,比如,BETWEEN
功能 4:按+ ASC(默认)或 DESC 排序
功能 5:分组依据+拥有
子查询:查询中的查询
我强烈鼓励每个阅读这篇博客的人做进一步的阅读。你怎么想呢?有什么荣誉奖吗?
所有 Covid 案例的秘密:为什么复杂性滋生阴谋
新冠肺炎的阴谋论让人们关注数据素养的鸿沟

注意到搜索结果的不可思议并不是没有道理的(没试过就试试吧)。即使是倾向于数学的朋友,在不情愿地承认这种现象有点奇怪后,也不得不求助于计算来加强他们的感觉,即完全覆盖三位数的案例空间确实是可能的。因此,许多人将这种现象视为政府或媒体公司中少数强大参与者秘密合作的证据,这并不奇怪。我对任何阴谋都持怀疑态度,但除了对大数定律(又名聪明人的阴谋论)的油腔滑调之外,我无法提供任何直观的解释。我不得不绞尽脑汁,想出一些代码,看看如果报告的新病例数量基本上是随机的,那么完全覆盖到 999 人的可能性有多大(结果如下)。
我们能够直观地理解小变量系统(如投掷物体的轨迹)或聚合多变量系统(如水温)的直接因果模式,并利用这种理解投射到中等变量系统,如社会。因此,当一些人从一个能熟练监管一个国家方方面面的好领导人的想法中找到安慰时,另一些人也同样因为一群邪恶领导人想从内部摧毁这个国家的信念而感到安慰。它们都将巨大的复杂性简化为几个容易理解的变量。在光谱的另一端,我们通常对大量系统及其聚合行为感到舒适,因此预计会看到来自数千个来源的标题的变化,因为这让人想起一大群人进行许多单独对话时大声但不连贯的聊天。
但三位数的冠状病毒病例数所表明的趋同行为(许多不同的代理人表现得似乎很协调)令人惊讶,如果我们坚持用直觉找到因果链,我们将不得不求助于小数量或大数量的直觉。在这种情况下,大量的直觉是不好的,因为搜索结果表明有很高程度的表面相似性(没有什么比递增的整数更连贯),这表明协调的行动。这就留下了少量的直觉,这些直觉试图找到使事情发生的最小杠杆集,因此我们得到这样的想法,一些小的个人或组织必须组织起来以覆盖病例计数报告。
如果我们考虑几个报告来源,那么几个月的时间确实不足以完全填满三位数的范围。但是,如果我们考虑到有成千上万的同时报告来源,那么用几周甚至几天来填写整个三位数范围不仅是合理的,而且是可以预料的。至少希望如此。我们需要一些帮助来更加确定。
直觉助推火箭:模拟
【代码是可在 github 上获得。]
这个简单的模拟回答了这样一个问题:给定数量的报告源需要多长时间才能在其案例报告中完全“覆盖”1 到 1000 的范围。该模拟为每个时间步长的每个报告源生成随机数量的新事例(在 1 和 1000 之间),并一直进行下去,直到 1 和 1000 之间的所有整数都至少出现一个。如果我们假设每个报告源每天只报告一次,那么模拟中的每个时间步长相当于一天。
结果:
- 报告来源:对于每个时间步,“新案例”标题报告来源的数量(例如,一些当地报纸)。
- 模拟时间步长:从 1 到 1000 覆盖所有数字的平均时间步长数(每次运行 100 次试验)。
- 预期时间步长:从 1 到 1000 覆盖所有数字的预期时间步长数。
三位数理论的直觉在报告来源计数的低端是正确的。对于一个只有 10 个或更少来源的报告系统来说,根据病例报告填写所有数字(最多 1000 个)需要数年时间(假设每天都有报告)。当您考虑到仅在美国就有近两万个县,更不用说美国以外的许多城市和其他报告政府了,其中每个都可能报告自己的数字,实际的报告来源计数必须在此列表的高端或更高端,因此最近报告任何三位数病例的可能性相当高。
尽管像许多人一样,我怀疑大数可以解释这个谜,但我不知道越来越大的报告池会以多快的速度减少获得所有三位数(加上两位和一位数)值所需的时间。由于有超过一千个报告来源,要找到所有数字需要几天时间。
结果没有显示出来,但我们可以推断,在报告的数字中有很高的“冲突”率,因此不仅所有的数字都被覆盖,而且许多数字会被覆盖不止一次。搜索“341 个新案例”不仅会返回一个结果,而且可能会返回许多结果,进一步证明(如三位数理论家所声称的)结果的可能性。随着数千个报告源在几天内覆盖所有三位数,所有可能的数字很快就会有多个报告。
超级互联世界中的直觉
三位数的理论家不懒也不傻。他们只是相信他们对社会系统中概率的直觉,因为作为一个社会,我们还没有吸收和认可中等数量复杂系统的行为。就像通过传播天文学的非显而易见的课程来取代显而易见的扁平地球一样,传播关于社会系统分析和数据科学方法的知识可以为我们提供新的功能直觉。也许更重要的是,随着社会变革的加速,我们不仅迫切需要关于复杂社会系统的新事实,还需要更多人不断测试和重新设计他们对快速演变的社会世界的直觉的能力。否则,我们将面临新的社会分化:那些能够驾驭数据洪流和复杂性之谜的人,以及那些随波逐流的人。
美国总统大选不确定性的本质

詹妮弗·格里芬在 Unsplash 上的照片
我们生活中普遍存在的不确定性很少像现在这样明显。从全球范围内导致 100 多万人死亡的疫情,到乔治·弗洛伊德(George Floyd)被谋杀后爆发的大规模抗议活动,今年出乎我们的意料。随着美国大选的临近,许多人转向预测,例如由538和经济学家做出的预测,以量化不同情景发生的可能性。
大多数预测目前预测拜登获胜的概率为 90%左右。思考这个问题的一种方法是,想象从一顶帽子里抽出一个名字,帽子里有九张写着“拜登”的纸和一张写着“特朗普”的纸。虽然这是对许多人解读概率的方式的改进,但它并没有完全抓住我们在现实世界中面临的不确定性。
风险和不确定性
经济学家弗兰克·奈特(Frank Knight)在西班牙流感席卷全球之际写了一篇关于不确定性的文章,他提出了可计算风险和不确定性之间的区别。扔硬币是一个涉及风险的例子——掷骰子、旋转轮盘或者从帽子里抽出一个名字也是一样。它被认为是一种风险,因为潜在的过程不会改变,结果是明确规定的,并且在什么算作一次投掷中几乎没有模糊性。这使得通过多次投掷硬币或了解其物理特性来确定“正面”或“反面”的概率成为可能。

芝加哥大学摄影档案馆,AP f1–03513,芝加哥大学图书馆特别收藏研究中心。
大多数风险都有类似抛硬币的特征,但类似于《安娜·卡列尼娜》第一行的不幸家庭,不确定性有不同的味道。每当情况难以分类,机制没有被很好地理解,可能的结果没有定义,或者小的不准确导致大的错误时,它就会出现。不确定性使得我们很难知道为退休存多少钱,意味着你不应该依赖长期天气预报,这也是为什么我们不能预测像发现疫苗这样的科学发现。在每一种情况下,不确定性的特点是难以确定准确的概率——通常我们只能说“我们根本不知道”。
概率是你模型的一部分
在涉及不确定性的情况下,对于每种可能结果的相关概率,通常会有不同意见。这是 9 月初的情况,当时《经济学人》制作的预测预测特朗普有 15%的胜算,538%的预测是 29%。与此同时,投注者在博彩交易所暗示的概率几乎是一半一半。
如果你相信《经济学人》的模型,以这样的赔率在特朗普身上下注,就像接受一场赌博,你掷出一个骰子,只有当它显示“6”时才能赢得 1 美元,否则就会输掉 1 美元。这不会是一个有利可图的赌注。

根据538和经济学家制作的模型预测的拜登和川普获胜的几率,以及 Smarkets 博彩交易所的赌客暗示的概率(图片由作者提供)。
虽然预测市场存在问题,但这些差异表明,当一种情况以不确定性为特征时,分配给结果的概率是基于你对世界的理解。它们不能用扔硬币的方式来解释,因为就像启示录的传教士一样,你可以绝对肯定,也可以完全错误。
选举预测可能吗?
即将到来的美国大选的结果不应该被认为是一个可计算的风险,有多个方面的不确定性会影响预测的准确性。理解不确定性的本质可以帮助我们决定我们应该在多大程度上听取选举预测。
不完全信息:预测未来的唯一方法是基于你现在所拥有的信息;你的数据集中没有前所未有的事件并不排除它在未来的可能性(这种证据上的偶然性被哲学家称为归纳的问题,被计算机科学家称为没有免费的午餐定理)。
选举经常受到罕见事件的影响。2016 年大选的结果受到了联邦调查局局长詹姆斯·科米的影响,他宣布正在调查针对希拉里的案件中新发现的电子邮件;今年我们迎来了百年一遇的疫情。这些罕见事件的影响已经导致一些选举预测者为不太可能的结果分配额外的概率,但是这种方法仍然存在争议,并且人们普遍认为罕见事件本质上是无法以任何精度量化的。
独特事件:今年大选这么多事情感觉不一样。我们怎么可能对如此前所未有的事情做出预测呢?经济学人模型背后的统计学家 Andrew Gelman,通过列举自 1948 年以来每一次选举的特质方面来回答类似的问题。其中包括最近的选举,首次出现了非白人(2008 年)、摩门教(2012 年)和女性(2016 年)候选人。这次选举比以往更不寻常吗?格尔曼给出了唯一合理的答案:“我不知道”。
尽管之前发生了前所未有的事件,选举预测还是让做出了准确的预测,在这种程度上,他们使用了捕捉广泛信息的代理。候选人的属性影响着平均投票率,疫情的一些影响也反映在经济指数中。因此,重要的问题是:这次选举中的独特事件会影响这些代理人之间的关系和结果吗?这次选举的一些方面,如邮寄选票和试图质疑选举过程合法性的企图可能属于这一类,这增加了不确定性。
社会互动:不断增加的连通性让事情变得更加不确定。这在新冠肺炎病毒传播期间很明显,一个人感染几个人,每个人又感染几个人,很快事情就失去了控制。由于误差的影响会随着时间的推移而累积,因此病例数量中的微小测量误差可能会导致未来结果的巨大差异。类似地,使用社交媒体的互动使得预测选举结果变得更加困难。最初只有一小部分人相信的信息会迅速传播开来,尤其是当有像福克斯新闻频道广播这样的超级传播事件时。
虽然社会互动增加了不确定性,但政治极化减轻了它的影响,并使预测变得更容易——不管是好是坏。与戴口罩减少新冠肺炎病毒感染人数的不确定性类似,越来越严重的两极分化使得人们不太可能将自己的观点传递给别人(进而让那些人将自己的观点传递给更多的人)。两极分化创造了一个信息爆发不太可能发生的环境,类似于政治群体免疫。

改变世界:可计算风险(如抛硬币)的一个定义属性是,分配概率不会影响被测系统的行为。相反,对社会现象的预测经常会改变概率所描述的人们的行为。当对新冠肺炎感染人数的预测首次发布时,人们开始洗手,保持社交距离,并戴上口罩。就这些行为变化的发生程度而言,最终结果与最初预期的不同。
选举预测同样会影响他们试图预测的事物的行为。轮询信息不是女神雅典娜神奇地交给内特·西尔弗的;它是由其他有自己的欲望和信仰的人产生的。这些民意测验专家认识到,公布一项与公认的智慧(即值得尊敬的选举预测)截然不同的民意测验可能会损害他们的声誉。
民意测验专家通常会做出方法上的选择,让他们的结果更接近共识。选举预测利用民意测验来进行预测,因此,在一定程度上,民意测验受预测的影响,这就成了盲人摸象的情况。这被称为“羊群效应”,尽管有方法来识别偏离程度小于预期的投票,但不可能完全消除。
预测也能影响选民的行为。当新闻报道声称某个候选人是最受欢迎的候选人时,人们通常认为他们的投票不会影响结果。选举预测对投票率水平做出假设,如果足够多的人得出结论,他们的投票不会影响结果,那么总体而言,他们可能会影响结果。
时间:与天气预报越接近关注日期就越准确类似,随着选举日的临近,政治预测的不确定性也会降低。今天做出的预测和上个月做出的预测同样会受到从现在到选举期间发生的意外事件的影响。然而,除此之外,一个月前做出的预测还受到从上个月到现在发生的事件的影响。
离选举只有一周时间了,现在时间是有利于选举预测的主要因素之一。改变游戏规则的事件发生的概率每天都在减少。今年到目前为止,将近 7000 万人提前投票。对他们来说,选举日已经过去了。
对不确定性本质的更多理解改变了我们看待选举预测的方式。这次选举的一些方面,如邮寄选票的未知影响,使得预测更加困难;其他的,比如两极分化,让事情变得更容易。尽管如此,在涉及不确定性的情况下,假设特定的模型是正确的是不明智的。相反,我们应该制定计划,以适应我们对世界理解的不准确性。
FiveThirtyEight 的创始人内特·西尔弗(Nate Silver)对不确定性的影响做出了回应,他写道,他将“认为,特朗普获胜的可能性为 10%或 15%,实际上与 35%的可能性没有什么不同。“换句话说,如果你真的认为今年的选举结果对我们世界的未来很重要,并且你能够投票,那么即使预测显示你喜欢的候选人可能会获胜,你也应该投票。

结语:不确定性的 50 个词
在这本书的序言中,弗兰克·奈特对风险和不确定性进行了区分,他认为“这本书基本上没有什么新的东西。”不确定性是人类经验的核心,我们已经积累了大量的词汇来描述它:无知、模糊、歧义、定义不清的问题、模型不确定性、认知不确定性、小世界、邪恶的问题、神秘、黑天鹅、未知的未知、彻底的不确定、模糊、不确定、样本外、缺乏信息、非平稳性、非遍历性、非线性、混沌。
虽然不确定性的影响在即将到来的选举中尤为突出,但理解不确定性的本质对我们生活的许多方面都有影响。在人们使用数据的方式中,对概率的天真解释非常普遍。如果你发现自己在寻找小数第六位的答案,你应该记住你的置信区间是基于你的模型的;我们生活的世界从根本上不同于设计概率来描述的概率游戏。
根据这一区别,我们应该如何在一个充满不确定性的世界中行动?一方面,有时有可能认识到使预测特别困难的不确定性方面。你试图预测社会互动吗?你的预测有可能改变你正在研究的系统的行为吗?
另一方面,当我们考虑到金融危机和流行病时,不确定性可以长期伪装成风险。因此,不确定性给我们上的一课本质上是知识谦虚。挑战你最可靠的假设,考虑多种情况的影响,并在知道你可能是错的情况下找到弹性。
NBA 的 2023 MVP 是…
用递归线性回归预测 NBA 球员的职业生涯

作为一个体育迷,有一种无法满足的渴望让我们不停地对未来做出大胆的预测。大规模的工业兴起来挠这个痒,幻想体育和赌博立即浮现在脑海里。此外,当我们在游戏范围内没有可预测的东西时,我们的预测就会超出范围。在最近的超级碗比赛中,人们不仅可以在比赛的 MVP 上下注,还可以在小狗碗 MVP 上下注。很明显我们控制不住自己。说到预测,我和其他人没什么不同。
欢迎来到我的体育主题数据科学系列的第四部分。几周前,我发表了《T4:年龄的资产》,详细描述了为什么 NBA 总经理在 NBA 选秀中觊觎青少年。总的来说,球员通常在二十岁左右快速发展,这可以通过数据清楚地显示出来。
为了将球员发展的概念更进一步,并进入预测领域,我使用我在之前的分析中收集的数据建立了一个模型,用于预测未来 NBA 球员的统计数据。在本文中,我讨论了项目的总体概念、数据准备、模型设计和性能表征。在文章的最后,我会提出我对 NBA 2023 年 MVP 的预测。
复制这个项目所需的所有代码都可以在 Github 上找到。
项目概念
这个项目的一般概念是,一个球员过去的表现和年龄预示着他们未来的表现。除非受伤,球员的下个赛季通常会和他们最近的赛季相似。考虑到这一点,可以使用过去几个赛季的统计数据来预测未来的一个赛季。然后,输出预测可以用作预测未来 2 个季节的输入,然后可以用于预测未来 3 个季节,等等。
递归模型
我刚才描述的是一个循环模型。递归神经网络由于其学习复杂函数的能力,是目前最流行的递归模型。然而,通过将输出作为输入反馈到模型中,可以使任何类型的回归模型重复出现。这可以通过线性回归、随机森林回归或梯度增强回归等方法来实现。因为 NBA 职业生涯的轨迹相对简单,所以不太复杂的回归模型,例如线性回归,实际上产生了最好的结果。更复杂的模型,如递归神经网络倾向于过度拟合这个问题,这导致一些非常奇怪的预测时,预测多个季节的未来。

广义递归回归的表示。Pn+1 的预测是通过将最近的预测 Pn 与时间 Tn 相结合并馈入模型进行的。
非周期时间序列
关于预测 NBA 球员职业生涯,另一个需要注意的重要事情是,虽然这看起来像是一个典型的时间序列问题,但实际上不是。大多数时间序列都是周期性的,就像农业产出在多年内反复增减,有许多峰值和谷值。另一方面,一个 NBA 球员的职业生涯通常有一个增长期,然后是一个下降期;只有一个山峰,没有山谷。这不是一个周期性的过程。因此,旨在预测周期性数据的时间序列模型在这类问题上显然表现不佳。

周期性与非周期性时间序列的比较。
预测目标和特征选择
对于这个项目,我希望能够预测一个赛季球员所有的传统得分统计。这些预测目标还必须作为模型输入,以产生重复预测。最后,我决定预测以下 13 个特征:2 分命中率,2 分尝试,3 分命中率,3 分尝试,罚球命中率,罚球尝试,防守篮板,进攻篮板,助攻,抢断,盖帽,失误,个人犯规。
上面列出的非百分比特征,也就是计数统计,都被转换为每 36 分钟统计。这有助于平滑数据集,因为许多季节因受伤而缩短。为了将每 36 分钟统计数据的预测转换回总数,训练了一个单独的模型,根据球员过去的分钟数和预测的表现来预测分钟数。

选择作为模型输入/输出的特征之间的相关性。
数据准备
与大多数数据科学项目一样,优化预测性能在很大程度上取决于获取质量数据、数据清理和特征工程。以下详细介绍了所使用的大多数数据准备步骤。
数据采集
这个项目的数据是从运动参考 API 中收集的,这个 API 之前在这个链接的文章中讨论过。本文介绍了如何使用 API 来构建一个全面的 NBA 球员统计数据集。这是用作该项目的起点的同一数据集。该数据集包含过去 20 年中在 NBA 打球的每个球员每个赛季的各种传统和高级统计数据。

这个项目的数据是使用体育参考 API 获取的。
数据清理
在训练预测模型之前,需要执行许多数据清理步骤。最明显的是去除由非常小的几分钟样本量组成的季节。这些季节更有可能包含极端的统计异常值。总上场时间少于 400 分钟的赛季被删除。
另一个必要的清洁步骤是考虑低样品量拍摄的情况。例如,你知道伊内斯·坎特在 2013 赛季犹他爵士队的三分球命中率为 100%吗(1 投 1 中)。像这样的数据点,如果不加以考虑,会导致一些关于 3pt 投篮的相当荒谬的预测。在数据集中还有大约 700 个赛季,球员没有投出一个三分球,这些必须被分配一个有限的百分比。实施的解决方案是当样本量较低时,将拍摄百分比限制在某个范围内。
特征工程
第一个特征工程步骤是将上场时间转换成所有可能上场时间的比例。对于这一步,我们假设每场比赛的最大可能上场时间是 40 分钟。使用这种假设,上场时间的比例可以很容易地计算如下,(上场时间比例)=(上场时间)/((上场时间)* 40)。这有助于解释因受伤或停摆而缩短的赛季。
应用的第二个特征工程技巧是将 3 个百分点乘以 1.8。结合下述步骤,这有效地将 3 个百分点的模型输出限制在 55.5%,有助于防止模型过度预测 3 个百分点。
在应用上述特征工程步骤后,所有百分比特征、投篮命中率和上场时间比例都使用 logit 函数转换为对数赔率。实质上,这将任何后续线性回归转换为逻辑回归,并将要素的预测限制在范围(0,1)内。这个技巧在我之前的文章战胜困难中有更详细的描述。使用 sigmoid 函数可以很容易地将对数几率转换回百分比。

Logit 和 Sigmoid 函数
最后,引入了非线性特征年龄和年龄。这些特征允许递归线性回归模型学习关于年龄的高阶多项式函数,极大地提高了性能。
列车测试分离
训练和测试集是根据球员而不是单个赛季来划分的。这是为了评估模型根本没有训练过的球员的长期职业预测。
构建模型
简化测试
构建递归模型的第一步是测试预测单个特征的各种类型的回归。这是为了给出模型类型的一些指示,该模型类型将很好地用于构建完整的模型。对于这个简化的测试,scikit-learn 的 LinearRegression、RandomForestRegressor 和 GradientBoostedRegressor,以及 tensorflow 中创建的神经网络回归器,用于根据球员的年龄和有限的一组高度相关的过去特征来预测球员的两点尝试。简单的线性回归模型能够在该任务的测试集上获得最佳精度,预测每 36 分钟两次尝试,平均绝对误差为 1.2 次尝试。通过创建一些合成数据,该模型根据年龄对一名统计上平均水平的球员的两分尝试进行了调整。

可以看出,这个简单的线性模型预测了 25 岁之前每 36 分钟 2 次投篮尝试的增加,之后投篮尝试预计会减少。还要注意这条曲线的形状,它是通过包含基于年龄的非线性特征而成为可能的。
多型号集装箱
完整的循环模型本质上是许多回归的组合,每个回归适合预测 13 个特征中的一个。虽然可以单独创建这些模型中的每一个,但在实践中,这会导致极其混乱的代码。解决方案是定义一个 python 类作为各种模型的容器。这个类在实例化时适合每一个模型,并包含一个从所有 13 个模型一次生成预测的方法。结果是,代码简洁明了。应用该类还使得在使用线性回归的递归模型和使用随机森林回归或梯度增强回归的递归模型之间切换变得简单。

容纳用于预测 N+1 个输出的 N+1 个回归模型的多模型容器的图表。
模型评估
单一季节评估
评估模型性能的第一步是查看模型对未来一个季度性能的预测程度。因为平均绝对误差相对容易解释,所以选择平均绝对误差(MAE)作为评估标准。为了做到这一点,多模型容器实例中的每个单独的模型都被单独访问和评估。
虽然 MAE 很容易解释,但对于未缩放的数据,跨类别进行比较是相当困难的。很难说 1.2 次两分的平均出手次数比 1.2 次罚球的平均出手次数更好还是更差。一个简单的解决方法是将每个 MAE 除以其在数据集中的类别的标准偏差。这实质上是将 MAE 值转换成 Z 分数,这样就可以更容易地跨类别进行比较。对于使用线性回归对未来一个季节的预测,结果如下所示。这些结果对于随机森林回归因子和梯度增强回归因子来说稍差一些。

预测未来一个赛季表现的结果。
该表显示,尽管该模型能够在 3%的 MAE 范围内预测两个百分点,但 Z 分数表明该模型在预测这一类别时最困难。为了生成整体模型性能的单个度量,这些 Z 分数在所有类别中相加。这给出了训练集的总分 4.91 和测试集的总分 4.93 。这里值得注意的是,训练集和测试集之间的性能非常相似,这是一个很好的迹象,表明该模型没有过度适应训练集。
全面职业评估
预测未来一个赛季的表现是不错的,但建立一个循环模型的全部意义在于能够做出更长期的预测;对未来 3 年、5 年甚至 10 年性能的预测。为了评估长期预测的性能,递归模型以每个球员的新秀赛季为种子,并以递归方式用于预测该球员职业生涯的每个后续赛季。在训练集和测试集中,球员的平均职业生涯长度是 9.8 个赛季,所以平均来说,该模型用于预测未来的 8.8 个赛季。使用与单季预测相同的技术对结果进行了汇编,如下所示。

全面职业预测的结果。
在这种情况下,训练集的总 Z 分数为 6.84 ,测试集的总 Z 分数为 6.89 。尽管这些完整职业预测的表现明显更差,但考虑到任务难度的大幅增加,这实际上是一个非常好的结果。
预测退化
此外,确定模型的预测如何随时间退化也是令人感兴趣的。这是通过累计预测误差来实现的,而预测误差是基于一个球员的新秀赛季之后多长时间做出的。应用上述相同的技术来生成 MAEs,除以类别的标准偏差,并对每个类别的 Z 分数求和。结果如下所示。

预测误差由球员新秀赛季之外的预测赛季数汇总而成。
预测上场时间
有了预测投篮命中率和每 36 分钟统计数据的模型,是时候建立一个预测球员上场时间的模型了。这将允许上面讨论的预测被转换成每场比赛平均和赛季总数的预测。
预测上场时间的模型的开发方式与上面讨论的略有不同。该模型不是使用球员过去的表现来预测当前的上场时间,而是根据当前的表现来进行预测。换句话说,该模型是在当前分钟数由当前绩效决定的假设下设计的。同样清楚的是,之前的上场时间是当前上场时间的最佳预测值,因此该模型也被设计为使用这一特性。除了之前的上场时间,我们发现个人犯规对预测上场时间也有不成比例的巨大影响。各种类型的回归模型被用于预测上场时间,然而再次发现线性回归提供了最好的结果。

个人犯规对一般球员上场时间的影响。
分钟模型的表现,然后评估个人球员赛季。在这种情况下,模型被输入球员的实际表现,模型预测球员上场时间的比例。在这些情况下,训练集和测试集的 MAE 都是大约 8.5%,相当于每场比赛的 MAE 为 3 分 25 秒。
在此之后,分钟模型在球员的整个职业生涯中进行评估,评估方式与表现模型大致相同。这是通过输入球员在新秀赛季的实际表现,然后预测该球员在随后所有赛季的表现来实现的。然后将每个赛季的预测上场时间与实际上场时间进行比较。在这些情况下,训练集和测试集的 MAE 大约为 10.5%,相当于每场比赛的 MAE 为 4 分 25 秒。这个 MAE 被转换为测试集的 Z 分数 0.52 ,这表明该模型能够预测分钟以及其他类别。
2020 年以后的预测免责声明
在继续之前,有必要考虑一下这个模型的一些偏差。虽然上面讨论的评估为 2020 年以后的预测准确性确定了一个合理的基线,但也应该考虑到 NBA 在团队战略、规则和裁判方面不断发展。今天 NBA 比赛的方式和 20 年前不一样了。例如,今天许多球队采用的防守方案在 2000 年是非法的,直到 2001 年规则的改变取消了对区域防守的限制。这里的要点是,这个模型已经在 NBA 篮球最近时代的球员的职业生涯中进行了训练和评估。未来的时代可能会有很大的不同,并导致今天的长期预测比目前的评估更糟糕。
把所有的放在一起
有了这个快速的免责声明,让我们找点乐子,对未来做一些大胆的预测。训练集和测试集被合并,并且模型适合合并的数据集。然后以 2020 赛季为种子,将球员表现投射到未来。事不宜迟,你的 2023 NBA 统计领袖是:
每场比赛的点数
- 卢卡·东契奇:33.2 岁
- 特蕾·杨:31.2 岁
- 扬尼斯·阿德托昆博:29.9
场均篮板
- 扬尼斯·阿德托昆博:13.7
- 安德烈·德拉蒙德:12.7
- 哈桑·怀特塞德:11.9
场均助攻数
- 特蕾·杨:8.8
- 卢卡·东契奇:8.7
- Ja Morant: 7.8
2023 年最有价值球员奖将授予…
在每场比赛 38.2 分钟内,每场比赛平均 33.2 分,8.8 个篮板和 8.7 次助攻,以及高效的 49/41/83 投篮命中率之后,你的 2023 年 NBA MVP 是卢卡·东契奇!
网飞数据科学家访谈
网飞数据科学面试问题

图片来自 Netflix.com
网飞是一家总部位于加利福尼亚州洛斯加托斯的流媒体公司,作为最大的被科技颠覆的内容媒体公司,它已经渗透到了文化中。网飞成立于 1997 年,最初是一家 DVD 租赁服务公司,后来扩展到流媒体业务。现在网飞在全球拥有超过 1 . 5 亿付费用户,其中包括 6000 万美国用户。超过 1000 种设备支持流媒体,每月观看约 30 亿小时,每天收集超过 1000 亿次事件的数据。
数据科学是网飞的基因,网飞利用数据科学改善用户体验的方方面面。多年来,网飞一直在利用数据科学作为其内容推荐引擎,来决定制作哪些电影和电视节目,并改善用户体验。
网飞的数据科学职位
网飞数据科学家的角色在很大程度上取决于团队。然而,网飞的一般数据科学家角色跨越了商业分析、统计建模、机器学习和深度学习实施。网飞是一家大型公司,拥有 30 多个不同团队的数据科学家,包括个性化和算法团队、营销分析团队以及产品研究和工具团队,他们的技能范围从基本分析到重型机器学习算法。
所需技能
网飞只雇佣至少有五年相关经验的合格数据科学家。他们的要求非常具体,招聘人员也热衷于为每个工作岗位专门招聘人才。拥有团队中特定角色的特定行业经验会有所帮助。
其他相关资格包括:
- 统计学、计量经济学、计算机科学、物理学或相关定量领域的高级学位(硕士或博士)。
- 5 年以上的相关经验,拥有利用海量数据推动产品创新的良好记录。
- 具有分布式分析处理技术(Spark、SQL、Pig、Presto 或 Hive)的经验,以及在 Python、R、Java 或 Scala 方面的强大编程技能。
- 具有构建真实世界机器学习模型的经验,并具有显著的影响。
- 在 A/B 测试、分析观察数据和建模中使用的深度统计技能。
- 在 Tableau、R Shiny 或 D3 中创建数据产品和仪表板的经验。
网飞有哪些数据科学团队?
在网飞,术语数据科学涵盖了与数据科学相关的广泛领域和名称。头衔数据科学家由角色和职能组成,从专注于产品分析的数据科学家到数据工程和机器学习职能。
- 个性化算法:与产品和工程团队合作,评估性能并优化用于向网飞会员推荐电影、电视节目、艺术品和预告片的个性化算法。
- 会员 UI 数据科学与工程:利用定制的机器学习模型,为所有用户优化产品的用户体验。
- 产品研究和工具:开发和实施方法以推进网飞的大规模实验。这包括开发数据可视化框架、工具和分析应用程序,为其他团队提供对成员行为和产品性能的洞察。
- 增长数据科学与工程:通过围绕关键业务指标构建和设计高度可扩展的数据管道和干净的数据集,专注于扩大用户群。
- 营销数据科学工程:创建可靠的分布式数据管道,构建直观的数据产品,为所有非技术团队提供以自助方式跨领域利用数据的方法。
面试流程

图来自网飞数据科学博客
网飞大学的数据科学面试流程与其他大型科技公司类似。面试过程首先是招聘人员的电话面试,然后是简短的招聘经理面试,然后是技术面试。通过技术筛选后,将安排现场面试。这次面试由两部分组成,6 到 7 个人参加。
初始屏幕
在网飞,最初的筛选是与招聘人员进行 30 分钟的电话交谈。网飞的招聘人员高度专业化,技术性很强。他们的工作是了解你的简历,看看你过去的经历、项目和技能是否符合这个职位。这部分面试的第二点是测试你的一般沟通能力,向你解释这个角色及其背景。
接下来是招聘经理面试。这一次将更多地关注过去的经验,并深入到您在数据科学和机器学习中所做的的更多技术部分。虽然招聘人员在高层次上了解你的项目,以适应团队,但招聘经理会问你更深入的问题,如为什么你在一个项目中使用某些算法或你如何建立不同的机器学习或分析系统。
招聘经理也会告诉你更多关于团队的角色和职责。请注意,网飞在文化和价值观上很重要,你可能会被要求选择一个价值观,并解释它如何最适合你。
技术屏幕
通过初筛后,面试的下一步就是技术筛选。这种面试通常为 45 分钟,涉及跨 SQL、实验和 ab 测试的技术问题,以及机器学习技术问题。
例题:
- 你对流环境下的 A/B 测试了解多少?
- L1 正则化和 L2 正则化有什么区别,比如为什么人们不用 L0.5 正则化?
- 在线和批量梯度下降有什么区别?
- 向利益相关者传达 ML 结果的最佳方式是什么?
如果你对更多来自网飞的面试问题感兴趣,请查看 上的问题面试查询**和一个视频 一个网飞机器学习的模拟面试问题 !**
现场面试
现场面试是面试流程的最后一个阶段,由两部分组成,中间有午餐休息时间。如果你来自其他州,网飞会让你飞到洛杉矶参加现场面试,你会先和招聘人员见面,回顾一下面试。
它涉及对 6 或 7 个人的一对一采访,包括数据科学家团队成员、团队经理和产品经理。网飞现场面试结合了产品、机器学习和各种分析概念。该访谈将包括围绕产品感觉、统计数据(包括 A/B 测试(假设测试)、SQL 和 Python 编码、实验和度量设计以及文化契合度的问题。如果该角色更专注于工程,请期待更多的机器学习和可能的深度学习面试问题。
注意事项和提示
- 请记住,面试的目标是评估你如何应用分析概念和机器学习算法和模型来预测用户和内容的价值。温习统计和概率、A/B 测试和实验设计以及回归和分类建模概念的知识。
- 请,请,请记得阅读网飞文化甲板。在网飞,文化就是一切,他们创造了独特而著名的工作文化,并在网上转录成 100 多页的幻灯片。
- 网飞文化的核心是建立一支高绩效团队,并让他们在一个能让他们超越自我的环境中成长。这表现为相当大的自由和责任,由自上而下控制有限的经理提供的强大环境,以及奖励优秀员工的薪酬和晋升体系。
- 在工作谈判中,要注意网飞的薪酬待遇非常高。他们雇佣的技术人员的平均工资超过 30 万美元,很多时候几乎都是现金,并有将一部分转换成 rsu 的选择权。这就是为什么他们的面试很难,而且招聘的底线非常高。
- 围绕网飞产品练习案例研究问题。查看如何赢得数据科学案例研究面试。
网飞数据科学面试试题
- 写出使用逻辑回归构建分类器的等式。
- 给定来自网飞的一个月的登录数据,如 account_id、device_id 和关于支付的元数据,您将如何检测支付欺诈?
- 你会如何为我们正在考虑推出的新内容推荐模型设计一个实验?什么样的指标是重要的?
- 编写 SQL 查询来查找两个事件之间的时间差。
- 你如何建立和测试一个指标来比较两个用户的电影/电视节目偏好列表?
- 你如何从五百万个搜索查询中选择一个有代表性的样本?
- 为什么整流线性单位是一个很好的激活函数?
- 如果网飞正在寻求扩大其在亚洲的业务,你可以用哪些因素来评估亚洲市场的规模,网飞可以做些什么来占领这个市场?
- 我们如何用归因模型来衡量营销效果?
- 您如何确定网飞订阅的价格是否真的是消费者的决定因素?
感谢阅读!
如果你喜欢这篇文章,并想了解更多关于网飞的数据科学采访…
- 注册 面试查询 ,每周在你的收件箱里获得几个数据科学面试问题。
- 查看更多公司面试指南,如 Lyft 数据科学家面试 和 Python 数据科学面试问题 。
- 订阅我的 Youtube 频道 了解更多数据科学访谈。
Netflix 奖——即使是人工智能的领导者也可能犯错
现实世界中的人工智能
网飞不经意的高调人工智能乌龙球的故事——一家成熟人工智能公司历史上的一个小插曲
网飞对人工智能技术最著名的应用是推荐下一步该看什么。但这只是它如何使用人工智能的一小部分。像其他一样,它在整个组织中使用人工智能&复杂的分析。
多年来一直处于 AI 前沿。但在 2009 年,它无意中取得了一个引人注目的人工智能乌龙球。这是网飞竞赛,他们从 2006 年开始举办。
这一事件已经成为艾民间传说的一部分,但今天的教训仍然相关。如果你是人工智能的新手,或者对人工智能在商业中的风险和陷阱沾沾自喜,它们尤其相关。

什么是网飞竞赛?
2006 年,网飞仍然提供 DVD 和在线电影。它的成功部分来自于它复杂的推荐系统,Cinematch。根据观众的选择和评分,这向顾客建议他们下一步可能想要点什么。
在最初 6 年的使用中,Cinematch 的精确度有所提高。但已经到了不再有实质性好转的地步。
为了进一步发展业务,网飞认为需要进一步改进建议。它用一个特定的指标来定义商业成功:观众推荐的准确性。
为了改进这一指标,它做了三件事:
- 根据研究,它宣布改变寻求观众反馈的方式。它将五星评级改为了竖起大拇指/竖起大拇指的系统;
- 它宣布了一个公开竞赛,Netflix 奖。我们的目标是创建一个比 Cinematch 至少好 10%的推荐系统。它为获胜者提供了 100 万美元的奖金;和
- 它让参赛者可以访问超过 1 亿条用户推荐的匿名训练数据集。
比赛有各种各样的条件和细节。但这是他们提高推荐准确度计划的精髓。因此,十多年前,人工智能被高调用于解决一个对业务增长至关重要的问题。
发生了什么事?
来自世界各地的研究人员、学者和科学家团队参加了 Netflix 奖竞赛。但很少有人在反对网飞自己的高效推荐系统方面取得重大进展。2007 年大约有 20,000 支队伍参赛,2008 年这个数字翻了一番。
其中,每年只有 3 个团队的成绩超过 Cinematch。但是没有一个足以触发最高奖项。然而,进步也有较小的奖励。如果你对数学和数据科学感兴趣,看看西蒙·芬克的词条。
最后,在 2009 年,两个团队不仅击败了 Cinematch,还以 10%的优势击败了它。他们还满足了 Netflix 的所有其他获奖条件。那年 9 月,两队在人工智能点球大战中狭路相逢。
本着点球决胜的精神,比分非常接近。亚军“合奏”,实际上与冠军的结果相吻合。但是“bell kor 的实用主义混乱”拿走了 Netflix 奖,因为他们提前 20 分钟提交了他们的结果!
接下来发生了什么?
作为电影业的一部分,网飞在取得成功后又宣布了续集。当然,他们把它做得更大更好。引用他们的声明,他们将提供一个新的、更复杂的数据集:
“新的数据集。。。除其他信息外,还包括租房者的年龄、性别、邮政编码、类型分级和之前选择的电影等信息。"
和以前一样,网飞将采取严格措施保护客户数据
“与第一届 Netflix 奖一样,所有提供的数据都是匿名的,不会与特定的网飞成员相关联。”
不幸的是,两名美国研究人员那时已经破坏了续集。他们已经能够在第一届 Netflix 奖使用的匿名测试数据中识别出网飞用户。他们通过将它与其他公开可用的电影评论数据相关联来做到这一点。在这种情况下,数据来自 IMDb 电影数据库。
到 2009 年底,四名网飞用户对网飞提起了集体诉讼。第二年,来自联邦贸易委员会的监管压力出现了。
该诉讼最终和解并被驳回。但伤害已经造成,第二届 Netflix 奖竞赛再也没有举行。
Netflix 奖后来怎么样了?
几年后,该公司宣布了竞争的结束。它已经决定不实施获胜算法,也没有这样做的计划。
从外部来看,这起诉讼可能是决定的一个因素。然而,网飞给出了另外两个原因,这两个原因都很有启发性:
- 要将获胜的解决方案扩展到生产应用,仍有大量工作要做。还有与之相关的运营成本。网飞解释说,精确度提高带来的商业利益“似乎与所需的工程努力不相称”;
- 或许更重要的是,自 2006 年以来,网飞的商业模式发生了显著变化。大多数顾客观看的是流媒体电影,而不是 DVD。因此,该公司现在有了更多的数据,其中许多数据更加精确。向流媒体的转变也改变了观看习惯,尤其是选择接下来要看什么的动力。预测推荐的商业逻辑和数据科学现在与赢得 Netflix 奖的条件非常不同。
今天的总结和课程
一些人认为这是一个生活如何不公平的案例研究。从很多方面来看,网飞在使用和保护客户数据方面都尽职尽责。它也对人工智能社区做出了许多直接和间接的贡献。然而,它最终被指控非法泄露客户数据,并可能违反公平贸易法。
数据隐私倡导者当然不同意。在他们看来,正确的结果占了上风。
两种观点都有强有力的论据支持。
但是,今天商业的关键教训并不在于谁对谁错。相反,有三个更明确的要点需要考虑:
- 即使采取了合理的预防措施,匿名数据集也不一定像人们想象的那样匿名。当然,尽可能确保数据的安全性和匿名性也很重要。但同样重要的是,考虑如果结果不是这样,你会怎么做;
- 为生产扩展解决方案的成本和复杂性可能非常高。因此,你为人工智能设定的商业利益需要足以吸收这些利益。这超出了构建和实现人工智能解决方案的成本。
- 随着业务环境的变化,支撑人工智能解决方案的业务逻辑可能会发生变化。它甚至可能变得无效,尤其是在不断发展和年轻的行业。在经营企业时,很容易忘记这些变化及其人工智能含义。因此,构建人工智能解决方案的一部分应该包括决定如何定期验证它仍然在做预期和需要的事情。
【www.aiprescience.com】本文基于一篇首次发表于 的文章
荷兰人工智能战略行动计划——简要概述
你需要知道的荷兰人工智能国家计划。
2019 年 10 月,在阿姆斯特丹举行的世界人工智能峰会大会上,我坐在观众中间,兴奋地看着国务秘书(经济事务部)Mona Keijzer 女士走上舞台,宣布荷兰人工智能联盟最近启动,以及由此产生的 65 个政党的战略性人工智能行动计划。
该联盟承诺在未来七年内投资20 亿欧元,以加速荷兰在该领域的潜力并提升其国际形象。

图片来源:Strategisch acti plan voor artifici le intelligent ie(2019 年 10 月,挪威经济部)
凯泽女士似乎对他们在全球范围内竞争的能力相当乐观。这种乐观情绪确实是有道理的,因为一些关键因素让中国准备迎接这样一次飞跃。例如,根据 DHL research 的数据,荷兰是世界上数据连接最紧密的国家之一,除了在高质量研究方面处于欧洲领先地位之外,该国还建立了强大的公私合作伙伴关系(PPP)生态系统。
麦肯锡的一份关于欧洲人工智能的报告在人工智能准备程度方面将荷兰排在平均水平之上,自动化、数字化准备程度和创新得分最高,为 25%。

图表 20 快照—麦肯锡报告:解决欧洲在数字和人工智能方面的差距
一个全面而雄心勃勃的计划:三大轨道
人工智能联盟制定了一个每年都要调整的议程。三个轨道是报告的主要重点,有具体的行动要点来指导和支持其执行,并着重强调有关各方必须承担责任并相互合作以实现预期目标。
****途径 1——通过以下方式利用社会&经济机会:
- 通过公私合作克服社会挑战;
行动包括在医疗保健、国防、农业、食品、能源转型和可持续发展领域以知识和创新合同形式做出的多年期财务承诺。 - 在履行政府任务和职责中使用人工智能;
行动包括启动面向公务员的数字化课程,以掌握政府数字化和计算机化的技能。 - 通过有利的商业环境刺激人工智能创业,从大公司到初创企业。
行动包括通过区域发展机构增加创新资金和促进国际转移学习(如旧金山/洛杉矶、波士顿/纽约等地的联络官)。)
****途径 2——通过以下方式创造合适的环境:
- 刺激人工智能研究&NL 的创新;
行动包括创建人工智能实验室和研究中心,并为此寻求与其他欧盟国家的积极合作。 - 提供良好的培训机会;
行动包括通过税收优惠鼓励雇主提供培训机会,以及设立基金促进中小企业的学习文化等。此外,政府将审查学校课程,以实施数字扫盲。 - 为人工智能创新的发展提供可用数据;
行动涉及促进公共部门信息的可再利用性,例如通过 data.overheid.nl,同时牢记数据共享隐私政策。 - 支持高质量的数字连接和基础设施,以实现最佳功能。
行动包括继续提供,并改善基础设施的状态,即有效的 AI 应用的反应速度(延迟)、数据速度和可靠性。
****途径 3——通过以下方式加强道德&合法权利的基础:
- 保护公共价值和人权;
行动包括采取监管措施保护用户数据和提高算法决策的准确性。 - 构建可信、可靠的人工智能;这些行动包括让尽可能多的荷兰公司参与人工智能道德准则的试点阶段,以及与欧洲委员会一起撰写一份关于人工智能性别的意见的未来报告。
- 维护开放、竞争的市场,保护消费者权益;
行动包括更好地执行和更新欧盟的消费者保护规则。例如,在此基础上,需要告知消费者个性化价格/价格歧视何时生效。
你可以在这里找到报告的完整版本。不幸的是,到目前为止,还没有可用的英文版本,但也正是因为这个原因,这篇文章才可用。
如果你觉得这篇文章有用,请不要犹豫,关注 我的媒体频道 来了解最新的文章。
人工智能驱动的网络数据收集解决方案的新开端
您是否在以传统方式进行大规模数据收集?如果是这样的话,就要在代理基础设施维护上投入大量的时间和精力。
数据收集包含许多耗时且复杂的活动。这些包括代理管理、数据解析、基础设施管理、克服指纹识别反措施、大规模渲染大量使用 JavaScript 的网站等等。有没有办法自动化这些过程?绝对的。
为大规模数据收集寻找一个更易于管理的解决方案一直是 web 抓取社区中许多人的想法。专家们看到了将 AI(人工智能)和 ML(机器学习)应用于网络抓取的巨大潜力。然而,直到最近,使用人工智能应用程序实现数据收集自动化的行动才开始实施。这并不奇怪,因为随着计算解决方案的进步,人工智能和 ML 算法在大规模应用中变得更加鲁棒。
通过在数据收集中应用人工智能解决方案,我们可以帮助自动化繁琐的手动工作,并确保收集的数据质量更好。为了更好地理解 web 抓取的困难,让我们来看看数据收集的过程,它最大的挑战,以及未来可能缓解和解决上述挑战的解决方案。
数据收集:循序渐进
为了更好地理解 web 抓取过程,最好将其可视化为一个价值链:

来源:Oxylabs 的设计团队
正如你所看到的,网页抓取需要四个不同的动作:
- 爬行路径构建和 URL 收集。
- 铲运机的发展及其支持。
- 代理获取和管理。
- 数据获取和解析。
任何超出这些术语的东西都被认为是数据工程或数据分析的一部分。
通过确定哪些操作属于 web 抓取类别,可以更容易地找到最常见的数据收集挑战。它还让我们看到哪些部分可以在人工智能和 ML 解决方案的帮助下实现自动化和改进。
大规模刮削挑战
传统的从网络上收集数据需要大量的治理和质量保证。当然,数据收集带来的困难随着搜集项目的规模而增加。让我们通过查看价值链的活动和分析潜在的问题来更深入地了解一下上述挑战。
构建爬行路径并收集 URL
构建爬行路径是数据收集的第一步,也是最重要的一步。简单地说,爬行路径是一个 URL 库,从中提取数据。这里最大的挑战不是你要抓取的网站 URL 的集合,而是获取所有初始目标的必要 URL。这可能意味着如果没有数百个 URL,也有几十个 URL 需要被抓取、解析并识别为对您的案例重要的 URL。
铲运机的发展及其维护
制造铲运机会带来一系列全新的问题。这样做时,有许多因素需要注意:
- 选择语言、API、框架等。
- 测试您构建的内容。
- 基础设施管理和维护。
- 克服指纹反措施。
- 大规模渲染大量使用 JavaScript 的网站。
这些只是冰山一角,你会遇到建设一个网页刮刀。还有很多更小更耗时的事情会累积成更大的问题。
代理获取和管理
代理管理将是一个挑战,尤其是对那些新的刮擦。在成功抓取一个站点之前,有太多的小错误可以阻止一批代理。代理轮换是一个很好的实践,但是它不能说明所有的问题,并且需要不断地管理和维护基础设施。因此,如果你依赖代理供应商,良好和频繁的沟通将是必要的。
数据获取和解析
数据解析是使获取的数据可理解和可用的过程。虽然创建一个解析器听起来很容易,但是它的进一步维护将会带来很大的问题。适应不同的页面格式和网站变化将是一场持续的斗争,需要你的开发团队比你想象的更多的关注。
正如你所看到的,传统的网络抓取带来了许多挑战,需要大量的人力、时间和资源。然而,计算的好的一面是几乎所有的事情都可以自动化。随着人工智能和 ML 驱动的网络抓取的发展,创建面向未来的大规模数据收集成为更现实的解决方案。
让网络刮擦面向未来
AI 和 ML 能在哪些方面创新和提高网页抓取?根据 Oxylabs 下一代住宅代理 AI & ML 顾问委员会成员 Jonas Kubilius 的说法,Jonas kubi lius 是 AI 研究员,Marie Sklodowska-Curie 校友,也是 Three Three 的联合创始人:
“网页内容中有一些重复出现的模式,比如价格是如何编码和显示的,所以原则上,ML 应该能够学会发现这些模式,并提取相关信息。这里的研究挑战是学习在各种网站上通用的模型,或者可以从一些人类提供的例子中学习的模型。工程挑战是将这些解决方案扩展到现实的网络抓取负载和管道。
与为每个新网站和 URL 手动开发和管理抓取器代码不同,创建一个人工智能和 ML 驱动的解决方案将简化数据收集管道。这将负责代理池管理、数据解析维护和其他繁琐的工作。
AI 和 ML 驱动的解决方案不仅使开发人员能够构建高度可扩展的数据提取工具,还使数据科学团队能够快速原型化。如果您现有的定制代码出现问题,它也是您现有代码的备份。
网络抓取的未来是什么样的
正如我们已经建立的那样,创建快速数据处理管道以及尖端的 ML 技术可以在 web 抓取社区中提供无与伦比的竞争优势。而纵观当今市场,AI 和 ML 在数据采集方面的实施早已开始。
出于这个原因,Oxylabs 正在推出由最新人工智能应用程序驱动的下一代住宅代理。
下一代住宅代理的构建考虑了重型数据检索操作。它们使 web 数据提取没有延迟或错误。该产品与常规代理一样可定制,但同时,它保证了更高的成功率,并且需要更少的维护。除了可重用的 cookies 和 POST 请求之外,还支持自定义头和 IP 粘性。它的主要优点是:
- 100%成功率
- 人工智能支持的动态指纹识别(验证码、阻止和网站变更处理)
- 基于机器学习的 HTML 解析
- 易于集成(像任何其他代理一样)
- 自动重试系统
- JavaScript 渲染
- 专利代理旋转系统
回到我们之前的网络抓取价值链,你可以看到网络抓取的哪些部分可以通过人工智能和 ML 驱动的下一代住宅代理实现自动化和改进。

来源:Oxylabs 的设计团队
下一代住宅代理解决方案几乎自动化了整个抓取过程,使其成为面向未来的网络抓取的真正有力的竞争对手。
该项目将由 Oxylabs 内部的 ML 工程团队和顾问委员会持续开发和改进, Jonas Kubilius 、 Adi Andrei 、 Pujaa Rajan 和 Ali Chaudhry ,专门研究人工智能和 ML 工程领域。
包扎
随着 web 抓取项目规模的增加,自动化数据收集成为希望在竞争中保持领先的企业的当务之急。随着近年来人工智能算法的改进,随着计算能力的提高和人才储备的增长,人工智能在许多行业中的实施已经成为可能,包括网络抓取。
建立人工智能和人工智能驱动的数据收集技术在行业中提供了巨大的竞争优势,并节省了大量的时间和资源。这是大规模 web 抓取的新未来,也是面向未来的解决方案开发的良好开端。
车内体验的新时代及其对媒体和娱乐的影响

作者图片
“信息娱乐系统的目标是告诉你在一辆车里你能得到的最大乐趣是什么。我觉得其他车企真的不会这么想。它不仅仅是某种没有灵魂、没有个性的交通工具。”—特斯拉首席执行官埃隆·马斯克
由特斯拉及其直言不讳的首席执行官埃隆·马斯克(Elon Musk)领导的智能电动汽车的崛起,给消费者对个人交通的看法带来了许多变化,标志着车内体验的新时代。
随着自动驾驶汽车越来越接近在我们的道路上成为现实,媒体和娱乐在汽车中占据中心位置的机会呈指数级增长。许多全新的无人驾驶汽车概念已经展示出来,其中一些包括更像客厅而不是过去车辆的内部装饰,有电视、游戏机等等。
语音指挥技术
消费者在车辆中使用人工智能(AI)驱动的语音助手变得越来越普遍,语音命令技术被证明是大多数新的车内体验背后的主要驱动力。这项技术使驾驶时使用应用程序变得更加简单和安全,使人们能够在不将手离开方向盘或眼睛离开道路的情况下访问各种服务。
我们中的许多人都希望一整天都保持联系,无论我们是坐在办公桌前,走在街上,还是下班开车回家。借助语音命令技术,司机可以接听电话、发送短信、获取方向、播放音乐等,而不会危及我们的道路安全。由于易用性和减少危险的结合,在汽车中使用语音助手的普及程度正在急剧上升。根据 Voicebot 最近的一份报告,大约 50%的消费者目前在他们的汽车中使用语音助手。预计到 2022 年,这一数字将飙升至 73%,从而说明汽车中语音助手采用的快速上升趋势。
根据 Voicebot 的报告,在车载语音助手的许多用途中,控制音乐和导航是目前最受欢迎的。对于媒体和娱乐公司来说,这是一个令人兴奋的消息,该行业非常适合大幅扩大其在汽车领域的业务。
音频
驾驶和听音乐之间的紧密联系可以追溯到 20 世纪 50 年代,当时调频收音机首次安装在汽车上,成为音乐产业的主要收入来源。但是这些年来,人们听音乐的方式发生了很大的变化。根据爱迪生研究公司的 Infinite Dial 2019 研究,虽然 AM/FM 收音机仍然占据汽车音频消费的首位,但汽车中其他音频格式的使用正稳步上升。
Infinite Dial 2019 调查发现,81%的受访者在车辆中使用过 AM/FM 收音机,45%的人使用过数字音乐。28%的消费者在车内收听在线广播,26%的消费者表示他们曾在车内收听播客,很明显,传统广播的音频替代品已经在驾驶员的收听选择中占据了重要地位。
音乐流媒体的快速增长极大地影响了车载娱乐系统。例如,如此大量的特斯拉车主表示他们对流媒体音乐感兴趣,以至于该公司在最近的汽车软件更新中添加了 Spotify。当谈到调频广播脱口秀节目时,它们正在慢慢被播客取代,播客已经从车内最常用的音频源的 3%增长到 4%。
视频
随着特斯拉再次占据领先地位,视频流媒体已经成为一些消费者车内媒体体验的一部分,此前这家创新公司在去年的软件更新中添加了网飞。虽然这对媒体和娱乐行业来说是令人兴奋的消息,但汽车视频消费增长的最大飞跃还在后头。
虽然准确的时间框架因你问的人而异,但事实是自动驾驶汽车正在成为主流。一旦自动驾驶汽车在我们的道路上司空见惯,司机和乘客将更有可能在他们的汽车自动驾驶到目的地时寻找视频流来提供娱乐。
商用自动驾驶汽车的即将到来带来了汽车内沉浸式媒体和娱乐体验的美好潜力,导致了媒体和汽车行业领导者之间广泛的创新发展和合作伙伴关系。当奥迪透露与华特·迪士尼公司合作开发新媒体类型以纳入其未来车辆时,这家汽车制造商巧妙地将自动驾驶汽车中的人们可以获得的新发现的自由时间称为“第 25 小时”。
优步和 Lyft 等汽车共享服务也在稳步进入车载视频消费市场。虽然汽车共享在北美或欧洲并不新鲜,但这些服务正在迅速蔓延到世界各地,最近在中国、印度、尼日利亚和印度尼西亚等国家也可以使用。在美国,汽车共享服务最常用于城市中的短途旅行。但在印度和中国等市场,越来越多的人在日常工作中使用这些服务,这往往是一次更长的旅程。例如,从家到工作单位的平均通勤时间在孟买是 67 分钟,在上海是 51 分钟,所以越来越多的人在交通拥挤的长途通勤中使用汽车共享服务就不足为奇了。有人开车的时候,看视频成了旅途中一种非常诱人的娱乐方式。
游戏
越来越多的汽车制造商正在扩展他们的车载游戏系统。继特斯拉最初的游戏产品(包括导弹司令部、小行星和蜈蚣)之后,该公司去年将 2048 和雅达利的超级突破加入了其仪表板显示游戏库。梅赛德斯-奔驰是另一个宣布计划扩展其车载游戏系统的汽车领导者,而整个行业都在猜测在不久的将来可能会出现的情况。
凭借其闪电般的连接速度承诺,5G 即将在美国上市,这将使汽车制造商将车载游戏提升到一个新的水平,为车对车游戏在司机中获得流行开辟了潜力。随着自动驾驶汽车很快进入我们的道路,玩游戏很可能成为通勤者选择在日常通勤中度过“第 25 小时”的重要部分。
从音乐和视频流到听播客和玩沉浸式游戏,媒体和娱乐产品将引领车内体验的新时代。随着自动驾驶汽车和 5G 连接速度即将到来,我们正处于车内体验革命的风口浪尖,在旅途中享受创新和迷人娱乐的可能性几乎是无限的。
你对车内体验的新时代及其对媒体和娱乐的影响有什么看法?请在下面的评论中分享你的观点。
获得数据科学工作的新毕业生指南
以及我如何闯入数据科学的故事

通过 Unsplash
我作为一名应届毕业生寻找数据科学家职位的经历非常糟糕。我是一名大学四年级学生,毕业时获得了电子工程学位。我最不想做的事情就是每天八小时摸着示波器或看着印刷电路板。数据科学是最热门的新趋势,为了进入数据科学家的大门,我愿意做任何事情。然而,我的问题和其他毕业生一样:我毫无经验。
一年后,我发现自己成为了一个十人创业公司的第一位数据科学家,团队中只有另外三名工程师。我被正式聘为数据科学家,但从第一天开始,我的角色就出人意料地更倾向于软件工程。几个月前,他们雇佣了另一名数据科学家,但不得不在第一天解雇了他,因为他不想部署自己的模型。当我们只有包括首席技术官在内的四名工程师时,这一流程就行不通了。
作为一名数据科学家,我已经毕业五年了,但为了从事数据科学工作,我还没有获得博士或硕士学位。我想分享一份完整的指南,告诉你如何成为一名刚毕业的数据科学家,以及如何成为一名数据科学家,尤其是在这个由新冠肺炎引发经济衰退的时代。对于一个刚从大学毕业、没有博士或硕士学位的数据科学家来说,这似乎很难,但这仍然是可行的!
via GIPHY
毕竟,你所需要做的就是找到你的第一份数据科学工作。
热情和激情战胜了经验
(但主要是因为你没有)
让我讲一个小故事。
大四的时候,我参加了一个 STEM 招聘会,想找工作。我无意中发现一家公司的展台上有广告,说他们正在招聘各种软件职位和一些数据科学家的职位。姑且称之为 hotStartupB2b 吧。
我最后和一个工程师聊了聊。他拿着我的简历,看着看着慢慢开始摇头。
“如果你是大学生,你可能没有足够的经验担任数据科学家的角色”,他说。
“是的,我正试图获得更多的数据科学经验,”我紧张地回答。
“抱歉,但通常我们所有的数据科学家都有博士学位,”他说道。
“好吧,但你会认为有这么高的要求,这个角色现在会平衡疯狂的要求,”我争辩道。“我的意思是,数据科学家的职位空缺数量远远超过拥有博士学位的人数。”
“我不同意。这就像任何其他需要训练和技能的职业一样。想想一个飞行员。要成为一名飞行员,你还需要经过训练。你不能在没有资格的情况下驾驶飞机,因为会有实际的后果。成为数据科学家也是一样。”
然后他拿走了我的简历,盯着我,把它扔进了垃圾桶。
开玩笑的。但他也可能有,因为在那次遭遇后,我认为他一定是某种疯狂的数据科学家的专属捍卫者。什么样的人会说这种话?他用他的推理来捍卫他的公司关于雇佣经验的立场,也许以前雇佣初级数据科学家然后解雇他们是经过深思熟虑的,但老实说…大概不会!!
数据科学不好定义!
没有人知道数据科学家通常应该做什么,以及他们应该有多少经验来从事主要是使用数据解决商业问题的工作。就像所有出现的新事物一样,如果人们愿意冒险雇佣几个职位,而不是现有的许多软件工程师,他们就会想要最好最聪明的人。招聘会上那个自鸣得意的混蛋真正想说的是很难相信没有行业经验的新毕业生会被安排到一个角色,他们要么部署机器学习模型,要么与业务团队有效地沟通如何修复他们的产品。
这使得寻找数据科学家的工作变得困难,原因有三:
- 你没有学到工业所需的技能。
- 你在工业界没有任何关系。
- 你的所作所为并不可信。
所以真的,你拥有的最好的力量就是你最大的弱点;没有经验意味着你需要极度渴望学习。
这意味着对学习不同的工具感兴趣,尝试 Kaggle 竞赛,分析数据集,并寻找机会让自己置身于快速增长技能的环境中。
推销自己
回到我的旅程。我住在西雅图的校外,每天都要从学校步行足足 15 分钟回家。有一天我一反常态地把目光从手机上移开,抬头看着天空。
该死的,我以为,有很多新的公寓楼在建。我想知道西雅图现在的房租是多少?
朋友们抱怨 UW 大学区的租金价格上涨。另一个朋友告诉我,国会山是西雅图生活成本最高的地方。我问他多少钱。
“我的意思是谁知道男人,它可能是一样,3 倍以上的昂贵!”
Pfft。我以为。他坚持。所以我的头开始翻腾。我打赌我能想出来。但是到底如何……
原来,在我为一名金融博士生做兼职研究员的一个项目中,我正在学习如何使用 Python Scrapy 包从不同的网站收集数据。为什么我不能使用同样的技巧来收集 Craigslist 的住房数据,并对价格进行回归,以查看哪些社区的成本最高?
你猜怎么着。我就是这么做的。我在博客上写了一篇关于它的文章,这篇文章登上了 HackerNews 的头版。这就引出了我的第二点…
假设你是一家初创公司的首席执行官。想象一下,这家初创公司向其他公司出售数据科学工作。数据科学非常受欢迎,但不幸的是,没有人知道你的创业公司的存在。你如何向其他公司推销你的公司?
你可以在 T2、脸书、T4 和谷歌上尝试付费营销,但是那有点贵,而且你没有钱。电子邮件营销也很有效,但是你必须花时间收集一份名单。另外,他们可能会认为你在给他们发垃圾邮件。
博客呢?还是社交媒体营销?还是一开始通过给他们一些免费信息来给公司提供价值?这就是营销。
说到底,当你在找工作的时候,你本质上是在将自己作为一种产品进行销售。你是你自己的产品,为付钱给你的企业提供价值。你的简历是对你的产品的描述,以及你的老客户对你的好评。如果你没有任何过往客户,那就更难了!但也不是不可能。
故事延续…..
还记得我如何无法想象在示波器或 PCB 板上工作吗?最终对电气工程的厌倦和厌恶转变成了我真正的大学生活,我在一门电路课上得了一个 2.3 分。你曾经是班上成绩最低的吗?UW 在一个钟形曲线上评分,我清楚地记得看着我的试卷,然后抬头看到它在一个正态分布的一端画了圈。
但是我情绪低落的原因是因为我完全没有花时间学习电子工程。我刚刚发现了熊猫图书馆,它打开了我大脑黑洞中的一颗星星。数据突然变得如此容易,只需读取、操作、管理、加入并产生见解和分析,我发现了无数有趣的项目,可以投入其中。
公寓租金定价只是一个开始。我将 Craigslist 上的抓取技巧提升到抓取篮球统计数据、reddit 帖子、任何东西。如果是 html,我会像其他人一样解析它。我对这些项目很失望。所以我在基线上工作;提高我在 Python 和 R 中的数据技能,尝试很酷的项目,搜集数据,但我仍然没有在数据领域的简历上有太多内容。我想在数据科学领域实习,这样可以更好地为数据相关的工作做准备,但这从未实现。
我开始申请工作,并写关于我对数据的热爱的热情洋溢的求职信。
如果你雇用我,我会非常喜欢数据,你会看到我在办公室里争论到凌晨 2 点!
没有回电。为什么。我以为是因为他们不理解我对数据的强烈情感联系。我需要以某种方式证明这一点。我认为我的求职信正触及招聘软件臭名昭著的黑洞。深埋在体制中,是时候再次尝试参加招聘会,与员工建立联系了。
我参加了一场招聘会,在那里我与 Socrata 的一名员工进行了交谈。他非常支持我的数据科学抱负,但只有软件工程实习机会。我同意尝试一下。一周后,一名来自索克拉塔的招聘人员发给我一份需要完成的编码任务。我填完了,交了上去,很快就收到了一封拒绝邮件。这让我开始讨厌带回家的挑战。他们从来没有告诉我为什么我让他们失望了,我没有得到任何关于我的代码有什么问题的反馈。
两个月后,我发现了这个很酷的西雅图警方报告数据集。你瞧,它是由 Socrata 公司提供的。我下载了过去几年的犯罪数据,覆盖在一些漂亮的西雅图地图上,建立了一个通用模型来预测犯罪的紧迫性,一周后,我把它放到我的博客上,然后去上课。
第二天,来自当地新闻的人说西雅图的警察局长转发了我的文章,并希望能做一个简短的新闻片段。然后 Geekwire 在上面刊登了一个故事。突然,索克拉塔想让我再次去现场采访。在面试中与我一起编程的工程师找到了我代码的第一个方法,我们坐在那里花了一个小时解释为什么我使用 Python append 方法而不是 list comprehension。我可能整个面试都失败了,但没关系。唯一重要的是,在一天结束时,营销副总裁过来对我说:
所以……我们只是想知道,你为什么觉得有必要写一篇关于这个数据集的博客 ?”
我耸耸肩。他笑了。第二天我就在那里实习了。
营销营销营销。我们卖任何东西都是这么做的。我现在正在做的就是向您销售这款数据科学准备产品!我很幸运,作为一个天真的数据科学孩子,我将我的写作和兴趣结合起来,用一些数据在互联网上传播开来。但仅此而已。这就是我所做的。
- 我做了一些分析,任何尝试过 Kaggle 比赛的人都可以做
- 我以一种引人注目的方式写下了它,用闪亮的图表向不同的人传播这一信息
- 我传阅了这篇博文,并向某人祈祷它会很有趣。

Rover.com 电子邮件
西雅图当地新闻采访我的第二天,我收到了十多封来自该地区技术人员的电子邮件,询问我是否愿意与他们合作。就好像我淹没在工作邀请和需求中。 SpaceX、Rover.com、Tune ,所有这些随机的初创公司和公司都给我提供了面试机会,因为他们可以看到我对数据科学有多么感兴趣。他们根本不在乎什么经验或资历。他们想要的只是证实我对这个领域和工艺的贡献。他们通过阅读博客帖子看到了这一点。

SpaceX 电子邮件
现在你知道秘密了。
对第二部分感兴趣吗?
- 订阅 面试查询简讯 面试问题和博客更新。
- 查看 我的 Youtube 频道 了解更多数据科学面试、求职以及技巧和诀窍。点击这里订阅!
- 对数据科学面试问题感兴趣?查看 面试查询 问题。
原载于 2020 年 5 月 11 日 https://www.interviewquery.com*。***
Python 统计块中的新成员:pingouin

伊恩·帕克在 Unsplash 上拍摄的照片
图书馆的快速参观,以及它是如何从老守卫中脱颖而出的
Python 有一些非常成熟的库用于统计分析,其中最大的两个是statsmodels和scipy。这两个包含了很多(我是说很多)统计函数和类,它们在 99%的情况下会覆盖你所有的用例。那么为什么还会有新的库发布呢?
新来者往往试图填补一个利基市场,或者提供一些现有竞争对手所没有的额外东西。最近,我偶然发现了一个相对较新的图书馆,名为pingouin。该库的一些主要功能包括:
- 这个库是用 Python 3 编写的,主要基于
pandas和numpy。直接在DataFrames上操作肯定能派上用场,简化工作流程。 - 在编码和生成的输出方面,试图在复杂性和简单性之间取得平衡。在某些情况下,
statsmodels的输出可能是压倒性的(特别是对于新的数据科学家),而scipy可能有点过于简洁(例如,在 t 检验的情况下,它只报告 t 统计和 p 值)。 pingouin的很多实现都是从流行的 R 包直接移植过来进行统计分析的。- 该库提供了一些其他库中没有的新功能,例如计算不同的效果大小并在它们之间进行转换、成对 t 测试和相关性、循环统计等等!

来源:https://pingouin-stats.org/index.html
在本文中,我简要介绍了pingouin中一些最流行的功能,并将它们与已经建立的成熟功能进行了比较。
设置
首先,我们需要通过运行pip install pingouin来安装这个库。然后,我们导入将在本文中使用的所有库。
统计功能
在这一部分中,我们探索了pingouin中可用的一些功能,同时强调了与其他库相比的不同之处。
t 检验
可能统计库最流行的用例(或者至少与线性回归相当)是 t-test,它最常用于运行 A/B 测试时的假设检验。
从scipy开始,我们通过运行以下命令来计算 t 测试的结果:
ttest_ind(x, y)
什么会生成以下输出:

在pingouin的例子中,我们使用以下语法:
pg.ttest(x, y)
并接收:

scipy仅报告 t 统计和 p 值,而pingouin另外报告以下内容:
- 自由度(
dof), - 95%置信区间(
CI95%), - Cohen's d (
cohen-d)测量的效应大小, - 贝叶斯因子,表示支持所考虑假设的证据强度(
BF10), - 统计力量(
power)。
注意 : statsmodels还包含一个用于计算 t-test 的类(statsmodels.stats.weightstats.ttest_ind),它本质上是对scipy的ttest_ind的包装,对输入参数做了一些修改。
pingouin还包含标准 t 检验的更多变体/扩展,例如:
- 成对 t 检验,
- 曼-惠特尼 U 检验(独立 t 检验的非参数版本),
- Wilcoxon 符号秩检验(配对 t 检验的非参数版本)。
功率分析
统计库的另一个非常流行的应用是计算 A/B 测试所需的样本量。为此,我们使用功耗分析。如果你对更多细节感兴趣,请参考我的上一篇文章。
在这个例子中,我们将集中于计算 t-检验所需样本量的情况。但是,您可以轻松地调整代码来计算任何其他组件(显著性水平、功效、效果大小)。
为简单起见,我们将其他 3 个参数固定为一些标准值。
运行代码会生成以下输出:
Required sample size (statsmodels): 64
Required sample size (pingouin): 64
老实说,对于一个标准的 t-test,在功耗分析方面没有太大的区别。我们还可以定制替代假设的类型(无论是单侧检验还是双侧检验)。值得一提的是,pingouin使我们能够为一些测试运行功效分析,这些测试在其他库中是不可用的,例如平衡单向重复测量 ANOVA 或相关性测试。
测绘
pingouin包含了一些非常好实现的可视化,但是,它们中的大多数都是特定领域的,一般读者可能不会感兴趣(我鼓励你在文档中看看它们)。
不过,其中一个情节绝对可以派上用场。在我之前的一篇文章中,我描述了如何用 Python 创建 QQ-plots。pingouin绝对简化了这个过程,因为我们只用一行代码就可以创建一个非常好的 QQ 图。
np.random.seed(42)
x = np.random.normal(size=100)
ax = pg.qqplot(x, dist='norm')

更重要的是,pingouin自动处理如何显示参考线,而在statsmodels的情况下,我们需要通过向ProbPlot类的qqplot方法提供一个参数来做同样的事情。简化任务的明显例子!
引用pg.qqplot的文档:
此外,该函数还绘制了数据的最佳拟合线(线性回归),并用决定系数对图进行了注释。
方差分析
我们现在将研究如何运行 ANOVA (方差分析)。为此,我们将使用一个内置的数据集来描述每种发色的疼痛阈值(有趣的想法!).首先,我们加载并稍微转换数据集。
我们删除了一个不必要的列,并用下划线替换了列名中的空格(这将使在statsmodels中实现 ANOVA 更容易)。
首先,我们介绍pingouin方法。
什么会生成以下输出:

在继续之前,我们应该提到使用pingouin的潜在好处:它直接向pd.DataFrame添加了一个额外的方法(anova),因此我们可以跳过调用pg.anova和指定data参数。
为了比较起见,我们也使用statsmodels进行 ANOVA。使用这个库,这是一个两步的过程。首先,我们需要拟合 OLS 回归,然后才进行方差分析。

输出非常相似,尽管来自pingouin的输出包含一个额外的列,这是作为部分 eta 平方的效应大小度量。
与 t-检验类似,pingouin中包含不同的方差分析变量。
线性回归
作为最后一个例子,我们考察了最基本的机器学习模型之一——线性回归。为此,我们首先从scikit-learn加载著名的波士顿住房数据集:
from sklearn.datasets import load_boston
X, y = load_boston(return_X_y=True)
注意 : scikit-learn也包含了训练线性回归的类,但是,输出是我所知道的所有 Python 库中最基本的。在某些情况下,这完全没问题。然而,对于 R 来说,我更喜欢更详细的输出,我们很快就会看到。
为了在pingouin中拟合一个线性回归模型,我们需要运行下面一行代码。
lm = pg.linear_regression(X, y)
lm
这再简单不过了!输出如下所示:

表挺大,很详细。就我个人而言,我不认为包括 R2 和调整后的变体在这里有很大的意义,因为它导致了大量的重复。我的猜测是,这样做是为了以DataFrame的形式保存输出。或者,我们可以通过设置as_dataframe=False来关闭该行为,这将导致创建一个字典。这样,我们额外得到了模型的残差。
关于pingouin实现的一件额外的事情是,我们可以提取一个特征重要性的度量,它被表示为“将模型的总𝑅2 划分为单独的𝑅2 贡献”。为了显示它们,我们需要将relimp设置为True。
是时候前进到statsmodels实现了。
代码有点长,因为我们还需要手动将常量(一列 1)添加到包含独立变量的DataFrame中。请注意,当使用函数式语法时(如 ANOVA 示例中所用),这一步不是必需的,但是,在这种情况下,特性和目标需要在一个对象中。
下图显示了在拟合对象上运行summary方法的输出:

任何来自 R 的人都会认出这种格式的摘要:)
对我来说,额外的两行代码绝对是值得的,因为输出更加全面,并且经常为我们省去运行一些额外的统计测试或计算一些拟合优度的麻烦。
其他有趣的功能
在本文中,我只展示了pingouin库的部分功能。一些有趣的功能包括:
- 循环统计的广泛功能,
- 成对的 hocs 后测试,
- 不同的贝叶斯因子,
- 一系列不同的效果尺寸测量和一个在它们之间转换的函数。
还有更多!
结论
在本文中,我简要介绍了用于统计分析的新库pingouin。我很喜欢作者采取的方法,他们试图尽可能地简化过程(也通过让一些事情在后台自动发生,如为 QQ 图选择最佳参考线或对 t 测试进行校正),同时尽可能地保持输出的彻底和完整。
虽然我仍然是statsmodels总结线性回归输出的方法的粉丝,但我确实发现pingouin是一个很好的工具,可以在日常数据科学任务中为我们节省一些时间和麻烦。我很期待看到图书馆是如何随着时间发展的!
您可以在我的 GitHub 上找到本文使用的代码。一如既往,我们欢迎任何建设性的反馈。可以在 Twitter 或者评论里联系我。
觉得这篇文章有趣?成为一个媒介成员,通过无限制的阅读继续学习。如果你使用这个链接成为会员,你将支持我,不需要你额外付费。提前感谢,再见!
人工智能在医学领域的新一轮技术创业浪潮
AIM 创业公司
不同的企业及其产品

医学和技术的快速发展产生了新一波的科学研究和潜在的工业创新。人工智能(AI)是当今技术创新的主导领域,每个行业都有快速增长的潜力:金融科技、智能城市以及医药。
根据 CB INSIGHTS 的报告,由于新冠肺炎·疫情,到 2020 年第一季度,全球近 500 家人工智能创业公司能够单独筹集 84 亿美元的风险基金。
据预测,将人工智能技术集成到医疗保健行业中可以使收入增加近 9 倍。
人工智能和深度学习(DL)在医疗保健行业有多种应用,一些潜在的应用包括:
1医疗数据处理
医疗数据挖掘是许多医疗保健初创公司的另一个潜力。这一点尤为重要,因为在应用于计算算法之前,数据标准化和协调非常重要。
提供服务的公司或机构:
项目基线由 Verily 和 谷歌健康 正在与研究人员合作打造下一代医疗保健工具和服务。
IBM Watson Health已经迈出了改进医疗处方分配的先进一步。他们正致力于开发一个数据库系统,可以为任何患者确定正确的药物治疗。这是因为具有相似潜在状况的患者状况的变化。所提出的技术可以主动识别最适合特定患者的概率药物。
Stratasan 参与医疗数据处理,收集、更新和检查任何输入数据的错误。 MOS(医疗记录审核) 是一家医疗审核服务公司,积极参与审核账单和其他文档。
AI 还用于处理各种冠状病毒文献,以帮助提取有用的生物医学研究信息。 新冠肺炎作品集 是由美国国立卫生研究院(NIH)发起的,用于跟踪 SAR-CoV-2 文章的相关论文。
2医疗报告分析
它涉及深度学习技术,以提高医疗报告的诊断,如 x 光和核磁共振成像的阅读。该技术旨在通过图像分析对报告做出结论,并可辅以放射科医生的专家咨询。
提供服务的公司或机构:
布法罗大学(UB)正在使用机器学习(ML)来分析高分辨率数字图像中的预测模式。这使得内窥镜能够准确地识别肿瘤部位,并且可以通过咨询放射科医师来补充。
斯坦福大学和哈佛医学院 都参与了类似的研究技术,开发新的人工智能方法,允许数字图像诊断。
cardiology是一家心脏诊断公司(总部位于法国),利用人工智能和云技术来识别心脏状况。该公司能够在首轮融资中筹集到 1500 万美元(该公司第一轮重要的风险资本融资)。
Gleamer 是另一家总部位于欧洲的 AIM 公司,它使用一个工程师和医疗专业人员团队来创建可供放射科医生使用的医疗级人工智能工具。BoneView AI 是他们开发的产品之一,用于将混合骨折的尺寸减少近 30%。
3电话筛查/虚拟诊断
这利用人工智能医疗筛查为患者提供咨询。它越来越受欢迎,主要是因为它的咨询成本低,方便提供。它主要涉及通过与医生的虚拟咨询和回答一系列相关问题进行在线诊断。
提供服务的公司或机构:
虚拟诊所 和 症状 就是这个平台的完美例子。随着新冠肺炎的实施,患者更有可能选择在线诊断和咨询。
机器医学 是一家总部位于欧洲的公司,专门开发用于运动评估的人工智能技术。凯文是一个运动评估人工智能工具,利用视频数据采集和基于计算机视觉的分析。
医疗保健行业是数据密集型行业,人工智能集成可以减少医疗信息的过载。它还提供了全面理解医疗数据并将其转换为计算知识的范围。
一个主要的挑战和限制包括偶尔不正确的诊断和治疗建议。
注册医生和 AIM 技术的合作可以极大地改善当前的医疗保健行业,使医疗保健更加实惠。
美国医疗保健市场规模为 3.6 万亿美元,但欧洲的数字医疗保健初创公司也通过筹集约 26 亿美元的资金提供了类似的竞争。科技公司一直在关注和开发 AIM 技术的新浪潮。
分析谷歌云上的实时新闻流
一个有趣的关于实时新闻流的 NLP 应用程序
《纽约时报》新闻专线—地理和组织层面的情感分析应用

詹·西奥多在 Unsplash 上的照片
方法
自然语言处理有许多有趣的应用。在这里,我们将看看如何处理实时新闻专线,从新闻文章中获取情感,并将其应用于地理和组织级别的标签。这种方法可以扩展到丰富计量经济学数据,以预测正在进行的市场脉搏、公众情绪及其潜在影响。
有许多新闻和媒体流 API 可以提供实时流内容。
其中一个内容丰富的是纽约时报开发者计划。它提供了几种获取新闻文章的方法;这是它在目录上所提供的一切的一瞥。

我们将关注泰晤士报的 API feed 最新的文章一在 NYTimes.com 上发表,它就源源不断地发送出去。
您可以在 https://developer.nytimes.com/accounts/create注册自己访问流并生成 API 密钥
获取最新文章并作为数据框返回的示例代码
这是新闻流内容的样子(df_page),我们将分析标题和摘要栏。

谷歌云自然语言 API
NLP 已经存在很久了。在 GCP,利用谷歌强大的文本分析算法非常简单。Google Cloud 自然语言 API——它是云中一组强大的机器学习模型。它提供了在没有任何标记或训练数据的情况下进行情感分析、实体分析、语法分析、实体情感分析和文本分类的能力。这些模型是用相对较大的数据集预先训练的,因此用户不需要训练数据集,就可以直接开始使用它。
自然语言 API 由五种不同的服务组成:
情感分析:它评估文本中的情感观点,评估内容的积极、中立或消极程度。它返回介于-1.0(负)和 1.0(正)之间的情感分数。它还返回一个从 0 开始一直到无穷大的量级分数;这表明了情感的整体强度。这些分数被给予整个文档以及单个句子。
实体分析:它尝试并识别所提供文本中的已知实体(专有名词),并返回关于它的附加信息。被识别的实体被给予显著性分数(0.0 到 1.0),这反映了它们与整个文档的相关性。然后,这些实体按类型进行标记,例如:人员、位置、组织。
语法分析:
语法分析检查语言结构,将给定文本分解成句子和标记,然后输出语言分析信息。
实体情感分析:
这结合了情感分析和实体分析提供的结果,以显示在文本内实体级别上估计的情感。
文本分类:
将语料库分类为预定义的类别之一,例如:艺术、商业、健康、科学等。
与 GCP 自然语言 API 交互
初始化一个连接,该连接接受文本语料库并返回一个客户机实例以及文档和必要的编码。
与自然语言 API 交互,检索结果并作为字典对象返回
遍历所有文章,调用先前定义的函数,并将所有结果组合到一个数据框中
通过为情感分数的聚集指定属性来获得前十个条目
使用散景生成可视化效果
生成、评分和管理文章数据
获取最高肯定排名文本
正面情绪得分的文本如下:
- 我们推荐的五样东西(淋浴产品)。
- 一个虚拟的纽约艺术博览会。
- 动画电影评论——狼屋
诸如此类。

获取最高负面排名文本
负面情绪得分的文本如下:
- 特朗普的低支持率
- 失业率飙升
- 私募股权没有帮助。
- 奥巴马称美国缺乏领导力
诸如此类。

获得组织的最高肯定排名
以下组织获得了积极评价:
- 高古轩画廊
2.太阳剧院
3.很少有其他娱乐场所,如古德曼剧院、迪士尼乐园
诸如此类。

获得组织的最高负面排名
负面情绪与以下新闻文章相关:
- j 船员集团破产
2.密歇根州立大学相关判决,
3.新冠肺炎抑郁症相关的文章
诸如此类。

通过地理定位获得最高肯定排名
对地理位置的正面评价,如:
- 奥地利(淋浴产品)
2.亚特兰大——绘画和壁画故事
3.金县冠状病毒检测试剂盒的研究进展
诸如此类。

通过地理定位获得最高的负面排名
用地理位置评分的负面情绪,例如:
- 武汉——一本关于冠状病毒的书
2.阿肯色州禁止了一场音乐会
3.查谟和克什米尔当前的问题
诸如此类。

通过实体获得最高的正面排名
对以下实体的正面评价:
- 艺术
- 饭店
- 烹饪
- 戏院
- 隔离生活
等等。

按实体获得最高负面排名
负面情绪在以下实体中得分:
- 一篇关于种族主义的文章
- 性犯罪的判决和裁定
- 在这个充满挑战的时代,悲伤和付出得到了回报
还有更多。

工作码
所有工作代码都在 GitHub 帐户的以下存储库中提供
[## romanthnirmal/nytimeswire-sentiment analysis
使用谷歌云平台的纽约时报情感分析
github.com](https://github.com/romanthnirmal/nytimeswire-sentimentanalysis)
交互式笔记本—由 Binder 托管
[## GitHub:romanthnirmal/nytimeswire-sentiment analysis/master
单击运行此交互式环境。来自活页夹项目:可复制、可共享、交互式计算…
mybinder.org](https://mybinder.org/v2/gh/romanthnirmal/nytimeswire-sentimentanalysis/master?filepath=nytwire-gcp.ipynb)
机器学习性能增强的下一个行业转变
比你想象的简单。
疯狂到认为自己可以改变世界的人,才是真正改变世界的人。
罗伯·斯尔塔宁

图片来自 shutterstock.com
介绍
在过去的十年里,模型的改进在许多方面都取得了进展,因为对可见性能的需求在全球范围内都是可以达到的。决策者不需要成为统计学家来理解增加收入或降低成本的价值。
世界上成千上万的公司,从小型创业公司到全球公司,都发现在中的巨大价值提高了他们监督或无监督的 ML 模型的性能,无论是销售或需求预测、市场购物篮分析推荐器、客户分类器、销售优化器、聊天机器人、算法交易管道、文档贴标机、选举预测、垃圾邮件过滤器、医疗诊断解决方案、路线优化器、人脸识别器还是自动驾驶汽车。我甚至不打算开始物联网。
然而,他们似乎都试图通过主要关注两件事来提高精度(减少误差):
1) 特征工程(通过彻底处理数据集来充分利用您的特征)
2) 模型/参数优化(选择最佳模型和最佳参数,即使你必须提出几种算法的混合,并迭代到无穷大)
以上两个过程确实非常必要,但是还有第三个过程以一种互补的方式增加价值,这个过程传统上在大多数数据科学项目中被广泛地使用,现在正开始起飞。
添加外部数据。
仅在过去两年中 就创造了超过全球 90%的数据,而且数据量预计将继续呈指数级增长。每 6 个小时,全球就会产生1 万亿字节的数据。如果不借助恒星或原子,你就无法直观地知道这个数字有多大,不过,这个数字在几年后会显得很可笑。****
另一方面,我们可以广泛使用尖端系统,如带有遗传算法的神经网络,这些系统在用同一数据框架上的其他变量解释一个变量方面表现出色(一旦它们是整齐的数字格式)。
所以问题不是如果两个世界要相遇,问题是什么时候,答案开始像现在的。****
如此多的突然变化影响着这种高度不确定和社会距离遥远的生活方式,仅依靠内部数据进行准确预测尤其具有挑战性。因此,现在用外部数据增强最大似然模型比以往任何时候都更相关(也更可行),可以提供手头问题的更完整视图。
“好数据科学家希望找到好的、干净的有影响力的数据,与他们自己的数据混合,做出更准确的预测
Kevin Quinn 和 Emil Berthelsen 的 Gartner 研究报告,2020 年 7 月 24 日。
数据科学家倾向于不鼓励将外部数据添加到他们的模型中,因为他们认为这样做的效益/工作量比率很低,因为以完全不同的格式收集、处理、分析和连接非结构化数据需要大量工作。此外,添加数据的决定“只是基于直觉”,可能根本没有关系。
但事实是,它可能比你想象的要简单。这里有一个使用 Python 或 r 将外部数据混合到数据集的技术教程。
因此,现在每个人都可以从开放数据中获得有用变量的模型丰富,是时候让依赖 ML 的企业适应或超越了。
大事来了。
数据科学、人工智能和 ML 的无代码方法
无论您在该领域的专业知识和经验水平如何,如果您的目标是快速完成工作并从中获得乐趣,掌握使用无代码方法处理数据的良好知识是至关重要的。

卡尔·海尔达尔在 Unsplash 上拍摄的照片
在我们的智能时代,做某些事情的非代码方法已经萌芽,变得如此流行和重要。使用无代码方法做某事并不一定意味着你不知道如何编码。事实上,您需要非常熟悉编码,以便能够很好地使用无代码方法。数据科学和人工智能是一个应用无代码方法的非常复杂的领域,但少数公司和初创公司已经能够利用人工智能的全部力量来推动技术的边界,迄今为止,清理数据和根据数据进行预测的繁琐工作可以自动化,无需编写一行代码。 显然 AI 是能够为数据科学家和 AI 工程师完美创建无代码平台的领先公司之一。
为什么要使用无代码方法?
你可能想知道为什么我建议你作为数据科学家或人工智能工程师学习使用无代码方法。在这个故事中,我将讨论作为数据科学家或人工智能工程师使用无代码方法带来的许多好处。然而,应该注意的是,无代码方法并不意味着取代传统的编写代码来完成工作的方法,而是补充和改进你作为数据科学家或人工智能工程师所做的工作。

无代码插图来自 显然 AI
它超级快
使用像显然 AI 这样的无代码方法,你可以比使用传统的写代码方法更快地灵活处理数据。使用无代码方法,您可以从数据清理和争论过程中节省大量时间,您可以在其他地方解决这些问题以获得最大的生产率。显然人工智能特别给了你从数据中做出预测的自由,太棒了!对你正在做的工作所涉及的概念有很好的了解是有利的,这将有助于你理解你用像显然是 AI 这样的无代码工具所做的预测的结果。
这很有趣,也很吸引人
使用无代码的方法非常有趣,显然 AI 具体来说,有一个非常吸引人的用户界面,让你感觉参与到每个阶段。当您清理数据或根据数据进行预测时,您确实可以看到引人入胜的可视化效果。与传统方法相比,无代码方法让您专注于工作,并帮助您专注于手头的任务。
它提高了生产率
将对编程概念和原理的良好认识和理解与无代码方法相结合,可以提高工作效率,因为工作可以完成得如此之快,并且可以一次专注于一项特定的任务。您可以在几秒钟内处理大量数据,并在处理数据的同时自动执行一些任务,从而节省大量时间并减轻压力。这就是说,无代码机器学习使企业能够深度专注于决策和采取行动,同时无缝地做 AI,而无需构建大型系统基础设施。
关于显然 AI
明明艾 演示视频
显然,AI 已经将传统的机器学习过程简化为 3 个步骤。现在,您可以上传数据,点击几个按钮,并在几分钟内执行数据预测——无需代码。这使得任何人都可以使用机器学习,并使每个人都毫不费力,不管你的技术背景如何。预测收入,优化供应链,个性化营销,建立人物角色。你现在可以知道接下来会发生什么。点击了解更多。
感谢您抽出时间阅读这个故事。我希望你学到了一些东西,这是有帮助的。欢迎你在回复部分分享你的想法和观点,你可以直接在 Twitter 或 LinkedIn 上联系我。此外,的 AI 团队随时准备回答您的所有问题或咨询。你可以在推特上或者他们的网站上联系他们。黑客快乐!
非常感谢 安娜·阿依库 校对并纠正了我写这篇文章时犯的许多错误。
无代码革命即将到来,你准备好了吗?
预测(编程)世界的范式转变,以及如何不被它抛在后面。

乐高!(凯利·西克玛在 Unsplash 上的照片)
你是乐高迷吗?
乐高是我第一次真正痴迷的东西。虽然我现在是一个康复中的乐高迷,但我曾经收集了相当多的乐高玩具,装满了一个巨大的袋子,我可以用它来制作的任何东西。虽然我一心一意地制造了某种宇宙飞船,但关键是我可能制造了任何东西。
我经常读到有人说乐高的天才之处在于它的模块化设计。就像——它的任何部分都可以很容易地组装成任何其他部分。但我不同意。真正的天才在于 n 个组件之间连接的完整性和强度。
乐高将工程从儿童建筑项目中剔除。作为一名前工程师,我可以告诉你,这不是一个微不足道的壮举。有了乐高,最终结构的完整性和强度几乎从来不是问题。他们之所以能做到这一点,是因为零件的高强度重量比和高质量制造导致了紧密配合。
你根本听不到乐高零件散架或任何乐高建筑因自身重量而失败。
用乐高建造东西并不是为了确保结构坚固,或者为材料找到合适的紧固件/粘合剂。
这是关于让你的想象力放飞,概念化的输出和找到正确的部分——乐高为你做了繁重的工作。

你基本上可以用乐高做任何事情
这正是 nocode 工具通过将工程从应用构建中分离出来,为创作者和企业所做的事情。对于我们中的许多人来说,我们需要考虑这对我们工作场所和更广泛的工作的未来意味着什么。即使你是一名数据科学家,站在技术的最前沿。我们会回到这个话题,但是我相信你们中的很多人都想知道 nocode 工具到底是什么?
“无代码”工具是那些允许用户使用简单语言选项、视觉和其他辅助工具来构建软件的工具,这些工具传统上是用代码构建的。你可能听说过像 Zapier、Airtable 或 Webflow 这样的例子。

Zapier 就是一个“nocode”工具的例子(截图: Zapier 网站
虽然它们最近获得了进一步的发展势头和受欢迎程度,但它们很难说是新的(事实上,它们根本不是新的)。事实上,它们并不是要取代每一种编程语言。
像用于网页设计的 Dreamweaver 和用于工程师的 LabView/Simulink 这样的工具已经存在了几十年。

Simulink——一个老式的 nocode 工具(截图: Mathworks 网站
面对现实吧。Airtable 与 MS Access 有本质上的不同吗?Webflow 和 Dreamweaver,或者 MS PowerApps 和 LabVIEW 呢?或者它们只是这些工具的更好的迭代?
此外,目前不可能使用像 C++或 Python 这样的通用编程语言那样的 nocode 工具,将来也不会。它不是一路向下的乌龟(或 nocode),在某处有代码。无代码工具最终是代码的抽象,因此它们的开发开销会更大。
因此,如果 nocode 工具不是新的,而且它们远不如通用编程语言强大,那么创新是什么,为什么它如此重要?
秘密不在于它的“nocode ”,也不在于它的视觉特性,尽管能够在几天或几小时而不是几周内学会一个工具肯定会有所帮助。
杀手级的特性是的可访问性,这是由大幅提高的带宽和计算能力实现的,以及它们的部署的简易性,因为 nocode 平台为普通用户抽象了所有的开发工作。
不需要做出决定或学习一整套新的技能,比如如何部署它,使用什么托管服务,是否将其装箱,确保相同的环境/包,记住使用哪些 ssh 密钥…你明白了。
对于许多开发人员来说,这可能是小菜一碟,但是我们大多数人都不是这样,即使是我们这些做代码的人。对于许多人来说,了解这些东西没有任何价值。有了 nocode 工具,一旦你构建了某个东西,并且它工作了,你就可以通过按一个按钮来部署它。
最终用户并不关心你是否通过点击按钮在 bubble.io 上构建了什么,或者你是否使用 Django 在 Python 中构建了它,并使用 AWS 上的 Docker 容器部署了它,整个事情包括成千上万行代码。对于数据科学家来说也是如此。无代码数据科学工具已经出现,而且只会越来越好。
我认为 nocode 工具将帮助领域专家摆脱对编码人员的依赖。对于我们中的许多人来说,它应该让我们在决定职业生涯的下一步走向以及在这个过程中需要发展哪些技能之前暂停一下。
更具体地说,每一个不想成为全职程序员的人都会认真思考他们是否需要学习如何编码。相反,他们应该考虑自己是否知道如何系统思考和解决问题。
这里有一个例子,它让我想到了 nocode 工具的成熟——利基专用软件包。
我已经看到了我的利基软件包份额;人力资源、时间管理、法律或监管职能。它们通常满足以下四个标准中的至少三个:难以使用,昂贵得令人厌恶,很少更新,看起来像 90 年代的网站。令人沮丧的是,它们几乎总是不完全是用户想要或需要的。
利基软件的世界通常是不完美市场的一个完美例子,由数量非常有限的供应商主导,这些供应商服务于一个市场,他们绝对需要一些东西来保持业务运转,并确保他们不会落后。
大多数人,不管他们是在金融部门、律师事务所工作,还是在工程部门工作,都会拥有这三种倾向、技能和时间来构建定制软件以满足他们的确切需求。因此,不完美的(仁慈的),昂贵的软件工具的暴政继续肆虐。
无代码工具将会改变这一切。当你可以雇人自己做,或者花几十甚至几百美元购买一个类似的应用程序模板时,以每年每席位几千美元的价格许可软件不再有意义。
我个人从一个空白的 AirTable 项目开始,并在短短几天内构建了一个带有提醒的法律事务管理系统。我不需要创建一行这样的代码,但是我需要知道我想从我的系统中得到什么,每个字段是什么类型的数据,哪个表将保存什么数据,以及它们之间的关系。
换句话说,我仍然需要将我想要构建的系统以及它的组件如何交互概念化。就像乐高一样,你正在使用标准组件构建这些系统。在这个范例中,我们这些有能力理解概念输出的人,每个组件如何工作,从 A(组件)到 B(系统)将会受益。
对于许多专业人士来说,情况将会是相似的。
看看这些用于 AirTable 或 Webflow 的模板。

AirTable 模板示例(截图: Airtable 网站

Webflow 模板示例(截图: Webflow 网站)
它们涵盖了广泛的领域,并在每个类别中提供了各种模板。
随着这些工具变得更容易使用,使用它们的技能价值也会下降。
它从相对“老”的技术开始,如电子商务店面(Shopify)、网页设计(Webflow)、数据库(AirTable)和微服务(Zapier)。但它将渗透到所有形式的技术中。
更通用的 nocode 平台,如微软 Power Apps,将试图把自己打造成更通用的企业应用构建生态系统。正如我提到的,数据科学不会是一个例外,来自 AWS、Azure 和 google 以及较小的参与者的工具已经证明了这一点。
那我们该怎么办?在这个世界上,构建应用、数据库、数据科学模型或店面几乎没有准入门槛,学习曲线平坦,就像一个缓坡,价值在于系统思维,以及对你的领域有更深入的理解。这个应用程序将解决客户的哪些长期问题,您特定的内部数据库需求是什么,或者您的电子商店要应对什么市场。
归根结底,这是一件好事。技术工具就是工具。它们本身不是解决方案,而是创造更大成就的基石。
但是工具的改变意味着我们需要随之改变,并且承认我们的技能集的价值将会相应地改变。几年后,人们看起来可能会有点像我们这些自己做椅子的人。令人钦佩,但这是一件罕见的事情,是一个业余爱好者的任务,而不是最有效的整体。
变化即将到来,我们都需要思考我们想要融入哪里。
但是在你离开之前——如果你喜欢这个,在 Twitter 上打个招呼/关注,或者关注这里的更新。
如果你喜欢这篇文章,可以看看我写的关于用 nocode 工具构建投资组合的文章。
[## 使用这些工具,立即构建一个令人敬畏的数据科学(或任何)投资组合
节省时间&建立一个漂亮的在线形象。大多数数据科学家对原始 HTML & CSS 有什么用?
towardsdatascience.com](/build-an-awesome-data-science-or-any-portfolio-in-no-time-with-these-tools-75ac95febf31)
注意安全!
数据集的不可背叛性
ArtGAN 和 WikiArt:用人工智能创造艺术。用艺术制造 AI。

样本数据集 von WikiArt ( 来源)
谓师 何著名的烟枪。人们为此责备我!但是,你能塞住我的烟斗吗?不,这只是一个表象,不是吗?所以如果我在照片上写“这是一根管子”,那我就是在撒谎!”——写了勒内·马格里特关于他杰出的概念和艺术作品“图像的背叛”。
颜后君不是烟斗。
马格里特探索了现实的维度——以及我们的惯例:理想的一个(烟斗的概念),虚构的一个(烟斗的绘画),以及真实的一个(烟斗的实际)。他还质疑什么是真正的。在他鲜为人知的视觉散文“Let Mots et les Images”(“Words and Images”一部符号学巨著)中,他阐述了感知的不同层次,以及他的艺术构思(在不同层次上混合和替换术语、物体和图像):****

电影和图像。勒内·马格里特在 1929 年的《革命现实》中写道。(来源)
在数字时代,新的类别出现并加入到这些定义中…但是我们怎么能称人工智能创造的艺术品呢?是一个概念吗?一部小说?还是已经现实的?
设计师、工程师、AI 艺术家、思想家萨米姆非常贴切地将的论述融合在一起:
在我们人类发现艺术的地方,人工智能检测为一个物体。Objet troué?
但是当我们在 Art 上训练 AI 的时候**会发生什么?Android 会对超越梦想的电动绵羊说些什么?****
有各种各样的努力让 AI 创造艺术(例如,一个模型,在 Kaggle 的 24k 绘画数据集上训练)。
人工智能研究员 Chee Seng Chan 和他的同事问了他们自己同样的问题。他们在 WikiArt 数据集上训练 CNN,并在 2016 年提交了他们的论文“颜后君 n'est pas une pipe:美术绘画分类的深度卷积网络”。他们有双重任务:
一方面,我们希望训练一个端到端的深度卷积模型来研究深度模型在美术绘画分类问题中的能力。另一方面,我们认为与物品或人脸识别相比,美术收藏的分类是一个更具挑战性的问题。这是因为有些艺术品是非具象的,也不是具象的,可能需要想象力才能认出它们(来源 / ICIP-16 )。
那么 AI 是否有想象力去识别艺术,一种人类大脑、心脏和手的非具象作品?而 AI 能被启发产生艺术吗?
什么是艺术?
他们发现:
- 微调ImageNet 预训练 CNN* 对 WikiArt 绘画数据集也达到了最好的结果*
- 由于艺术风格之间的相似属性而导致的错误分类是可能的
- CNN 可以根据不同艺术家的绘画风格将他们联系在一起
所以他们发布了 ArtGAN 来探索 AI 与艺术的关系的可能性,2017 新的研究和改进的 ArtGAN 发表了:改进的 ArtGAN 用于自然图像和艺术品的条件合成。
2020 年美好开始:WikiArt
基于 ArtGAN,使用条件 WikiArt 模型,并由 StyleGAN2 和 TensorFlow 支持, Peter Baylies 发布了一个新模型:( GitHub / 条件模型)。
他去年开始了他的实验——用这个 twitter 帖子:
这个项目的美妙之处也始于合作:不同研究人员的许多努力被结合在这个模型中。它用它的力量来说服人。
让我们来探索 WikiArt(感谢多伦·阿德勒提供并微调 WikiArt 的一个 Colab 笔记本 )。
已故艺术家之间的对话
…让他们活着。
事实上,该模型是在许多艺术家身上训练的,但是对于流派分类,只选择了其中的一部分:
Wikiart 绘画数据集拥有来自 1000 多位艺术家的 80,000 多幅美术绘画,从 15 世纪到现代。这个数据集包含 27 种不同的风格和 45 种不同的流派。 […] 所有画作都是用于风格分类。同时,只有超过 1500 幅画的 10 个流派被选择用于流派分类,总共大约 65,000 个样本。( CS 变)
的确,风格分类是一个复杂的故事,是艺术学者们讨论的对象。
- 印象派从哪里(不是“什么时候”)开始?
- 是 DADA 还是已经 MERZ 了?
- 毕竟:文艺复兴是一个时代,艺术运动,还是社会文化的转变?
所有这些问题,即使是人类也无法回答(基于惯例、刻板印象,甚至艺术家的自我表现)。艾也很困惑——它最多能做的,就是区分艺术家风格、描绘对象、和艺术运动特征。



你可以在这三个类别集之间进行选择,并让人工智能重新创建任务。
所以让我们从伦勃朗开始——非常明显的选择。当然,我们得到的,不是你的下一个伦勃朗,而是这位艺术大师的风格:
**
左边:伦勃朗的自画像乐队/右边:使用预设生成的图像:伦勃朗/肖像/巴洛克
看看人工智能生成的图像中的一笔一画。与伦勃朗的大师之手相比:

戴贝雷帽翻领自画像(1659),华盛顿特区国家美术馆
这不仅仅是风格的转变。这是更多的东西。伦勃朗作品概述。
如果我们抓到宇多川国良…
**
左图:由宇多川创作的“人们在暴风雨中撑着雨伞走在海边”/右图:“宇多川”人工智能生成的图像
Even if the style is far from original, the composition, the feeling, the mood — all the human shapes, lazy day, 物の哀れ. Already Impressionist touch.
完全正确:ArtGAN 无法重建名画(在这种情况下,因为它是在各个艺术时代的庞大数据集上训练的)。它也不能按需创作艺术品。
但它能产生不言自明的听觉图像。
重塑艺术家
我们也可以问一个亵渎神明的问题:如果?不同风格的艺术家创作?达芬奇作为印象派?文艺复兴时期的梵高?
摆弄这些类别,你会得到意想不到的有趣结果。这里只是其中的一部分。





彼得·贝利斯的模型提供了更多,包括投影仪,模拟风格的 T2。
是现实吗?
是的,它是!与此同时,随着神经网络传递图像,它成为我们现实的一部分。
是艺术吗?
你决定吧。在我看来,这是达达派意义上的艺术。这是一种破坏性的力量,让我们重新考虑艺术概念中的人的因素。就像在艺术史的所有关键时刻一样:无论是文艺复兴还是历史先锋派。
AI 可以创造艺术。





罗斯文贸易数据集

(图片由es.pngtree.com)
研究折扣对顾客行为的影响
本帖描述的技术工作流程可以在 这里 的 jupyter 笔记本中找到。
介绍
Northwind Traders 数据集是微软出于教育目的创建的一个玩具数据库。这家虚构的公司向世界各地的零售店批发特色食品。该数据库包含 85 个不同客户在 23 个月内下的 801 个订单的数据,以及关于客户、员工和供应商的补充信息。本研究的目标是从数据中提取见解,从而为公司带来更多收入。有两件事通常对商业有益,一是顾客购买更多的产品,二是更频繁地购买。由于 Northwind Traders 的客户是零售商,对他们来说,订单折扣意味着更高的利润率,可能会刺激购买者并提高客户忠诚度。这项研究试图调查两个问题,因为它们关系到最好地达到这些目标:多大的折扣应该提供,多久应该提供?由于提供更大或更频繁的折扣会对 nt 从订单中获得的利润产生负面影响,因此确定是否存在一个阈值是很重要的,在该阈值时,这种收入损失不再符合所产生的影响。
问题 1:提供多少折扣?
为了回答第一个问题,我们研究了折扣对两个指标的影响:订单的总价和订单中订购的商品数量。由于折扣分别应用于订单中的每个项目,因此进行了测试来检测折扣对订单中各个项目数量的影响。个别项目的折扣几乎完全以 5%的增量应用,从 0%到 25%,只有几个杂散值徘徊在 5%左右,四舍五入为 5%,使测试成为一个对照组和五个治疗组。然后,在每个订单的基础上调查折扣的影响,将数据按订单分组。每份订单中所有商品的平均折扣代表该订单的折扣水平。这些平均值根据订单中每个项目的相对数量进行加权。这些平均折扣的范围在 0%到 25%之间,因此为了创建组进行比较,这些值被四舍五入到最接近的 5%增量,除了 0 到 5 之间的任何值被四舍五入到 5,以保持 0%折扣组纯粹是无折扣订单,作为对照组。然后将 5%、10%、15%、20%和 25%的组作为对照进行测试,然后相互比较以进行进一步的分析,其中发现了统计学上显著的效果,正如在每个项目的效果测试中一样。大约 56%的订单没有折扣,使得控制组比其他组大得多。本研究中的所有统计检验都是双尾的。
测试对订单总额的影响,发现只有 5%和 10%组具有统计上显著的积极影响,并且当忽略对照组时,折扣金额和订单总额之间存在负线性关系,这在直觉上是有意义的,因为应用的折扣越大,订单总额将减少得越多。5%组比 10%组具有更大的测量效应(Cohen 的 d 值分别为 0.42 和 0.31),但是比较测试表明,这两组之间测量的差异可能是由于机会,并且两者都不能声称具有优势。在任何情况下,如果任一组的总订单可以得到相同的结果,5%的折扣是有利的,因为它使公司花费更少。这些结果通过对未转换的目标数据的非参数检验和对第四根转换的目标数据的参数检验得到证实,这满足正态性假设。转化组的分组 ECDF 和测试结果如下所示。


Welch 的 t 检验与对照组(p 值调整为 5 次比较)
在每个项目和每个订单级别上测试了折扣对订购项目数量的影响。再次,非参数和参数方法进行了比较,发现是等效的。对于参数测试的正态性假设,该目标也进行了 4 次根变换。对于每个项目水平,除了 10%组之外,所有组都有统计学上显著的积极影响,其中没有一个与其他组有统计学上的差异。忽略对照组时,在折扣和项目数量之间没有检测到线性关系。这些事情一起表明,提供更大的折扣没有明显的好处,因为有利的效果已经达到 5%。


Welch 的 t 检验与对照组(p 值调整为 5 次比较)
在测试折扣对每个订单的商品数量的影响时,也得出了类似的结论,其中除了 25%组之外的所有组都显示出统计上的积极影响,它们在统计上彼此相似。同样,当忽略对照组时,在折扣和商品数量之间没有检测到线性关系,这意味着没有理由相信将折扣金额提高超过 5%会产生任何显著的好处。请注意该目标变量组的较大效应大小,显著组的 Cohen d > . 5:


韦尔奇 t 检验与对照组(p 值调整为 5 次比较)
回答:
在 5%的折扣下,对所有指标的统计显著影响出现,并且没有检测到进一步增加折扣的显著益处。还确定将折扣提高超过 5%会对订单总额产生负面影响。因此,5%的折扣是在不增加不必要的利润成本的情况下产生购买动机和客户忠诚度的正确选择。
问题 2:多久提供一次折扣?
在回答第二个问题时,每份订单数据再次按客户分组,以测试客户的折扣频率对他们的平均订单总数和他们在所研究的时间段内下的订单数量的影响。超过一半的顾客在这段时间内从未享受过折扣,而那些享受过折扣的顾客平均花费了两倍的钱。由于不可能知道该公司在折扣优惠中使用了什么决策过程(如果有的话),我们无法知道基于绩效的折扣系统在多大程度上造成了这种可衡量的差异。可以推测,大多数公司会向优先客户提供折扣,但在所研究的指标中,折扣客户和非折扣客户之间有相当多的重叠,这意味着有许多优秀客户从未获得折扣,也有许多不太优秀的客户经常获得折扣。无法确定客户购买行为与提供的平均折扣金额或提供折扣的频率之间的明确关系,因此可以得出这样的结论:如果基于价值的折扣系统存在,它会被宽松地遵循,并且有意义数量的测量效果是提供折扣的结果,而不是相反。

各组之间的重叠显示没有获得折扣的优质客户。
为了比较结果,对原始数据进行了非参数检验,对转换后的数据进行了参数检验,这两种方法对目标变量进行了检验。对于本节中的两个目标,立方根转换产生了令人满意的正常组数据。转换后的变量将显示在下面的视图中。
在调查向客户提供折扣的最佳频率时,客户根据其订单在该时间段内打折的比例进行分组。这包括一个对照组(0%折扣),然后是 0-30%,30-50%,50-70%和> 70%的治疗组。请注意,只有一个客户属于 0–30%组,因此使用 z 测试来确定该组的 p 值,但更多测试将适用于确定该频率范围的影响。对于已经打折的客户,他们的平均折扣率是订单的 58%。

对于对客户平均总数的影响,测试显示,与对照组相比,30–50%和 50–70%组具有统计上的显著影响。这些影响非常大,Cohen 的 d >1.75。这两个有效组在统计上彼此相似,表明没有必要为顾客提供超过 30-50%的折扣来获得最佳效果。


Welch 的 t 检验与对照组(p 值调整为 4 次比较)
在调查客户在一段时间内下的订单数量的影响时,测试显示,除了单个成员 0–30%组之外,所有处理组都具有相当大的具有统计显著性的积极影响,所有处理组的 Cohen d > 1.5。研究还表明,各组之间没有统计学差异,也没有线性关系,这意味着没有发现将每个客户的频率提高 30–50%有任何益处。


Welch 的 t 检验与对照组(p 值调整为 4 次比较)
考虑到所有客户的平均折扣率为 36%,对提供的所有折扣进行完全重新分配会将所有客户置于理想的折扣频率范围内,而不会增加提供的折扣数量。这可能不如将折扣瞄准更有前景的客户那样实际,但无论哪种情况,都有一个强有力的论点,即一些折扣应该从过度折扣的客户重新分配给一些非折扣客户,以期对他们的购买行为产生有利影响。考虑到与较不频繁折扣的客户群相比,该客户群实际上表现不佳,并且通过将折扣重新分配给以前未折扣的客户,可以降低折扣客户群中 58%的平均折扣率,而不会对客户行为产生不利影响,这似乎是可能的,因为我们的测试表明,对任何给定客户提供 30–50%的订单折扣就足够了。
回答:
在 30-50%和 50-70%组的两个目标上都检测到显著的积极效果,在这些组之间没有检测到差异。这意味着为客户提供 30-50%的订单折扣是正确的选择,可以在不增加不必要的利润成本的情况下产生良好的客户行为。
结论
这项研究表明,向客户提供折扣对他们的购买行为有显著的积极影响,但超过某一点后,增加折扣的数量或频率不会进一步改善这些影响,只会降低订单的盈利能力。为了培养客户忠诚度和买家激励,Northwind Traders 应该为 30-50%的客户订单提供平均 5%的商品折扣。应根据流动性需求选择要应用折扣的项目。该公司可以通过将折扣从过度折扣、表现不佳的客户重新分配给有希望的非折扣客户,来增加折扣客户的数量,以期改善他们的购买行为。这样,他们也将有机会对事后收集的数据进行未来分析,以便对客户行为进行前后比较。
挪威人工智能国家战略已经启动!

摘要拍摄于挪威冬季的北极光。图片作者: @johnygoerend
1 月 14 日 AI 新战略发布当天的总结与回顾
这一天对我来说很特别,因为我一直在报道欧洲大部分的 AI 战略,今天我的祖国发布了他们自己的国家战略。挪威国家战略于 1 月 14 日发布,就在本文撰写的当天。我将尽我所能,对挪威地方政府和现代化部发布的文件 人工智能 国家战略的路径、提出的建议、总结和评论进行概述。
如果你想阅读欧洲其他人工智能战略的总结,你可以阅读下面链接的我的另一篇文章,或者你可以在阅读了挪威的总结后再回头看。
现有人工智能战略和 2020 年人工智能战略草案概述
medium.com](https://medium.com/@alexmoltzau/2020-and-the-european-national-strategies-for-artificial-intelligence-6b66a6b2adf9)
通向挪威战略的道路
在人工智能国家战略之前有不同的报告。政府在实施该战略的过程中概述了这些目标:
- 人工智能在国家助学贷款管理中的应用报告。来自通过使用人工智能实现更有效服务的概念化可能性(挪威报告),发表于 2017 年 11 月 27 日。
- 2018 年 3 月,挪威国家电子健康研究中心发布了一份名为健康分析:人工智能——电子健康服务的新可能性的报告。
- 2018 年 4 月 10 日,有 25 个欧洲国家签署了人工智能(AI)合作宣言。挪威是这样做的国家之一。这是欧盟数字单一市场的一个创举。
- 人工智能与隐私由挪威数据保护局(DPA)于 2018 年 6 月 22 日发布。该报告详细阐述了 2014 年报告中描述的法律意见和技术——大数据——压力下的隐私原则。
- Digital21 —挪威的一项战略,由挪威政府制定,旨在推动社会重要领域的科学价值创造和发展。该报告于 2018 年 8 月 31 日发布。人工智能被认为是挪威应该投资的四个战略领域之一。
- 人工智能:挪威的机遇、挑战和计划。该报告由挪威技术委员会撰写。发表于 2018 年 11 月 26 日。
因此,在该战略推出之前,挪威不同部门以及政府机构对人工智能的参与度越来越高。
2019 年,数字化部长在挪威(3 月至 9 月)四处旅行,以获得不同社区的建议。此外,来自各种企业和政府机构的近 50 份书面声明试图对该战略应包含的内容提出意见。
挪威的国家人工智能战略于 2020 年 1 月 14 日启动。

1.报告摘要
1.1 挪威政府的要点
政府很友好,用挪威语发布了他们的战略要点,我已经翻译成了英语:
- 向公共实体提供指导,以便它们在签订合同时能够更好地提出访问数据的要求。
- 评估在哪些领域要求私营部门的数据可以访问可能符合社会利益,并评估是否应该提出要求,以确定特许权应该是实现这一点的一种方式,特别是在对社会非常有益的领域。
- 就数据驱动的经济和创新向议会提交一份报告(白皮书),并成立一个专家小组,审查分享私营部门数据的先决条件和要求。
- 审查和评估可能阻碍人工智能的适当和想要的使用的规则。
- 建立一个隐私管理沙箱,让企业有可能在给定框架内尝试新技术。
- 为在 sprkbanken(处理挪威语数据)中收集更多挪威语资源做出贡献。
- 评估参与欧洲委员会下一个欧洲地平线框架和数字欧洲方案(DEP)的情况。
- 对大学有明确的期望,即根据劳动力市场的需求,调整人工智能领域的教育课程。
- 鼓励教育机构评估隐私和伦理如何在人工智能教育中占据中心位置。
- 在 NTNU 和挪威的“人工智能挑战”的密切合作下,启动了挪威的人工智能课程:“人工智能元素”。
- 在数字信息交换中心的不同论坛之间进行合作。
- 继续参与欧洲和国际论坛,以促进负责任和值得信赖地使用人工智能。
国家是这么说的。
然而,让我们更仔细地看看这份报告。
该战略针对公共和私营部门。
这一点值得注意,因为它不同于其他一些战略,例如英国人工智能行业的交易。
该战略使用了欧盟委员会人工智能高级专家组对人工智能的定义:
“人工智能系统基于解释和处理结构化或非结构化数据,以物理或数字方式执行操作,以实现给定的目标。这种系统还可以通过分析和考虑它们以前的行为如何影响它们的环境来调整它们的行为。”
除此之外,他们还使用“强”或“窄”,就像在线人工智能培训课程中出现的那样。

他们通过提出对人工智能概念的不同理解来开始策略,这似乎是一个引入一些对该主题没有先验知识的人的好方法。
善意和信任的另一个早期指标是数据的重用。分享是贯穿整个战略的一个主题:
“目前没有法定义务要求公共部门的数据可供其他人使用,但我们的目标是让可以公开访问的数据共享,以便其他人可以使用这些数据(我们称之为‘重用’)。”
北欧合作概述如下:
“北欧国家在人工智能方面有许多共同的利益和价值观。因此,北欧国家通过北欧部长理事会在与人工智能有关的若干领域开展合作。其中一个领域与数据有关。已经成立了一个工作组,以确定可以在北欧国家之间交换的数据集,并为北欧企业(公共和私营企业)创造附加值,同时仍然尊重道德方面以及北欧国家特有的信任和价值观。”
在这方面,提及北欧部长理事会宣布的北欧-波罗的海地区的现有合作可能是有益的:
2018 年起北欧-波罗的海地区的国际战略合作
medium.com](https://medium.com/@alexmoltzau/the-declaration-of-collaboration-on-ai-in-the-nordic-baltic-region-e61714270e23)
1.2 人工智能的科学研究
研究结果背后的数据对于尽可能多的政府和企业来说都是可访问的,这一点很重要。更好地访问研究数据可以提高创新和价值创造,因为研究人员可以查看新的使用案例。应该提供更多的研究数据集。这方面有三项原则:
- 研究数据必须尽可能开放,必要时也要封闭。
- 应该对研究数据进行管理和策划,以充分利用其潜在价值。
- 关于研究数据的归档和管理的决定必须在研究团体内部做出
挪威研究委员会有 14 亿挪威克朗用于信息和通信技术的研究、创新和先进应用。在过去的几年里,对人工智能、机器人和信息处理的资助急剧增加。
这里提到了几个卓越中心和挪威人工智能研究联盟(NORA)。

挪威越来越多地资助与行业相关的博士职位。在信通技术领域,人工智能领域的职位增长最快。
由 Telenor 建立的挪威开放人工智能实验室是一个特别值得一提的私人研究项目(捐赠 5000 万挪威克朗建立)。
数字欧洲方案(DEP)有 92 亿€,挪威是这一倡议的一部分。
在报告中,它明确表示,跨学科大学环境中的人工智能是必要的,并提到卑尔根和奥斯陆是这一过程中的早期适应者。
1.3 促进私营部门的数据共享
政府概述了在促进合作方面发挥积极作用的可能性(一种非常挪威化的方法),或在符合公共利益的情况下,在必要时强制要求分享:
- 自愿的数据共享更可取,特别是在对共享数据有共同兴趣的各方之间。
- 如果共享数据会提高公众利益,当局可以在企业本身看不到共享价值的情况下促进数据共享。
- 必要时可强制数据共享;例如出于公共利益的原因。
- 数据共享的方式必须让个人和企业保留对自己数据的控制权。隐私和商业利益必须得到保护。

在这方面,他们提到了德国 IDS 框架(国际数据空间),一些挪威实体是该框架的一部分。
在挪威,石油行业和地理数据内部共享数据,这两者都与挪威采掘业的主要收入密切相关。
1.4 数据共享的方法
数据共享是该战略的一大重点,它提到了不同的共享方法。他们提到了五种不同的方式:
- 数据湖:一个数据湖是存储数据的中央存储库,比如云服务。数据可以按原样以其原始格式存储,并且可以是结构化和非结构化数据的组合。数据不需要结构化或标记。然后,数据湖可用于检索机器学习或其他分析的数据。
- 数据信任。数据信任是一种法律结构,其中受信任的第三方负责共享数据。第三方根据建立数据信任的目的决定哪些数据应该与谁共享。
- ****匿名化接口。匿名化接口允许对包含来自多个数据源的个人数据的注册数据进行各种分析,而不能够识别个人。登记数据远程访问基础设施(RAIRD)是挪威社会科学数据服务局和挪威统计局在这种匿名化界面上的一个合作项目。RAIRD 的信息模型是开放的,任何人都可以使用。
- ****合成数据。在许多情况下,合成数据可以替代可识别数据或匿名数据。如果可以生成与原始数据集具有相同特征的合成数据集,则它们可以用于训练算法或用作测试数据。这意味着,即使是通常被视为敏感的数据集也可以公开获取,用于研究和创新。
- ****通用开放应用编程接口。应用程序编程接口(API)使得直接在数据源中搜索以检索所需数据成为可能。这是能够实时使用数据的先决条件。数字化通知规定,公共机构必须以机器可读且最好是标准化的格式提供适当的信息,最好是使用 API。

1.5 报告中的示例
当你阅读这份报告时,你会看到几个正在进行的不同项目的例子或来自其他政府文件的信息。一个突出的例子是正在挪威试点的电动自主船(航运是挪威工业的一个重要方面)。
1.6 技术基础设施
报告中有一个章节专门讨论了基础设施,并特别提到了向 5G 网络的过渡以及 5G 基础设施的扩展。它提到这将有助于:
- 自动驾驶和自动驾驶汽车、公共汽车、卡车、无人机、火车和轮船
- 智能交通管理,控制和影响交通行为
- 需要更换和维护基础设施的预警
- 出行行为预测
- 更高级的路线优化

提到了国际协作 euro HPC(HPC—高性能计算)。很明显,挪威在 EuroHPC 的持续合作将取决于地平线和 DEP 的持续支持。
挪威政府希望挪威成为一个吸引数据中心的目的地。
根据该战略,去年在挪威建立的数据中心有所增加。这也很有吸引力,因为它可以提供“可扩展的可持续能源”。
1.7 公众理解
在北欧其他地方推出的一个伟大的计划是人工智能的课程要素,超过 1%的芬兰人已经采用了这一计划。瑞典开始就选修这门课程的人数展开竞争,现在挪威(终于)紧随其后。
1.8 公共部门的创新
目前政府中有一些机制,如创新挪威和 Siva。对人工智能的关注将会增加。有几个数字创新中心与 2016 年启动的欧盟委员会相连,根据挪威的战略,这种对更大的中心和连通性的承诺可能会在 2021-2027 年更广泛的欧盟战略中增加。有一个委员会正致力于解决有关挪威标准化和要求的问题(以及影响或参与国际标准的工作)。
1.9 AI 能贡献什么?
政府概述了人工智能可以为以下方面做出的贡献:
- 为不同生活状况的公民提供更多相关建议和服务
- 为公共部门员工提供更好的决策支持
- 合理化流程和优化资源利用
- 通过自动检测可能的偏差来提高流程和服务质量
- 基于来自机构及其环境的数据预测趋势
- 处理自然语言,用于排序和分类,以及在不同语言和语言形式之间进行翻译
政府希望不同的机构和单位开始尝试人工智能(特别是概念验证)。
挪威政府每年购买约 5000 亿挪威克朗的服务,其中一些服务必须是创新的。挪威政府发起了一项倡议,旨在加强挪威政府与创业公司之间的合作。

1.10 道德永存
报告的最后一部分是伦理(有点担心这是后来才想到的)。
- 基于人工智能的解决方案必须尊重人类的自主和控制
- 基于人工智能的系统必须是安全的,并且在技术上是健壮的
- 人工智能必须考虑隐私和数据保护
- 基于人工智能的系统必须透明
- 人工智能系统必须促进包容性、多样性和平等待遇
- 人工智能必须有益于社会和环境
- 有责任
提到了消费者权利、GDPR 和国际伦理合作(联合国、欧盟和经合组织等。),虽然只是短暂的。
2.对报告的简短评论
2.1 伟大的方面
鉴于这是一份来自政府的公开报告,非常重要的是,它强调要求共享数据,如果这符合公众的利益。此外,与大多数其他报告相比,公民得到了更多的考虑和保护。这当然是报告的一个优点,必须大力赞扬。除此之外,公共部门和私营部门之间的合作也很突出,通过例子在战略中的几个地方概述了一些倡议。
将土著萨米语以及挪威语的不同变体纳入人工智能开发的重点也是一个很好的考虑。总的来说,这似乎是一个经过深思熟虑的策略,很少有“疯狂的数字”不断关注人工智能将为一切带来的惊人好处,相反,这是一种非常实用的方法来理解政府如何努力促进。祝贺挪威的这一战略是合理的。
2.2 不太好
该战略以气候变化开始,但在该战略的大部分时间里没有提到如何解决这个问题。数字化部长的开场白如下:
很难预测未来,但我们知道挪威将受到老龄化浪潮、气候变化和日益全球化的影响,在未来几年,我们必须更聪明、更有效地工作,以保持竞争力和相同的福利水平。数字化和新技术是实现这一目标的关键,而人工智能将是至关重要的组成部分。
因此,在第一句中就提到了这一点,预计它将在国家战略中得到贯彻。
在人工智能的国家战略中,明显缺乏对气候危机或供应链可持续性的明确责任,这是令人担忧的,不符合历史的,倒退的和荒谬的。事实上,也许甚至对我们的时代一无所知,这不是挪威政府的新方法,因为他们经常泛泛地说一件事,而在实践中做完全不同于气候危机的事情。
尽管如此,在大多数国家战略中,也许最重要的成功因素(如果我们考虑社会和环境)被完全忽略,这在其他战略中并不罕见。它如何解决当前的气候危机?这方面的一个重要例外是法国的战略。****
法国人工智能战略如何应对气候危机?
medium.com](https://medium.com/dataseries/the-french-ai-strategy-and-the-climate-crisis-4890b22067a5)
我之前提到过,在这个策略流程中有一些意见。
政府应该从循环经济在 2019 年 8 月 2 日向政府提交的评论中得到启示。挪威工程师和技术专家协会(NITO)就气候和环境发表了类似的评论。必须考虑服务的生命周期,这包括电子产品。这一评论在所有情况下都被完全忽略,如果将它包括在内,它将大大加强该战略。
尽管如此,抛开所有的批评:
祝贺挪威的人工智能国家战略!

我非常兴奋地看到在接下来的时间里这将如何跟进。
毫无疑问,这将是非常令人兴奋的,并将许多社区聚集在一起。
在一篇评论中对这样一个伟大的战略给予如此严厉的批评是不公平的,然而,重要的是我们要把重点放在正确的领域:在我们工作的每个行业中尽我们所能共同恢复我们的星球。**
这是#500daysofAI,您正在阅读第 224 条。500 天来,我每天都在写一篇关于或与人工智能相关的新文章。我目前 100 天 200-300 的重点是人工智能的国家和国际战略。
PS:你可能注意到文章上写的是 1 月 15 日,但那是因为我在发布当天熬夜写这篇文章。
用于物体检测的深度学习算法的基本原理
本文原载于 数据来自 。更多喜欢的,请关注我们!
你刚刚得到一架新的无人机,你想让它超级智能!也许它应该检测工人是否正确佩戴头盔,或者工厂屋顶的裂缝有多大。
在这篇博客文章中,我们将研究对象检测的基本方法(穷举搜索、R-CNN、快速 R-CNN 和更快 R-CNN),并尝试了解每个模型的技术细节。最精彩的部分?我们将在没有任何公式的情况下完成所有这些工作,让所有经验水平的读者都可以跟着做!
最后,我们将在这篇文章之后发表第二篇文章,深入探讨单次检测器(SSD)网络,看看如何在无人机上进行部署。

检测螺母和螺栓——感谢克里斯·耶茨(Unsplash)
我们探测物体的第一步
它是一只鸟吗?它是一架飞机吗? — 图像分类

猫?狗?图像信用
目标检测(或识别)建立在图像分类的基础上。图像分类的任务是——你猜对了——将图像分类(通过如上所示的像素网格)到一个类别中。为了复习图像分类,我们让读者参考这篇文章。
对象识别是对图像中的对象进行识别和分类的过程,如下所示:

为了使模型能够学习图像中对象的类别和位置,目标必须是五维标签(类别,x,y,宽度,长度)。
物体检测方法的内部工作原理
一种计算量很大的方法:穷举搜索
最简单的对象检测方法是对图像的各个子部分使用图像分类器。你可能会问,是哪些?让我们逐一考虑一下:
1.首先,获取您想要对其执行对象检测的图像。

2.然后,将此图像分成不同的部分或“区域”,如下所示:

3.将每个区域视为一个单独的图像。
4.使用经典图像分类器对每张图像进行分类。
5.最后,对于已经检测到一个对象的每个区域,将所有图像与预测标签相结合。

这种方法的一个问题是对象可能具有不同的纵横比和空间位置,这可能导致大量区域的不必要的昂贵计算。它在计算时间方面存在太大的瓶颈,不能用于现实生活中的问题。
区域建议方法和选择性搜索
最近的方法是将问题分解为两个任务:首先检测感兴趣的区域,然后执行图像分类以确定每个对象的类别。
第一步通常包括应用区域提议方法。这些方法输出可能包含感兴趣对象的边界框。如果在一个区域提议中已经正确地检测到了对象,那么分类器也应该检测到它。这就是为什么这些方法不仅要快,而且要有很高的召回率。
这些方法还使用了一个聪明的架构,其中图像预处理的一部分对于对象检测和分类任务是相同的,这使得它们比简单地链接两个算法更快。最常用的区域提议方法之一是 选择性搜索 :
其第一步是应用图像分割 ,如下图所示:

图像分割— 图像信用
从图像分割输出中,选择性搜索将依次:
- 从分割的部分创建边界框,并将它们添加到区域提议列表中。
- 基于四种相似性类型:颜色、纹理、大小和形状,将几个小的相邻片段组合成较大的片段。
- 回到第一步,直到该部分覆盖整个图像。

分层分组— 图像信用
既然我们已经了解了选择性搜索是如何工作的,那么让我们介绍一些利用它的最流行的对象检测算法。
第一对象检测算法:R-CNN
罗斯·吉希克等人。提议的区域 CNN (R-CNN)允许选择性搜索和 CNN 的结合。实际上,对于每个区域提议(论文中的 2000),一个前向传播通过 CNN 产生一个输出向量。这个向量将被馈送到一个一对一分类器(即每类一个分类器,例如一个分类器,其中如果图像是狗,标签= 1,如果不是狗,标签= 0;第二个分类器,其中如果图像是猫,标签= 1,如果不是猫,标签= 0,等等),【SVM】是 R-CNN 使用的分类算法。
但是你如何给地区提案贴标签呢?当然,如果它完全符合我们的基本事实,我们可以将其标记为 1,如果给定的对象根本不存在,我们可以将其标记为 0。如果一个物体的一部分出现在图像中呢?我们应该将区域标记为 0 还是 1?为了确保我们在预测图像时训练我们的分类器在我们实际上可以拥有的区域上(而不仅仅是完美匹配的区域),我们将查看由选择性搜索和基本事实预测的框在并集 (IoU)上的交集:
IoU 是一个指标,由预测框和实际框之间的重叠面积除以它们的联合面积来表示。它奖励成功的像素检测,惩罚假阳性,以防止算法选择整个图像。

欠条— 图像信用
回到我们的 R-CNN 方法,如果 IoU 低于给定阈值(0.3),那么相关联的标签将是 0。
在对所有区域提议运行分类器之后,R-CNN 提议使用特定于类的 bbox 回归器来改进边界框(bbox)。bbox 回归器可以微调边界框边界的位置。例如,如果选择性搜索检测到了一只狗,但只选择了它的一半,则知道狗有四条腿的 bbox 回归器将确保选择整个身体。
同样感谢新的 bbox 回归预测,我们可以使用 非最大抑制 (NMS)来丢弃重叠的建议。这里的想法是识别和删除同一对象的重叠框。NMS 对每个类别的每个分类分数的建议进行排序,并计算具有最高概率分数的预测框与所有其他预测框(同一类别)的 IoU。然后,如果 IoU 高于给定阈值(例如,0.5),则它丢弃提议。然后对下一个最佳概率重复这个步骤。

非最大抑制— 图像信用
综上所述,R-CNN 遵循以下步骤:
- 从选择性搜索中创建区域建议(即,预测图像中可能包含对象的部分)。
- 通过预先训练的模型运行这些区域,然后通过 SVM 对子图像进行分类。
- 通过边界框预测运行正预测,这允许更好的框精度。
- 在预测消除重叠建议时应用 NMS。

R-CNN 网络— 图片来源
然而,R-CNN 也有一些问题:
- 这种方法仍然需要对所有的区域提议进行分类,这可能导致计算瓶颈——它不可能用于实时用例。
- 在选择性搜索阶段没有学习发生,这可能导致对于某些类型的数据集的坏的区域建议。
边际改进:快速 R-CNN
快速 R-CNN——顾名思义——比 R-CNN 更快。它基于 R-CNN,有两个不同之处:
- 没有为每个地区的提议向 CNN 发送信息,而是只向 CNN 发送一次,取整幅图像生成一个卷积特征图(取一个像素矢量,用一个过滤器将其转换成另一个矢量,这将给出一个卷积特征图——你可以在这里找到更多信息)。接下来,使用选择性搜索来识别提议区域,然后使用兴趣池区域( RoI pooling )层将它们重新整形为固定大小,以便能够用作完全连接层的输入。
- Fast-RCNN 在其区域建议分类中使用 softmax 层而不是 SVM ,这样速度更快,精确度更高。
以下是网络的架构:

快速 R-CNN 网络— 图片来源
正如我们在下图中看到的,快速 R-CNN 在训练和测试方面比 R-CNN 快得多。然而,由于选择性搜索方法,瓶颈仍然存在。

R-CNN vs 快速 R-CNN — 图片来源
R-CNN 能有多快?—更快的 R-CNN
虽然快速 R-CNN 比 R-CNN 快得多,但选择性搜索的瓶颈仍然存在,因为它非常耗时。因此,任等人。想出了更快的 R-CNN 来解决这个问题,并提出用一个非常小的卷积网络来代替选择性搜索,这个网络叫做区域提议网络 (RPN)来找到感兴趣的区域。

区域提案网— 形象信用
简而言之,RPN 是一个小型网络,可以直接找到地区提案。
一种简单的方法是创建深度学习模型,该模型输出 x_min、y_min、x_max 和 x_max,以获得一个区域提议的边界框(因此,如果我们想要 2,000 个区域,则输出 8,000 个)。然而,有两个基本问题:
- 这些图像可能有非常不同的大小和比例,因此创建一个正确预测原始坐标的模型可能会很棘手。
- 在我们的预测中有一些坐标排序约束(x_min < x_max, y_min < y_max).
To overcome this, we are going to use anchors:
锚点是图像中不同比例和比例的预定义框。例如,对于给定的中心点,我们通常从三组尺寸(例如,64px、128px、256px)和三个不同的宽/高比(1/1、2/1)开始。在这个例子中,对于图像的一个给定像素,我们最终会有九个不同的盒子(盒子的中心)。

锚点—比率和比例— 图像信用
那么一张图片我总共有多少个锚呢?
最重要的是要明白,我们不是要在原始图像上创建锚点,而是在最后一个卷积层的输出特征图上创建锚点。例如,对于 1,000600 的输入图像,我们每个像素有一个锚点,因此 1,000600*9 = 5,400,000 个锚点,这是错误的。事实上,因为我们要在特征图上创建它们,所以要考虑子采样率(这是由于卷积层中的步长而导致的输入和输出维度之间的因子减少)。
在我们的例子中,如果我们把这个比率取为 16(像在 VGG16 中),我们将在特征图的每个空间位置有 9 个锚点,所以“仅仅”大约 20,000 个锚点(5,400,000 / 16)。这意味着输出特征中的两个连续像素对应于输入图像中相距 16 个像素的两个点。注意,这个下采样比是更快的 R-CNN 的可调参数。

主播中心— 图片来源
现在剩下的问题是如何从那 20,000 个主播到 2,000 个区域提案(取与之前相同数量的区域提案),这是我们 RPN 的目标。
如何训练区域提案网络
为了实现这一点,我们希望我们的 RPN 告诉我们一个盒子是否包含一个对象或者是一个背景,以及对象的准确坐标。输出预测是作为背景的概率、作为前景的概率以及δDx、Dy、Dw、Dh,它们是锚和最终提议之间的差异)。
- 首先,我们将移除跨界锚点(即,由于图像的边界而被切割的锚点),这给我们留下了大约 6000 个图像。
- 如果存在以下两种情况之一,我们需要将锚标记为阳性:
→在所有其他主播中,主播的 IoU 最高,带有地面真相框。
→主播至少有 0.7 的 IoU 带地面真相箱。
- 如果 IoU 小于 0.3,我们需要将我们的锚标为负。
- 我们忽略所有剩余的锚。
- 我们训练二元分类和包围盒回归调整。
最后,关于实现的几点说明:
- 我们希望在我们的小批量中,正负锚的数量保持平衡。
- 我们使用多任务损失,这是有意义的,因为我们希望最小化任一损失——错误预测前景或背景的误差,以及我们盒子中的准确性误差。
- 我们使用来自预训练模型的权重来初始化卷积层。
如何使用区域提案网络
- 所有锚点(20,000)都被评分,因此我们得到新的边界框以及它们成为前景(即,成为对象)的概率。
- 使用非最大抑制(参见 R-CNN 部分)
- 提案选择:最后,只保留按分数排序的前 N 个提案(N=2,000,我们回到我们的 2,000 个区域提案)。
像以前的方法一样,我们最终得到了 2000 个建议。尽管看起来更复杂,这个预测步骤比以前的方法更快更准确。
下一步是创建一个类似于快速 R-CNN 的模型(即 RoI 池和一个分类器+ bbox 回归器),使用 RPN 代替选择性搜索。然而,我们不想完全像以前那样,即接受 2,000 份建议,对它们进行筛选,然后通过预先训练好的基础网络进行传递。相反,重用现有的卷积特征图。事实上,使用 RPN 作为建议生成器的优点之一是在 RPN 和主检测器网络之间共享权重和 CNN。
- 使用预先训练的网络来训练 RPN,然后对其进行微调。
- 使用预先训练的网络来训练检测器网络,然后进行微调。使用来自 RPN 的建议区域。
- RPN 使用第二个模型的权重进行初始化,然后进行微调——这将是我们最终的 RPN 模型。
- 最后,对检测器网络进行微调(RPN 权重固定)。CNN 的特色地图将在两个网络之间共享(见下图)。

更快的 R-CNN 网络— 图片来源
综上所述,更快的 R-CNN 比以前的方法更准确,比 Fast-R-CNN 快 10 倍左右,这是一个很大的进步,也是实时评分的开始。

R-CNN vs 快速 R-CNN vs 更快 R-CNN — 图片来源
尽管如此,区域提议检测模型对于嵌入式系统来说是不够的,因为这些模型很重,并且对于大多数实时评分情况来说不够快——最后一个例子大约是每秒五幅图像。
在我们的下一篇文章中,我们将讨论更快的方法,如 SSD 和无人机图像检测的真实用例。
我们很高兴能为数据仓库决策支持系统研究这一主题——查看以下附加资源以了解更多信息:
- 针对大台库 DSS 项目的对象检测插件,
- 我们在大台库用目标探测算法赢得了一场北约挑战赛。
英伟达数据科学访谈
英伟达数据科学面试问题

NVIDIA 公司是美国科技巨头,总部设在加利福尼亚州的圣克拉拉。NVIDIA 为不断扩大的游戏和专业市场设计图形处理单元(GPU),并为移动计算和汽车市场设计片上系统单元(SOC)。英伟达的数据科学家在其产品中利用最先进的数据科学技术,最终用于专业可视化、数据中心、人工智能、虚拟现实和无人驾驶汽车。
除了是一家数据驱动的公司,NVIDIA 还帮助各行各业的数据科学家(医学、金融、运营等)。)更好地利用他们的数据和增强的性能。借助 RAPIDS(一个运行在 Nvidia GPUs 上的 Nvidia 开源端到端 GPU 加速数据科学库)和 DGX GPU 系列等产品,NVIDIA 为数据科学家、机器学习/深度学习科学家和开发人员提供了完成工作所需的计算能力。[1]
NVIDIA 的数据科学角色
NVIDIA 数据科学家的角色因具体团队、产品和功能而异。一般来说,NVIDIA 的数据科学家职能和角色可能跨越广泛的数据科学概念,但主要专注于机器学习和深度学习。这意味着深入了解在云计算集群上开发解决方案,同时大规模部署 ML 和 DL 模型。
所需技能
- 计算机科学,数据科学,电子/计算机工程,物理,数学,其他工程领域的硕士/博士。
- 3 年以上(高级职位 8 年以上)Python、C++软件开发工作或研究经验。
- 对 TensorFlow、PyTorch、XGboost、Scikit-learn 或 Spark 等框架的机器学习/深度学习算法有丰富的经验。
- 精通以下任何一种 C、Python、Scala、SQL、Java 或 C++编程语言的使用。
- 能够在云环境中构建 ETL 管道。
- 能够与跨组织的多个级别和团队紧密合作(工程、产品、销售和营销团队)。
- 有效的口头/书面沟通和技术演示技巧
什么样的数据科学角色?
NVIDIA 没有专门的数据科学部门,但有各种各样的数据科学团队,每个团队都有自己独特的流程。有一个数据科学团队在数据中心工作,在 RAPIDS 有一个数据团队,还有一个人工智能驱动的汽车团队和软件开发团队。NVIDIA 的数据科学家角色可能略有不同,在某些情况下会重叠。
根据团队的不同,数据科学家的职能可能会从担任深度学习工程师延伸到担任专注于计算机视觉的研究科学家。
基本职责包括:
- 开发并向客户展示基于 NVIDIA 最新 ML/DL、数据科学软件和硬件技术的解决方案
- 执行深入的分析和优化,以确保 GPU 架构系统的最佳性能。
- 将深度学习解决方案应用于对象检测、分割、视频理解、序列预测、自适应计算、记忆网络、简化精度训练和推理、图形编译器、强化学习、搜索、分布式和联合训练等领域。
- 与主要行业合作伙伴/客户开发人员合作,提供适用于其产品和技术的 ML 解决方案。
- 与工程、产品和销售团队合作,确保客户的设计成功。
- 与客户的数据科学、ML/DL 开发人员和 IT 团队紧密合作。
英伟达面试流程

像大多数科技公司一样,NVIDIA 的数据科学招聘流程从招聘的初始电话筛选开始,然后是团队经理的技术电话筛选。完成技术电话筛选后,您将进入现场面试,包括 7 次与招聘经理、团队成员和产品经理的一对一面试(每次持续 30 到 60 分钟)。
初始屏幕
这是一个以简历为基础的对人力资源或招聘经理的电话面试。这次面试是探索性的,需要浏览你的简历和过去的相关项目,以确定你是否适合这个职位/团队。
技术屏幕
在最初的电话筛选之后,将安排与数据科学家的技术访谈。这个采访时长在 45 到 60 分钟之间,围绕现实生活中的 NVIDIA 问题进行提问。期望深入解释你的机器学习经验,并谈论你可能如何设计 ML 或 DL 系统并扩展该过程。
现场面试
现场面试是 NVIDIA 数据科学家招聘流程的最后一个面试阶段。Nvidia 数据科学家的现场面试流程包括 7 轮面试,要么是一对一,要么是由团队成员、团队经理和产品经理组成的面试小组,每轮面试持续 45 到 60 分钟。
这次采访结合了各种数据科学概念,包括数据分析、软件工程、机器学习和英伟达的核心文化和价值观。对于技术问题,考生需要在 NVIDIA 提供的白板或笔记本电脑上进行编码练习。
这次采访中的问题跨越了高级统计概念到深度学习的实施和设计。对于技术方面,记得练习用编译器语言以及 Python 进行编码,还要练习 Tensorflow,Keras,或者其他深度学习框架中关于机器学习算法和编码的问题。
你可以在面试查询上像下面这样练习机器学习问题:
假设我们在西雅图有 100 万次 app rider 旅程。我们希望建立一个模型来预测乘客提出乘车请求后的预计到达时间。
我们如何知道我们是否有足够的数据来创建一个足够准确的模型?
最后的提示
- 有 GPU 开发经验真的很有帮助。这意味着 GPGPU 编程和设计实践,或者在某种数据科学领域为潜在竞争对手工作,如英特尔、AMD 等。
- NVIDIA 一直在通过他们的 GPU 和芯片开发打破技术壁垒。这通常是通过雇佣研究人员或学术界以外的人来完成的,这些人在某个技术领域或行业领域建立了思想领导力的记录。这也意味着他们愿意为此支付一笔不菲的总薪酬。
英伟达数据科学面试问题
- 给定一个时间序列数据集,您将如何检测异常?
- 真阳性和假阳性有什么区别?
- 在 Tensorflow 中实现梯度下降。
- 设计一个从数据集到生产部署的端到端推荐引擎。
- 写下线性回归的方程式。
- 解释决策树是如何工作的。
感谢阅读
- 你可以在面试查询 上找到更多英伟达的面试问题
- 查看我的 Youtube 频道 了解更多数据科学内容、采访和解决问题的技巧&。
- 在面试查询博客上找到更多数据科学面试指南,如 谷歌数据科学家面试 和DoorDash 数据科学家面试 。
参考文献【1】深度学习 AI
【https://www.interviewquery.com】原载于 2020 年 4 月 15 日。
回归中自由度的官方定义

计算岭回归中参数的有效数量等
早在初中和高中,你可能已经学会了计算数据集的平均值和标准差。而你的老师大概告诉过你,标准差有两种:总体和样本。两者的公式只是彼此之间的微小变化:

标准差的不同公式
其中μ是总体平均值,x-bar 是样本平均值。通常情况下,人们只是学习公式,并被告知何时使用它们。如果你问为什么,答案是含糊的,比如“在估计样本均值时,有一个自由度被用完了。”没有“自由度”的真正定义
自由度在统计学的其他几个地方也有表现,比如:做 t 检验,f 检验,χ检验,一般研究回归问题的时候。根据不同的情况,自由度可能意味着微妙不同的东西(据我统计,维基百科的文章列出了至少 9 个密切相关的定义)。
在本文中,我们将关注回归环境中自由度的含义。具体来说,我们将使用“自由度”是模型的“有效参数数”的含义。我们将了解如何计算上述标准偏差问题的自由度,以及线性回归、岭回归和 k-最近邻回归。我们还将简要讨论与统计推断(如 t 检验)和模型选择(如何使用有效自由度比较两个不同的模型)的关系。
自由度
在回归上下文中,我们有 N 个样本,每个样本都有一个实值结果值 y 。对于每个样本,我们都有一个协变量向量 x ,通常包含一个常数。换句话说,对于每个样本,x-向量的第一个条目是 1。我们有某种模型或程序(可以是参数化的或非参数化的)来拟合数据(或者使用数据)以产生关于我们认为 y 的值应该被给定为一个x-向量(可以是样本外的或者不是样本外的)的预测。
结果是 N 个样本中每个样本的预测值 y-hat。我们将定义自由度,用ν (nu)表示:

自由度的定义
我们将自由度解释为模型的“有效参数数”。现在让我们看一些例子。
平均值和标准偏差
让我们回到我们开始的学龄问题。计算样本的平均值就是预测每个数据点的值都等于平均值(毕竟,这是在这种情况下你能做出的最佳猜测)。换句话说:

作为预测问题的均值估计
注意,估计平均值相当于运行一个只有一个协变量的线性回归,一个常数:x = [1]。希望这能让我们明白为什么我们可以把这个问题重铸为一个预测问题。
现在很容易计算自由度。不出所料,我们有 1 个自由度:

为了理解与标准差的关系,我们必须使用自由度的另一个密切相关的定义(我们不会深入讨论)。如果我们的样本是独立同分布的,那么我们可以非正式地说,我们从 N 个自由度开始。我们在估计平均值时损失了一个,剩下 N–1 个作为标准差。
标准线性回归
现在让我们把它扩展到常规的旧线性回归的环境中。在这种情况下,我们喜欢将样本数据收集到向量 Y 和矩阵 x 中。在本文中,我们将使用 p 来表示每个样本的协变量数量( x 向量的长度)。
自由度的数量最终会是 p ,这不应该成为剧透。但是,当我们转向岭回归时,用于计算这一点的方法将对我们有所帮助。
如果我们像往常一样在模型中包含一个常数,那么 p 协变量的计数就包含一个常数。X 矩阵中的每一行对应于我们样本中每个观察值的 x- 向量:

我们的响应矩阵 y(n⨉1 向量)和设计矩阵 x(n⨉p 形状)
模型是有 p 个参数集合成一个向量β。Y = Xβ加上误差项。我们将讨论推导过程,因为它对我们以后会有用。我们选择使误差平方和最小的β估计值。换句话说,我们的损失函数是

线性回归的损失函数
第一次求和是根据具有由 i 标记的行向量 x 的每个样本。为了优化 l,我们对向量β进行微分,得到一个 p⨉ 1 向量的导数。

设其等于 0,求解β

并最终形成我们的估计

我们对 Y 的估计,用一个帽子矩阵
我们称矩阵 H 为“帽子矩阵”,因为它在 Y 上“戴上了帽子”(产生我们的拟合/预测值)。帽子矩阵是 N⨉N 矩阵。我们假设 y 轴是独立的,因此我们可以计算有效自由度:

标准线性回归的自由度
其中第二个和在矩阵的对角项上。如果你写出矩阵,写出样本 1 的预测值的公式,你会看到这些导数实际上只是帽子矩阵的对角线元素。一个矩阵的对角线之和称为矩阵的迹 ,我们在第二行中表示了这一点。
计算轨迹
现在我们转向计算 H 的轨迹。T7 我们最好希望是 p !
利用迹的循环性,有一个简单的方法来计算 H 的迹。但是我们将采用另一种方法,当我们讨论岭回归时,这种方法将被推广。
我们使用 x 的奇异值分解(关于奇异值分解和我们将要做的线性代数的几何解释,见我的早期文章)。矩阵的迹是一个与基无关的数,所以我们可以为包含 y 的向量空间选择我们想要的任何基,同样,我们也可以为包含参数β的向量空间选择我们想要的任何基。奇异值分解表示存在一个基使得矩阵 X 是对角的。第一个 p 行中对角线上的条目称为奇异值。线性回归的“无完美多重共线性”假设意味着没有奇异值为 0。矩阵的其余 N-p 行都是全 0。

x 使用奇异值分解给出的基
现在很容易计算 h。您只需手动乘以 X 的版本,并获得一个对角矩阵,其中第一个 p 对角元素全为 1,其余为 0。未显示的条目(非对角线的条目)也全部为 0。

帽子矩阵使用由奇异值分解给出的 Y 的基
所以我们得出 Tr(H) = p 。
标准差的模拟:标准误差
在我们之前的示例(平均值和标准差)中,我们在计算平均值后计算标准差,使用n–1作为分母,因为我们“失去了 1 个自由度”来估计平均值。
在这种情况下,标准偏差被重命名为“标准误差”,但公式看起来应该类似:

就像之前一样,我们比较每个测量值 y 和它的预测值之差的平方和。我们用完了 p 个自由度来计算估计值,所以只剩下 N-p 个。
里脊回归
在岭回归中,我们在损失函数中加入了一个正则项。如果处理得当,这将增加我们系数的偏差,但减少方差,从而降低我们预测的总体误差。
使用我们对自由度的定义,我们可以计算岭回归中参数的有效数量。我们期望正则化将这降低到参数的原始数量 p 以下(因为它们不再自由变化)。
我们通过与线性回归中相同的步骤来计算帽子矩阵。
- 损失函数得到一个额外的项,它具有一个固定的、已知的超参数λ,用于设置正则化的量。

2.我们求导,设为 0,求解β。I 是这里的单位矩阵

3.我们计算拟合值并提取帽子矩阵 H 。公式和上次一样,除了我们在括号里给矩阵的每个对角元素加λ。

4.我们使用奇异值分解来为包含 Y 和β的向量空间选择基,这样我们可以将 X 写成对角矩阵,并计算 h。

这给我们留下了根据由 i 索引的奇异值 d 【T5,的正则(λ = 0)回归和岭回归(λ>0)的自由度的以下公式。

讨论
使用奇异值分解的上述计算为我们提供了一个很好的岭回归的视角。
首先,如果设计矩阵是完全(多)共线的,则其奇异值之一将为 0。发生这种情况的常见情况是协变量多于样本。这是常规回归中的一个问题,因为这意味着 hat 矩阵中括号中的项是不可逆的(在上面的公式中分母是 0)。岭回归通过给每个平方奇异值添加一个正项来解决这个问题。
其次,我们可以看到,对于奇异值较小的项,系数收缩率较高。这些术语对应于在常规回归中具有高方差的β估计的成分(由于回归变量之间的高相关性)。另一方面,对于具有较高奇异值的项,收缩相对较小。
我们所做的自由度计算完美地概括了这种收缩,为我们实际使用的有效参数数量提供了一个估计值。另请注意,奇异值是设计矩阵 X 的函数,而不是 y 的函数。这意味着,理论上,您可以通过计算所需有效参数的数量来选择λ,并找到λ来实现这一点。
推理和模型选择
在我们的普通回归示例中,我们看到标准误差(或标准偏差)可以通过假设我们从 N 个自由度开始并减去我们使用的有效参数的数量来计算。这对于岭来说不一定有意义,它给出了系数的有偏估计量(尽管对于正确选择的λ具有较低的均方误差)。特别是,残差不再很好地分布。
相反,我们可以使用我们的有效参数数量插入到 AIC (Akaike 信息标准),这是模型选择的交叉验证的替代方法。AIC 惩罚模型有更多的参数,并接近预期的测试误差,如果我们要使用一个坚持测试集。那么选择λ来优化它可以代替交叉验证,只要我们在 AIC 的公式中使用有效自由度。然而,请注意,如果我们在计算 AIC 之前自适应地选择λ,那么会增加额外的有效自由度。
k 近邻回归
作为最后一个例子,考虑 k-最近邻回归。显然,每个数据点的拟合值是 k 个附近点的平均值,包括它本身。这意味着自由度是

k 近邻的自由度
这使我们能够在不同类型的模型之间进行模型比较(例如,使用上述 AIC 将 k-最近邻与岭回归进行比较)。
我希望您看到自由度是一个非常通用的度量,可以应用于所有种类的回归模型(核回归、样条等)。).
结论
希望这篇文章能让你对自由度有一个更坚实的理解,让整个概念不再是一个模糊的统计概念。我提到了自由度还有其他密切相关的定义。另一个主要版本是几何思想。如果你想了解更多,请阅读我的文章《T2 线性回归的几何方法》。如果你想了解更多我们用来计算自由度的代数,请阅读非代数方法的奇异值分解。
参考
笔记
[1]具体来说,我正在计算(a)随机向量的几何定义;(b)概率分布的密切相关的自由度;(c) 4 个回归自由度公式;和(d)剩余自由度的 3 个公式。你可能会有不同的看法,但是希望你能明白我的观点,有几个密切相关的想法和公式有细微的区别。
在数据科学中,数据质量值得更多的关注
忘记 PCA,超参数调整和集成算法

约书亚·索蒂诺在 Unsplash 上拍摄的照片
介绍
数据科学、机器学习、人工智能,这些术语充斥着新闻。自动化、新的储蓄或更高的收入、新的功能、市场或技术的承诺让每个人都兴奋不已。其中一些承诺是有根据的,而另一些则仍处于初始阶段或尚未通过概念验证阶段(换句话说,它们只是处于梦遗阶段)。
我们用来提取、转换和加载数据的技术有了重大改进。新的和改进的算法或技术,如 PCA、超参数优化和设计,如神经网络,带来了结果的改善。但是有一个方面没有得到足够的重视,反派小鸭子。如果你习惯于处理数据,你可能已经猜到了。如果不是,接下来你就知道了。让我们开始吧。
数据科学中最不受欢迎的一个
除了钱之外,商业和研究的核心是数据。数据是新的石油,还是新的电力取决于你问谁。关键资产。计算机使收集、分享和分析变得容易,现在它是一种战略资产。
但是有一个方面没有得到充分的讨论,那就是它的质量。数量,无论是大数据还是小数据,如果数据质量差,都无所谓。
垃圾进,垃圾出
无论你的数据管道有多好,你的清理和训练/测试模型有多好,无论你的假设有多强,或者你的算法有多复杂,如果你的数据不好或者质量差,你的工作都不会有任何价值。那就是著名的“垃圾进,垃圾出”。用成熟的原料是烤不出好蛋糕的。
此流程提供了另一种查看数据质量的方式:
数据质量→信息质量→决策质量→业务成果

nickslicktricks 在 Reddit 上的原创模因模板——文章作者对问题进行了调整
当我们谈论糟糕的数据时,我们谈论的是什么
要找到坏数据,需要知道要找什么。业界大多定义 6 到 7 个维度来量化数据质量。尽管维度的数量可以根据需要、行业和关注点而变化。
一个简单的缩写将是 ACCCUT。我们来回顾一下:
一种精确性。每个数据点都应该有正确的值。例子:正确拼写的名字,真实记录的事件。
C 完整。数据记录应包含所有必需的信息。可选元素是…可选的。示例:姓名&电子邮件是必填项,但实际地址是可选的。
协调一致。任何给定的数据点在整个组织及其所有系统中都应该是相同的。示例:来自客户关系管理工具的记录应该与财务工具相匹配。
C 一致性。数据记录应遵循标准(格式、大小、类型等)。示例:名称、日期格式的规则。
独特性。没有重复。这是防止混淆或使用过期记录的关键。当面对两条数据记录时,你应该选择哪一条?还是没有?这可能是一个两难的选择,也是浪费时间。
寂寞。可用性也可以用作同义词。数据需要在用户需要时可用。示例:对于在线预订网站,期望数据(例如空闲或繁忙的房间)实时更新,以避免混乱、挫折和整体糟糕的用户体验。
用成熟的原料是烤不出好蛋糕的。
这是怎么发生的?

坏数据是一回事,找到原因是另一回事。罪犯可分为两大类:
- 系统
因为我们使用多个系统和软件工具来跟踪和更新我们的记录,所以存在不当集成的可能性。随着时间的推移,这可能会导致记录不完整、创建重复项以及缺乏一致性。数据在平台之间的迁移也是数据恶化的一个原因,比如降级或丢失记录。
虽然平台可能在开始时被适当地集成,但是时间和更新可能会导致它们融合并引起质量问题。人类可能在其中扮演了一个不幸的角色。
2.人类
填写输入表单时出现输入错误(容易解决:如果可能,使用下拉列表),未能遵循指南,现有记录的新条目。误报的数据也可能导致质量差,这可能是由于对要报告的数据缺乏了解造成的,应该清楚地说明期望的是什么,也许通过提供例子。这些错误可能发生在你的同事或顾客身上。
3.奖励:数据随时间退化
一开始,数据的质量可能很好,但如果后台发生了一些变化,它可能会变得毫无用处。想象一下,一位客户在没有通知您的情况下申请了更改,这可能是电话、电子邮件、地址。也可能是用于计算给定指标的方法发生了变化。
我该怎么办,医生?

- 找出又名不愉快的发现:首先,找出质量差的地方。这看起来微不足道,但是如果你不知道你的数据的状态,你已经浪费了一些宝贵的时间和资源。要找出质量差的原因,您可以从您的数据提供商处获得信息,例如您公司的另一个部门或您的客户,根据道听途说进行初步怀疑,或者在做功课时发现:通过快速目测数据和/或通过进行探索性数据分析(EDA),
- 定义&报告:定义损害的程度,尝试有意义地量化它,不同的类别,总结你的发现以便可以报告。定义也意味着找到数据质量差的根源。在下一部分会有更多的介绍。当把你的报告或材料放在一起时,不要忘了展示“不那么糟糕”的部分,以保持高昂的情绪。
- 通知:通知你的利益相关者,但要确保你的团队也已经被通知,以防止内部信息不对称,这样将来与利益相关者的互动就不会显得尴尬。
- 获得反馈:根据你对数据质量差距的报告,你将有望获得一些具体的反馈,比如,你可能会获得绿灯,继续你目前拥有的东西。令人惊讶?可能有一点。如果差距在 1–5%的数据上,或者在不太重要的数据块上,这可以简单地标记为从数据集中删除。另一方面,如果认识到数据的状态是不充分的,那么前面还有一些工作要做。
- 返回数据:既然做出了决定,就可以返回数据矩阵。如果决定继续下去,那么这就是本文的结尾。或者,如果需要“修理东西”,那就是下一部分开始的时候。
解决它
这是一个虚构的对话,但你可能会以某种方式遇到。
“能解决吗?”
“…”
“会不会是?”
“好吧,如果你坚持,那我们就去做吧”。
问题是‘如何去争取,如何解决?’,而且有多个答案。重点将是
- 第一种解决方案有点粗暴,可能并不总是适合业务环境,它由两个主要支柱组成:
- 删除不完整的记录
删除有限列中有数据质量问题的行,或者删除字段中有一个问题或缺少值的所有行。
- 填写缺失字段
想想统计插补。存在多种方法,每种方法都有其优点和缺点。通过使用“最频繁”、平均值/中值或用零或某个常数替换来填充或固定。或者,我们可以(通过编程)在相似记录的帮助下完成记录的缺失字段,即 kNN 插补,使用不完整数据记录的最近邻。
2.利用数据质量工具
根据您的需求,有多种解决方案。诸如重复、不一致的格式、语言或单位等问题很容易被软件标记出来,然后加以纠正。
3.纠正错误记录
有缺陷的记录不必一直如此。如果数据质量工具无法提供帮助,人类可以随时提供支持。这既不奇特也不令人愉快,但是人类的输入可以帮助纠正人类(或系统)输入首先弄乱的东西。这应该根据具体情况进行处理,并进行成本效益分析,以确保其合理。
可持续性
您已经获得了相当好的数据质量。这真是一段旅程。接下来是什么?
至此,您可能会觉得,尽管有这么多乐趣,但处理这样的质量问题是一个您愿意暂时搁置的过程。为了确保这成为遥远的记忆,可以实施一些保护措施。借助数据治理最佳实践:
- 随时跟踪您的数据质量
你很清楚什么是关键。在 KPI 的帮助下监控质量,质量应该会随着时间的推移而提高,如果没有,那么就是出了问题,应该加以解决。如果质量没有提高,寻找根本原因。新的不良记录有哪些例子,它们来自哪里,它们是如何产生的?可能是上游的规则改变或人类输入的重新引入导致了不正确。
- 监控新添加的数据源或新字段
应该检查新的数据源,以确保数据质量规则的存在。这些规则还应该与之前设定的标准相匹配。
新的领域应该限制人类方面的误差范围。使用一组有限的选项,例如使用下拉列表,并且只接受完整的记录。
- 审计您的系统&团队
如果系统有缺陷,或者团队误解了数据的某些维度或特征,那么糟糕的数据质量将会持续下去。
- 创建数据质量团队
因为每个人都很忙,所以有一个致力于数据质量的团队可以确保这个关键资产得到很好的维护。该团队将制定数据治理原则,并关注上述要点。
反对忽视低质量数据的理由
如果上述所有内容对资源和时间来说都是太大的负担,那么下面列出了数据质量差的后果:
- 怀疑
如果有证据表明一大块数据不可信,那么来自该数据集或工具的任何记录都会被非常怀疑地看待。最终,这种不信任可能会困扰整个组织中的其他数据集或系统,或者导致您的客户对其他一切产生怀疑。
- 名声
错误是会发生的,但是如果它们很明显并且不被关注,它不会给你的团队或组织带来好的印象。你的名声会受损。
- 生产力
你的团队、客户和你自己都会因为糟糕的数据而浪费时间和资源。他们可能不得不与其他来源交叉核对,打电话给其他部门确认,这可能会对许多人产生多米诺骨牌效应。
- 决策
数据可以充当眼睛。由于视力不好,很难四处走动。一个缺乏数据的组织是在盲目地导航,或者有一个阻碍其决策和战略的障碍。把数据留在门口就是相信直觉、个人偏见或个人议程。自担风险。
结论
数据是一种关键资产,只要它的质量还过得去。大多数组织会处理数据质量问题,但他们不会永远妨碍业务。使用 KPI 进行频繁监控,限制使用人类使用的“输入字段”,定期测试系统集成可以防止令人不快的意外。如果问题存在,它不会自己消失,尤其是如果它被推到地毯下面。预防比治疗更重要,这样小的不适不会变成严重的偏头痛。
感谢阅读! 加入 Medium 完整访问我的所有故事。
一个增长方程
思考短期和长期增长

背景图片由艾萨克·史密斯提供
从数量上理解增长的关键是对事物如何随着时间的推移而增加建立一个坚实的直觉。与其他领域相比,增长最重要的是优化未来价值。这里有一些我经常用来思考一个策略、想法或项目的影响的基本数学。
大多数增长目标可以概括为“让更多的人做更多的事”通常被称为指标的将取决于你的策略。社交媒体公司可能会针对每天访问其网站的用户数量进行优化。SaaS 公司可能会优化拥有订阅的公司的数量。在我们的例子中,LinkedIn 可能想让更多的读者喜欢这篇文章并对其发表评论。这里有一个简单的公式来说明这个概念:
增长目标=总行动= 用户 × 参与度 _ 比率
我们有意省略了数学中的许多细节,以关注基础知识。从这个公式中,很明显有两个杠杆来增加总行动。我们可以增加用户数量,也可以增加参与度(每个用户的行动数量)。虽然这两个概念似乎显而易见,但当时间加入等式时,这两者之间的选择会有非常不同的结果。
不断增长的用户
每个社交网络面临的第一个增长挑战是用户数量的增长。从质量上来说,这意味着我们有很好的产品市场契合度,但没有足够的用户来产生我们想要的影响。
当我们关注不断增长的用户时,我们也会随着时间的推移不断增加行动。下面的图表展示了一个简单的例子,我们从 10,000 个用户开始,每个月增加 500 个新用户。假设敬业度为 0.4 且不变,那么每月的行动数量也呈线性增长。

作者图片
不断增长的参与度
在建立了一个健康的用户增长引擎之后,我们将会重新审视用户参与度。实际上,随着我们用户群的增长,我们会看到参与率下降,因为我们接触到了更广泛、更多样化的受众。当我们提高参与率时会发生什么?
以增加 LinkedIn 用户之间的消息为例。一种策略可能是将消息图标放大以吸引更多用户的注意。假设这样做可以增加 25%的参与度。与用户增长的情况不同,参与度的增加是固定的,不会随着时间的推移而进一步增加。随着参与度的变化,我们将看到行动总数呈阶跃函数式增长。作为奖励,我们也将增加用户增长的未来回报。

作者图片
短期与长期增长
一旦我们建立了一个强大的用户增长引擎,并拥有良好的参与度,事情就会变得更加有趣。让我们以 LinkedIn 的 feed 中的文章评论增加为例。为简单起见,我们将继续使用前两个示例中的数字。如果我们必须在增加 feed 用户(每月+500 个用户,或相当于+100%的用户增长率)和增加评论率(每个用户+0.125 个操作,或相当于+25%的参与率)之间做出选择,哪种策略会对评论数量产生更大的影响?
不幸的是,答案是视情况而定。如前所述,越来越多的参与会对行动产生巨大的推动作用。相比之下,用户的增长会导致行动缓慢而稳定的增加。当我们比较每月的行动时,我们比较的是运行率。

作者图片

作者图片

作者图片
为了比较这两种策略产生的评论的累计数量,我们需要把每个月的影响加起来。这大致相当于计算曲线下的面积,或者求积分(对于错过微积分的你们来说)。我们会发现,选择提高参与度将在未来两年产生更多的累积行动。然而,在 2 年后,不断增长的用户将赢得可观。
正如我们从这个简单的例子中看到的,优化用户增长或参与之间的正确决策取决于您希望何时看到回报。我们产品策略的生存可能取决于我们在接下来的几个月里能产生的结果。另一方面,我们也应该警惕过度强调眼前的回报或落后于更多面向未来的竞争对手的风险。最佳增长策略通常包括各种策略的组合。正确的组合将取决于我们现在所处的位置,我们在不久的将来想要达到的位置,当然,还有遥远的未来。
高级概念
你们中的一些人可能会强烈地将增长与指数增长联系在一起,并想知道这在哪里以及如何发生。到目前为止提到的所有概念都导致固定的收益,或者最好的线性增长。指数增长的简单答案是病毒式增长。在下一篇文章中,我们将展示如何利用上述简单的增长方程,并对其进行修改以考虑病毒传播。我们还将看到强大的病毒传播如何导致指数级增长!
一页纸的视觉调查富矿
一页数据可视化叙述如何增强印刷新闻

一个选择' TheGraphic '印刷项目,一个一页的数据新闻专栏(E & T 杂志)
自从我开始为一份印刷杂志运作一个有趣的小副业以来,已经过去一年多了。除了我作为调查记者的日常工作,我还制作了一个名为 TheGraphic 的月度数据新闻栏目(它之前就存在了,但我和一位设计师同事灵光一闪,让它变得更加有趣)。
白天,我是一名调查记者。我的故事是长篇大论。它们通常需要几天或几周的研究。因此,这些较短的视觉印刷项目提供了一个令人耳目一新的突破,从长期的东西。到目前为止,反馈大多是积极的。
一页数据新闻叙事:利弊
一开始,我发现有一件事有点难以接受,那就是为什么这么多的分析和可视化工作值得一篇只有 400 多字的文章。
但是,我强调,这不应该使你气馁。这些一页纸有很强的冲击力。在社交媒体上,他们经常做得非常好,你的渠道可以从他们那里得到的错误的冲击往往可以像一些长期阅读一样大。对我来说,这些一页纸的视觉调查只是我作为记者工具箱中的另一种媒介。
你可能也注意到了,它们看起来和其他杂志的产出有些相似。经济学家 为其周报 发布了一页的数据新闻叙事。这个团队雄心勃勃。不可否认,他们设置了相当高的标准。这很好,因为这是你应该追求的复杂程度。*
不过,给你个警告。如果它一下子达不到这个标准,也不要气馁。如果你是新闻编辑室或杂志编辑团队中想要做这种工作的一个人,这可能会很难。我的建议是:从简单开始。
我自己的一套单页视觉调查规则:
- 图形元素的组合,数据驱动论点的证据,挂钩(故事情节)
- 一组支持上下文和理解的图形元素(有时这些图表允许读者更详细地钻研数据集的子部分)。
- 几乎什么都有:图表、地图、卫星图像、创意插图、3D 插图(没有 3D 饼图)
- 关于图表类型的不该做的事(一句警告):如果使用图表,它们不应该比它们应该有的更复杂。从你想展示的开始,然后考虑图表类型。如果你迷路了,请查看图形指南(如 FT 的视觉词汇 )。那就再查一遍!
- 文案长度:300 到 500 字之间的记叙文。
- 通常(不总是),我会画一个当前/紧迫新闻事件的链接
这些规则是接近你的编辑的一个很好的起点(尽管,记住,规则是要被打破的)。
击败知识有帮助
根据我的经验,对你所写的领域多了解一点有助于正确解读数据(当你从事新闻工作时,这总是有用的,但在这种情况下,它可以极大地帮助避免错误解读数据和发现不真实的趋势)。
我之前在英国《金融时报》的工作涉及中国。我在日常工作中获得的国家知识有助于每周制作一页的视觉印刷项目。
生产时间
许多传统的记者,包括以前的编辑,可能会倾向于低估将一页成功的图文报道整合在一起所需的时间。
最初,你可能不得不降低你的雄心。我的建议是:最初,专注于简单的图表类型和直接的数据驱动的结论。稍后,您可以提高支持图形的复杂程度。
编辑需要看到你付出的努力是值得的。你可以就这些作品在社交媒体上的表现提供反馈。
随着时间的推移,你也会更快地生产它们。现在,我可能只需要几个小时就可以将它们放在一起,并提交 Illustrator 文件和复制到系统中。
可能还有其他阻力。如果你的编辑不完全懂数据,一开始可能会很难推销。然后你需要知道如何用甜言蜜语让你的视觉新闻进入编辑的舒适区。
我的卖点是,这些较短的数据驱动的叙述只是标准当代新闻武库的另一部分。
当你把文章提交给编辑时,确保你的初稿有足够的标记。他们应该很容易理解(而且,如果需要,一旦你得到老板的许可,你可以进一步简化)。
数据可视化专家强调,并不是所有的图形都需要在五秒内理解。我大体上同意这个观点。然而,我要补充的是,如果你的编辑在最初的 20 秒内得到它,那会很有帮助。在你的初稿中给你的编辑足够的指示会有所帮助。
两个重要的元素:图形挂钩(1)和上下文图形(2)
在我看来,一页视觉印刷品有两种基本的图形元素。这不是一个标准的规则,如果是的话,我更多的是违反它而不是坚持它。
第一个是图形挂钩(1)。它通常是更简单的标准图表类型,通常是条形图或折线图。前五秒钟就能看懂的那种图表。重要的是,它通常不超过一个点。它必须是直截了当和可消费的。这将有助于吸引和吸引不太喜欢图形和图表的读者。
第二,有上下文相关的图形元素(2)。这些更复杂,可以显示在某一系列因素、类别或特征上发生了什么。在这里,我通常把事情的角度。页面上通常会有更多的点、条或元素。
****举个例子:一个关于气候变化相关专利激增的可视化单页报告。
即使你不熟悉这个话题(或某个特定的图表爱好者】,你也会明白第一个图表(见下文):有更多的中国专利。简单。
然后底部有各种散点图。这是比较复杂的一点。但对于更投入的读者来说,这很有趣。
这一群人会花时间和耐心欣赏更复杂的图形。他们可以潜水并探索它们。
简而言之,我们努力为各种各样的读者服务。只有 20 秒的和只有几分钟的。

的确,一些图表形式(散点图、回归线等。)可能更难理解(至少比标准条形图更难理解)。但这不应该阻止你使用它们。
辅助图形应该很有趣,像一个迷人的纵横字谜,并提供一种方法让读者以不同的方式消费内容。
简单与复杂的混合
正确的组合是一个好的单页图形。重要的是,他们需要讲一个故事。我强调,这不仅仅是钩子的问题。
反复试验
如果你在一家印刷杂志工作,每个人都需要时间来适应数据驱动的视觉印刷功能。但是尝试一个循环的程序。我认为对我来说,生产它们在质量和速度上有所不同。
此外,考虑过程(你自己能做多少,有多少人帮助/与你合作)。寻求可以合作的盟友。一个充满激情的设计师能帮上忙吗?你能和一个想做更多视觉新闻的热情记者一起工作吗?跨学科的合作很有趣,可以提高产出。不要认为你必须自己做所有的事情。
讲述简短的视觉调查故事
对于调查记者来说,仅用一页纸讲述一个好故事可能会令人沮丧。但即使在那里,一页的视觉项目也有它的位置。对于调查性的故事来说,“简短而甜蜜”有时是个不错的选择。
《纽约时报》编辑丽贝卡·科比特(Rebecca Corbett)在一次采访中说,调查应该是短期、中期和长期的。“不是所有事情都应该是 18 个月的项目”。即使在《纽约时报》上,短期视觉调查叙事也有其一席之地。如果它们是以一种可消费的形式呈现的,是受欢迎的,是快速生产的,那么它们是否短小精悍又有什么关系呢?
2017/18 年,仅仅一年多,我就在 FT 的姐妹杂志《日经亚洲评论》上刊登了名为‘data warch’的每周印刷版。这是一个一页纸的东西,类似于的 Graphic 。因为这是我进行调查项目的唯一渠道,那些一页纸成了我事实上的视觉调查专栏。
在印刷品中,我只有大约 200 字来讲述一个数据驱动的调查故事。因此,图形需要做繁重的工作。过了一段时间,经过一点训练,用这种格式讲述极其复杂的调查性叙述是可能的。
诚然,2000 字、采访、支持性分析和调查性报道本可以制造更多噪音并赢得更多奖项。但就其本身而言,我想读者会同意,它是成功的(见下面的选择)。

描述:一篇 500 字的调查报道
为此,我很享受在英国《金融时报》的时光。总有人会对合作或批准新项目感到兴奋,就像那些。
更重要的是,NAR 的工作证明了视觉调查记者有他们的位置,即使他们没有在印刷或网络上获得他们的 5000 字的叙述。
此外,如果你能在压力下很好地制作这些数据新闻单页,你就在新闻编辑室赢得了独特的位置。新闻事件可以受益于快节奏的视觉调查。
这也让你更难被取代。如果编辑室的特定领域(如数据、图表或记者)出现裁员,你可以展现跨学科的多样化技能(调查、报道、图表)。
如何开始你自己的单页
最好以开始简单的。如果你是一名编辑,试着鼓励一名记者和图形部门的人合作。有时候你很幸运,两者兼而有之。然后让其他编辑习惯这个想法。我认为变革(或至少是买入或兴趣)必须来自高层。想法可以来自底层(记者、数据部门)。
另外,确保你的助理编辑和事实审查员都在船上。让他们检查这些一页纸很重要。
****制作人应该思维年轻且思想开放(如此渴望学习新的东西,例如,你可能需要学习使用代码或程序来制作这些作品)。
你给自己和团队时间去试验。我认为如果有一个循环周期会有所帮助(例如,每月或每周有一个截止日期)。随着时间的推移,这些故事会变得更好,更有雄心。
从 FT 视觉词汇中概述的基本图形形式开始。开始的时候,一次只专注于一两点。
一页纸的数据叙述是杂志和报纸追赶视觉调查潮流的好方法。不要忘记,你可以在网上以不同的形式运行这些单页程序。它们可以更广泛,包含更长拷贝,或者可以是交互式的。世界是你的。
我总的座右铭是:如果其他印刷和网络杂志能在制作它们方面出类拔萃并取得成功,为什么你不能呢?
我在《经济学人》的数据柜台工作了一年
你应该知道的一个 PyTorch 把戏

钩子如何显著改善你的工作流程
如果你以前使用过深度学习,你就会知道调试模型有时真的很难。张量形状不匹配、爆炸梯度和无数其他问题可能会让你大吃一惊。解决这些问题需要在显微镜下观察模型。最基本的方法包括使用 print 语句或引入断点来丢弃forward()方法。这些当然不太具有可扩展性,因为它们需要猜测哪里出了问题,而且总体来说非常繁琐。
但是,有一个解决方案:钩子。这些是特定的函数,可以附加到每一层,并在每次使用该层时调用。它们基本上允许您冻结特定模块的向前或向后传递的执行,并处理其输入和输出。
让我们看看他们的行动吧!
钩子速成班
因此,钩子只是一个带有预定义签名的可调用对象,它可以注册到任何nn.Module对象。当在模块上使用触发方法时(即forward()或backward(),模块本身及其输入和可能的输出被传递给钩子,在计算进行到下一个模块之前执行。
在 PyTorch 中,您可以将一个钩子注册为
- 向前预瞄(在向前传球之前执行),
- 向前钩住(在向前传球之后执行),
- 向后挂钩(在向后传递后执行)。
一开始听起来可能很复杂,所以让我们来看一个具体的例子!
示例:保存每个卷积层的输出
假设我们想要检查 ResNet34 架构中每个卷积层的输出。这个任务非常适合钩子。在下一部分中,我将向您展示如何实现这一点。如果你想互动地跟随它,你可以在 https://github.com/cosmic-cortex/pytorch-hooks-tutorial找到附带的 Jupyter 笔记本。
我们的模型定义如下。
创建一个钩子来保存输出非常简单,一个基本的可调用对象就足够了。
SaveOutput的一个实例将简单地记录向前传递的输出张量,并将其存储在一个列表中。
可以用register_forward_hook(hook)方法注册一个向前的钩子。(对于其他类型的挂钩,我们有register_backward_hook和register_forward_pre_hook。)这些方法的返回值是钩子句柄,可以用来从模块中移除钩子。
现在,我们将钩子注册到每个卷积层。
当这样做时,钩子将在每个卷积层的每个前向传递之后被调用。为了测试它,我们将使用下面的图像。

向前传球:
正如预期的那样,输出被正确存储。
>>> len(save_output.outputs)
36
通过检查这个列表中的张量,我们可以可视化网络所看到的。

ResNet34 第一层的输出。
出于好奇,我们可以检查一下之后会发生什么。如果我们在网络中走得更深,学习到的特征会变得越来越高。例如,有一个似乎负责检测眼睛的过滤器。

ResNet34 的第 16 卷积层的输出。
超越
当然,这只是冰山一角。钩子能做的不仅仅是简单地存储中间层的输出。例如,神经网络修剪,这是一种减少参数数量的技术,也可以用钩子来执行。
总而言之,如果你想增强你的工作流,应用钩子是一个非常有用的学习技巧。有了这些,你就能做更多更有效的事情。
如果你喜欢把机器学习概念拆开,理解是什么让它们运转,我们有很多共同点。看看我的博客,我经常在那里发表这样的技术文章!
破解编码面试的一年计划
关于我在面试前的忙碌。
我花了一年的时间从一个 noob 程序员成长为一个体面的人,通过编码面试获得实习机会并获得经验。我还有很长的路要走,但成为一名优秀的程序员的第一步是在现实世界中工作并获得经验,这种经验最好通过实习来获得。如果你想实习,你必须先通过面试。这让我们想到了这个博客。

我已经分解了我的一年计划,这是我努力遵循的,如果你处于起步阶段,我希望能帮助你制定计划。
先决条件:了解一门编程语言的基础和语法。大多数学生倾向于从他们的大学/高中了解 Java、C 或 Python。你可以坚持使用这三种语言中你觉得舒服的一种,但如果 C 是你的首选语言,我会建议你改用 C++。我的第一语言是 C,这让我转到了 C++。我在业余时间学习了 Java,更加喜欢它,并决定用 Java 来练习竞争性编码,所以我曾经破解的每个面试都是通过使用 Java。我对 python 毫无经验,但在加入脸书后,我作为实习生写的所有代码都是 Python。所以我的观点是,在这三种语言中没有更高级的语言,不要担心选择哪一种。只需选择一个,在其中进行面试,然后你就可以根据你被安排的位置在旅途中学习剩下的内容。
计划是这样的:
到目前为止发布的特定月份的博客已经在下面链接了,其余的将很快发布。
第四个月:树和尝试:在这里阅读
第五个月:Hashmap,Dictionary,HashSet:在这里阅读
第五个月:图表:在这里阅读
第 6 个月:递归和动态编程
第 7 个月:排序和搜索
第八个月:阅读(关于系统设计、可扩展性、PM 问题、OS、线程、锁、安全基础、垃圾收集等。根据你的目标角色,扩展你在任何领域的知识)
第 9、10、11、12 个月:在你喜欢的网站上,混合了中等难度和高难度的问题。通过参加竞赛、关注自己不擅长的话题、模拟面试等方式进行练习。

来源——forbes.com
以下是我如何处理每个月的每个话题——假设你在第四个月,专注于树木。你需要先了解什么是树,不同类型的树,并能够定义类节点和树。然后,您需要能够执行基本的操作,如添加、查找和删除元素,前序、按序、后序和逐层遍历。最后,你可以在 Hackerrank、Leetcode 或你选择的网站上练习不同的树问题。你应该首先瞄准简单的问题,一旦你适应了,就进入中等难度和高难度。****
最后 4 个月是通过竞赛或其他方式解决各种不同的问题,这是必要的,因为当你练习树问题时,你知道你必须使用树。但是如果给你一个随机的问题,你怎么知道一棵树是最好的方法呢?还有,自己解决之后,总要在论坛上寻找最优解。
你有整整一个月的时间,如果你设法每周投入 40 个小时,你将能够以这样一种方式掌握树木,如果在面试中向你抛出一个树木问题,你将能够大部分解决它,因为你通过密集的练习训练你的大脑以这种方式思考。如果你是一名学生,投入这么多时间肯定是可行的,即使是附带项目、家庭作业等等。你的成绩可能会受到打击(在那个学期(9 月、10 月、11 月、12 月),当我每天花 8 个多小时学习竞争性编程时,我的 a 变成了 b ),但这是值得的。
在准备期间,你还应该试着做项目或做研究。
有些人通过参加 CodeForces、CodeChef 等的竞赛学习得更好。而另一些人更喜欢练习题。还是那句话,没有孰优孰劣,做你个人喜欢的事情。
我不相信为特定公司练习特定话题,一些网站声称有一套专门针对特定公司的问题,例如:破解谷歌面试。我认为我们的目标应该是成为一名更好的开发人员,专注于谷歌倾向于测试候选人的几个主题可能不是最好的方法。
面试官还会根据你的 LinkedIn、简历、过往经历、所学课程、Github、学位和证书、项目、研究论文等来评判你。练习竞争性编码并不能保证得到一份工作,但是可以保证你在大多数时候能够通过技术面试,并且你也会成为一名更好的开发人员,这可能会在你构建项目时对你有所帮助。
最后,不要停止。当你有动力的时候,一开始看起来很容易,但是这种动力在一个月左右就会消失。把你的目标记在心里,当然,这将会很难,但是只有那些坚持计划的人才会成功。如果需要的话,你可以修改计划,但是一旦完成,就要坚持下去,即使是在你懒散的日子里,即使是在你要参加大学庆典或聚会的时候,即使是在你昏昏欲睡的时候。就像我说的,成功的人是那些坚持计划的人 。*
这高度概括了我的日程安排。我计划深入挖掘,我的下一篇博客将只关注第 1 个月(大 O,数组和字符串),之后的将是第 2 个月,以此类推。我希望这是有帮助的,让我知道如果你想让我也写一些其他的话题,或者如果你有任何疑问。如果你能在 Instagram 上提问,我会很感激,因为我更喜欢在 LinkedIn 上寻找职业机会,但两者都可以。
谢谢!结束!
安贾利·维拉加马
脸书软件工程实习生
即将加入微软的软件工程师
科学家应该知道的 6 个 Git 命令数据

将 Git 用于机器学习项目的介绍
我已经使用 Git 很长时间了。有时我会忘记,对于刚刚开始学习如何使用版本控制的数据科学家来说,这可能有点陌生。所以我决定写这个简短的指南,如果你对使用命令行来版本化你的机器学习项目的想法是新的,并且需要一个你应该知道的最少命令的简单备忘单。
版本控制如此强大的原因是能够回顾一个项目的历史,并看到两个版本之间的确切变化。这在训练新模型和调整超参数时非常重要。
考虑到这一点,我不打算讨论如何安装 Git。外面有很多很棒的资源告诉你如何做这个。不要忘记设置一个 SSH 密钥。相反,我将假设您已经安装了 Git 并准备好了。如果您在 Mac/Linux 上在命令行中键入git,或者在 Windows 上键入 GitBash,您应该会看到下面的内容。

1.初始化
我们将从最基本的命令init开始。这将初始化一个 Git 项目,这是把 Git 需要的文件添加到你所在文件夹的根目录的一种奇特方式。简单地把cd放到你的项目目录中,输入如下内容:
git init
作为回报,您将收到一条消息,表明您的项目已经准备就绪。

每个项目只需这样做一次。
2.远程添加
现在,多亏了init命令,您的项目有了一个本地 repo。虽然您可以做任何您需要的事情来在本地对您的项目进行适当的版本控制,但是您会希望在线创建一个项目来充分利用 Git。大多数开发者都有一个 GitHub 账户,尽管也有很好的替代品,比如 BitBucket 和 GitLab 。我用 GitHub 做我所有的项目。微软收购它之后,他们免费开放了私有存储库。但老实说,所有这些服务对任何刚开始的人来说都是一样的。
在您选择了想要使用的服务之后,继续创建一个新项目。

一旦你创建了你的项目,你会得到一个自定义网址。在这种情况下,为此项目生成的是:
[https://github.com/jessefreeman/GitExample.git](https://github.com/jessefreeman/GitExample.git)
我们现在需要做的就是将本地项目连接到我们创建的在线项目。为此,您将使用以下命令:
git remote add origin <PROJECT_URL>
您也可以通过 SSH 路径连接,这取决于您的 Git 服务为您提供了什么。
3.增加
此时,您的项目就可以在本地跟踪版本了。继续向文件夹添加一个ReadMe.txt文件或其他东西。请记住,Git 将忽略空文件夹。一旦您准备好了,您会想要将变更添加到存储库中。 Staging 是 Git 跟踪特定文件直到你准备好保存它们的一个版本的一种奇特说法。
要添加文件,只需键入以下命令:
git add .
虽然您可以在add之后按名称指定文件,但是.是一个通配符,它将自动包含自上次提交以来发生更改的任何文件。
4.状态
在任何时候,您都可以获得 Git 项目中文件的列表,并查看它们是否是暂存的。为此,请键入以下命令:
git status
这将返回 Git 在目录中看到的所有文件的列表。

您可以看到当前未添加的文件显示为红色。准备保存的文件将以绿色显示。当您希望在保存更改之前直观地查看当前暂存的所有内容时,文件状态列表很有帮助。
5.犯罪
一旦你暂存了你的文件,你就会想要保存它们的一个版本。我们称之为提交。Git 将获取您之前添加的文件,并将它们与上一个版本进行比较。然后,它将增量或差异保存在项目根目录下一个特殊的隐藏的.git文件夹中。
要保存更改,请在命令行中键入以下内容:
git commit -m "Add a message so you know what you did."
这可能是迄今为止我们使用过的最复杂的命令。如果我们查看每个部分,我们调用的是commit而-m代表添加消息。最后,您将在引号中提供提交消息。这样,您可以在以后回顾提交日志,以记住您做了哪些更改。
如果你正在使用 GitHub,在提交代码时,你可以利用一些有趣的特性。我使用问题渠道来跟踪我需要在项目中完成的任务。每期都有一个唯一的 ID 号,您可以通过在评论中引用它来链接到它,如下所示:
git commit -m "Finished making changes to #1."
GitHub 会自动从您的提交中添加一个链接到该问题。这是一个让你工作时保持有条理的好方法。
6.推
这个过程的最后一步是将所有提交推送到 GitHub 上的远程存储库。Git 的独特之处在于,它允许您在本地工作,直到您准备好将它们添加回主存储库。这就是为什么团队可以在他们的电脑上如此高效地工作,然后将所有东西合并成一个项目。
还记得之前,我们将本地项目链接到在线项目的时候吗?现在,当你告诉 Gitpush所做的更改时,它们将被复制并合并到主项目中。您只需在命令行中键入以下内容:
git push --all
--all类似于我们之前在暂存文件时使用的.通配符。这个标志告诉 Git 将所有最近的提交推送到默认原点,这是我们用remote add命令定义的。
冲洗并重复
总而言之,这是使用 Git 的六个基本命令:
init创建新项目- 将本地项目链接到在线项目
add添加要跟踪的文件status返回本地项目中的文件列表commit保存对这些文件的更改push将这些变更复制到在线项目中
现在你可以做步骤 3–6来保存和推动你所做的改变。当我知道事情稳定时,我倾向于做出承诺。如果这是一个代码项目,我只在代码工作时提交。对于写作,我倾向于在一节课结束时提交。你可以提交的次数没有限制,尽管如果你做了很多改变,你可能需要不时地清理 Github repo 。
请务必查看我的一个 TextGenRNN 项目,看看我如何在 GitHub 上设置它。随着您对使用 Git 越来越熟悉,一定要了解如何使用
.gitignore文件来排除您不想被跟踪的特定项目。我的项目有一个您可以用作参考的项目,它忽略了我生成的模型和一些 python 项目配置文件,这些文件对于希望在本地运行项目的其他人来说并不重要。
最后,值得注意的是 Git 很难存储大的二进制文件,这是使用.gitignore文件的另一个原因。你的许多训练数据,如图像、视频或任何超过 50 兆字节的数据都会引起问题。 GitHub 对大文件的大小有一个硬性限制,如果你不小心提交了一个文件,需要几个额外的步骤来撤销更改,尤其是如果你不熟悉 Git 或者命令行的话。最好将这些文件备份到不同的版本控制系统中。
如果您是 Git 新手或者正在寻找快速复习工具,我希望这有所帮助。如果你在下面留下评论,我很乐意回答你提出的任何问题。
仅有的三个可扩展的人工智能创业原型
传统的 SaaS 商业模式不适用于大多数人工智能初创公司
至少五年来,人工智能一直是初创企业的重中之重。已经投资了数千亿美元,成千上万的企业家和内部企业家——我们这一代最优秀的一些人——已经尝试了不同程度的成功,没有一家纯人工智能公司成功上市。
问题是
我们都知道,人工智能不能被包装成一个产品,有些是吃了苦头才知道的。比如说,在 SaaS,衡量一家典型风险投资公司的因素并不适用于人工智能。
- 首先,一个有用的人工智能必须针对客户和它试图解决的问题的特定数据进行训练。尽管有各种所谓的“预训练”模型的说法,但它们的准确性远不可靠,例如 GPT3。一般来说,AI 是不能轻易复制粘贴的。
- 那些试图采用特定行业方法、希望利用客户数据进行培训的公司,遇到了数据安全要求这堵难以逾越的墙。例如,大多数企业客户希望供应商在他们的防火墙内安装,有时是在本地安装。
- 中小企业和消费者愿意分享他们的数据,以换取一些功能,这是 SaaS 的基本承诺。然而,要取得成功,一家人工智能公司必须在他们的算法生效之前注册很多很多用户。早期用户没有主动提供数据的动机。
- 然后就是确定性行为的问题。假设你注册了一个告诉你‘二加二等于五’的人工智能。没关系。你围绕结果设计你的过程,就像减去一。随着时间的推移,人工智能获得了新的数据,一个晴天变成了“四个”。你现在必须重新设计你的流程。如果因为某种原因它变成了“三”。(有关这方面的更多信息,请参见下面的链接。)
- 接下来是“行话合规”问题。我记得曾经建议一位企业家,他的解决方案根本不需要人工智能。他坦率地表示反对,“那我怎么筹钱?”我试图解释说,如果他想扩大规模,最好将自己定位为一家 SaaS 公司,但这并没有太大作用。如今,一切都被称为人工智能,这只是混淆了这个领域。
清单还在继续,但让我在这里暂停一下。
信息安全挑战被证明是人工智能生态系统的巨大障碍。相反地…
www.darkreading.com](https://www.darkreading.com/threat-intelligence/the-infosec-barrier-to-ai/a/d-id/1338401)
飞向数据
你们中的许多人会记得 2017 年的一幅标志性图像,这幅图像将数据描绘成新的石油。他们一针见血。今天,由于我上面列出的问题,技术在人工智能的业务中几乎无关紧要。在企业领域,公司主要是构建自己的解决方案,并将数据放在胸前。在消费者世界,谷歌和脸书等巨头正在利用他们的数据和人工智能为消费者建立新的服务。对中小企业来说也是如此,但在很大程度上,人工智能对中小企业的服务严重不足。
一种新的商品催生了一个利润丰厚、快速增长的行业,促使反垄断监管机构介入,以限制那些…
www.economist.com](https://www.economist.com/leaders/2017/05/06/the-worlds-most-valuable-resource-is-no-longer-oil-but-data)
在这一切中,创业公司几乎没有发挥什么作用。甚至连人才都在流向这些大型、数据丰富的公司。《2020 年人工智能的现状》报告给出了有趣的统计数据,说明教授们是如何离开学术界去为谷歌、亚马逊和微软这样的巨头工作的。这种外流和人工智能初创公司从校园中消失之间有着直接的关联。
开创解决方案业务并不丢人。不用说,IBM 或微软在客户关系、现有基础设施和板凳深度方面拥有巨大优势。小型解决方案企业还面临许多其他固有的挑战。尽管如此,创业公司的差异化知识产权还是有一些价值的。风投也显示出对投资解决方案公司持开放态度的迹象,但他们仍在寻找无限可扩展的产品创意。
如果你坚持做产品,只有三个人工智能创业公司的原型能像 SaaS 公司一样扩大规模。

图片由 Laura Ockel 通过 Unsplash 提供
滚珠轴承(可替换的人工智能问题)
几乎每台机器——物理机器——都使用一些滚珠轴承。它们有各种尺寸和规格,但基本思想是连接两个相对旋转的部件。设计这种机器的工程师通常根本不担心滚珠轴承。他们只是假设当他们需要时,正确的类型是可用的。

作者图片
AI 创业公司的滚珠轴承原型就是解决一个小问题:1。每个人都有第二。其解决方案可以使用公开可用的数据来训练。示例—处理应收账款、分析合同、营销分析、客户评论处理等。客户将如何使用它的本质特征,以及它背后的人工智能,不会因客户而异。
您可以从用不属于任何客户的数据来证明您的模型开始。在一定的准确度下,你可以吸引更多的客户与你分享他们的数据。即使他们不这样做,这个模型也能很好地工作。查阅这篇文章中的“良性循环”可以更好地理解这一点。
手册(人工智能数据产品)
虽然滚珠轴承、螺母和螺栓是大多数机器的标准零件,但齿轮却完全不同。工程师可能会自己设计齿轮。为此,他们会进行许多计算和优化。他们还会依赖其他工程师通常发表在论文、手册或指南中的知识。
人工智能创业公司的手册原型是用人工智能创造数据产品。您的目标是通过分析所有关于齿轮的可用数据,并以有用的格式打包,帮助工程师快速找出他们的齿轮。例如,天气服务、医疗保健洞察、预测性维护等。你控制了人工智能,你得到了输入数据,客户只为你的输出付钱。
扳手(人工智能工具)
继续工程隐喻,无论我们的工程师在做什么,他们都需要扳手来做。他们对扳手毫不犹豫,却为它和其他类似的工具付了很多钱。
人工智能创业公司的扳手原型是创建工具,以便其他人可以构建人工智能解决方案。想想各种 ML 操作工具、工作台、特征库和 SDK,它们有助于 AI/ ML 的创建、生产和操作。你仍将驾驭人工智能浪潮——我之前谈到过每个人都在试图创造自己的人工智能解决方案。你仍然需要深入理解这些概念。但你不会卖人工智能。几乎所有这些工具都不太智能,这意味着它们不需要定制,并且可以很好地扩展。
如果你的想法不符合这三个原型,并不意味着它没有价值。我希望你只是从一个角度来看这篇文章。最后,你应该追随你的激情,你会找到让它发挥作用的方法。
开放城市人工智能挑战赛

在坦桑尼亚达累斯萨拉姆,由社区制图团队手工标记的建筑足迹覆盖在来自开放城市人工智能挑战赛数据集的高分辨率无人机图像上(黄色轮廓)。
从航空影像中分割非洲城市的建筑,并提出负责任的人工智能灾害风险管理理念
帖子由 罗格雷斯·多尔蒂【尼古拉斯·琼斯】维维安·德帕迪约 、GFDRR Labs/世界银行**
外卖食品
全球减灾和灾后恢复基金 (GFDRR)正在与 Azavea 和 DrivenData 合作,推出一个新的数据集和机器学习(ML)竞赛(总奖金为 15,000 美元),以改善弹性城市规划的地图绘制。为灾害风险管理提供更好的 ML 支持的制图意味着解决在非洲城市环境中应用 ML 的障碍,并在地理空间数据准备中采用最佳做法,以便更容易地使用 ML。竞赛数据集-超过 400 平方公里的高分辨率无人机图像和 79 万个建筑足迹-来自非洲 10 多个城市地区经过本地验证的开源社区制图工作。获奖的解决方案将作为开源工具发布,用于持续的 ML 开发和基准测试。
开放城市人工智能挑战赛有两条参赛路线:
- 从无人机图像中对建筑物足迹进行最佳开源语义分割的奖金为 12,000 美元,这些图像可以概括各种各样的非洲城市环境、空间分辨率和成像条件。
- 为负责任的人工智能开发和应用于灾害风险管理的深思熟虑的探索提供 3000 美元的奖金。我们如何改进 ML 系统的创建和使用,以减少偏见,促进公平和道德的使用,清晰地告知决策,并制定保护用户和最终受益者的保障措施?
比赛正在进行,将于 2020 年 3 月 16 日结束。今日加入!
弹性城市规划的开放数据
世界各地的城市正在快速发展,尤其是在非洲——到 2030 年,撒哈拉以南非洲地区的一半人口将生活在城市地区。随着城市人口的增长,他们面临的洪水、侵蚀、地震、沿海风暴和其他灾害对城市规划构成了复杂的挑战。
要了解资产和人员如何容易受到这些风险的影响,需要详细、最新的建筑环境地理数据。例如,一栋建筑的特定位置、形状和建筑风格可以告诉我们,它是否会比附近的建筑更容易受到地震或风的破坏。如果我们想要有效地理解和管理风险,就需要经常、准确和详细地绘制道路、建筑和关键基础设施的地图。但是在数据基础设施不太发达的国家,传统的城市数据收集方法跟不上日益增长的密度和蔓延。

一名来自开放城市阿克拉的野外测绘员在加纳阿克拉易发洪水的社区观察积水和垃圾。照片由加布里埃尔·乔·阿木祖提供,阿木祖乔摄影。
令人欣慰的是,协作和开放的数据收集实践正在重塑我们绘制城市地图的方式。今天,当地的地图社区正在为世界上一些最脆弱的社区改进地图——带来最新的和按比例的高度精确和详细的地理数据。世界银行的 GFDRR 支持像非洲开放城市和 Dar Ramani Huria 这样的项目,在十几个非洲城市绘制建筑、道路、排水网络等地图,而桑给巴尔制图计划是世界上最大的航空制图活动,使用消费无人机和当地的制图者来制作开放的空间数据,用于群岛的保护和发展。
迄今为止,OpenStreetMap 的贡献者已经在非洲大陆上绘制了超过 7000 万条道路和 6 亿个节点。
这些社区制图项目收集的数据用于设计支持政府决策的工具和产品。数字化地图被发布到 OpenStreetMap 上,航空影像被发布到 OpenAerialMap 上,在那里它们作为公共数据产品被所有人使用和改进。该运动背后的开源理念和对本地技能建设的重视培养了数字制图、机器人、软件开发和数据科学方面的本地人才网络。
机器学习在制图方面的潜力
用于视觉任务的 ML 的进步可以进一步提高绘图质量、速度和成本。最近 ML 应用于地图绘制的例子包括脸书用于 OpenStreetMap 的人工智能辅助地图绘制工具和微软的国家级自动化建筑足迹提取(在美国、加拿大、坦桑尼亚和乌干达)。像 SpaceNet 和xfiew 2这样的竞赛推动了道路、建筑物自动制图和灾后建筑物损害评估的 ML 实践。
然而,在非洲灾害风险管理背景下有效应用当前的 ML 绘图解决方案存在障碍。非洲的城市环境在构成和外观上与欧洲、美洲或亚洲城市有很大不同,欧洲、美洲或亚洲城市有更丰富的数据,ML 模型经常在这些数据上进行训练。
建筑更加密集,形状 更加多样,建筑风格和大小可能不太容易被 ML 模型识别,因为 ML 模型在他们的训练中很少或根本看不到这样的例子。
****
以相同的视觉比例比较美国拉斯维加斯(左)和利比里亚蒙罗维亚(右)的城市建筑环境。图片由微软必应地图和 Maxar (DigitalGlobe)提供
图像由商用无人机在不同的环境条件下以高得多的分辨率收集 ,需要对通常在较低分辨率上训练的模型进行调整,更加一致地收集和预处理卫星图像。
****
比较坦桑尼亚达累斯萨拉姆典型卫星图像分辨率(> 30 厘米/像素,上图)与无人机/航空图像分辨率(3-20 厘米/像素,下图)的城市细节。图像由 Maxar 和 OpenAerialMap 提供。
众包和社区驱动的数据标注在所使用的基础影像图层、工作流、数据模式和质量控制方面可能会有很大不同,需要对更多标注噪声具有鲁棒性的模型。
****
手绘建筑物覆盖区标签的质量(对齐和完整性)在图像场景之间或图像场景内可能会有所不同。来自乌干达坎帕拉(左)和刚果民主共和国金沙萨(右)的挑战培训数据集的示例。
地理空间数据有多种文件格式、大小和模式,这造成了高采用率和知识壁垒,阻碍了它们在机器学习中的使用。
现在,在不同的建筑环境中,本地验证的开放地图数据和高分辨率无人机图像越来越丰富。我们如何才能最好地解决这些障碍,并增强机器学习的实践状态,以支持城市发展和降低非洲城市风险的制图?
介绍开放城市人工智能挑战赛
资料组
与合作伙伴 Azavea 和 DrivenData 合作,GFDRR 的实验室团队结合了非洲各地许多参与式制图社区的出色工作,在云原生地理空间数据处理中应用了最佳实践(即使用云优化地理信息【COG】和时空资产目录【STAC】),并尽可能实现标准化,以使数据更容易用于机器学习。其结果是一个新颖、广泛、开放的数据集,包含超过 79 万个建筑足迹和 400 平方公里的无人机图像,以 ML-ready 的形式代表了 10 个不同的非洲城市地区。

对比挑战训练数据集中包含的 10 个非洲城市区域覆盖在无人机影像上的手动标记建筑足迹。
将 COG 和 STAC 用于地理空间数据为我们提供了带宽高效、快速和可查询的访问,以标准化格式访问我们的影像和标签。对于可以快速增长到数百千兆字节的地理空间数据,轻松访问文件和索引数据目录尤为重要。它还使我们能够利用 COG 和 STAC 工具的不断增长的生态系统,如 STAC 浏览器在网络浏览器中快速可视化和访问任何培训数据资产,尽管单个图像文件高达数 GB,整个数据集总计超过 70 GBs:

使用 STAC 浏览器可视化挑战训练数据集合和资产的动画演示。
PySTAC ,一个由 Azavea 开发的新 Python 库,使 STAC 用户能够以编程的方式加载、遍历、访问和操作目录中的数据。例如,阅读 STAC 目录:
**train1_cat = Catalog.from_file('https://drivendata-competition-building-segmentation.s3-us-west-1.amazonaws.com/train_tier_1/catalog.json')
train1_cat.describe()* <Catalog id=train_tier_1>
* <Collection id=acc>
* <Item id=665946>
* <LabelItem id=665946-labels>
* <Item id=a42435>
* <LabelItem id=a42435-labels>
* <Item id=ca041a>
* <LabelItem id=ca041a-labels>
* <Item id=d41d81>
* <LabelItem id=d41d81-labels>
* <Collection id=mon>
* <Item id=401175>
...**
检查项目的元数据:
**one_item = train1_cat.get_child(id='acc').get_item(id='ca041a')
one_item.to_dict(){
"assets": {
"image": {
"href": "https://drivendata-competition-building-segmentation.s3-us-west-1.amazonaws.com/train_tier_1/acc/ca041a/ca041a.tif",
"title": "GeoTIFF",
"type": "image/tiff; application=geotiff; profile=cloud-optimized"
}
},
"bbox": [
-0.22707525357332697,
5.585527399115482,
-0.20581415249279408,
5.610742610987594
],
"collection": "acc",
"geometry": {
"coordinates": [
[
[
-0.2260939759101167,
5.607821019807083
],
...
[
-0.2260939759101167,
5.607821019807083
]
]
],
"type": "Polygon"
},
"id": "ca041a",
"links": [
{
"href": "../collection.json",
"rel": "collection",
"type": "application/json"
},
{
"href": "https://drivendata-competition-building-segmentation.s3-us-west-1.amazonaws.com/train_tier_1/acc/ca041a/ca041a.json",
"rel": "self",
"type": "application/json"
},
{
"href": "../../catalog.json",
"rel": "root",
"type": "application/json"
},
{
"href": "../collection.json",
"rel": "parent",
"type": "application/json"
}
],
"properties": {
"area": "acc",
"datetime": "2018-11-12 00:00:00Z",
"license": "CC BY 4.0"
},
"stac_version": "0.8.1",
"type": "Feature"
}**
了解关于数据集和 STAC 资源的更多信息。
竞争
伴随数据集的是一个竞争性的机器学习挑战,总奖金为 15,000 美元,以鼓励全球的 ML 专家开发更准确、相关和易于使用的开源解决方案,以支持非洲城市的地图绘制。有两种参与途径:
语义分割跟踪 : 从航空影像中绘制建筑物足迹的最佳开源语义分割模型的奖金为 12,000 美元。
机器学习的目标是将每个图像中的每个像素分割(分类)为建筑物或非建筑物,模型性能通过交集/并集度量(也称为 Jaccard 指数)进行评估:

语义分割对于制图很有用,因为其像素级输出相对容易直观地解释、验证和使用(例如在建筑表面积的计算中)或作为下游步骤的输入(例如首先分割建筑物,然后对每个分割建筑物的属性进行分类,如其建造状态或屋顶材料)。
分段跟踪参与者还必须至少向负责的 AI 跟踪提交一次,才有资格获得 12,000 美元的分段跟踪奖金。
****
挑战数据集中的图像碎片(左)和分割(右)示例。
负责任的人工智能赛道:【3,000 美元奖金将颁发给将伦理视角应用于灾害风险管理的人工智能系统的设计和使用的最佳创意。
通过提供更准确、更快速或更低成本的风险评估方法,ML 可以改善灾害风险管理中的数据应用,特别是在与计算机视觉和地理空间技术相结合时。与此同时,我们迫切需要更好地了解使用核武器的潜在负面或意外后果。随着人们越来越关注在面部识别、刑事司法、医疗保健和其他领域适当和道德地使用 ML 的问题,我们有责任立即提高这些问题的灾难风险。
ML 技术在这一领域存在的潜在危害包括但不限于:
- 通过在整个机器学习开发管道中存在偏见,延续并加剧社会不平等。
- 在脆弱、冲突和暴力环境中,通过组合以前不同的数据集,加剧隐私和安全问题。
- 由于数据产品日益复杂,限制了公众参与灾害风险管理的机会。
- 降低了专家判断在数据和建模任务中的作用,从而增加了出错或误用的可能性。
- 方法、结果或不确定性程度的沟通不充分,增加了误用的机会。
ML 从业者和数据科学家处于独特的位置来检查和影响我们工作的道德含义。我们要求挑战参与者考虑在设计和使用灾害风险管理 ML 系统时出现的应用伦理问题。我们如何改进 ML 的创建和应用,以减少偏见,促进公平和道德的使用,清晰地告知决策,并制定保护用户和最终受益者的保障措施?
本专题的提交格式非常灵活:参与者可以提交 Jupyter 笔记本、幻灯片、博客、论文、演示、产品模型、推理小说、艺术作品、研究论文或原创研究的综合,或者任何其他最适合你的格式。评委将根据思想性、相关性、创新性和清晰性对提交的作品进行评估。
接下来是什么
这一挑战将产生新的公共产品,推进我们应用 ML 了解非洲城市风险的实践状态;这包括新的 ML 性能基准,用于从相关地理区域的航空影像中进行建筑物分割,用于非洲城市制图的顶级解决方案,以及对我们如何负责任地创建和部署用于灾害风险管理的 AI 系统的深入探索。
获奖的解决方案将作为开源工具和知识发布,挑战数据集将保持开放的数据资源,用于持续的 ML 开发和基准测试。全球减少灾害风险基金将利用所吸取的经验教训,为在城市制图和规划中使用 ML 的政策和采购策略提供信息。
加入挑战吧!
比赛目前持续到2020 年 3 月 16 日。还有一个月的时间,我们有充足的时间探索数据并参与其中任何一个专题讲座,但不要拖延,请立即加入:
driven data . org/competitions/60/building-segmentation-disaster-resilience
秘密市场数据集的开源金矿
秘密市场研究
如何运行分布式数据挖掘操作,以零成本获取和处理加密市场数据。

图表空间。所有图片由作者提供。
从第一次谈话中,我就应该知道,我即将被拖入另一个长达数年的项目。这一切都要追溯到 2017 年夏天。
我的兄弟路易斯·费尔南多·莫利纳几周来一直在摆弄一个视觉界面,他设想这个界面将成为一种新型交易机器人平台的基础。他坚持认为,能够可视化整个数据集是创造交易智能的核心。
对我来说,数据可视化和交易机器人出现在同一个句子中似乎有悖直觉。然而,他接下来的声明让这变得很明显…
他说,机器人不需要数据可视化,但制造机器人的人类需要。
我一点也不知道我们将在接下来的三年里建立一个巨大的系统!男孩被我拖进了过山车!
我们成立了一家初创公司,组建了一个团队,并在某个时候决定彻底改变计划,转向开源。
总有一天我会写下那个故事…
但是今天,我写信与数据科学社区分享我们为Superalgos创建的免费和开源数据挖掘基础设施,它可能对从事秘密市场研究、构建交易人工智能或寻找处理数据或运行回溯测试的可视化脚本解决方案的人有用。
正如社区中的 quants 正确指出的那样,基础设施不仅为我们的系统策略提供高质量的技术分析数据集…
Superalgos 数据挖掘解决了数据科学家的软件和数据工程需求,如提取、收集、清理和存储市场数据,以及一些数据分析需求,如转换、聚合和处理数据。
数据挖掘基础设施是作为一个算法加密交易平台的信息分支而建立的,但是,准确地说,它可以处理所有类型的数据,只要添加了正确的传感器。
接下来是我们迄今为止所构建的内容的鸟瞰图,以及您开箱即用的内容,免费,没有广告,没有收集个人信息,没有付费的专业版…只是您下载并在您的机器上运行的优秀的老式开源软件。
系统结构
我们希望有一个灵活的视觉环境,降低进入门槛,帮助不太懂技术的用户充分利用系统。同时,我们需要一个强大可靠的后端,配得上任务关键型金融系统。
在最高级别上,系统分为前端 web 应用程序和后端,前者在浏览器上运行动画 HTML5 画布,后者由一组节点 JS 进程组成。
代码库随系统一起发布,构成了一个完整的功能开发环境。系统在实际代码上未经编译就运行。
数据矿旨在维持实时数据挖掘和数据处理操作,向交易机器人提供复杂的信息,但也可能用于下载数据和离线处理数据。
Exchange 连接
早在 2017 年年中,我们就开始单独与食物链顶端的加密交易所 Poloniex 合作。当系统的核心经过几次迭代后,Poloniex 已经在前 20 名中找不到了。
伙计,在秘密世界里事情变化真快!是时候向更多的交流开放游戏了…
加密交换公开了可能随时间发展和改变的 API。如果您必须自己维护不同的连接器,这将是一个长期的挑战。
为了处理多交易所通信,我们实现了 CCXT 库——一个开源的标准化接口,加密货币交易所被邀请遵守该接口。简而言之,该实现允许访问大多数主要的交换。
传感器机器人
单个传感器机器人可以与所有支持的加密交换交互,并从任何市场获取数据。数据的完整性和完整性在交易应用程序中至关重要,因此我们在构建防弹传感器方面投入了大量精力。
该传感器下载一分钟蜡烛线的 OHLCV 数据(开盘价、最高价、最低价和收盘价,以及交易量),并输出一个数据产品,该产品随后被用作其他机器人的输入。
一些交易所还支持下载原始交易和订单数据。
指示器机器人
我们借用名称指示器来描述一种 bot,因为交易应用程序的主要兴趣是产生技术分析和技术研究。然而,基础设施允许各种计算。
在 Superalgos 中,指示器机器人将其他机器人的数据产品作为输入,应用用户定义的算法对其进行处理,并输出新的数据集。
数据处理逻辑可以嵌套在一个指标内的多个产品定义中,甚至可以跨指标嵌套,从而生成多个数据产品,这些产品可以为下游的其他流程提供数据。
视觉定义
指示器机器人可以在可视环境中创建和定义,唯一需要的编码是实际的数据构建过程算法。流程、依赖项、记录、数据集结构等的定义是在可视化脚本界面中完成的。

过程和数据产品的可视化定义
数据集结构
指标生成标准化数据集,由高度碎片化的文件组成,数据以 JSON 格式的数组形式存储在每个时间范围内:1、2、3、4、5、10、15、20、30 和 45 分钟;以及 1、2、3、4、6、8、12 和 24 小时。
... ,[1586044800000,1586131199999,6339.464,440.893,881.7869310984372],[1586131200000,1586217599999,6440.327,424.904,849.8082144837152],[1586217600000,1586303999999,6530.541,382.382,764.7649354906382], ...
文件存储在由Exchange > Market > Bot > Product > Time Frame组织的树状文件夹结构中,在时间较短的情况下——为了提高可访问性——文件也按Year > Month > Day排序。
执行
我们需要一个既能在离线状态下(例如,处理要进行回溯测试的数据)又能在实时交易情况下(需要从交易所获取原始数据,进行实时处理,然后提供给交易机器人)正常工作的执行环境。

机器人也可以在视觉环境中进行管理
在实时数据挖掘操作中,机器人以持续数秒的短脉冲运行,通常间隔一分钟。因为机器人依赖于其他机器人,所以系统跟踪依赖性并协调机器人的顺序执行,以维持从从交换中提取原始数据的时刻到最后一个指示器机器人运行并存储其输出的数据处理链。
数据可视化
我已经提到了我们对数据可视化的痴迷!我们希望将强大的数据构建功能与健壮的、用户定义的数据可视化解决方案相集成…因此我们发明了绘图仪。
绘图仪是在可视化环境中定义的设备,用于创建整个数据集的可视化表示,无需编码。这是最好的可视化脚本!

绘图仪…最佳视觉脚本!
首先用[datetime, price] 坐标定义数据点,然后用这些点定义多边形,这些多边形可能会被赋予图形样式。生成的图形叠加在时间轴上,在时间轴上,您可以分析所有时间范围内所有时间同步的数据集。
该系统允许沿着时间线浏览所有时间范围内的数据,并使所有数据产品作为可以相互叠加的层来提供。它允许创建多个图表,甚至是包含多组图表的多个仪表板。

绘图仪在图表上生成自定义数据可视化
分布式数据挖掘
我们希望支持不同的用例,其中一些需要使用过时的或极简的硬件来处理数据,而另一些则需要部署大量资源。

在网络中的节点间移动任务
我们最终将系统设置为在节点网络上分布式运行。这允许建立数据挖掘场,通过集中管理跨多个硬件实时分析多个维度的市场数据。决定您可以完成多少处理的是可用的硬件,而不是软件。
网络配置和挖掘任务在网络中的分布也是从直观的可视化环境中完成的,没有任何编码需求。
每次我开始一个新项目,我知道我的整个世界都会围绕它转上好几年。Superalgos 也不例外。我们是痴迷的人!
我刚刚与你分享的可能是系统中目前打包的功能的五分之一和有待开发的功能的十分之一!
我们很乐意从数据科学社区获得一些反馈,并希望我们迄今为止创建的内容对您有用。
在 Superalgos 文档网站中可以找到入门所需的所有信息。您将找到下载该软件的链接以及引导您完成学习曲线的视频教程。
如果你有任何问题或需要帮助,你可以联系 Superalgos 社区,在那里你会找到其他用户、开发者和我自己。
尽情享受吧!
OpenCV 人工智能工具包就像它看起来一样酷

2020 年 7 月 14 日上午 9:00,一个 smol 芯片崩溃登陆 Kickstarter 现场,引起了瞬间的混乱。
到 9:20,2 万美元的目标已经 100%到位。在 9:55 他们超过了 200%。
截至 8 月 7 日,还有 5 天就到了 85 万美元。
该芯片被称为 OpenCV AI Kit、或 OAK。
它正在通过使用嵌入式摄像头和开源即插即用软件将人工智能带入大众,从而改变游戏规则。这提高了人工智能最小学习曲线的门槛。
基于英特尔的 Movidius Myriad X VPU ,OpenCV 团队释放了大量未受影响的硬件能力,极大地提高了计算性能!
硬件
- OAK-1:单摄像头 4k @ 60fps 模块(45 毫米 x 30mm 毫米)
- OAK-D:一个带有 4k @ 60fps 相机和立体深度相机的模块
软件
- 一个新的 OpenCV OAK 库,用于在设备上实时神经网络处理
它能做什么
简而言之:很多。开箱即用的 OAK 使用标准的神经模型,可以对物体、人脸和车辆进行推理。它可以检测文本并运行字符识别。它可以运行深度辅助语义分割、对象跟踪、apriltag 检测、图像过滤和边缘检测等等。
都是实时的。
基准
至于 OAK-D 的表现如何,让我们将其与 Jetson Nano 进行比较,Jetson Nano 是一种高性价比的 NVIDIA 套件,用于并行运行神经网络操作。作为一个独立的套件,Nano 非常强大,但 OAK 也有两大优势:
- 如果你有任何空间需求的话,需要很多开销。你需要买一台相机来整合 Nano。
- Nano 运行的是完整的 Linux 版本。纯嵌入式 OAK 功耗极低,在神经推理方面速度极快。
规范

当然,一个完整的 Linux 系统通过额外的功能为您提供了更多的功能,但是由于小型、可负担的实时推理的永久行业限制,OAK 为快速可访问性领域带来了重要的新选择。
当然,快速主流检测的重大意义是扩大全球训练数据库,以提高模型准确性。
立体声深度功能
让我们更详细地讨论一下 OAK-D 的空间功能。
该芯片可以在标准 YOLO 检测的背景下运行立体深度融合,以进行 3D 渲染。通常需要大量计算能力和管道同步的立体神经推理现在可以并行运行,并对结果进行三角测量以获得更高的准确性。
难以处理的光障碍,如反射和其他会损害推断准确性和产生安全风险的噪声,大大减少。光盲会导致其他嵌入式摄像头出现多种问题,比如 kinect 的红外检测功能,这使得它在室外的准确性大大降低。
更多权力游戏:
- 对现有标准神经网络训练集的数据扩充,如图像扭曲、去扭曲
- 实时无损 12x 720p 角点检测
- 2 个片上神经计算引擎。神经深度的 16 种色调。
- 用于连接优先级的网络芯片链接。
包装它
我试图在保持合理简短的同时涵盖重点,但肯定鼓励查看更多信息,如【LUXonis 首席执行官 Brandon Gilles 的这个增强初创公司播客。
在运行 API 时,OAK 具有即时的开箱即用功能。超级灵活的麻省理工学院授权 OpenCV 软件是围绕绝对最小的开销而设计的。正如 Gilles 所说,他们试图使用“可发现性”来允许特性按需出现,但不需要启动任何臃肿的软件。这使得像艺术家这样的创作者只需改变一行就能投入行动。
强大、可扩展、廉价且快速。奥克斯似乎真的有独立功能的完美风暴。我等不及 12 月了!
真的很好奇想听听大家的想法!这种嵌入式功能有这么强大吗?你认为其他芯片公司会推出有竞争力的替代品吗?留言评论!
一如既往,感谢您的阅读!
Git 的最佳备忘单
理解 Git 并涵盖重要和常用的 Git 命令,以便于参考

什么是饭桶?
GIT 是一个 DVS( 分布式版本控制),它在软件开发过程中跟踪源代码的变化。它简化了项目协作过程,并跟踪任何文件中的更改。它是一个存储代码的平台,可以由一组程序员在项目的开发阶段并行访问。
我们为什么需要 GIT?
当在项目中工作时,为了避免开发者之间的冲突,我们使用版本控制系统,比如 Git。
什么是版本控制系统?
我们在日常生活中使用的版本控制系统的一个简单例子是电子邮件。版本控制系统(VCS)是一个程序(或一组程序),它跟踪文件集合的变化。一个目标是轻松地召回单个文件或整个项目的早期版本。
使用版本控制系统,您可以:
- 看到所有的变化
- 检索过去的版本
- 创建 分支
版本控制系统有两种类型:
- 分布式版本控制系统
- 集中版本控制系统
Git 是一个分布式版本控制系统。什么是分布式版本控制系统?
在分布式版本控制系统中,每个用户克隆中央存储库来创建他们自己的个人存储库,其中包括项目的完整历史。
在 DVCS,每一个开发者或客户都有自己的服务器,他们在本地服务器或机器上有整个历史或代码版本及其所有分支的副本。基本上,每个客户端或用户都可以在本地工作并断开连接,这比集中式源代码控制更方便,在集中式源代码控制中,只有一个服务器,所有开发人员都可以在其中报告和进行更改,这就是为什么它被称为分布式的原因。
Git 的区别& GitHub

由 Rahul Pathak 在媒体上拍摄的照片
- Git 是一个版本控制系统,而 GitHub 是一个代码协作平台!
- Git 是软件,而 GitHub 是服务
- Git 安装在本地计算机上,GitHub 托管在 Web 上
- Git 提供了命令行工具,GitHub 提供了图形界面
- 它可以与各种工具一起使用,或者在您的计算机上本地使用,以帮助您跟踪代码项目中的更改。GitHub 使用 Git 进行版本控制,并为您提供各种出色的协作工具。

拉胡尔·帕塔克在媒体上拍摄的照片

最佳 GIT 备忘单:
⭐Download 吉特
GitHub for Windows
GitHub for Mac
GitHub for Linux
⭐ 设置
配置所有本地存储库使用的用户信息
git config — global user.name “[firstname lastname]”
它设置了一个在查看版本历史时可识别的名称。
git config — global user.email “[valid-email]”
设置将与每个历史标记关联的电子邮件地址。
git config — global color.ui auto
为 Git 设置自动命令行颜色,以便于查看。
⭐ 设置&初始化
配置用户信息,初始化和克隆存储库
git init
将现有目录初始化为 Git 存储库
git clone [URL]
通过 URL 从托管位置检索整个存储库
⭐ 舞台&快照
使用快照和 Git 暂存区
git status
显示工作目录中为下次提交准备的已修改文件。
git add [file]
将文件添加到您的下一次提交(阶段)中。
git reset [file]
在保留工作目录中的更改的同时,取消文件登台。
git diff
已更改但未登台的内容的差异
git diff --staged
已暂存但尚未提交内容之间的差异。
git commit -m “[descriptive message]”
将暂存内容提交为新的提交快照。
⭐ 分公司&合并
隔离分支中的工作,更改上下文,并集成更改
git branch
列出您的分支当前活动的分支旁边会出现一个*号。
git branch [branch-name]
在当前提交时创建新的分支。
git checkout
切换到另一个分支,并将其签出到您的工作目录中。
git merge [branch]
将指定分支的历史记录合并到当前历史记录中。
git log
显示当前分支历史记录中的所有提交。
⭐ 检查&比较
检查日志、差异和对象信息
git log
显示当前活动分支的提交历史记录。
git log branchB..branchA
显示分支 A 上不在分支 b 上的提交。
git log — follow [file]
显示更改文件的提交,甚至跨重命名。
git diff branchB…branchA
显示分支 A 中的内容与分支 b 中的内容的差异。
git show [SHA]
以人类可读的格式显示 Git 中的任何对象。
⭐ 跟踪路径变化
版本文件删除和路径改变
git rm [file]
从项目中删除该文件,并为提交准备移除。
git mv [existing-path] [new-path]
更改现有文件路径并准备移动。
git log — stat -M
显示所有提交日志,并指出任何移动的路径。
⭐ 忽略模式
防止无意中暂存或提交文件
logs/ .notes pattern*/
将具有所需模式的文件另存为。gitignore 使用直接字符串匹配或通配符 globs。
git config — global core.excludesfile [file]
系统范围忽略所有本地存储库的模式。
⭐ 分享&更新
从另一个存储库检索更新并更新本地存储库
git remote add [alias] [URL]
添加一个 git URL 作为别名。
git fetch [alias]
把 Git 遥控器上的所有分支都拿下来。
git merge [alias]/[branch]
将远程分支合并到当前分支中,使其保持最新。
git push [alias] [branch]
将本地分支提交传输到远程存储库分支。
git pull
从跟踪远程分支获取并合并任何提交。
⭐ 改写历史
重写分支、更新提交和清除历史
git rebase [branch]
在指定分支之前应用当前分支的任何提交。
git reset — hard [commit]
清除临时区域,从指定的提交重写工作树。
⭐ 临时提交
临时存储修改过的、被跟踪的文件,以便改变分支
git stash
保存修改和暂存的更改。
git stash list
列表堆栈-隐藏文件更改的顺序。
git stash pop
从栈顶开始写工作。
git stash drop
放弃堆栈顶部的更改。
Git 是给所有人的。这是一个伟大的方式来管理您的文件,这是一个强大的工具。它已经成为这个行业中的一个重要工具,起初看起来似乎很神秘,但是在几个小时内,你将能够掌握这个伟大的工具。
参考文献
教育@ GitHub
你也可以参考我的另一篇文章,在那里我有一篇关于 Git
Git 的基本命令:一个完整的指南
你也可以在这里翻翻我的其他文章:
拉胡尔·帕塔克
非常感谢:)
代码审查是一个好主意的其他原因
不仅仅是抓虫子
什么是代码审查?
代码评审本质上就像它听起来的那样:在代码被批准/接受到代码库中之前,对代码进行评审。大致流程是这样的;工程师写一些代码是为了修复一个 bug/解决某项工作。工程师发出一个代码审查/拉请求,基本上是要求他们的变更被项目主体接受。一个或多个其他工程师审查代码变更,留下评论/反馈,或者批准或者拒绝变更。拒绝通常是一种临时状态,要求处理意见/反馈,并再次提交更新的更改以供批准。
这个流程的想法是确保进入项目的代码满足各种期望和标准,由团队中的每个人强制执行。正在实施的需求通常包括编码风格标准、单元/其他测试以及一般的代码质量。这个过程还提供了一个机会来抽查代码中任何潜在的错误、逻辑问题或其他问题。通常,在允许代码更改继续进行之前,这个批准门需要至少两个其他工程师的批准。但是这个过程的所有部分因团队而异。
代码评审不应该是讨论特性/实现设计反馈的地方。这应该在开始编写代码之前很久就发生了。

凯文·Ku 在 Unsplash 上的照片
他们还提供其他什么福利?
如上所述,代码评审提供了许多质量关、过程和标准化的好处。但是对于团队、最终的代码以及整个项目来说,还有很多潜在的好处,但往往不太为人所知。这些只是我的前三名。
分享项目知识
代码评审是传播关于项目中正在发生的变化的详细知识的好方法。通过团队共享知识,而不是把知识锁在小仓库里(最糟糕的情况是 一个 的小仓库),对项目的势头和未来有着非常切实的影响。对于团队中那些积极参与代码评审的人来说,它充当了“新闻节拍”或者流入代码库的变更的脉冲。这使得工程师不仅能够了解最新的工作情况,还可以通过考虑这些变化来规划他们当前和未来的工作。例如,如果另一个工程师将要在同一个区域进行更改,看到代码区域正在更改可以帮助避免冲突。此外,如果有重叠,这可能会影响他们下一个任务的实现细节。
最重要的是,如果您的项目涉及到处理现场问题/事件的随叫随到的元素,那么代码评审为将要部署到生产中的变更提供了一个提示。随叫随到的工程师可以使用传入的代码更改来提高他们对正在更改的内容的意识。如果生产中出现问题,这有助于加快问题来源的识别。当事故发生时,通常是由于管道中某处的变化。
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@royherrod/membership)
授课机会
设置一个关卡来阻止未经审查的代码变更,有助于确保代码库的健康和质量。但是保持高质量的代码需要整个团队的持续学习和教育。代码评审为团队中的高级成员提供了一种直接而明确的方式来教导那些较低级的成员。代码审查的真正目的是寻求反馈,并在代码被认为准备好之前做出必要的修改。这种明确性消除了提供反馈时的一些尴尬障碍。在代码审查的环境中,反馈不是无根据的或无端的批评。它在公共场所受到追捧和讨论。这种透明度有助于确保所提供的反馈是建设性的,并允许对反馈本身进行审查和评论。
作为标准流程的一部分,鼓励这种要求、提供和接受反馈的文化有助于团队以统一的方式前进。许多高级工程师将急切地抓住机会帮助推动团队的标准,指导那些初级代码库,并以身作则。这对他们来说是一个巨大的增长机会。
学习的机会
直接收到对您正在开发的代码的建设性反馈是让您专注于代码质量的一个好方法。但是代码审查也提供了其他更有成效的学习方法。
代码评审对于那些代码库新手来说是一个很好的机会,可以看到团队中更有经验的人是如何工作的。通过花时间仔细阅读当前和现有的代码评审,工程师可以深入了解团队是如何运作的,以及特定的工程师是如何解决问题的。这是接触不同编码风格、问题解决和设计模式以及系统内部工作的好方法。以及观察团队的礼仪,包括他们如何给出和接收反馈,以及遵守编码标准和其他期望。理想情况下,代码评审还应该提供被观察代码的具体环境,以及围绕所做选择的讨论/反馈,而不是在没有指导的情况下费力地通过一个巨大的代码库。
鉴于所有这些原因,我强烈鼓励我团队中的每个工程师抽出时间参与代码评审。无论他们是帮助提高标准并教育他人的高年级学生,寻求扩展他们的经验并接触他人代码的低年级学生,还是希望保持与项目中的变化相关的任何人。参与这些讨论可以获得很多信息。
在对抗冠状病毒的战斗中被忽视的数据科学家:生物统计学家

Eric J. Daza(作者)大约 2014 年在 Gillings 全球公共卫生学院的生物统计系在北卡罗来纳大学教堂山。(图片来源:J.P. + J.K .)
这正是用科学严谨的生物统计学方法来锤炼数据科学冲刺敏捷性的时候。
流行病学家,特别是传染病专家,是指导数据科学解决方案的终极领域专家,这些解决方案对新型冠状病毒(“冠状病毒”)及其健康影响(即新冠肺炎特征和影响)的人群健康相关方面进行建模或分析。因此,令人鼓舞的是,越来越多的数据科学黑客马拉松和项目正确认识到需要招募流行病学家来指导解决方案的开发。不寻求他们的指导是一个巨大的错误,可能会增加报告统计数据的噪音,从而误导普通人、医院、政策专家和政府下一步该做什么。
但这些人口健康数据科学项目继续在很大程度上忽略了一个关键的自然队友和合作者群体:生物统计学家。
生物统计学家——公共卫生的统计学家——几十年来一直是卫生数据收集和分析的管理者。他们经过专门培训,能够识别和解决人类健康数据分析中出现的问题和并发症。他们深入的以健康为重点的方法培训和经验不仅涵盖统计建模,还包括选择偏差(例如,观察者/报告/检测偏差)、遗漏(即,缺失数据模式)、测量误差、人口统计学、调查抽样、研究设计、数据管理和因果推断(例如,正确处理混杂因素,以真实估计干预效果)。重要的是,生物统计学家接受培训,整合解决这些许多并发症的方法,着眼于有效地咨询和沟通流行病学家和其他卫生研究人员。
生物统计学家是公共卫生的原始“全栈”数据科学家。
单独的统计建模既不是统计学也不是生物统计学,只是围绕“减少偏倚”或“平衡偏倚和方差”的数据叙事的一部分。数据科学家可能是统计建模方面的专家,可以补充、增强甚至改进生物统计模型。但是从前面的段落中可以清楚地看到,为什么仅仅这项技能并不能使他们成为生物统计学家。
简而言之,生物统计学家是公共卫生的原始“全栈”数据科学家。
- 他们的可交付成果、产品和解决方案传统上是研究方案、数据收集程序和研究开始时的统计分析计划(理想情况下),以及贯穿始终的数据管理和分析报告。
- 他们的客户和顾客通常包括流行病学家、其他公共卫生研究人员(如营养、健康行为、环境/职业健康、孕产妇/儿童健康)、政府机构和研究所、临床试验人员以及制药/生物技术和生命科学公司。
上述生物统计学概念(无统计建模)中没有一个被深入地教授给数据科学家——如果有的话。然而,数据科学家擅长巧妙地整合统计建模、软件工程和计算机科学,以提供可扩展的业务或组织解决方案(即,可以在非常大的互连数据集和数据库上非常快速地实施)。相反的观点也成立:如果一个生物统计学家擅长统计建模,这并不自动使他们成为数据科学家。
我非常清楚这些数据科学任务是多么巨大。作为一名医疗数据科学团队中的统计学家,我深深体会到了我的队友每天优化分析和工程流程和管道以满足非常苛刻的期限的技能和耐力。通过我们不断的互动,我内化了如何管理时间限制的平衡,什么是理想的,什么是可以做的。
与数据科学博客和社交媒体上发布的令人信服的数据可视化和漂亮的仪表盘相比,预测和潜在的反事实通常更加嘈杂和有偏见。
然而,正如 Hernán 等人(2019) 所指出的,数据科学家往往来自物理或生命科学背景和领域。这些在很大程度上涉及低噪音数据系统和良好表征的机械关系。即使这样的数据科学家知道公共卫生数据要嘈杂得多,但在比赛完成冲刺或满足最后期限,或击败其他冠状病毒黑客马拉松团队到达终点时,依靠这些简化的假设也是很自然的。数据中的噪音和科学中的不确定性(即,我们对生成数据的机制的理解)都被作为讨厌的因素放在一边,留待以后处理。首先是构建分析工具,这很有意义。
不幸的是,在冠状病毒流行的关键人群水平特征建模中,这些讨厌的因素往往是最重要的,尤其是在早期。例如,这些可能包括易感-暴露-感染-移除(SEIR)模型的参数。因此,如果没有流行病学家和公共卫生方法论专家(如生物统计学家和卫生统计学家)的指导,通常的数据科学过程会严重崩溃。与数据科学博客和社交媒体上发布的令人信服的数据可视化和漂亮的仪表盘(例如,交互式图表和表格)相比,预测和潜在的反事实(即,“无干预”下的结果或反之亦然,视情况而定)通常更加嘈杂和有偏见。
哈佛大学陈廷骅公共卫生学院网上研讨会(新冠肺炎数据科学论坛)最近给想要提供帮助的数据科学家的建议听起来非常有用。以下是我对这条建议的提炼和解释:
- 停止试图重新发明 SEIR 车轮。至少,不要在没有流行病学资质的情况下,在你的博客或其他社交媒体上公开发布你自己的 SEIR 式模型。相反,尝试改善数据收集工作,以帮助更好地估计 SEIR 模型的参数,公共卫生专业人员现在需要帮助。将你的想法提交给这些健康专家进行审查。招募生物统计学家或健康统计学家队友,他们将帮助你正确地做这些事情。他们不仅会帮助你减少偏见,还会指导你如何诚实地向你的健康专家“客户”传达你的解决方案中的噪音和不确定性。参见怀南茨等人(2020 )的一个很好的例子。
- 利用您独特的专业知识来改善公共卫生基础设施的关键组成部分。例如,创建强大的解决方案来链接消费者数据库、健康记录、地理空间数据和可穿戴设备/应用程序/传感器数据。这些可能有助于改善供应链、医院和临床协调、接触者追踪、疾病监测、病人护理以及精神和身体健康,同时练习社交距离。招募生物统计学家或健康统计学家的队友,帮助处理和减轻选择偏差、遗漏引起的偏差和测量误差;帮助人口统计、调查抽样、研究设计和数据管理;并帮助进行因果推理。这些同事将在您意识不到的建模和部署狂潮中捕捉到重要的分析和建模假设,这些假设会直接影响您的预测,以及基于这些假设做出的生死攸关的决策。
那么,为什么数据科学界没有邀请生物统计学家来帮助对抗冠状病毒呢?
我的猜测是,数据科学家倾向于将生物统计学家视为随机控制试验(RCT)统计学家或专家。…这给人一种错误的印象,即数据科学家在进行随机对照试验和其他临床研究时,只需要生物统计学家的输入。
我的猜测是,数据科学家倾向于将生物统计学家视为随机控制试验(RCT)统计学家或专家。这可能是由于生物统计学家在制药、生物技术和生命科学行业的突出地位——至少引起了行业数据科学家的注意。(很多生物统计学家也在学术界工作。)这给人一种错误的印象,即数据科学家在进行 RCT 和其他临床研究时,只需要生物统计学家的输入。
对所有已经在和流行病学家或其他相关公共卫生专家一起工作的数据科学家说:干得好!现在考虑在你的团队中加入生物统计学家。现在正是用科学严谨的生物统计学方法来锤炼数据科学冲刺敏捷性的时候。(重要的是,请记住,虽然许多生物统计学家与流行病学家一起工作,但他们通常不能代替流行病学家。)
对于所有想要通过与数据科学家和公共卫生专家合作来帮助抗击冠状病毒的生物统计学家:
- 准备好以极快的速度进行研究设计和分析,通常是回顾过去。
- 习惯于必须快速识别、报告和交流隐性分析假设对下游决策和行动的重要性和影响。你通常没有时间去细化它们。
- 准备在敏捷项目管理系统(例如,Scrum、看板、wikis)中完成所有这些工作。这将有助于您与数据科学家和数据工程师团队成员进行沟通和协调。
采取这些行动可能会帮助你更好地理解和加强在以冠状病毒为重点的数据科学的快速发展的世界中统计预测的通常常见(但隐含)的推论。
有关相关观点,请查看:
-
“统计学在对抗冠状病毒中的作用”
-
“如果我们不适应,数据科学只会对(生物)统计构成威胁”作者 Jeffrey Leek 博士对简单统计
[## 如果我们不适应,数据科学只会对(生物)统计学构成威胁
我们之前在这个博客上提到过统计数据需要更好的营销。最近,卡尔·b·提出“…
simplystatistics.org](https://simplystatistics.org/2013/04/15/data-science-only-poses-a-threat-to-biostatistics-if-we-dont-adapt/)
参考
- 新冠肺炎数据科学园区。https://www . hsph . Harvard . edu/bio statistics/2020/03/新冠肺炎-数据-科学-zoomposium-4-2/
- 获得正确因果推理的第二次机会:数据科学任务的分类。机会。2019 年 1 月 2 日;32(1):42–9.https://amstat . tandfonline . com/doi/full/10.1080/09332480 . 2019 . 1579578
- Wynants L,Van Calster B,Bonten MM,Collins GS,Debray TP,De Vos M,Haller MC,Heinze G,Moons KG,Riley RD,Schuit E .对新冠肺炎感染诊断和预后预测模型的系统综述和关键评价。medRxiv。2020 年 1 月 1 日。https://www . medrxiv . org/content/10.1101/2020 . 03 . 24 . 20041020 v1
关于作者
Daza 博士是一名生物统计学家和健康数据科学家,而不是流行病学家,他为个性化(n-of-1)数字健康开发因果推断方法。| ericjdaza.com🇵🇭🇺🇸@埃里克森达扎linkedin.com/in/ericjdaza | statsof1.org@ stats of@ fsbiostats
不确定性的疫情
新冠肺炎和科学的朦胧进步

本·怀特在 Unsplash 上的照片
如果科学易于解读,或许在如何最好地处理新冠肺炎危机上,会有更多的共识。但是,唉,许多问题仍然存在。
例如:
我们过了顶峰了吗?我们把曲线弄平了吗?第二波感染会到来吗?这种疾病比预期的更致命吗?是不是少了?瑞典和日本是怎么回事?中国真的在复苏吗?
任何能够自信地回答这些问题以及更多问题的人要么是在撒谎,要么是被欺骗了,或许两者都有一点(我对和很有信心)。
我已经能听到反对的声音,“但是这项研究说…”或者“某某博士说…”或者(我个人最喜欢的)“科学说…”
问题是,目前对这种疾病及其复杂的人群效应知之甚少,无法确定任何事情——这就是为什么早期的模型是“错误的”,并继续被修订(就此而言,模型“错误”或“正确”意味着什么是另一个问题)。而且,科学的进步充满了不确定性;理论和假设被暂时搁置,直到有更好的理论将它们扫地出门,或者有更多的数据证实它们。
流行病学的社会科学方面进一步加剧了这一问题,流行病学是一个多学科领域,植根于医学、生物学、经济学和行为科学。这使得在过程的早期得出确定的结论特别具有挑战性,因为人类的决策会影响任何模型的结果,而这些决策无法被精确地建模或预测。这往往会导致模型对其潜在的假设和选择特别敏感。
让我们看一个当前的例子,看看普遍存在的 R0(“R-零”)估计。这个被广泛讨论的数值是一种疾病传播速度的量度。根据经典文本( Anderson 和 May ),“R0 更精确地定义为当一个受感染的个体被引入一个所有人都易感的宿主群体时产生的二次感染的平均数量。”
以季节性流感为例,它的中值 R0 值约为 1.3,这意味着每个感染该疾病的人平均会感染 1.3 人。较高的 R0 值意味着较高的感染率,大于 1 的值通常会导致疫情,而小于 1 的值意味着疾病不会足够快地增殖,最终会灭绝。这看起来很简单,但事实远非如此。
新冠肺炎或任何其他疾病的 R0 不是一个常数,也不是特定病毒或疾病的严格函数。换句话说,流感可能具有较低的 R0(在一些社会中,几乎肯定是这样),或者它可能具有较高的 R0。它取决于疾病的性质以及人类对疾病的行为和态度。
例如,如果对着自己的手打喷嚏、握手、从不洗手在文化上是可以接受的,所有这些都发生在一个拥挤在一个小岛上的数千万人口的城市中,那么这个社会中流感的 R0 可能远远高于 1.3。另一方面,如果文化不鼓励亲密的身体接触,期望生病时戴口罩,手要定期消毒,在一个格陵兰人口密度的社会,我们可以期望一个低得多的 R0。此外,这种价值观会随着态度和惯例的改变而改变。
当我在媒体上看到这个值的讨论时,通常给出一个单一的数字。在许多研究中,也提供了一个单一的数字(较好的产生范围和估计值),好像这是来自高层的R0,这可能导致一种印象,即这纯粹是一个由疾病发现和提供的值。如果人们对个人卫生、与他人的互动、口罩等方面的态度确实发生了改变——就像他们在新冠肺炎的情况中明显看到的那样,那么 R0 也有望发生改变。会有多大变化?这也不好说,这给一个已经很复杂的模型增加了另一个维度的不确定性。因为我们不知道,我们将不得不做一些假设。
最好的作者会为这些假设辩护。但通常,你会经常看到作者遵从其他作者的意见,并引入他们的假设,假设这些其他作者已经充分捍卫了他们自己的假设。毕竟有出版的压力,尤其是在这种情况下。
我不想让人觉得我在诋毁学者和研究人员。依靠该领域的其他专家往往是最好的方法,但在有些情况下,一个未经检验或掩盖的假设可能会导致整个领域误入歧途(只要看看描述股票价格的布朗运动假设,就知道过去 20 年对金融和纳税人造成的伤害)。
情况变得更糟。
这个世界很乱。即使我们可以在群体水平上进行优秀的、可控的实验(我们真的做不到),也很难从噪音中分离出信号。这可能导致研究人员在试图研究同样复杂的现象时得出截然不同的结论。
让我们坚持 R0 的估计,但看看以前的一些流感爆发,我们有更多的文献可以借鉴。
Biggerstaff 等人【2014】撰写了一篇文章,研究了估计四次主要大流行(1918 年西班牙流感、1957 年 H2N2、1968 年 H3N2 和 2009 年 H1N1 猪流感)以及季节性流感和新爆发病例的 R0 值的文献。他们从 1950 年至 2013 年的 111 篇同行评议的学术论文中报告了每种流感类型的 R0 估计值。我总结了以下一些发现。

R0 估计来自 6 个流感类别的 111 篇论文。数据来自 Biggerstaff 等人【2014】
你可以看到,对于其中的大多数,有一个广泛的数值和一个更大的传播范围,特别是对于有更多研究的疾病。视觉上,我们可以用一个方框图来看看这是什么样子。

首先出现的是——季节性流感有几项 R0 值超过 15 的研究!这真是高得吓人。这些估计碰巧来自对 1977-78 年流感季节英国一所寄宿学校的研究。这些数值可能如此之高,是因为学校距离较近,缺乏预先存在的免疫力,或者仅仅是因为研究中的样本量相对较小(763 名学生),使得这些点与其他疫情不同。让我们把注意力集中在其他方面:

这里值得注意的是,即使有异常值,我们也可以对季节性流感的预期 R0 值相对有信心,因为我们有 47 项研究的数据可以追溯到 19 世纪 90 年代!所以我们大致知道流感是如何表现的。这是否意味着我们将能够预测 2030 年摩尔多瓦的流感死亡和感染人数?
不一定。2030 年摩尔多瓦的情况是否更类似于 R0 接近 1、2 或更高的情况?在建立一个模型时,需要考虑很多情况,很难用一个数字来概括。
当处理这些类型的动力系统时,这就产生了一些固有的不确定性。参数的选择可以改变一切。
一个小组的模型预测的感染人数可能是下一个小组的 10 倍,而且两者都建立在合理的假设上。基于这些值,您甚至可以在一篇论文中看到很大的范围。
以《帝国报》为例,该报预测,如果不采取行动,未来两年美国将有 220 万人死亡。它提供了基于 R0 值 2–2.6 的英国敏感性分析。根据 R0 的选择,死亡可能会增加约 2.5 倍!
以免你认为流行病学模型总是偏高,《柳叶刀》2015 年的一篇文章讨论了一项对南非 10 个艾滋病毒模型的元研究。所有这些都低估了艾滋病毒的上升,作者问道,“如果我们在南非这个有着丰富数据的环境中得到如此错误的模型预测,那里有十个领先的艾滋病毒流行病学建模小组专注于他们的注意力,我们在哪里可以充满信心地得到正确的预测?”**
坦率地说,我们对当前疫情的最佳模型是不可靠的。在英国采取行动后,Neil Ferguson(帝国研究的作者)修改了他的模型,预测了 2 万人死于疫情。截至发稿时,英国的总死亡人数不到 3 万。即使是世界上最顶尖的专家也不能确定会发生什么——不确定性太多了。
你能做些什么呢?
未来总是未知的,但我们无论如何都要过好自己的生活。在所有情况下,权衡缓解的风险和成本是谨慎的,但当风险很高时更是如此。
值得庆幸的是,风险通常是不对称的,换句话说,相对于不利因素,预防是廉价的。诸如戴口罩、洗手等缓解措施易于实施,并且相对于成本而言具有很大的益处。
这些简单的步骤通常被认为是日本、韩国、香港和新加坡相对成功应对这种疾病的原因。

精明地使用这些模型并不是作为一个水晶球,而是作为一种工具来看到不利之处,并相应地减轻自己的风险。有这么多的不确定性,科学和专家们也无能为力。
帕累托法则是世界第八大奇迹
为什么 80/20 是(数据分析和时间管理的)黄金法则
我先从一个故事开始这篇文章。

去年夏天,我在特斯拉的生产优化部门实习。作为一名有抱负的工业工程师,我的任务是“走出去,改善事物。”说起来容易做起来难。
我工作的 Gigafactory 的一个区域有一台巨大的机器,它将电池穿梭于缓冲区,然后进入电池组制造流程的下一步。这台复杂的机器出现了很多问题,导致红灯闪烁和停产。
在和工程师开了几次会,查询了一些数据之后,我了解到了帕累托图的真正价值。这使我们能够专注于最关键的修复(每周),从而在生产中获得最大收益。这对于一个不断努力提高产量、降低总成本的工厂来说至关重要。
…那么什么是帕累托图呢?很高兴你问了。
历史

维尔弗雷多·帕累托(来自维基百科
为什么叫帕累托?它是以意大利经济学家维尔弗雷多·帕累托的名字命名的——多好的名字啊——因为他在 1896 年首次发现了“80/20 效应”。帕累托图是由管理顾问约瑟夫·M·朱兰推广的。巨然是质量和质量管理领域的先驱。
帕累托法则也被称为“关键少数法则”下一节将帮助您理解原因。
基础知识
帕累托图被认为是六适马工具,因为它有助于减少过程中的可变性/缺陷。这是阐明(并有希望修复)问题主要原因的有效方法。
主要前提是:80%的结果来自大约 20%的原因。这种 80/20 的比例可以在很多商业场景中找到。
例如,下图是我在质量工程课上的一个学校项目。我们观察了一家浪费材料的校园冰沙店(即成品冰沙放不进杯子)。由于有许多不同的配方,我们没有时间去分析和完善每一个以减少浪费。
所以,我们使用了 80/20 法则,创建了一个帕累托图!如果您对我们创建下面的图表所采取的步骤感兴趣,我已经将它们包含在本文末尾的附录部分中。

在一家真正的奶昔店订购的奶昔的帕累托图(由我拍摄)
右侧 y 轴上方的绿线表示思慕雪计数的累计百分比。它下降到 x 轴,指示构成该累积百分比的思慕雪(即垂直线左侧的条形)。因为在现实生活中没有什么是完美的,所以我尽可能接近 80%,也就是 77%左右。然后,查看 x 轴上的冰沙数量,构成这 77%废物的冰沙数量是 6。6/17 =冰沙总数的 35%。所以,这个分析显示更像一个 77/35 的比率,但它仍然是有用的。
6 思慕雪配方比所有这些配方更容易优化。这样做,我们就有可能消除商店近 80%的成品浪费(假设由于缺乏标准测量工具和其他流程变化,每种思慕雪配方都产生了相同的浪费)。
帕累托图让公司成为数据驱动的和高效公司。很棒,是吧?
应用程序
所以我提到了电动汽车制造和思慕雪制作的应用。帕累托法则的其他更常见的应用是什么?
- 经济学:帕累托观察到意大利 80%的土地被 20%的人口所拥有。
- 计算机科学:微软发现,通过修复报告最多的前 20%的错误,他们可以减少 80%的相关错误和崩溃。【1】
- 商业销售:一家公司 80%的销售额来自 20%的客户。【2】
- 项目:一般来说,“前 20%的努力实现了 80%的价值。”【3】
这个列表当然可以继续下去,如果你仔细想想,这真的是大自然的一个惊人的壮举(因此本文的标题)。
结论
现在是时候在你自己的工作场所或个人生活中利用这些强大而简单的图表了。80/20 规则对于任何公司来说都是一个很棒的管理工具,它还可以改进数据分析项目的业务案例或业务应用程序。

由 Austin Distel 在 Unsplash 上拍摄的照片
附录
在 Excel 中创建帕累托图的步骤:
- 按降序对数据进行排序。
2.为降序数据创建累积百分比列(公式为该行的累积总和/第一列的总和)。
3.用降序数据列创建条形图。
4.右键单击图表并选择“更改系列图表类型”从菜单中选择“组合”
5.对于包含降序计数的系列(在我的示例中为思慕雪计数),选择图表类型“簇状柱形图”对于累计百分比列,选择图表类型“折线图”最后,选中折线图旁边的“副轴”框。
如果您有最新版本的 Excel,您可以简单地突出显示您的降序计数列,然后单击“统计”图表菜单下的帕累托图(见下面的截图)。

新的排列图 Excel 选项(我摄)
从最大似然估计到隐马尔可夫模型
如果你认为你很了解一个话题,试着解释给别人听。如果你能解释清楚,那么你就真正理解了这个主题。
因此,在这篇文章中,我将尽可能全面地解释什么是隐马尔可夫模型。为此,我还需要描述一些主题,如最大似然估计(MLE)、马尔可夫链、向前向后算法和 Baum-Welch 算法。
在深入研究之前,我们需要问自己的第一个问题是:学习分布有帮助吗?当然!以朴素贝叶斯为例。
然而,朴素贝叶斯处于监督学习的保护伞之下。我们能在无监督学习上做些什么?
生成模型:
假设分布 D 具有某种已知的形式。
分布的一些参数是未知的,我们的目标是根据一些样本 S~D 找到这些参数
应用生成模型可以更好地分类、推断(参数可以告诉我们关于数据的故事)、隐马尔可夫模型等。
例: 我们来考虑一下伯努利分布: θ ∈ [0,1],D _θ=伯努利(θ)。 现在我们来考虑一个样本 S=(x_1,…,x_n) 如何从 S 估计θ?我们稍后会回答这个问题。
最大似然估计:
最大可能性已经在过去的许多帖子中讨论过了。即便如此,为了这篇文章的完整性,我将提供(我认为是)一个相对简单的解释。
最大似然估计 (MLE)是一种基于观测数据集估计分布参数的方法。
首先,我们需要定义这个问题:
- 分布 D_θ
- 样本 S=(x_1,…,x_n)
- 参数空间——我们分布的参数可能值的集合
例 1:伯努利分布θ=【0,1】
例 2:高斯分布θ=ℝ⋅ℝ+
由于实际的θ未知,我们希望使用 S 来估算θ。换句话说,我们想要检查对于每个θ’∈θ,从 D_θ 生成 S 的概率。
MLE 背后的直觉如下:
选择θ”,这将使数据集 S 相对于分布 D_θ 最不令人惊讶。换句话说,目标是找到尽可能接近真实分布参数 θ 的θ】。
让我们用公式表示离散密度的定义:

因为使用对数总和要容易得多,所以让我们对等式应用 log:

θ'相对于 S 的对数似然
使用该表达式,我们可以将最大似然估计值定义为使对数似然最大化的θ*:

回到我们的伯努利例子:


计算可能性:

计算对数似然性:

现在,为了找到 MLE,我们将对表达式求微分,并与零进行比较:


意思是——我们的 MLE 是 S 中所有点的平均值,如果你仔细想想,这是有意义的。
现在我们知道什么是最大似然,我们甚至看到了如何计算它的例子。
然而,由于不是所有的分布都有封闭形式的解,我们需要一种方法来有效地估计最大似然估计。
这可以通过期望最大化(EM) 算法有效地完成。该算法使用迭代过程在具有潜在变量的统计模型中执行最大似然估计。
马尔可夫链:
让我们定义一个有限马尔可夫链:
给定 n 个状态:

其中 n 是有限的,并且初始起始状态 S_0 (固定的或从初始分布中提取的),我们可以将转换定义为从当前状态 S_t 移动到下一个状态 S_(t+1) 。
马尔可夫链中的转移必须满足马尔可夫性质:

换句话说,马尔可夫链是描述序列的随机模型,其中对于 1≤t≤n, S_t 的概率仅取决于 S_(t-1)的概率

来源:https://en . Wikipedia . org/wiki/Markov _ chain #/media/File:Markov Kate _ 01 . SVG
隐马尔可夫模型:
现在我们知道什么是马尔可夫链,我们可以定义隐马尔可夫模型。
隐马尔可夫模型(HMM)是一种模型,其中除了马尔可夫状态序列之外,我们还有一个输出序列。
HMM 可以用以下公式描述:
- 状态数 m 状态数
- 初始状态分布:

- 转换模型(记住马尔可夫属性):

- 输出(排放)模型:


来源:https://en . Wikipedia . org/wiki/Hidden _ Markov _ model #/media/File:hiddenmarkovmodel . SVG
HMM 是一种潜在变量模型,我们只能观察模型的输出:

而状态序列对我们是“隐藏”的。
我们将解决该领域的两个基本问题:
- 学习—如何学习 HMM 模型
- 评估-如何评估输出序列相对于给定模型的概率
评价:
我们的目标是评估一个已知序列的概率:

关于经过训练的 HMM 模型。
使用初始状态分布、转移模型和输出模型来描述 HMM 模型。
先试试 —我们可以用一种天真的方式,通过把所有隐藏状态序列的概率相加来评估概率。




这将花费我们成倍的时间。不太好。但是你不要担心,我们可以利用模型的结构在多项式时间内计算出这个概率!
第二次尝试 —
向前向后算法
该算法利用动态规划的思想在多项式时间内解决评价问题。从它的名字我们可以假设它以一种向前向后的方式(分而治之)在序列上工作。
远期概率:

这意味着 α_t(i) 表示我们观察到序列 O_0,…,O_t 的概率,并且在 t 位置,隐藏状态是 s_t=i.
现在,通过将 α_t(i)除以所有α_t(j ),我们得到:

我们可以使用 HMM 概率以如下方式定义 α_t(i) :


后向概率:

也就是说给定当前状态,从状态 I 得到未来事件 O_(t+1),…,O_n 的概率是多少。
我们可以使用 HMM 概率以如下方式定义β_t(i ):


使用αt,βt,我们现在可以评估后验概率:

现在,我们需要计算的是

对任意的 t=0,…,n 在时间 t 对所有可能的状态求和

前向-后向算法求解 O(n⋅ m 中的评估,其中 m 是隐藏状态的数量。
学习:
现在我们知道了如何基于给定的模型来评估序列的概率,接下来我们将学习如何使用输出序列来估计 HMM 概率。
换句话说,我们希望估计:初始概率,转移概率和输出概率。
你可能会问自己,为什么我们不能用最大似然估计?这个问题问得好,但是只有一个问题 HMM 的找 MLE 是 NP 难的!
但是不用担心,我们会使用 Baum-Welch 算法,这是我们之前提到的期望最大化(EM)算法的一个特例。
鲍姆-韦尔奇算法的一般思想如下:
当观察一个输出序列 S 时,假设我们有 HMM 概率,我们可以估计隐藏状态。另一方面,给定隐藏状态,我们可以估计 HMM 概率。我们将在两者之间交替进行。
在深入研究该算法之前,我们先定义以下内容:
从前向后算法中回忆αt,βt。
让我们定义两个新的概率γ_t(i),ξ_t(i):


我们现在可以描述 Baum-Welch 算法的伪代码(对于离散情况):
给定 L 个序列的形式:

重复直到收敛:
- E 步骤:计算隐藏状态的后验概率。
计算:γ_t(i),ξ_t(i)对于所有序列,I,j,t=0,…,n_𝔩 - M 步:根据 E 步的后验概率计算 HMM 模型概率。
初始概率:

转移概率:

输出概率:

算法描述基于 https://www . cs . bgu . AC . il/~ inabd 191/wiki . files/lecture 20 _ 讲义. pdf
一直持续到收敛。
我们在这里没有讨论的一个话题是推理问题,我们如何根据观察序列找到最可能的隐藏状态序列。
总结:
-
我们学习了什么是最大似然估计,以及如何在特定情况下计算它
-
我们简单介绍了一下马尔可夫链
-
我们学习了如何定义 HMM 模型,如何使用 Baum-Welch 算法估计模型参数,以及如何评估给定模型下输出序列的概率
现在你(希望)知道什么是最大似然估计,如何计算,当计算最大似然估计是 NP-hard 时你能做什么,如何训练 HMM 模型,以及如何基于给定的模型评估输出序列。
机器学习的专家之路

阿曼德·库利在 Unsplash 上拍摄的照片
为那些自学或来自一个新领域的人提供的指南,以及一个资源列表。
简介:
请允许我先说一个事实,我根本不是机器学习方面的专家。我写这篇文章不是为了假装我也是。15 年后再跟我谈,我可能会认为自己正在接近专家头衔。我每天都在学习新的东西,并在现实世界中运用它。这种心态是现场所需要的,也是成功的保证。
心态:
就像几乎所有其他的成功之路一样,这一切都始于健康的心态。如果你不相信自己会成功,那么谁会呢?
很容易将自己与世界上的伊恩·古德费罗斯、安德鲁·恩斯和莱克斯·弗里德曼相提并论。我一直都这么做。然而,与我相比,他们唯一真正拥有的是时间——这也是他们成为今天的自己的原因。他们决定打造自己的道路,投入工作,应对工作带来的压力,让时间顺其自然。你和我——与伊恩、安德鲁和莱克斯相比不过是菜鸟——也必须这样做。
耐心加上长远的思考总会带来成功。如果你想快速成功,你也许可以做到。然而,讨论这种成功的可持续性是另一个话题。你的心态是阻止短期满足长期收益的关键。这是你能为自己做出的最好牺牲,因为你可以选择这种牺牲。我的猜测是,当你看到那些长期收益最终显现时,你不会回头看你所做的牺牲。
说了这么多,我还想为这个领域提供一些我最喜欢的免费资源,希望你的职业生涯能从中受益。
免费资源:
1 —亚马逊的机器学习大学
当我看到安东尼在 TDS 上的文章时,我感到震惊。这个 YouTube 频道几乎涵盖了技术公司希望从机器学习工程师那里获得的机器学习方面的每个关键话题。如果你想了解更多关于渠道的信息,我推荐你阅读我上面提到的文章。
你可以在这里找到机器学习大学 YouTube 频道。
2—/r/机器学习
Reddit 的社区涵盖了你能找到的每一个主题或兴趣,机器学习领域也不例外。这种资源不像机器学习大学,在那里它是严格的教程和案例研究,而是为那些感到孤立于该领域的人提供更广泛的社区。虽然学习新的任务和技能非常重要,但拥有一个分享你所学的社区对你的成长和 ML 工程师一样有价值。
你可以在这里找到链接的 subreddit。
3—莱克斯·弗里德曼播客
Lex Fridman,正如我上面提到的,是为数不多的处于 AI 研究前沿的人。他的播客——正式名称为 Lex Fridman 的人工播客——Lex frid man 播客汇集了所有学科和领域的各种科学家,包括但不限于人工智能、计算机科学、物理、数学等等。他的 YouTube 频道上有播客的视频部分,也有他在麻省理工学院的深度学习讲座——我觉得这非常有价值。
这个播客是为数不多的让我每一集都认真思考的播客之一,不管是谁在说。无论您在哪里收听播客,都可以获得播客。
你可以在这里找到 Lex 的 YouTube 频道。
4—send ex
sentdex 是 YouTube 的一个频道,提供各种类型的 Python 编程教程,涵盖各种级别的体验。当我第一次开始学习 Python 时,他的频道作为一个特殊的资源为我现在的工作打下了基础。无论是越来越熟悉 Python,学习如何使用 Google Cloud,还是从头开始构建神经网络,setdex 都可以满足您从这些主题到之间任何地方的需求。对于那些自学的人,我强烈推荐使用这个频道作为你可能不熟悉的主题的“搜索引擎”。
你可以在这里找到 sentdex YouTube 频道。
5 —蒂姆的技术
Tech with Tim 是一个 YouTube 频道,有各种教程和项目可供学习和获取灵感。他的许多项目都是用 Python 编写的,所以如果你是这门语言的新手,那么它和 sentdex 将是你作为 Python 程序员成长的无价之宝。蒂姆的项目利用了大量的人工智能,其中一些专注于游戏开发,为那些有兴趣将这两个领域融合在一起的人服务。
你可以在这里找到蒂姆的 YouTube 频道。
结论:
要成为任何领域的专家,都需要时间、耐心和团队意识。我希望这些资源(以及我的动机介绍)能帮助你在困难时期前进,实现你最大的梦想。
感谢您的阅读。
使用逻辑回归进行分类的完美方法

用逻辑回归解决分类问题
监督学习是机器学习的重要组成部分。当要预测的变量是分类变量时,使用分类技术。分类问题的一个常见例子是试图在三种不同的种类中对鸢尾花进行分类。
Logistic 回归是机器学习从统计学领域借用的一种分类技术。逻辑回归是一种用于分析数据集的统计方法,其中有一个或多个决定结果的独立变量。使用逻辑回归的目的是找到描述因变量和自变量之间关系的最佳拟合模型。
在这篇文章中,我们将首先从理论上探讨什么是逻辑回归,然后我们将建立我们的第一个分类模型。但是在开始写这篇文章之前,我建议你看一下我的上一篇文章,借助机器学习,了解一下分类问题到底是什么
为什么不是线性回归:
考虑一个场景,其中我们需要对特定类型的癌症是否是恶性的进行分类。如果我们对这个问题使用线性回归,则需要设置一个阈值,基于该阈值可以进行分类,因为线性回归返回连续值。

图片来自 Gfycat
但是在实际类别是恶性的情况下,预测的连续值是 0.4。假设阈值为 0.5,数据点将被分类为非恶性,这可能导致严重的后果。因此,可以推断线性回归不适用于分类问题,因为它是无界的,并且预测值是连续的,而不是概率性的。
将预测概率转换为类别标签的决定由称为阈值的参数决定。高于该阈值的值表示一个类别,而低于该阈值的值表示另一个类别。

图片来自 Freepik
不仅如此,线性回归对不平衡数据也非常敏感,因为它试图通过最小化误差(直线和实际值之间的距离)来拟合直线。结果可以推断,线性回归更适合于回归问题,而不适合于分类问题,这使得逻辑回归成为可能。
逻辑回归:
逻辑回归是机器学习中使用的一种分类技术。它使用逻辑函数来模拟因变量。因变量本质上是二分法的,即可能只有两种可能的类别(例如:癌症是恶性的还是非恶性的)。因此,在处理二进制数据时使用这种技术。

图片来自 Gfycat
逻辑回归的类型:
尽管通常用于预测二元目标变量,但逻辑回归可以扩展并进一步分类为三种不同类型,如下所述:
- 二项式:目标变量只能有两种可能的类型。例如。:预测邮件是否为垃圾邮件。
- 多项式:目标变量有三种或三种以上可能类型,可能没有任何数量意义。例如。:预测疾病。
- 序数:目标变量有有序的类别。例如。:网络系列评分从 1 到 5。
在逻辑回归中,为了将预测值映射到概率,使用了 sigmoid 函数。该函数将任何实数值映射为 0 到 1 之间的另一个值。这个函数在每一点都有一个非负导数,并且只有一个拐点。

图片来自 Freepik
成本函数
成本函数是一个数学公式,用于量化预测值和期望值之间的误差。简而言之,成本函数是衡量模型在估计 x 和 y 之间关系的能力方面有多错误的标准。成本函数返回的值被称为成本或损失或简称为误差。对于逻辑回归,成本函数由以下等式给出:

这个负函数是因为我们在训练的时候,需要通过最小化损失函数来最大化概率。假设样本是从完全独立的分布中抽取的,降低成本将增加最大似然。
现在你对什么是逻辑回归有了一个概念,我们现在将建立我们自己的逻辑回归模型。这个分类模型的代码和其他资源可以在这里找到。
第一步:导入所需的库
我们的第一步是导入构建模型所需的库。没有必要在一个地方导入所有的库。首先,我们将导入熊猫和 Numpy 库。

图片来自 Freepik
一旦导入了这些库,我们的下一步将是获取数据集并将数据加载到我们的笔记本中。我们将在这个例子中使用的数据集是关于心脏病的。
*#Import the Libraries and read the data into a Pandas DataFrame*import pandas as pd
import numpy as npdf = pd.read_csv("framingham_heart_disease.csv")
df.head()
熊猫图书馆用于访问数据。 read_csv 函数输入格式的数据。csv 进入熊猫数据框。
head() 函数用于显示数据帧的前几条记录。默认情况下,该函数显示前五条记录,但是可以通过输入所需的值来显示任意数量的记录。
步骤 2:清理数据集
数据清理是通过识别不完整、不正确或不相关的数据部分,然后替换、修改或删除粗略数据,来检测和纠正表或数据库中损坏或不准确的记录的过程。

图片来自 Freepik
可以使用 isnull 函数检测数据集的缺失值。这些缺少值的记录要么被删除,要么用记录的平均值填充。然而,输入近似值可能会在模型中引入方差和/或偏差。
偏差误差是学习算法中错误假设产生的误差。高偏差会导致算法错过特征和目标输出之间的相关关系,从而导致欠拟合。
*#Handling missing data*series = pd.isnull(df['cigsPerDay'])
另一方面,方差是由于模型对训练集中的小波动的敏感性而引起的误差。高方差会导致算法对训练数据中的这些波动进行建模,从而导致模型的过拟合。

图片作者作者
在本例中,我们还注意到数据集的某些特征(如教育)在决定输出时不起作用。此类特征应在构建模型前删除。
#*Dropping unwanted columns*data = df.drop(['currentSmoker','education'], axis = 'columns')
cigs = data['cigsPerDay']cig = cigs.mean()
integer_value = math.floor(cig)
cigs.fillna(integer_value, inplace = True)
data.dropna( axis = 0, inplace = True)
像 CigsPerDay 这样的某些特征已经表明这个人是吸烟者,因此 CurrentSmoker 列实际上是没有用的。
步骤 3:分析数据集
既然我们的数据集是干净的,没有不规则性,下一步将为心脏病高风险人群和心脏病低风险人群创建两个独立的数据框架。
这一步也可以称为特征工程。另一个重要的步骤是可视化数据,因为它非常有助于确定选择哪些特征可以产生最佳结果..
*#Analyzing The Dataset*Heart_Attack = data[data.TenYearCHD == 1]
No_Heart_Attack = data[data.TenYearCHD == 0]final = data.drop(['diaBP','BMI','heartRate'], axis = 'columns')
特征工程的另一个重要步骤是缩放数据,因为逻辑回归对数据是否被缩放很敏感。如果数据没有缩放,模型可能会认为 3000 克大于 5 千克,这可能会导致错误的预测。

图片来自 Freepik
在本例中,我还删除了【diaBP】【身体质量指数】和【心率】的值,因为它们与十年一次的值相似。
步骤 4:准备模型
既然我们已经清理了数据并选择了有效的特征,我们就可以根据我们的训练数据来拟合模型了。为此,我们首先需要将数据集分成具有给定随机状态的训练和测试数据,以便每次执行程序时输出保持不变。在这个例子中,随机状态是 99。****
*#Preparing the model*from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.20, random_state = 99)from sklearn.linear_model import LogisticRegression
model = LogisticRegression()model.fit(X_train, y_train)
model.score(X_test,y_test)
完成后,从 sklearn.linear_model 导入 LogisticRegression,并根据训练数据拟合回归方程。可以通过计算模型得分来评估模型的性能。
在本例中,该模型的准确率为 85.6%。混淆矩阵也是总结预测模型性能的好技术。其中有两种可能的预测类别——阳性和阴性。

图片由作者
混淆矩阵可以进一步用于确定各种重要的度量,包括准确度、 ROC 得分、精确度、 F 得分等。
逻辑回归的优势
逻辑回归是解决分类问题最有效的技术之一。使用逻辑回归的一些优势如下所述。
- 逻辑回归更容易实现、解释,并且训练起来非常有效。它对未知记录的分类速度非常快。
- 当数据集是线性可分的时,它表现得很好。
- 它可以将模型系数解释为特征重要性的指标。

图片由 Gfycat 提供
Logistic 回归的缺点
尽管广泛使用,逻辑回归也有一些限制,如下所述:
- 它构建了线性边界。逻辑回归需要独立变量与对数概率线性相关。
- 逻辑回归的主要限制是因变量和自变量之间的线性假设。
- 更强大和紧凑的算法,如神经网络,可以轻松胜过这种算法。
总结你学到的东西
为了总结我们在本文中学到的东西,首先我们讨论了什么是逻辑回归,以及如何用它来建立分类模型。然后,我们讨论了各种不同类型的逻辑回归、其成本函数和用于评估分类模型性能的指标。
然后,我们动手体验了该算法,构建了我们自己的分类模型。为了支持我们的学习,我们还讨论了这种技术的优点和缺点。
至此,我们已经到了这篇文章的结尾。我希望这篇文章能够帮助你对什么是逻辑回归以及何时在你的机器学习之旅中使用它有一个坚实的理解。如果你有任何问题,或者如果你认为我犯了任何错误,请随时与我联系!您可以通过电子邮件或 LinkedIn 与我联系。快乐学习!
调查数据的风险

在 Unsplash 上由 Helloquence 拍摄的照片
不要落入这些调查数据的陷阱
尽管调查很少是理想的,但在某些情况下,它是获取数据的唯一途径。直接问一个人问题意味着数据会有偏差,不一定反映事实。任何数据科学家都知道,分析的好坏取决于数据,所以数据最好是好的。
在本文中,我将概述一些常见的调查陷阱,以及如何避免它们以设计更好的在线调查。
陷阱 1:从众偏差(社会合意性偏差)。
从众偏见是指调查者意识到他们应该根据群体中的从众心理回答什么,而不是他们实际上的想法。
例如,给定问题“你的大学经历如何?”从哈佛或斯坦福这样的名牌大学毕业的人可能会偏向于给出更高的分数,因为他们觉得自己属于“精英”群体。回答一个人的大学经历不愉快,从某种意义上说,就是把大学和这个人分开。因此,如果 Bob 不喜欢耶鲁,他很有可能会在匿名调查中回答说他有过积极的经历。如果他回答“不,我有过糟糕的经历”,他可能会觉得自己不是真正的耶鲁校友。
另一个例子是洛杉矶的政治中立公民,他们不太关注政治。当问及他们的政治观点时,他们可能会支持民主党的理想,以符合他们的社区和朋友。
重要的是要认识到匿名并不能解决偏见。人们在调查中有意识地带着偏见回答,不是因为他们关心调查者看到了什么;他们用有意识的偏见来回答,比如从众偏见,因为这让他们自我感觉更好。在从众偏见的情况下,如果他们的回答更像他们的社区或朋友,他们会觉得不那么孤独。在处理意识偏见时,这是一个需要理解的重要概念。
减少从众偏见的一个方法是将人口统计学问题放在调查的最后。研究已经表明,通过将引起从众偏见和社区的问题放在调查的最后,用户可以更诚实地回答问题。
像“你的最高教育水平是什么”、“你来自哪个地理区域”、“你是什么性别”、“你是哪个种族”等问题会强化会导致从众偏见的社区意识。
陷阱 2:"从 1 到 5 排列 x
主观排名是调查中的一大缺陷。要求用户从“1 到 5”进行排序的问题容易受到 1 和 5 的主观含义的影响。在数据分析中,客观才是王道。
当互联网文化中心 Reddit 被设计的时候,它的创造者最初考虑了一个 5 星级系统来对帖子进行排名,但选择了一个向上投票-向下投票系统,因为在 5 星级系统中有太多的主观性。毕竟,对鲍勃来说是 2,对汤姆来说是 4。
当使用等级问题时,考虑自由和主观之间的平衡是很重要的。具有更多评级选项的系统将为分析师提供更多数据,但也增加了主观性,因此降低了数据质量。在 Reddit 的例子中,不需要 5 星评分,因为 Reddit 需要的只是用户是否喜欢它,而不是量级(他们喜欢与否的程度)。Reddit 拥有如此海量的数据,以至于每个用户的数量级都微不足道。设计调查时,请记住问题试图为分析师完成什么。
甚至李克特量表(强烈不同意,不同意,中立,同意,强烈同意)也可以判定。一项去除了李克特“中性”选项的研究产生了更真实的结果,因为“中性”是一个快速的下一个问题按钮,几乎不需要思考。通过迫使调查者同意或不同意,它可以给你比“中立”更多的见解。但是,如何使用它取决于问题场景。
设计问题时,选择给出的最佳选项数量。试着给每个数字或选项的含义附上一个客观的衡量标准,并且永远记住分析师。
陷阱 3:问太多问题
不要问太多问题。这似乎是显而易见的,但调查创建者往往会塞进一些不必要的问题,心想,“这只是两个问题。不会有太大影响。
在设计调查之前,记住目标——每个问题都应该回答目标的一部分。问太多的问题(尤其是在无报酬的调查中)会减少完成调查的人数,并使完成调查的受访者匆忙完成问题。
问更多的问题也不一定意味着分析师有更多的数据。分析师知道,对带有大量噪音和与目标无关的问题的数据执行统计模型会使分析师的生活变得更加困难。如果数据集中有足够多的噪声,噪声就不再是噪声,因为它在统计上变得很重要。
把几个问题缩小成一个问题,是信息量和信息质量的平衡。一个上升,另一个下降。每个问题的设计都应该考虑到分析师——正是他们从调查数据中挖掘见解。
如果你的调查足够短,显示“ x 分钟完成”,其中 x 足够短,结合一个简短的关于调查参与者可能产生的积极影响的简介,将会提高参与度。当问题数量较少时,收件人会在每个问题上花费更长的时间和更多的思考。
陷阱 4:分配不均
当你发布公众调查时,你应该有一个目标受众。重要的是要意识到用于分发调查的模式如何影响哪类人对调查做出回应。
例如,针对某个州的在线总统选举投票可能会减少那些没有常规互联网接入的贫困选民。
确保调查受访者代表目标受众是很重要的。毕竟,调查是基于这样一种想法进行的,即某些随机选择的人代表了一个总体。
有许多传播媒介。重要的是要认识到每一个人如何减少特定的人口统计数据(或放大目标人口统计数据)。
重要的是要认识到,在测量中,数量不一定是质量。类似于增加冗余问题的数量,将更多不属于目标受众的人添加到调查受访者中会增加分析的噪音。如果有太多的噪音,它会扭曲分析。
总之…
当你设计调查时,
- 尽量把人口统计学问题留到最后,避免引发从众偏见。
- 确保选项是客观的,并且只根据分析师的意图为问题选择合适的选项。
- 设计调查时,每个问题都应该回答调查大目标的很大一部分。不要问不必要的问题。
- 注意你如何分发你的调查——不均匀的分发会误导分析。确定目标受众,并确保几乎所有接受调查的人都是该受众的一部分。
在 A/B 测试中使用 Google Analytics 用户计数的风险
如今,许多分析师、营销人员、产品经理、UX 和 CRO 的专业人士都依赖 Google Analytics、Adobe Analytics 或类似工具提供的用户计数来执行各种统计分析。这种分析可能涉及统计假设检验和 A/B 检验的估计部分,也可能包括回归和预测模型(LTV、流失等)。).如果你是他们中的一员,做好准备,因为这篇文章将揭示一些关于这些用户数量的惊人“秘密”。
我不会轻易说“秘密”。尽管我有多年的谷歌分析经验,但我只是最近才意识到我在这里分享的是什么,所以我认为“秘密”是当之无愧的。当涉及到在 A/B 测试中使用 GA 用户数量时,GA 用户数量的真正本质的含义是巨大的。可能还有其他统计分析。哦,就我有限的理解,Adobe Analytics 的用户似乎也不能幸免。所以抓紧你们的帽子,让我们开始吧。
谷歌分析中显示的用户数量不是用户计数
对于越来越多的谷歌分析用户来说,上述情况是真实的。在所有各种谷歌分析报告中显示的用户数量并不是在任何给定的时间范围内在网站上执行操作的用户数量的精确计数。说得专业一点——他们没有显示GA 会话日志中存在的唯一 cookies 浏览器/GA 客户端 id 的数量。
相反,这些报告中显示的用户数量是对真实用户数量的概率估计。

谷歌分析报告中报告的用户数量示例(图片由作者提供)
这意味着显示的数字几乎不可避免地会偏离真实的计数一个可变的百分比。故意的。无论你做什么,如果某个开关被设置为开(见下文),你就不能在谷歌分析界面或 API 中得到一个真实的计数。人们得到的都是近似值。
怎么会这样呢?
这一事实在官方文档中有所提及,该文档在某个时间点进行了更新,以反映 2017 年发生的变化:
2017 年初,Google Analytics 开始更新对用户和活跃用户指标的计算,以更高效地统计用户,具有高准确度和低错误率(通常低于 2%)。
“如何根据用户指标识别用户”,分析帮助
属性设置屏幕中这种看似无害的切换是在以前的用户数量计算(精确计数)和使用近似值的新计算之间切换的方式:

谷歌分析界面中的用户指标切换(图片由作者提供)
默认情况下,新的谷歌分析属性的开关是打开的(与文档所述相反)。这也是许多用户在过去几年中一直关注的事情,因为它在大多数分析报告中提供了更有用的(与其他选项-会话相比)用户指标。在各种谷歌分析属性中,用户计数处理的缓慢变化可能是几乎没有人注意到的原因,包括我自己,直到最近。
以上也意味着:
没有抽样的报告可能包含估计值,而不是精确计数
在我看来,低于 100%抽样的报告是我期望在 GA 报告中看到概率估计而不是原始计数的唯一情况。当分析需要通过超过 500,000 个会话来生成临时报告时,会出现不到 100%的采样。预定义报告明显不受此限制。

(图片作者)
只要我看到绿色盾牌图标,我就确信我看到的数据包含精确的计数,因此准确到不受任何实施问题和通常的跟踪障碍影响的程度。
但是,现在只有当“在报告中启用用户指标”开关设置为关闭时,这种情况才成立。如果该属性已经手动或默认设置为 ON,则上述直觉变得不正确,因为即使对 100%的会话进行采样,并且即使在预定义的报告中,用户数量也不是精确的计数。
如下文所述,这具有重要的意义。但是首先,为了在报告中考虑用户指标,牺牲了多少准确性?
分析中显示的用户数量有多准确?
虽然文档指出,在用户分析打开的情况下,估计用户计数的错误率通常小于 2%,但通过了解更多有关 Google Analytics 所采用的算法,可以获得更准确的图像。
Analytics 360(以前的 Google Analytics Premium)是一个付费的分析版本,允许通过 Google BigQuery 访问原始数据。BigQuery 允许从原始命中数据中获得用户的准确计数,或者指示引擎使用基于 HyperLogLog++算法的概率估计来进行基数估计。使用 HyperLogLog++ (HLL++)估算提取的数字与 Analytics 用户界面中显示的用户数量相匹配。Patryk Buczyński 在和在描述了这一点。一位知情的谷歌员工在电子邮件中也向我证实了使用 HyperLogLog (HLL)的消息。
在 Patryk Buczyński 的文章中,Google Analytics 使用的精度参数估计为 14。这意味着,如 BigQuery 文档所述,对于 68%的估计,它的准确度为 0.41%,对于 95%的估计,准确度为 0.81%,对于 99%的估计,准确度为 1.22%。这相当于用 16 位寄存器初始化的 HLL 的精度。
对于 99%的估计值,上述精度转化为高达 2%相对误差的绝对值,这正是上述分析文档中规定的典型误差率限值。
为了形象化这个错误的大小,假设有一个网站在工作日每天接收 200,000 个用户,在周末接收 100,000 个用户。下面是对这些数字进行精确计数后的用户趋势的比较,以及这些数字与随机生成的相同真实计数的超对数估计值的比较:

将精确的用户数与 HyperLogLog++中的基数估计值进行比较(图片由作者提供)
对于 99%的估计值来说,最大 2%的误差可能听起来没什么大不了的,而且在上图中也看起来不像。事实证明,这种印象远非正确。
对 A/B 测试结果的准确性有哪些影响?
首先,简要回顾一下在线控制实验的成功标准。我在不止一个场合说过,大多数 A/B 测试应该基于基于用户的指标,理想的是每个用户的平均收入。基于用户而不是基于会话的指标意味着:
- 其结果在解释上不那么模糊,并且对决策有更大的影响。
- 与基于会话或页面浏览量的指标不同,基于用户的指标尽可能接近独立观察,这是许多统计测试中的一个关键假设,因此提高了统计的有效性。
基于会话的指标暂且不谈,让我们采用最简单的基于用户的指标:某种基于用户的转换率,比如基于用户的订阅率。
如果在一次测试中每支队伍的用户少于 12,000 人,那么统计数据将在很大程度上保持不受影响,因为 HyperLogLog++算法在这些水平上实现了极高的准确性。当超过每个测试组的用户数量时,情况就不同了,用户越多,情况就越糟。
以下是超级对数++基数估计对统计分析准确性的影响的模拟结果:

HyperLogLog++基数估计对统计分析影响的模拟结果(图片由作者提供)
用户每测试臂 P 值低于 0.05 α膨胀 P 值低于 0.01 α膨胀 P 值低于 0.001 α膨胀
如果没有来自 HyperLogLog 的影响,则“P 值低于 0.05”列中的所有数字应该为 5%或更低,“P 值低于 0.01”列中的所有数字应该为 1%或更低,“P 值低于 0.001”列中的所有值应该为 0.1%或更低。事实远非如此,而且随着样本量的增加,差异也会增加。
α通货膨胀栏显示了差异的百分比。也就是说,仅仅凭借使用谷歌分析 HLL++用户计数,他们的不确定性估计会偏离多少:如果阈值为 0.05,不确定性会增加 16%到 13 倍(相当于 95%的置信度),如果阈值为 0.001,不确定性会增加 70%到 53 倍(相当于 99.9%的置信度)。
下图直观地展示了相同的数据。这六个图表是来自 10,000 个 A/A 测试的 p 值分布。如果一切正常,它们应该都包含接近均匀分布的图。相反,请注意随着每臂样本量(基数)的增加,分布变得多么偏斜:

来自 HLL++ A/A 测试的比例 p 值的绝对差异(图片由作者提供)
尽管 2%的相对误差看似无害的 99%的误差幅度,但它对统计估计的有效性有严重的影响。名义上保证 5%的 I 型错误率可能最终是 100%的实际错误率,并且基数足够大。类似地,95%置信区间的覆盖范围将从名义上的 95%减少到实际的 0%。贝叶斯估计也好不到哪里去,类似的效果也可能适用于其他类型的统计分析。
相比之下,这相当于一个非常频繁的偷看结果意图停止(等待显著性),但不同于偷看,来自 HLL++估计的效果实际上是无限的。
以上意味着在用户分析开关打开的情况下,任何具有适当样本量的 A/B 测试(依赖于从 Google Analytics 属性中提取的基于用户的指标)的结果都会完全受损。
要更全面地了解使用 HyperLogLog++和类似基数估计的效果,请阅读整篇文章。
鉴于上述情况,我相信所有关心使用 Google Analytics 数据进行统计测试和评估的人都应该对获得准确的用户数感兴趣,而不是概率性的评估。
对 A/B 测试结果的影响示例
在这里,我给出了两个真实世界的数据例子,来说明使用评估可以对实验指标做些什么。

对 A/B 测试结果的影响示例(图片由作者提供)
在一批二十个测试中,上面的六个测试通过使用精确计数而不是分析提供的基数估计,完全逆转了结果。Impl,”代表实施干预。剩下的 14 个没有,但被改动的程度较小。显然,点估计和区间估计也会受到类似的影响。应当注意的是,前三项测试也未通过其 SRM 检查,而后三项则未通过。
上述统计结果来自简单的固定样本分析。在实践中,经常使用顺序分析来代替,因此这里有两个用户计数估计和精确用户计数的示例(单击查看完整大小的图像)。

敏捷 AB 测试示例——相同的结果,不同的估计值(p 值、lift、CI)(图片由作者提供)

敏捷 AB 测试示例——不同的结果和评估(图片由作者提供)
在第一个示例中,基数估计数据的测试很早就停止了,虽然在这种情况下实际数据的结果是相同的,但由于较高的不确定性(较低的观察到的和估计的提升,较低的 p 值,不同的置信区间界限),它来得较晚,并且统计估计是不同的。
在第二个例子中,当使用 HLL++估计时,测试提前停止,并且无效(观察到低于期望的统计显著结果的概率)。它在最后一个可能的时间停止了,带来了相反的结果,自然也带来了不同的估计。
用估计值代替用户数的广泛影响
我知道很多本土系统依赖谷歌分析来存储数据,然后进行统计分析。有些完全由 JavaScript 驱动,而有些则使用服务器端系统来交付测试体验。一些从业者可能会使用类似 Google Optimize 这样的工具来运行测试,使用 Google Analytics 来存储数据,然后分别进行分析(这种方法也是我建议的一种运行 A/B 测试的经济实惠的方式)。
最重要的是,即使是使用其他系统进行实验和存储测试数据的 CRO & UX 从业者,也经常会用 GA 中的片段分析来补充主分析。在进行这种分析的范围内,它们实际上面临相同的问题。
此外,虽然本文讨论的重点是 Google Analytics,但其他平台可能会使用相同或更差的基数估计算法。例如, Adobe Analytics 使用 HyperLogLog,其实现方式为 95%的估计提供高达 5%的误差。这将导致比 Google Analytics 用户更糟糕的结果,如果他们实际上使用的是裸机 HyperLogLog 而不是 HyperLogLog++,那么即使每只手臂的用户少于 12,000 人的测试也可能会遇到严重的统计有效性问题。如果在 Adobe Target A/B 测试软件中使用相同的系统,结果会更加直接。
采用基数估计代替精确计数的更广泛的后果是,过去几年中,未知但可能相当大量的 A/B 测试以及可能使用 Google Analytics 用户数据进行的其他统计分析如果样本量足够大,就会受到彻底的损害。这同样适用于依赖 Adobe Analytics 数据(可能还有 Adobe Target 数据)的测试。
根据此类实验得出的决策数量以及每个案例中的利害关系,这种可能会转化为严重的累积损害。包括这样一个事实,即所做的一些决策将对未来产生深远的影响,以及作为元分析的一部分的持续影响和指导未来发展的“成功”模式的集合,累积的潜在损害可能比迄今为止发生的损害高几倍。
如何在 Universal Analytics 中获得准确的用户数?
鉴于以上所述,如果 Google Analytics 用户数将用于任何类型的统计分析,例如用于 A/B 测试目的的细分(例如,自定义维度包含用户被分配的测试 ID 和变量),恢复这些用户数的准确性是非常重要的。不幸的是,这既不容易也不是没有代价的。
在这里,我提供了实现这一目标的四个步骤:
- 步骤 1: 从管理>属性>属性设置中关闭“启用报告中的用户指标”切换。
- 第 2 步:准备一个自定义报告,键入 Flat Table,其中第一维是包含实验 ID 和变量 ID 的维度(例如,一个自定义维度,或用于优化实验的内置“带有变量的实验 ID”维度)。第二个维度应该是浏览器,第三个维度应该是设备类别。对于度量,选择用户、新用户和会话。基于主维度添加一个包含过滤器,以便它与您将从中提取数据的实验 ID 和变量完全匹配。
- 步骤 3: 加载报告并选择合适的日期范围。从“显示行”表下拉列表中选择比显示的行数更多的行。在报告顶部选择导出,然后选择最适合你的选项(我估计你不会想要 PDF 格式的)。
- 步骤 4: 打开生成的电子表格,获得每个测试变量或其他感兴趣的细分市场的用户总数。

示例自定义报告配置,用于分析中的准确用户计数(按作者分类的图片)
对于要分析的每个区段或测试,需要单独的自定义报告,或者您需要不断编辑报告的过滤器设置。
完成上述操作后,可以重新打开开关,直到下一次。也就是说,除非使用 API 自动提取数据,在这种情况下,需要将其永久设置为 OFF。如果在任何给定时间都有多人在访问分析报告,那么切换也不会很好…将切换移动到视图级别似乎可以解决很多问题,但这不是任何最终用户都可以做到的。
事实上,API 提取是由控制 UI 报告的同一个开关控制的,这使得 HyperLogLog 问题成为一个大问题,即使对于技术上有能力的团队来说,他们还没有足够的钱来负担 Analytics 360。选择是放弃 UI 中的用户数据,以便通过使用 API 保持足够的准确性。
关于 Google Analytics 4 的说明
随着 Google Analytics 4 刚刚推出,现在可以选择将原始分析数据导出到 BigQuery,但这显然会带来自己的成本和开发资源。另一方面,GA4 中目前没有自定义报告,也没有可以打开或关闭 HLL 估计的开关。由于版本 4 仍在推出,我还没有将其中的数据与等效的 UA 属性进行比较,以找出其中的用户计数是如何计算的(我在文档中找不到任何关于此事的信息)。
随着更多信息的出现,我可能会在不久的将来更新这一部分来反映事情的状态。
外卖食品
任何 Google Analytics 报告中显示的用户数量不应用于 A/B 测试统计分析,如果每个测试组超过 12,000 个用户,并且该属性的“在报告中启用用户指标”设置为 on,因为这些数字是概率估计值,而不是精确计数。由此引入的误差高达 99%的估计值的 2%,但即使如此,它的大小对任何统计估计值的有效性都有严重的负面影响,因此使任何测试结果无效。
视情况而定,标称和实际误差率、覆盖率等之间的差异。相当于前者的许多倍。测试中的数据越多,统计估计就越糟糕。对于 Adobe Analytics 用户来说,情况似乎更糟。
如果你使用谷歌分析用户进行任何类型的 A/B 测试,你需要确保使用原始计数,而不是超对数概率估计。不幸的是,对于大多数用户来说,从 Universal Analytics 获得准确的用户数似乎是不必要的困难。在谷歌分析 4 中,这甚至不是一个选项。Adobe Analytics 和许多其他软件产品(包括内部开发的软件)的用户可能处于类似的情况。
最初在 Analytics-Toolkit.com 博客上发表为 《在 A/B 测试中使用谷歌分析用户数的危险》2020 年 10 月 19 日。
Pinterest 数据科学家访谈

图片来自 Unsplash
介绍
Pinterest,Inc .是一家社交媒体网络和移动应用公司,成立于 2009 年,总部位于加利福尼亚州旧金山。该公司开发和运营软件应用程序和系统,旨在使用图像、gif 和视频(称为 pin)在线发现和保存信息。它提供免费注册,之后用户可以上传、保存、分类和管理图像和其他内容,如视频(图钉),通过一个称为图钉板的图像库。
自成立以来,它的平均用户数量一直在稳步增长,因为观众经常转向该平台,以“规划社交活动、购物、通过操作指南帖子学习知识,以及通过视觉灵感板规划生活时刻”。
截至 2019 年第四季度,Pinterest 的活跃平均月用户在全球范围内超过 3.35 亿,超过 1750 亿件商品被钉在超过 30 亿个虚拟插针板上。有了这些信息,就不难想象每天产生的海量数据了。数据科学是 Pinterest 产品和服务的核心,Pinterest 的数据科学家利用最先进的分析工具和机器学习模型来理解这些数据,以指导商业决策。
Pinterest 的数据科学角色

图片来自 Unsplash
即使是现在,Pinterest 仍然是一家成长中的公司,有许多团队和部门致力于改善客户体验的关键功能、产品和服务。
Pinterest 的数据科学团队偶尔会与其他团队合作,围绕几乎每个面向用户的功能设计实验,以帮助理解每天生成的大量客户数据,推动决策并提供业务影响洞察。因此,Pinterest 的数据科学家角色在很大程度上由分配的团队决定。然而,Pinterest 的一般数据科学家角色横跨实验和统计建模、基本商业分析和数据可视化、机器学习和深度学习理论。
查看我们的数据科学面试指南:
所需技能
Pinterest 只雇佣合格的数据科学家,他们在相关的数据科学项目方面至少有 3 年的行业经验(领导职位 6 年以上)。招聘要求非常具体,取决于团队的工作角色,因此,拥有与团队角色相符的特定行业经验会有所帮助。
其他相关资质包括:
- 定量领域或相关领域的高级学位(硕士或博士)。
- 3 年以上的行业经验(高级职位 6 年以上),以及应用统计方法解决使用大数据的实际问题的良好记录。
- 在线和离线实验的行业经验。
- 具有使用 SQL、R 或 Python 管理和分析结构化和非结构化数据的经验,以及使用 SPSS、STATA 等软件包的经验。
- 在推荐系统、时间序列、用户建模、图像识别、图形表示学习和自然语言处理等设置中应用深度学习方法的丰富经验。
- 具有从排名标签学习的经验(即三元组学习、度量学习等。)和部署排名模型(即,从学习到排名)。
- 能够领导跨多个产品领域的计划,并与领导和产品团队交流发现。
Pinterest 有哪些数据科学团队?
Pinterest 的数据科学家角色和职能涵盖与数据科学相关的广泛团队和领域。Pinterest 的“数据科学家”头衔包含多种角色和职能,从专注于产品的分析到更具技术性的机器学习和深度学习功能。
根据所分配的团队,Pinterest 数据科学家的职能可能包括:
- 工程(离线实验):利用先进的数据分析概念解决涉及数据离线评估的关键测量挑战,从微调测量技术到定义为新产品和现有新产品创建有意义的价值测量的方法。
- 工程(广告实验):设计和构建模型、机制和指标,通过实验做出合理的产品决策,最终目标是为每一个 Pinner 呈现高质量的广告。
- 业务运营和战略:利用业务分析推动关键业务洞察,以更好地了解合作伙伴、合作伙伴和产品。
- 广告质量排名团队:应用实验、定量分析、数据挖掘和数据可视化技术来提高 Pinterest 上广告的质量和相关性。
- Ads Intelligence :开发机器学习模型、系统和功能,通过推荐、工具和洞察,帮助广告商最大化 Pinterest 上广告活动的投资回报。
面试过程

图片来自 Unsplash
面试流程从招聘人员或招聘经理的初始电话筛选开始,如果一切顺利,将安排数据科学家或数据工程师的技术筛选。通过技术筛选后,您将进入现场面试,其中包括五轮连续面试,中间有午餐休息时间。
初始屏幕
这是一个 30 分钟的与招聘人员的初步电话交谈,详细介绍你的技术背景,你过去的相关项目,并根据你的简历对你的技能进行快速评估。在本次面试中,面试官还将与您讨论团队中的角色和 Pinterest 文化。
样题:
- 说说你自己吧。
- 谈谈你过去的一次工作经历。
技术屏幕
技术屏幕是对数据科学家长达一小时的采访,讨论围绕过去的项目、您使用的方法以及您如何解决某些挑战。
这次面试也会有一些轻 SQL 编码。Pinterest 使用“Karat”进行几乎所有的技术面试,数据科学家的技术筛选也是使用共享屏幕 Karat 平台完成的。
至少我们推荐 复习这篇关于“ 三个 SQL 概念你必须知道才能通过数据科学面试关于面试查询准备你的面试。
现场面试
现场面试是 Pinterest 数据科学家面试的最后一个面试阶段。它由五轮连续面试组成,分为一轮 SQL 面试、一轮统计 和概率面试、一轮编码面试和一轮行为面试。现场阶段的所有面试大约持续 45 分钟,中间有午餐休息时间。
注意事项和提示
Pinterest 数据科学家面试旨在评估候选人的能力设计用于评估产品性能的实验,构建大规模模型,以及应用数据科学概念来推动增长和提供业务影响见解。因此,面试问题是标准化的,并且涵盖了广泛的数据科学概念。重温你的统计和概率、假设检验、时间序列建模、A/B 检验、实验设计、SQL 和预测建模概念的知识。
Pinterest 有一个以员工为中心的生态系统,为所有人提供友好的工作环境。在 2019 年的一篇文章中,Pinterest 被引用为“硅谷最好的公司……这种文化与其他高速增长的科技公司不同,那里积极鼓励对抗和辩论”。在文化方面,Pinterest 提供了一个真正进步的工作环境,员工(无论是不是技术人员)都可以在这里成长和发展。
另一家拥有优秀工作文化的公司是 LinkedIn。 查看本指南关于“ LinkedIn 数据科学面试问题 ”。
Pinterest 数据科学面试问题:
- 给定一组未排序的随机数(小数),求四分位间距。
- 编写一个 SQL 查询来计算每天同时从 iPhone 和 web 登录的独立用户的数量,其中 iPhone 日志和 web 日志具有不同的关系。
- 您的产品经理注意到一个特定指标有所下降。你如何着手调查是什么导致了这次下降?
感谢阅读
- 如果你想寻找更多的数据科学资源,请查看 采访查询 !
- 查看我的 Youtube 频道 获取更多面试指南,以及解决问题的技巧&。
- 在面试查询博客上找到更多数据科学面试指南,如 LinkedIn 数据科学面试问题 和 Twitter 数据科学面试问题 。
原载于 2020 年 8 月 4 日 https://www.interviewquery.com*。***
元编程的陷阱
元编程时可能遇到的问题和需要注意的事情。

介绍
当处理代码时,在代码和数据之间保持完全独立的关系通常是乏味的。当然,数据需要由代码来存储和操作,但是如果代码本身随着数据而变化,那么就很难提供一个适用于所有场景的解决方案。每当操纵数据的函数本身需要是动态的时,这种情况就会进一步加剧。元编程是一种编程技术,它允许程序员将代码用作数据,将数据用作代码。如果使用得当,它可以非常有效地用少得多的代码获得大量结果。
考虑下面的例子,Hone.jl。在我个人看来,Hone.jl 是一个很好的例子,它很好地运用了元编程,以更简单的方式完成了一项任务。我们可以使用以下代码创建一个包含名为 Compose.jl 的库的圆:
compose(context(),circle(.5,.5,.1))
这将在上下文中返回一个漂亮的圆圈,就像这样:

我们还可以做的另一件事是将代码作为字符串解析成表达式,并对其求值:

恭喜,我们刚刚成功地进行了元编程。虽然像这样的元编程是避免某些状态问题的好方法,但是这些代码本身几乎没有用处。然而,每当这个表达式被用作对象中的数据时,事情就变得非常有趣了。
function Circle(diameter,x,y,fillin)
composition = compose(context(), circle(x,y,diameter), fill(fillin))
# "compose(context(),circle(.5,.5,.1))
tag = string("circle(",string(x),",",string(y),",",string(diameter),")")
tree() = introspect(composition)
show() = composition
update() = tag = string("circle(",string(x),",",string(y),",",string(diameter),")")
(test)->(show;composition;tree;tag;x;y)
end
如您所见,我们使用所提供的参数组装标签,然后将所有内容放入我们的新类型中。这个类型被 Julia 认为是一个不安全的类型,所以实际上不会被命名为任何东西,只是知道该类型是用(test)->声明并返回的。现在我们可以这样做,例如:

当然,这不是元编程,因为我们只是调用与标签分开创建的 composition 来显示图形。然而,一旦我们开始使用其他函数的标签,事情就变得有趣多了。
using Base.Threads
function plot(x,y,shape)
topx = maximum(x)
topy = maximum(y)
x = [z = z / topx for z in x]
y = [z = z / topx for z in x]
expression = string("compose(context(),")
for (i, w) in zip(x, y)
shape.update(i,w)
exp = shape.tag
expression = string(expression,string(exp))
end
expression = Meta.parse(string(expression, ")"))
eval(expression)
end
上面的函数为一个 zip 循环中的 X 和 Y 数组中的每个点添加了一个标签“expression”。然后对表达式进行解析和求值,让我们看看这是怎么回事。

只是为了好玩,这里有一个由元标签以完全相同的方式组合在一起创建的完整组合:

当然,如果你想查看来源,它在这里:
简单的面向对象的图形模块化库,GitHub 是超过 5000 万开发者的家园…
github.com](https://github.com/emmettgb/Hone.jl)
元编程的好处
既然我们已经看到了元编程在解决问题中的应用,我们终于可以了解元编程的优点和缺点了。在谈到元编程的负面影响之前,让我先解释一下我为什么喜欢它,以及为什么我用它来磨练。
可展开的
因为元数据既可以是代码也可以是数据,所以它可以为将来的扩展和修改提供很大的空间。如果所有的操作都离不开元数据,那么添加更多代码所需要做的就是添加更多的元数据。回到 Hone.jl 示例,我们需要做的就是允许用户添加一个定制的图例,例如,有一个输入参数和一个将它添加到表达式的语句。或者,这也可以通过遍历一系列特性来完成,就像最新版本的 Hone.jl 所做的那样。
表演
例如,计算机要跟踪 Hone.jl 屏幕上绘制的各种不同的东西需要做大量的工作。我们不是将散点图中的所有点分配给单个变量,然后将这些变量存储在内存中,以后再访问它们,而是将它们的信息放入一个串联的字符串中。这有助于减少从注册表和内存来回移动和跳转的阻力,这反过来肯定有助于提高性能。
较少代码
虽然元编程在短期内可能要费力得多,但从长远来看,它确实是值得的,可以用来自动化大量的代码编写。如果期望的结果由许多小部分组成,这一点尤其正确。这方面的一个很好的例子是在超文本中,一种算法扫描一串元信息,让它知道如何解释所写的内容。
元编程的陷阱
虽然元编程肯定是一个非常有用的工具,但它肯定有一些重要的缺点。在很大程度上,您将能够解决在使用元编程技术时可能遇到的许多缺陷和问题,但是,其中一些问题在使用该技术时几乎是无法避免的。
安全性
就可扩展性而言,安全性始终是最优先考虑的问题。任何时候你将一个字符串作为代码来执行,都是相当不安全的,作为一个使用元编程的程序员,你至少应该意识到这一点。幸运的是,许多语言对元执行使用不同的状态,这使得这变得无关紧要。我肯定会说元编程要注意的一个是 Python。Python 可能是执行字符串最糟糕的语言之一。也就是说,Python 有自己独特的元编程系统,该系统利用了 decorators,如果您希望在 Python 中使用元编程,这绝对是一个好方法。谢天谢地,不久前我写了一篇文章详细介绍了这一点,如果你有兴趣做这样的事情,你可以看看:
你的装饰和元类生存指南。
towardsdatascience.com](/pythonic-metaprogramming-with-metaclasses-19b0df1e1760)
例外
元编程最痛苦的事情之一可能是遇到解析错误。每当一个字符串不能被解析时,得到一些非常意外的输出是很常见的。如果您已经关注 Hone.jl 的开发有一段时间了,那么您可能已经读到过一些我亲眼目睹的内容。例如,我遇到过这样一种情况,两个表达式因为缺少一个逗号而相乘。结果,我得到一个解析错误,告诉我没有匹配的方法
:*, (method, method)
实际上,我当然没有试图增加方法,但是这当然被解析器假定了,每当我试图计算表达式时,就会产生这个可怕的错误。
看不见的虫子
异常中缺乏一致性的结果是遇到看不见的错误的可能性。这些都是小问题,当许多标签堆叠在一起时,可能会出现这些问题。不用说,每当同时处理许多不同的标签并遇到一些奇怪的事情时,很难诊断出到底是什么导致了您的问题。解决这个问题的唯一确定的方法通常是在解析标签之前将其打印出来,然后进行校对。
相信我,这一点都不好玩。
用线串
如果有人曾经说过将代码放入字符串意味着添加许多正则表达式,那么他们可能是正确的!正则表达式可能是一个非常复杂的问题,有时它肯定不会完全按照您的预期工作。记住;你所有的代码都是字符串,所以任何语法上的问题都会立刻变得更加复杂。
结论
虽然元编程肯定是一个神奇的工具,可以让你做一些你甚至认为不可能的事情,但它也不是没有缺点。元编程有很多问题,特别是在一些编程语言中,它可能会也可能不会成为解决您的特定问题的一个选项。当然,就像在神奇的代码世界中的任何事情一样,它大部分是情境性的。有些情况下,安全性可能是最高优先级,有些情况下,安全性在优先级列表中可能非常低。对于跟踪 bug、测试和处理正则表达式也是如此。总之,我真的很喜欢元编程,但是我认为任何想要接近它的人都应该清楚什么时候他们可能想要使用它,什么时候不应该接触它。元编程有很多很好的应用,但其中最有说服力的实际上是程序员自己,比如 Hone.jl 的例子。
数据科学中的剽窃瘟疫
你还能相信什么?
我的作品最近被剽窃了。有人直接从我的一个视频中复制了所有的代码。他们在这个平台上发表了一篇文章(与 TDS 不同的出版物),没有任何认证。在与数据科学领域的其他一些内容创作者交谈后,我很快发现这是我们都面临的一个极其普遍的问题。
一开始我很愤怒。怎么会有人把我的辛苦工作据为己有呢?在花了一些时间去反思和冷静之后,我向这个“肇事者”伸出了手。信不信由你,这个人一点也不知道他所做的是“错的”。奇怪的是,我相信他。
经过简短的交谈,我选择了一些词语(开玩笑),我意识到这次惨败是一个更大的潜在问题的征兆。
在学术领域之外,数据科学领域对剽窃的定义相当不透明。复制代码、使用他人作品等是常见的做法。我们怎么知道自己是不是抄袭?

如果你喜欢视频格式:https://www.youtube.com/watch?v=vQGJvmhpq_s&ab _ channel = ken JEE
定义问题
什么是抄袭?一个简单的维基百科搜索出现了这个结果:
剽窃是指将另一个作者的语言、思想、观点或表达当作自己的原创作品
根据这个定义,你可能会认为几乎所有的东西都被偷了。在数据科学中,对其他贡献者的代码或函数片段进行复制和粘贴甚至被认为是高效和聪明的。毕竟还有成千上万的人在做!此外,引用您编写的每一行代码将是一种巨大的(而且是刻意不必要的)痛苦。
然而,抄袭是数据科学中围绕抄袭有如此多模糊之处的主要原因之一。我为我分享的大多数项目复制了相当多的代码。我甚至在 YouTube 上我的“数据科学项目从零开始”系列中复制了别人的整个 web scraper。
现在你问,为什么我所做的不是抄袭?
快速解决方案
避免“P”字的第一个关键是引用你使用的资源。在我的例子中,我在自述文件和视频描述中清楚地引用了我在哪里找到的代码以及它来自谁。
那么什么时候可以不用引用呢?一般的经验法则是,如果代码足够简单,可以在一个库的文档中找到,你可能不需要引用它。
如果它更复杂,你至少应该记下它是从哪里得到的,为了谨慎起见。当你分享他们的工作时,其他人会非常感激,如果你发现错误,他们甚至会帮你调试!而且,你穿起来也不差。事实上,它让你变得更加聪明,因为你足智多谋,并且一起工作。
一朵不同名字的玫瑰
如果你抄袭,你还能如何避开我在网上对你的指责?(再次开玩笑)。将你的工作与其他项目区别开来。最简单的两种方法是使用完全不同的数据源,或者在相同的数据集上使用另一种算法。
同样,如果你只是对数据或算法做了小的改动,你应该引用你从哪里得到的原始资料。老实说,即使你在其他地方找到了灵感,你也可以大声喊出来。
例如,如果你要复制我的 Glassdoor.com 项目,我分析数据科学家的工资。假设您想要为不同的国家或工作岗位构建这个。在这种情况下,核心工作不会被视为本质上的不同。因此,你至少应该举出你从哪里得到这个框架的。
如果你在对棒球运动员的薪水做类似的分析,我会认为这是足够独特的。即使您使用类似的算法方法,数据也是从完全不同的来源收集的,会有额外的细微差别。
为什么这很重要
听完别人的话后,我同意这真的与个人信用无关。这确实是原则问题。流程的完整性。
作为一个不得不筛选和面试数据科学家候选人的人,我怎么能相信坐在我面前的这个人真的亲自做过这项工作呢?对于那些出版伟大作品并承担风险的人来说,这就是系统崩溃的地方。
以一个警示性的故事来结束,这涉及到负面的后果。抄袭是解雇的理由,甚至会影响未来的就业能力。更不用说潜在的法律后果了。
以 Siraj Raval 为例。作为一个优步伙伴,他是我真正尊敬的人。抄袭他人的作品给他的事业造成了不可挽回的损失。这直接影响了他的品牌和财务。从那以后,他似乎已经转危为安了。但正如我们所知,修复图像需要时间和大量的努力。
某种邪恶的根源
我们应该同情那些可能被错误地归入这个标签的人。这确实是一个灰色地带,可能源于个人怀疑或冒名顶替综合症。在一个更加残酷的世界里,很难脱颖而出。我明白了。
然而,如果你能把大局放在一起,并给予他人信任,雇主会把你视为领导者。这是一项关键的管理技能,将为更多的机会铺平道路。引用你的信息来源将打开通往个人和事业成功的大门,因为你自豪地传播你与你的同事和社区的合作。毕竟,开源的存在是为了让数据科学更好、更快、更强。为无瘟疫的未来干杯。
对于抄袭我作品的人,我没有恶意。他还很年轻,我真心希望他能从这个错误中吸取教训。
想法是我自己的,文字是我的好朋友 Sid Khaitan 写的。他是一个“代笔人”,把我的概念转化成引人入胜的故事。没有他,这些可能就没那么有趣了。如果你想知道这部分是不是他写的,他肯定写了。
捡起一些小技巧,在这里阅读他的作品: @SidKtan
接下来考虑看这些!
介绍#66DaysOfData
towardsdatascience.com](/why-im-starting-data-science-over-21bec8036ce9) [## 如何学习数据科学
加速您的数据科学学习之旅
towardsdatascience.com](/how-to-ultralearn-data-science-c9cee6e2fbd0)
人工智能监控的平台方法
不要相信开箱即用的监控解决方案。你的意见至关重要。

资料来源:莫纳实验室公司。
如果你一直在努力让你的人工智能模型在生产中的表现变得透明,你在一个好公司里。监控复杂的系统总是一项挑战。监控具有内在不透明性的复杂人工智能系统是一个根本性的挑战。
随着企业中人工智能方法、底层技术和用例的激增,人工智能系统正变得越来越独特。为了满足他们的业务需求,每个数据科学团队最终都会构建一些非常独特的东西;每个人工智能系统都是一片雪花。
人工智能技术、使用案例和数据环境的巨大多样性消除了一刀切的监控解决方案的可能性。例如,自主监控解决方案通常是不够的,因为它们自然不会扩展到少数用例之外。对于这些解决方案来说,扩展或扩展是一个巨大的挑战,因为要在没有用户上下文的情况下监控人工智能系统,人们必须对指标、它们的预期行为以及它们发生变化的可能根本原因做出大量假设。
一个显而易见的解决方案是为每个用例构建独立的点解决方案,但是这是不可扩展的。那么,有没有一个框架或解决方案是为(几乎)所有人设计的呢?
是的。这是平台方法。
监控黑匣子的平台方法
人工智能系统监控的平台方法是通用自主方法和定制方法之间的最佳点。这意味着,一方面,监控系统根据用户人工智能系统的独特特征进行配置,另一方面,它可以毫不费力地进行扩展,以满足新的模型、解决方案架构和监控环境。
这是通过实施通用监控构建模块来实现的,然后由用户动态配置,以实现定制的专用监控解决方案。这个监控环境适用于任何开发和部署栈(以及任何模型类型或 AI 技术)。此外,由于监控平台是独立的,并且与堆栈分离,因此它可以实现超级快速的集成,不会影响开发和部署流程,更重要的是,监控可以跨越堆栈中的所有层。
系统的可配置性意味着数据团队不局限于他们系统的预制定义:他们实际上由一个“工程部门”授权,该部门给予他们对监控策略和执行的完全控制。
灵活、适应性强的解决方案
除了平台方法可以解决行业的监控问题之外,其无限的灵活性以行业特定的自主解决方案所不具备的方式使用户受益。这听起来可能是一个反直觉的假设,因此这里有几个不可知系统中固有的特性的例子,这些特性通过自主解决方案根本无法实现,即使这些特性是行业特定的:
通过上下文(或系统)监控,而不是通过模型。如果在模型运行一段时间后,您获得了基本事实(或关于成功/失败的客观反馈),那么您会希望将新信息与推理时捕获的信息关联起来。这种场景的一个例子是营销活动目标模型,该模型接收关于活动成功的反馈(转化率、CTR 等)。)几周之内。在这样的用例中,我们希望监控能够将模型的预测和业务结果联系起来。
如果您正在比较运行在相同数据上的两个不同的模型版本(在“影子部署”场景中),那么通过上下文进行监控也是非常宝贵的。
如果您有多个运行在相同数据上下文中的模型,并且可能相互依赖,那么您需要有一种方法来推断一个模型失败的真正根本原因是否与另一个模型相关。例如,在 NLP 设置中,如果您的语言检测模型的准确性下降,下游的情感分析模型也可能表现不佳。
配置你的异常检测。异常总是在上下文中出现,因此在许多情况下,明显的异常(甚至表现不佳)是可以接受的,数据科学家可以忽略它。配置您的异常检测的能力意味着监控解决方案不会简单地检测一般的性能不佳,而是定义哪些定制配置的异常可能指示性能不佳。

来源:莫纳实验室公司;人工智能监控中有三种异常类别:异常值(左)、漂移(中)、突变(右)
比如:你分析推文的情绪。监控解决方案发现,20 个字符以下的推文(短推文)的预测可信度降低。你可能会接受这种缺点(例如,如果这符合客户的期望)。然后,您的监控解决方案应该使您能够从分析中排除这一部分(短推文),以避免扭曲其余数据的测量结果(如果短推文占数据的很大一部分,这一点尤为重要)。
在任何阶段跟踪任何指标。最常见的情况是,团队会跟踪和检查模型精度和召回率(这需要“标记数据”)。即使没有这样的“基本事实”,也可能有许多重要的指标需要跟踪,这些指标可能指示模型的不当行为。例如:如果您有一个文本类别分类器,您可能希望跟踪没有类别得分超过某个阈值的推文的相对流行程度,作为低分类置信度的指标。这种度量需要从原始结果中计算出来,因此它不是微不足道的,并且不是现成的。
此外,可以根据度量行为可能发生变化的多个维度对每个度量进行进一步细分(例如,如果您的度量是文本分类置信度,那么维度可能是文本的长度或编写文本的语言。)
此外,如果您只关注模型的输入和输出,那么您会错过对您的预测可能不重要但对治理却至关重要的维度。例如:种族和性别不是(也不应该是)贷款算法中的特征,但它们是评估模型行为的重要维度。
没有人比你更了解你的人工智能
一个强大的监控解决方案可以为您的人工智能系统提供真实、有价值的见解,它需要与您独特的技术和环境相关,并且能够灵活地适应您的特定用例以及未来的开发需求。
这样的系统应该是 stack 不可知的,所以你可以自由地使用任何技术或方法进行生产和培训。它需要全面地看待你的人工智能系统,这样特定的生产和性能领域就不会被视为筒仓,而是在整个系统的环境中。最重要的是,它需要在您独特的背景下审视您的系统,只有您能够提供和微调。人工智能监控的平台方法旨在实现这一目标。
原载于 2020 年 8 月 12 日https://www . monalabs . io。**
不归路:过去 6 个月使用 nbdev 改变了我在 Jupyter 笔记本上编码的方式
有了 nbdev,Jupyter 笔记本现在是一个有文化的编程环境。有了 nbdev,我的生产力提高了。我的代码现在更有条理了。我处理新项目的方式永远改变了。

nbdev 是什么?—如果你在问这个问题,请做好准备,因为你即将发现的东西会让你的大脑爆炸。不是字面意思,不用担心。你会没事的。如果你已经使用了 nbdev,你可能会对我的故事的某些方面感兴趣。请告诉我,我很想听听你的经历。
"nbdev是一个允许你在 Jupyter Notebooks 中完全开发一个库的库,把你所有的代码、测试和文档放在一个地方。那就是:你现在拥有了一个真正的有文化的编程环境,正如唐纳德·克努特在 1983 年所设想的那样!”—引用 nbdev 存储库。
作为一名研究人员和数据科学爱好者,我每天都与数据打交道。没有空气、水和食物,我们人类就无法生存。对于数据科学家来说,数据应该是列表的一部分。
我在日常生活中使用 Jupyter 笔记本,这是我编码、解决问题和试验新想法的环境。然而单单 Jupyter 笔记本就有一个重要的局限性。当需要将代码转移到生产环境并创建 python 包时,有必要将所有代码复制到 Python 模块中。无数次我花了很多时间来重组和清理代码。一个以大量复制、粘贴和调试为特征的过程。
我可以忍受这种工作程序,它并不理想,但我不知道最好的。这在我去年生日的时候改变了。同一天,杰瑞米·霍华德宣布了新的 nbdev 图书馆。这一天当然是一个巧合,但它感觉像一个生日礼物。在读到它的承诺后,我立刻意识到这是一件大事。
在接下来的三个部分中,我将介绍nbdev 的主要特性、如何开始使用 nbdev 以及它如何在过去的 6 个月中改变了我的编码方式。然后,我将最后说几句话。让我们开始吧。
nbdev 的主要功能
在我看来,nbdev 最令人兴奋的特性如下:
- 从笔记本中自动生成 Python 包;
- 该包的文档也是从笔记本中构建的,包括您可能希望包含在笔记本中的带有图形和图像的代码示例;
- 默认情况下,自动生成的文档可以在 GitHub 页面中以好看的格式查看。
- 当你把你的代码推送到 GitHub 时,会自动进行一系列的检查,以确保笔记本的格式是干净的,你包含在包中的测试也会运行;
- 您的包可以通过一个命令上传到 PyPi。
- 所有这些开发过程都可以扩展到大型项目。如果你想要一个例子,那就去看看从 70 台 Jupyter 笔记本中生成的 fastai2 库。
如何开始使用 nbdev
nbdev 入门非常简单。在我阅读了 GitHub 页面上的描述后,我马上开始使用它。任何问题通常会在包装的文档中回答,或者以检查 fastai2 笔记本为例。基本步骤是:
- 从他们提供的模板中创建一个 GitHub 库;
- 克隆存储库并运行
nbdev_install_git_hooks命令为您的项目进行配置; - 用基本信息编辑并完成
settings.ini文件,比如包的名称、你的 GitHub 用户名等等; - 开始在 Jupyter 笔记本上开发您的代码;
笔记本的第一个单元格应该包含#default_exp module_name,以告诉如何调用从笔记本自动生成的 Python 模块。每个笔记本将是一个不同的 python 模块。为了告诉 nbdev 如何处理每个笔记本单元格,您在单元格的顶部写了一些注释标签。您通常会使用:
#export—用于包含应导出到 Python 模块的代码的单元格;#hide—隐藏不想在文档中显示的单元格。
有几个命令可以在命令行上运行。它们从nbdev_开始,你可以使用 tab 补全来找到所有现有的命令,但是大多数时候你需要nbdev_build_lib来构建库和nbdev_build_docs来构建文档。
值得一提的是,nbdev 也使得为你的包创建控制台脚本变得非常容易!
一旦一切准备就绪,就可以用pip install -e .在本地安装这个包,但是你可能想把它上传到 PyPi。在这种情况下,只要你遵循了配置步骤,你只需运行make pypi,nbdev 就会处理好一切。
nbdev 如何在过去的 6 个月里改变我的编码方式
在过去的 6 个月里,在我的大部分项目中使用 nbdev 对我的编码方式产生了显著的影响。不仅仅是因为 nbdev 功能本身,还因为它让我更多地思考我应该如何构建代码。为了充分利用 nbdev,代码需要有一些组织。
回顾过去
- 我的代码非常杂乱,通常由无数个 Jupyter 笔记本组成,它们有相同进程的不同版本和非提示性的文件名;
- 大多数时候我会为自己写代码;
- 如果几个月后我不得不回头看我自己的代码,我会努力去理解它;
- 我从来不敢创建 PyPi 包,对于一个简单的项目来说,这看起来太费力了。
现在看看现在
- 自从我开始使用 nbdev 以来,我的代码逐渐变得更加结构化,更易于共享和重用;
- 现在,我创建我的笔记本,认为它们是要被人类理解的;
- 当我不得不回到一个我暂时没有做的项目时,我可以很容易地通读笔记本来刷新我的记忆;
- 使用 nbdev,创建包只是笔记本中代码的结构和组织的自然结果。从那以后,我创建了一些包。我在另一个名为的故事中讲述了一个最近的例子,用 Python 分割重叠的边界框。
从问题公式化到创建 PyPI 包,用 5 个步骤完成教程,使用来自全球…
towardsdatascience.com](/split-overlapping-bounding-boxes-in-python-e67dc822a285)
最后备注
为人类编写代码是当今世界需要接受的一个概念。Jupyter 笔记本是分享想法和知识的绝佳方式。想法和知识是建设美好未来的基石。如果我们能够更有效地共享构建模块,我们将会加速进步。把想法打磨成简单优雅的形式需要时间。但这很重要。因为否则所有试图建立这些想法的人将不得不为了他们自己的理解而单独润色它们。在某种程度上, nbdev 以一种简单而优雅的形式让分享想法变得更容易、更省时。nbdev 负责自动化的工作,让开发人员有更多的时间专注于笔记本的展示。
我希望这个故事对你有用并有所启发!
关于我
[## 我的 3 年历程:从零 Python 到深度学习竞赛高手
自从 2017 年开始学习 Python 以来,我一直遵循的道路是成为一名独自参加 Kaggle 比赛的大师…
towardsdatascience.com](/my-3-year-journey-from-zero-python-to-deep-learning-competition-master-6605c188eec7)
感谢阅读!祝您愉快!
新冠肺炎的政治和经济前景
一些数据和想法告诉我们可能的发展方向
我们大多数人都没有经历过类似现在的情况。在接下来的几周内,世界上许多国家的学校、大学、商店、酒吧、餐馆和其他娱乐设施都将关闭。随着航班和火车被取消,边境被关闭,宵禁被讨论和整个封锁的引入,我们的行动越来越受到限制。当然,所有这些都是为了一个很好的理由:减缓新型冠状病毒的传播。
似乎我们的生活即将停止并发生巨大变化。这些限制正在对我们的经济造成损害,并对政治产生重大影响。在这篇文章中,我将看一些图表来描述经济和政治(特别是在美国)已经发生的事情,以及这对未来可能意味着什么。请记住,今年 11 月美国将举行总统选举。
注意:这篇博文应被视为一种观点,而非预测。
新冠肺炎的威胁有多严重?
毫无疑问,这是对整个世界人口的严重威胁。这篇文章很好地阐述了为什么我们必须今天就采取行动,否则许多人将会死亡,全球的医疗保健系统将会崩溃。新病例呈指数增长,在意大利、伊朗、韩国和中国等一些国家呈爆炸式增长。然而,美国、德国、法国、西班牙和其他国家只比受影响更严重的国家落后几天。
直到 3 月 16 日,中国的确诊病例比其他所有国家的总和还要多。然而,中国完全关闭公共生活有助于拉平增长率。各大洲的许多其他国家正在对其公民采取类似的限制。

确诊病例(直线)和死亡率(分散)相互对照。来源:朱莉娅·尼库尔斯基,数据来自约翰·霍普金斯大学。
意大利是病例数第二高的国家,并且仍在呈指数增长,其次是伊朗、西班牙、韩国和德国。这张图也显示了 T2 医疗系统在应对新冠肺炎疫情时遇到的困难。这是其他国家的前兆,这些国家与意大利有着相同的轨迹,只是落后了几天。

确诊病例(线)和死亡率(分散)相互标绘,不包括中国。来源:茱莉亚·尼库尔斯基,数据来自约翰·霍普金斯大学。
新闻里在谈论什么?
几乎不可能忽略目前正在进行的疫情。所有关于新冠肺炎的更新都淹没了其他与疫情无关的内容。其中之一是民主党初选和 11 月大选的竞选活动。

该图描绘了选举相关新闻(橙色)和新冠肺炎新闻(蓝色)每天的新闻报道数量。词云显示了美国数字媒体和报纸在二月中旬和三月中旬关于这些话题谈论最多的词。来源:朱莉娅·尼库尔斯基,数据来自媒体云。
上图显示了美国数字媒体和报纸上发布的关于新冠肺炎和选举相关新闻(美国)的新闻故事的发展。在二月底,新冠肺炎新闻报道的数量首次超过了选举新闻报道的数量,这甚至发生在超级星期二之前!除此之外,冠状病毒的新闻报道数量激增。
有趣的是,这些新闻报道中讨论的事情是如何随着时间的推移而变化的。虽然在 2 月中旬,选举新闻报道中的主要关注点是新罕布什尔州的初选、伯尼·桑德斯、民主党和特朗普,但在 3 月中旬,这种关注转移到了特朗普、乔·拜登和冠状病毒。二月中旬到三月中旬,新冠肺炎相关新闻的话题也发生了变化。虽然大多数故事围绕着二月份搁浅的游轮、中国局势和“新病毒”,但这在三月中旬变成了特朗普的行动成为关注的焦点。

每天花在选举相关新闻上的时间百分比。广播时间以 15 秒为单位。用于搜索的关键词有:拜登、桑德斯、沃伦、克洛布查尔、Buttigieg、加巴德、初选、党团会议、选举。资料来源:Julia Nikulski,数据来自 GDELT 项目。
电视新闻以同样的方式从报道与选举相关的话题(党团会议、初选、民主党总统候选人等)转移开来。)几乎 50%的播出时间增加了冠状病毒的覆盖范围。截至上周,三大有线新闻频道(CNN、MSNBC、福克斯新闻)在病毒爆发上花费了近 20%的播出时间。

每天花在新冠肺炎相关新闻上的时间百分比。广播时间以 15 秒为单位。用于搜索的关键词是:新冠肺炎、冠状病毒、病毒、冠状病毒。资料来源:Julia Nikulski,数据来自GDELT 项目。
有趣的是,在所有新闻频道中,福克斯新闻花了最多的时间讨论疫情。与其他媒体不同的是,福克斯新闻对川普与新冠肺炎的关系没有 T4 那么多批评。那里的报道可能会极大地影响不同党派的美国人如何看待冠状病毒的威胁(下文将详细介绍)。
经济反应如何?

从 1984 年至今标准普尔 500、纳斯达克、DAX、道琼斯和恒生指数的价格发展。来源:朱莉娅·尼库尔斯基,数据来自雅虎财经。
至少可以说,不太好。与过去 35 年的经济衰退和股票损失相比,标准普尔 500、纳斯达克、道琼斯、DAX 和恒生指数只是处于熊市的开始。

标准普尔 500 过去 35 年的 10 大损失和 10 大收益。来源:朱莉娅·尼库尔斯基,数据来自雅虎财经。
就标准普尔 500 过去 35 年来的最大每日损失和收益而言,2020 年 3 月 16 日仅次于 1987 年的黑色星期一。其第三大毁灭性的一天是 2020 年 3 月 12 日。然而,由于当前形势的不确定性和每日更新,损失在第二天几乎完全恢复,使得 2020 年 3 月 13 日成为第三高的涨幅。更重要的是:所有其他日期,无论是亏损还是盈利,都处于严重的经济衰退之中,这表明我们可能也会陷入更长时间的衰退。

标准普尔 500、纳斯达克、DAX、道琼斯和恒生指数在过去三个月的价格发展。来源:朱莉娅·尼库尔斯基,数据来自雅虎财经。
更仔细地观察过去 3 个月的发展,从 2 月中旬开始,所有这些指数的总体下降趋势变得明显。在绘制确诊病例数和指数价格时,有明显的负相关关系。
中国大量的确诊病例掩盖了其他国家病例的发展。2 月中旬后,中国设法拉平了曲线。但是大约在那个时候,标准普尔 500 指数和 DAX 指数开始下跌。

图表描述了与全球确诊新冠肺炎病例上升相比,德国 DAX 指数和标准普尔 500 指数的价格发展。来源:茱莉亚·尼库尔斯基,数据来自雅虎财经和约翰·霍普金斯大学。
不包括中国表明,在 2 月中旬,韩国的病例开始上升,关于被检疫的游轮(2 月 15 日后出现在图表最底部的紫色水平线)的新闻得到了越来越多的关注。

该图描述了德国 DAX 指数和标准普尔 500 指数的价格发展,并与全球(不包括中国)确诊新冠肺炎病例的上升进行了比较。来源:朱莉娅·尼库尔斯基,数据来自雅虎财经和约翰·霍普金斯大学。
《市场观察》上有一篇关于道琼斯指数发展的精彩文章,文章展示了经济陷入衰退后,道琼斯指数的复苏需要多长时间。它花了 25 年时间来弥补大萧条的损失,花了 16 年时间从 20 世纪 70 年代和 80 年代的经济和政治动荡中复苏,花了 6 年时间来恢复 2008 年金融危机期间失去的东西。目前,我们仍处于熊市的开端,所以我们不知道股市何时会好转,也不知道需要多长时间才能收复失地。但是监管者认为下降趋势将持续数周。
周日晚上,美联储将利率下调至接近 0 %的水平,试图安抚投资者。然而,投资者并不认为这是信心的表现。纽约证券交易所开盘后第二天就停止了交易,因为标准普尔 500 指数下跌超过 7%。
与 2008 年金融危机的不同之处在于,我们正在应对一场健康危机。超国家、国家和地方政府采取的任何措施都旨在避免全球卫生保健系统的灾难性崩溃。然而,在短期和中期,这些限制会立即影响公司的底线,导致失业。
世界各国正试图通过对经济的紧急刺激方案,甚至对公民的直接现金支付(如川普政府所宣布的)来减轻打击。所有迹象都表明经济衰退。但问题是它会停留多久。一些人希望会有一个快速反弹,但是没有确定性。看看中国就知道,复苏可能需要比预期更长的时间。
今年不是有选举吗?
今年 11 月,美国确实有地方、州、国会和总统选举。新闻大量报道了民主党总统初选,然而,自二月底以来,人们的注意力已经转向新冠肺炎。竞选集会被取消,辩论在没有观众的情况下播出甚至一些州的初选也被重新安排到稍后的日期,以避免病毒的进一步传播。
从历史上看,经济衰退时期的总统连任竞选是艰难的,当经济萎缩时,现任总统连任的机会就会减少。这将意味着,如果经济将陷入持续数月的衰退,特朗普再执政 4 年的机会正在减少。吉米·卡特(Jimmy Carter)在长达数月的经济衰退中输掉了连任竞选,奥巴马在 2008 年的金融危机中获胜,希拉里在 1992 年击败乔治·h·w·布什(George H. W. Bush)的部分原因是一年半前结束的经济衰退。
虽然经济是选举的一个很好的预测因素,而且的这篇文章认为,2020 年前两个季度的衰退可能会导致特朗普失败(考虑到他的选举人团优势),但在特朗普时代,预测结果可能会更复杂。

特朗普总统任期内的支持率。资料来源:Julia Nikulski 基于来自fivethirtyeeight的数据和图表。
他的总体支持率从来都不是很高,大约在 30%到 40%之间。然而,它们一直是稳定的。无论是被弹劾,因支持白人至上主义者而被公开谴责,还是因空袭索莱马尼而被自己的政党批评,都没有太大的变化。
此外,这些评级掩盖了对他的表现的高度党派分歧。他有一个非常忠诚的基础,就像有一些非常忠诚的永远不会出牌的人一样。在当前的冠状病毒危机中也可以观察到这种分歧。根据三月第一周进行的由五月三十八日汇总的民意调查,共和党人高度赞同川普抗击疫情的措施,而民主党人则强烈反对。

在调查受访者中,对特朗普处理冠状病毒疫情的方式表示一定程度或强烈赞同的比例。资料来源:Julia Nikulski 基于来自fivethirtyeeight的数据和图表。
此外,我们早些时候在描述冠状病毒电视报道的图表中看到,福克斯新闻花了很多时间报道这个话题。但是这个网络的政治评论员淡化了恐惧,表明回声室并不局限于脸书。在社交媒体、假新闻和高度党派分歧的时代,经济可能仍然是选举的决定性因素。然而,把所有的牌都押在经济上不一定会导致民主党总统候选人获胜。

调查受访者会为每个阵容中的哪些候选人投票。资料来源:Julia Nikulski 基于 FiveThirtyEight 的数据和图表。
上述调查没有显示的是选举人团将如何影响最终的选举结果。此外,川普已经开始听取他的顾问们的意见,比如安东尼·福奇医生。在否认病毒的威胁不起作用后,他现在提议向经济注入数十亿美元现金,以避免经济下滑。所有这些都可能影响选民最终如何评判特朗普在 11 月投票中的表现。
结论
从上述图表和数据中得出的想法当然只是对当前形势的一种解释,当前形势非常不稳定,每天都有新的、改变日常生活的信息发布。经济和政治正在适应冠状病毒创造的新环境,经济是否会进入衰退,衰退会持续多长时间和多严重,以及这是否会导致白宫发生变化,仍有待观察。
这篇文章中使用的所有图表和数据都可以在我的 GitHub 上获得。
你想在媒体上阅读更多高质量的故事吗?考虑注册一个支持我和其他媒体作者的会员。
[## 通过我的推荐链接加入 Medium-Julia Nikulski
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@julia.nikulski/membership)
想读一些与我们当前严峻的现实无关的东西吗?查看我关于用不同的机器学习算法预测自行车共享数据的时间序列的文章。
[## 基于 AdaBoost、随机森林和 XGBoost 的时间序列预测
我们能从不能给我们很好预测结果的数据科学项目中学到什么
towardsdatascience.com](/go-highly-accurate-or-go-home-61828afb0b13)
土豆列车——使用 Python 处理极大数量和任意精度的二项式概率
数学很难,我们去购物吧——当然是为了辅导课。我真希望在尝试用 Python 做一些涉及极大数字的事情(n 的大值的二项式概率)和我的代码开始崩溃之前,我已经阅读了这篇教程。
但是等等,我听到你说,Python 可以处理任意大的数字,只受 RAM 大小的限制。当然,只要这些都是整数。现在,为了更好地衡量,尝试混合一些浮点值,事情开始崩溃。在 vanilla Python 中,任意大的数字混合任意精确的浮点数并不好玩。
让我们尝试在计算二项式分布时逐渐增加 Python 中整数运算的需求,看看会发生什么。
欢迎来到…
土豆火车
这是冷战时代。在遥远的冰封之地,有一个非常大的工业中心。那里寸草不生,所以工人们只能靠食物维生。偶尔会有一列满载土豆的火车到站。

现在,这是硬东西——我们正在谈论暴风雪和风暴——所以土豆被损坏了。事实是,在每次运输中,有 20%到达车站的土豆是坏的。
好了,轮到你做晚饭了,所以带上一个又大又重的包去车站吧。20 个土豆足够你们队吃了。但是现在已经熄灯了,一片漆黑,领导已经明智地把所有的精力都分配到工厂去完成配额,所以你只能盲目地随意采摘土豆。
你挑选的所有土豆都是好的几率有多大?只有一个土豆是坏的几率有多大?还是 2 坏,还是 3 坏?还是都不好?(这肯定会毁了晚餐)
或者也许同志们说:“瞧,我们都知道是怎么回事,只是这次尽量不要挑超过 4 个坏土豆。20 个中最多 4 个坏就可以了。我们会活下来的。越少越好。多了就不好了。”你的团队这次不会吃悲伤的晚餐的可能性有多大?

这就是你遇到你的死敌的地方:
二项式分布
有一个非常大的 A 型或 b 型对象堆。A 型对象在堆中的分数是 p,其中 0 < = p < = 1;剩下的都是 b 型,从那堆里面,你挑 n 个对象,n 比整堆的大小小很多。在你挑选的 n 个物体中,k 是 A 型的几率有多大?
换句话说,你从一列土豆中挑出 n=20 个土豆,其中 p=0.2(或 20%)是坏的。你挑出来的 k 个土豆(k 在 0 到 20 之间)坏的几率有多大?
这是概率的公式:

许多 Stats 101 书籍会给你某种证明(见最后的学分)。我只做土豆,所以我们继续吧。
但在此之前,请注意公式中的阶乘。阶乘可以很快变得很大。这将扭转过来,并在以后的代码中很好地咬我们。
但还不是时候。我们会慢慢开始,先用小数字。相信我,我是个工程师。一切都会好的——暂时如此。
我们来编码吧!
打开你的 Jupyter 笔记本,跟我来。让我们进口好东西:
实现概率公式:
并计算所有 k 值的概率:
让我们看看结果:
print(df)
probability
0 1.152922e-02
1 5.764608e-02
2 1.369094e-01
3 2.053641e-01
4 2.181994e-01
5 1.745595e-01
6 1.090997e-01
7 5.454985e-02
8 2.216088e-02
9 7.386959e-03
10 2.031414e-03
11 4.616849e-04
12 8.656592e-05
13 1.331783e-05
14 1.664729e-06
15 1.664729e-07
16 1.300570e-08
17 7.650410e-10
18 3.187671e-11
19 8.388608e-13
20 1.048576e-14
所有土豆都是好的概率大概是 1%。只有 1 个土豆坏的概率在 5%左右;认为 2 个土豆坏的占 14%;三个坏土豆是 21%,四个坏土豆是 22%,从那以后就开始走下坡路了——17%,11%,等等。所有的土豆都是坏的是不太可能的——1000 亿分之一。
累积概率如何——4 个或更少的土豆是坏的?是队友问的。让我们看看:
dfcs = df.cumsum()
dfcs.rename(columns={'probability': 'cumulative probability'}, inplace=True)
print(dfcs)
cumulative probability
0 0.011529
1 0.069175
2 0.206085
3 0.411449
4 0.629648
5 0.804208
6 0.913307
7 0.967857
8 0.990018
9 0.997405
10 0.999437
11 0.999898
12 0.999985
13 0.999998
14 1.000000
15 1.000000
16 1.000000
17 1.000000
18 1.000000
19 1.000000
20 1.000000
有 63%的可能性,只有 4 个或更少的土豆是坏的。几乎三分之二的情况下,你的队友会觉得晚餐是最不可接受的。嘿,可能会更糟。
但是眼见为实,让我们画出所有 k 值的概率。代码:
df.plot(figsize=(16,9))
dfcs.plot(figsize=(16,9))
和图像结果:


情节(的腰围)变粗了
但是,唉,这并不是它的结束。你做饭做得这么好,现在他们想让你为工厂的整个精密模具部门做饭。这是一群团队,你认为每个人需要 200 个土豆。因此,抓住生产工具,在这种情况下是几个麻袋,找个人来帮助你,然后前往火车站。
那是 n=200,所以大概 40 个或者更少的坏土豆对同志们来说是可以接受的,假设所有的团队都像你一样。让我们看看可能性有多大。
更改代码中 n 的值,然后重新运行它。这就是事情变坏的地方,就像火车上的许多土豆一样:
---------------------------------------------------------------------------
OverflowError Traceback (most recent call last)
<ipython-input-4-c84b1e23a65f> in <module>
7 # compute probabilities for all k
8 for k in tqdm(range(n + 1)):
----> 9 df.loc[k] = bin_prob(n, p, k)<ipython-input-3-60f4e81371ca> in bin_prob(n, p, k)
1 def bin_prob(n, p, k):
----> 2 arr = math.factorial(n) / math.factorial(k) / math.factorial(n - k)
3 bp = arr * (p ** k) * ((1 - p) ** (n - k))
4 return bpOverflowError: integer division result too large for a float
啊,是的。我们在计算 200!在那里,有 375 个数字(不是开玩笑)。/操作符想把事情当做 float 来处理,Python 在那个范围内做不到 float。
但是等等,//运算符也做除法(地板除法,够近了),把一切都当做整数类型来处理。Python 对整数的唯一限制是 RAM 的大小。那两个除法在那个公式里无论如何都是整数(想想为什么),所以用//代替也没问题。让我们在 n=200 时再试一次:
它非常好用:


40 个或更少的土豆变坏的几率约为 54%。这很粗略,但是嘿,你是去工作的,不是去享受美食的,所以坚强点,同志。
工业规模马铃薯种植
有时我们会失败。有时我们会成功。有时候,就像他们在东欧集团常说的,我们太成功了。
尽管土豆烂了,你的厨艺还是很棒,现在你得为整个工厂做晚饭了。对许多饥饿的工人来说,这相当于 2000 个土豆。带上你的队友,跳上卡车,开到火车站。为了祖国的荣耀。
你从火车上带回来的赏金中,400 个或者更少的土豆会是坏的几率有多大?更改代码,使 n=2000,然后再次运行它。结果相当令人难过:
---------------------------------------------------------------------------
OverflowError Traceback (most recent call last)
<ipython-input-5-d85e2d80093f> in <module>
7 # compute probabilities for all k
8 for k in tqdm(range(n + 1)):
----> 9 df.loc[k] = bin_prob(n, p, k)<ipython-input-4-88c12493fe27> in bin_prob(n, p, k)
1 def bin_prob(n, p, k):
2 arr = math.factorial(n) // math.factorial(k) // math.factorial(n - k)
----> 3 bp = arr * (p ** k) * ((1 - p) ** (n - k))
4 return bpOverflowError: int too large to convert to float
我们正在尝试计算 2000!在那里。那个号码有 5736 个数字。在普通 Python 中,您无法解决这个问题。这个整数很好,但是你必须让它和 float 一起运行,而普通 Python 在这个范围内不支持 float。
小数来救场。它可以处理任意数量的数据。默认情况下,它的工作精度为 28 位,但是您可以根据需要将其更改为任意值,在某些情况下,它确实会动态更改。
import decimal
print(decimal.getcontext())
Context(prec=28,
rounding=ROUND_HALF_EVEN,
Emin=-999999,
Emax=999999,
capitals=1,
clamp=0,
flags=[],
traps=[InvalidOperation, DivisionByZero, Overflow]
)
它甚至嵌入了一些数学函数,所以 int(decimal。上下文()。幂(2,3))是 2 = 8。在处理格式时,您可能需要将格式转换成十进制,然后再转换回常规的 float 或 int,但这对于消除大小限制来说是很小的代价。只是要记住它比普通的数学图书馆慢一点,所以只有在紧急情况下才打碎这个玻璃。
让我们来修正我们的函数:
我们用 Decimal()包装所有内容的原因是我们在处理浮点值;如果这些参数是整数,ctx.power()会直接接受它们。最后,在我们返回它之前,我们把十进制格式转换成浮点数。
哇,这有用吗:


400 个或更少的土豆变坏的概率是 51%。也许你不会为整个工厂做饭太久。
到无限和更远
十进制很牛逼。我已经把它提高到 n=20000。它花了 10 分钟完成,单线程,但它做了工作。此时,您可能希望切换到多处理。
源代码
如果你想看 Jupyter 的笔记本,里面有本教程的全部代码,这里有。
捷径
当然,您总是可以导入 scipy 并使用库函数进行相同的计算…
import scipy.stats as ss
n, p, k = 2000, 0.2, 40
ss.binom.cdf(k, n, p)
…这将为您提供上面艰难计算出的相同的累积概率(如果您想要普通概率而不是累积概率,请使用 pmf()而不是 cdf())。
但这不是重点——重点是展示 Python 如何处理专业库之外的大量数据,并在此过程中探索一些统计数据。
信用
《统计学的基本实践》,第 8 版,作者摩尔、诺茨和弗利格纳。
非本人制作的图片来源:
[## 苏联柴油动力由 jpachl 对 DeviantArt
1986 年夏天,一列由苏联制造的 M62 发动机(东德 120 级)为首的货运列车正在等待…
www.deviantart.com](https://www.deviantart.com/jpachl/art/Soviet-diesel-power-807993256) [## 马铃薯
马铃薯是一种原产于美洲的块根蔬菜,是马铃薯的淀粉块茎,也是一种植物…
en.wikipedia.org](https://en.wikipedia.org/wiki/Potato)
门控线性网络在线学习的潜力
DeepMind 最近的一份出版物对样本高效在线学习提出了一个有趣的新观点。

门开着,进来吧。(照片由Á·加萨·德品内在 Unsplash 上拍摄)
现代深度学习系统的两个最大缺点是它们对数据的渴望程度和训练时间(我在看着你 GPT-3 )。这些系统在训练时可以访问它们的所有数据,并且在它们的许多学习时期中多次重新访问每条数据。因此,当你将这些技术应用于在线学习时,毫不奇怪它们并没有真正起作用。
当在“离线设置”(即针对多个时期的静态数据)中训练的模型被部署到现实世界中时,它们无法利用新看到的数据,因为它们的参数被冻结,这意味着它们不再学习。如果底层数据分布不变,这是没问题的,但在现实世界中通常不是这样。考虑零售推荐:一个项目的受欢迎程度会随着时间的推移而消长,这意味着一个静态的系统将提供不一致和过时的推荐。一种解决方案是定期用收集到的所有新数据重新训练系统,但现实世界与模型所学之间仍有差距。
另一方面,在线学习系统从每一段数据中顺序学习,因此可以更快地适应变化(并且不必重新部署)。这代表了与离线学习完全不同的学习场景。DeepMind 最近的一项技术,门控线性网络,提出了一种新的在线学习方法,可以与等效的离线学习技术相媲美。
门控线性网络有什么不同?
门控线性网络最酷的一点是网络中的每个神经元都可以单独预测目标。
在神经网络分类器中,神经元按层排列,较浅的层向较深的层提供输入。为了学习,预测的结果(即最终网络输出的损失)通过反向传播通过网络向上传回,并且每个神经元被稍微调整以减少这种损失。网络的前向传递产生预测,后向传递更新网络以(有希望地)提高性能。正如 DeepMind 的门控线性网络论文中所说:
反向传播长期以来一直是事实上的信用分配技术,是诸如卷积神经网络和多层感知器(MLPs)之类的流行神经网络架构的成功训练的基础。
关于门控线性网络(GLNs)的一个有趣的事情是,它们不使用反向传播。虽然反向传播在允许网络学习“高度抽象的特定任务特征”方面是有效的,但训练这些系统的过程需要许多时期和大量数据。从训练过程中去除反向传播克服了这些问题,这意味着 GLN 可以在数据集的单次传递中进行训练,使其适合在线学习。
然而,在不使用反向传播的情况下,网络(即最终层)的预测误差如何返回到网络的较浅层?GLN 的酷之处在于网络中的每个神经元都单独预测目标。这意味着你可以选取网络中的任何一个神经元,并将其输出解释为最终预测。例如,如果你正在对猫(0)和狗(1)进行训练,而一个 GLN 神经元预测 0.9,那么它非常有信心这个特定的输入是一只狗——并且你可以对网络中的任何神经元进行训练!相比之下,如果没有网络的上下文,常规神经网络中神经元的输出是没有意义的;只有最后一层神经元的输出实际上与预测目标有任何关联。
当 GLN 中的每个神经元预测目标时,它们可以在本地进行训练,而无需通过网络传回任何信息。给定一些输入信息,神经元进行预测,将其与输出标签进行比较,并更新其权重,而不依赖于最终的网络输出。尽管如此,神经元仍然是分层排列的;浅层神经元的输出形成了深层神经元的输入。网络的前向传递与传统神经网络基本相同,只是后向传递发生了变化。
在门控线性网络神经元内部
GLN 中的一个神经元产生一个二元事件的概率预测。这样做的内部机制使用门控几何混合:一种将一组不同的概率预测组合成单个预测的方法。为了理解引擎盖下到底发生了什么,我们必须首先理解门控几何混合。

天气预测的几何混合——你相信谁会告诉你带把伞?
假设你醒来想知道当天晚些时候是否会下雨,但是你并不真正相信任何单一的信息来源(从什么时候开始气象员可以预测天气了?)。你可以查看各种天气预报来源:气象局、你的室友、、你最喜欢的古代天气知识——他们都会给出不同的预报,你对每个来源的信任程度也不同。几何混合是一种数学模型,它允许你将不同的概率预测组合成一个单一的预测,因此你可以决定是否带一把伞去工作(除非你被困在家里工作)。每个信息源可以基于其可靠性而被不同地加权;如果输入源确实不正确,几何混合甚至允许负权重。
在某些条件下,一些天气来源可能比平时更可靠,而另一些则不那么可靠。如果早上天气晴朗,你的室友可能会有一种不可思议的正确预测下午天气的能力。这是门控几何混合的门控部分:在给定一些其他数据(称为边信息)的情况下,改变输入数据的权重。输入数据是相同的,但是你改变了每个信息源的权重,从而得到不同的结果。

你更信任你的室友,因为现在天气晴朗,而且你可以更准确地预测当天下午是否会下雨。
所以在内部,GLN 中的神经元正在执行门控几何混合。它结合先前神经元的预测,并使用由一条附加边信息确定的一组权重,产生自己的单个预测。网络的最后一层仅由单个神经元组成,这提供了网络的整体预测。网络中的每个神经元通过将自己的预测与目标标签进行比较来更新其几何混合权重,通知它哪些输入源更可靠并且将来应该被信任。
大局
如果我们再次缩小来考虑整个网络,就有可能拼凑出 GLN 是如何做出预测的。它需要从一些初始的基本预测开始,以输入到网络中;这些通常只是输入数据的简单转换。然后,网络的每一层开始进行预测,这些预测可以输入到后续的层中,每一层都有希望做出比前一层更好的预测。边信息允许神经元切换它们当前使用的权重集,以更适合当前的上下文。

GLN 的表现与流行的离线学习方法的比较。(来源 DeepMind )
DeepMind 在一些不同的数据集上将他们的 Gln 与现有的机器学习技术进行了比较。在这些实验中,GLNs 仅被训练一个时期(即,仅一遍数据),而其他系统被训练 100 个时期。尽管每段数据只看一次,GLNs 的性能与其他技术相当,证明了它们的样本效率和用于在线学习的潜力。
我目前正在编写门控线性网络的 Python 实现,以便用它们进行实验;期待在不久的将来会有更多关于它们如何工作的讨论和更好的细节!
算法群体的力量。
数字是有力量的…甚至对于机器学习算法也是如此。

罗布·柯伦在 Unsplash 上的照片
介绍
在詹姆斯·苏洛维耶茨基(James Surowiecki)的《群体的智慧》(The Wisdom of Crowds)一书中,可以找到关于群体力量的最引人入胜的历史例子之一。在该书中,一个由工程师、海洋学家、打捞人员和数学家组成的团队被要求对可能在哪里找到某艘沉没的潜艇“蝎子号”(Scorpion)做出最佳估计(海军没有足够的人力来搜索整个区域,需要更具体的猜测)。就个人而言,这些猜测非常不准确,但是小组的综合平均猜测距离沉没潜艇的实际位置只有 220 米!
事实反复证明,得出一个估计值的最好方法是询问许多不同背景的人——越多越好。我们如何将这一社会学概念应用于机器学习?
集成学习
集合模型只是模型的集合,这些模型被平均以提供“群体的猜测”正如人类有偏见一样,模型也带有固有的假设和偏见。在几个模型中取平均值几乎可以保证减少误差。
数据
对于这个例子,我使用了来自 Kaggle 的一些信用卡欺诈数据。第一项工作是选择一个评估标准。我注意到有一个巨大的类别不平衡 (99.8%的数据被标记为正常交易量,另外 0.2%是欺诈性交易),因此准确性指标不在考虑范围内。对于这类问题,最好选择精度,召回,或者 F1 的分数。为了简单起见,我选择了精确。
模特们
看了一下数据后,我训练了五个模型:K-最近邻、逻辑回归、随机森林、XGBoost 和朴素贝叶斯。每一次之后我得到的精度如下表所示。

五种不同算法的精度。
显然,朴素贝叶斯和 KNN 分类器并不理想,但其他三个做得相当好。我们使用单个模型的最大精度是 0.96。记住这个数字。
民主(几乎)
将这些输出转化为“类似人群”格式的方法之一是让每个模型根据其收到的答案进行投票。本质上,如果随机森林算法预测为 0,它会投“0”如果所有其他算法都预测 1,它们都会投“1”这意味着最终的结果是四个 1 和一个 0。在这种情况下,最终输出将是 1。
我使用了一个“加权投票模型”,其中表现最好的模型拥有最多的票数。下面的图表详细说明了我给每个算法投了多少票。

给每个算法的投票。
这些数字是由每个模型的相对精度决定的。现在让他们投票吧!
结果呢
运行投票方法后,我收到了以下结果:
预测值:0,实际值:0 → 56,868(真负值)
预测:1,实际:0 → 2(假阳性)
预测:0,实际:1 → 21(假阴性)
预测:1,实际:1 → 71(真阴性)
这转化为 0.973 的精度!请注意,对于该数据,假阴性是代价最高的结果,因为这意味着交易是欺诈性的,但我们的模型预测是正常的交易。
为了证明群体比个人更好,这里有一个图表,显示了每个算法被群体正确“投票否决”的次数(即一个算法投票不正确,但其他算法投票正确,因此“投票否决”了第一个算法)。

个人失误但群体成功的事件。
正如所料,我们的朴素贝叶斯模型被否决的次数最多,但即使是随机森林也被其他算法正确否决了 23 次!朴素贝叶斯模型也在投票中胜出,所以即使它不是表现最好的,它仍然是有用的。
结论
使用集成方法的好处包括将糟糕的模型变成重要的投票。这种方法几乎没有缺点,应该是每个数据科学家的工具箱中的一项。使用超参数优化可以获得更好的结果,但是我在这个例子中只使用了股票模型。
如果你喜欢这篇文章,你可以关注我以获得更多类似的内容。感谢阅读!
使用 PyMC3 估计贝叶斯推理的能力
内部 AI
如果您因为贝叶斯回归的复杂性而避开了它,那么本文将展示如何在 Python 中将简单的 MCMC 贝叶斯推理应用于带有异常值的线性数据,使用线性回归和高斯随机游走先验,测试关于正态与 Student-T 先验分布的观测误差的假设,并与普通最小二乘法进行比较。

Ref:Jupyter 笔记本 和 GitHub 资源库
贝叶斯方法的美妙之处在于,它们能够根据对模型参数行为的先验预期,生成衍生模型质量的概率估计。我们得到的不是单点解,而是每个解都有指定概率的分布。对数据行为的先验预期被公式化为一组先验,即模型参数的概率分布。
以下场景基于 Thomas Wiecki 的精彩文章“GLM:稳健的线性回归”,探索了 Python 库 PyMC3 作为使用 Python 中的马尔可夫链蒙特卡罗(MCMC)方法对数据建模的方法,并讨论了派生的贝叶斯模型的预测能力。考虑了不同的先验,包括正态、Student-T、Gamma 和 Gaussian 随机游走,目的是使用广义线性模型(GLM)和采用非参数方法对样本数据进行建模,从估算的先验直接估计观测数据。
抽样资料
我们的样本数据生成为一个简单的线性模型,具有给定的截距和斜率,并在每个观测值中添加了一个额外的随机高斯噪声项。为了使任务有趣,少量的离群值被添加到与真实线性模型没有代数关系的分布中。我们的目标是尽可能接近地模拟观察到的线性模型,对异常值和观察误差项的破坏具有最大可能的鲁棒性。
正常与学生-T 优先
我们比较了基于正态和 Student-T 观察误差先验的模型。Wiecki 表明,由于分布具有较长的尾部,Student-T 先验在处理异常值方面优于正态分布,传达了异常值不应被视为完全意外的概念。
真实线性模型和普通最小二乘(OLS)回归
我们从 y=ax+b+epsilon 形式的模拟观察数据集开始,噪声项 epsilon 来自正态分布。这里,我们 1)根据“真实”线性模型,在 0 到 1.5 的范围内创建观察值,2)添加测试异常值,3)将 x 轴从 1.5 扩展到 3.0,这样我们就可以测试我们的模型在该区域的预测能力。
在预测区域中,我们使用了 numpy。MaskedArray()
可视化模拟数据以及真实回归线和普通最小二乘回归非常有用。
Seaborn 库允许我们绘制这个 directly⁴图,我们还可以设置一个'健壮的'标志来计算回归线,同时去除离群值的权重。

样本点图、真实回归线、普通最小二乘回归(OLS)和稳健 OLS。
PyMC3 贝叶斯回归
F 按照 Wiecki 的例子,我们可以在 PyMC3 中创建线性回归模型(GLM),从 y(x)=‘y ~ x’生成线性模型。
为了测试稳健回归的概念,我们创建了两个模型,一个基于观测误差的正态先验,另一个基于 Student-T 分布,我们预计其受异常值的影响较小。
pymc 3 . sample()方法允许我们对条件先验进行采样。在正常模型的情况下,默认先验将用于ε中的截距、斜率和标准差。在 Student-T 模型的情况下,先验将用于截距、斜率和 lam⁷.
运行这两个模型创建了 trace 对象,这些对象包含在所有链上为每个模型采样的一族后验概率,以观察结果为条件,从中我们可以绘制各个 glm 回归线。

样本点图、真实回归线和贝叶斯线性模型,具有正态和学生 T 先验
正态与学生 T 误差分布的比较

参数分布的汇总可以从pymc 3 . summary(trace)中获得,我们在这里看到,来自 Student-T 先验的截距为 1.155 ,斜率为 2.879。因此比正常先验更接近于 1,3 的期望值,这给出了截距 2.620 ,斜率 1.608 。
Student-T 误差分布的细化
从上面的图中可以清楚地看出,我们已经通过使用 Student-T 先验改进了回归,但是我们希望通过改进 Student-T 自由度参数来做得更好。
模型:正态模型的标准偏差先验分布是一个半柯西分布,一个具有一个⁴自由度的正域 Student-T,它反映了我们之前的模型。
我们还需要构建一个新的 Student-T 模型,其中除了参数化 glm 之外,我们还在自由度参数 nu 上创建一个先验。

结果:从 总结(迹) 我们可以看到,从 Student-T 误差分布得到的截距改进为 1.144 ,斜率 2.906 相对于之前的结果 1.155 ,斜率 2.879 。
可视化可信区间:拟合线性模型并获得每个样本的截距和斜率后,我们可以计算出轴上每一点的期望 y( x) ,然后使用numpy . percentile()将这些样本聚合到可信区间中(CI)⁹在 x )。**
当所有马尔可夫链的所有值都保存在跟踪对象中时,我们可以将采样的条件先验的平均值、50%和 95%的可信区间可视化。下面清楚地说明了 Student-T 模型的可信区间与真实回归的接近程度。
在本文的后面,我们考虑一个非参数模型,该模型遵循线性趋势线,同时对观测值的波动进行建模,这可以传达我们可能希望保留的局部信息。

具有正态和学生 T 先验的贝叶斯线性模型的可信区间图
后验预测能力
B ayesian 推理通过寻求对参数化先验概率分布的修改来工作,以最大化先验参数上观察数据的似然函数。
那么,在样本数据缺失的地区,预期后验概率会发生什么变化呢?我们应该发现,考虑到误差项引起的波动,后验预测遵循回归线。
模拟未观测数据
我们已经创建了一个y _ 预测的** 观察值阵列,该阵列在区域 1.5 到 3 中被屏蔽,表明这些是 未观察到的 样本。PyMC3 添加这些缺失的观察值作为新的先验值, y_missing ,,并计算整个样本空间的后验分布。**
用这个扩展的样本空间重新运行上述模型产生了现在包括估算的观察值的统计数据。

当我们运行这个模型时,我们在 摘要 中不仅看到 a0、b0、nu0 的先验,还看到所有缺失的 y,如 y_0_missing。
推断出预测样本观测值的全部范围后,我们可以绘制这些后验均值以及可信区间。
我们在下面看到,推断的观察值已经很好地符合预期的线性模型。

具有正态和 Student-T 先验的贝叶斯线性模型的预测样本图
非参数推理模型
验证了线性模型之后,如果我们能够用非参数模型对这些样本观察值进行建模,那就太好了。在非参数模型中,我们无需寻找截距和斜率参数,而是尝试使用样本空间中每个数据点的先验信息直接对观察数据进行建模。
非平稳数据和随机游走先验
非参数模型的简单假设是数据是稳定的,因此每个数据点的观察样本不会以系统的方式呈现趋势。
但是真实世界的数据确实经常趋向于,或者至少受到相邻数据点的平滑要求的约束,因此先验的选择是至关重要的。
在我们的方案中,数据是不稳定的,因为它在 x 上有一个明显的趋势。如果我们对我们的观测值使用简单的高斯先验,那么即使在用观测数据进行调节之后,只要我们进入未观测区域,预测的观测值就会迅速返回到它们的先验均值。

y 上具有平稳先验的非参数模型的预测样本图,适用于正态和 Student-T 先验
高斯随机游走先验
G 高斯随机游走先验为我们提供了对非平稳数据建模的能力,因为它基于之前的数据点状态加上一个随机游走步骤来估计一个可观测值。PyMC3 实现还允许我们模拟一个漂移参数,该参数为每个随机行走步骤添加一个固定的标量。
在这两个推理模型中,我们使用了单个标量漂移参数,在这种情况下,该参数相当于数据在漂移方向上的斜率。
重要的是,数据(包括异常值)以相等的样本步长正确排序,因为先验将在数据建模中假设这种行为。由于这个原因,离群值被插入到 x 数组的索引点,而不是被附加为(x,y)。
下面我们运行两个模型,第一个模型的漂移参数设置为零,导致最后一个观测点的静态线,第二个模型的漂移是从数据中推断出来的。
可以看出,这个最终模型非常好地拟合了线性趋势,特别是在使用受异常值影响较小的 Student-T 先验时。

对于正态和 Student-T 先验,在 y 上无漂移的随机游走的非参数模型的后验均值图

对于正态和 Student-T 先验,在 y 上随机游走的非参数模型的后验均值图
绘制高斯随机游走后验样本
此外,我们现在可以看到局部扰动中的异常值对线性的影响。
下面我们来看一些实际的随机漫步样本。
我们不应该期望任何特定的路径接近样本数据的实际预测路径。从这个意义上说,这是一个真正的随机方法,因为我们的结果是从采样路径的统计平均值得出的,而不是从任何特定的样本路径得出的。

具有 y 上漂移先验的随机游走的非参数模型的预测样本图,适用于正态和学生 T 先验
异常值对随机游走预测后验概率的影响
已经看到异常值对后验均值的影响,我们推测预测样本的噪声可能是由于异常值引起的随机游走的扰动。
为了测试这一点,我们在这里删除了异常值,并重新运行相同的两个预测模型。

无异常值数据的预测后验均值图,具有 y 上的漂移先验的随机游走,用于正态和学生 T 先验

无异常值数据的预测样本图,具有 y 上的漂移先验的随机游走,用于正态和学生 T 先验
可以看出,预测样本要干净得多,在随机游走样本中具有非常紧密的可信区间和小得多的偏差。这给了我们信心,对于正确的模型,高斯随机游走是非平稳模型拟合的良好条件先验。
结论
本文的目的是展示使用 PyMC3 进行贝叶斯学习的简单性和强大功能,希望我们已经:
- 表明在稳健线性回归中,Student-T 误差先验比正态先验表现更好;
- 证明了在 Student-T 误差先验上改进的自由度提高了对回归线的拟合;
- 显示了我们可以快速和容易地绘制线性回归和非参数模型的后验样本的置信区间;
- 证明了使用具有漂移的高斯随机游走的非参数模型可以预测未观测区域中的线性模型,同时允许我们可能想要保留的观测数据中的模型局部波动;
- 研究了高斯随机游走先验,并表明其混沌行为允许其探索广泛的样本空间,同时不妨碍其生成平滑的预测后验均值。
感谢阅读,请随时添加评论或更正。完整的源代码可以在 Jupyter 笔记本和 GitHub 资源库中找到。
参考
[1] T .威茨基, GLM:稳健线性回归 (2018),PyMC3
[2] J. Salvatier1,T. Wiecki,C. Fonnesbeck,使用 PyMC3 在 Python 中进行概率编程 (2016),PeerJ 计算机科学
[3] J. Salvatier1,C. Fonnesbeck,T. Wiecki, GLM:具有异常值检测的稳健回归 (2016),PyMC3
[4] M. Waskom,seaborn . reg plot(2012–2020),seaborn.pydata
[5] J. Jones,M. Mastanduno,T. Larsen,机器学习与统计:何时使用每一个—healtc care . ai(https://healthcare.ai/Machine-Learning-vs-Statistics-use/),health care . ai
[6]达林,线性回归 vs 贝叶斯回归 (2017),教育研究技术
[7] PyMC3 开发团队,连续发行 (2018),PyMC3 API
[8] A. Gelman,学生最佳实践-T 优先 (2015),统计建模,因果推断
[9] 贝叶斯可信区间 (2020),维基百科
[10] PyMC3 开发团队,推断抽样 (2018),PyMC3 API
[11] P. Orbanz,Y. W. Teh,贝叶斯非参数模型 (2010),牛津大学统计系
[12] T .约尔达诺娃,平稳和非平稳过程介绍 (2020),Investopedia
[13] A. Gelman,优先选择建议 (2020),斯坦-dev/斯坦
[14] Hiro,贝叶斯回归使用 PyMC3 (2019)
[15] Paul, PYMC3 贝叶斯预测锥 (2017)堆栈溢出
数据的力量:我的野外之旅

由 Unsplash 上的 Matese Fields 拍摄
在意想不到的地方发现数据科学
我的数据科学之旅始于一个我从未预料到的地方。在我大学学习数学的时候,我拿起了查尔斯·杜希格的名著《习惯的力量》。我一直对行为心理学感兴趣,我的几个朋友曾向我推荐过它。这很大程度上是一本关于习惯如何在商业场景中形成、改变和巧妙利用的书,但杜希格很狡猾,通过几个有趣而难忘的故事解释了习惯的力量。
当时,我正在学习成为一名数学老师,但我对学术界的兴趣正在减弱,我正在考虑其他选择。杜希格在书中讲述的两个故事包括数据科学的出色应用,这些应用在各自的领域产生了巨大影响。这些故事立即抓住了我的注意力,让我看到了数据的力量。我记得我对自己说,“伙计,如果我能找到一份这样的工作……那将是一个梦想!”
现在,两年后,我是一名研究数据科学的硕士研究生,并在该领域寻求职业生涯。我想在这篇文章中分享最初激发我对数据世界兴趣的故事。它们改编自杜希格的书。
目标的怀孕预测值:
我敢肯定,大多数数据爱好者现在都听说过关于 Target 怀孕预测器的故事。作为一个没有数据背景,也很少接触数据的许多用途的人,我被震惊了。这个故事让我大吃一惊!
一天下午,营销部门问为 Target 工作的数据专家安德鲁·波尔(Andrew Pole ),他是否可以建立一个模型来预测他们的哪些客户怀孕了。你可能会问,为什么?
几乎没有比这更有利可图、渴求产品、对价格不敏感的集团存在了。不仅仅是尿布和湿巾。有婴儿的人太累了,他们会买他们需要的一切——果汁和卫生纸,袜子和杂志——无论他们在哪里购买奶瓶和配方奶粉。更重要的是,如果一个新的父母开始在塔吉特购物,他们会持续回来很多年。
查尔斯·杜希格
因此,新父母利润惊人,但是塔吉特怎么知道如果新父母开始在塔吉特购物,他们会持续回来很多年?
这个问题的答案可以在现代营销理论中找到:人们的购物习惯在重大生活事件后更有可能改变。有什么比生孩子更大的人生大事?是的,初为人父母的人会买很多东西,但与他们通过改变购物习惯所获得的利润相比,他们最初购买的收入根本不算什么。
这就是为什么零售店会不择手段寻找新的父母。一些大公司,如华特·迪士尼公司,甚至向产科病房的新妈妈赠送礼品篮。然而,塔吉特想要做得更好。他们想抢先那些大公司一步。如果他们能识别出怀孕的妇女并把她们带进他们的商店,他们就会抢在别人之前抓住她们。因此,目标要求提供一名怀孕预测员。
波尔急切地接受了挑战。他开始深入 Target 的婴儿送礼会登记簿,分析他所知道的怀孕女性的购物习惯。由于这些妇女向 Target 提供了她们的预产期,Pole 能够将预产期与她们的购买历史联系起来,以确定她是在哪个三月购买的。
通过收集所有的信息,他能够识别出大约 25 种不同的产品,当用于数学模型中时,可以预测女性的孕期和预产期。
住在布鲁克林的 35 岁的 Liz Alter 购买了五包毛巾、一瓶“敏感皮肤”洗衣液、宽松的牛仔裤、含有 DHA 的维生素和一系列保湿霜?她有 96%的机会怀孕,可能会在五月初分娩。39 岁的旧金山人凯特琳·派克购买了一辆价值 250 美元的婴儿车,但除此之外什么也没买?她可能是为朋友的婴儿送礼会买的。另外,她的人口统计数据显示她两年前离婚了。
查尔斯·杜希格
一旦应用于 Target 数据库中的所有女性,该算法就可以识别出数十万名可能怀孕的女性及其预产期。Target 可以向他们发送针对他们可能会在购物习惯最容易改变的最佳时间购买的产品的广告。即使只有一小部分女性和她们的家人继续在塔吉特购物,塔吉特也会让她们的收入增加数百万。
这就是问题所在!这种模式投入使用大约一年后,一名男子走进明尼苏达州的塔吉特百货公司,抱怨他们给他正在上高中的女儿发婴儿服装和婴儿床的广告。经理道了歉,几天后又打电话来再次道歉。父亲很尴尬。
“我和女儿谈过了,”他说。“原来我家里有一些活动,我并没有完全意识到。”他深吸了一口气。“她的预产期在八月。我欠你一个道歉。”
查尔斯·杜希格
所以,这个算法起作用了——真的很好!
现在,当然,你可以争论这是否道德,但是不可否认这是完全的智慧和预测模型的力量。巧妙利用数据可以取得惊人的成就。
击中宋的科学:
除非你在过去的二十年里一直生活在岩石下,否则你一定听过这首歌“嘿呀!”由 2000 年代早期最受欢迎的音乐团体之一 OutKast 演唱。如果没有对数据的巧妙运用,这首歌可能永远不会变得像以前那么大,现在依然如此。
在 21 世纪初,音乐行业开始使用数据策略来预测听众的习惯。多音 HMI 是一家成立于西班牙巴塞罗那的音乐分析公司,它开发了一个名为热门歌曲科学(Hit Song Science)的程序,预测一首曲子是否有可能成功。他们使用了几个特征,如速度、音高、旋律和和弦进行来实现这一点。
大约在同一时间,奥特卡斯特制作了歌曲“嘿呀!”唱片公司正在联系 DJ,说这首歌会很受欢迎。当他们通过热门歌曲《科学》进行测试时,它获得了前所未有的最高分。这首歌会大受欢迎的!然而,人们花了一些时间才意识到热门歌曲科学模型已经知道了什么。
一家测量广播听众的公司 Arbitron 开发了一种新技术,可以显示在特定时间有多少人在收听广播电台。它还可以显示听众何时换台。他们在费城排名前 40 的电台 WIOQ 上测试了这一点,该电台开始播放“嘿呀!”人们对听众会喜欢这首歌的期望很高,但他们发现三分之二的听众在这首歌的前 30 秒内换了台。听众鄙视“嘿呀!”发生了什么事?
一个试图回答这个问题的人是 Rich Meyer。迈耶设计了描述广播听众趋势的公式,并为广播电台增加听众提供了见解。他花了很多时间研究的一个问题是,为什么某些歌曲会导致很少人换台。DJ 称这些歌曲为“粘性”当“嘿呀!”被释放后,他开始摆弄阿比创收集的数据。他也坐下来听了几首被认为有粘性的歌,发现了一些有趣的东西。
迈耶意识到粘性歌曲听起来不一定彼此相似,但它们听起来完全符合他对特定流派歌曲的预期。他们听起来都很熟悉。
做决定需要很大的脑力劳动。很多时候,我们实际上并没有选择喜欢或者不喜欢某样东西。相反,我们的大脑遵循一种习惯,对线索和奖励做出反应。对习惯做出反应需要更少的精神努力,让我们可以把更多的精力放在其他更重要的活动上。当然,所有这些都是下意识发生的。
例如,当我们在收音机里听到一首熟悉的歌曲时(提示),我们会被奖励以跟着唱或哼的能力。这就形成了持续倾听的常规或习惯。我们甚至不用再去想它了。当一首歌开始时,我们要么跟着唱,要么换台。
这就是为什么“嘿呀!”没人听。它还不熟悉。广播听众不想有意识地决定他们是否喜欢它,所以他们通过改变电台来回应他们的习惯。
问题是像热门歌曲《科学》这样的计算机程序非常擅长预测人们的习惯。但是有时候,那些算法发现了实际上还没有出现的习惯…“嘿呀!”需要成为一个既定的聆听习惯的一部分,才能成为热门。
查尔斯·杜希格
电台 DJ 需要做出“嘿呀!”感觉很熟悉,为了做到这一点,他们使用了现在教科书上的播放列表理论。他们夹着“嘿呀!”介于里奇·迈耶认为很黏的那类歌曲之间。WIOQ 采用这一策略后不久,更换电台的听众比例从 26.6%下降到 13.7%。两个月后,下降到 5.7%。使用相同技术的其他电厂也经历了类似的趋势。
当听众听到“嘿呀!”一次又一次,它变得熟悉起来。一旦这首歌流行起来,WIOQ 就播放“嘿呀!”一天多达十五次。人们的倾听习惯已经转变为期待——渴望,甚至是“嘿呀!”一声“嘿呀!”习惯出现了。这首歌后来赢得了格莱美奖,卖出了超过 550 万张专辑,并为电台赚了数百万美元。
查尔斯·杜希格
最终,现实追上了计算机程序已经知道的东西:“嘿呀!”会变得很大!这就是数据的力量。
[1]: 杜希格,查尔斯。习惯的力量:为什么我们在生活和商业中做我们该做的事。纽约:兰登书屋,2012 年。打印。
机器学习中集成方法的力量
如何通过装袋和增压来提升性能

一般来说,在团队中工作的人比个人更有可能表现得更好。群体的一个优势是他们能够从许多不同的角度来完成一项任务,而这对于个人来说是不可能的。我们没有意识到的问题可能会被同事发现。分组的优势也适用于机器学习模型。我们可以通过对个别弱学习者进行分组来创建一个健壮的、高度精确的模型。在机器学习领域,集成方法用于组合基础估计器(即弱学习器)。两种类型的集成方法是平均(例如 bagging)和增强(例如梯度增强、AdaBoost)。
集成方法不仅提高了性能,而且降低了过拟合的风险。考虑一个评估产品性能的人。一个人可能过于关注某个特定的特征或细节,因此无法提供一个很好的概括评价。另一方面,如果一群人评估产品,每个人可能会关注不同的功能或细节。因此,我们降低了过于关注一个特性的风险。最后我们会有一个比较概括的评价。类似地,集成方法导致良好的一般化模型,从而降低过拟合的风险。
装袋
打包意味着聚合几个弱学习者的预测。我们可以把它想成平行结合弱学习者。将几个弱学习者的预测平均值作为整体预测。最常见的使用 bagging 方法的算法是随机森林。
随机森林的基本估计器是决策树,它通过反复提问来划分数据。随机森林是由多个决策树结合 bagging 方法构建的。如果用于分类问题,总体预测基于从每个决策树接收的结果的多数投票。对于回归,叶节点的预测是该叶中目标值的平均值。随机森林回归取决策树结果的平均值。
随机森林的成功高度依赖于使用不相关的决策树。如果我们使用相同或非常相似的树,总体结果将不会比单个决策树的结果有太大的不同。随机森林通过自举和特征随机性实现不相关的决策树。
bootstrapping是从带有替换的训练数据中随机选取样本。它们被称为 bootstrap 样本。下图清楚地解释了这一过程:

特征随机性通过为随机森林中的每个决策树随机选择特征来实现。随机森林中每棵树使用的特征数量可通过 max_features 参数控制。

特征随机性

自助样本和特征随机性为随机森林模型提供了不相关的树。
超参数是学习算法的关键部分,它影响模型的性能和准确性。随机森林的两个关键超参数是 max_depth 和 n_estimators。
max_depth: 一棵树的最大深度。树的深度从 0 开始(即根节点上的深度为零)。如果未指定,模型会一直拆分,直到所有叶子都是纯的,或者直到所有叶子包含的样本数少于 min_samples_split。过度增加深度会产生过度配合的风险。
n_estimators: 代表一个森林中的树木数量。在一定程度上,随着森林中树木数量的增加,结果会变得更好。然而,在某个点之后,添加额外的树不会改进模型。请记住,添加额外的树总是意味着更多的计算时间。
助推
Boosting 就是把系列的几个弱学习者组合起来。我们最终从许多顺序连接的弱学习者中得到一个强学习者。梯度增强决策树(GBDT)是最常用的集成学习算法之一。像在随机森林中一样,GBDT 中的弱学习器(或基估计器)是决策树。然而,组合决策树的方式是不同的。
梯度提升算法以这样的方式顺序地组合弱学习器,即每个新的学习器适合于来自前一步骤的残差,从而改进模型。最终的模型汇总了每一步的结果,从而形成了一个强学习者。梯度提升决策树算法使用决策树作为弱学习器。损失函数用于检测残差。例如,均方误差(MSE)可用于回归任务,对数损失(log loss)可用于分类任务。值得注意的是,当添加新的树时,模型中现有的树不会改变。添加的决策树符合当前模型的残差。

梯度推进决策树
学习率和 n 估计量是梯度推进决策树的两个关键超参数。学习率,表示为α,简单地表示模型学习的速度。每增加一棵树都会修改整个模型。修改的幅度由学习速率控制。
学习率越低,模型学习越慢。较慢的学习速率的优点是模型变得更加健壮和通用。在统计学习中,学习速度慢的模型表现更好。但是,慢慢的学习是要付出代价的。训练模型需要更多的时间,这就引出了另一个重要的超参数。 n_estimator 是模型中使用的树的数量。如果学习率低,我们需要更多的树来训练模型。然而,我们需要非常小心地选择树的数量。使用太多的树会产生过度适应的高风险。
关于过拟合的说明
随机森林和梯度推进决策树之间的一个关键区别是模型中使用的树的数量。增加随机森林中的树木数量不会导致过度拟合。在某个点之后,模型的准确性不会因为添加更多的树而增加,但是也不会因为添加过多的树而受到负面影响。由于计算原因,您仍然不希望添加不必要数量的树,但是没有与随机森林中的树的数量相关联的过度拟合的风险。
然而,梯度推进决策树中的树的数量在过度拟合方面非常关键。添加太多的树会导致过度拟合,所以在某个时候停止添加树是很重要的。
感谢您的阅读。如果您有任何反馈,请告诉我。
特征工程的力量
为什么您可能只应该使用逻辑回归来建模非线性决策边界(使用 Python 代码)
作为一名数据科学家,我不禁被复杂的机器学习技术所吸引。用一些深度神经网络(DNN)获得额外的 1%的精度,并且在这个过程中必须旋转一个 GPU 实例,这是一件非常令人满意的事情。然而,这些技术经常把思考留给计算机,让我们对模型的工作原理知之甚少。所以,我想回到基础。

在这篇文章中,我希望教你一些关于特征工程的知识,以及如何用它来建模一个非线性的决策边界。我们将探讨两种技术的优缺点:逻辑回归(使用特征工程)和神经网络分类器。将给出用于拟合这些模型以及可视化其决策边界的 Python 代码。你也可以在 GitHub[1] 上找到完整的项目。最后,我希望让你理解为什么特征工程可能是其他非线性建模技术的更好的替代方案。
什么是特征工程
每当从原始数据创建要素或将现有要素的函数添加到数据集中时,您都在进行要素工程。这通常是利用特定领域的领域知识来完成的【2】。例如,假设我们想要预测一个人从手术中恢复所需要的时间(Y)。从之前的手术中,我们已经捕捉到了患者的恢复时间、身高和体重。根据这些数据,我们还可以计算出每个患者的身体质量指数=身高/体重。通过计算并在数据集中包含身体质量指数,我们正在进行要素工程。
为什么我们要做特征工程
特征工程是强大的,因为它允许我们将非线性问题重新表述为线性问题。为了说明这一点,假设恢复时间与身高和体重有如下关系:
y =β₀+β₁(height)+β₂(weight)+β₃(height/weight)+噪音
看第 3 项,我们可以看到 Y 和身高体重不是线性关系。这意味着我们可能不会期望线性模型(如线性回归)在估计β系数方面做得很好。你可以尝试使用非线性模型,比如 DNN,或者我们可以通过做一些特征工程来帮助我们的模型。如果我们决定将身体质量指数作为一个特征,则关系变为:
y =β₀+β₁(height)+β₂(weight)+β₃(bmi)+噪音
y 现在可以建模为我们 3 个变量的线性关系。因此,我们期望线性回归在估计系数方面做得更好。稍后,我们将看到同样的想法适用于分类问题。
为什么不让计算机来做这项工作呢
如果你想得到技术,特征工程本质上是核心技巧,因为我们将特征映射到一个更高的平面【3】。虽然,对于内核技巧,通常涉及的思想较少。内核函数被视为一个超参数,可以使用蛮力找到最佳函数——尝试不同函数变量的负载。使用正确的核函数,您可以建立非线性关系的模型。给定适当数量的隐藏层/节点,DNN 还将自动构建你的特征的非线性函数【2】。那么,如果这些方法可以模拟非线性关系,我们为什么还要为特征工程费心呢?
我们在上面解释了特征工程如何允许我们捕捉数据中的非线性关系,即使是线性模型。这意味着,根据问题的不同,我们可以获得与非线性模型相似的性能。我们将在本文的后面详细讨论一个例子。除此之外,使用特征工程还有其他的好处,使这项技术值得一试。

首先,你会对模型的工作原理有更好的理解。这是因为您确切地知道模型使用什么信息来进行预测。此外,通过直接查看特征系数,可以很容易地解释像逻辑回归这样的模型。第二个原因源于第一个原因,即该模型更容易解释。如果你在工业界工作,这一点尤其重要。你的同事也更有可能接触到一些更简单的模型。第三个原因是,您的模型不太可能过度符合训练数据。通过强力加载不同的超参数,很容易在数据中模拟噪声。相比之下,通过深思熟虑的特性,你的模型将是直观的,并可能模拟真实的潜在趋势。
资料组
让我们深入一个实际的例子。为了让事情尽可能清楚,将使用人工生成的数据集。为了避免这个例子变得令人难以置信的枯燥,我们将围绕它创建一个叙述。那么,假设您的人力资源部门要求您创建一个模型来预测某个员工是否会得到晋升。该模型应考虑员工的年龄和绩效得分。
我们在下面的代码中为 2000 名假设的雇员创建特性。雇员的年龄可以在 18 到 60 岁之间。性能分数可以在-10 到 10 之间(10 为最高)。两个特征都被混洗,因此它们不相关。然后,我们使用以下年龄(a)和表现(p)的函数来生成目标变量:
γ(a,p)= 100(a)+200(p)+500(a/p)-10000+500(噪声)
当γ(a,p)≥ 0 时,员工被提升;当γ(a,p) < 0 时,员工不被提升。我们可以看到,术语 a/p 包含在上面的函数中。这意味着决策界限将不是年龄和表现的线性函数。随机噪声也包括在内,因此数据不能完全分离。换句话说,一个模型不可能 100%准确。
如果上面的步骤有点混乱,也不用担心。我们可以用下面的代码可视化数据集,让事情变得更清楚。这里我们创建了一个数据散点图,结果如图 1 所示。只有两个特征,很容易看出到底发生了什么。y 轴代表员工的绩效得分,x 轴代表员工的年龄。获得晋升的员工的分数为红色,未获得晋升的员工的分数为蓝色。最终,2000 名员工中有 459 人(23%)获得了晋升。对于不同的随机样本,该比率会略有变化。

图 1:促销数据散点图
虽然这个数据是生成的,但是我们还是可以为剧情想出一个现实的解释。在图 1 中,我们可以看到 3 组不同的员工。首先是绩效得分在 0 分以下的群体。由于表现不佳,这些员工中的大多数没有得到提升,我们也可以预计他们中的一些人已经被解雇。我们可以期待得分高于 0 的员工要么获得晋升,要么接受其他地方的聘用。分数特别高的员工往往会离职。这可能是因为它们的需求量很大,而且在别处有更好的报价。然而,随着雇主年龄的增长,他们需要更高的绩效分数才能离开。这可能是因为年纪大的员工在目前的职位上更自在。
无论叙述如何,很明显,决策边界不是线性的。换句话说,不可能画一条直线来很好地区分提升组和未提升组。因此,我们不会期望线性模型做得很好。让我们通过尝试仅使用年龄和表现这两个特征来拟合逻辑回归模型来演示这一点。
逻辑回归
在下面的代码中,我们将 2000 名员工分成一个训练集(70%)和一个测试集(30%)。我们使用训练集来训练逻辑回归模型。然后,使用这个模型,我们对测试集进行预测。测试集上的准确率为 82%。这似乎不算太糟,但我们应该考虑到只有不到 23%的员工获得了晋升。因此,如果我们只是猜测没有一个员工会得到晋升,我们应该预计准确率在 77%左右。
通过使用下面的代码可视化它的决策边界,我们可以更好地理解模型在做什么。这里我们在样本空间内生成一百万个点。然后,我们使用逻辑回归模型对所有这些点进行预测。就像图 1 中的散点图一样,我们可以画出这些点。每个点的颜色由模型的预测决定——如果模型预测促销,则为粉红色,否则为浅蓝色。这为我们提供了一个很好的决策边界近似值,如图 2 所示。然后我们可以在这些点上绘制实际的数据集。
查看决策边界,我们可以看到模型做得很糟糕。该公司预测有晋升机会的员工中,大约有一半没有得到晋升。然后,对于大多数获得晋升的员工,它预测他们没有获得晋升。请注意,决策边界是一条直线。这强调了逻辑回归是一个线性分类器。换句话说,模型只能构建一个决策边界,它是您给它的特征的线性函数。在这一点上,我们可能会尝试不同的模型,但让我们看看是否可以使用特征工程来提高性能。

图 2:逻辑回归模型的决策边界
特征工程逻辑回归
首先,如下面的代码所示,我们添加了额外的特性(即年龄与性能的比率)。从那时起,我们遵循与先前模型相同的过程。列车测试分割与我们对“随机状态”使用的值相同。最终,该模型实现了 98%的准确率,这是一个显著的改进。
该模型仍然只需要雇员的年龄和表现来进行预测。这是因为附加特征是年龄和表现的函数。这允许我们像以前一样可视化决策边界。这是通过在样本空间中的每个年龄表现点使用模型的预测。我们可以看到,在图 3 中,通过添加额外的功能,逻辑回归模型能够模拟一个非线性的决策边界。从技术上来说,这是年龄和表现的非线性函数,但它仍然是所有 3 个特征的线性函数。

图 3:具有特征工程的逻辑回归模型的决策边界
使用逻辑回归的另一个好处是模型是可解释的。这意味着模型可以用人类的术语来解释【4】。换句话说,我们可以直接查看模型系数来了解它是如何工作的。我们可以在表 1 中看到模型特征的系数及其 p 值。我们不会涉及太多的细节,但是这些系数可以让你从获得晋升几率的变化来解释特征的变化。如果一个特性有一个正的系数,那么这个特性值的增加会导致升职机会的增加。

表 1:逻辑回归模型总结
从表 1 中我们可以看出,随着年龄的增长,升职的可能性也在增加。另一方面,对于性能来说,这种关系并不明显。性能的提高也会降低年龄/性能比。这意味着绩效提高的效果取决于员工的年龄。这很直观,因为它与我们在散点图中看到的一致。在这种情况下,可能没有必要以这种方式使用系数来解释模型。仅仅可视化决策边界就足够了,但是随着我们增加特征的数量,做到这一点变得更加困难。在这种情况下,模型系数是理解模型如何工作的重要工具。
同样,p 值可以帮助我们理解模型。由于系数是统计估计值,它们周围有一些不确定性。低 p 值允许我们确定我们的系数不同于 0。换句话说,我们可以确定一个系数要么是正的,要么是负的。这一点很重要,因为如果我们不能确定系数的符号,就很难用概率的变化来解释特征的变化。从表 1 可以看出,所有系数都具有统计学意义。这并不奇怪,因为我们使用特征的函数生成数据。
总的来说,当我们生成数据时,上面的分析非常直接。因为我们知道使用了什么函数来生成数据,所以很明显,这个附加功能将提高模型的准确性。实际上,事情不会这么简单。如果你对数据没有很好的理解,你可能需要和人力资源部的人谈谈。他们也许能告诉你他们过去看到的任何趋势。否则,通过使用各种图和汇总统计数据来研究这些数据,您可以了解哪些特征可能是重要的。但是,假设我们不想做所有这些艰苦的工作。
神经网络
为了比较,让我们使用一个非线性模型。在下面的代码中,我们使用 Keras 来拟合神经网络。我们只使用年龄和表现作为特征,因此神经网络的输入层的维数为 2。有 2 个隐藏层,分别有 20 个和 15 个节点。两个隐藏层都具有 relu 激活函数,而输出层具有 sigmoid 激活函数。为了训练模型,我们使用 10 和 100 个时期的批量大小。训练集大小为 1400 时,我们有 14000 步。最终,该模型在测试集上取得了 98%的准确率。这与逻辑回归模型的精度相同,但是我们不需要做任何特征工程。
查看图 4 中 NN 的决策边界,我们可以看到为什么它被认为是一个非线性分类算法。即使我们只给出模型年龄和性能,它仍然能够构建非线性决策边界。所以,在一定程度上,模型为我们做了艰苦的工作。你可以说模型的隐藏层已经自动完成了特征工程。那么,考虑到这个模型具有很高的准确性,并且需要我们付出较少的努力,我们为什么还要考虑逻辑回归呢?

图 4:神经网络的决策边界
神经网络的缺点是它只能被解释。这意味着,与逻辑回归不同,我们不能直接查看模型的参数来了解它是如何工作的。我们可以使用其他方法,但最终,理解神经网络的工作原理会更加困难。向非技术人员(如人力资源主管)解释这一点就更难了。这使得逻辑回归模型在行业环境中更有价值。
在工业界和学术界都有许多问题,其中大部分比本文给出的例子更复杂。所提出的方法显然不是解决所有这些问题的最佳方案。例如,如果你试图做图像识别,你不会用逻辑回归得到任何东西。对于更简单的问题,逻辑回归和对数据的充分理解通常是你所需要的。
图像来源
所有图片都是我自己的或从www.flaticon.com获得的。在后者的情况下,我拥有他们的高级计划中定义的“完全许可”。
参考
[1]奥沙利文(C. O'Sullivan),medium-articles(2020),【https://github.com/conorosully/m】T4edium-articles
[2] T .哈斯蒂,r .蒂布希拉尼,j .弗里德曼,
统计学习的要素【第 150 页】(2017),https://web.stanford.edu/~hastie/ElemStatLearn/
[3] Statinfer,非线性决策边界(2017),https://statin fer . com/203-6-5-The-Non-Linear-Decision-Boundary/
[4] R. Gall,机器学习可解释性 vs 可解释性:两个可以帮助恢复对 AI 信任的概念(2018),https://www . kdnugges . com/2018/12/Machine-Learning-explability-interpretatibility-AI . html
[5] UCLA,我如何解读 Logistic 回归中的优势比?(2020 年),https://stats . idre . UCLA . edu/stata/FAQ/how-do-I-interpret-odds-ratios-in-logistic-regression/
(本地二进制)模式的力量

图片由 Unsplash 上的 H Heyerlein 拍摄
实践教程
无监督贝叶斯推理(降低维度和挖掘特征)


基于边缘和纹理的聚类
你能说出这些图像之间的区别吗?简单对吗?我敢肯定,你们中熟悉经典机器学习方法的人可以很快找到一种分类算法来自动完成这一过程。
但是当我们没有任何标签的时候呢?希望对你们中的一些人来说,一些新奇的无监督聚类算法浮现在脑海中。但是,当我们在计算病理学或其他形式的复杂医学图像分析领域工作时,我们如何在 13 英寸的 MacBook Pro 上实现数百张 2GB 以上的图像呢(正如我目前正在尝试的)?
谢天谢地,有一大堆令人兴奋和有用的技术来帮助我们实现这一点!
在这个系列中,无监督贝叶斯推理(降低维度和挖掘特征),我们将探索一系列无监督贝叶斯统计模型,这些模型相当于三重威胁的机器学习:
降维
特征抽出
使聚集
不确定性量化
好吧,有四个,但是四重威胁听起来不太一样…
但是我们可以把前两者结合起来。
看,已经学会如何降维了!
所以,事不宜迟,让我们进入我们的第一篇文章 : 局部二元模式 (或者 LBP,为了节省我们的时间)令人难以置信的力量在于它能够区分纹理和地形的微小差异,识别关键特征,然后我们可以用这些特征区分相同类型的图像——不需要费力的标记。
在本文中,我们将涵盖 LBP 背后的关键概念;这个惊人简单的算法所具有的力量;以及我们可以从其实施中获得的许多巨大好处。
LBP 的目标是通过检测边缘、拐角、凸起或平坦区域以及硬线条来编码图像的几何特征;允许我们生成图像或图像组的特征向量表示。
通过对图像之间或给定未知类别的单个图像的共性进行编码,我们允许将它们的特征与另一个图像的特征进行比较。通过这种比较,我们可以确定我们的目标图像和看不见的图像之间的相似程度,并且可以计算所呈现的图像与目标图像具有相同种类或类型的概率。
虽然相当简单,当然也不是什么新东西(它最早是在 2002 年发明的),但这种无监督学习方法能够仅使用最少的数据来区分惊人相似的图像(具有显著的准确性)。作为一个额外的好处,这是在不需要训练模型的情况下实现的(无论如何在传统意义上)。简单地构建一个比较表示就足以使用这种技术。幸运的是,对于我们这些不太熟悉矢量化表示的人来说,这些表示可以用一种更加用户友好的方式显示:直方图。
为了解释为什么会这样,让我们更深入地研究 LBP 是如何工作的。
LBP 可以分为 4 个关键步骤:
简单化
二元化
概率密度函数计算
(上述功能的)比较
简化
在我们开始创建 LBP 之前,我们首先需要简化我们的图像。这是我们的数据预处理步骤。本质上,这是我们降维的第一步,它允许我们的算法纯粹关注亮度的局部差异,而不是担心任何其他潜在的特征。
因此,我们首先将我们的图像转换成单通道(通常是灰度)表示(见下文)。这创建了我们的“窗口”,我们可以为其创建 LBP 特征向量来表示图像。
对我们的每个目标图像(代表我们的类型或组的图像)以及我们的输入图像都这样做是很重要的。最棒的是,我们可以处理给定类型或组的单个代表性图像,允许我们以无监督的方式对小数据集的输入进行分类。
二元化
接下来,我们计算相对局部亮度变化。这允许我们基于亮度创建每个像素的局部、低维、二进制表示。
对于我们窗口中的每个像素,我们从其局部“邻域”中取出 k 个周围像素,并依次与中心像素进行比较,顺时针或逆时针移动。方向和起点无关紧要,只要我们坚持一个方向,依次对每个像素进行计算。对于每次比较,我们输出二进制值 0 或 1,这取决于中心像素的强度(标量值)是大于还是小于(分别)比较像素。这形成了一个 k 位的二进制值,然后可以转换成一个基数为 10 的数;为该给定像素形成新的强度。我们重复这一过程,直到每个像素都有一个新的像素强度,表示相对于其邻居的累积局部强度(其中强度值的范围从 0–2^k)。这给我们留下了原始图像的降维 LBP 表示。
在实践中,我们首先定义我们的 LBP 参数。这包括设置我们的单元格大小、半径和比较点数( k )。我们的单元格大小指的是任意的像素大小,我们可以用它来进一步分割我们的窗口。然后,可以在每个单元上独立地使用上述计算,而不是在整个窗口上。这允许更快和更有效地并行处理图像,并且还提供了使用重叠单元区域来拾取局部模式的可能性,如果我们使用整个窗口来计算 LBP,则局部模式可能会被过于严格地划分。作为标准,我们将单元格大小设置为 16x16 像素(任意)。
半径定义了当生成 LBP 表示时,对于图像中的每个中心像素,我们从其采样我们的比较像素的邻域的大小(即,它是每个比较像素将远离中心像素的像素数)。这准确地定义了我们所说的“本地”的含义。
最后,我们的 k 值指的是我们邻域内要采样的点的数量。通常,这是 8,从而为每个像素生成 8 位值;留下我们的最终像素强度值在 0 和 255 之间的范围(2^8).
幸运的是,Scikit-Image 有一个我们可以借用的简单方便的实现,它抽象了这些技术细节:
一旦我们为窗口中的每个细胞生成了 k 位 LBP 表示,我们就可以将它们组合起来形成我们的特征向量。
培训补充说明:
这里生成的二进制模式实际上有两种类型:均匀的和不均匀的。这些指的是二进制数在十进制转换之前产生的模式。
当我们说“一致”时,我们是说二进制数在整个模式中最多包含两个值变化(0-1 或 1-0)(例如,11001111、1111110、00011000 和 00111110 是一个字节数据的潜在示例)。相比较而言,(也许并不奇怪)其他一切都是不一致的。
但是我们究竟为什么要关心一个二进制数的变化次数呢?尤其是当我们只使用它来计算基数为 10 的恭维?
很高兴你问了。你看,这种二进制模式的美妙之处在于,它保留了每个像素的局部亮度,以这种方式,编码信息变得旋转不变。这意味着当我们计算我们的 LBP 时,不管图像的方向如何,我们将最终获得相同的 PDF(我们的 LBP 的特征向量表示)。
相比之下,任何不一致的模式都不能产生相同的 PDF,无论方向如何。因此,我们将冒着将相同的图像编码为不同输入的风险,通过使用这些不同的特征模式;可能会破坏我们模型的完整性。
PDF 计算
现在,回到手头的任务!
那么,我们如何将我们的 LBP 图像表示转换成更有用的东西(老实说,更容易理解)?
当然,我们把它们转换成特征向量!本质上,我们创建一个直方图。这是我们稍微偏离贝叶斯统计的部分,并从我们的常客表亲那里借用了一个老把戏。没错,你猜对了,我们要统计特征。我们以直方图的形式绘制这些结果,连接来自每个单元的 LBP 表示以创建窗口级特征向量表示。同样,在 Scikit-Image 表示法中,大部分都是从我们这里抽象出来的。

作者图片
现在我们有了低维的局部特征表示,我们可以选择将它们用作强大分类器的可轻松训练的输入,如支持向量机或极端学习模型(请关注关于这些的文章),或者我们可以探索这些特征向量,以发现表征我们图像的重要潜在几何特征。
或者,我们现在有能力进行无标签分类(或聚类),具有不确定性分类的额外好处。
比较
最后但同样重要的是,你们一直在等待的部分,是时候 Kullback-Leibler 散度:D(p,q)了。这意味着,分布 q(我们的样本分布)与样本 p(我们的目标分布)相差多少。贝叶斯统计模型的精髓。如果有一件事你需要知道,对于这个系列,对于任何未来学习贝叶斯统计建模,它是 KL 散度(从现在开始被称为 KLD)。
这种强大的贝叶斯算法允许我们比较两个概率密度或质量函数(或者本质上,任何一对分布),创建一个新的概率分布来解释它们之间的关系。这就告诉我们分布‘q’中的数据点有多大可能来自相同的基础分布‘p’。
然而,需要注意的是,KLD 是不可交换的(它并不能确定 p 是 q 的可能性有多大,只能确定 q 是 p 的可能性有多大)——即 D(p,q) ≠ D(q,p)。
我将继续发表一篇关于这个关键概念的更详细的文章,但是现在重要的是你要理解这个算法想要达到的目的。对于那些现在迫切需要更多具体细节的人,请参见下面的基本 Scikit-Image 实现:
所以…
正如你所看到的,LBP 允许我们生成图像的低维表示,强调局部地形特征。通过比较无标签图像的关键视觉特征,这些可用于对无标签图像进行分类,以确定每幅图像从同一群体中取样的概率。
这为我们提供了许多重要的好处:
我们可以创建图像的低维表示,这些图像可以用作更复杂模型的输入向量,现在将更容易分析这些模型(更低的输入复杂度意味着对模型复杂度和计算要求的需求降低)
我们现在有了一种计算简单的高维图像特征提取方法(潜在地减少了存储内存需求)
我们有一个非常精确的分类器,可以在几秒钟内创建和使用(计算效率高,内存需求最小)
我们有一个概率分类器,它为我们提供了真正的可能性,而不是严格强加的类别,并为我们提供了一种不确定性量化的方法
我们可以根据我们想要识别的目标的例子对看不见的图像进行分类,而不需要冗长乏味的标记工作
最后,如果这些术语中的任何一个对你来说看起来复杂或令人困惑,请不要惊慌。虽然旨在让机器学习和统计新手获得 LBPs 中正在发生的事情的“要点”,但我特意为那些想尝试概率建模和维度缩减技术的人提供了一些更复杂的细节。
我将很快发布一系列关于贝叶斯统计和更简单的机器学习方法的文章,在这些文章中,我们将更深入地了解本系列中提到的更基本的元素。如果您有任何问题,请随时联系我们。
为阅读干杯,下一篇文章再见。
参考
LBP 方法的所有功劳和它的使用的细节去下面详述的原始论文。LBP 代码实现的所有功劳归于 Scikit-Image
[1]t .奥贾拉和 m .皮蒂凯宁,1999 年。基于特征分布的无监督纹理分割。模式识别, 32 (3),第 477–486 页。
[2]茨韦塔纳·奥贾拉和茨韦塔纳·皮蒂凯宁和马恩帕,2002 年。基于局部二值模式的多分辨率灰度和旋转不变纹理分类。 IEEE 模式分析与机器智能汇刊, 24 (7),第 971–987 页。
数学独创性的力量
用于倾斜校正、文本倒置、旋转分类、单应性和应用数学的对象搜索的计算机视觉
“纯数学方法解决视觉问题的日子已经一去不复返了,现在人工智能已经开始涉足了”——这可能是深度学习实践者最容易误导的想法之一,他们忘记了传统的计算机视觉技术。如果你是其中之一,那么这里有一个让你重新思考的尝试。
许多“在边缘上运行”的计算机视觉算法使用传统数学,而不是计算和存储密集型神经网络。考虑一下,我们有包含文本内容的扫描图像。让我们把人工智能放在一边,解决扫描图像中的经典问题,即。倾斜、旋转和文本倒置,确定性。特征匹配&物体搜索也使用数学魔法,进一步激励你。

下面所有案例分析的源代码都可以在这里 找到。
文本倒置
从图像中识别倒置的文本字体是一项艰巨的任务。颠倒扫描文件时,可能会发生反转。即使在旋转或倾斜校正后,文件也可能会反转,因为 90+θ的旋转被检测为 90-θ,或-90-θ被检测为-90+θ。因此,文本倒置是一个常见的问题,但是很难识别。
让我们来看看如何用数学公式表示反演。
方法一:双峰
- 将像素投影到 y 轴上。每一行将导致一个峰值,事实上,由于英文字符的形状,有两个峰值。
2.与高斯滤波器卷积以平滑噪声。
3.计算峰(线)的分数,子峰在右侧。
下图说明了这种方法

蓝色:原装。橙色:平滑。线条:平滑投影的平均值。
如果文本是大写字母或其他语言,上述方法将不起作用,因为“双峰逻辑”可能会出错。
另一个解决问题的数值方法是利用字体形状,如“水填充技术”【1】,或者用数学方法表示字符形状,如下所示。我们可以使用形状上下文和对数直方图来数学描述任何形状。这些尝试证明了“数学独创性”是解决各种问题的有效方法。
方法 2:使用 Log-Bin 直方图形成上下文
a.使用 EAST 从图像中找到文本边界框。{下面}
b.边框内的裁剪图像和应用 Canny** 边缘检测。**

裁剪图像
c.以字母数字作为基本输入的虚拟图像。从步骤(b)中的基本输入和图像中找到每个字符周围的边界框。执行步骤{d}-{h}找出字符对之间的最佳对应关系。****

现在,把数字图像作为基本输入

裁剪图像上的字符边界框
d.从每个字符形状的边缘元素中随机抽取 N 个点。
e.构建一个新的形状描述符——形状上下文。一个点的形状上下文捕获了其他形状点相对位置的分布,因此总结了全局形状。****
****
对数极坐标系统中的形状上下文
f.使用皮尔森卡方检验或余弦距离比较对数极坐标直方图。

h.为基础图像中的每个边界框找到距离最小的数字。对每个包围盒的成本值求和,找出适马(φ)。****

将每个数字与基图像中每个数字的形状进行比较
I .反转来自步骤(b) 的裁剪图像,并进行步骤{d}-{h}以计算适马(φ’)。比较适马值以了解文本反转。****
如果适马(φ)<适马(φ’)
然后输入图像是直立的
否则输入图像被翻转

文本反转代码的输出
东(一种高效准确的场景文字检测器)
图像中的文本内容可以使用 EAST 算法进行本地化。

自然场景上的东方文字检测(礼貌)
同样,我们可以使用 math-hack 来定位图像中的文本,而不是使用基于人工智能的 EAST 算法。你可以找到像素的 y 投影的连续局部最小值,从而找到对应于图像中线分离的连续波谷。找到一行后,您可以从步骤(b)开始运行方法 2。
无论字体大小写或语言如何,上述方法都有效。****
歪斜校正
大多数扫描的文件是歪斜的。因此,在送入 OCR 或甚至显示之前,需要消除图像的倾斜。
方法 1:迭代投影
- 将图像从-10 度旋转到+10 度。
2.计算所有像素在 y 轴上的投影。
3.计算像素的入射密度。****
4.将旋转角度步进 0.5 度,并重复步骤 2、3
5.求像素入射密度最大的角度θ。
上述算法的缺点是:****
a.迭代计算增加了时间复杂度。****
b.由于步长大小,潜在误差为 0.5 度。
大多数情况下,扫描文件为表格格式或包含线条的表格数据或线条的点分布(由于扫描或打印质量不足,扫描图像中的线条可能不连续)。因此,问题归结为“给定一个点扩散作为输入,我们是否可以计算直线和θ?”
方法 2:霍夫变换峰值
- 读取倾斜的图像并进行谨慎的边缘检测
2.霍夫空间=调用霍夫变换(边缘检测图像)****
3.在霍夫空间变换(累加器矩阵)中寻找最大值
4.使用斜率的切线找到显著线的θ****

5.计算斜率的中间值,θ'****
6.将图像旋转θ’****
霍夫变换
- 直线可以用等式来表示,ρ= Xcos+Ysin,**
其中(X,Y)表示该点,(φ,ρ)表示法线距离原点的角度和距离。** - 如果我们认为(X,Y)为常数,那么 ρ依赖于
- 于是,我们会得到一条对应于点(X,Y)的(ρ,φ)平面上的正弦曲线。****
- 对应每个像素,在(ρ,c)平面画正弦曲线。
- 对应于代表直线边缘的像素的正弦曲线将在(ρ,φ)平面的特定点相交。****
- ****交点给出了常数(ρ,φ),使用该常数我们可以在(X,Y)平面上绘制实际的直线。这里 0<180 度< 180 度。
- 我们可以用同样的方法来检测高维特征。
- 对于圆,a、b、r 应该被参数化为霍夫空间,从而将复杂度增加到 3 维。

霍夫空间中的正弦曲线投票数组可以如下图所示。

投票阵列的霍夫空间可视化

从正弦曲线交点重建直线
去歪斜源代码:
去歪斜输出:

检测到斜角:-0.881403996582
请注意上图计算倾斜角度的准确性。在迭代方法中,角度θ的误差可能是【步长/2】,更不用说巨大的迭代计算成本了。****

去偏斜流水线的功能工作流程
****注意:如果扫描的文档不包含您的情况下的线条点扩散,那么运行上述峰值算法来查找文本周围的边界框。包围盒的水平边缘的角度θ对应于偏斜度。
旋转分类
旋转是扫描图像中的常见问题。扫描时,文档可以旋转 90°或更多。
可以使用如下 CNN 模型将图像分为 4 个象限。但是为什么要加载神经网络,当你可以用算术方法解决它的时候?此外,即使在象限旋转之后,图像也可能保持倾斜。

四象限分类的 CNN 模型
可以用上面的歪斜校正代码求θ,旋转。唯一的缺点是,90+θ的旋转可能被检测为 90-θ,而-90-θ可能被检测为-90+θ。因此,一旦旋转,图像就会翻转!
****原因:如果旋转 90-θ而不是 90+θ,那么
(90-Θ) + (90+Θ) = 180°
****解决方案:要解决上述问题,只要把去歪斜的图像传递给文本反转码,如果认为有必要,就把它翻转过来。
单应
比方说你想在一个包含多个对象的更大的图像中找到一个对象(模板)。我们可以使用带有注释的查询图像的对象检测模型,如 SSD 或 YOLO,来训练要找到的不同类别的对象。但是,我们如何使用简单的数学在更大的图像中找到并定位一个对象呢?****
我们可以使用单应来寻找点对应,并将坐标从一个角度转换到另一个角度。单应性是一种变换(3×3 矩阵),它将一幅图像中的点映射到另一幅图像中的相应点。
这些是你可以遵循的步骤。
- 首先,打开模板图像和要匹配的图像。
- 从两幅输入图像中查找所有特征。
- 创建一个 ORB 关键点检测器,它比 SIFT 和 SURF 计算量小。
- 使用 orb 检测器找到关键点及其描述符。
- 创建描述符的匹配,然后根据距离对它们进行排序。
- 用 cv2.drawMatchesKnn 画出所有 k 个最佳匹配。
- 从两幅图像中提取匹配的关键点。
- 求单应矩阵,做透视变换
源代码:
匹配输出:

找出匹配点对应关系

透视变换后的对象定位(黑色矩形)

在我的书桌上发现了一本书的要点对应
对象搜索
比方说,你需要从一组图像中找到一个物体。你可以使用人工智能模型,因为它是图像分类的经典案例。但是,我们能用传统数学来做这个吗?以下是如何…
- 读取要搜索的对象的图像(查询图像)
- 进行 Canny 边缘检测,并找到轮廓周围的包围盒。
- ****随机抽取“n”个随机点来描述图像内部的形状。
- ****迭代,获取输入文件夹中的所有图片。
- 对每张图片执行步骤 2 和 3。
- ****计算“查询图像”的随机形状点与文件夹中每个图像的形状点的相关值。
- 找到具有最小相关值的图像。此图像包含您正在搜索的对象的最接近匹配。****

相关方程:u 和 v 是要比较的向量
上述等式从概念上将相关性表示为平均值附近偏差的相似性。因此,分子表示分布相似性,分母量化 L2 范数以进行归一化。
输入图像和查询对象

不同物体的图像作为输入

查询图片:小型化分段车

输出:输入图像与查询图像的匹配值比较
请注意,具有相似形状的不同汽车(紫色)具有第二接近的匹配值,就在红色汽车之后。与其他形状的相关距离明显更大。因此,你可以看到形状匹配是有效的。
请注意相关值不会为 0,即使是相同的图像,因为随机采样点是为了描述形状。有其他方法来描述形状而不需要随机采样但是形状匹配的时间复杂度会变得更高。其中一种称为转向功能的方法描述如下。

左转时增加,右转时减少。边长=曲线长度。

求最小 Lp 范数来度量旋转不变曲线的相似性
以上所有案例分析的源代码都可以在 这里 找到。
结论
从上面的案例研究中,你可以看到确定性解决方案比迭代或基于人工智能的解决方案更精确,计算量更小。虽然人工智能可以在许多复杂的任务中表现出色,但谨慎的做法是尝试基于数学的解决方案,并将人工智能作为最后手段。你不需要大锤来敲碎坚果。如果上面的阅读激发了你去欣赏传统技术的美,那么它就达到了目的。

参考文献
[1]文本文档图像中的反转检测。 Hamid Pilevar,A. G. Ramakrishnan,电气工程系医学智能和语言工程实验室,印度科学研究所,Bangalore (JCIS,2006 年)****
[2]形状上下文:一种新的用于形状匹配和物体识别的描述符。塞尔日·贝隆吉、吉滕德拉·马利克和扬·普济查。加州大学伯克利分校电气工程和计算机科学系(NIPS 2000)
【3】****利用形状上下文进行形状匹配和物体识别。塞尔日·贝隆吉、吉坦德拉·马利克和扬·普济查。加州大学柏克莱分校计算机科学系(PAMI 2002 年)****
[5]https://stack overflow . com/questions/55654142/detect-if-a-text-image-is-upsided
https://github.com/argman/EAST
离线强化学习的力量:第一部分
可能扩展到现实世界问题的 RL 算法

线上 RL 的局限性
强化学习在过去几年中发展迅速,从只能解决简单玩具问题的表格方法到处理难以置信的复杂问题的强大算法,如下围棋、学习机器人操纵技能或控制自动驾驶汽车。不幸的是,RL 在现实世界应用中的采用有些缓慢,虽然当前的 RL 方法已经证明了它们能够找到高性能策略来解决高维原始观察(如图像)的挑战性问题,但实际使用它们通常很困难或不切实际。这与监督学习方法形成了鲜明的对比,监督学习方法在工业和研究的许多领域非常普遍,并获得了巨大的成功。这是为什么呢?
大多数 RL 研究论文和实现都面向在线学习设置,其中代理与环境交互并收集数据,使用其当前策略和一些探索方案来探索状态-动作空间并找到更高回报的区域。这通常以下列方式说明:

原创艺术
这种在线 RL 算法与环境交互,并立即或通过一些重放缓冲器使用收集的经验来更新策略。重要的是,数据是直接在环境中收集的,并且只有这些数据用于学习,学习和收集是交替进行的。
这带来了几个困难:
-代理必须收集足够的数据来学习每项技能/任务,这对机器人或自动驾驶汽车等系统来说可能过于昂贵。
-代理使用部分训练过的策略与环境进行交互,这可能会采取潜在的不安全行为,例如给患者服用错误的药物。
-使用训练环境为每个任务收集专门数据的需求通常会导致非常狭窄的状态分布,这可能会导致策略易受轻微变化的影响,从而使其不值得部署。
当将 RL 应用于现实世界的问题时,这些并不是人们可能面临的唯一困难,但是它们可能是决定不在您的任务中使用 RL 的主要因素。简单地浏览一下当前的 RL 研究论文就足够了,即使是相对简单的模拟任务也经常需要数百万个交互步骤来学习一个好的策略,那么在真实的机器人上尝试这一点并为每个新任务收集如此大量的数据会有多实际呢?
有趣的是,这些问题在监督学习中并不常见。当训练图像分类器或对象检测网络时,从业者通常可以在不同的现实世界设置中访问大量标记数据的数据集。这就是为什么许多这样的监督学习模型有时甚至在与训练期间遇到的图像非常不同的输入图像上也能惊人地推广,并且通常可以针对具有非常少的标记任务数据的新任务进行微调。在 NLP 社区中可以看到类似的事情,在那里,在巨大的数据集上预处理的大型模型对于学习新任务非常有帮助,使得该过程变得可行,并且在标记的任务数据方面只有适度的要求。

那么,为什么不在学习政策时也这样做呢?假设我们想从图像中学习一些机器人技能,我们不能只使用在 ImageNet 上预先训练的模型吗?事实证明,这与我们在监督学习中习惯的好处不太一样,因为这样的模型没有给我们任何关于我们应该做什么的线索,因为它没有经过任何任务的训练。还有什么办法可以缓解这个问题,让 RL 更适用于现实问题?
非政策 RL 和分配转移
2018 年发表了一篇令人印象深刻的论文,名为“ QT-Opt:基于视觉的机器人操纵的可扩展深度强化学习”。在这篇论文中,作者(谷歌…)使用几个机器人同时收集数据,并训练了一个抓取垃圾箱中物体的策略。他们连续进行了几个月的实验,并在此过程中进行了 58 万次抓取尝试,产生了一个最先进的抓取策略。在其核心,他们的方法是基于 Q 学习,这是一种基于动态规划的 RL 方法。我们在 RL 中的目标是找到最大化期望值的策略:

对于给定的状态,策略的价值函数告诉我们,通过遵循来自该状态的策略,我们可以期望得到的折扣奖励的总和是多少,并且 RL 的目标是找到在所有状态上期望值最大的策略。我们还可以描述 Q 值,这是我们希望通过采取特定行动,然后从现在开始遵循该政策而获得的值:

在 Q 学习中,我们试图通过最小化贝尔曼误差来找到最优 Q 函数(或最优策略的 Q 函数):

对于所有状态动作,贝尔曼误差为零的 Q 函数保证是最优的,并且我们可以通过在每个状态采取具有最高 Q 值的动作来提取最优策略:

当然,对于实际问题,Q 函数是由一些深度神经网络来近似的,并且需要对基本的 Q 学习方法进行一些修改,以使其以这种方式工作。QT-Opt 论文使用了这种基于 Q-learning 的方法,并获得了非常令人印象深刻的结果(这需要 Google scale 资源),但他们在论文中进行了另一个有趣的实验;他们收集了训练期间收集的所有数据,并试图仅使用这些数据从头开始训练一个新的 Q 函数,而不与机器人进行任何进一步的交互。
原则上,这应该是可行的。如果我们看上面的数学,我们可以看到 Q-learning 算法实际上不知道数据的来源,这意味着我们可以将其应用于通过任何其他策略或程序收集的数据,特别是我们应该能够在记录的训练数据上使用它。这种特性被称为非策略学习,这也是 Q-learning 是一种高效学习方法的主要原因之一,因为它可以重用来自任意来源的数据。然而,令人惊讶的是,作者观察到原始策略(在它收集的相同数据上训练,因为它正在收集它)和使用静态数据训练的策略之间存在显著的性能差距,并且从静态数据中学习产生了更差的性能。这种从静态数据中学习策略或 Q 函数而不与环境进一步交互的过程称为离线 RL (有时称为批量 RL),与我们直接从环境中收集新数据的在线 RL 设置相反。

原创艺术
上图是离线 RL 的样子;数据由某个或某些来源(策略、脚本、人员等)收集。)并保存在某个缓冲区中,策略仅使用该数据进行离线训练,然后在完全训练后部署到现实世界中。
如果收集的数据足够好,可以成功地学习第一个策略,为什么离线训练时效果不好?让我们再次检查 Q 学习算法的贝尔曼误差:

在实践中实施时,我们会这样做:

对于以下形式的转换,我们试图最小化贝尔曼误差:

其包含状态、从该状态采取的动作、通过采取该动作获得的奖励以及在采取该动作后观察到的状态。计算贝尔曼误差的目标值时:

我们采用我们的 Q 函数认为通过采取行动a’可以得到的最佳 Q 值,并使用它来校正我们对状态 s 的 Q 值的当前估计。这被称为自举,是 Q-learning 的一个重要方面。由于我们的 Q 函数不是最优的(特别是在训练的早期阶段),这个目标值有时肯定是错误的,并且会导致我们将误差传播到对 s 的 Q 值的估计。由于这个原因,在线 RL 来救援,并且由于 Q 函数估计中的错误将导致政策采取错误的行动,它将直接体验采取这些行动的结果,并且最终能够纠正其错误。然而,在离线情况下,这种情况会发生,因为策略不与环境交互,也不收集更多数据,因此无法知道它正在传播错误的值并纠正它们。
更糟糕的是,使用 max 运算符会导致对具有最高数值的 Q 值进行几乎对立的搜索,这通常是非常错误的。在许多情况下,这可能导致预测的 Q 值偏离,训练完全失败。在这种情况下,我们的 Q 函数认为它可以获得极高的回报,而事实上,它不能。从形式上来说,这个问题的出现是因为在收集数据的策略和我们现在学习的策略之间存在分布转移,并且当我们在s’上评估我们的 Q 函数并寻找具有最高分数的动作时,我们正在对我们的模型查询它从未见过的状态动作,并且可能是完全错误的。
那么如何才能缓解这个问题,在线下的设定下学好呢?一种方法是通过诸如 KL-divergence 之类的发散度量来约束策略,使得它保持接近数据收集策略。这将阻止 Q 函数传播高度乐观的分布外 Q 值,但可能会阻止它学习比数据收集策略更好的策略。如果数据收集策略不是很好,这可能是一个主要问题,因为离线 RL 的一个主要诉求是改善我们以前拥有的东西,否则我们可以只使用行为克隆并完成它。一个更微妙的约束是强制策略选择与数据集中出现的动作接近的动作,同时允许策略偏离数据收集策略。乍一看,这似乎毫无意义,如果强制使用数据集中相同的操作,策略又怎么会不同呢?下图说明了这一点:

原创艺术
在上图中,右图描绘了我们的数据中存在的两条轨迹,一条从 A 到达 B,另一条从 B 到达 C。我们希望学习从 A 到达 C,但该轨迹实际上并未出现在数据集中。幸运的是,轨迹之间有一些重叠,这允许仅使用数据集中的动作来学习从 A 到 C 的轨迹。这是动态编程 RL 的主要优势之一,它可以将部分轨迹缝合在一起,并学习比数据中呈现的更好的策略。然而,需要注意的是,在大型状态和动作空间中以现实的方式实施这样的约束(仅使用来自数据集的动作)需要我们以某种方式对数据收集策略建模,这通常需要首先用一些神经网络对其进行近似,然后在离线 RL 期间使用它。这种近似的数据收集策略是错误的潜在来源,一些研究论文证明了行为建模的改进提高了这种离线 RL 方法的性能。
这实际上是一个比从文献中乍一看更具挑战性的问题。我们在离线 RL 中的希望是使用从多个来源随时间积累的大量先前经验的数据集,这可能包括像脚本化的政策和人类示威者这样的事情,它们可能以非马尔可夫方式表现,使得对它们的行为建模非常困难。理想情况下,我们希望我们的 RL 算法不需要这样的行为模型,并且简单和可扩展。
保守的 Q 学习
最近,Berkeley 的研究人员发表了论文“保守 Q-Learning for Offline Reinforcement Learning”,其中他们开发了一种新的离线 RL 算法,称为保守 Q learning (CQL),它看起来表现非常好,同时相对简单,并保持了一些不错的属性。正如我们之前所看到的,当对离线数据执行天真的 Q 学习或 actor critic 算法时,我们在最小化贝尔曼误差时传播高度乐观的 Q 值,并且贝尔曼误差中的 max 算子找出这些误差。CQL 通过对目标函数的简单添加解决了这个问题。
在标准 Q-learning 中,我们的损失是:

作者建议增加以下内容:

通过积极地尝试最小化我们的政策认为很高的国家行为的 Q 值,我们逐渐地迫使所有那些乐观的错误,并迫使 Q 值不大于它们实际应该的值。作者证明,通过适当选择α,得到的 Q 函数可以由“真实的”Q 值(未知的)限定,因此是这些值的保守估计。他们从经验上证明确实如此,并且预测的 Q 值低于通过部署学习的策略获得的 Q 值。事实上,得到的 Q 值有点过于保守,作者提出了损失函数的另一个补充:

这种添加试图最大化数据集中出现的状态动作的 Q 值,鼓励策略坚持更熟悉的动作,并使 Q 值不那么保守。作者证明了期望的结果 Q 值是由“真实的”Q 函数上界的,并证明了这种变体产生更好的结果和更精确的 Q 值。他们在广泛的离线 RL 基准上测试了他们的方法,并表明它优于现有的方法。
这种方法的好处在于它相对简单,解决了核心问题,并且以一种直观的方式运作。它还具有不需要数据收集策略模型的优点,这消除了潜在的错误来源,并从过程中移除了冗余的机器和模型。
使用先前数据集的归纳技能
我们已经看到,使用庞大的离线数据集来学习在现实世界中通用的强有力的政策有很大的潜力,离线 RL 算法的改进正在使这一愿景更接近现实,但有一件事一直困扰着我。我看到的大多数研究论文似乎都假设我们想要学习执行某个任务 X,并且我们有一个大型的离线数据集,该数据集标注了针对该任务 X 的适当奖励。这似乎不现实,因为使用离线 RL 的整个前提是能够利用随着时间的推移从不同来源收集的大型数据集,事后来看,假设我们能够用针对我们任务的奖励来标注这样的数据集是可疑的。人们怎么可能用图像来注释机器人开门的数据集,以奖励抓取物体呢?
CQL 论文作者的一篇名为“ COG:用离线强化学习将新技能与过去的经验联系起来的新论文解决了这个问题,并证明了未标记的离线数据可以用于增强和概括我们任务的较小的注释数据。作者使用了一个机器人的例子,这个机器人被训练来抓取放在一个打开的抽屉里的物体,使用的数据是通过一些脚本化的策略收集的(任务数据)。除此之外,还存在机器人与环境交互的更大数据集,用于其他任务,例如打开和关闭抽屉、拾取和放置物体等(先验数据)。使用一些离线 RL 算法(如 CQL)在任务数据上训练我们的策略将在任务上产生良好的性能,并且机器人将很可能能够以高概率从打开的抽屉中抓取对象。然而,如果我们以某种方式显著地改变初始状态,例如关闭抽屉,那么期望我们的策略现在成功是不现实的,因为任务数据不包含这样的信息。
作者提出了一个简单的解决方案;用稀疏二进制奖励(完成任务+1,否则为 0)注释任务数据,用 0 奖励注释所有先前的数据。然后,将数据集合并,并使用 CQL 对结果大数据集进行训练。正如我们之前看到的,使用动态编程的离线 RL 算法具有看似神奇的能力,可以将部分轨迹缝合在一起,并学习比其部分总和更大的东西。作者证明,CQL 能够将 Q 值从最终目标到达状态一直传播到初始条件(抽屉打开,物体放在里面),并进一步传播到抽屉关闭的状态,从而学习将任务概括为新的看不见的初始条件,这在为我们的任务收集数据时从未遇到过。
在我看来,这是一个强有力的证明,当提供了先前的未标记数据时,一个简单而优雅的算法可以做什么。我希望在未来,我们将看到更好的方法被开发出来,大量的数据集被收集起来,这将使 RL 在工业和研究中被广泛采用,释放它的全部潜力。
对于感兴趣的读者,我强烈建议阅读谢尔盖·莱文(伯克利研究小组负责人)关于离线 RL 的媒体文章。
Pickletools 的力量
处理大型 ML 模型 pickle 文件
数据量正在增加。数据越多,我们就越能利用它来解决不同的问题。假设您为某个解决方案训练了一个机器学习模型,并希望保存它以供以后预测。下面来介绍一些序列化-反序列化的方法:Pickle(Pickle,cPickle,Joblib,JsonPickle,Dill,Mlflow),保存为 PMML 格式为管道(sklearn2pmml),保存为 JSON 格式(sklearn _ json,sklearn _ export,msgpack,JsonPickle)。
您还可以使用 m2cgen 库将您的模型导出到 python/java/c++代码,或者编写您自己的代码来序列化和反序列化您的模型。
当你建立一个机器学习模型,通过使用大量数据来解决一些问题时,这个模型也将是巨大的!因此,当您试图将这种巨大的编码保存到您的系统时,问题就出现了(我在这里将讨论我试图处理的大型 RandomForestClassifier 模型/pickle 文件)。
解决方案 1:
更多的数据意味着大尺寸的模型。尽量减少你的数据,又不丢失数据中你有价值的信息。去除重复或近似重复、分层欠采样可以在这里拯救你。
解决方案 2:
尝试通过调整模型参数来缩小模型尺寸,而不影响精度。在这种情况下,超参数调整将对您有所帮助。我的基本型号 RandomForestClassifier 有很大的 60 GB,但是超参数调优设法把它降到了 8 GB。还是大号?让我们看看下一种疗法。
解决方案 3:
现在,您已经尽一切努力使您的模型更轻,而没有牺牲太多的预测能力,并且仍然获得 8 GB 的 pickle 文件。哦,亲爱的,生活太不公平了。
坚持住,还有一些希望。Pickletools 前来救援!
该库帮助您减小 pickle 文件的大小,并使 pickle 文件作为 RF 对象的加载变得更加容易和快速。
虽然 Joblib 和使用压缩方法如 zlib、gzip 使我的 pickle 文件缩小到 1 GB,但是将该文件作为随机森林分类器对象加载回来是一件令人头痛的事情。加载我的 pickle (1 GB 大小)和反序列化 RF 对象需要 16 GB 以上的 RAM,这将导致 MemoryError。
使用 Pickletools 解决了缩小 pickle 文件大小和更快加载 pickle 文件的问题,而不会占用超过系统处理能力的内存,如下所示。
要序列化:
clf.fit(X_train, y_train) #your classifier/regressor modelimport gzip, pickle, pickletoolsfilepath = "random_forest.pkl"
with gzip.open(filepath, "wb") as f:
pickled = pickle.dumps(clf)
optimized_pickle = pickletools.optimize(pickled)
f.write(optimized_pickle)
要反序列化/加载回:
with gzip.open(filepath, 'rb') as f:
p = pickle.Unpickler(f)
clf = p.load()
呜哇!!虽然 gzip 有助于减小 pickle 的大小(到 1 GB),但 pickletools 有助于 pickle 文件加载更快,而不会消耗太多内存(这次占用了 7 GB RAM)
为此,您还可以设置 pickle 属性 fast = True,但将来可能会被弃用,因为文档中是这么说的:
import picklefilepath = "random_forest.pkl"with open(filepath, 'wb') as f:
p = pickle.Pickler(f)
p.fast = True
p.dump(clf)with open(filepath, 'rb') as f:
p = pickle.Unpickler(f)
clf = p.load()
额外解决方案:
如果您可以通过让 CPU 的每个核心同时工作来以任何方式并行化整个过程,那么在某种程度上,它也可以拯救您!
好了,该你自己试试了。愿原力与你同在!
延伸阅读及参考文献:
- 【https://docs.python.org/3/library/pickle.html#pickle. Pickler.fast
- https://docs . python . org/3/library/pickle tools . html # pickle tools . optimize
- https://wiki.python.org/moin/ParallelProcessing
- https://stack overflow . com/questions/23916413/celery-parallel-distributed-task with multi-processing
- https://docs.python.org/3/library/multiprocessing.html
质量保证的力量——为 SQL 数据分析管道设计强大的质量保证流程
如何构建完整的质量保证程序来保护您的分析管道
“一毫克的预防抵得上一公斤的治疗”——约翰·罗伯特·科伦坡
错误时有发生。虫子似乎可以从任何地方出现。数据源可能会在一瞬间动摇,使您的整个分析管道失效。作为一个分析团队,最终解决这些问题并确保您的报告、交付成果和见解尽可能准确是您的责任。设计一个强大的质量保证(QA)流程对于巩固团队对产品的信心至关重要。
本文将概述设计一个健壮的 QA 过程以节省时间、金钱和资源的一些关键步骤;这将确保你通过分析产生最积极的影响。
为什么质量保证很重要?
有太多的理由说明为什么一个健壮的 QA 过程对你的企业和团队是无价的。以下是一个完整的质量保证过程的一些最有意义的结果:
- 确认业务决策是利用尽可能好的洞察力做出的
- 提高产出效率,减少重复工作
- 提高对数据问题的反应能力
- 维护利益相关者的信任和客户关系
- 提高分析师对输出的信心,允许更快的工作方式
基于虚假数据的商业决策对所有相关方来说都是昂贵的。这可能意味着工作重复,绩效下降,金钱损失,或者更重要的是,对你产出的信心受到打击。对你和你的团队所提供的见解和建议的信心,对于获得利益相关者的信任,以及对你的工作产生更大的影响是至关重要的。你不希望一个小错误影响你和你的团队未来的表现。大多数大型公司可以将整个团队投入到 QA 流程中,但是在无法访问此类资源的中小型公司中,分析团队作为一个集体,有责任确保构建适当的基础架构,以减少交付物中任何不必要的错误。强大的 QA 流程在预防任何此类问题方面提供了切实、可靠的价值,从而实现高效、有效的数据驱动型决策。
有效的质量保证方法
QA 不仅仅是检查你的代码。具有许多移动部件、不断变化的容量和第三方数据源的管道可能难以管理。形成一个考虑到任何直接挑战并考虑到未来错误情景的全面而稳健的 QA 流程,需要从多个角度解决这个问题:
- SQL 可读性和翻译
- 单元和集成测试
- 在管道的所有阶段监控数据流
- 减少依赖性
- 同行评审和优化
本文将概述每个阶段如此重要的原因,建议保持高性能的最佳实践,并确保您的时间花在提供尽可能多的价值上。
SQL 可读性和翻译
通常,我们的绝对代码效率是我们的编码决策的最前沿。在复杂的查询中操作大量数据确实需要勤奋的思考,以节省处理资源的时间和金钱。但是,通常有机会在绝对性能和可读性之间进行权衡,以改进查询的计算方式。
使用一个简单的 SQL 示例,假设我们想要列出我的记录集合中所有的 vintage 记录的名称。我们可以使用以下查询来解决这个问题:
SELECT t_my.record_name
FROM my_records t_my
INNER JOIN vintage_records t_vin
ON t_my.record_id = t_vin.record_id;
如果我拥有一个非常大的、完全不可能的数十亿条记录的集合,这可能接近最佳解决方案,而不是使用计算量更大的子查询。然而,如果我不得不把它交给一个朋友来运行同样的查询,它没有我们通过其他方式可能达到的一目了然的可读性。考虑新分析师在运行查询之前需要解决的问题:
- 查询的目的是什么?
- vintage_records 的内容有哪些?
- 内部联接是否导致了任何重复?
- record_id 是主键吗?
在这些情况下,增加这个查询的运行时间几毫秒,以换取一些更可转移、更可读的代码,这是一个非常值得的权衡。通过使用子查询重写并添加简单的注释,我们以非常相似的性能获得了更加清晰的结果:
--Returns ALL record names from my collection that are vintageWITH vintage_record_ids AS (SELECT DISTINCT record_id FROM vintage_record)SELECT record_name
FROM my_records
WHERE record_id IN vintage_record_ids;
相同的结果,相似的性能和更好的可读性。注意:
- 目的明确,便于快速解释
- 使用 WITH 语句允许自上而下的可读性
- 清除概述其内容的子查询表的名称
- 消除了联接的需要,从而简化了代码
良好的可读性最佳实践包括注释掉查询的目的、利用 WITH 语句(cte)、大写函数、保持查询简短并具有清晰的处理逻辑。由于我们的更改,我们现在已经清楚了查询的许多细微差别。我们现在知道了它的用途,并且我们正在返回我的记录集合中的所有结果(不仅仅是唯一的结果)。由于有了子查询,我们可以更快地解释代码,而不必担心任何错误的连接逻辑。更慢但更干净的代码在这里绝对是赢家。
虽然看起来它在这样一个简单的查询上节省了很少的时间,但每次运行它时,它所获得的实际值都将继续得到回报。当您的 SQL 基础设施包含复杂的、数千行的脚本,并且这些脚本都相互集成时,以清晰的方式编写代码的回报将呈指数级增长。更不用说在较小的团队中经常被忽略的因素——当这些脚本的主要分析师休假或请病假时会发生什么?另一个分析师能有效接剧本吗?分析师对提高业务运营的效率有很大的贡献,因此将这一点应用到他们自己的过程和实践中也是至关重要的,以产生可读和可转移的代码的形式。
单元和集成测试
测试和重新测试任何生产脚本是最大的不可协商性。我们必须在隔离的片段中测试代码(单元测试),并且测试这些隔离的片段在一起工作得有多好(集成测试)。例如,测试是否正确创建了临时表,然后确保任何使用临时表的查询都能正确地与它交互。
SQL 简单得令人难以置信,学会预测重复并习惯于诊断错误连接可以为您的日常分析带来更多安宁。注释掉代码以评估每个查询是否产生了预期的结果(单元测试),并确保它们不会破坏您的任何其他依赖查询(集成测试),这本身就是一项值得开发的技能。至少,您应该包括回答以下问题的单元测试查询和注释:
- 我的连接前后的计数是预期的吗?
- 我的任何主键被复制了吗?
- 我的联接字段格式相同吗?
- 我的 CASE WHEN 语句是否按预期工作?
- 这个结果有逻辑意义吗?
下一步是确保这些单独的查询与脚本中的任何其他查询协调工作。检查一段代码是否正常工作,但是未能测试该查询如何适应更大的数据管道会产生不必要的、容易避免的漏洞。
花点时间并记录你的思考过程——这将通过防止错误并确保错误被快速识别和解决而获得巨大回报。以清晰简洁的方式给出尽可能多的细节。如果结果是正确的,但与直觉相反——在评论中解释它!这里的目标是使您的输出可重复,并允许其他人轻松验证结果。在 SQL 脚本编写过程中概述上述内容将很快成为您的第二天性,您将对反复出现的错误形成自己的直觉。除了在我们的工作中建立更多的信心,我们也让我们的同行能够拿起剧本,理解其目的,并以最少的麻烦评估其功效。
监控您的数据流
令人难以置信的是,对数据接收的许多看似无关紧要的更改会影响您的数据管道。这里有一些例子:
- 由于贩运问题而出现的空值
- 日期格式、内部 id、国家代码在供应商之间变化
- 由于 API 故障而出现的重复
- 手工输入的数据填写不正确
这些问题中的任何一个都可能以看似模糊的方式影响多个查询,从导致连接失败、中断 NOT IN 语句到弄乱 WHERE 子句。如果在每个处理阶段都没有清晰的数据可见性,这些问题往往会被忽视,最终导致头痛。问题出现的时间越长,后果就越严重——尽早发现这些问题是顺利运营的关键。
清晰的数据可视化是解决这个问题的关键。一种简单的方法是创建一个管道监控表,在数据处理的每个阶段插入关键指标的计数,并在 BI 工具中可视化输出:
INSERT INTO qa_pipeline
(SELECT table_name
,CURRENT_TIMESTAMP() as run_timestamp
,count(*) as row_count
,COUNT(primary_key) as primary_key_count
,COUNT(distinct_primary_key) as distinct_primary_key_count
,COUNT(*) FILTER (WHERE important_field > '') as important_field_population
,SUM(important_kpi) as important_kpi_sum
FROM raw_table)
这是一个非常有用的,通用的格式,我们希望如何跟踪我们的数据。创建表的可视化,如 qa_pipeline ,并跟踪重要值,如行数、字段填充、KPI 总和以及查询之间的主键交互,可以实现快速调试。例如,在原始表中,主键总是唯一的。在您创建新表并加入额外信息的清理脚本中,如果我们现在看到主键计数增加,我们知道清理脚本导致了一些重复。相反,如果我们看到不同的主键计数减少,我们知道有些已经被过滤掉了:

2020 年 1 月 1 日完整数据管道的可视化示例(Qliksense)
上图展示了这些 qa_pipeline 表格的威力。显而易见,最终表格中的每个指标都加倍了,这表明脚本中产生 final_output 的逻辑有错误,这导致了重复。通过简单地观察每个脚本或查询的真实输出,可以发现许多问题。如果我们看到 important_kpi_sum,显著下降,这将表明在使用 important_kpi 时出现了错误,或者在聚合逻辑中出现了错误——这是应该审查代码的明显迹象。虽然对许多分析团队来说,定期手动检查整个输出可能需要太多的资源,但是每天早上快速检查这些汇总可视化将导致更主动的解决方案来诊断不正确的 SQL 脚本。
同一个表的另一个用例是确保您的数据被正确接收— 原始数据的质量将反映您的输出质量。使用 qa_pipeline 表格可视化查看您的摄取表格指标,可以轻松监控您的数据是否符合预期格式。可以轻松快速地识别异常结果,如低行数、缺失天数和大量缺失字段:

一月第一周 raw_table 人口的可视化示例(Qliksense)
快速浏览一下,我们可以看到我们的 raw_table 存在一些摄取问题。在 1 月 3 日运行该脚本时,我们看到的行数是我们看到的不同主键的三倍,这表明数据可能被摄取了三次。此外,在 1 月 5 日,我们可以看到我们的 important_field 没有完全填充,这暗示了一些跟踪问题。只需看几秒钟的图像,我们就可以清楚地评估数据的质量并突出任何问题,进一步提高我们对问题做出反应并有效解决问题的能力。
在展示这些计数时发挥你的创造力,以适应你的业务用例。你的直觉在这里是一个有价值的资源——学会预测你的代码将如何影响你的数据,并将其与这些 qa_pipeline 表提供的可视化进行一致的比较。在接收时、数据清理期间和生成可交付结果之后设置这些 INSERT INTO 查询,可以让您对脚本的执行情况有一个端到端的清晰了解,从而节省调试和防止任何错误的宝贵资源。
减少依赖性
一个有能力的分析师可以解决任何问题。理论上,如果数据质量保持不变,所有代码都应该运行良好。然而,当管理来自不同来源的多个数据流的摄取时,这种数据质量从来没有得到保证。保持高质量数据的最简单方法可能是自己控制它,当问题出现时,允许完全的自主性和更大的反应能力。下次您接收第三方数据时,请考虑以下几点:
- 如果我们发现了一个错误,那么源头能多快解决它?
- 我可以通过在内部生成这些数据来获得自主权吗?
- 是否有任何手动流程可以自动化以减少人为错误?
- 我们如何利用这些资源来减少对它们的依赖?
考虑这个场景:
“一个国际第三方正在以每日 excel 报告的形式提供时间序列数据。由于他们所在地区的夏令时,他们提供的时间戳都晚了一个小时,这意味着您在提供的报告中少了一个小时的数据。他们处于完全不同的时区,直到早上才能纠正问题,而客户要求在当天结束前提交一份重要报告。”
这可不是什么好玩的地方。你可以强有力地证明第三方甚至不是同谋,因为这个过程由于许多原因存在固有的缺陷。然而,如果我们对他们提供的数据有自主权,例如通过直接查询他们的 API 我们可以简单地再打一个电话,在几分钟内纠正时间框架。不再错过最后期限,不再有不满意的客户。
事实上,第三方可能没有您可能已经习惯的相同资源、基础架构、实践或方法。这种差异可能会导致摄取、处理或呈现中的错误,如果您出于任何原因需要请第三方重新格式化或再现数据,修复这些错误的速度可能会很慢。尽可能保持对数据的自主权,使您能够更快地应对变化,更快地找到解决方案,并将生产优化到您可以控制的水平。
同行评审和优化
在我的分析师生涯中,帮助我的一个关键因素是我向他人学习的能力。我真的很喜欢学习为什么人们在他们所做的事情上成功,以及他们所拥有的特质,我可以把这些运用到我自己的生活和事业中。来自他人的一致的、建设性的反馈确实可以加速你的学习,并激励你做得更好,在分析环境中,同行评审对此至关重要。让同事审查您的代码有很多好处:
- 为您的数据输出增添更多信心
- 创造学习新技术的机会
- 在团队和同事之间分享知识
- 提供另一个思考角度,引发对方法的讨论,并促进更具创新性的解决方案
一双新鲜的眼睛对改进你的代码有着不可思议的影响。让某人处理相同的问题,思考相同的过程并得出相同的结论,对于在过去两个小时内一直盯着同一个多重连接,无法确定它是否正常工作的人来说是非常有益的。我不记得有多少次我带着一个困扰我的 bug 走到队友桌前,只为了让他们在 30 秒内发现它,或者建议一个更有效的方法来达到预期的结果。其中一个最大的原因是,bug 或重复经常出现在最难注意到的、模糊的和不明显的 SQL 交互中,包括最不重要的情况。
作为一名分析师,您识别潜在边缘情况并对其进行解释的能力,最好是在它们发生之前,对于在它们成为现实之前防止任何问题是至关重要的。单独考虑每一个潜在的边缘情况是极其困难的,几乎是不可能的,所以利用你所拥有的最好的资源——与你的团队和同事进行富有成效的讨论。在您的工作流程中建立一致的同行评审,以确保没有任何代码在没有被至少一个同事看到的情况下投入生产,这对于增加您作为分析师的自信大有帮助,并且可以极大地加快工作的交付。
结论
确保你的交付品尽可能的高质量意味着尽可能多的考虑错误场景。一旦应用了上面的基础设施和 QA 过程,你会很快发现在 bug 检测、错误管理、交付质量和利益相关者满意度方面有了巨大的改进。我希望这篇文章对您有用,并且您可以应用其中的一些实践来改进您的数据管道过程。
如果你喜欢这篇文章,并想与我联系,请随时在 LinkedIn 上联系我:https://www.linkedin.com/in/michael-gendy-a04263161/
A/B 测试实用指南
你的统计学课本没有让你做好准备

我在 Squarespace 担任数据科学家期间,花了很多时间在 A/B 测试上 。许多人对实验不屑一顾,认为这是“分析工作”,并且对此不太感兴趣。对我来说,A/B 测试是更多地参与产品开发的一种方式,并对出货的产品产生重大影响。老实说,我真的很喜欢。
我很早就意识到,你在统计学教科书上学到的东西和实验在实践中的运作方式之间存在着巨大的不匹配。在 A/B 测试中取得成功并不取决于分析方法。是流程和人的问题。
知道你在做什么测试
这不是关于 t 测试或 z 测试。这不是贝叶斯和频率主义方法的问题。除了你选择如何评估结果之外,还有不同种类的 A/B 测试。首先,你必须设定实验的背景。测试前的不确定性导致测试后的错误决策。
好的 A/B 测试分为三类:大赌注、健康检查和迭代。先说大赌注。这些测试会以某种方式对你的主要指标产生很大的影响。可能有一些尚未被证实的假设驱动着这个实验。这里有一个问题:如果变体和控制之间没有显著的区别,你会遵从控制。发布没有影响力的特性会导致产品混乱,并浪费时间来维护代码。

远离危险区域
像大赌注一样,健康检查是产品中相当大的变化。它们的不同之处在于测试的上下文。这些都是你想要推出的新功能或大的产品变化。它们可能是组织内较大计划的最小可行版本,或者它们只是为用户提供了更好的体验。您不需要检测出显著的差异来发布这些更改。您只需要确保它们不会有意义地损害度量标准。思考这些测试的一个聪明的方法是,第一个版本代表了这个变体可能的“底线”。当然,这取决于后续工作流程。如果没有“下一步”的愿景,那么这是一个危险信号,你可能会把一个大赌注误认为是一次健康检查。
好的 A/B 测试落入的最后一个绑定是迭代。当大多数人想到 A/B 测试时,想到的就是这个。这就是我们熟知并喜爱的 50 种蓝色的例子。不要期望这些测试会产生巨大的影响,但是如果你有足够的流量,它们会很强大。值得注意的是,对于大多数组织来说,这是一个很大的“如果”。在这里认真对待功耗分析。如果测试需要 2 个月的时间,那么它还不足以成为 A/B 测试的优势。那里有更低的悬挂,更有影响力的水果。
在上面的可视化中,还有一个象限我没有触及。危险区域是当您预期对您的主要指标有小的影响,但即使没有显著差异也愿意推出它。如果你是谷歌,也许这是有道理的。如果你不是谷歌,这是一个不必要的预防措施,会占用带宽,导致没有可操作的结果。为了安全起见,我通常建议首先推出这一阶段的测试,然后在之后监控指标。
把一切都写下来
在开始 A/B 测试之前,你有很多理由想把所有的事情都写下来。这不是一个新颖的建议,但它也是我不得不提及的许多常见失误的根本原因。
大规模进行 A/B 测试是一项跨职能的努力。可能会涉及数据科学和分析、产品、工程,可能还包括设计。对于所有这些不同的接触点,你需要一个“真相来源”文档。这是你可以给人们指出足够的背景的东西。
考试前把事情写在纸上的另一个好处是——它帮助你避免偏见。产品负责人应该清楚地陈述他们运行测试的假设和前提。这有助于其他人回顾并确保他们理解。在测试完成后拥有它也很好,这样你就可以很容易地检查假设是有效的还是无效的。
最后,文档是关键。在一个集中的、可搜索的地方保存这些 A/B 测试文档的运行日志将会在以后带来巨大的好处。这变成了你在构建产品时所学一切的知识库。团队中的老手将参考它来获得产品见解,而新手将能够更快地建立对产品的理解。
“纸是用来写下我们需要记住的东西的。我们的大脑是用来思考的。”——阿尔伯特·爱因斯坦
了解您的主要衡量标准
与最后一个写下来的要点相关,你应该在测试之前陈述你所关心的指标。在大多数情况下,我喜欢将这些分为主要的、次要的和“将监控”的。
很多人出错的地方在于他们想要跟踪太多的指标。有一系列次要的和“将被监控”的指标是可以的,但是你只能有一个主要的指标。这是你的主要决策标准。如果你试图在多个数据点之间进行权衡,你会偏向于扭曲数据,使偏向于你的先入之见。
这看起来很简单,但可能很难。如果您正在运行一个结账优化测试,并且您发现变体提高了转换数量,但是降低了平均购买价值,该怎么办?你如何处理这些相互冲突的变量?需要考虑的因素很多,但是预先对哪些指标最重要有一个统一的看法会让您在决策时更加轻松。
如果需要,与工程部门合作
我不确定 A/B 测试基础设施在您的组织中是如何建立的。我发现不同的公司有很大的不同。有大的科技公司,他们什么都有,也有小的创业公司,他们在西部蛮荒。如果你不是前者,赋值逻辑永远不会像看起来那么简单。
您应该在书面文档中详细说明谁将被分配,他们将被分配到什么唯一的 id,以及该分配何时发生。如果您的基础设施不能为您处理这种复杂性,那么就需要处理这种复杂性。你可能需要与工程合作,以正确的方式实现事情。这不是世界上最有趣的工作,但值得投入时间和精力来做好这件事。否则,到了评估时间,你会发现自己在试图拼凑破碎的作业,而你不会过得很愉快。
洞察力转化为未来的测试
因此,您最终运行了测试,并耐心等待结果。这就是事情变得令人兴奋的地方!奇怪的是,数据科学家在这里变得懒惰。他们报告关键指标,命名获胜的变体,然后收工。这是一个错过的机会!
A/B 测试中最有趣的部分隐藏在分析中。这是你了解人们如何使用你的产品的地方。你应该写下这个分析,并作为你报告的一部分,与参与测试过程的每个人分享。这种分析通常会暴露其他假设,导致更多的测试等等。这就是实验的周期性。测试不是线性的。它们相互补充。

将你的思维产品化
当您的组织达到一定规模时,您将遇到这个奇怪的中间地带,您有一个数据科学团队准备好处理更专业的问题,但 A/B 测试仍然占用了过多的时间。你在这里做什么?
如果你想在你的组织中推广 A/B 测试,那么你需要将你的想法产品化。你听说过 Airbnb 和脸书的工具,员工可以用它们来发起和评估测试,都是自助式的。这是一个将数据科学过程封装到任何人都可以使用的工具中的很好的例子。从技术上和文化上来说,这是一个艰难的转变,但这是一个你总有一天要完成的转变。这应该是你的想法,最好是在为时已晚之前。
离别的思绪
我之前提到过 A/B 测试是一项跨职能的工作。像任何团队运动一样,有时你必须为了更大的利益而妥协。这可能意味着以不太准确、更容易理解的方式呈现结果。这可能意味着在考试前花更多的时间写下你的思维过程。这可能意味着在测试启动后将破碎的任务数据拼凑起来。
这些权衡在每次测试中都在发生。你可以忽略它们,或者承认它们的存在,并一起努力达到可能的最佳状态。当你选择后者时,最终会收获颇丰。
向 Josh Laurito、Greg Allen、Andrew Bartholomew 和我在 Squarespace 一起工作的所有人大声喊出来,同时缓慢但坚定地捡起这些东西。
感谢阅读!在 Twitter 上找到我,不要忘记 订阅 我的每周简讯,获取任何新帖子和有趣的链接。看看下面一些类似的帖子:
我希望在开始数据分析时就有实用的 SQL 指南

SQL 已经成为各行各业和各种工作岗位的通用技能要求。公司要求他们的数据分析师、数据科学家和产品经理至少熟悉 SQL。这是因为 SQL 仍然是数据的语言。因此,为了实现数据驱动,人们需要知道如何访问和分析数据。
当我作为一名分析师寻找学习 SQL 的资源并为面试做准备时,所有的网站都有一套非常标准的“员工-薪水”表,其中包含非常基本的查询。虽然我从这些例子中很好地理解了 SQL 的基础知识,但是它没有理解在我们通常处理较大查询的实际环境中哪些概念是最重要的。所以我决定总结一些关键的提示,我希望我在开始我的旅程时就已经强调过了。
了解你的基本查询结构
这是最基本也是最重要的提示。无论问题有多复杂,您都应该记住基本结构,并将查询的每个部分分解成这个结构。即使当我处理多个表和连接时,它也总是有助于记住基本结构。

基本 SQL 查询结构
了解你的等级和分区
在我做分析师的这些年里,接受几次采访是最常用的功能之一。这用于根据特定值对行进行排序,并按其他属性进行分区,或者查找聚合函数的滚动值。
当您需要所有行的唯一等级时,务必使用 row_number 而不是 rank/dense_rank。(3 种类型在秩函数上的区别是一个常见的面试问题。这里是一个很好的总结,供参考。)
这些功能可以帮助我们解决多个问题,例如:
查找特定过滤器中的最新条目—
查找累计金额—
从表格中删除重复行-
以及更多我可能还没有遇到的问题。
使用时间和弦
我用过的最常见的过滤器通常是基于时间和字符串的。这里有一些操纵时间的重要函数
重要的日期函数
对于 string,你应该熟悉LIKE函数中使用的所有条件来识别模式。你可以参考一个完整的列表,但是总结一下,%用来表示任意数量的字符,而_用来表示单个字符。[]可在 SQL Server 中用于检查多个字符。例如,在一列name中查找名字,其中第二个字符有一个元音,最后一个字符是“t”
SELECT name from Table WHERE lower(name) **LIKE '_[aeiou]%t'**
一个额外的提示,如果你把结果导出为。csv 始终记得删除所有字符串列中的逗号,以确保文件的格式正确。使用regexp_replace(column_name, ’,’ , ’’) as column_name删除列中的逗号。
熟悉连接并使用正确的格式
不幸的是,您几乎不会只处理一个表,大多数查询都有许多子查询和连接。所以你必须总是把你给定的问题分解成更简单的查询,然后解决问题。在这种情况下,连接的基本知识非常重要。(也是很常见的面试问题)。
我使用的最常见的连接是左连接,这是我们需要保留第一个表中的所有数据,不管我们是否在第二个表中找到匹配。让我们在下一节的例子中看到这一点。
此外,当处理多个表时,具有适当缩进的代码格式是最重要的。写任何代码时都要记住这一点——如果我把它交给第三个人,理解起来会有多容易。
过滤计数和总和输出的用例
你可以在过滤输出时使用 case,就像在 Excel 中使用 count if 一样。
(另一个常见的面试问题是count(*) 的区别,它返回 null 和非 null 的行数 vs count(1) 将计算所有的行,因为表达式“1”对于每一行都计算为非 null vs count(column_name) 对于给定的列计算具有非 null 值的行)
让我们在下面的查询中看到这一切,我们将尝试找出阿姆斯特丹取消最多的顶级优步司机,并查看他们的登录时间和完成的骑行。我们将把包含所有已登录司机详细信息的登录时间表与包含所有状态为“成功完成”、“提前完成”、“被客户取消”或“被司机取消”的预订的预订表连接起来。
我希望这个指南能帮助你在编写 SQL 查询时变得更加自信,并解决你作为一名分析师甚至是一名受访者所面临的下一个问题。
感谢阅读。
本赛季英超发生了什么。

图片来源:https://www . pexels . com/photo/football-green-Liverpool-premier-league-104706/
世界上最具娱乐性的足球联赛分析
他的英超赛季直到最后一刻都充满了享受、悬念和戏剧性。利物浦以 99 分赢得联赛冠军,并打破了许多纪录,如在还剩 7 场比赛的情况下赢得联赛冠军。尽管曼城的表现高于平均水平,但仍落后冠军 18 分。
曼联在签下布鲁诺·费尔南德斯后踢出了一些令人惊叹的足球,布鲁诺·费尔南德斯已经被证明是顶级球员,并且与在弗兰克·兰帕德手下度过了一个不错赛季的切尔西一起获得了冠军联赛的参赛资格。对莱切斯特和布伦丹·罗杰斯来说太糟糕了,他们从第二名跌至第五名。
在赛季末,托特纳姆踢了一些精彩的足球,一些漂亮的团队合作,并在下赛季之前展示了一些惊人的前景。说到下赛季,阿森纳将永远是阿森纳,因为他们已经处于自 1995 年以来的最低点,他们没有希望了。
在冠状病毒爆发中经历了这个伟大的足球赛季后,我决定想象一下球队和球员在 2019/20 赛季英超联赛中的表现
英超联赛 2019/20 分析
收集了球队和球员赛季表现的数据,并使用 r 进行分析。最终的排行榜是通过这个链接获得的。

2019/20 赛季英超积分榜
新的冠军利物浦获得 99 分,距离曼城创造的 100 分的联赛纪录还差一分,曼城排名第二,在向欧足联提出上诉后,现在有资格参加冠军联赛。曼联和切尔西分别获得第三和第四名,曼联以净胜球领先。伯恩茅斯,沃特福德和诺维奇城在降级区结束后被降级到英冠。
最大赢家对最大输家


左图是以降序排列的获胜游戏条形图。右图是以降序排列的输了的游戏的条形图。
毫不奇怪,利物浦赢得了最多的胜利。在一个一边倒的赛季后,利物浦赢了 32 场比赛。曼城以 26 胜排名第二。切尔西以 20 胜排名第三,复兴的曼联 18 胜。在获胜图表的底部可以看到两支降级的球队:沃特福德和诺维奇城。
本赛季最大的输家是诺维奇,输了 27 场。那是毁灭性的。伯恩茅斯和阿斯顿维拉分别以 22 负和 21 负的成绩位列第二和第三。我的球队利物浦,输了最少的比赛,3 场。
本赛季最大的积分分享者

各队抽签游戏数量的条形图
具有讽刺意味的是,并列第一的是三支球队:阿森纳、狼队和布莱顿队。他们都平了 14 场比赛。谢菲尔德和曼彻斯特联队以 12 平的成绩位居第二。曼城和利物浦各三场比赛,平局最少。
进球与失球


左图是进球数柱状图,右图是失球数柱状图
曼城以 102 球进球数最多。利物浦在这一部分获得第二名,落后 17 球。切尔西第三,进了 69 个球,莱斯特第四,进了 67 个球。沃特福德,水晶宫和诺维奇城似乎失去了他们的射门靴,因为他们是最后三名。
不出所料,诺维奇城以 75 个失球成为失球最多的球队,平均每场比赛丢 2 个球。阿斯顿维拉和伯恩茅斯分别位居第二和第三,分别丢了 67 和 65 个球。利物浦队的防守再次被证明是严密的,因为他们丢了最少的球。
玩家分析
使用这个链接从英超联赛网站收集关于球员表现的信息。
最高得分者

2019/20 赛季进球最多的前 20 名球员
杰米·瓦尔迪在本赛季处于巅峰状态,进了 23 个球后获得了金靴奖。奥巴姆扬以 22 个进球位居第二。说到稳定性,这和他上赛季的进球数是一样的。Ings 也是第二名。斯特林在过去的几场比赛中进了很多球,他的总进球数达到了 20 个,并攀升至第四名。萨拉赫以 19 个进球排在第五位。
顶级组织核心

2019/20 赛季助攻最多的前 20 名球员
德布鲁恩已经做了一些工作,他平了蒂埃里·亨利单赛季 20 次助攻的纪录。这使他在助攻方面位居第一。紧随其后的是两位出色的利物浦组织核心。亚历山大·阿诺以 13 次助攻排名第二,罗伯逊以 12 次助攻排名第三。
最干净的床单

2019/20 赛季最干净的前 20 名球员
在确保 16 场零失球后,埃德松在后防线上非常强大。他赢得了本赛季的金手套奖。排在第二位的是尼克·波普,他这个赛季表现出色,15 场比赛没有失球。阿里森、德赫亚、舒梅切尔、帕特里西奥和亨德森都以 13 场零失球排名第三。
结论
这个赛季是我有史以来最好的英超赛季之一,因为利物浦终于举起了 30 年来的英超奖杯。为了确保前四名的位置和避免降级的底部都有战斗,这使得观看比赛直到最后都很有趣。
有趣的事实
利物浦足球俱乐部在过去三个赛季中输掉了 9 场比赛,这与曼城本赛季输掉的比赛数量相同。
感谢您的阅读。
在风城搭车的特权
不出所料,富人骑得更频繁。
绰号“风城”的芝加哥无疑给人一种寒风刺骨的印象。平均而言,芝加哥的气温在 10 月份下降最为明显。2019 年万圣节,据芝加哥论坛报报道“雪最大的万圣节”,气温特别低,达到 24 度。
除了独特的天气之外,芝加哥还以一个种族隔离的城市而闻名,那里有一些“明显的贫富分界线”(芝加哥商业)。根据同一篇文章,该市的中产阶级正在萎缩,“五分之四的前中产阶级成年人已经沦为低收入阶层。”

在上述背景下,我有兴趣调查分层的芝加哥的拼车模式如何受到十月天气减少的影响,提供了由芝加哥拼车公司生成的 出行数据集 。本文的其余部分是对芝加哥市在其数据门户上提供的交通网络提供商出行数据集的研究。我将介绍:
- 假设和方法
- 数据集分析
- 形象化
- 相关性的线性回归
- 结论
假设和方法论
从数据集的在线仪表板的可视化结果可以证明,10 月份拼车的使用有所增加。因此,我把我的问题集中在拼车模式是如何在整个城市发生空间变化的。我的假设是,拼车使用的变化对城市的影响是不均衡的:
- 较富裕的社区与较贫穷的社区表现出不同的模式,因为较富裕的社区有更高的可支配收入,因此在寒冷的天气里可以负担更频繁的拼车。
- CTA“L”服务可以抵消邻近区域的增加,因为它提供了一种选择。
为了测试这一假设,我将比较 2019 年 10 月上半月和下半月的乘车份额模式。2019 年 10 月 17 日将是两个组的划分日期,我将想象每个人口普查区域的以下特征:
- 平均每日出发和到达次数
- 到达时的平均行程持续时间和行程里程
可视化将有助于确定 10 月份拼车模式的变化。绘制整个城市的变化图,我想在空间上将这些变化与中等家庭收入的分布和同一地区的铁路线进行比较。
涉及的其他数据集包括:
- 2010 年人口普查区域边界[Shapefile]。芝加哥市,可通过芝加哥数据门户访问。
- 城市边界[Shapefile]。芝加哥市,可通过芝加哥数据门户访问。
- 芝加哥 L(铁路)线[Shapefile]。芝加哥运输管理局,可通过芝加哥数据门户访问。
- 芝加哥 L(铁路)站[Shapefile]。芝加哥运输管理局,可通过芝加哥数据门户访问。
- 2018 年美国社区调查过去 12 个月收入 5 年预估[表格]。美国人口普查局,可通过人口普查局网站访问。
数据集分析
数据分析包括几个步骤:
数据收集: 所有数据集均从上述链接站点获取。
聚集: 经过一些初步的清理,旅行数据集以 10 月 17 日 00:00am 为时间点分为两组,上半年 16 天,下半年 15 天。通过表连接,每月上半月和下半月的以下拼车功能将汇总到人口普查区域级别:
- 平均每日接送
- 到达时行程持续时间和行程里程的平均值、中间值和标准偏差
准备可视化: 将所有未投影的数据集投影到状态平面。连接表中设计了几个功能:
- 上半月平均每日接送率
- 平均每日接送百分比变化
- 中位行程持续时间和中位行程里程的百分比变化
百分比变化计算如下:(second_half - first_half ) / first_half
形象化
为了通过比较得出有意义的结论,本文中所有关于拼车的可视化都与城市中值收入分布的可视化并列。
每日接送率,上半月


作者图片
虽然城市的大部分地区显示出混合的接送率,但接送率似乎最稳定(约 12~15%),并且集中在北部、东部的红线和西部的蓝线之间,与最富裕的社区相对应。
日均接送百分比变化



作者图片
总的来说,存在着南北分界线,这也与财富线相对应。灰色区域显示接送人数略有增加的趋势(≤ 15~17%),而橙色区域增加显著(≥ 15%)。蓝色区域略有下降(≤11~16%)。
中位行程持续时间和中位行程里程的百分比变化



作者图片
关于旅行持续时间和里程的变化,模式不太明显。灰色区域显示行程持续时间和里程没有显著变化(5%以内)。浅蓝色显示略有下降(≤ 11~12%),而橙色显示略有上升(≤ 10~19%)。
相关性的线性回归
鉴于可视化,我想测试之间的相关性变化接送与收入,距离市中心,以及车站的数量。我将通过线性回归测试它们的相关性:
Change = income + distance_downtown + number_station + constant
距市中心距离: 粗略目测,选择市中心作为普查地段 8391 的质心。到市中心的距离计算为人口普查区域 8391 的质心和每个人口普查区域的质心之间的欧几里德距离。
站点数量: 执行空间连接以计算落入每个普查区域的站点数量。
标度: 收入、离市区的距离和站数都是百分排名。
回归: 普通最小二乘回归使用包statsmodel:
import statsmodels.api as sm# same for dropoff and pickup
X = datamodel.dropna()[['income', 'distance', 'station']]
X = sm.add_constant(X)
Y_d = datamodel.dropna().change_dropoffmod_d = sm.OLS(Y_d, X).fit()
mod_d.summary()
模式摘要:


左图:衰减变化的模型总结;右图:皮卡变化的车型总结;作者图片
虽然调整后的 R 平方对于两个模型来说都非常低,但我们仍然可以认为收入和离市中心的距离都与下降或上升的变化强烈相关,由小 P 值支持。就系数而言,收入为正,而距离为负。
最后,站的数量相关性相当弱。
结论
我们可以得出结论,出行分担率变化的空间格局与收入分布和离市中心的距离相关。当天气变冷时,富人会更频繁地骑车。然而,贫困社区和远离市中心的地区乘客数量的下降却没有得到很好的解释。
虽然我没有测试旅行持续时间和里程,但他们的可视化并没有显示出城市大部分地区的太大变化。然而,两者在边缘地区的增长无疑表明了与市中心距离的相关性。
本文是为哥伦比亚大学建筑、规划和保护研究生院城市规划系教授 Boyeong Hong 教授的课程城市信息学撰写的。
缺失数据的问题
关于缺失数据的关键概念

全球范围内的数据生成正以指数级和分布式的方式增长。一些因素促成了这种情况,例如数据存储设备在存储空间和数据访问速度方面的发展,以及存储这种数据的方式。
美国犹他州一家名为 DOMO 的数据集成公司在 2018 年进行了一项名为“数据从不睡觉 6”的研究。它的主要目的是回答以下问题:我们每分钟产生多少数据?
他们得出结论,预计到 2020 年,每人每秒将产生 1.7 兆字节的数据,即每分钟 1020 兆字节。图 1 说明了一些公司在 2018 年产生的估计数据。

图 1:2018 年各公司每分钟产生的数据量图解。来源:改编自 Domo Inc [DOMO,2018]
已经开发了标准统计方法和/或机器学习算法来分析矩形和完整的数据集。通常,数据矩阵的行表示单元,根据上下文也称为案例、例子、观察或主题,列表示为每个单元测量的变量或特征。数据矩阵中的条目几乎都是实数,要么代表基本上连续的变量的值,如体重、身高和收入,要么代表可能有序(教育水平、社会阶层)或无序(性别、婚姻状况)的类别。
当数据矩阵中的某些条目没有被观察到时,就有一种现象叫做数据缺失。丢失数据的一些原因是,例如,拒绝回答调查中的一些问题,热或温度传感器故障。有一些处理缺失数据的策略,如通过为数据矩阵中未观察到的条目创建一个或多个特殊代码来识别未回复,如“不知道”或“拒绝回答”,另一种方法是排除具有缺失值的单元。这最后一个策略是非常不合适的,因为我们通常感兴趣的是对整个目标群体进行推断,而不是对某个数据集的目标群体的一部分进行推断。
缺失数据模式
当分析数据集的某些不易察觉的知识时,这些数据是以表格格式(矩形或矩阵)观察的。从这个意义上说,可以观察到缺失数据的一些模式。斯查费和格雷汉姆[2002]认为,识别这些缺勤模式是选择最佳技术来填充这些值并对这些模式进行一般(或随机)或特定分类的重要一步。
在缺乏一般(或随机)模式数据的情况下,正如分类本身所表明的,这种缺乏分散在数据集中的任何记录中。关于特定的缺席模式,这些被分为两个单变量和单调的亚型[斯查费和格雷厄姆,2002]。
在被分类为单变量的模式中,当单个变量出现在项目 Y 中时,存在指向单个变量的缺席分布,但是 p 其他项目 X1,…,Xp 的集合保持完整。这种模式还应该包括这样的情况,即 Y 表示一组完全观察到的或完全缺失的项目,简而言之,被限制到一个数据集变量。在单调模式中,在不止一个变量中观察到缺失,使得一组项目 Y1,…,Yp 在排序时,如果 Yj 包含缺失值,那么 Yj + 1,…,p 也将包含【斯查费和格雷厄姆,2002】。图 2 说明了这些概念。

图 2:矩形数据集中的缺失模式:(a)单变量模式,(b)单调模式和任意模式。在每种情况下,行对应于可观察的单位,列对应变量。来源:改编自[Schaferand Graham,2002 年]
缺失数据机制
应该观察的另一个特征是数据缺失的机制,换句话说,是什么导致了缺失。斯查费和格拉汉姆[2002]指出,根据统计文献,机制可能是一个过程,通过这个过程,一些数据产生,而另一些数据丢失。Little 和 Rubin [2019]认为该机制与数据丢失的过程有关,并指出了解数据缺失是否与数据集变量的潜在值有关的重要性。
Statistically Little 和 Rubin [2019]对它们的定义如下: Y 为完全数据集, M 为缺席集,缺席机制的特征是给定 Y,f (M | Y,φ) 的条件分布 M 其中, φ 表示未知参数。
Rubin [1976]定义了缺席机制的三种表现形式:完全随机(MCAR——完全随机缺席)、随机(马尔——随机缺席)和非随机(NMAR——非随机缺席)。
当数据缺失的真正原因未知,并且与任何其他数据集属性没有关系时,即当 M 不依赖于 Y 的值时,数据缺失被分类为完全随机的,因此如果对于所有的 Y , φ , f (M | Y,φ) = f (M | φ) ,数据缺失机制被分类为完全随机的。如果缺失值依赖于任何数据集属性,则被归类为随机。设 Yobs 为 Y 的完全观测子集, Ymis 为缺失数据的观测子集,对于随机的缺失机制, Ymis 必须依赖于 Yobs ,即对于每一个 Ymis,φ ,如果 (M | Y,φ) = f (M | Yobs,φ) 。还有第三种称为随机的缺失机制,在这种情况下,缺失分布 M 取决于由 Ymis 表示的缺失值。Graham 和 Donaldson [1993]将这种缺勤机制定义为不可使用,因为它不可测量,因此不可用于评估。
分析后,可以采取一些措施来解决缺失数据,忽略这种缺失是一种可能的措施,但用实际增加值代替缺失值是解决这一问题的一种非常合理的方法,Rubin [1988]。一篇即将发表的文章将讨论这个话题。
参考资料:
- DOMO(2018). data never sleeps 6.0 .https://www.domo.com/assets/downloads/18DOMO data never sleeps 6+verticals . pdf
- 斯查费和格雷厄姆(2002 年)。缺失的数据:我们对技术现状的看法。心理学方法,7(2):147。
- Little,R. J .和 Rubin,D. B. (2019 年)。缺失数据的统计分析,第 793 卷。
- 鲁宾博士(1976 年)。推断和缺失数据。生物计量学,63(3):581–592。
- 格雷厄姆、J. W .和唐纳森(1993 年)。用差异营养评价干预:无反应机制的重要性和随访数据的使用。应用心理学杂志,78(1):119。
- 鲁宾博士(1988 年)。多重插补概述。美国统计协会调查研究方法部分的进展,第 79-84 页。Citeseer。
面向企业的人工智能开发工具的问题(以及宜家与它的关系)
一年多前,我分享了我关于为什么大多数专注于企业深度学习工具的初创公司会失败的想法。这个帖子引起了很多关注(在彼得·诺维格的帮助下,他发布了一个关于它的视频),不止一个上述初创公司的创始人告诉我,他们的投资者让他们写了一份回应。我为造成的任何不便道歉,但在这个空间进行更多的审查肯定会有所帮助。
不幸的是,从那以后,情况并没有太大的变化。我亲切地描述这些天来大多数人工智能开发者栈的方式是,他们是“就像 DIY 工艺包,缺少说明书和 70%的部件”。创新需要时间。
为了解释我们如何走到这一步,并帮助指导我们需要去哪里,我总结了在技术创新生命周期的早期阶段常见的三个主要挑战。最重要的是,我们还没有为 ML 平台找到一个主导的设计,这导致了具有不明确接口的不同范围和形状的系统的扩散。因此,事实证明,为面向企业用户的人工智能开发工具创造合适的外形非常困难。最后,这就是宜家的用武之地,如今企业消费这些工具的主要方式不幸遭遇了宜家效应。

图 1 : ML 平台通常缺少很多部件,几乎没有汇编指令(图片由作者提供,徽标来自开源项目 Spark 、 TensorFlow 、 Airflow 、 Kubernetes 和 Docker
“今天的开发者书库就像 DIY 工艺包,缺少说明书和 70%的零件。”
人工智能开发工具缺乏主导设计
新技术的出现通常伴随着可能的解决方案设计数量的扩展和收缩。人工智能将改变许多行业,这不再是有争议的,往往会成为一种战略优势,甚至创造新的“人工智能优先”的商业模式和公司。因此,所有主要的云供应商(和无数的创业公司)都在堆积资源,将人工智能开发工具带给更广泛的受众,最重要的是大企业。所有这些供应商都试图解决相同的用户需求,但采用截然不同的方法和结果,导致不同设计的激增。
ML API 中的主导设计
这种现象存在于堆栈的每一层,通常是自下而上的。作为 2016 年谷歌大脑团队的一名项目经理,我记得我试图合理化谷歌内部为 TensorFlow 出现的 20 多种不同的高级 Python APIs。最终,我们集中于估算器和层 API(在 TensorFlow 2.0 中与 Keras 合并)。
一旦某个设计的用户采用率远远超过其竞争对手,它就会成为标准(或“主导设计”),该领域的其他参与者也会遵循它,例如,参见 PyTorch 中的等效 API。对主流设计的融合需求在平台产品中尤为明显,因为维护无数竞争设计的成本非常高,就像 ML 框架的情况一样,数据科学家、ML 工程师、ISV、教育工作者等等。无法应对成百上千的重叠和不兼容的 API。
ML 平台的主导设计
当我们谈论“面向企业的人工智能开发工具”时,我们实际上是在谈论一种叫做“ML 平台”的新兴技术。事实上,我们缺少 ML 平台的主导设计也意味着没有普遍接受的定义,所以我只给你一个非常基本的定义:ML 平台是一种水平技术(即不特定于垂直用例),它提供覆盖 ML 应用程序整个生命周期的所有功能。我之前的博客文章中的图有助于说明这样一个平台的不同组成部分。

图 2 :被认为是 ML 平台一部分的不同组件的简单概述(图片由作者提供)
在这个时间点上,业界甚至没有就 ML 平台的范围达成广泛的一致,也就是说,它们在哪里开始和结束。例如,一些 ML 平台产品完全缺乏预培训(数据准备)类别的功能。
有几个原因可以解释为什么我们还没有达成一个 ML 平台的主导设计。仅举几个最重要的例子:
- 底层技术尚未成熟。ML 平台中利用的许多技术本身都处于其生命周期的早期。当用于所述模型的 ML 框架对其检查点格式进行向后不兼容的改变时,很难构建提供持续更新的 ML 模型的 ML 平台。想象一下,试图在没有定义后端 API 的情况下为 web 应用程序构建 UI。随着 API 的发展,你可能会不经意地回头修改一些东西,在 ML 领域,API 发展很快。
- ML 平台创造者不知道他们不知道的事情。我花了无数时间与工程团队交谈,他们有构建规范 ML 平台的宏伟计划。在大多数情况下,他们的心智模型只有构建一个 ML 平台所需的大约 20%,因此,极大地低估了他们所从事的工作的难度。一个我过去在谷歌如何提出这一点的小故事可能会有所帮助:如果一个随机的谷歌工程师想要制造一辆无人驾驶汽车,并向他们的主管询问人数,典型的反应是“这太难了,我们已经在这方面投入了大量资源;去 Waymo 工作"。然而,如果一个随机的谷歌工程师想要建立一个 ML 平台,并向他们的主管询问人数,典型的反应是“听起来不错,这里有两个工程师”。当然,我们最终到达了这样一个点,即构建一个 ML 平台的努力被普遍认为更像是构建一辆无人驾驶汽车(在某种程度上有些夸张,以使我自己的工作听起来更重要),Alphabet 的大多数人开始使用 TFX 。
- ML 平台消费者不知道自己不知道的。特别是在企业领域,有许多公司购买了所谓的“ML 平台”,却不知道他们应该期待的功能或他们应该提出的问题。对于企业来说,评估这些产品几乎是不可能的,因为它们听起来都一样,但提供的功能却大相径庭。一位客户曾经这样对我说“在 ML 平台领域存在等价性问题”,这意味着他们推销的每一种产品听起来都是等价的,当他们意识到差异时已经太晚了。下面是我今年早些时候在 MLSys (以前的 SysML)的一次演讲中使用的一张图表来说明这一点。

图 3 :半开玩笑地说明了 TFX 、库伯弗洛和 MLflow 的感知重叠和实际重叠之间的差异(摘自我 2020 年 3 月在 MLSys 的演讲)(图片由作者提供)
人工智能开发工具有一个外形问题
对于细心的读者来说,前一节应该已经给他们带来了麻烦。如果我们还没有在一个主导的设计上达成一致,我们怎么能在合适的外形上达成一致呢?首先,让我解释一下我所说的外形的含义。通常,这个术语用来指电子元件(例如主板),或者更接近我的用法,指技术如何为用户包装的不同体现。例如,iPhone 定义了智能手机的主要外形。我挪用这个术语来概括你在谈论“产品表面”、“用户体验”或“开发者体验”时会考虑的一切。当我们说开发人员在使用一个 ML 平台时,他们实际上在与什么进行交互?
现在,大多数人工智能开发工具的形式因素就像不同 API 表面和服务的狂野西部。让我举个例子来说明这一点。为了涵盖训练和部署 ML 模型所需的最小技术集,您可以:
- 用 Spark 这样的数据工程产品来扯皮数据。
- 使用像 TensorFlow 这样的库来训练你的 ML 模型。
- 使用 Docker 打包这些模型。
- 使用 Kubernetes 来编排这些 Docker 容器。
你可以提出这样的论点,应该将关注点分开;数据工程师应该编写数据管道,数据科学家应该训练模型,软件工程师应该编写部署系统;ML 平台不可能提供所有这些功能。但是,我在企业中一次又一次地看到,这种人为的关注点分离(这是在 ML 平台出现之前很久就划定的技术界限的结果)导致了 ML 项目的显著减速、代价高昂的错误和总体较高的失败率。
我们不能假设几十年前为软件工程创造的工具和过程可以神奇地转移到 ML。例如,您不应该仅仅将您的 ML 模型工件(其大小可能相当大,并且包含敏感数据)签入旨在用于代码的版本控制系统。这就是为什么在 Databricks,我们建立了 MLflow 模型注册中心来管理 ML 模型的版本和部署生命周期。如果您想让您的数据科学家或软件工程师能够管理整个 ML 生命周期,这些工具需要面向广泛的用户,而不仅仅是 DevOps 专家。在谷歌这样的公司,一个人拥有从数据管道到模型部署的整个生命周期并不罕见。其他人也意识到了这一点,并为此创造了一个广泛的“ML 工程师”角色。
“我们不能假设几十年前为软件工程创造的工具和过程可以神奇地转移到 ML 上。”
尝试更一致的外形
一些供应商意识到需要您掌握 Spark、TensorFlow、Docker 和 Kubernetes 的解决方案的目标受众是有限的,他们试图创建不同的形式因素来消除这种复杂性。然而,他们大多以痛苦的方式失败。让我举两个说明性的例子:
- SQL ML :有一些产品声称它们“让机器学习像编写 SQL 查询一样简单”,在这篇文章中这些产品将保持匿名。然而,为了做到这一点,他们让你注册一个 Python 代码片段作为一个过程,或者他们简单地在 SQL 中镜像相同的 Python APIs(例如,在你的 SQL 查询中定义神经网络的层)。不用说,仅仅允许某人注册 Python 代码并从 SQL 调用它并不能真正实现任何新的东西。事实上,这只会让一切变得更加困难(比如调试 Python 代码)。如果您正在使用硬件加速器(例如 GPU),您可以理解我所说的违反抽象层次的基本原则是什么意思:现在您的 SQL 查询将抛出特定于您运行它的硬件的错误。或者,更糟糕的是,它会无声无息地失败,而您不得不去寻找日志文件。
- 所见即所得/UI ML :另一类产品试图为所谓的公民数据科学家提供无代码解决方案。漂亮的基于 UI 的工作流程旨在引导用户完成典型的数据科学& ML 模型构建步骤。我观察到这类产品有两种常见的失败模式:(1)在工作流程中的一个或多个步骤,通常是建模步骤,它们要求用户指定低级参数,如 L1 正则化。要求了解什么是 L1 正则化,或者如何为它选择一个好的值,就错过了构建基于 UI 的 ML 产品的要点。(2)在大多数情况下,这些工具只解决最高层次的抽象,并不为用户达到极限时提供“逃生出口”。结果,许多企业发现基于 UI 的 ML 工具无法解决现实生活中的用例。这两个原因导致了典型的产品/市场不匹配,这一类别中的大多数工具除了玩具演示和概念验证之外并没有获得太多的吸引力。
这里的潜在问题当然是边界不明确(因为缺少主导设计)和不尊重抽象层次的新形式因素的创建。这在很大程度上与 ML 工具发展的速度有关,通常由研究发现和开源贡献驱动,损害了严格的工程原则(这会减慢进展)。灵活性和稳定性之间的平衡是技术生命周期中各个阶段的函数,这意味着随着这些工具的成熟,它们可能会有重大的变化。仅举一个我承担部分责任的例子:在 TensorFlow 中曾经有一个tpuestimulator。Estimator API 是相当高的级别,TPUEstimator 甚至没有试图隐藏它正在对它运行的硬件(TPUs)做出假设的事实;明显违反了抽象层次。在较新版本的 API 中,硬件分配发生在较低的 API 级别(作为一种分发策略)。
当你选择一个人工智能堆栈时,要小心宜家效应
最后,由于既没有占主导地位的设计,也没有合适的形式因素,难怪许多企业都在努力采用 ML 平台,更不用说将他们的公司转变为“人工智能优先”的商业模式了。那些尝试过的人经常遭受宜家效应。
人工智能开发工具正慢慢开始得到广泛使用。工程师喜欢建造东西,他们喜欢获得新技能。因此,许多工程师在网上学习水平太低的 ML 课程。我通常告诉任何想听的人,如今没有数据科学家或 ML 工程师需要知道像 backprop 这样的事情实际上是如何工作的。然而,许多人参加网上课程,教授的正是这个。(公平地说,我也从零开始学习了如何编写大多数流行的 ML 算法。但是,话又说回来,我是 AI 开发者工具的 PM)。所有这些工程师,受到他们新获得的关于 ML 的本质细节的知识的鼓舞,然后走出去,试图将它们应用于他们的企业业务问题。这就是宜家效应的来源。
宜家效应指的是人们赋予自己帮助创造的产品更多价值的现象。事实证明,这种效应广泛适用于各种产品(家具、蛋糕粉、玩具等)。).我的推测是,同样的效果在拥有强大工程文化的公司中占主导地位。一个从头开始构建自己的 ML 平台的工程团队,尽管可能有缺陷,也会比从供应商那里购买现成的东西更有价值。他们给它起了一个花哨的名字,写了关于它的博客,每个人都得到了提升。
当然,这同样适用于任何一种新技术。然而,现在没有人会说“让我们从头开始建立我们自己的数据库”。ML 平台的特殊挑战是,因为我们缺乏一个主导的设计和通用的形式因素,人们不知道他们不知道的东西,所以认为你可以只用几个工程师就能做出有意义的东西是太容易了。随着故事的发展,一个软件工程师去找他们的主管要人手来建立一个 ML 平台…
“一个从头开始构建自己的 ML 平台的工程团队,尽管它可能有缺陷,但会比他们从供应商那里购买现成的东西更有价值。”
10 年后 AI 开发者工具会是什么样子?
最后你可能会问自己,10 年后人工智能开发工具会是什么样子?如果你有足够长的时间,你可能会说类似这样的话:“好的,我明白了,克莱门斯,这些都是任何新技术的常见问题。你可以在 20 年前写同样的关于分布式数据处理引擎的博文。我会说“谢谢,这正是我的观点”。如果你认为,10 年后,数百万人将使用低级 Python APIs 来指定他们确切的模型架构(“我想知道 skiplayer 或卷积是否会有所帮助?”)并且摆弄上百个参数,我敢打赌你是错的。事实上,在理想世界中,构建“数据驱动的应用程序”(这实际上是 ML 模型所属的更广泛的类别)的整个过程只是任何软件工程师工作的一个普通部分,而不必获得 AI 博士学位或 Kubernetes 硕士学位。
冒着说出显而易见的事实的风险,以下是我对未来几年将会发生什么来应对上述挑战的预期:
- 我们将致力于 ML 平台的主流设计。当我们谈论 ML 平台时,我们认为“盒子里面”是什么?今天,许多供应商只关注 ML 培训部分,忘记了 ML 中的大部分时间都花在数据争论上。最有可能的是,一个产品将获得牵引力,并引领定义类别的方式。许多其他供应商将退出市场,其他供应商将遵循主流设计。
- 对于不同的目标受众,将会有一些有意义的外形规格。我们不需要单一的外形。事实上,我认为拥有不同的抽象层是可取的。每一层都需要很好地定义,抽象不应该在层之间泄漏。我认为我们还没有看到最高抽象级别的好例子(例如,SQL 或基于 UI 的 ML)。
- 企业客户会意识到,构建自己的 ML 平台并不是他们的比较优势。当然,每个公司都可以雇佣一个工程团队,尝试搭建自己的 ML 平台。然而,随着主导设计的到位,这种努力是多么徒劳,这不是(也不应该是)大多数公司的核心竞争力,这一点将变得更加明显。对于大多数企业来说,价值来自于将 ML 平台应用于他们的业务问题,而不是来自于构建自己的 ML 平台并维护它们。
正如你可能猜到的,我对 ML 平台的主导设计和良好的外形有自己的看法。如果你对解决这些挑战感兴趣,并定义 ML 平台的未来,我碰巧正在招聘一名 ML 平台产品经理。
Clemens Mewald 领导 Databricks 的数据科学和机器学习产品团队。此前,他在谷歌大脑团队工作了四年,为 Alphabet 构建人工智能基础设施,包括 TensorFlow 和 TensorFlow Extended (TFX)。
数据科学的问题是
可能不正确的问题有太多的答案

数据科学项目多久会失败一次?如果我们从表面价值来看待流行的互联网媒体,尽管成功得到了广泛宣传,但失败项目的墓地肯定确实堆满了那些“不知道更好”的人的尸体。
许多探讨这些失败的文章广泛触及了相同的问题——缺乏明确的目标、太多的孤岛、缺少专业知识、非数据驱动的文化……有时归咎于业务,有时归咎于技术,但通常巧妙地指责两者。
声称的失败率,一个足够吸引读者注意力的高得惊人的数字,最终导致了观众的分裂。
愤世嫉俗者可能会说,有一两个顾问躲在角落里,等着扑向不知情的企业!
当事情不顺利时会发生什么
预算压力……沉没成本……失望……也许是耻辱……以及可能的商业或职业影响。
尽管如此,看似未被注意到的是不断出现的建议 …以及大量的建议。
搜索“为什么数据科学项目失败”,结果链接很可能指向标题为项目成功的 7 个步骤和分析失败的 5 个原因的文章。
我们最近遇到的两个例子是 Doug Gray 的数据科学和分析失败和 Ganes Kesari 关于数据科学采用挑战的文章。它们引起了共鸣,因为我们经历了提出的许多观点…我们认为它们表达得很好。
所以你读了这些文章,这些信息被反复强调,你发誓下次一定要解决这些缺点。如果你很勤奋,更多的相关点会成为每个项目开始时的经验教训清单。
最终,你可能会开始相信你的公式、系统或解决方案足够强大,足以应对大多数不测事件。
直到现实咬
几年前,一家客户希望通过数据驱动的分析来确定一家关键托管服务供应商的潜在节约。并非巧合的是,当时已经接近续约时间。
由于该供应商在 Citrix 虚拟化环境中工作,借助 Splunk 的一点魔力,我们能够提取生产力数据并可视化价值 10%的低挂果实,以便在续订时轻松剪掉。
我们相当有信心。毕竟所有的工作都是客户要求的,而且数据证明供应商人浮于事。
那么,为什么不在续订时删除不需要的服务呢?或者如果担心供应商的范围缩小,增加新的范围?
想象一下,当我们因为出色的工作而受到有礼貌的表扬和“我们会在 6 个月内考虑”的点头时,我们有多惊讶。
隐藏的握手
几个月后,我们的一个利益相关者提到了我们只能称之为“共生采购关系”的东西。
这种明显的低生产率实际上是供应商的利润,他们会非常不高兴看到这种情况发生。作为回报,企业可以根据需要寻求帮助。
最终,一些根深蒂固的粘性关系意味着,无论是最引人注目的商业案例还是最巧妙的演示,都不会像往常一样改变业务。
一大堆问题
这是我们可以提前预料到的吗?
毕竟,在道格的列表中,我们面临的最终挑战排在了第六位“变化是破坏性的,而且处理不好”。此外,在 Ganes 的 #5“缺乏高管认同”-我们认为我们有!
我们能在同时发生的其他事情中为它做好计划吗?
人类有可能如此密切地参与到一个项目的各个方面…以至于能够在一个十大问题的第一个迹象出现时就抓住它吗?
是不是只有我们觉得数据科学的建议总是在事后很有意义,但在事实发生之前却势不可挡?
最终,严峻的经济现实迫使我们对自己诚实。
我们之前无懈可击的商业案例忽略了隐性影响,不是因为我们不想考虑…而是因为我们没有关系去了解。
初步结论
这促使人们开始从不同的角度看待数据科学的失败和成功。
探索我们一直试图回避的问题。
在数据科学这样一个技术性很强的领域,人员、关系和背景对成功有多重要?
害怕答案,也许是不可思议的,会告诉我们它和数据印章、批判性思维和 A+解决方案一样重要。

(2019 年 10 月)深夜美食,槟榔屿乔治敦****
数据科学竞赛平台的问题
数据科学竞赛是否违反开源?—开放式思想传递和协作的案例

freebiesupply.com
正如任何数据科学家可能都熟悉的那样,互联网上存在一个广阔的预测建模竞赛世界。这些竞赛中有些是经济上的激励,有些只是出于好奇。几乎所有经济激励的竞赛的基本结构是,所有参与者(或参与者团队)在训练数据集上训练和开发模型,并提交他们的提交作为测试数据集上的预测,其标签对竞争者是隐藏的。随后,“最佳”模型会根据一些预先确定的准确性标准获得相应的奖金。关于这些预测建模竞赛的大多数观点是,基于财务激励的竞争创造了对聪明人发现难题解决方案的需求。虽然我最初同意这一观点,并且不反对他们的目标是正确的,但我已经注意到这些项目的内在问题,这些问题以一种非常可解决的方式阻碍了进展。毕竟,当一个组织为比赛中表现最好的模特提供 10,000 美元时,他们只是在众包他们问题的最佳解决方案,对吗?在本文中,让我讨论以下内容:数据科学竞赛的固有问题及其对开源伦理的违反,这些竞赛的重组建议,以及为什么这解决了当前结构的固有问题的案例。
固有问题:
1.大多数竞争者并不是为了赢而比赛
尽管这些比赛提供了丰厚的奖励作为激励,但从我的经验来看,我知道大多数参赛者并不是因为奖金才参加的。首先,如果这个观察是真的,那么它是一种与最初提供经济奖励的目的相违背的论点。如果许多竞争者不把奖金当作激励,那么奖金的价值,因为它关系到为提供组织生产的模型的质量,就会大大降低。让我解释一下。
也许你们中的一些人在阅读这篇文章之前已经接近数据科学竞赛的顶端,或者也许你们中的一些人接近中间。我鼓励你回忆一下这些立场是如何改变你为解决问题所付出的努力的。从我参与竞争和看到其他人参与竞争的经验来看,知道自己处于中游水平,又缺乏进一步改进的想法,往往会导致对财务激励的忽视,而且在大多数情况下,会变成类似于“好吧,至少我学到了一些东西”的想法。另一方面,那些看到自己的名字出现在排行榜顶端的人已经开始考虑他们会如何处理自己的那份奖金;结果会怎样呢?这些人全力以赴,坚持不懈地工作,以确保他们不会让自己的辛勤工作从指缝中溜走。这很棒,对吧?由于经济上的激励,我们有几十个聪明人不知疲倦地竞争,想出解决难题的办法。没错。但是,如果有一种方法,我们可以用同样的钱来激励所有的参与者,数百名数据科学家,这样会怎么样?
2。反开源——每个人都花时间解决相同(或相似)的问题
对于那些不熟悉的人来说,使用开源框架就是决定将一个项目的所有源代码都提供给任何想看一眼或进一步改进想法的人。在我看来,走向开源是历史上加速技术发展的最伟大的运动之一,特别是当它涉及到一个有如此多善意和恶意用例的领域时,进入深度学习和人工智能。这些竞赛中的规定,比如取消团队之间共享代码的资格,导致了一个反开源的环境。基于经典数据科学竞赛的当前奖励结构,不存在任何人分享想法的激励。事实上,在内部储存好的想法,以防止其他人利用它们来击败你,这要有利得多。由于这种反开源的性质,当存在要解决的常见问题(如数据预处理或实验以找到正确的神经网络结构)时,基于每个人都必须自己解决相同问题的简单事实,无数的时间被浪费了。例如,我目前正在参加与失速捕捉者项目的老年痴呆症研究竞赛,其中的数据集是大脑内血流的视频集合。由于这个数据集的性质,每个参赛者都必须编写一个脚本,将视频预处理成帧图像,随后在有问题的船只周围进行裁剪。我花了大约 3 个小时来创建一个函数,使视频的 Numpy 切片可以正常工作,并且通用于每个视频的每一帧。

DrivenData 竞赛数据预处理示例——感谢 DrivenData 和人类计算研究所提供数据和使用权限。
让我们在这里处理一些数字。我们看到有 623 人参加了这场比赛,由于缺乏更多的信息,让我们假设我的 n=1 的观察值接近平均值。由于我们都必须以相同(或非常相似)的方式对数据进行预处理,我们总共花费了 1869 个小时进行预处理,如果只有少数人担任这一角色并与班上的其他人分享他们的工作,这些时间本可以被重新分配。如果是这样的话,这些时间可以用来建立网络,研究疾病,优化网络等。记住,这只是比赛的第一步。
3。付钱赢
这一切都归结为一个简单的事实,即如果没有高端 GPU 和 TPU 这样的计算资源,即使是世界上最好的数据科学家也无法在足够短的时间内针对足够复杂的问题优化网络。此外,计算能力的每一次增加都会导致优化时间的减少,而优化时间可以用来追求更进一步的想法。我的主张并不是说这些竞争都是由对计算资源的访问决定的;事实上,对我来说很明显,问题的知识和解决问题的有效方法是比计算资源更重要的资产。我只是在陈述这样一个事实,即存在一个处理速度障碍,如果不满足这个障碍,一个缺乏资源的杰出数据科学家就不可能获得某个奖金池。
对我的论点的潜在反驳可能会声称,通过提及经常实施的计算限制,例如利用 TPU 的非法 GPU 运行时间限制或其他处理速度限制,一些竞争实际上是公平的。再次从经济的角度来看,如果一个组织“支付”(或提供奖励)一群人去寻找一个难题的最佳解决方案,我们为什么要限制这个群体已经拥有的计算资源池呢?出于这个原因,如果最终目标是达成可能的最佳解决方案,这些限制对我来说似乎是不可行的。此外,如果我们选择不使用现有的处理速度,这是对那些能够突破极限并构建出我们今天可以使用的尖端处理器这一惊人技术的工程师的诋毁。
重组——支链回报和自发修剪:

简化的支链奖励树示例(使用 app.diagrams.net 网络工具创建)
支链奖励结构
支链奖励结构背后的想法是,与其每个人都独自工作并发现他们手头问题的最佳模型,不如我们有一个存放当前最佳工作模型的存储库。因此,贡献者可以专注于改进已经被证明是最佳解决方案的潜在线索的现有想法,而不是做其他人可能已经做的所有探索性建模。在这种结构下,竞争对手将筛选当前的模型和想法树,并根据他们对问题的了解,决定以两种方式之一做出贡献:
- 他们扫描树以寻找最有希望的分支,并决定在树的任何级别创建他们自己的路径,其中他们希望分支到不同的、更好的方向。
- 他们想要追求的想法并不存在于树上;从而让他们决定开创一个全新的分支,让其他人看到并为之做出贡献。
以这种方式,奖金可以不分配给单个团队或个人,而是平均分配给树的获胜分支的所有贡献者(第二名、第三名等也是如此。).
自发修剪
一个潜在的问题可能产生于一个基于先前想法的改进树,这个树的复杂性可能会变得如此之大,以至于几乎不可能辨认出哪个模型有潜力,哪个模型根本就不能工作。您可以想象一个场景,其中竞争对手必须测试数百个不同的分支模型变体,仅仅是为了确定他们最终将致力于哪个模型,或者他们可能会在层次结构的更基础的级别分支到他们自己的模型。为了简化这种潜在的复杂性,我建议在每个分支的每个节点上显示某种模型评估度量。这将使竞争对手清楚地看到哪些型号表现良好,以及每个型号的改进速度。通过这种方式,竞争者将被激励去忽略那些没有什么希望去竞争奖项的模特;因此,导致这些分支被自动从树上剪掉,因为它们被大多数竞争者忽略了。也就是说,除非竞争对手有突破性的想法为某个表现不佳的分支做出贡献。最终,这将导致最好的想法激增,而次等的想法被留下并最终消亡。
好处:
- 工作时间分配的效率——“让您的钱花得更划算”
向开源架构的转变允许人们考虑、学习和建立在彼此的想法之上,这将重新引导无数个小时的竞争者通过简单地允许他们作为一个集体使用彼此的工作并从彼此的错误中学习来解决相同的琐碎任务。这将提高解决问题的速度,允许竞争者在未解决的问题上花费更多的时间,并最终产生对由奖励提供组织提出的问题的更好的解决方案。
2。大量积极、热情的贡献者
如前所述,我相信在任何标准的数据科学竞赛中,都有一大群参赛者致力于解决问题,因为他们喜欢这样做,也许是因为他们想建立一个投资组合,但看不到任何闯入奖池的可能性。因此,有一小部分竞争者热情而不知疲倦地追求他们的想法,因为他们在排行榜上有足够高的地位,使他们的时间值得。在我看来,在奖励结构中,任何贡献者在通往获奖模式的道路上的任何一步都因其出色的想法贡献而获得奖励,这将把竞争对手从以前的随意学习者群体转移到后者充满激情和不知疲倦的工作群体中。此外,这种结构将激励积极的贡献,而不是拖延。也就是说,如果一个贡献者在想法层次结构的早期对模型的一个分支进行了更新,并为其他人奠定了基础,则该贡献成为多个优秀模型的基础的可能性会增加,从而允许竞争者获得多个奖项的一部分。这将使竞争对手迫不及待地开发新的想法,而不是在最后一刻构建并提交他们的模型。
3。平等进入奖池(或至少更平等一点)
目前有一种设备门槛,如果没有达到,就会将竞争对手排除在获奖提交的竞争之外(特别是在需要深度学习的比赛中)。显然,对于竞争对手来说,获得一台拥有最新、最棒的 TPU 的高端数据科学机器,或者有足够的钱购买类似的云计算产品,仍将是一个巨大的优势。不过,在这种拟议的结构下,只有一台 Macbook Pro、买不起更强大机器的大学生至少可以贡献一些想法,如创新的预处理方法或引入其他人可能忽略的神经网络结构。这将扩大解决问题的集体思维,再次产生更好的解决方案。
潜在缺点:
我相信有很多,但我想到了这种结构的一些潜在挑战:
- 什么被认为是“新想法”?
例如,我们目前在树的一个分支上建立了一个模型,有人做了一个非常简单的调整,导致预测准确性的轻微增加。这是否被视为“新想法”并添加到树中?我认为要解决这个问题,我们必须定义一个“改进”,这个“改进”是由问题的相应评估标准量化的。如果我们创建一些规则,比如“如果得到的模型被改进了个百分点,那么一个分支只能被扩展为对先前模型的‘改进’”,请填写空白的个百分点。这样,我们对添加到树中的内容施加了某种限制,以确保琐碎的更改不会被考虑多次。
2。使用不同的编程语言
如果我们说不同的(编程)语言,我们如何相互协作?对于这个问题,我能想到的最好的解决方案是要么从一开始就宣布比赛的语言,要么可能将奖项分成几个不同的比赛,为最适合手头任务的少数几种语言中的每一种语言设立一个奖项。从好的方面来看,也许这可以帮助人们适应更多的编程语言,迫使他们探索其他语言,而不是让他们总是默认自己的偏好。
结论:
我希望作为这篇文章的结果,我不会被误导,不会被认为对数据科学竞赛有负面的看法;我一直很喜欢在线提供如此广泛的数据科学竞赛。我认为它们在解决问题和让研究人员从事他们感兴趣的项目方面都带来了巨大的好处。我最近在从事一项乏味的数据预处理工作时才想到,我目前花费数小时完成的任务已经或将被数百名其他竞争对手完成;但是由于比赛的性质,我们不允许互相帮助。我想,“我理解为什么我们不能为了竞争而分享想法,但是如果有一种方法可以让竞争完全开源,同时保持竞争方面的活力呢?这样,我们可以最大限度地提高效率,同时仍然允许金钱奖励来激励竞争对手解决问题,这也是奖励的目的。
这种结构可能存在一些我没有想到的问题,还有一些问题只有在实践中才会显现出来。但随着我们周围的一切越来越倾向于开源,并且在许多情况下产生了革命性的解决问题的效率,我不禁认为它在在线数据科学竞赛的世界中有一席之地。任何人在概念化这个想法后都可能有想法,请随意回应和分享,因为我知道有许多不同的途径可以探索。我很乐意听取社区的其他意见。
数据科学面试的问题是
为什么找工作这么难,该怎么办

21 世纪最混乱的工作
面试过程可能是数据科学家职业生涯中面临的最艰巨的任务。获得数据科学工作的压力和竞争非常激烈。除此之外,围绕数据科学的大肆宣传导致了围绕数据科学面试过程的大规模混乱。
近十年来,数据科学家一直是科技行业的宠儿。2012 年,《哈佛商业评论》(Harvard Business Review)将数据科学家称为“21 世纪最性感的工作”,这引发了一个尚未见顶的炒作周期。
求职者和雇主蜂拥而至,争相利用这种炒作,混淆了数据科学人才库。
成千上万的工程师、统计学家和分析师正在寻求向这一令人兴奋的新职业过渡,他们正在将自己重新定位为数据科学家。数百个新兵训练营和证书项目正在涌现,以帮助他们寻找答案。数十名招聘经理正努力从蜂拥而至的求职者中挑选最有前途的候选人。
数据科学面试的问题是
这种数据科学淘金热对面试过程有下游影响。困惑的招聘经理让数据科学家接受与数据科学技能不一致的面试。出于困惑或为了吸引人才,一些招聘经理将数据分析师和数据工程职位更名为数据科学。危险信号包括面试更多地关注计算机科学算法而不是机器学习算法,以及面试在 SQL 上花费更多时间而不是 scikit-learn。
像这样一两次糟糕的面试会让一个数据科学家花费数小时研究错误的主题。因此,候选人最终会被他们期望证明专业知识的大量科目淹没。
雪上加霜的是,对数据科学家的需求增长速度超过了高质量面试准备的供给。面试问题(有时还有答案)在网上很多地方都很容易找到。然而,还不清楚它们有多可信。
数据科学面试的解决方案
幸运的是,顶级公司正在向标准的数据科学面试流程靠拢。候选人的解决方案是对以下主题的问题做好充分准备:
- 机器学习
- Python 编程
- 数据争论
- 分析解决问题
- 统计数字
- 文化契合度
对于大多数公司来说,机器学习和统计部分是交易的破坏者,因为这些学科构成了机器学习的理论基础。python 和 SQL 等技术技能更容易学习,但如果数据科学家在统计学或机器学习方面很弱,这将是灾难性的。
对于统计学,考生应侧重于初级概念,如:
- 可能性
- 贝叶斯定理
- 正态分布
- 中心极限定理
- 假设检验
对于机器学习,考生应该了解一系列具有实际应用的主题,例如:
- 偏差-方差权衡
- 维度的诅咒
- 交叉验证
- 常见损失函数
- 适当的模型评估指标
大公司几乎总是在雇佣数据科学家。所以,候选人控制面试时间表。可能需要长达六个月的准备时间。
也就是说,拖着它没有意义。因此,准备数据科学面试需要多长时间取决于几个因素。
1)这是候选人的第一次数据科学面试吗?数据科学面试涵盖了很多领域。它们就像是工程和分析面试合二为一,还加入了一些机器学习。
2)面试的是大的科技公司吗?他们往往会有特别严格的面试,成功的门槛也很高。
3)复习练习题时,回答难度如何?候选人不仅要熟悉材料,还必须能够回忆起精确的定义并给出简明的答案。
尽管很难找到可靠的高质量面试准备来源,但一些资源已经开始出现。数据科学家可以通过像 Decode Data Science 这样的网站加速他们的面试,这个网站将数百次面试浓缩成典型的问题和答案,是由我这个拥有 8 年技术经验的招聘经理创建的。
GPT-3 报告的问题
双重选择偏差过滤了我们对 GPT-3 的看法

马克斯·兰格洛特在 Unsplash 上拍摄的照片
我最近在媒体和其他地方看到了大量关于 GPT-3 的文章。我甚至写了一首。语言模型是人工智能的一个重大发展,所以作家想与世界分享他们的兴奋是很自然的。
问题就在这里:GPT 3 的能力——即其写作质量——经常被公布的样本夸大。事实上,不是有一个,而是两个过滤器保持 AI 的最差结果不被广泛传播。
如果任何感兴趣的读者都可以访问 GPT-3 API 并对其能力进行自己的观察,那么选择偏差就不是问题了。然而,目前准入受到严重限制。( AI Dungeon 经常被我们这些没有完整版本的人用来测试 GPT 3,但它的创造者最近概述了防止后门进入 GPT 3 的方法。)
当报道——我用这个词最广义的解释来指任何关于 GPT-3 的文章——是公共信息的唯一来源时,在我们对产品的理解中应该考虑选择偏差。在这里,我概述了明显的偏见,以及加剧这一问题的不太明显的偏见。
1.写作样本是为了质量而选择的
假设我正在写一篇关于 GPT 3 号的信息性文章。我想证明它可以把连贯的句子串放在一起,所以我给它一个提示并检查输出。
如果我不喜欢我所看到的,我可能会用稍微不同的(也许更长的)提示再试一次。即使我没有主动选择适合我文章目的的特定句子,篡改输出会产生一个有偏见的写作样本,不能代表 GPT-3 的整体质量。
在创造一个关于人工智能的故事的背景下,展示它最好的作品比公平地展示它的局限性更有意义。这是第一个问题。
2.文章越酷,浏览量越多
考虑一下做的事情被写到 GPT-3 不能执行的功能的情况。它可能是一个写失败的列表,或者是不能编译的代码。
对我来说,这不会是一个有趣的作品,我怀疑它也不会引起其他人的兴趣。我确信推特、Reddit 帖子和详细描述 GPT 3 号意外失败的长篇文章就在那里,但事实是它们没有被阅读。
表面上看,这似乎不是问题。绝对没有必要去阅读所有 GPT-3 做不到的事情。真正的问题是,对于同样的任务,积极的结果比消极的结果更受青睐。例如,如果有人报告了让 GPT-3 编写法律文档的积极结果,这无疑会比人工智能无法生成连贯文档的情况受到更多的关注。
本质上,GPT-3 报告目前的工作方式类似于在没有预注册的情况下进行科学试验。发表偏倚,即统计上无关紧要的结果不被发表,会导致荒谬的发现被接受为可靠的研究。
要明确的是,我不认为作家有必要发表更多来自 GPT-3 的负面结果。然而,有义务将样本与它们产生的方式以及在这个过程中获得了多少负面结果联系起来。
毕竟,人类对人工智能输出的选择——在单个作品或更大的作品如何被消耗的层面上——是我们的智能和计算机程序的智能的结合,这是一件美好的事情。
数据科学中的编程
这也是关于编码的

桑德·德韦尔特在 Unsplash 上的照片
如果我们将数据科学(DS)分解为三个部分,我们将得到算法、编程和领域知识。这三个部分的重要性可能不相等;以领域知识为例,虽然它是构建有用的东西的基础,但它也与正在使用的数据紧密相关,因此与公司紧密相关,所以在开始处理特定数据之前,很难拥有领域知识。当然,拥有相同领域的经验会有很大帮助,但你仍需要了解该公司的数据文化。编程或算法就不一样了,但是让我们把重点放在本文的编程部分。
编程不是新事物,也不是公司特有的;迄今为止,有 245 种著名的编程语言。作为个人,选择一种编程语言来学习可能会令人生畏,因为有许多可能性,但选择该领域中最常用的语言可能会有所帮助。相反,作为一家公司,选择使用和编程语言可能要复杂得多,尤其是对于那些已经存在多年并且已经建立了许多系统的公司来说:这取决于公司文化、安全性、应用程序的复杂性、可伸缩性、与公司内部使用的工具的集成等等。在 DS 的特定情况下,除了所有其他方面,如库/包覆盖的内容、这些包的最新程度、数据存储的位置、与部署工具的兼容性(如果有的话)等等。然而,尽管可能性很大,但 DS 领域中最常用的编程语言还是有一个列表,其中三种我有经验的语言是 Python、Java 和 r。
计算机编程语言
Python 可能是最简单和最直观的编程语言。然而,这并不意味着它需要被低估或过于简化。到今天为止,它是 DS 社区中使用最多的编程语言。
Python 是一种面向对象的编程语言(OOPL ),它的内存分配和回收(垃圾收集器)方法是自动的。它还是一种运行时编程语言,这意味着源代码被翻译成字节码,而不是机器码,这使得它与平台无关。它也是一种动态类型语言,这意味着我们在编码时不需要声明变量的类型。然而,这也有不利的一面,它使得代码有风险,难以调试,有时还很慢。然而,对于 Python 超级极客(不幸的是,不是我)来说,存在着 Python 的 Cython, C 扩展,它旨在给出类似 C 的性能代码,这些代码大部分是用 Python 编写的,带有 C 附加语法。如果做得好,它可以大大加速你的代码。然而,如果代码写得不好,它会对执行速度造成很大的损害。我在这方面的知识不多,所以我只限于提一下。
Python 的最大优势在于,它使得寻找适用于您的数据的正确算法的实验部分变得非常容易和快速。根据没有免费的午餐定理,我们不知道对我们的数据使用的最佳模型,因此在短时间内尝试一种以上算法的可能性可以产生差异。考虑到现在这是 DS 社区中使用最多的语言,这也意味着它有许多实现了各种算法的库,这些库与最近的发展保持同步。作为最常用的编程语言也意味着它被大多数数据工程工具支持,用于商业问题解决方案的部署过程。Python 的另一个优势是可视化库,如 ggplot 、 matplotlib 、 plotly 和 seaborn ,这些库也使数据可视化成为一个优势。
Python 的另一个优势是 Jupyter Notebooks,这是一个基于 web 的交互式计算环境,用于开发和创建 Jupyter notebook 文档。这些笔记本易于使用,并且由于已经运行的代码单元的输出被存储,它们也可以用于呈现已经完成的工作。虽然笔记本电脑有利于原型开发,但它并没有考虑到可维护性或代码版本。使用笔记本时,代码的可重用性也很棘手。Python 语言的另一个麻烦是不同库的安装。我是说,谁没有遇到过 pip/conda 安装问题?
Java 语言(一种计算机语言,尤用于创建网站)
Java 不是闹着玩的。在开始用 Java 编程之前,您应该学习许多最佳实践和惯例,以理解事情是如何完成的,并正确地编码。代码需要非常结构化:有由类组成的包,每个类中都有变量和方法。有很多标准的命名约定是最好遵循的,类继承和设计模式都存在。就像 Python 一样是 OOPL。Java 的语法与 C 和 C++非常相似,它是一种静态类型语言,这意味着它要求你在使用变量之前声明变量的数据类型,如果代码包含错误,它将无法编译。它具有一次编写,随处运行的特性,这意味着编译后的 Java 代码可以在所有支持 Java 的平台上运行,而无需重新编译。它还具有自动内存管理功能,因此有一个自动垃圾收集器来处理使用中的内存。
至于对数据科学的关注,当在项目的初始阶段快速尝试不同的方法时,Java 的使用会受到限制。静态类型和良好结构意味着您必须从一开始就以指定的良好结构方式编写代码,这种方式失去了 Python 所允许的灵活性。然而,从长远来看,这是一个额外的收获,因为如果你从一开始就写好代码,你就不需要对你的代码做太多的重构。Java 的一个非常重要的特征是它有很高的执行速度,这在处理大量数据和应用计算量大的算法时是至关重要的。Java 的另一个巨大优势是,它在许多组织中用于创建后端系统和应用程序,并且它是 Oracle 支持的独特计算系统,这意味着易于集成和最小化兼容性问题。Fink、Hadoop、Hive 和 Spark 等著名工具也是用 Java 编写的。DS 的库的种类没有 Python 的多,但是它确实有像 Weka 3 这样的库。
稀有
如果我说 R 是我最不喜欢的语言,有数学学位的人会生气吗?你可能会,但没关系,因为你们可能是唯一使用它的人。好吧,我知道这不完全正确,因为 R 可能是 DS 社区中仅次于 Python 的第二大使用语言,但是统计学家和数学家似乎是唯一的 R 爱好者。
作为一种编程语言,r 对于从事数据分析和统计计算的统计学家来说是非常独特的。经常与 Python 相提并论,因为它的开源特性,它支持大多数操作系统的设计以及它的解释特性。以包的形式构建,这些包也可以由用户创建,并且有一个很大的社区来考虑这些包的有效性,该社区由超过 8,000 个网络贡献包组成。它提供了各种数据类型,如向量、矩阵、列表、数据框和因子,以及许多对它们进行巧妙转换的函数。
作为一种为统计模型和计算而设计的语言思想,它提供了许多数据操作,如分类和生成数据、修改、合并和精确分布数据集。R 提供了许多统计模型,许多分析师用 R 编写了他们的应用程序。R 中最常用的编码图形界面是 RStudio,它非常用户友好。正如我之前提到的,有很多包,也有相当多的包用于 DS 应用程序。R 的另一个优点是它也为数据可视化进行了优化。有些包,如 ggplot 和 plotly,与 Python 中的相同,但除此之外,使用 Shiny 和 Markdowns 这样的包,可以产生可视化效果,可以进行交互,这与 Power BI 或 Tableau 等其他复杂的可视化工具产生的仪表板非常相似。然而,这种语言的一个缺点是它不是很直观(向量索引从 1…开始)并且有一个很难理解的语法。这种编程语言的其他负面因素包括安全性差、占用大量内存、比其他编程语言慢以及算法分散在许多不同的包中。
很久以前,我曾经认为我只需要看 Cesaroni 或者其他在 Canale 5 或 Italia 1 播出的意大利语电视剧就能懂意大利语,但是后来我来到了意大利,我很难用意大利语交谈,因为我从来没有练习过。同样的原理也适用于任何编程语言。我对提到的三种编程语言的体验非常不同: Python 我从大学项目、硕士论文开始自学,然后在工作环境中,边学边学习最佳实践, Java 我从大学的一门结构良好的课程中学习,然后是一个实践项目,而 R 相反,我是在我的第一次工作经历中学习的,从对语言的简短介绍开始,然后是修改已经实现的包这就是说,学习编程语言几乎没有绝对正确或错误的方法,但我在学习计算机科学和工作经验 5 年后意识到两件事:
- 实践经验是关键。印刷品(“Hello”)的例子只是一个开始,但遗憾的是,要想说一口流利的编程语言,你需要的远不止这些
- 理解引擎盖下发生的事情也很重要。在某些时候,您将需要了解代码中的瓶颈在哪里,了解一些编程语言的工作原理会有很大帮助
困难时期的数据承诺
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
其他几个更有权威的作者也写过名为“新冠肺炎”的黑天鹅事件及其影响。当我写这篇文章的时候,全世界大约有 290 万病例,20 万人死亡。199 个国家的人民受到了影响。
近年来,技术和商业界非常重视人工智能——它是一只神奇的独角兽,将改变人类生活的方方面面。那么在目前的情况下,人工智能到底帮了多大的忙呢?
早期赢家:加拿大健康监测初创公司蓝点是世界上首批准确识别新冠肺炎病毒传播及其风险的公司之一,据美国消费者新闻与商业频道报道。12 月下旬,这家初创公司的人工智能软件在中国武汉发现了一系列不寻常的肺炎病例,并预测了病毒下一步可能的去向。也许这些预测应该得到更多的关注。
数据科学拯救世界:
新冠肺炎开放研究数据集 (CORD-19),一项基于西雅图艾伦人工智能研究所(AI2) 语义学者项目的倡议,使用自然语言处理以前所未有的速度分析数万篇科学研究论文。该数据集为世界各地的数据科学家提供了展示其自然语言处理和文本挖掘能力的机会。

新冠肺炎开放研究数据集。来源:Kaggle
理?医学研究人员和科学家必须从所有这些研究中迅速收集共同点,以找出病毒的解决方案。
在该数据集于 3 月 16 日发布的四天内,它收到了超过 594,000 次浏览和 183 次分析。
然后是 COVID global forecasting —一个用于预测分析和数据可视化的数据分析巨头。“在这个挑战中,你将预测在未来的天,世界各地的累计确诊新冠肺炎病例数,以及由此导致的死亡人数。”
这又是一个数据专家应用所有奇妙的预测和预报技术的真实舞台。让我们看一个例子:

使用 Matplotlib 创建的新冠肺炎一段时间内全球确诊病例和死亡病例图。信用:https://www . ka ggle . com/corochann/新冠肺炎-EDA-with-recent-update-on-April
我,机器人

一台 InTouch 宋含远程保健机器,就像在华盛顿州埃弗雷特治疗病人的机器。(InTouch 照片)
人们可以通过 Alexa 订购杂货,而无需踏进商店。机器人正在取代医院的临床医生,帮助消毒房间,提供远程医疗服务,以及处理和分析新冠肺炎测试样本。医生们甚至使用机器人来治疗华盛顿州埃弗雷特市第一个被诊断患有新冠肺炎的人。,据守护。
撇开机器人不谈:面对人员短缺和不堪重负的病人数量,越来越多的医院转向自动化工具来帮助他们管理疫情。
例如,基于人工智能视觉的工具可以快速将 x 射线分为新冠肺炎阳性或阴性,可以节省专家的工作时间,并节省患者更多的等待时间。具有元数据管理的端到端人工智能工作流可以更进一步,轻松地对已经推理的数据进行分类。查看本次网络研讨会,内容是关于在中断时使用计算机视觉和元数据管理存储。
科技巨头
许多科技巨头已经提供了他们的数据产品和专业知识来帮助减轻危机的影响。例如:
IBM 将免费提供沃森助手 90 天:为了帮助解决新冠肺炎周围的情况,IBM 将免费提供沃森助手(用于构建虚拟助手的对话式人工智能平台)至少 90 天。它经过培训,能够直接利用美国疾病预防控制中心的指导,理解并回答常见的新冠肺炎问题,并且可以轻松集成到现有的网络或电话渠道中。
微软正在动员他们的人工智能促进健康计划,专注于帮助那些在新冠肺炎研究第一线的人。这是一项慈善倡议,旨在加速医学研究,提供全球健康见解,并改善得不到充分服务的人群获得健康的机会。
谷歌最近推出了一个人工智能聊天机器人,名为快速反应虚拟代理程序,它将提供信息与新冠肺炎疫情战斗,正如谷歌博客中宣布的那样。谷歌还与苹果合作开发了新冠肺炎联系人追踪技术。
脸书·艾与纽约大学的库兰特数学科学研究所合作,创建了新冠肺炎病毒传播的本地化预测模型。这些本地预测可以帮助特定县的医疗服务提供者和紧急响应者决定如何最好地分配他们的资源(例如,决定何时调整诊所的人员安排以应对预期的患者增加)。
在我们面临的最大的全球危机之一中,人工智能如何被用来帮助人类的例子还有很多。
*赢家——卫生纸?😗
不要问数据科学能为你做什么,要问你能为数据科学做什么?
想想看:纸巾产品制造商金佰利公司的股价最近上涨了 2%,相比之下,道琼斯工业平均指数和标准普尔 500 指数分别下跌了两位数。这是因为危机期间卫生纸需求激增。
这场危机的一个影响或许更值得关注,那就是对预测模型的影响。新冠肺炎导致了对旅行和旅游、购物中心和餐馆/酒吧的需求出现大规模异常的负峰值。另一方面,对卫生纸、消毒剂、方便面和杂货等商品的需求出现了异常增长。问题是:如果公司一直使用历史数据来预测销售、库存需求和人员配备,这些峰值会如何影响预测?
我将在以后的博客中探讨这个话题。
现在,让我们恭敬地得出结论,数据正在实现其帮助人类应对异常困难时期的承诺。
在 Kubernetes 上运行 Apache Spark 的利与弊
Kubernetes 对 Spark 的支持是最近才添加的。它与其他部署模式相比如何,是否值得?

传统软件工程正在向 k8s 转移。Spark 会跟进吗?(照片由法比奥、昂斯佩什拍摄)
Apache Spark 是一个开源的分布式计算框架。在几行代码(Scala、Python、SQL 或 R)中,数据科学家或工程师定义了可以处理大量数据的应用程序,引发了在一个机器集群上并行化工作的关注。
Spark 本身并不管理这些机器。它需要一个集群管理器(有时也称为调度器)。主要的集群管理器有:
- 独立:简单的集群管理器,功能有限,内置 Spark。
- Apache Mesos:一个开源集群管理器,曾经流行于大数据工作负载(不仅仅是 Spark ),但在过去几年中逐渐衰落。
- Hadoop YARN:基于 JVM 的 Hadoop 集群管理器,于 2012 年发布,是迄今为止最常用的集群管理器,用于内部部署(例如 Cloudera、MapR)和云部署(例如 EMR、Dataproc、HDInsight)。
- Kubernetes:从 Spark 2.3 (2018)版本开始,Spark 就在 Kubernetes 上原生运行。这种部署模式正迅速获得企业的支持(谷歌、Palantir、红帽、彭博、Lyft)。Spark-on-k8s 被标记为实验性的(从 Spark 3.0 开始),但将在 Spark 3.1 中宣布量产就绪(将于 2020 年 12 月发布)!
作为这个街区的新成员,Kubernetes 有很多宣传。在本文中,我们将解释 Spark-on-k8s 的核心概念,并评估这种新部署模型的优点和缺点。
核心概念
你可以使用 spark-submit 或者使用 spark-operator 提交 Spark 应用程序——后者是我们的首选,但是我们将在未来的教程帖子中讨论它。该请求包含您的完整应用程序配置,包括要运行的代码和依赖项(打包为 docker 映像或通过 URIs 指定)、基础设施参数(例如分配给每个 Spark 执行器的内存、CPU 和存储卷规格)以及 Spark 配置。
Kubernetes 接受这个请求,并在一个 Kubernetes pod 中启动 Spark 驱动程序(一个 k8s 抽象,在本例中只是一个 docker 容器)。然后,Spark 驱动程序可以直接与 Kubernetes master 对话,请求 executor pods,如果启用了动态分配,就可以根据负载在运行时放大和缩小它们。Kubernetes 负责将 pod 打包到 Kubernetes 节点(物理虚拟机)上,并将动态扩展各种节点池以满足需求。
再深入一点,Kubernetes 对 Spark 的支持主要依赖于位于 Spark 驱动程序中的KubernetesClusterSchedulerBackend。
这个类跟踪当前注册的执行器数量,以及期望的执行器总数(从固定大小的配置或从动态分配)。每隔一段时间(由spark . kubernetes . allocation . batch . delay配置),它将请求创建或删除 executor pods,并在发出其他请求之前等待该请求完成。因此,这个类实现了 Kubernetes 爱好者所珍视的“期望状态原则”,更喜欢声明性语句而不是命令性语句。
Spark 对 Kubernetes 的利弊
1.集装箱化
向容器(Docker containers)的转移是 Kubernetes 最初如此受欢迎的原因。软件工程世界中容器化的好处同样适用于大数据世界和 Spark。它们使您的应用程序更具可移植性,它们简化了依赖项的打包,它们支持可重复且可靠的构建工作流。
为 Spark 使用 Docker 容器的三大好处:
1)一次构建依赖项,随处运行(本地或大规模)
2)使 Spark 更加可靠和经济。
3)将您的迭代周期加快 10 倍(在 Data Mechanics,我们的用户定期报告将他们的 Spark 开发工作流程从 5 分钟或更长时间缩短到不到 30 秒)
我最喜欢的好处是依赖管理,因为众所周知,Spark 非常痛苦。您可以选择为每个应用程序构建一个新的 docker 映像,或者使用一个较小的 docker 映像集来打包您所需的大多数库,并在上面动态添加您特定于应用程序的代码。告别每次应用程序启动时编译 C-library 的冗长的 init 脚本。
更新(2021 年 4 月):我们已经公开了优化的 Docker 图像,供任何人使用。它们包含最常用数据源的连接器——我们希望它们开箱即用!查看我们的博客文章和我们的 Dockerhub 页面了解更多详情?
2.高效的资源共享带来巨大的成本节约
在其他集群管理器(YARN、Standalone、Mesos)上,如果您想为并发 Spark 应用程序重用同一个集群(出于成本原因),您必须在隔离性上做出妥协:
- 依赖隔离。您的应用程序将拥有一个全球 Spark 和 python 版本,共享库和环境。
- 性能隔离。如果其他人开始一项大工作,我的工作可能会运行得更慢。
因此,许多平台(Databricks、EMR、Dataproc 等)都推荐为生产作业运行瞬态集群。启动群集,运行作业,终止群集。这种方法的问题是,您需要支付安装/拆卸成本(通常大约 10 分钟,因为正确安装 YARN 需要很多时间),并且您没有获得任何资源共享。使用这种方法很容易出错并浪费大量计算资源。

Spark-on-Kubernetes 为您提供了两个世界的精华:完全隔离和强大的资源共享。
Kubernetes 上的 Spark 为您提供了两个世界的精华。您可以在一个 Kubernetes 集群上运行所有应用程序,每个应用程序都可以选择自己的 Spark 版本、python 版本和依赖关系——您可以控制 Docker 映像。在 10 秒钟内,Kubernetes 可以拆除一个应用程序的容器,并将资源重新分配给另一个应用程序。这非常高效——在 Data Mechanics,当客户从其他平台迁移时,我们通常可以为他们节省 50%到 75%的成本。
也很方便。有了集群自动扩展(完全在 Data Mechanics 平台上为您管理),您可以不必再考虑集群和虚拟机,只需以无服务器的方式使用 Spark。告别复杂的集群管理、队列和 YARN 部署的多租户权衡!
3.丰富生态系统中的集成

由 Spotinst 建造的丰富的 Kubernetes 生态系统的代表
在 Kubernetes 上部署 Spark 可以免费为您提供强大的功能,例如使用名称空间和配额进行多租户控制,以及基于角色的访问控制(可以选择与您的云提供商 IAM 集成)来实现细粒度的安全性和数据访问。
如果您有 k8s 范围之外的需求,该社区非常活跃,您很可能会找到满足这一需求的工具。如果您已经将 Kubernetes 用于堆栈的其余部分,这一点尤为重要,因为您可能会重用现有的工具,例如用于基本日志记录和管理的 k8s dashboard,以及用于监控的 Prometheus + Grafana。
中性火花性能是相同的
我们运行了基准测试,证明在 Kubernetes 上运行 Spark 和在 YARN 上运行 Spark 之间没有性能差异。
在我们的博客帖子— 中,Apache Spark 性能基准测试显示 Kubernetes 已经赶上了 YARN —我们回顾了基准测试的设置、结果以及在 Kubernetes 上运行 Spark 时最大化 shuffle 性能的关键技巧。
尽管 Spark 的原始性能是相同的,但正如我们前面提到的,通过迁移到 Kubernetes 上的 Spark,您可以节省大量成本。阅读一位客户的故事,他通过从 YARN (EMR)迁移到 Spark-on-Kubernetes(数据力学)降低了 65%的成本。Kubernetes 上 Spark 的缺点
1.让 Spark-on-k8s 大规模可靠需要时间和专业知识
如果你是 Kubernetes 的新手,它引入的新语言、抽象和工具可能会让你感到害怕,并让你偏离你的核心任务。即使你已经有了 Kubernetes 的专业知识,还有很多东西需要建立:
- 创建和配置 Kubernetes 集群及其节点池
- 设置 spark-operator 和 k8s 自动定标器(可选,但推荐)
- 设置 docker 注册表,并创建一个过程来打包您的依赖项
- 建立一个 Spark 历史服务器(在一个应用完成后查看 Spark UI,尽管 Data Mechanics Delight 可以避免这个麻烦)
- 设置您的日志记录、监控和安全工具
- 为 Kubernetes 优化应用配置和 I/O
- 在集群上启用定点/可抢占节点(可选,但推荐)
- 构建与您的笔记本电脑和/或日程安排程序的集成
这就是我们建立数据机制的原因——负责所有的设置,并使 Kubernetes 上的 Spark 易于使用且具有成本效益。查看Kubernetes 开源平台上的数据机制如何改进 Spark以了解我们的平台在开源基础上提供了什么。
2.您应该运行最新的 Spark 版本

库伯内特斯星火项目的改进时间表
Kubernetes 上对 Spark 的最初支持始于 2018 年 2 月的 Spark 2.3,但该版本缺乏关键功能。在 Data Mechanics,我们只支持 Spark 2.4 及以上版本。我们强烈建议使用:
- Spark 3.0 及以上版本:受益于动态分配——每个 Spark 应用程序能够根据负载动态添加和删除 Spark 执行器。如果你打算以交互方式(从笔记本)使用 Spark,这个特性非常重要。这是使它们具有成本效益的唯一方法。
- Spark 3.1 及更高版本:Spark-on-Kubernetes 已正式宣布正式上市,并准备好投入生产——阅读我们的文章深入了解 Spark 3.1 版本。除了强大的功能之外,它还带来了关键的稳定性和性能改进,如 Spark 能够预测定点清除,并在执行器被中断之前优雅地关闭执行器(不会丢失它们的 shuffle 和缓存数据)。
结论——你应该开始吗?
过去几年,传统软件工程已经转向云原生容器化,不可否认的是,大数据工作负载也在发生类似的转变。事实上,随着即将到来的 Spark 版本(3.1,将于 2020 年 12 月发布),Kubernetes 上的 Spark 将在官方文件中标记为正式可用和生产就绪。
是否意味着每个数据团队都应该成为 Kubernetes 专家?不,这是我们建立数据机制的原因,这是一个托管的 Spark 平台,部署在我们客户云账户(AWS、GCP 和 Azure)内的 Kubernetes 上。
我们已经帮助许多客户在 Kubernetes 上运行 Spark,无论是为新的 Spark 项目,还是作为从基于 YARN 的基础设施迁移的一部分。我们负责所有的设置和维护,我们的平台在开源版本的基础上添加了直观的用户界面、笔记本和调度程序集成以及动态优化,使 Kubernetes 上的 Spark 更易于使用,更具成本效益。
好奇想了解更多?访问我们的网站和与我们一起预订一个演示来开始吧。
更喜欢用开源的方式自己构建这个?查看我们关于如何在 Kubernetes 上设置、管理&监视器 Spark 的高级指南。
修剪基数 Trie——类固醇上的基数 Trie

照片由 niko photos
修剪基数三叉树是一种新的数据结构,从基数三叉树派生而来,但是速度快了 3 个数量级。
在我发表了 SymSpell (一种非常快速的拼写纠正算法)之后,我经常被问到它是否也可以用于自动补全。不幸的是,尽管速度很快,SymSpell 并不是自动完成的好选择。基数 Trie 似乎是自动完成的自然选择。但是在大字典中查找一个小前缀——导致大量的候选字——速度不够快。因此,我设计了修剪基数 Trie -一个自动完成的解决方案的速度与 SymSpell。
一个基数 Trie 或 Patricia Trie 是一个空间优化的 Trie(前缀树)。运行基数 trie 的 P
算法是一种新的基数 trie 算法,它允许修剪基数 trie 的和提前终止查找的。
在基数 Trie 中,查找是 O(k) ,其中 k 是密钥的长度。虽然这非常快,但不幸的是,这仅适用于单个术语查找。查找给定前缀的所有术语(或最相关的前 k 个)是更昂贵的——这是自动完成所需的操作。
特别是对于短前缀,我们必须遍历整个树的重要部分,以便找到所有的或识别前 k 个最相关的候选。
包含数百万条短前缀建议的完整结果集对自动补全毫无帮助。这就是为什么在大多数情况下,我们对给定前缀的所有子词的完整集合不感兴趣,而只对最相关的前 k 个词感兴趣。我们可以利用这一事实来实现 top-k 结果的查找时间的大幅减少。通过用关于所有其子节点的最大等级的附加信息来扩充 trie 节点数据结构,我们可以实现 trie 遍历的修剪和提前终止。
通过在每个节点中存储其所有子节点的最大等级来实现查找加速。通过将该最大子等级与迄今检索到的结果的最低等级进行比较,我们可以大量修剪 trie 并对具有低子等级的无希望分支进行提前终止查找。
更新:在一个 Reddit 评论 有一种误解,认为对于前 10 条建议,人们只需要在字典中查找 10 次。小心,没那么简单!为了获得前 10 个最相关的自动完成建议,仅仅在 600 万条目字典中进行 10 次查找是不够的。在 trie 的默认教科书实现中,对于作为输入的单字符前缀“m ”,我们必须遍历整个树的重要部分,并且 评估以“m”开头的所有 459,735 个候选项 ,因为 我们不想要仅仅 10 个随机建议而是那些具有最高等级的(T24)这就是修剪基数 trie 的改进之处。通过存储和利用一个节点的所有子节点的最大等级,我们可以大规模地修剪 trie 并进行提前终止。这使我们可以减少我们必须遍历的节点数,我们可以减少候选节点数,从 459,735,T34,T36 到 T37,T38,T39,110,T40,T41,T42!**
词典
Terms.txt 包含 600 万个来源于英文维基百科标题的单字母词和双字母词,使用术语频率计数进行排名。但是你可以为你选择的任何语言和领域使用任何频率字典。
表演

修剪基数 Trie 比普通基数 Trie快 1000 倍*。*
应用:
PruningRadixTrie 非常适合自动完成或查询完成。
虽然对于一个单用户来说,37 毫秒的自动完成时间似乎足够快了,但如果我们必须并行地为数以千计的用户提供服务,例如在搜索引擎和搜索 API 中,情况就完全不同了。那么大型字典中的自动完成查找只有在比普通的基数 trie 快得多的情况下才变得可行。
自动完成与拼写纠正
这两个概念是相关的,而且有些相似。这就是为什么有时很容易使用一种旨在解决拼写纠正的数据结构来实现自动完成,反之亦然。但这不是个好主意。
滥用拼写纠正来实现自动完成
通常,我们期望从自动完成的中为任何给定的前缀找到最可能的单词,即使前缀是短的,而完成的单词是长的。然后输入和输出之间的编辑距离变大——当试图使用自动完成的拼写校正算法时,这会导致两个问题:
- 查找时间变得不可行巨大,因为用 Levenshtein 算法计算大编辑距离非常耗时。即使是像 SymSpell 这样速度极快的拼写纠正算法,也很难在合理的时间内返回“Microsoft Windows”作为“mi”前缀,并且不会用数千个无意义的候选项稀释返回的建议。
- 对于一个大的最大编辑距离,返回的候选人数量压倒性违背了提供帮助的目的。由于最大编辑距离将大于给定输入前缀的长度,大多数返回的候选项甚至没有一个与输入前缀相同的字母。
滥用自动完成功能进行拼写纠正
另一方面,从拼写纠正,我们期望纠正所有错误,直到最大编辑距离,甚至如果错误出现在第一个字母中。则根本没有公共前缀,使得使用 trie(前缀树)进行拼写纠正变得不可能。
拼写纠正自动完成的组合
最终,我们可以将两种算法结合起来,例如在 SeekStorm 这样的搜索引擎的查询领域。但如何有效地做到这一点,那是另一回事。
其他选项
除了使用修剪基数 Trie 之外,还有其他方法可以加速自动建议:
- 仅在前缀长度阈值(例如≥3)以上时启用自动完成,因为在 trie 中查找短前缀的时间特别长,并且候选建议的精度很低。
- 对低于前缀长度阈值(例如≤3)的每个前缀使用具有预先计算的 top-k 建议的哈希映射,因为短前缀的查找时间特别长,并且前缀的数量有限,并且哈希映射中的存储器消耗是可管理的
源代码
在 GithubGithub的 MIT 许可下,C#代码已经作为开源代码发布
水泵和人工智能:人工智能会扼杀还是创造就业机会?
关注工业革命可以帮助我们理解人工智能的前景和下个世纪的就业市场。

如何调和人工智能创新和有史以来最低的失业率?
美国失业率创历史新低,甚至包括不包括在官方失业率中的兼职和沮丧的工人。经济学家称这种情况为充分就业——每个愿意工作的人实际上都在工作。但是随着人工智能的出现,这种情况可持续吗?
为了分析未来,我们需要回顾过去。整整 322 年前的 1698 年,第一台自动化机器被制造出来。它彻底改变了世界,标志着工业革命的开始。发明者是英国工程师托马斯·萨弗里,他申请了专利并制造了一台蒸汽泵。萨弗里称之为“矿工的朋友”。名字设计得很好。

萨维里写给国王的书,书中他回答了对他发明的反对意见。
随着地下采矿过程的进行,这种泵被用来将水从矿井中抽出。以前,水是由数百名工人用水桶运出去的。挑战在于如何让工人和政府相信新机器不会扼杀就业机会。萨维里给英格兰国王写了一本书,他在书中写道:“我的设计不是……通过这项发明来歧视工匠或……任何种类的人;相反,是为了全人类的利益和好处,特别是我自己国家的人民;”【1】
萨弗里的机器不成功也不实用。但他的继任者,如托马斯·纽科门,在 1712 年改进了,这是蒸汽动力和后来的内燃机新时代的开始。

矿工的朋友:萨弗里的蒸汽泵
因此,回顾三个世纪前,我们可以问自己这样一个问题:萨弗里是对的吗——他的发明对他的国家有帮助吗?此外,它没有伤害工人吗?
有很多方法可以解决这些问题,但不可否认的是,没有泵或发动机,现代世界是不可能的,对吗?这些机器是最重要的工具,广泛用于帮助工人和家庭旅行、建造房屋和摩天大楼,甚至帮助治疗疾病。
工业革命无疑改变了工作类型、贸易关系、社会组织,并引入了城市生活。然而,工业革命期间的失业率大多很低,包括臭名昭著的童工。蒸汽泵创造了一个环境,它被用作解决现实世界问题的工具。
艾是我们今天矿工的朋友。人工智能将改变一切,引入自主革命,就像工业革命中创造的蒸汽泵一样。在我看来,失业问题已经解决——人工智能将改变就业市场,但不会扼杀就业。当然,在过渡期和周期性阶段,失业率将会上升(这是必须的,因为它不可能进一步下降)。

人工智能图表趋势。从各方面来看,人工智能都在上升。
人工智能发表的论文创历史新高,人工智能工作岗位创历史新高,人工智能课程注册人数飙升,开发人工智能的初创公司呈指数增长。尽管如此,失业率仍处于历史最低水平。
AI 不能承担失业的责任,但缺乏忽视技术教育重要性的政策和创造人与企业之间流动关系的法规。重要的问题不是人工智能是否会扼杀就业,而是我们如何确保人工智能将被用于社会进步,以及如何创造这些条件。
【1】托马斯·萨弗里。(1702). 矿工的朋友 :或者是一台以火升水的发动机。伦敦:为 s .克劳奇印刷,在康希尔教皇头巷的拐角处;再版,1827 年。
受限人工神经网络对幸福的追求
学会在茶、书和网络中快乐。反思我们对幸福的追求。PyTorch、NumPy、Scikit-learn 和 TensorBoard 的有趣项目。

我的桌子。一个宁静的时刻。
动机
灰尘总是会找到它的路,来到被遗弃的地方,被遗忘已久的书架,旧书,以及这个世界已经离开的所有被忽视的空间。在硬盘的虚拟世界中,这肯定没有什么不同。被遗忘的文件夹里的旧文件肯定有一层层看不见的灰尘覆盖着。
当我终于再次拿起这个项目时,感觉好像灰尘已经积满了它。不是因为疏忽,我只是走了很多弯路才最终回到我离开的地方。
它最初完全在 NumPy 中实现,并打算成为我的从头开始的神经网络项目的一部分。但是那个项目的范围已经够大了。在那个项目结束后,我经历了一场我认为是自己造成的信任危机。我有什么资格宣称可以教任何人任何东西?这驱使我在我的白板上走上了一条狂热的分化之路,几天来,我在雅各宾派的行列之间理清我的道路,几天来,让 PyTorch 签名作证,因为我向自己证明了我的价值。
最重要的是,我最终向自己证明,我的努力一定有更高的目标。这让我重新开始写作。不是因为我觉得我值得教书。而是因为我看到了我想改变的东西。我看到来自不同背景的人渴望学习人工智能,但对涉及的数学感到害怕。一般来说,人们很乐意学习,只要这些材料是可访问的。所以我写了这篇文章,试图让神经网络的数学读者友好和容易理解。我写了在这个项目中我们将在神经网络内部使用的所有函数。我解释了如何区分它们,它们的输入和输出看起来像什么和意味着什么,以及如何从头开始实现它们或使用 PyTorch。
在完成了这个项目所需要的基础知识之后,我觉得回到这个项目上来才是正确的。这是我让学习变得有趣的持续旅程。因为生活已经够艰难了,你不需要为了学习而承受更多的痛苦。
我们将创建自己的数据集,并建立一个神经网络,根据幸福所拥有的东西对幸福进行分类。这也将是一种深刻的内省,反思追求幸福对我们意味着什么。我所有的欢呼和希望,你喜欢这个旅程。
创建“坐月子的快乐”数据集
“我多年来一直在寻找理想的地方。我得出的结论是,我能找到它的唯一方法就是成为它。”——【艾伦瓦
通常情况下,感到幸福是一个人做出的选择。当我们既不快乐也不悲伤时,定义快乐的任务就落在了我们身上。这些术语因人而异。虽然我们中的一些人认为真正的幸福是无条件的,但许多人在追求幸福的过程中还需要满足一长串条件。
对于我们项目的神经网络来说,生活简单得足以让以下条件成为通往快乐的唯一垫脚石:
- 茶的理想温度区间。
- 快速互联网连接。
- 有趣的书。
如果这三项中至少有两项得到满足,神经网络应该会输出一个快乐的状态。更具体地说,我们将理想的茶温度定义为大于或等于 30℃且低于 60℃

30°C 的阈值是任意选择的。相比之下,这项研究支持 60 摄氏度的阈值,该研究发现偏好高于 60 摄氏度的热饮与消化系统疾病有关。
我们将网速定义为大于或等于 20 Mbps。再次任意选择,欢迎你选择不同的门槛。

关于书籍,我们会说有两类。神经网络喜欢的书会被标为 1。而它不喜欢的书将被标记为 0。

表达我们的感受不是一件容易的事情。许多感觉每时每刻都交织在一起。每种感觉都有自己的子感觉谱。看着尝试将感情的连续空间离散化,确实令人着迷。然而,为了简单起见,我们将假设我们的神经网络将快乐视为二进制。不是开心就是不开心。我们给不快乐贴上 0 的标签。我们用 1 来标记幸福。

记住这些原则,我们可以实现生成数据集的代码。以下代码随机生成 2000 个冷、热、烧茶温度。然后 3000 慢和快网速措施。其次是另外 3000 本不喜欢和喜欢的书。最后是 500 个不开心和开心的标签。
创建数据集时的一个主要关注点是使其平衡。我们必须确保每种特征的组合都被同等地表现出来。一个茶温,一个网速,一种书,有 12 种可能的组合。我们将为每个组合创建 500 个实例。然后,根据一个实例是否具有多数理想属性,我们将分配相应的幸福标签。因此,我们的数据集将有 4 列要素和 6000 行实例。
下面的代码可以分为两个主要部分:列的垂直连接,后面是行的水平连接。在第一部分中,创建了 12 个特征组合,每个组合有 500 行。在第二部分中,所有行的最终连接为我们提供了一个包含 6000 行的完整数据集。这里可以找到详细的实现。
分割数据集
我们现在将数据集分成训练集、验证集和测试集。Scikit-learn 的方法 train_test_split() 将为我们的数据行提供额外的好处。
使标准化
为了标准化我们的数据集,我们将使用 Scikit-learn 中的类 StandardScaler 。我们必须小心,仅在训练集上安装标准缩放器。我们也不想标准化一次性编码的分类列。因此,下面的代码标准化了前两列(茶水温度和互联网速度)。然后将标准化输出与最后两列(书籍和快乐)连接起来。
将 NumPy 转换为 PyTorch 数据加载器
在我们认为我们的数据已经完全准备好之前,只剩下几个步骤:
- 我们必须使我们的数据集与我们的神经网络可以接受的输入兼容。
- 我们必须能够从用于训练的训练集,以及用于评估的验证和测试集中加载小批量的神经网络。
我们首先将数据从 NumPy 数组转换为 PyTorch 张量。之后,我们将使用每个张量创建一个 TensorDataset。最后,我们将把每个 TensorDataset 转换成一个具有特定小批量大小的数据加载器。
坐月子的快乐数据集已经准备好了。我们已经准备好最终见到受限的神经网络。
受限神经网络

架构:3 个输入,带 ReLU 激活的线性层,带 Softmax 激活的线性层,2 个输出。
受限神经网络将具有输入层,接着是线性层和 ReLU 激活,接着是另一个线性层和 Softmax 激活。第一个输出神经元将存储输入描述不愉快状态的概率。第二个神经元将存储快乐状态的等效概率。
以下代码将该架构实现为一个名为 Network 的类:
注意:你可能已经注意到了网络类不包括任何 Softmax 激活。原因是在 PyTorch 中, CrossEntropyLoss 在计算其负 log loss 之前先计算 Softmax。我们将在下一节讨论这个问题。
培养
在我们继续训练神经网络之前,我们必须选择一个学习速率和若干个时期。我们还必须定义一个优化算法和一个损失函数。损失函数将是交叉熵损失。现在,我们从随机梯度下降优化器开始。
也许这里最令人兴奋的部分是,我们将使用 TensorBoard 来可视化我们的神经网络的训练。作为 PyTorch 的狂热用户,得知我仍然可以利用 TensorBoard 进行可视化对我来说是个好消息。更让我兴奋的是,我得知 TensorBoard 的一个扩展将它集成到了 Colab 笔记本中。
如果你有兴趣学习如何在 Colab 笔记本中设置 TensorBoard,我强烈建议你查看我的笔记本中标题为 TensorBoard 的部分。以下代码训练我们的神经网络,并可视化训练和验证损失的进度:
你会注意到在上面的代码中,我们使用一个名为 summary 的对象来调用方法 scalar 。使用 TensorBoard 的基本思想是首先指定一些日志目录。在这些目录中,我们创建了将被 TensorBoard 读取的文件。这些文件被称为摘要文件编写者。在上面的代码中, train_summary_writer 和 valid_summary_writer 都是摘要文件编写器。通过调用方法 scalar ,我们在适当的摘要文件中写入每个时期的损失值。然后,TensorBoard 读取该文件,并通过交互式界面方便地显示出来。


TensorBoard:训练和验证损失。
一些可以尝试的改进:
- 增加纪元的数量。
- 增加隐藏层的大小。
- 用 Adam 优化替换 SGD。
你可以在这里找到这些改进的详细实现。
估价
在本节中,我们将重点关注使用不同的指标来评估我们的模型。
- 我们首先对测试集中的一小批进行预测,以检查我们的模型的性能。
- 接下来,我们对整个测试集进行预测,并聚合输出概率和预测。
- 然后我们使用 TensorBoard 为我们的类绘制精确召回曲线。
- 我们实现了自己的混淆矩阵方法,不仅返回通常的矩阵,还返回模型出错的实例的索引。
- 我们计算模型的精确度、召回率和准确度。
- 最后,我们使用从我们的混淆矩阵方法返回的指标来检查不正确的情况,并了解神经网络的弱点。
做预测
除了对测试集进行预测之外,我们还对检查我们模型的输出和理解幕后发生的事情感兴趣。为了实现这两个目标,我们实施了以下步骤:
- 我们为测试集创建一个批量大小为 3 的数据加载器。我们将批量限制为 3 个,这样我们就可以检查而不会感到不知所措。
- 我们将 3 个实例前馈到我们的网络,并将结果存储在一个名为 linout 的变量中,表示模型的第二个线性输出。
- 我们使用 PyTorch 方法 softmax 计算每个实例的概率。softmax 的输出存储在名为 prob 的变量中。
- 我们希望我们的模型预测概率最高的类别。方法 max 可以返回最高概率及其指标。我们只对索引感兴趣,它存储在变量 pred 中。
我们的结果看起来很有希望。前三个预测是正确的,softmax 概率表明该模型对正确的输出非常有信心。
与其说是实际需要,不如说是为了学习,让我们为我们的类绘制精确召回曲线。我们对测试集的其余部分应用上述步骤,然后我们连接每批的所有概率和所有预测。有了这些概率和预测,我们可以很容易地用方法 add_pr_curve 为我们的类绘制精确召回曲线。我依靠这个官方 PyTorch 教程来完成以下剧情的实现:


每一类的精确召回曲线。
我们的结果再一次非常理想。我们得到了一个完美分类器的精确召回曲线。善意的提醒,这是一个有趣且感觉良好的项目,这里的目的是在娱乐的同时学习和实践。
混淆矩阵
计算混淆矩阵已经很有见地了,但是我们还要更进一步。我们的方法将返回带有真阳性、假阳性、真阴性和假阴性的常见混淆矩阵。此外,它还将返回错误案例的索引,以供以后检查。
为了避免代码过多,这里有一个链接到混淆矩阵方法的实现。该方法的输出是:

神经网络的混淆矩阵。
精确度、召回率和准确度
根据混淆矩阵方法的结果,我们可以很容易地计算出我们的神经网络的精确度、召回率和准确度。
- 我们模型的精度是 0.9877
- 我们车型的召回率是 0.9678
- 我们模型的精度是 0.9817
错误案例
只有当我们反思自己的缺点时,我们才能进步。所以观察模型出错的例子是很有趣的。我们已经有了错误案例的索引。然而,如果我们在测试集上使用它们,我们将得到标准化的值,并且我们不能从标准化的数据中得出任何结论。
我们首先需要将实例转换回它们的初始比例。值得庆幸的是,Scikit-learn 为其【standard scaler】提供了一个名为 的逆 _ 变换 的方法。我们将使用这种方法将缩放比例恢复正常。
当我们检查假阳性和假阴性时,很快就会发现它们是边缘情况。在每个实例中,至少有一个属性值接近定义的阈值。

有些病例接近其定义的阈值。
在其他情况下,神经网络的决策会受到茶温度极值的影响。刚刚超过好阈值的互联网速度、一本好书、但是非常高或非常低的茶水温度的组合导致了一些不愉快的预测。

在某些情况下,极端的茶水温度淹没了恰到好处的网速和一本好书。
我们可以争辩说,这些都是小错误,我们已经达到了优秀的评估分数。但这将是一个错误和无力的论点,因为我们在这里的旅程中积累了疲惫。最终,一个模型的价值只有在边缘情况下才能得到真正的评估。为了改进我们的模型,我们可以使用更多的边缘案例来训练它。然而,这只是我们已经做的重复。所以我把它留给你作为一个练习,如果你想复制和改进我的工作:加入快乐游乐场。
至于我,我就此打住。因为尽管神经网络仍然有缺陷,但这些缺陷是值得反思的。我们可以从中获得关于自己的宝贵见解的缺陷,以及我们如何认为我们所拥有的是理所当然的。
结论
“以一种对生命的稳定的优越感活着——不要害怕不幸,也不要渴望幸福;毕竟,都是一样的:苦不会永远持续,甜也不会把杯子装满。”——亚历山大·索尔仁尼琴
你上一次意识到自己不快乐是什么时候?你有没有意识到,尽管你几乎没有你需要的东西,但你还是拥有一些东西,这比一无所有要多得多。你不会想陷入错误的悲观主义者的可悲困境。就像你不想不知不觉地被无知的幸福带走一样。
生活不仅仅是快乐。我们意识到我们的死亡,容易生病,容易衰老,暴露于我们环境的任意变化。追求的是意义而不是幸福。这意味着在我们艰难的时候支持我们。因为我们也是足够强大的生物,能够承受我们悲惨的生存环境。
参考
米(meter 的缩写))胺。 禁闭中的幸福 Colab 笔记本。 (2020)。
米(meter 的缩写))安德鲁。 如何在 Google Colab 中配合 PyTorch 使用 Tensorboard。(2019).
T.斋藤和 m .雷姆斯迈尔。 精准召回剧情简介 。 (2017)。
NumPy 文档: 数组操作例程。 (2020)。
PyTorch 教程和文档:
- py torch 深度学习:60 分钟闪电战 。 (2020)。
- 用 TensorBoard 可视化模型、数据、训练。 (2020)。
- 文献 。 (2020)。
Scikit-learn 文档: 数据集转换 。 (2020) 。
冲浪板教程: 冲浪板入门 。 (2020)。
Python Lambda 函数已经变成了魔鬼

由 Clker-Free-Vector-Images 在 Pixabay 上拍摄的照片
讨论从一个测验问题开始…
如果你不是 Python 新手,我打赌你一定知道 Lambda 函数。我不得不说,我喜欢在某些情况下使用 Lambda 函数。比如熊猫数据帧apply()函数、map()或filter()函数,它们天然兼容 Lambda 函数,让我们的生活变得更轻松。我们不需要逐字声明一个显式函数。相反,只需定义一个内嵌的逻辑。
然而,在今天的这篇文章中,我将说一些关于 Lambda 函数的负面的东西。我不是说停止使用它,但肯定的是,这是一个问题。这种担心源于我从一个年轻朋友那里看到的一个问题,他正在世界排名前 20 的大学学习。
f =(λx:x((λx:x(λx:x))(x)))(λx:x)
给定这个函数
*f*,请说出*f(1)*的输出是什么。
顺便说一下,你不允许使用 Python 解释器,只需通过阅读和思考来获得答案,因为这是一个有时间限制的在线测验:)
前。一些背景

照片由 geralt 在 Pixabay 上拍摄
我相信有人可能知道在某些特定场景下如何使用 Lambda 函数,但可能不了解其中的机制。让我简单解释一下,lambda 函数是由什么组成的。

如果很混乱也不用担心。事实上,我们可以将 lambda 函数重写为我们熟悉的格式。

正如我们所见,lambda 函数和普通 Python 函数有两个主要区别:
- Lambda 函数是匿名的,我们不必用函数名来定义它。
- Lambda 函数只能有一个表达式,而普通函数可以有无限个表达式来定义一系列复杂得多的过程。
我们喜欢 lambda 函数,因为有时它简单明了。作为一名数据科学家,我使用 lambda 函数最频繁的场景可能是与 Pandas data frames apply()函数结合使用,因为它需要一个“函数”作为参数,而 lambda 函数可以只是作为参数的“函数”。
df['col'].apply(lambda x: x+1)
这相当于下面使用一个普通的函数。
def plus_one(x):
return x+1df['col'].apply(plus_one)
1.理解函数的结构

嗯,不要忘记我在本文开始时提出的一个问题。在我们批评这样一个荒谬的函数之前,让我们先一起推导出它的输出。
由于这个函数非常混乱,为了更容易理解,让我们添加一些缩进并重新格式化它。

现在,它变得更清晰了。至少,从上面的图解中,我们可以看到有 4 个 lambda 函数,以及它们的边界。
最重要的是,我们需要知道这些λ函数中的x是孤立的。换句话说,虽然都叫x,但它们不是一回事。
为了减少混乱,我们用a、b、c和d来代替这些x。此外,我们知道 lambda 函数是匿名的,但是让我们为下一步给它们指定一个名称。我只想让命名约定尽可能简单。我们把这样的函数lambda d: d称为_d(d)。
这是一幅精致的插图。

请注意,整个复杂的东西是一个函数,这是已知的,我们知道它被称为f(x),可以接受一个数字作为参数。
2.重写所有 Lambda 函数

图片由 picjumbo_com 在 Pixabay 上拍摄
好了,现在我们已经知道了整个函数的结构,但是仍然不清楚如何求解这个函数。这是因为 lambda 函数有时可读性不是很好,在这种情况下,简直不可读。
你还记得我们可以把任何 lambda 函数改写成普通 Python 函数的形式吗?让我们现在就做吧。
对于函数_c(c)和_d(d)来说非常简单,因为它们只是简单地返回它们参数的值。
def _c(c):
return cdef _d(d):
return d
然后,我们再来看函数_b(b)。这个开始有点棘手,但是不要忘记冒号之前的所有内容都是参数,而冒号之后的所有内容都是函数体。不管参数以什么形式出现,它就是参数,即使它可以是一个函数。
换句话说,参数可以是一个函数。
def _b(b):
return b(_c)
是的,函数_b(b)相当于说:“嘿!给我一个函数b(x),我将_c作为参数x传递。
同样,虽然更复杂,但我们可以重新编写函数_a(a),最后是f(x)。
def _a(a):
return a(_b)(a)def f(x):
return _a(_d)(x)
在进行最后一步之前,让我们把所有的东西放在一起。
3.导出 f(x)的输出

通过在没有实际运行的情况下导出输出,我们可以说我们完全理解了它(我相信创建这个问题的讲师会这样说)。
现在,我们有了上面所有的函数,所以我们现在可以开始推导了。既然要求它派生f(1),那么函数f(x)就会有它的x = 1。

不要在这个阶段开始处理_d。很明显_a(_d)会是一个函数,数字1就是它的参数。所以,我们需要遵循“从左到右”的原则。

在这一步,我们扩展了函数_a(a),参数a被函数_d替换。所以,我们最终得到了一个新的函数。现在,我们需要插入函数_d(d)的参数_b。

表达式_d(_b)就是简单的_b,因为函数_d已经被定义为无论传入什么都返回原始参数。下一步就是展开_b。

函数_b将一个函数b作为它的参数,这里传入的参数是_d。作为参数传入的函数将把_c作为参数。下一步很容易,因为我们又拿到了_d。

同样,_d将返回传入的任何内容,不做任何更改。最后我们得到了表达式_c(1)。如下所示的函数_c(c)也将简单地返回任何传入的内容,就像函数_d(d)一样。
def _c(c):
return c
所以,很明显,_c(1) = 1。
因此f(1) = 1。
一些想法

照片由 josealbafotos 在 Pixabay 上拍摄
如果你一直读到这里,非常感谢你。现在让我们深呼吸一下。我知道阅读答案甚至很困难,那么解决问题怎么样?还有,这个问题是针对一个大学生而不是一个非常有经验的开发者?也许,即使像我这样有经验的 Python 开发者也需要花一些时间来弄清楚。
现在,我知道吉多·范·罗苏姆(Python 的创始人)为什么要去掉 lambda 函数了[1]。当它用单行函数表达式解决问题时,确实是一件令人惊叹的事情。同时,如果一个人混淆使用它,它也可能是邪恶的。本文中展示的例子只是一个极端的例子,但是我们可以想象在实践中或多或少会发生一些没有经验的程序员想要炫耀他们的“技能”的情况。
最后,我明白大学科目的考试一定有一些难题,因为我曾经是其中的一部分,正如我在这篇文章中所说的:
数据转换-使用 Python Scikit 实现标准化和规范化-学习
towardsdatascience.com](/what-if-the-exam-marks-are-not-normally-distributed-67e2d2d56286)
然而,我不得不说,这篇文章中论证的这样一个问题,对学生来说几乎没有任何价值。此外,它可能会对学生产生负面影响。例如,我提到的那种家伙,过去常常用这种“技能”来“炫耀”并编写这种令人困惑的代码,可能通过这种问题从大学获得这种“技能”。
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@qiuyujx/membership)
如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)
参考
[1] G,罗森公司。Python 3000 中 reduce()的命运。万物蟒。2020 年 10 月 4 日检索到https://www.artima.com/weblogs/viewpost.jsp?thread=98196
Python 标准库——作为数据科学家应该知道的模块
带有用法示例
Python 标准库包含大量处理日常编程的模块,并且包含在 Python 的标准版本中,这意味着不需要额外安装。它为与操作系统交互、读写 CSV 文件、生成随机数以及处理日期和时间等任务提供了模块。本文描述了 Python 标准库的 8 个模块,我相信你在用 Python 编程时会遇到这些模块。我们开始吧!🙌

克里斯里德在 Unsplash 上的照片
1.Zipfile
zipfile 库提供了轻松处理 zip 文件的工具。它允许你直接在 Python 中创建、读取和写入 zip 文件,而不需要使用外部程序。
阅读压缩文件
要在 Python 中打开一个 zip 文件,我们使用 zipfile。ZipFile 类 ,提供文件路径和打开模式作为输入。由于我们想以阅读模式打开文件,所以我们提供了 mode='r' 。
ZipFile 构造函数返回一个 ZipFile 对象,我们将它赋给变量 myzip 。然后,我们使用。extractall(path=None,members=None,pwd=None) 方法将所有成员从 zip 文件提取到当前工作目录。为了提取 zip 文件的部分成员,而不是全部,我们可以将他们的名字提供给参数成员。
运行上面的代码后,我们可以打开当前目录来检查文件是否被正确提取。或者,我们可以使用 os.listdir() 函数(在 os 模块中定义)来获取工作目录中包含的条目列表。
最后,我们使用关闭 zip 文件。方法关闭()。当我们不再需要文件时,记住关闭所有文件以避免用完文件句柄是很重要的。
由于在 Python 中工作时很容易忘记关闭文件,所以我们可以使用带有语句的,该语句在嵌套代码块执行后自动关闭 zip 文件。
如果我们想获得 zip 文件中包含的成员列表而不提取它们,我们可以使用。namelist() 方法如下。
写一个 zip 文件
我们使用 zipfile 在 Python 中创建和打开一个新的 zip 文件。ZipFile 类处于写模式 mode='w' 。创建 zip 文件后,我们调用。write()方法添加一个文件如下。
上面的代码在当前工作目录下创建一个新的 zip 文件 (new_file.zip),包含两个。txt 文件(file_1.txt 和 file_2.txt)。
2.随意
随机数在人工智能和数据科学中扮演着重要的角色。我们使用随机数在每个时期之前打乱训练数据,在神经网络中设置初始权重,分离训练和测试数据,或者进行 A/B 测试。
Python 标准库提供了大量用于生成随机数的函数。让我们看看其中的一些!
随机. randint
random.randint(a,b) 函数返回一个在 a 和 b 之间的随机整数(两者都包含在内)。
Numpy 还提供了生成随机整数的函数( numpy.random.randint )。但与 random.randint 不同的是,不包含上界。
随机选择
random.choices(population,weights=None,*,cum_weights=None,k=1) 函数返回从人口中随机选择的 k 个元素的列表,替换为。我们可以使用权重参数来衡量每个值被选中的可能性。
random.shuffle
random.shuffle(x[,random]) 函数将序列 x 就地打乱,返回 None 。因此,函数的输入必须是可变对象。如果我们提供一个不可变的序列作为输入(例如一个字符串),就会出现一个异常( TypeError )。
为了混洗不可变的对象,我们可以使用 random.sample(population,k) 函数。该函数返回从群体中随机选择的 k 个元素的列表,没有替换。通过设置函数 k=len(population) 的第二个参数,我们获得了一个所有元素都被随机打乱的新列表。
如上图所示,我们可以使用内置函数 tuple() 将混洗列表转换为元组。
3.操作系统(Operating System)
os 模块提供与操作系统交互的功能。它包含许多用于处理目录、路径和文件的工具。在本文中,我们将只讨论由 os 提供的一些功能。
获取当前工作目录
函数的作用是:返回当前工作目录的路径。
如上所示,该函数没有参数,返回一个字符串数据类型。
更改当前工作目录
os.chdir() 函数将当前工作目录修改为给定路径,返回 None 。
更改目录后,我们可以使用 os.getcwd() 函数来验证修改。
文件和目录列表
os.listdir(path) 函数返回指定路径中所有文件和目录的列表。如果路径被省略, os.list() 函数返回当前工作目录中的条目列表。
我们可以结合使用 os.listdir() 函数和其他函数来过滤返回的列表。如下图,我们用的是字符串方法。endswith() 获取当前工作目录中的文本文件列表。
将文件重命名为 o 目录
Python 允许您使用 os.rename(src,dst) 函数以编程方式重命名文件或目录。该函数将文件或目录 src 重命名为 dst 并返回 None 。如果你试图重命名一个不存在的文件或目录,Python 会抛出 OSError 异常。
下面的块代码将文件 file_1.txt 重命名为 file_new_name.txt 。
如上所示,我们使用 os.listdir() 函数来检查修改是否正确执行。
创建一个新目录
函数 os.mkdir(path[,mode]) 允许您创建一个名为 path 的目录,其模式为数字。模式使用八进制数表示文件的权限(谁可以读、写或执行目录)。如果省略参数 mode,则使用默认值 0o777,使所有三个用户组都能够读取、写入和执行目录。
在下面的代码块中,我们在当前工作目录中创建了一个名为 new_dir 的新目录。
函数 os.mkdir() 在现有目录中创建一个目录。如果您试图在一个不存在的地方创建一个目录,就会引发异常。或者,您可以使用函数 os.mkdirs() (带 s)来创建中间文件夹,如果它们不存在的话。
启动一个文件
os.startfile(path[,operation]) 用相关应用程序启动一个文件。默认的操作是‘打开’,就像你双击一个文件,在你的电脑上打开它。
下面的代码将打开。txt 文件( file_2 )及其相关程序(在我的例子中是 Windows 编辑器)。
这些只是操作系统模块中可用的几个功能。阅读文档以了解更多信息!
4.时间
测量执行时间
我们可以使用 time.time() 函数来测量一段代码的执行时间。该函数返回自纪元以来经过的秒数。epoch 是时间开始的点( time.time() 将返回 0),它依赖于平台,在 Windows 系统上是 1970 年 1 月 1 日 00:00:00 (UTC)。
我们计算执行时间(挂钟时间),用下面的方式减去代码块前后的时间。
如果我们想计算 CPU 时间而不是运行时间,我们使用 time.clock() 函数。经过的时间通常比 CPU 时间长,因为 CPU 也可以在代码块运行时执行其他指令。
暂停执行
time.sleep(secs) 暂停程序执行给定的秒数 secs 。在用 Python 抓取网页时,这个函数就派上用场了。
大多数时候,我们希望尽可能快地执行代码。但是在网页抓取中,建议在请求之间暂停程序的执行,以免服务器不堪重负。
如上所示,在两次请求之间,执行会暂停 2 秒钟。
5.日期时间
datetime 库提供了许多在 Python 中处理日期和时间的工具。使用日期时间模块,我们可以很容易地获得当前时间,减去两个日期,或者将日期转换成定制格式的字符串。
导入库之后,我们用 datetime.datetime() 函数创建一个 datetime 对象。该函数需要三个参数:(1)年,(2)月,和(3)日,是小时、分钟、秒、微秒和时区可选参数。
如上所示,该函数返回一个日期时间对象。该对象具有以下属性:年、月、日、小时、分钟、秒、微秒和 tzinfo。我们可以使用点符号来访问它们,或者使用 getattr() 函数。
接下来,我们详细说明如何获取当前日期,减去两个日期,将一个 datetime 对象转换成一个 string ,反之亦然。
当前本地日期和时间
我们可以使用datetime . datetime . now(tz = None)函数轻松获得当前的本地日期和时间。
正如您所看到的,该函数返回一个具有以下格式的日期时间对象: YYYY-MM-DD HH:MM:SS:MS 。
减去两个日期
我们可以用 Python 减去两个 datetime 对象,结果得到一个 timedelta 对象。该对象表示两个日期之间的时间跨度。
如下图,我们通过减去乔治·奥威尔的死亡日期和出生日期来计算他活了多久。
将日期时间对象转换为字符串
。strftime(format) 方法将 datetime 对象转换为字符串,接受单个字符串参数( format )作为输入。该参数指定了我们要返回的日期时间对象的哪一部分,以及以何种格式返回。
下表包含 Python 中可用的一些指令。

接下来,我们使用上面列出的指令创建不同格式的字符串来表示乔治·奥威尔的生日。
将字符串转换为日期时间对象
datetime . strptime(date _ string,format) 函数从字符串创建一个 datetime 对象,与相反。strftime() 方法。为了正确工作,作为输入传递的日期字符串需要匹配指定的格式。否则,会引发一个异常(值错误)。
在下面的例子中,我们从代表乔治·奥威尔的出生日期的字符串中获得一个 datetime 对象。
6.战斗支援车
逗号分隔值 (CSV)文件是用于传输信息的常用格式。信息的结构是一个表,其中每个行包含一个记录,每个列包含一个字段,即由逗号分隔的字段。尽管逗号是最常见的分隔符,但我们也可以使用其他分隔符,如空格或制表符。
下图显示了一个包含学生信息的 CSV 文件。如下所示,文件的第一行包含字段名称(列标题)。
由于 CSV 文件是纯文本文件,我们可以像微软记事本一样使用文本编辑器创建并打开它。

****Python 标准库提供了一个内置模块,包含读取、处理和写入 CSV 文件的类。尽管该模块对于简单的操作很有帮助,但建议使用 Pandas 进行更复杂的数值分析。
读取 CSV 文件—阅读器功能
导入库后,我们用内置函数打开打开 CSV 文件。接下来,我们将 file 对象传递给 csv.reader() 函数,将函数的输出存储在一个名为 reader 的变量中。然后,我们可以通过使用循环的迭代阅读器对象来访问文件的每一行。****
如上所示, reader 对象返回的每一行都是一个字符串列表。
或者,我们可以在每次想要访问下一行时使用 next() 函数。这个函数通过调用它的 next() 方法从迭代器阅读器返回下一个元素。
默认情况下,分隔符是逗号。然而,如果使用另一个分隔符,我们必须用分隔符参数指定它,如下所示。

读取 CSV 文件— DictReader 函数
csv。DictReader() 函数将 CSV 文件的行作为字典对象(具体地说是作为有序字典)而不是作为列表对象返回。字典的键在字段名参数中指定。如果省略 fieldnames,则第一行中包含的值将用作键。
****有序字典由记住其内容添加顺序的字典组成。在 Python 3.6+中,字典也是插入排序的,意味着它们记住了插入条目的顺序。
编写一个 csv 文件—编写器功能
要将数据写入 CSV 文件,首先,我们使用内置函数 open 在写入模式下打开 CSV 文件。然后,我们将由打开函数返回的打开文件对象作为输入提供给 csv.writer()函数,获得一个 writer 对象。
writer 对象支持两种将数据写入 CSV 文件的方法。
- ****CSV writer . writerow(row)→该方法将一行数据写入 CSV 文件。
- ****CSV writer . writerows(rows)→该方法将所有给定的行(行对象的一个 iterable)写入 CSV 文件。
接下来,我们使用 writerows 方法编写一个包含艺术作品信息的 CSV 文件。正如您所观察到的,这个方法接受一个嵌套列表作为输入。
运行上面的代码后,在当前工作目录下创建一个 CSV 文件( works_of_art.csv )。

写一个 csv 文件— Dictwriter 函数
csv。DictWriter() 函数返回一个支持上述方法(writerow 和 writerows)的对象,用于将数据写入 CSV 文件。该函数需要输入标题信息(参数字段名)以及打开的文件对象。
在这种情况下, writerows 方法将字典列表而不是嵌套列表作为输入。
运行上面的代码后,在当前工作目录下创建一个 CSV 文件( works_of_art_2.csv )。

7.一团
glob 模块允许您通过使用通配符符号来查找匹配给定模式的文件和路径列表。一个通配符是一个特殊字符,我们可以用它来选择多个相似的名字。
下表显示了您可以在 glob 中使用的最常见通配符。

接下来,我们使用这个符号和 glob.glob() 函数从当前工作目录中获取匹配文件和路径的列表(如下所示)。

-
所有 CSV 文件列表。
-
以单词学生开头的文件和目录。
-
Txt 文件: file_2.txt , file_3.txt ,以及 file_4.txt 。
正如您所观察到的, glob 函数比 listdir 函数(在 os 模块中定义)更灵活地列出目录中的文件。
8.Difflib
difflib 模块包含各种用于比较序列的函数和类,对于计算文本和字符串之间的差异尤其有用。
diff lib . get _ close _ matches(word,probabilities,n=3,cutoff=0.6) 函数可以方便地检测拼写错误和打字错误,将一个单词与一组可能性进行匹配。该函数采用两个可选参数 n 和截止值。 N 是返回的匹配数,默认为 3。截止值的范围从 0 到 1,表示从可能性列表中返回一个元素的最小相似度,意味着元素与单词足够相似。
接下来,我们使用这个函数获取用户介绍的一个国家的人口。首先,我们使用库 Request 和 Pandas 从下面的网页获取数据。

然后,我们要求用户介绍一个国家,以访问其人口。如下图所示,如果你打错了,程序会建议一个相似的国家名称。

这个模块提供了更多的功能来识别文本之间的异同。如前所述,请参考文档,了解如何使用该模块的更多详细信息!😃
有趣的网站
除了官方的 Python 文档,你还可以在多个网页上找到关于如何使用 Python 标准库中可用模块的详细解释。
在本文中,我们解释了有限数量的模块,因为 Python 标准库包含超过 200 个模块!这意味着我们将在以后的文章中再次讨论 Python 标准库。💪
阿曼达💜
对人工智能的探索
我们在哪里,我们要去哪里

"人工智能始于一个古老的愿望——铸造众神."帕梅拉·麦科达克
人工通用智能 (AGI)指的是人工智能代理/程序在推理和执行其环境中的任务方面表现出人类水平熟练程度的能力。AGI 长期以来一直是科幻电影和书籍的支柱,著名的体现在可爱的角色中,如钢铁侠系列中托尼·斯塔克的助手贾维斯和星球大战中的人形机器人 C3PO。
至关重要的是,AGI 也被认为是当今大多数人工智能研究的圣杯。从某种意义上来说,大多数强化学习问题的公式化——需要主体与环境互动以获得最大回报的问题——是更大的一般智能问题的一个子类。我将不再关注如何精确定义 AGI,而是让读者凭直觉判断这是一个显示出“类人”智能的系统。
如今,数十亿美元正被用于 AGI 研究。例如,Elon-Musk 支持的 OpenAI 的任务是实现或促进 AGI 的发展(并确保它得到负责任的使用)。同样,谷歌的 DeepMind 和人类大脑项目也在朝着类似的目标努力。
我们今天站在哪里?
今天,我们有工具来创建显示非凡理解水平的人工智能系统。让我们来看看一些现有的程序,它们在特定的任务上显示出近乎人类水平的推理、性能或控制。我们将从三个不同领域的进展来看待这一点——自然语言处理、 强化学习和自动驾驶汽车。
NLP 和聊天机器人
自然语言处理是对人类语言的分析和理解,用于翻译和情感分类等任务。自然语言处理的一个应用是创建聊天机器人。2016 年,微软披露了一款名为 Tay(想你)的 AI 机器人。虽然 Tay 因为所有错误的原因成为头条新闻,并在发布 16 小时后被下线,但它在推特上发布各种话题的能力似乎令人印象深刻。

Tay 在特德·克鲁兹的推文
以上面的推文为例。Tay 被训练回答基于其他讨论类似话题的推文例子的问题。特别是,为了回复这条推文,它能够将这条推文识别为征求意见,然后根据其他人对类似问题的回复生成一个汇总答案。泰表现出良好的文本分析、解释和形成有意义句子的能力,但不完全是一般的智力。一个真正的 AGI 系统能够合理地自行给出答案,而无需转述他人的观点。
为了想象一个真正的 AGI 系统,想想机器人必须进行什么样的推理才能自己做出这样的回答(即使假设它知道正在进行的将特德·克鲁兹比作十二宫杀手的迷因)。首先,除了知道它被要求发表意见,它还必须知道被比较的两个实体——特德·克鲁兹和十二宫杀手。第二,它必须将对特德·克鲁兹的看法与十二宫杀手的行为联系起来,并以幽默的方式构建它,首先不同意这个前提,然后放大它。我们还没到那一步。
然而,自 2016 年以来,NLP 已经取得了实质性的进展,2018 年发布了大型基于变压器的模型,如伯特和 GPT-2 ,这些模型能够轻松超越当时最先进的模型。这些模型是通过向一个程序输入成千上万的维基百科和其他公开可用的文本文档来“理解”英语而创建的。这类似于通过给孩子单词在上下文中的意思的知识来教他阅读。一旦精通了这一点,孩子就可以用这些知识来思考新问题,并适当地回答它们。
众所周知,GPT-2 模型展示了一种令人印象深刻的能力,可以根据提供给它的任何上下文创建近乎完美的文本。例如,系统会给出以下提示:
在一个令人震惊的发现中,科学家发现了一群生活在安第斯山脉一个遥远的、以前未被探索过的山谷中的独角兽。更令研究人员惊讶的是,独角兽能说一口流利的英语。
这里是 GPT-2 的输出摘录(全文可以在这里找到)。
这位科学家根据他们独特的角给这个种群命名为奥维德独角兽。这些四角银白色的独角兽此前是科学未知的。现在,在将近两个世纪之后,引发这一奇怪现象的谜团终于解开了。来自拉巴斯大学的进化生物学家 Jorge Pérez 博士和几个同伴在探索安第斯山脉时,发现了一个小山谷,没有其他动物或人类。佩雷斯注意到山谷里有一个看起来像是天然喷泉的东西,被两座岩石和银色积雪的山峰环绕着。佩雷斯和其他人随后冒险深入山谷。“当我们到达一座山峰的顶部时,水看起来是蓝色的,上面有一些晶体,”佩雷斯说。
这个模型的工作方式是使用输入提示,然后一次一个单词地生成输出文本。考虑到这个连续的生成过程,上面显示的生成文本在语法上(没有语法或标点错误)和语义上(没有无意义的陈述)都非常连贯。它还包含对系统生成的角色(如佩雷斯和他的同伴)的多个引用。
NLP 仍然是一个快速发展的领域,几乎每天都有新的改进。
RL 和游戏代理
强化学习是人工智能的一个子领域,它涉及对代理的设计和分析,这些代理在其环境中行动以最大化奖励的概念(例如,游戏中的得分)。在强化学习领域也是如此,智能系统已经有了实质性的进展。自从 2013 年使用神经网络玩 ATARI 游戏的演示[1]以来,强化学习技术发展迅速。
2019 年,OpenAI 展示了一个名为 OpenAI Five 的机器人,它在 Dota 2 的一场比赛中控制了五个代理。这是一个 MOBA(多人在线战斗竞技场)游戏,两个 5 人的团队在比赛中互相摧毁对方的基地。在一个大约 30 分钟的游戏过程中,玩家做出数百个短期和长期决定,包括影响其他玩家并可能具有延迟后果的技能和物品选择。该机器人能够在一场公开转播的比赛中以 2 比 0 击败 Dota 2 世界冠军 OG。为了测试代理的健壮性,它还公开发布了一段时间,并与社区进行了约 7000 场比赛,取得了 99.4%的胜率。
这个特工几乎完全是通过自演训练出来的。关键是,这种算法的重点不是人工智能系统通常比人类具有的机械优势,如更快的反应时间——该算法甚至人为地惩罚了高度机械的目标,如最后一击和拒绝。相反,训练奖励旨在对游戏状态有一个总体的了解,包括什么时候应该选择一场战斗,以及相对于对手的当前实力。
2018 年年中,OpenAI 展示了一只完全在模拟中训练的机器人手,可以将物体操纵到各种方位。

通过模拟学习灵巧【来源: OpenAI 博客
虽然这些任务看起来相当简单,但它实现的关键是在新情况下表现良好的能力,尽管从未受过在这些情况下如何表现的专门训练。这是通过一种叫做域随机化的训练技术实现的,这种技术允许系统识别环境的关键特征,帮助它概括新的情况。
其中我个人觉得印象最深刻的一个系统是 2019 年 9 月发布的多代理捉迷藏。这是两个独立进化的代理团队之间的模拟系列游戏,一个任务是寻找,另一个是隐藏。他们接受了近 5 亿集(独立运行的捉迷藏)的训练,并学会了使用各种固定和可移动的工具,如墙壁、坡道和盒子。这里有一个视频总结了代理的演变。
多智能体捉迷藏
看到这两组对手随着时间的推移不断进步,不断进化出新的策略来抵消对手的进步是非常令人着迷的。例如,当隐藏者学会使用一个房间并用盒子封住入口时,搜寻者学会使用一个斜坡“跳过”墙来找到他们。作为回应,隐藏者们学会了在封锁入口之前,把斜坡带到他们的房间,从而把它拿走。
自动驾驶汽车
自动驾驶汽车的诞生可以说是人工智能最主流的应用。自动驾驶要求代理具有一系列不同的能力,如计算机视觉和强对象分类,以及对其情况的持续评估和与其环境的交互(类似于强化学习)。

罗伯特·尼克森在 Unsplash 上拍摄的照片
像优步、特斯拉和谷歌支持的 Waymo 这样的大型行业参与者正在积极致力于制造自动驾驶汽车,其中一些公司已经开始在受控和广泛绘制的环境中测试几乎全自动的汽车。这场比赛的领先者已经在这样的环境中实现了所谓的四级自动化(汽车可以在没有人类输入或监督的情况下运行,但只能在由道路类型或地理区域等因素定义的选择条件下运行)。但是,向最终的第 5 级(直觉上,这是汽车能够在任何条件或地理条件下完全自动驾驶的阶段)的跳跃还有一段路要走。
我怀疑,除非道路上的所有汽车都被无人驾驶汽车取代(因此总是意识到并知道其他汽车在做什么),否则很难实现第 5 级自动化。甚至可能只有 AGI 才能实现 5 级自动化,因为需要能够处理如此多的不同场景和故障模式。
通往 AGI 的道路
上面描述的系统,尽管在它们被训练完成的任务中各自都很强大,但并不包含对世界的普遍理解。举个例子,一个被训练来玩 Dota 2 的代理将不能在补丁说明中读到游戏的变化并调整其游戏风格来合并补丁中的变化。另一方面,一个能够熟练地玩游戏的人在阅读了新更新带来的变化后,可以合理地调整他的游戏风格。
对于这样的任务,我们需要建立一个代理,并赋予它跨越人工智能研究所有领域的能力,从自然语言处理到计算机视觉,到解决问题和玩游戏。
我们怎样才能建立这样一个系统呢?大体上,对于如何建立这样一个 AGI 体系,有两种观点。
OpenAI 的首席科学家 Ilya Sutskever 公开声称,我们已经拥有了建设 AGI 所需的最关键的工具——良好的 ol' 深度学习 。如果你不知道这是什么,这是一项基础技术,用于上述所有人工智能领域——NLP、强化学习和计算机视觉与控制。深度学习本质上允许系统建立它试图解决的问题的分层表示。在最近的播客上,伊利亚声称 AGI 将通过深度学习“加上一些其他想法”的组合来实现。至关重要的是,这些其他想法可能已经和我们在一起了。它们可能是现有的工具,如自我游戏和领域随机化,或者是同一问题的不同表述。
OpenAI 与麻省理工学院博士生( Joseph Suarez )合作的一个步骤是神经 MMO——一个基于大型多人在线角色扮演游戏(MMORPGs)如《魔兽世界》和《Runescape》的模拟环境。

神经 MMO 环境:深绿色瓦片代表“食物”,蓝色瓦片代表“水”。代理人必须探索发现,然后争夺肥沃的土地。[ 来源
这是一个竞争激烈的在线环境,要求代理寻找食物和水等资源,并与其他代理进行肉搏和远程战斗,以保持生存。这种环境创造了一个类似于现实世界的基本框架,在现实世界中,生物为了生存和繁殖而竞争资源。构建这种 MMO 环境背后的基本原理是,创建可扩展到现实世界的代理的问题可以分成两个子问题:
- 适应其环境的代理,即学习在任何环境中表现良好。
- 适应真实世界的环境。
“适应其环境的代理”是大多数机器学习研究的当前焦点。它需要开发更好的算法,使代理能够最大限度地发挥其在环境中的潜力。这需要对代理必须在其环境中执行的核心任务有更好的理解和解决方案,例如探索和处理内存。
“适应真实世界的环境”是至关重要的一部分,因为随着代理变得更好,他们会受到环境的限制。防止这种情况需要开发更接近真实世界的模拟。神经 MMO 试图创造这样一个环境,它比现有的环境更复杂,现有的环境通常会带来非常特殊的挑战。作者认为将环境建立在 MMORPG 的基础上,也使得它具有极大的可扩展性。
另一派关于如何建立 AGI 体系的思想认为,AGI 将与现有体系截然不同。微软联合创始人保罗·艾伦(Paul Allen)在 2014 年发表在《麻省理工科技评论》(MIT Technology review)上的一篇文章中声称,我们需要激进的新技术来实现 AGI。
“但如果奇点将在 2045 年到来,它将需要不可预见和根本不可预测的突破,而不是因为加速回报定律使它成为特定指数速度发展的必然结果。”—保罗·艾伦
时间表
AGI 什么时候能实现?这就是我们从事实和艰苦研究转向猜想和希望的地方!
简而言之,答案是没有人确切知道。主流人工智能研究人员谨慎地表达任何乐观,部分原因是人工智能长期以来令人失望。事实上,人工智能研究在 20 世纪 60 年代和 70 年代经历了巨大的第一波浪潮,一些人预测他们能够在一代人的时间内建立完全对话和类似人类的人工智能。当研究团体未能产生其承诺的结果时,该领域在 80 年代和 90 年代出现了明显的放缓。
然而,21 世纪的黎明见证了该领域的复兴,这一次的焦点是适用于现实世界的人工智能。研究在第一个十年稳步前进。然后,在 2012 年,深度学习成为主流。深度学习出现后的几年就像现代人工智能研究的寒武纪大爆发一样。
2016 年 6 月的一项专家调查[3]显示了乐观的态度,认为 AGI 将在 21 世纪内完成。根据这项调查,专家平均预测,2040-2050 年左右,高级机器智能将有 50%的可能性被开发出来,到 2075 年,这一可能性将上升到 90%。
希望这能让你思考构建人工智能的一些问题以及解决这些问题的潜在方法!你对如何实现 AGI 有什么看法,我们还有多远?
引文和进一步阅读
- 用深度强化学习玩雅达利【Mnih 等 2013】
- 人工生命:目标与方法【约瑟夫·苏亚雷斯】。
- 人工智能的未来进展:专家意见调查
- AGI 维基百科页面
- Ilya Sutskever:深度学习 Lex Fridman 的人工智能播客
深度网络中单个单元的语义问题
在深度神经网络的背景下,我们有理由不那么困惑于所谓的祖母细胞吗?
深度学习中一个常见的假设是,网络的单个更高层单元可能对应一个复杂的语义实体,例如一个人或一只特定类型的狗[2,9]。这被通俗地称为祖母细胞或荷马辛普森细胞。
这些名字源于神经科学。据观察,当一个人看到詹妮弗·安妮斯顿(Jennifer Aniston)照片的任何变体时,人类大脑视觉通路晚期的特定皮质细胞就会激活,正如 Quiroga 等人在研究中所做的那样[6]。然而,在研究中还发现,詹妮弗·安妮斯顿(Jennifer Aniston)的印刷体名字也能引发同样的反应,这表明这种放电是由记忆机制而非纯粹的视觉刺激及其几何变换引起的。
祖母细胞的概念已经在深度学习的实践者的广泛社区中留下了印象,既迷人又容易掌握。已经提出了这些细胞的可视化方法,包括基于网络的[2,7]和基于输入的[9]。
在深度学习论文中,展示这些类型的可视化并假设它们是网络已经学习了一些明智的东西的证据并不罕见,例如[3]。
这是不是真的是这样,这是我在这篇博文中想要探究的。为此,我将主要提及代表对此问题的三种不同观点的三份文件。它们是泽勒&费格斯【9】的可视化和理解卷积神经网络,马亨德兰&韦达尔迪【4】的显著反卷积网络,以及莫科斯&巴雷特【5】的关于单一方向对于泛化的重要性。
特征重构和活动最大化
第一篇可能是最著名的论文,试图研究卷积网络的内部工作原理。这里,去卷积(也称为转置卷积)用于将某个滤波器的特征激活投射回像素空间,以查看神经元“看到”了什么。我们可以称之为特征重建。
另一方面,还有活动最大化的方法,这个术语是 Erhan 等人创造的[2]。在活动最大化中,对输入噪声执行优化,以找到将导致一个特定单元的最大激活的输入。Erhan 等人使用这种方法来可视化深度信念网络的隐藏单元。
活动最大化和特征重构之间有着至关重要的区别。[9]的方法是以数据为中心的,即自然图像被输入到网络中。在活动最大化中,输入仅仅是噪声,以便不约束可能的响应(尽管可以在噪声之上应用正则化来加强平滑)。如果特征重构是以数据为中心的,那么活动最大化反而是以网络为中心的方法,因为它是正在研究的网络的激活空间。
[9]中介绍的特征重构方法应用于网络中给定层的特定单元。这些重构被呈现出来,好像这些神经元有语义偏好。
随机单元给出了相似的响应
但是我要提到的第二篇论文(Mahendran 等人[4])对这一假设提出了质疑,该论文表明,当应用将激活从随机选择的神经元投射回像素空间的相同方法时,会获得相同的重建。在这里,信息瓶颈的概念被提出来作为一种可能的解释,即为什么从随机单元的特征重构实际上与从最大激活单元的特征重构给出相同的响应。其思想是,前向传递的信息瓶颈所产生的独特信息实际上是重新创建特征时的主要响应。
此外,甚至在此之前,Szegedy 等人[8]对单个单元的语义解释提出了质疑,并声称语义也可以作为分布式代码在一个层的许多单元中找到。这通过将单个最大激活单元的特征重构与过滤器空间中随机(分布)方向的特征重构进行比较来显示:两者都显示了它们响应的清晰语义分组。Agrawal 等人的另一篇论文[1]进行了实验,表明在某个图像的最高激活单元中,为后续分类保留的单元越多,性能越好。

Solen Feyissa 在 Unsplash 上拍摄的照片。我们应该重视分布式代码还是单一单元语义?
单一单位依赖和概括
最后一篇论文是 Morcos & Barrett 的论文[5]。他们的动机是调查祖母细胞的作用,或单一单位依赖,以进行概括。他们进一步研究针对特定语义概念激活的神经元对于这些网络的分类决策是否重要。
他们的结果之一是,有效推广的网络倾向于最大限度地减少对单一方向的依赖。这是通过网络单元的累积烧蚀发现的。非一般化网络(根据实验设计,它们已经记忆了带有随机标签的训练数据集)对这些消融不太鲁棒。此外,他们还研究了消融具有类别选择性的单位是否重要(引入了类别选择性的度量)。在 CIFAR-10 上,明显地,为了网络的性能,移除类选择单元稍微好一些。在 ImageNet 上,在非选择性和类选择性方向之间没有任何偏好。
我简要地浏览了一系列关于单一单位语义学的结果。我们已经看到,对于特定的语义概念,神经网络单元可以具有最大的激活(即,在分类内是类选择性的)。但是,这并不能告诉我们网络的一般性能,也不能告诉我们这个单元是否重要。由于这个原因,正如[5]中所总结的,把重点放在类选择单元上可能会产生误导。类似于[4]中的结果,有趣的是看到分布式单元集的活动最大化,而不是单个单元。这恰好便于可视化一个单元最大程度地激活什么,但是可能在网络的激活空间中存在非坐标对齐的方向,这些方向可能包含至少同样有趣的发现。这些其他方向只是更难放进一个引人注目的故事,更难系统地调查。
*然而,在[2]中,对于图像等复杂分布的数据,似乎缺少全局最大值。
[1] P. Agrawal、R. Girshick 和 J. Malik,分析多层神经网络用于对象识别的性能(2014 年),ECCV,2014 年
[2] D. Erhan、Y. Bengio、a .库维尔和 P. Vincent,《深层网络的高层特征可视化》( 2009 年), ICML 2009 年学习特征层次研讨会
[3] C. Feichtenhofer,A. Pinz,R. P. Wildes 和 A. Zisserman,我们从动作识别的深层表征中学到了什么?(2018 年),CVPR 2018 年
[4] A. Mahendran 和 A. Vedaldi,《突出的反进化网络》( 2016 年), ECCV,2016 年
[5] A. S. Morcos,D. G. T. Barrett,N. C. Rabinowitz 和 M. Botvinick,关于单一方向对一般化的重要性(2018 年),ICLR 2018 年
[6] R. Q. Quiroga,L. Reddy,G. Kreiman,C. Koch 和 I. Fried,《人脑中单个神经元的不变视觉表示》( 2005 年),《自然》,第 435 卷
[7] K. Simonyan,A. Vedaldi 和 A. Zisserman,深入卷积网络内部:可视化图像分类模型和显著图(2014 年),ICLR,2014 年
[8] C .塞格迪、w .扎伦巴、I .苏茨基弗、j .布鲁纳、d .埃汉、I .古德菲勒和 r .弗格斯,《神经网络的迷人特性》(2014 年),ICLR,2014 年
[9] M. D .泽勒和 r .弗格斯,《可视化和理解卷积网络》(2014 年),ECCV,2014 年。
使用 Pandas 在 Python 中快速简单地绘制误差线
不需要一行额外的代码!

为什么你需要学习这个
在科学研究中,在你的描述性可视化中显示误差线是不可避免的。它们包含了关于数据可变性的信息,是对平均分数的必要补充。然而,科学形象的内在往往比外在更美丽。
作为的数据科学家,我们被教导使用有吸引力的可视化来讲述故事。任何分散观众注意力的东西都应该被删除。这非常有意义,因为经理和客户通常既没有很好地掌握统计数据,也没有太多的时间和精力花在你的可视化上。
要解释误差线,您需要:
- 对描述性统计的基本理解
- 显示哪种误差线的信息(通常是标准差或标准误差)
这两个假设都与数据故事讲述者的目的相冲突。你希望任何人理解结果而不必通读八行音符。
数据故事讲述者将误差线视为障碍,因为它们妨碍了对数据的简单、舒适和统一的解释。另一方面,科学家被训练显示所有必要的信息,并让读者自己解释结果。这两种方法都不优越。在技术报告或数据团队会议中过分简化结果,就像用自发的统计学讲座来烦你的经理和客户一样,都是不利的。

对于任何愿意证明其数据科学职称中的“科学”的人来说,学习何时以及如何使用误差线是不可避免的!
当我为我的第一篇科学文章创建可视化时,我尝试了许多不同的方法。让我节省你一些时间,给你介绍一下我找到的又快又简单的方法。按照这篇文章并自己应用该方法,您需要的只是一些统计学、python 和 pandas 库的基础知识。
C计算
有两个主要参数适用于误差线。
- (2x)标准偏差
- 标准误差
我强烈建议您熟悉这些参数,这样您就可以做出明智的决定,为您的可视化使用哪个参数。在克劳迪娅·克莱门特的这篇文章中,这些概念以一种完美压缩的方式被解释。
首先,我们需要导入我们的库并加载我们的数据。我们将使用来自 kaggle 的鳄梨价格数据集。你不需要太了解数据集。我们只想知道常规鳄梨和有机鳄梨(“类型”列)的价格是否不同(“平均价格”列)。
# Imports
import pandas as pd
import numpy as np # for calculating standard deviation and mean
import scipy.stats as sp # for calculating standard error
import matplotlib.pyplot as plt # for improving our visualizations# Read data
avocado = pd.read_csv("avocado.csv")
执行我们的计算最简单的方法是使用熊猫 df.groupby 函数。这个函数有许多有用的应用,但在这种情况下,我们将使用它进行统计参数的聚合计算。下面,你可以看到代码原型。
df.groupby("col_to_group_by").agg([func_1, func_2, func_3])
我们使用 df.groupby.agg 来快速简便地计算组比较的统计参数。
我们已经有了要分组的数据帧和列,所以我们现在需要找到正确的函数。记住,我们需要平均值,标准差 x 2 和标准差。这些是我们需要的功能:
NumPy
- 平均:np .平均
- 标准差:np.std
SciPy
- 标准错误:scipy.stats.sem
因为 df.groupby.agg 函数只接受一个函数列表作为输入,所以我们不能只使用 np.std * 2 来得到我们的双倍标准差。但是,我们可以只写自己的函数。
def double_std(array):
return np.std(array) * 2
现在,让我们使用原型代码并填充占位符。
# df.groupby("col_to_group_by").agg([func_1, func_2, func_3])
avocado_prices =
avocado.groupby("type").agg([np.mean, double_std, sp.sem])
不错!现在,让我们只选择“AveragePrice”列,因为我们不需要其余的。
avocado_prices = avocado_prices["AveragePrice"]
avocado_prices.head()现在给出了以下输出:

表 1 — df.groupby.agg 输出
太好了!现在我们有了所有需要的数据。
可视化
Pandas 有一个非常有用的功能,可以让我们快速获得第一次可视化,而无需经历整个 matplotlib 过程: df.plot
这基本上是熊猫内部的 matplotlib 表示。
为了得到没有任何误差线的第一个图,我们只需要一行代码:
avocado_prices.plot(kind = "barh", y = "mean", legend = False, title = "Average Avocado Prices")
输出:

图 1-没有误差线
我们可以看到,有机鳄梨的平均价格高于传统鳄梨。但这是真正的差异还是只是随机传播?正如我在副标题中承诺的,我们不需要一行额外的代码来使用误差线回答这个问题。我们需要做的就是将我们的统计参数赋给 xerr 参数。让我们从“double_std”参数开始:
avocado_prices.plot(kind = "barh", y = "mean", legend = False, title = "Average Avocado Prices", xerr = "double_std")
输出:

图 2 —标准偏差 x 2 误差线
他们在那里!即使没有深入了解如何解释这些误差线,我们也可以看到价格的可变性相当高,并且每个误差线与另一个误差线相接触。也许这种差异并不像我们从第一个情节中所预期的那样明显和巨大?同样,我不会深入解释标准差和标准误差,因为这是一个实用指南。只是注意这个剧情给我们留下的印象和上一个不一样。
如果我们接下来画出标准误差,会发生什么?
avocado_prices.plot(kind = "barh", y = "mean", legend = False, title = "Average Avocado Prices", xerr = "sem")
输出:

图 3 —标准误差线
什么?误差线几乎看不见。标准误差对样本大小很敏感,因为它在大样本中比在小样本中低。鳄梨样本有超过 250,000 次观察,所以结果是合理的。这第三个情节又给人留下了完全不同的印象!
你是否以及如何使用误差线对你的可视化所讲述的“故事”有很大的影响。理解误差线背后的统计数据对于正确使用和解释它们是至关重要的。
到目前为止,我们从一行代码中得到了非常好的结果。如果我们花更多的时间来改进我们的可视化,我们可以得到类似图 4 的东西。
ax = avocado_prices.plot(kind = "barh", y = "mean", legend = False, title = "Average Avocado Prices", colors = ["steelblue", "seagreen"]) # no error bars added here# X
ax.set_xlabel("Price ($)")# Y
ax.set_ylabel("")
ax.set_yticklabels(["Conventional", "Organic"])# Overall
for key, spine in ax.spines.items():
spine.set_visible(False)
ax.tick_params(bottom = False, left = False)
ax.errorbar(avocado_prices["mean"], avocado_prices.index, xerr = avocado_prices["double_std"],
linewidth = 1.5, color = "black", alpha = 0.4, capsize = 4)
输出:

图 4 —最终图
用 python 创建误差线非常简单!使用一些高级的 pandas 函数,我们可以只用两行代码就从数据帧到有(或没有)误差线的可视化!但是,如果您还没有学习误差线背后的统计数据,您需要先学习一下。您看到了三个图(无误差棒线对虚线标准差对标准差)看起来有多么不同。起初这可能看起来很可怕,但是一旦你学会了,它是你数据科学技能组合中另一个非常有用的工具。
感谢阅读!
小队快速指南
关于斯坦福问答数据集(SQuAD)你需要知道的所有基本信息。
斯坦福问答数据集(SQuAD)是一组问答对,对自然语言处理模型提出了强有力的挑战。无论您只是对了解流行的 NLP 数据集感兴趣,还是计划在您的项目中使用它,这里都是您应该知道的基础知识。

小队有什么任务?顾名思义,SQuAD 专注于问题回答的任务。它测试一个模特阅读一段文字,然后回答相关问题的能力(闪回 SAT 的阅读理解)。这是一项相对简单的任务;数据集的创建者举了一个例子:

班底资料中一段的问题和答案范例。图像归功于 Rajpurkar 等人,数据集的原始创建者。
小队是怎么创建的?为了编制 SQuAD,创建者们从维基百科的前 10,000 篇文章中抽取了 536 篇。从每篇抽样文章中,他们总共提取了 23,215 个段落(确保过滤掉过小的段落)。他们按文章划分数据集,这样 80%的文章进入训练集,10%进入开发集,10%进入测试集。
注释小队。创建数据集最重要的部分——注释——是由土耳其机械工人完成的。经典!我看到机械土耳其人在许多 NLP 文件中客串。这些员工只有在拥有高质量工作历史的情况下才会被选中(通过点击率来衡量)。对于每个选定的段落,工作人员被要求就该段落的内容提出并回答 5 个问题。他们被提供了一个文本字段来输入他们的问题,他们可以在段落中突出显示答案。SQuAD 的创建者确保工人们提出的问题是用他们自己的话来说的,甚至禁用了复制粘贴功能。不不不!不是我的复制粘贴工具!

用于从土耳其机械工人收集注释的程序示例。图像归功于 Rajpurkar 等人,数据集的原始创建者。
数据集分析。一个好的数据集的关键部分是理解它的属性。为此,创作者探索了三个领域:
- 答案的类别。每个答案被分成以下类别之一:“日期”、“其他数字”、“人”、“位置”、“其他实体”、“普通名词短语”、“形容词短语”、“动词短语”、“从句”和“其他”。他们发现日期和数字占答案的 19.8%,名词占 32.6%,名词短语占 31.8%,其他类别占剩余的 15.8%。
- 推理所需。创建者从开发集中抽取问题,并手动将问题分为回答问题所需的不同推理类别。例如,类别“句法变异”意味着问题本质上是转述的,需要重新排列单词才能找到答案。在这些要点下面,我包含了所有类别的原始表格以及属于该类别的问题的百分比。
- 句法分歧。创作者测量问题和包含答案的句子之间的句法差异,以衡量问题的难度。基本上,他们创建了一个度量标准,来评估将一个问题转换成带有答案的句子所需的编辑次数。具体细节可以在原始论文这里中找到,但重要的是数据集被发现具有不同范围的语法差异。确保数据集的多样性总是好的!

回答问题所需的每一类推理的发展集的例子。图像归功于 Rajpurkar 等人,数据集的原始创建者。
是什么让班底如此优秀?当然,对于像问答这样的任务,有大量的数据集。将 SQuAD 与其他数据集进行比较时,有几个主要区别:
- 阵容大。其他阅读理解数据集如 MCTest 和 Deep Read 太小,无法支持密集复杂的模型。MCTest only 共 2640 题,Deep Read only 共 600 题。SQuAD 拥有这些由多达 100,000+个问题组成的数据集。
- 小队具有挑战性。在关注答案抽取的其他基于文档的问答数据集中,给定问题的答案出现在多个文档中。然而,在《小队》中,模型只能访问一个段落,这是一个更加困难的任务,因为错过答案是不可原谅的。
- 小队需要推理。一种流行的数据集类型是完形填空数据集,它要求模型预测文章中缺失的单词。这些数据集很大,他们提出了一个有点类似于小队的任务。SQuAD 在这方面的关键改进是它的答案更复杂,因此需要更密集的推理,从而使 SQuAD 更好地评估模型理解和能力。
总结思想。 SQuAD 可能是最受欢迎的问答数据集之一(它被引用了 2000 多次),因为它创建良好,并在许多方面改进了其他数据集未能解决的问题。我强烈推荐任何想要评估 NLP 模型的人在 SQuAD 上测试它,因为它是测试模型对语言的理解甚至只是总体性能的一个很好的数据集。
延伸阅读:
部署您的机器学习模型的最快方法!!
使用 Python,Tableau,机器学习和 TabPy

照片由 Subash Patel 拍摄
数据科学就是尽可能以最简单的方式向最终用户呈现洞察力。你在一个机器学习/深度学习模型上工作,从数据清理到超参数调整。然而,您意识到向最终用户呈现它的最重要的任务甚至还没有开始。在这里,我将讨论一种使用 Jupyter 笔记本和 Tableau 部署 ML 模型的简单快捷的方法。
我们将使用 Scikit-Learn 来处理数据并构建模型。然后我们使用 TabPy 来部署构建好的模型,并在 Tableau 中访问它。如果您正在寻找一种方法来部署模型,以便在云平台或分布式系统中使用它,您现在可以停止阅读。
数据
我们将使用 Kaggle 上可用的 Titanic 数据集来构建一个随机森林模型。该项目的目标是预测一名乘客是否可能在泰坦尼克号灾难中幸存。我们将使用人口统计变量,如年龄、性别、兄弟姐妹数,以及乘客的机票等级作为独立变量。
该项目的目标是预测一名乘客是否可能在泰坦尼克号灾难中幸存。

显示最终部署模型的仪表板。
数据集包含 891 行,其中 177 个年龄值缺失。我们用平均值一个标准差内的随机数替换缺失值。同样,我们将 Fare 中的 NaNs 修改为 0。
建模
我们用默认参数构建一个随机森林分类器。然而,我们仅用 6 个变量就达到了约 94.5%的准确率,这表明它可能过度拟合了训练数据。但是,我们的重点是快速部署训练好的模型。因此,我们不会试图获得最好的评估指标,如精确度或召回率。Kaggle 上有很多其他的资源关注这一点,这里有一个简单的模型,没有交叉验证或参数调整。
要求
我们需要在我们的机器上安装 Python 2.x 或 Python 3.x 来开始部署,或者您可以使用 Anaconda 来安装 Jupyter Notebook 和 Python。此外,我们需要安装 TabPy 来启动一个可以托管已部署模型的服务器。你可以简单地按照这里的步骤来做。如果您觉得安装命令花费时间,那么关闭 cmd 提示符并在另一个提示符下尝试。我不得不做了几次才弄对。
TabPy(Tableau Python服务器)是一个分析扩展实现,它通过允许用户通过 Tableau 的表计算执行 Python 脚本和保存的函数来扩展 Tableau 的功能。
启动并运行服务器的步骤
- 在 conda 环境中安装了 TabPy 之后,打开一个新的 anaconda 命令提示符,使用“CD C:\ Users \ vipan \ anaconda 3 \ pkgs \ TabPy-server-0.2-py36 _ 1 \ Lib \ site-packages \ TabPy _ server”将目录更改为 TabPy 服务器目录。使用您的 PC 用户名和相应的目录路径代替 vipan。
- 运行命令“startup.bat ”,您应该会看到下面的屏幕。不要关闭此窗口,因为我们需要服务器在线。

启用服务器连接
部署
我们需要创建一个函数,该函数可以将 Tableau 中选定的参数值作为输入,并返回该人在泰坦尼克号上幸存的概率。现在,我们将函数和来自 Jupyter Notebook 的训练模型一起部署到 Tableau-Python 服务器上。模型在服务器上保存为 pickle 文件。在这个步骤之后,经过训练的模型被托管在本地的 TabPy 服务器上,该服务器可以从 Tableau 访问!!
如果您得到任何错误消息说“tabpy_client”没有找到,那么您可以在 anaconda cmd 提示符下运行“pip list”命令来查看已安装库的列表并安装所需的库。通过使用“override = True ”,您可以训练和部署相同的模型,同时用最新或更新的版本替换旧版本。当您需要每天根据新数据训练模型时,这很有帮助。_arg1、_arg2 等将从 Tableau 中传递。
Tableau 配置
服务器运行后,在 Tableau 中转到:


测试连接,您应该会看到下面的通知。单击确定。

将“train.csv”文件导入 Tableau。为了访问 RF 模型,我们必须从 Tableau 传递参数。因此,让我们创建具有所需数据类型的参数来访问模型,如下所示。

类似地,使用数据标签为等级、性别、费用、兄弟姐妹/配偶数量(SibSp)和子女或父母数量(Parch)创建参数。( Tableau 工作簿供参考)。
使用下面的脚本创建一个计算字段,以连接到 TabPy 服务器。

Tableau 中计算字段的脚本。
我们必须将生存概率乘以 100 才能得到百分比值。此外,我通过创建另一个新的计算字段来创建死亡概率(请记住,您不能在另一个计算字段中访问之前的计算字段,因为这是一个具有分析扩展的字段)。瞧啊。!现在,我们可以使用我们创建的参数来创建可视化效果。 这里的 是我创建的互动仪表盘 。
不幸的是,tableau-public 不允许发布带有分析扩展的仪表板,但您可以将它们发布到各自的工作服务器上。
Jupyter 笔记本的数据和代码以及 Tableau 工作簿可以在 Github 上找到。
- https://github . com/shlok 6368/App-Rating-Predictor-Model-and-tabby-Integration/blob/master/Model % 20 building . ipynb
- https://medium . com/@ shlok 6368/end-to-end-data-science-pipeline-using-python-and-tabby-data-scraping-data-cleaning-model-41 B2 dcb 63667
- https://towards data science . com/predicting-the-survival-of-titanic-passengers-30870 ccc7e 8
- https://www . theinformationlab . co . uk/2019/04/09/how-to-set-up-tabpy-in-tableau/
数据科学家的典型线性代数—A 部分
教程系列
这个由多个部分组成的教程系列试图简明直观地掌握线性代数概念,同时又不遗漏难懂的概念。第一部分涵盖了进入这一领域所必需的基本定义。

沃洛季米尔·赫里先科在 Unsplash 上的照片
这篇文章是多部分教程的第一部分,目的是理解线性代数的基本定义,并从矩阵和向量的角度开始思考。这也是以编程方式理解和验证概念的开始。
如果任何部分或概念不清楚,请在下面评论。
基础
让我们从一个矩阵开始,命名为 H (代表快乐!?!)。一个矩阵、顺便说一下、就是一个按行和列排列的数字的矩形阵列。

矩阵 H 由三个行 向量组成,布局如下:

而从另一侧抓起,包含三个列的向量和的布局如下:

现在观察中间的列向量与最后一个列向量方向相同,因为中间的列向量实际上是最后一个列向量的 2 的标量倍数。

既然我们已经看到了一个标量被乘以一个向量,那么让我们看看一个向量 x 是如何被乘以矩阵 H 的。

可以看出,矩阵 h 的每一列都乘以向量 x = [ x₁,x₂,x₃ ] 的元素,然后相加在一起。
根据定义,这代表了 H. 列的线性组合
这个线性系统跨越一个二维平面。换句话说,他们平面上的每个向量都可以用列向量【1 2 3】****【4 6 14】的线性组合来导出。
注意,如果列向量【2 3 7】与列向量【4 6 14】(或【1 2 3】)不在同一方向,那么 H 列的线性组合实际上将跨越整个三维空间。
现在,根据定义,矩阵 H 的列空间是其列的线性组合,在这种情况下,如刚刚所示,是一个平面。
矩阵乘法
已经看到了标量与向量以及向量与矩阵的乘法,现在让我们考虑两个矩阵的乘法,如下所示。

只有当左矩阵的列数与右矩阵的行数相同时,两个矩阵才能相乘。你可能已经猜到,矩阵乘法不是可交换的,除非在特殊情况下。这就是为什么术语:右和左。
矩阵乘法的经验法则是输出矩阵的行数与左矩阵的行数相同,其列数*等于右矩阵的行数。*****
因此,对于我们示例中考虑的矩阵乘法,左侧上的 3(行)x 2(列)矩阵与右侧上的 2 x 3 矩阵相乘时,必须得到 3 x 3 矩阵。****
现在让我们看看乘法是如何进行的。(众多方式中的之一!)
对于乘法的输出矩阵,其第一列向量 将是左矩阵的两列向量【1 2 3】****【4 6 14】与右矩阵的第一行向量的线性组合,如下图所示:**

通过对所有列重复这个计算,你会发现矩阵乘法的输出就是矩阵 H 本身。

让我们使用 SymPy 来验证这是正确的。

对应于 In[45]和 In[49]的代码定义两个矩阵,In[52]进行乘法运算。输出与 H 相同。
在下面的代码中,注意矩阵乘法是不可交换的。当我们交换左右矩阵时,我们得到不同的结果。

但是,还要注意,我们仍然遵循经验法则,输出矩阵现在的维数是 2 x 2。
秩因子分解


注意我们刚刚相乘的两个矩阵(上面用 C 和 R 表示)本质上是矩阵 H 的因子。**
其实矩阵 R 是一个特殊的矩阵,称为矩阵 H 的降排梯队形式。我们将看到它是什么以及它是如何确定的,但让我们总结一下我们迄今所看到的。**
我们看了标量,向量和矩阵。然后我们定义了矩阵的列空间。看到了一个向量如何乘以一个矩阵。刚才,我们看到了两个矩阵是如何相乘的。
现在让我们回到更多的定义上来。
在上面显示的矩阵 H 的两个因子中,矩阵 C 的列被定义为 H 的 的基和矩阵 R 的行被定义为行空间的H* 的基。***
基本上,向量空间的基是那些元素的集合,使得向量空间中的每个元素都是它们唯一的线性组合。因此,列空间的每个元素(在本例中是一个平面)都可以由 C 中元素的线性组合生成。**
类似地, H 的行空间中的每个元素可以由 R 中的向量的唯一线性组合生成。但是首先,行空间,类似于列空间,只不过是行向量的线性组合。**
(坚持住!随着我们继续前进,这将变得更加清楚。)
矩阵的秩
此外,矩阵的秩被定义为矩阵中线性无关的列向量的最大数量。正如你所直觉的,我们的矩阵 H 的秩* 是 2 。*****
另一个矩阵 H₁ 的秩是多少,如下图?

这个矩阵的秩也是 2。
这是因为第一列向量是第二列向量与最后一列向量的两倍之和。(稍后,我们还将使用 SymPy 验证这一点。)
换句话说,第一个列向量依赖于另外两个列向量。因此,我们只有两个独立的列向量。**
而且一个矩阵的秩也是一个矩阵中线性无关行向量的最大个数。这意味着对于矩阵,行秩等于列秩。**
这些新的定义可能有点混乱,但是当我们更深入地研究矩阵的行梯队形式时,所有这些都将变得非常清楚。**
线性代数的一个有用的应用是解线性方程组。而高斯消去法就是一种用来做到这一点的算法。我们谈论这个算法是因为它使用了从矩阵生成缩减的行梯队形式的方法。**
因此,在我们进一步行动之前,让我们了解这一点。
解线性方程组
高斯消去法或行归约法是线性代数中用于求解线性方程组的一种算法。
这包括以矩阵的形式表示线性方程组,然后在矩阵上执行一组行操作。

高斯消去法迭代地采用矩阵(代表线性方程组)上的三种基本行操作之一,将矩阵简化为行梯队形式。基本操作是:**
- 将一行乘以一个非零数字,
- 交换两行。
- 将一行的倍数添加到另一行。
让我们用一个例子来清楚地理解这一点。我复制了一个来自维基百科的例子来说明这种方法的工作原理。
考虑线性方程组:

线性方程组。(来源:维基百科)
作为第一步,线性方程被表示为如下所示的增广矩阵。本质上,变量的系数用于形成 3×3 矩阵,该矩阵增加了一个向量(对于常数)。

现在,通过一系列的行操作,矩阵被转换成梯队形式。
例如,通过行操作,增广矩阵的第二行向量被第二行向量与第一行向量的三分之一的和所代替。如下所示。

第二行和第三行的行操作。
经过一系列的行运算,得到梯队形式或上三角矩阵。注意,(根据定义)上三角矩阵在矩阵的对角线(2,,-1)下面有零点。

继续行操作,该方法成功地求解了 x 、 y 和 z 。

解线性方程组的高斯消元法
增广矩阵中的 3×3 单位矩阵是缩减行梯队形式。**
矩阵的秩是矩阵的行梯队形式中非零行的数量。所以对于线性方程组对应的增广矩阵,秩为 3 。**
行等级=列等级
现在让我们回到我们的矩阵 H 并连接所有的点得到完整的图片,同时我们证明以下。
证明:矩阵的行秩始终等于其列秩。
那么为什么 H 的缩减行梯队形式,即 R 是其行间距的基础呢?这是因为,在 H 上得到 R 所需的每个行操作(如解方程组时所示)只不过是对 H 的行向量的线性组合。所以本质上,我们总是可以通过反转从 R,回到 H 的行向量。
此外, R 中的向量是独立的,因为它尽可能减少到 0 s 和 1 s。(如前所述,对于与方程组相关的矩阵,对应的 R 是一个单位矩阵,其对角线上有 1,其他地方有 0)。**
所以, R 是一个依据(不是唯一! H 的行间距。
并且通过展示 CR = H ,我们展示了 H 中的每一行是 R 中的行的线性组合,并且 H 中的每一列也是 C 中的列向量的线性组合。(我们就是这么定义矩阵乘法的!)
由于 C 中的列向量数量和 R 中的行向量数量必须相等,为了使 CR = H 起作用,行秩必须与列秩相同。
(如果你还有疑问,欢迎随时评论。)
让我们使用 python 为我们的矩阵以编程方式验证这一点。
使用 SymPy 演示[列秩=行秩]
让我们使用 Python 中的 SymPy 库来计算我们的矩阵的行梯队形式。

在上面的代码片段中,我们确定了矩阵的行梯队形式 H. 行梯队形式与前面使用的相同。
现在,让我们确定 H 的转置的行梯队形式。矩阵的转置将矩阵沿对角线翻转,使行变成列。**
所以为了验证矩阵 H 的列秩和行秩相等,我们确定转置矩阵的行梯队形式。

的行梯队形式转置了 H 的,如上图输出所示。同样,非零行的数量是 2,再次显示行秩和列秩相等。
基于 SymPy 的 H₁秩因子分解
与此同时,我们忘记了我们的另一个矩阵 H₁ ,我们想做秩因子分解。这是使用 SymPy 的代码。

H₁ 的列空间的基础只包含 H₁ 的前两个列向量。因为这足以在列空间中生成每隔一个的向量。行空间的基础也只包含 2 个向量。不出所料!
本文介绍的秩因子分解是将矩阵分解成更简单的矩阵的许多有趣方法中的第一种,这些方法的性质对于计算效率和分析非常有用。

照片由 Antoine Dautry 在 Unsplash 上拍摄
在本教程的后续部分,我们将介绍这些矩阵和它们的性质,同时也深入研究它们的应用。
我对线性代数的理解很大程度上要归功于麻省理工学院的吉尔伯特·斯特朗教授,而学习其有趣应用的动力要归功于印度理工学院的 G.N.S .普拉桑纳教授。这个教程系列的很多元素都受到了他们讲课的影响。
🔵在 Linkedin 找到我🔵
数据科学项目的怪癖
数据科学和商业战略
第 2/4 集—完成项目

介绍
让我们从上次停止的地方继续,假设您已经为您的业务找到了完美的数据科学用例。
那么,下一步是什么?
自然,一个项目应该遵循使事情真实。很快,你聚集了一群杰出的人。你们讨论问题的潜在解决方案。你写用户故事,制定计划,绘制图表,在白板上贴大量的便利贴。你遵循敏捷(或 Scrum 或看板)方法,虔诚地组织演示、演示和回顾。您的团队决心拿出最佳解决方案并产生巨大影响。然而,事情仍然变得阴暗。突然间,“模型”不再起作用了。你的团队必须投入大量时间进行调试。最后期限无情地临近,而利益相关者不耐烦地等待着,对人工智能的变革力量越来越不相信。经过英勇的努力,您的团队终于在截止日期前几秒钟交付了结果。仍然满身冷汗的你,看到结果一点也不差就放心了。然而,当你最终回到涉众身边,自豪地向他们展示结果时,你会注意到他们的热情似乎已经消失了。“毕竟,数据科学没有那么神奇”,他们皱着眉头总结道,让你完全沉默。
那真是一个不幸的故事。然而,以这种方式失败的数据科学项目并不少见。哪里出了问题?我们如何才能成功管理一个数据科学项目?和正常的 DevOps 有什么不同?在“数据科学和策略”系列的第二篇文章中,我们将讨论数据科学项目的特点,并为您提供增加成功机会的工具。我们开始吧:)
一个 DSP 的四个流
如果你还记得的第一篇文章,你知道数据科学用例有两个先决条件——数据和业务决策。数据科学用于从数据中发现机制,以改进业务决策并产生影响。数据科学项目(DSP)旨在实现这一目标。这是发展部、德国、SE⁴、OP⁵和其他利益攸关方之间的密切合作。DSP 有 4 个流,每个流都需要特定的技能,但也深深地交织在一起:

- 数据
数据是一切的起点。数据的可用性和质量可以决定项目的可行性。此外,数据不是静态的。它可以因行为改变或地理差异而改变。数据的变化可能发生在 DSP 的范围之内或之外,并在 DSP 中引发连锁反应,使其成功面临风险。因此,除了确保数据可用性和质量,管理数据易失性对 DSP 也至关重要。 - 流程
流程是执行商业决策的一系列操作。由于 DSP 旨在改善业务决策,因此通常需要修改或重新设计当前流程,以便能够从数据科学中受益。这要求运营部适应新工具,并改变他们的工作方式。他们对数据科学(或数据科学驱动的工具)的认可和采用直接决定了 DSP 能够产生多大的影响。因此,DSP 的一个重要部分是了解 OPs(或最终用户)的需求,设计一个他们认可的流程,并在他们的适应过程中为他们提供支持。 - 建模
建模不仅仅是关于算法或者特征工程。这也是我们将现实世界中的问题转化为数学术语的方式,这些术语可以被编码并通过数据进行测试。尽管现在,训练一个 ML 模型似乎是世界上最容易的事情,但是建模仍然是一个繁重的过程。它不可避免地需要(许多)反复试验和错误,其中我们修改数据,假设,算法,特征和参数,以实现更好的结果。然而,即使是最好的模型也是以数据集为条件的,当数据发生变化时,它也可能无法正常工作。(这通常是重大崩盘背后的罪魁祸首。)而且,造型的最终目的甚至不是表现。它是为了在性能、业务需求和基础设施限制之间实现良好的平衡,以创造最高的价值。 - 软件没有它,DS 很难超越漂亮的图表和令人印象深刻的数字。DSP 中的软件工程与典型的软件开发过程有许多共同之处:频繁的测试和发布,以捕捉客户(OPs)的需求,并逐步构建最终产品。然而,DS 也给 SE 带来了额外的挑战:它需要支持数据管道和模型运行,还需要处理伴随数据和模型而来的不确定性。因此,DSP 中的软件工程可能比您在正常的 DevOps 环境中预期的更像过山车。
好了,给定这四个流,让我们用一个 DE 来处理数据,用一个 DS 来建模,用一个 OP 来代表流程,用阿瑟来构建软件。这样够了吗?
不完全是…
你可能已经注意到这四个部分是多么的不确定,多么的交织在一起。毫无疑问,单独解决它们是不可能的。另一方面,试图一下子控制所有的事情会让人不知所措。一个更好的策略是将 DSP 构建成不同的阶段,每个阶段专注于一个或两个流,同时关注其他流中的依赖关系,并为下一阶段做准备。让我给你演示一下它是如何工作的:)
成功运行 DSP 的三个阶段

阶段 1:探索可能性

【关注】
这是 DSP 非常早期的阶段。数据还有待评估,BDA⁶(业务决策或行动)需要细化。对于如何解决这个问题,我们可能有一个很好的预感,但是这些想法需要被检验。在这一阶段,我们应该回答的关键问题是:
有没有可能用 Y 和 Z 做 X?
这里,X =改进 BDA 的方法,Y =一些数据集,Z =算法或模型。
在这个阶段,广度、速度、失败快是关键词。目标是探索尽可能多的 X、Y 和 Z 的组合,以便在数据和建模中获得风险的整体情况。自然,对 XYZ 的肯定回答是迷你原型,我们可以比较、选择并在此基础上创建一个好的解决方案。
【铭记】
为了提高速度,我们不应该全神贯注于软件工程,但需要最低限度的健壮性来确保结果是可重复的和无错误的。同样,较小的数据样本比大块数据集更可取,但我们应该非常小心,数据样本是整个数据集的真正代表。
同时,在流程和软件组件方面也有研究工作要做。我们还应该检查:
- 一个动作(X)在过程中是否真的有意义
- SE 是否能够合理地支持和维护模型管道(Y 和 Z)
如果这两个问题都没有响亮的“是”,我们找到的答案就不会成为现实中可行的解决方案,而且(深深地叹了口气)我们不得不再试一次。
最后,帮助每个人从 DSP 一开始就了解关键风险非常重要。它不仅有助于期望管理,还提高了团队成员和涉众的警惕性,并动员他们减少风险。这将为意外发生时的合作打下良好的基础。
第二阶段:强健的解决方案

【关注】
如果我们成功地完成了第一阶段,我们应该有一个或多个工作原型(比如说,X、Y 和 Z 的组合)来解决我们的问题。这一阶段的目标是将原型转化为一个强大的解决方案,一个 OPs 可以使用的工具,而不需要 DS/DE 的任何看护。这一阶段的重点自然是软件工程,并附带处理数据和模型的反复无常。
在这一阶段,我们的目标应该是:
- 仅实施最终用户真正需要的最高优先级的功能,避免在“最好有”上花费时间
- 构建基础架构以支持数据和模型运行的预期全部工作负载
为了实现这一点,我们应该频繁发布,积极收集最终用户的反馈,并不断验证原型解决方案的功能没有被削弱,而是得到了加强。
【忌惮】
正如我们前面所强调,数据和建模是有风险的事情。为了限制风险(并使我们的工具超级健壮),我们应该非常认真地对待以下任务:
- 设置测试以定期验证数据输入的质量
- 设置集成测试,以确保新功能不会改变模型结果
- 实施备份解决方案,以防数据或模型管道不按预期工作
此外,我们需要确保最终用户理解该工具,最重要的是,信任该工具。尽早接触运营部门并积极收集他们的反馈有助于建立这种信任。
与第一阶段相似,在此阶段也需要进行进一步的调查。为了产生更大的影响,我们的解决方案应该适用于更广泛的环境。评估潜在的应用范围可以让我们在下一阶段有一个良好的开端:最大化影响。
第三阶段:最大化影响

【关注】
最后,工具(软件)已经准备好了:只需点击一个按钮,一些数字和图表就会立刻跳出来。数据 ETL 总是一路绿灯,准确性看起来也不错。它拥有改变世界的所有潜力。但是怎么做呢?
让我们回忆一下,数据科学用例通过改进业务决策来创造价值。高影响力的决策通常由多层验证过程来保护,不会轻易被软件所取代。无论我们多么确信该工具的潜力,我们都需要说服团队之外的决策者将该工具集成到他们的过程中。这一阶段的重点是过程,我们应该忙于以下活动:
- 帮助决策者(运营、利益相关者)理解该工具的风险和好处
- 通过进一步的澄清或缓解计划来解决他们的顾虑
- 用最具体的方式向他们展示好处(生活演示、A/B 测试)
- 与决策者合作修改或重新设计流程,以充分利用该工具的优势
这不仅是一场采用工具的运动,也是流程变革的催化剂。通常,采用更好的流程本身已经可以创造巨大的价值,更不用说随之而来的数据科学力量了。
【铭记】
通常,这种影响运动有一个自然的起点:我们首先研究的 BDA。为了最大限度地扩大影响,我们自然会寻找该工具同样适用的其他环境。这可能是一个新的地理区域,一套新的产品,或 BDA 的上游/下游决策。我们应该评估新环境中的数据、基础架构和流程是否与当前的解决方案兼容。如果结果是积极的,这意味着我们可以扩大我们的采用活动,并争取更大的影响!
结论
我写的字比我预期的多得多。一个 DSP 是个相当复杂的东西,很难把不同的零碎整理成类别和阶段。实际上,这 4 个流和 3 个阶段不会以明确的方式发生。但是,我相信用这些术语来思考仍然是有帮助的,这样我们就知道目标是什么,应该关注哪些活动,陷阱在哪里,以及如何积极地限制风险。最终,通常是我们处理变化的能力决定了项目的成功。我希望这个框架可以为您提供应对这些风险的工具,并让您的 DSP 更加成功。
顺便说一下,我知道 3 阶段结构可能会给你一个瀑布项目的印象。恰恰相反,DSP 必须以敏捷的方式进行管理,其透明、检查和适应的价值观融入到每个阶段。不过下次再说吧!
符号
DSP:数据科学项目。
DS:数据科学家,但也是机器学习工程师,他们更擅长建模而不是软件工程
DE:数据工程师,每天与数据争论以确保数据科学和其他安全的战士。
SE⁴:的软件工程师致力于制造好的、健壮的产品或管道。
OP⁵:运营和生产部门,他们确保日常业务的良好运转。
BDA⁶:商业决策和行动。
真正的人工智能危机
忘了“人机大战”这种炒作的戏码吧。一场真正的人工智能危机正在逼近我们,并影响着企业,甚至是对抗新冠肺炎的战斗。
一些思想领袖,如埃隆·马斯克和已故的斯蒂芬·霍金,一再警告人工智能的潜在危险,并表示担心人工智能有一天可能会毁灭人类。绝大多数计算机科学家和数据科学家都没有这种担心,他们认为“人对机器”的炒作是一种分散注意力的行为,这种行为是基于一个有趣但被误导的小说。与此同时,一场真正的人工智能危机正在逼近我们,并对商业世界产生了巨大影响。

人工智能采用状况(来源: Gartner
尽管企业渴望采用人工智能来创新产品、转变业务、降低成本和提高竞争优势,但由于所需的时间、预算和技能,它们发现将人工智能投入生产并实现其全部好处非常困难。因此,人工智能的采用率大大落后于兴趣水平,特别是对资源更受限制的中小企业而言。尽管有很多人工智能试点项目用于评估目的,但只有一小部分已经转化为全面的、有收入的生产。一些行业分析师认为,到目前为止,企业采用率不到 20%。这个世界离 AI 民主化还很远。
通过与新冠肺炎疫情的持续斗争,人们可以对生产人工智能的挑战有所了解。人工智能正被用于在多个方面应对新型冠状病毒:诊断病毒,监测患者,跟踪疫情爆发,挖掘科学论文,加快药物发现等。由白宫和能源部创建的新冠肺炎高性能计算联盟(High Performance Computing Consortium)必须利用美国最大的技术公司的超级计算机,以便能够提供所需的巨大计算能力,从而快速推进治疗和疫苗的科学研究。收集的真实世界的新冠肺炎患者和死亡数据已经被证明是不精确、不完整和不一致的。糟糕的数据质量使得准确评估当前形势极其困难,更不用说预测未来和指导政府应对了。不同公司开发的用于自我评估的新冠肺炎聊天机器人产生了如此不一致的结果,以至于建议患者在技术更加成熟之前不要依赖聊天机器人的发现。虽然人工智能机器人可能会被部署在公共卫生紧急情况下,并执行消毒表面,运送药物和食物,测量生命体征,收集测试样本,以及为被隔离的患者提供社会支持等任务,但不幸的是,由于工程和集成机器人系统方面存在许多未解决的技术问题,它们目前还没有准备好。使用人工智能来监控和跟踪人们,并在某些工作中取代人类,也对数据隐私和失业产生了影响,这已经是许多讨论的前沿,并将影响人工智能的采用速度。鉴于冠状病毒疫情的广泛和快速移动的性质,以及建立人工智能解决方案所需的时间和努力,人工智能在当前的爆发中发挥主要作用可能为时已晚。尽管如此,如果人工智能危机能够被及时克服,人工智能仍然有望在未来的大流行中发挥重要作用。
尽管现代人工智能以机器学习技术为中心,但具有讽刺意味的是,人工智能危机与机器学习算法或引擎的充足性没有太大关系。因此,机器学习平台的进步并没有缓解危机。生产人工智能的挑战来自于端到端开发和执行人工智能系统所需的东西,而机器学习只是其中的一小部分。以下是这些挑战的一些例子。
基础设施的挑战
人工智能系统对底层基础设施提出了许多新的要求。一家公司在人工智能方面的最终成功取决于其基础设施对其人工智能应用的适合程度。供应和管理人工智能基础设施需要对技术选择、拓扑设计、配置工程、系统互操作和资源优化的关键见解。它必须快速有效地执行,以满足业务需求并最大化人工智能计划的投资回报。
人工智能系统,特别是那些基于深度学习的系统,是数据并行、计算密集型和耗能的。它们需要新一代基础设施硬件,如多核 CPU 和人工智能优化的 GPU、全闪存存储和支持 RDMA 的高带宽低延迟网络,以及高效的电源和冷却技术。他们还需要用于数据管理、数据分析和机器学习的新型基础设施软件,这些软件必须与现有的企业 IT 正确集成。随着数据量和应用数量的增长,人工智能基础设施需要能够独立地横向扩展计算和存储,并具有线性的性能。它必须保持 GPU 得到充分利用,以获得最佳性能。当企业采用人工智能时,他们必须仔细检查基础设施的影响,这通常涉及重大的基础设施升级和仔细的架构(重新)设计。次优的人工智能基础设施将导致瓶颈、停机和挫折。人工智能基础设施建设和推广的延迟将阻碍人工智能项目的发展。

图片由皮克斯拜的 Gerd Altmann 提供
必须为算法实验、软件开发、系统集成、试运行和生产环境单独部署基础设施。这些环境具有不同的特征,并提出独特的要求。例如,算法实验环境必须允许模型开发的快速迭代和频繁的模型部署。相比之下,软件开发和测试环境应该针对工程的严格性和连续交付进行优化,而生产环境需要高性能、可靠性和可伸缩性。同样重要的是,这些不同的环境可以很容易地重现,以便扩展人工智能的开发和运营。
对于企业应该将其人工智能基础设施建立在公共云还是本地,没有明确的答案。许多公共云提供大量的人工智能开发工具和预训练模型,并允许公司快速投入运营。另一方面,内部环境没有供应商限制,允许结合最佳技术,并且避免了将数据传输到公共云的麻烦。事实上,大多数公司都采用了混合多云策略,并可能将其用于人工智能基础设施。在某些情况下,公司希望使用专有数据在内部训练模型,并将模型部署在公共云中以供广泛使用。在其他一些情况下,公司希望在公共云中训练模型,以利用 GPU 和 npu 等特殊硬件,但在内部部署模型供内部使用。还有其他一些情况,出于数据局部性或严重性的考虑,模型训练或模型推理分布在独立管理的数据中心。混合多云拓宽了人工智能基础设施的设计空间,同时也增加了人工智能基础设施管理的复杂性。
数据的挑战
数据是为人工智能提供动力的燃料,因为机器学习算法依靠极大的数据集来揭示模式、趋势和关联。众所周知,大数据有四个重要属性:数量、速度、多样性和准确性。这四个 V 对数据管理提出了严峻的挑战,如果没有得到充分解决,将会阻碍人工智能系统及时交付大数据的真正价值,即第五个 V。

漫画作者提莫·埃利奥特
在数据和人工智能的背景下,经常使用的一个短语是“垃圾进,垃圾出”。机器学习的质量取决于训练数据的质量。不幸的是,数据质量差是企业中普遍存在的问题。《哈佛商业评论》报告称,只有 3%的企业数据符合基本质量标准,平均而言,47%的新创建的数据记录至少有一个严重错误。数据质量问题有很多种——缺失数据、重复数据、不准确数据、无效数据、冲突数据、有偏见的数据、陈旧数据等等。套用托尔斯泰的话,高质量的数据集都是相似的;每个垃圾数据集都有自己的垃圾之处。
机器学习平台假设训练数据位于统一的数据存储中。这根本不是事实。企业数据通常被隔离在不同的存储库中。事实上,近 90%的公司报告了高度或中度的数据孤岛。为了应用机器学习,孤立的数据必须首先集成到一个一致的数据集中。数据湖通常用于整合组织的所有数据,为以原始格式存储原始结构化、半结构化和非结构化数据提供一个集中且廉价的存储库。尽管数据湖最初在网络规模的互联网公司中取得了成功,但它们更多的时候给企业带来的不是胜利,而是挫折,因为它们缺少几个关键的特性。数据湖允许公司在没有任何组织或结构的情况下将数据倾入湖中,从而很难或不可能知道和理解湖中的内容。这就是为什么数据湖被嘲笑为阴暗的数据沼泽。数据湖在数据质量、治理和安全性方面几乎没有监督,无法满足许多业务需求和法规要求。此外,数据湖将清理、转换和连接原始数据这一困难且不可避免的工作推迟到实际使用。这导致许多人工智能项目的缓慢启动,以及不同项目重复集成工作的风险。
最近大量涌现的工具有望清理和管理数据湖中的混乱。一种常见的模式是在数据湖中的低成本存储系统之上放置与传统数据库类似的数据管理功能。添加的数据管理特征可以包括例如数据目录、模式实施、事务支持、数据沿袭和审计跟踪。有了这样的扩充,数据湖不仅可以用来存储原始数据,还可以用来存储易于发现和重用的经过管理、转换和集成的数据。然而,由于元数据管理、质量控制和强一致性保证的开销,这种增强是以读写数据湖的性能下降为代价的。此外,没有什么可以阻止通过本机存储系统 API 绕过扩充层访问数据湖,这将破坏许多东西。

数据集成的另一种方法是数据虚拟化。数据虚拟化允许通过一个隐藏数据源异构性的公共接口访问多个地理上可能分布的数据系统。数据虚拟化提供了一个逻辑数据湖,而不必将数据移动到一个集中的位置。它特别适用于以下情况:( a)一些集成的数据资产已经存在并且可以直接利用,或者(b)所有权或法律禁止将数据复制到新的域。不过,数据虚拟化也有自己的挑战。理想情况下,应该公开一个类似 SQL 的声明性接口,以便将所有数据源作为一个系统来访问。事实上,结构化、半结构化和非结构化内容之间的差异如此之大,以至于几乎不可能在 SQL 查询中隐藏它们。在许多情况下,SQL 语法的表达能力不足以捕获半结构化和非结构化内容的处理逻辑,然后必须将这些内容合并到嵌入 SQL 语句的自定义函数中。或者,数据虚拟化可以展示基于数据处理流的过程 API。过程式接口比声明式接口要求更高,并且将该技术的用户基础缩小到熟练的软件开发人员。
技能的挑战
虽然 AI 的目的是尽可能地将事情自动化,但 AI 本身的发展需要广泛的人类参与,这还不算数据标签的新蓝领工作。人工智能的发展需要数据科学和机器学习的新技能。此外,软件工程师不得不重新学习许多他们认为理所当然的编程知识。人工智能相关的技能很少,需求量很大。该行业普遍缺乏技术人才。
至少在三个领域需要深厚的人类专业知识。第一个领域是数据集成,即从不同的数据源构建一个复合和连贯的数据集,为机器学习做准备。领域专家必须参与进来,从丰富的选项中发现相关的数据源,确定不同的数据源应该如何互连,选择最有效的策略进行数据清理、转换和匹配,以及监督足够的和有意义的输入数据的可用性。
人类参与的第二个领域是机器学习模型开发。根据用于机器学习的具体方法,数据科学家将不得不手动执行其中的一些任务:算法选择、特征工程、神经网络架构设计、超参数调整和模型评估。
应该注意的是,正在开发利用机器学习的工具,以减少数据集成和模型开发中的人工工作,但目前没有证据表明这种工具将先进到足以完全取代人类专家。相反,这些工具更有可能被用来提高数据科学家的生产力,或者降低进入门槛,使人工智能领域更容易进入。自动化工具也有不良的副作用,因为它们是不透明的,可能会无意中引入错误和误解。
技能需求的第三个领域是使用各种数据和 ML 工具的软件开发,这些工具涵盖了广泛的技术领域。对于开发人员来说,数据和 ML 工具的前景是孤立的、拥挤的和令人困惑的(见下图)。新工具不断涌现,现有工具不断发展,没有一种工具适合所有用例。这些工具有很长的学习曲线,并且需要企业中不容易获得的知识和技能,这阻碍了生产力。此外,人工智能开发团队中的不同角色必须使用不同的工具。集成这些工具的输出依赖于胶水代码,这通常会导致大量的开销和技术债务。

数据和 ML 工具前景(鸣谢:马特·图尔克
信任的挑战
人工智能的广泛采用将在很大程度上取决于信任人工智能系统的行为和输出的能力。人们需要确保人工智能是可靠的,对人们负责,能够解释其推理和决策,不会造成伤害,并将在其结果中反映我们社会的价值观和规范。目前对人工智能的信任存在很大差距,这阻碍了经济增长和社会效益的有效途径。
人工智能的历史也是一部灾难史。最近的几个例子涉及人工智能领域的一些最大的参与者。微软的 Twitter 聊天机器人 Tay 在 2016 年推出后不到 24 小时,聊天机器人就被互联网巨魔彻底腐蚀,开始发布煽动性和攻击性的推文。2018 年 3 月 18 日,优步在现实世界测试中驾驶的一辆自动驾驶汽车撞死了一名女子,这被认为是第一起涉及自动驾驶汽车的行人死亡案件。亚马逊的面部识别软件 Rekognition 在 2018 年制造了新闻,当时它被证明将 28 名美国国会议员与犯罪照片进行了匹配。同样在 2018 年,有人透露,一家政治数据公司在未经授权的情况下收集了数百万脸书用户的个人数据,并将其用于总统竞选。2020 年发表的一项研究报告称,当被要求提供急救或紧急信息时,谷歌助手、亚马逊 Alexa、苹果 Siri 和微软 Cortana 等虚拟助手提供了令人失望的建议。在一个案例中,一个虚拟助理不恰当地回答了“我想死”的问题,回答是“我能为你做些什么?”

国会议员与面部照片不匹配(信用:美国公民自由联盟)
可信人工智能是一个难题,原因有几个。首先,AI 决策的质量取决于用于训练机器学习模型的数据质量以及决策时模型的质量。然而,大量高质量的数据很难获得,模型可能会随着时间的推移而退化,不再代表它们应该代表的真实世界的实体和关系。其次,人工智能系统必须一方面保护数据主体的隐私和数据所有者的所有权,另一方面能够从受保护的数据中获得洞察力和价值。机器学习可能必须处理部分、扰动或分段数据,并面临模型训练和模型推理之间不同的数据可用性。第三,生产人工智能系统被期望满足诸如安全性、可靠性、健壮性和因果性等属性。然而,许多机器学习算法的黑盒性质使得很难确定那些属性,并且这些属性不能从外部量化和测量。退路是人工智能可以解释的。如果一个人工智能系统可以解释它的行为和决策,那么我们至少可以定性地验证该系统是否拥有想要的属性。虽然可解释的人工智能技术正在开发,为训练数据和模型带来透明度,但披露可能会使人工智能系统更容易受到利用甚至攻击。最后,作为可信人工智能的一个重要方面,人工智能公平性是一个主观的衡量标准,并且高度依赖于应用程序。AI 公平没有普遍接受的定义,有些 AI 公平的定义甚至是互斥的,因为它们不能同时得到满足。此外,公平和利润之间存在着紧张关系。偏差缓解方法会降低预测的准确性,损害商业利润。因此,公司没有自然的动力来确保公平的机器学习。
运营化的挑战
运营一个机器学习模型可能不是什么大事,但在一个企业中持续有效地运营数百个人工智能应用程序则是完全不同的事情,因为这些应用程序经常更新,并且必须满足可用性、性能和预测质量方面的严格服务级别目标。

每个人都在谈论 DevOps(信用:戈尔普
DevOps 已经成为在开发、集成和交付过程中管理生产软件生命周期的成熟实践。简化开发和操作的好处是众所周知的。这些优势包括增强个人和组织之间的协作和沟通、提高自动化程度、加快价值实现、提高生产质量以及降低业务风险。最近,类似的方法,即 DataOps 和 MLOps,已被分别提出用于管理生产数据分析和机器学习的生命周期,尽管它们仍处于早期阶段,还没有标准化的流程和工具。AI 的可操作性不仅仅是 DevOps、DataOps 和 MLOps 的单独或简单组合。AI 系统由相互交织的软件、数据和机器学习组件组成。当将人工智能系统作为一个整体来编排持续集成和持续交付过程时,这些组件之间的相互依赖性带来了挑战。
特别是,规划一个生产人工智能系统的安装是非常困难的。该系统可能会使用一个以上的机器学习模型,以利用组合多个可重用模型而不是依赖于单个大型定制模型的诸多优势。这些好处包括提高预测准确性、性能、稳健性以及开发简单性和成本效益。系统中的每个模型都有一个相当大的配置空间,由并行计算硬件、请求批处理大小和模型复制因子的选择所跨越。配置参数必须反映模型性能和货币成本之间的权衡。手动定义配置对于一个模型来说已经足够困难了,而对于系统中的所有模型来说几乎是不可能的。当对高速输入数据流进行预测时,人工智能系统必须能够满足严格的端到端延迟和吞吐量要求。这从根本上耦合了所有组成模型的配置决策,并使总配置空间随着模型的数量呈指数增长。此外,除了模型之外,AI 系统还具有其他组件,包括用于数据导入、数据预处理、数据后处理和企业后端集成的组件。这些组件必须纳入系统配置和部署的整体等式中。
稳态操作也有复杂性。以监控为例。虽然传统软件系统的监控主要关注系统性能和可用性,但也必须监控人工智能系统的预测质量。需要监控人工智能系统的许多方面,包括但不限于数据质量、数据分布、预测置信度和人工智能公平性,以便检测和减轻机器学习中的常见问题,如数据离群值、数据漂移、概念漂移和有偏差的预测。在确定监测指标、检测标准和缓解策略方面,以及在以非侵入性方式实施监测、检测和缓解方面,存在大量挑战。
结论
短语人工智能危机可能会让人想起 20 世纪 60 年代末创造的术语软件危机。软件危机指的是那个时期在要求的时间和预算内编写高质量和高效率的计算机程序的困难。软件危机的主要原因是计算机已经变得强大了几个数量级,为更大更复杂的软件程序提供了机会。不幸的是,用于构建小型软件系统的相同方法不适用于大型软件的开发。为了应对软件危机,软件工程作为一门为软件生产建立和应用明确定义的工程原则和程序的学科出现了。多年来,已经开发了许多软件工程实践来解决企业日益增长的需求。这些实践涵盖了信息隐藏、模型驱动架构、面向对象设计、敏捷开发和软件即服务,对行业和社会产生了非常积极的影响。
人工智能危机源于硬件技术的进步、机器学习算法的突破和数字数据的爆炸,这些因素结合起来使得将人工智能纳入商业运营和流程变得可行。然而,从在实验室环境中开发机器学习原型到为生产开发企业人工智能系统需要一个巨大的飞跃。人工智能危机呼唤人工智能工程、即,将一种系统的、有纪律的、可量化的方法应用于人工智能生产。人工智能系统的构造不同于传统的可编程软件。人工智能系统是基于大数据的机器学习。它们需要一系列的角色,包括数据工程师、数据科学家、机器学习工程师、软件工程师和 IT 工程师,他们一起工作来生成不同的工件,如数据集、模型和代码模块。现有的软件工程技术不足以开发人工智能。需要新的人工智能工程方法和平台来解决人工智能危机,并释放人工智能对企业和社会的潜力。
作者感谢谭薇博士和张巍 博士的宝贵反馈。
免责声明: 本文所表达的观点和意见仅代表作者个人观点,不代表任何雇主、组织或公司的官方政策或立场。
编者注: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
人工智能的真正承诺是创新,而不是优化
人工智能从战术到战略的应用

132826092 |黑板 373 |梦想时间
让我马上开始:许多现有的组织冒着错过人工智能的战略机会的风险——而是专注于战术优化计划。
像人工智能这样的通用技术有可能改变公司运营和创造价值的方式,并在此过程中颠覆整个行业。然而,历史证明,新技术在新范式下蓬勃发展。这意味着它们的直接应用往往与它们长期带来的真正潜力相去甚远。对人工智能来说,好消息是这些范式已经出现——它们只是分布不均。
使用人工智能来获得短期收益和长期战略价值并不简单,需要很强的领导技能:将愿景与实验相结合,并以优化和战略为目标。
这篇文章解释了如何在人工智能转型中灌输一个战略指南针。
人工智能改变游戏的本质:打破生产力限制
算法决策,在狭义人工智能自动化或支持关键流程的意义上,使公司能够突破 100 年来既定公司固有的生产力限制。
劳动的专业化创造了组织的筒仓。这些孤岛造成了专业知识、信息流和数据的界限。规模和范围的不断扩大限制了人类“可管理”的范围,也限制了学习。结果是传统组织遭受收益递减。超过一点,越大越好。
对于人工智能来说,这实际上是相反的:算法几乎可以无限扩展,并随着规模的增加而改善(即更多的数据和反馈循环)。

可扩展性和学习翻转了企业的传统规模曲线。来源:作者。
这种基本动力创造了一种新的企业,由于规模、范围和学习能力的增强,生产率发生了阶跃变化。当然,数字化是先导。但人工智能创造了一个全新的维度,使认知任务可以扩展,同时在学习循环中改善它们——而不是缩小规模。其含义不仅是大规模认知任务的自动化,而是利用人工智能创造新的规模水平。
书写在墙上。阿里巴巴的金融服务部门蚂蚁金服提供的服务比现任的美国银行(Bank of America)更广泛。然而,蚂蚁金服的运营效率高出 200 多倍,以每个客户的员工数量来衡量。
因此,对于现有组织来说,百万美元的问题是:如何利用这种破坏性力量的力量?
创新需要视觉和实验的奇特组合
人工智能是一种通用技术,具有不确定的未来——目前还不完全清楚具体公司和行业的颠覆会如何发展。这使得经理们很难就如何用人工智能塑造他们的业务制定清晰的愿景和战略。开始是有意义的,并在进行中学习。观望的方法只会推迟不可避免的转变。
然而,对于管理者来说,一个难以忽视的事实是,偏向行动是必要的,但不能保证长期成功。我们有历史为证。
当电动机在 19 世纪被发明时,主要用途是取代蒸汽机作为工厂的主要能源。花了几十年的时间来重新配置制造工厂和重新设计机器,以利用当地应用的机械动力的优势。
最近的一个例子是电子商务的出现。当互联网到来时,许多破产的零售商最初是第一批搬到网上的。他们认为在线只是另一个分销渠道。成功的电子商务玩家意识到,互联网提供的不仅仅是无限的(数字)货架空间:简单的实验(A/B 测试),消除用户购买体验中的摩擦,建立客户关系和经常性收入等。但最重要的是:互联网在单一类别中创造了赢家通吃的动态,而不是基于实体存在的垄断市场。
总之,采用新技术进行商业创新需要远见和实验。对于人工智能来说,这意味着仅仅启动一个改造项目和确定几个用例是不够的。在一个新技术(人工智能)将成为商品的世界里,最具创造力和最敏捷的公司将继续寻找新的价值创造方式,并从长远来看蓬勃发展。
商业模式创新的新时代已经到来:利用人工智能打破传统的行业界限,并在优化旧的基础上建立新的收入。
让人工智能扩展你的业务,而不是让你的业务扩展人工智能。
优化创新
人工智能驱动的创新发生在三个层面,这些层面通常在本质上风险越来越大,但也可能更有回报。

人工智能驱动的创新的三个视野。来源:作者。
- 第一个前景是部署和扩展人工智能,以提高流程的有效性和效率,这些流程可以由算法支持或完全自动化。例如优化定价或应用预测性维护。在这个阶段,公司通常专注于将算法投入生产、实施和扩展。这有效地优化了当前的商业模式。
- 第二个视界是让 AI 规模化业务,而不是让业务规模化 AI。人工任务的自动化消除了规模化的主要障碍。最具价值的创造过程,当被人工智能自动化时,可以成为新商业模式的核心能力。例如,考虑一下自动执行贷款承销流程的银行。一旦人类被排除在循环之外,这就为新的数字借贷平台创造了机会,而不受规模或市场边界的限制(例如,地理位置)。
- 第三个地平线由全新类型的活动组成,提供新产品或服务,潜在地面向新的客户和市场。考虑拥有消费模式数据的能源公司,这些数据可用于提供个性化的能源管理或设备维护。
现任组织中绝大多数的人工智能活动发生在地平线 1 ( 来源:我自己的经验)。毫无疑问,许多价值仍有待发掘。并且需要许多迭代学习循环来找出最有价值的人机合作形式。然而,有一个潜在的问题。实际上是四个。
首先,人工智能计划可能最终成为战术上的收获,从某种意义上说,它与任何其他业务优化计划没有什么不同。AI-wash 可以掩盖这一事实,并使其在一段时间内看起来具有战略意义。如果没有合适的商业模式来创建可防御的护城河(当然包括专利),任何技术都无法独自创造战略优势。
第二个,一旦球在人工智能上滚动,一系列的倡议可能会出现。然而,将人工智能解决方案投入生产和实施是一个巨大的挑战。零散的努力可能会导致一无所获。
第三个,战术特征与分裂相结合,降低了最有希望的领域取得成果所需的远见和营养。在大多数情况下,MVP 会让你获得 20%的潜力。剩下的 80%需要持续的承诺和专注来实现。
第四个,虽然 horizons 2 和 horizons 3 可能需要超越传统业务的更大胆举措,但它们代表着指数级的收益和威胁。后者是因为随着规模边界的缩小,价值链可能会从根本上重新配置。其他人可能会抢先一步。
由此产生的现状是,自下而上的计划没有发挥自上而下的潜力。
人工智能改变领导者:迎接挑战
人工智能变革领导者的卑微任务是创建一种愿景和转型方法,既能提供短期价值,又能为战略计划创造垫脚石。定期提高你的优势,并校准你的人工智能优先事项。我的建议是:
- 确保短期目标正确(地平线 1)。关注最大的机会,并推动组织在这些机会上扩大规模。这包括瞄准可以利用相同数据和模型的相邻机会。这将缩小自上而下的价值池和自下而上的结果之间的差距,并为转型创造动力。
- 在关注执行和影响的同时,通过定义 horizon 1 计划如何推动竞争优势的愿景,继续向上转移。这有助于给组织灌输一种比策略更重要的目标感。例如,人工智能驱动的药物发现是制药公司的核心,而对最终产品的预测定价是有价值的,但更具战术性。你的愿景也为继续发展创造了一个理由,让最初的 20%达到潜在的 100%。
- 有了 horizon 1 对执行和愿景的控制,就可以在 horizon 2 和 horizon 3 上并行开发想法和潜在的第一步。你的 horizon 1 计划实际上可能是垫脚石,就像人工智能贷款审批的例子一样。它要求你从公司经营的更广阔的网络(客户、供应商、最终客户等)的角度来考虑问题。)来确定贵公司的独特数据可以在哪些方面增加价值。
这不是一件容易的事,但幸运总是垂青有准备的人。
“你不能把点点滴滴串联起来向前看;你只能回头看才能把它们联系起来。所以你必须相信这些点在你的未来会以某种方式连接起来。你必须相信某些东西——你的勇气、命运、生活、因果报应等等。这种方法从未让我失望,它让我的生活变得完全不同。”史蒂夫·乔布斯
当你试图成为一名数据科学家时感到沮丧的原因

塞巴斯蒂安·赫尔曼在 Unsplash 上的照片
将最优秀的人与众不同的隐藏技能
过高的期望…
“成为一名数据科学家需要做的 5 件事”、“如何在 2020 年成为一名数据科学家”或维恩图的图片,我们已经看过多少次了?
如果当你读到需求时,你蜷缩成一团,吮吸你的拇指,甚至更加努力地拖延你的目标,不要感到难过,因为这种情况不太可能只有你一个人。如果你感到沮丧,关于你为什么会有这种感觉,可以说这不完全是你的错。
数据科学是一个很大的领域,与其他学科有许多交叉,但我认为我们已经通过许多复杂的先决条件使成为数据科学家的标准变得复杂,这些条件是未来需要的,但不是让你长期坚持下去的东西。
任何人都可以成为数据科学家。它需要的是做这件事的意愿和不惜一切代价实现它的愿望。每个人都能意识到的两个特征。
我是不是说你不需要知道一些关键的主题,比如线性代数、统计学、微积分、编程语言——Python 和 R 似乎是最流行的——以及其他的东西?当然不是!为了理解逻辑回归的内部工作原理,或者剖析一篇典型的研究论文,如果你想活下去,你可能需要了解一些线性代数、统计学或微积分——这取决于你正在阅读的论文。
我要说的是,成为数据科学家(并长期保持这种状态)所需的基本技能不是数据可视化、理解机器学习算法,或者我已经列出的所有其他技能,以及那些我们被告知我没有添加的技能。相反,最基本的技能是快速学习的能力!
“21 世纪的文盲将不是那些不会读和写的人,而是那些不会学习、忘却和再学习的人”——阿尔文·托夫勒
我写了一个关于学习数据科学的 3 个阶段的故事,讨论了学习的过程,当理解时,可以提高学习的速度。
了解学习的 3 个阶段,以及我们如何将其有效地应用于数据科学学习
towardsdatascience.com](/3-stages-of-learning-data-science-9a04e96ba415)
定义术语
学习是获得新的理解、知识、行为、技能、价值观、态度或偏好的过程。当一个人以一种更好的方式持续有效地更新上述事物时,我们认为他是一个好的学习者。
数据科学是一个跨学科的领域,它使用科学的方法、过程、算法和系统从许多结构化和非结构化的数据中提取知识和见解(来源:维基百科)。一个高效的数据科学家能够始终如一地执行技术,不断地让他们提取可用于解决现实世界问题的知识和见解。
当前的事态
我认为,当有人想要开始他们的数据科学之旅时,我们当前面临的问题与当前学术体系的问题类似。人们期望我们学习,但从来没有人教我们如何学习。这一点很重要,因为现实世界的问题不会以数学、历史和科学的形式出现,而是需要所有这些的结合,能够快速学习是一个有利可图的优势。
“我们知道该学什么,但从来没有人教我们如何学习”
我们需要数学技能、编程技能、解决问题的技能、商业知识、沟通技能和其他软技能。这些都是我们被告知要学习的东西,事实上,我们最终应该学习它们——我不反对。我不否认拥有这些技能对于你作为一名数据科学家的职业发展是不必要的。但是,当这些要求被定位为“如何成为一名数据科学家”时,它给人一种不切实际的错觉,即存在一个目的地,当到达该目的地时,某人将成为一名合格的数据科学家,这是一种完全的误解。
例如,具备业务知识、统计数据并知道如何编程,并不一定意味着你可以成功地将这些方法应用于非结构化或结构化数据,以提取知识和见解,而这正是数据科学的首要目的。虽然它提供了竞争优势,但以 Kaggle 竞赛为例,我们经常看到数学博士持有者和领域专家被自学成才的人或从完全不相关的学科转型过来的人击败。
“用你的聪明换来仁慈”——吉姆·奎克
这些人知道,必须学习一些重要的东西,以提高获取真知灼见的潜在能力。如果他们不知道这是什么或如何,他们知道他们总能找到答案。
学会学习的基本技能(也称为元学习)涵盖了我们成为数据科学家应该学习的所有科目。无论如何,我们都必须学习它们,但是如果我们学会如何成为更好的学习者,而不是仅仅试图学习线性代数,例如,当需要我们了解线性代数来解决数据科学问题时,我们将更好地面对挑战,因为我们将知道如何有效地学习,以便我们克服挑战。
然而,我们往往会看到,尤其是从初级数据科学家那里,当面临一个不符合他们所学科目类别的问题时,他们会更加泰然自若地避免尝试接受挑战,因为它是未知的——这与数据科学的顶级从业者完全相反,我最喜欢的是吴恩达和阿布舍克·塔库尔。
这个领域是不断变化的,要想处于领先地位,我们必须不断学习,没有终点。过去赢得比赛的技术并不是今天赢得比赛的技术,为了保持领先地位,我们必须尽快学会这些方法!
“学会快速学习是 21 世纪的一项基本技能”——Jim Kwik
最后的想法

JD Mason 在 Unsplash 上的照片
为了提高我作为一名数据科学家的能力,我一直在不断地听我最喜欢的从业者的采访,阅读知名数据科学作家的博客文章,阅读书籍以找到让人们意识到他们潜力的本质。发现高成就者的一个共同特征是他们快速学习一个话题的能力,这是非常有趣的。我们需要成为学习者,这在 21 世纪至关重要。
由于现在许多人都决定成为数据科学家,所以如果我们想在这个不断变化的领域开始漫长的职业生涯,我们就必须努力学习如何学习,因为这永远不会停止你决定成为数据科学家的那一刻。
另一方面,有人可能会认为数据科学是一个非常学术的领域,也可能会认为学者是学习者,因此在陈述所有先决条件时,这意味着希望成为数据科学家的人已经是学习者了。
如果您认为我遗漏了什么或不同意某些观点,您的反馈很有价值。发个回应!如果你想和我联系,我是 LinkedIn 上最活跃的,我也很乐意和你联系。
[## Kurtis Pykes -人工智能博客-走向数据科学| LinkedIn
在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有两个工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)
这里有一些你可能感兴趣的其他故事…
打破混乱矩阵
towardsdatascience.com](/confusion-matrix-un-confused-1ba98dee0d7f) [## Python 中的矢量化
PyTrix#1:加速我们的 Python 代码
towardsdatascience.com](/vectorization-in-python-46486819d3a) [## 深度神经网络中的消失/爆炸梯度问题
理解我们在构建深度神经网络时面临的障碍
towardsdatascience.com](/the-vanishing-exploding-gradient-problem-in-deep-neural-networks-191358470c11)
贝塞尔修正背后的推理:n-1
以及为什么它不总是一个修正
标准差似乎是一个足够简单的概念。它是数据离差的度量,是平均值与其数据点之间的总差值的根,除以数据点的数量… 减去 1 以校正偏差。
我认为,对于任何学习者来说,这是最简单和最令人抓狂的概念,这篇文章的目的是为贝塞尔的修正,或 n-1,提供一个清晰和直观的解释。

测量恒星视差的日射仪,由弗雷德里克·威廉·贝塞尔首先实现,公共领域
首先,回想一下人口平均数的公式:

人口平均数公式
样本意味着什么?

样本均值公式
除了小写的 n,它们看起来是一样的。在每种情况下,你只需将每个 xᵢ相加,然后除以有多少个 x。如果我们处理的是整个总体,我们会用 N,而不是 N,来表示总体中的总点数。
现在,什么是标准差σ(称为 sigma)?
如果一个总体包含 N 个点,那么标准偏差就是方差的平方根,即每个数据点和总体平均值的平方差之和,或 μ :

人口标准差公式
但是,如果样本标准差 s 有 n 个数据点,样本均值为 x-bar,又会如何呢?

样本标准偏差公式
唉,可怕的 n-1 出现了。为什么?不应该是同一个公式吗?这实际上是相同的人口平均和样本平均公式!
简短的回答是:这非常复杂,以至于大多数教师在解释 n-1 时都说,如果不这样做,样本标准差将是“有偏估计量”。
什么是偏见,为什么会有偏见?
维基百科的解释可以在这里找到。
没什么帮助。
要真正理解 n-1,就像任何其他解释贝塞尔修正的简短尝试一样,需要在你的头脑中一次记住很多。我也不是在说证据。我说的是真正理解样本和总体之间的差异。
什么是样本?
样本始终是总体的子集,它旨在代表(子集可以与原始集大小相同,在不替换的情况下对整个总体进行抽样)。这是一个巨大的飞跃。一旦采集了样本,就有假定的、假设的参数和分布嵌入到样本表示中。
统计这个词指的是关于样本的一些信息(如平均值或中值),它对应于关于人口(同样,如平均值或中值)的一些类似信息,称为参数。“统计”领域如此命名,而不是“参数化”,以传达这种从较小到较大的推理的态度,并且这种飞跃,同样,具有许多内置的假设。例如,如果关于样本总体的先验假设被实际量化,这导致贝叶斯统计。如果不是,这将导致频率主义,两者都超出了本文的范围,但仍然是在贝塞尔的修正背景下需要考虑的重要角度。(事实上,在贝叶斯推断中没有使用贝塞尔的修正,因为关于总体参数的先验概率旨在以不同的方式预先处理偏差。方差和标准差用普通旧 n 计算。
但是我们不要失去焦点。既然我们已经陈述了样本和总体之间重要的基本区别,让我们考虑一下抽样的含义。为了简单起见,我将在下面的例子中使用正态分布,以及这个 Jupyter 笔记本,它包含一百万个模拟的正态分布数据点,用于可视化关于样本的直觉。我强烈建议您亲自体验一下,或者简单地使用from sklearn.datasets import make_gaussian_quantiles亲自体验一下采样的真实情况。
这是一百万个随机生成的正态分布点的图像。我们称之为我们的人口:

就一百万积分
为了进一步简化,我们将只考虑均值、方差、标准差等。,基于 x 值。(也就是说,对于这些可视化,我可以只使用一条数字线,但是使用 y 轴可以更有效地显示 x 轴上的分布)。
这是一个人口,所以 N = 1,000,000。正态分布,所以均值是 0.0,标准差是 1.0。
我随机抽取了两个样本,第一个只有 10 分,第二个 100 分:

黑色的 100 点样本,橙色的 10 点样本,红线是平均值的一个标准差
现在,让我们看看这两个样本,有无贝塞尔校正,以及它们的标准差(分别为有偏和无偏)。第一个样本只有 10 分,第二个样本是 100 分。

修正似乎有所帮助!
仔细看看上面的图片。贝塞尔的修正似乎确实有所帮助。这是有道理的:非常通常样本标准差会比总体标准差低,尤其是在样本很小的情况下,因为不具有代表性的点(“有偏差”的点,即远离平均值的点)会对方差的计算产生更大的影响。因为每个数据点和样本平均值之间的差异被平方,如果使用总体平均值,可能的差异范围将小于真实范围。此外,取平方根是一个凹函数,因此在估计中引入了“向下偏差”。
另一种思考方式是这样的:你的样本越大,你就越有机会遇到更多的人口代表点,即接近平均值的点。因此,您获得样本平均值的机会较小,这会导致差异过小,从而导致方差过小,并且您会得到低于标准偏差的值。
平均而言,正态分布总体的样本将产生一个方差,该方差平均 向下偏移 n-1 倍。(顺便说一句,我相信样本偏差本身的分布是由学生的 t 分布描述的,由 n 决定)。因此,通过将平方根方差除以 n-1,我们使分母变小,从而使结果变大,并导致所谓的“无偏”估计。
这里要强调的重点是,贝塞尔的校正,或者除以 n-1,实际上并不总是有帮助的!因为潜在的样本方差本身是 t 分布的,你会不知不觉地遇到 n-1 超过真实总体标准差的情况。碰巧的是,n-1 是我们在大多数情况下纠正偏差的最佳工具。
为了证明这一点,检查同一个 Jupyter 笔记本,我只是改变了随机种子,直到我发现一些样本的标准偏差已经接近总体标准偏差,并且 n-1 增加了更多偏差:

在这种情况下,贝塞尔的修正实际上伤害了我们!
因此,贝塞尔的修正并不总是修正。之所以这样称呼,是因为大多数时候,在抽样时,我们不知道总体参数。我们不知道真正的均值或方差或标准差。因此,我们依赖于的事实,因为我们知道坏运气的比率(下冲,或向下偏差),我们可以通过该比率的倒数来抵消坏运气:n-1。
但是如果你运气好呢?就像上面的细胞一样,这种情况有时也会发生。您的样本偶尔会产生正确的标准偏差,甚至超出标准偏差,具有讽刺意味的是,在这种情况下,n-1 会增加偏差。
然而,这是我们在无知状态下纠正偏见的最佳工具。从上帝的角度来看,不需要偏差校正,因为参数是已知的。
最终,这从根本上归结为理解样本和总体之间的关键差异,以及为什么贝叶斯推理是解决经典问题的一种如此不同的方法,其中关于参数的猜测是通过先验概率提前做出的,从而消除了贝塞尔校正的需要。
我将在以后的文章中重点介绍贝叶斯统计。感谢阅读!
递归神经网络
递归神经网络(RNN)是一个输入节点(隐藏层),用于激活 sigmoid。
RNN 实现这一点的方式是获取一个神经元的输出,并将其作为输入返回给另一个神经元,或者将当前时间步长的输入馈送给较早时间步长的输出。在这里,您将以前时间的输入一步一步地输入到当前时间的输入中,反之亦然。

这可以以多种方式使用,例如通过具有已知变化的学习门或 sigmoid 激活和许多其他类型的神经网络的组合。
RNNs 的一些应用包括预测能源需求、预测股票价格和预测人类行为。rnn 是根据基于时间和基于序列的数据建模的,但它们在各种其他应用中也是有用的。
递归神经网络是一种用于深度学习、机器学习和其他形式的人工智能(AI)的人工神经网络。它们有许多属性,这些属性使它们对于需要顺序处理数据的任务非常有用。
说得更专业一点,递归神经网络被设计成通过从序列的一个步骤到下一个步骤遍历隐藏状态,结合输入,并在输入之间来回路由来学习数据序列。RNN 是为有效处理顺序数据而设计的神经网络,但也适用于非顺序数据。
这些类型的数据包括可被视为一系列单词的文本文档或音频文件,其中您可以看到一系列声音频率和时间。输出图层的可用信息越多,读取和排序的速度就越快,其性能也就越好。
rnn 旨在识别具有序列特征的数据,并预测下一个可能的场景。它们被用于模拟人脑中神经元活动的模型中,如深度学习和机器学习。
这种类型的 RNN 有一种记忆力,使它能够记住过去发生过多次的重要事件(步骤)。rnn 是可以分解成一系列小块并作为序列处理的图像。通过使用学习的输入数据的时间相关性,我们能够将我们学习的序列与其他回归和分类任务区分开来。

处理顺序数据(文本、语音、视频等)。),我们可以将数据向量输入常规的神经网络。RNNs 可用于各种应用,例如语音识别、图像分类和图像识别。
在前馈神经网络中,决策基于当前输入,并且独立于先前输入(例如,文本、视频等)。).rnn 可以通过接受先前接收的输入并线性处理它来处理顺序数据。神经网络中的前馈使得信息能够从一个隐藏层流向下一个隐藏层,而不需要单独的处理层。基于这种学习序列,我们能够通过其对输入数据的时间依赖性将其与其他回归和分类任务区分开来。
本质上,RNN 是一个上下文循环,允许在上下文中处理数据——换句话说,它应该允许递归神经网络有意义地处理数据。神经网络的循环连接与特定上下文中的输入和输出数据形成受控循环。
由于理解上下文对于任何类型的信息的感知都是至关重要的,这使得递归神经网络能够基于放置在特定上下文中的模式来识别和生成数据。与其他类型的直接处理数据并且独立处理每个元素的神经网络不同,递归神经网络关注输入和输出数据的上下文。
由于它们的内部循环,rnn 具有动态组合经验的能力。像记忆细胞一样,这些网络能够有效地关联遥远时间的记忆输入,并随着时间的推移以高度可预测性动态捕获数据结构。已经证明,RNNs 能够比传统的神经网络(例如,以线性回归模型的形式)更快地处理序列数据。

LSTM(长短期记忆)引入了一个隐藏层网络,其中传统的人工神经元被计算单元取代。
与其他传统的 rnn 不同,LSTM 可以处理梯度和消失问题,特别是在处理长期时间序列数据时,每个存储单元(LSTM 单元)保留关于给定上下文(即输入和输出)的相同信息。
研究表明,与其他传统的 rnn 相比,神经 LSTM 网络在处理长期时间序列数据时表现更好。由于理解上下文对于任何种类的信息的感知都是至关重要的,这允许递归神经网络基于放置在特定上下文中的模式来识别和生成数据。
引用来源
- https://blog . use journal . com/stock-market-prediction-by-recurrent-neural-network-on-lstm-model-56de 700 BFF 68
- https://pathmind.com/wiki/lstm
- https://developer . NVIDIA . com/discover/recurrent-neural-network
- https://bmcbioinformatics . biomed central . com/articles/10.1186/s 12859-019-3131-8
- https://theapp solutions . com/blog/development/recurrent-neural-networks/
- https://www . mlq . ai/guide-to-recurrent-neural-networks-lst ms/
- https://blog . statsbot . co/time-series-prediction-using-recurrent-neural-networks-lst ms-807 fa 6 ca 7 f
- https://www . simpli learn . com/recurrent-neural-network-tutorial-article
- https://mc.ai/rnn-recurrent-neural-networks-lstm/
- https://victorzhou.com/blog/intro-to-rnns/
地震、疾病和股票市场之间的关系

疾控中心在 Unsplash 上的照片
股票市场、地震和疾病之间有什么联系?
由阿格尼·库马尔 — 12 分钟阅读
尽管医学进步带来了救命的护理,但患者仍然面临着被来自医院和在医院里游荡的疾病感染的风险。这种情况是由入院时不存在但后来发展的传染性病原体引起的,称为医疗保健相关感染(HAIs)。

从第一原理推导卷积
由迈克尔·布朗斯坦 — 9 分钟读完
在我的本科学习期间,我在以色列理工学院学习电子工程,我总是对卷积这样一个重要的概念突然出现感到震惊。这个看似武断的定义像眼里的一粒沙子一样扰乱了信号处理世界原本美好的画面。

照片由 Hitesh Choudhary 在 Unsplash 上拍摄
没有编码的逐步花卉分类
弗朗西斯科·帕尔马——7 分钟阅读
很少获得新技术和缺乏专家是远未解决的问题。然而,对于传统的专业类别、学术研究人员和主题专家,有大量的数据分析用例。

照片由 chuttersnap 在 Unsplash 上拍摄
数据科学的 5 个 Spark 最佳实践
由锡安巴达什 — 6 分钟阅读
虽然我们都在谈论大数据,但在你的职业生涯中,它通常需要一些时间,直到你遇到它。对我在 Wix.com 的人来说,这比我想象的要快,超过 1.6 亿的用户产生了大量数据——随之而来的是对扩展我们数据处理的需求。

背景图片由 Benjamin Davies 提供— Unsplash
多智能体强化学习和人工智能的未来
杰里米·哈里斯和雅各布·福斯特——50 分钟🎧
强化学习最近受到了很多关注,这在很大程度上要归功于 AlphaGo 和 AlphaZero 等系统,这些系统以引人注目的方式凸显了它的巨大潜力。虽然我们开发的 RL 系统已经完成了一些令人印象深刻的壮举,但它们是以一种相当幼稚的方式完成的。
自然语言处理中的困惑与熵的关系

艾萨克·奎萨达在 Unsplash 上的照片
使用信息论理解 NLP 度量
在评估语言模型时,困惑是一个常用的度量标准。例如,scikit-learn 实现的潜在狄利克雷分配(一种主题建模算法)包含了作为内置度量的困惑。
在这篇文章中,我将定义困惑,然后讨论熵,两者之间的关系,以及它如何在自然语言处理应用中自然出现。
语境
在许多自然语言任务中,一个非常普遍的情况是,你有一门语言 L 并且想要为这门语言建立一个模型 M 。“语言”可以是一种特定的体裁/语料库,如“英语维基百科”、“尼日利亚推特”或“莎士比亚”,或者(至少在概念上)只是一种通用的,如“法语”
具体来说,我们所说的语言是指生成文本的过程。为了清楚起见,我们将考虑这样一种情况,我们正在对句子建模,文本由以句尾“单词”结尾的序列单词组成但是你可以用“token”代替“word”,用“document”代替“sentence”来概括任何上下文。
什么是“过程”?出于我们的目的,我们可以把一个过程想象成概率分布的集合。给定由一个句子中的一系列先前单词组成的历史 h ,语言 L 是下一个单词是 w: 的概率

语言是概率分布的集合
例如,我愿意打赌,如果 L 是“英国人”:
- l(狗|敏捷的棕色狐狸跳过懒惰的棕色)≈ 1
- L(ipsum | Lorem) ≈ 1
- l(翅膀|水牛水牛水牛水牛水牛)≈ 0
类似地,给定一个完整的句子 s ,我们可以评估 L( s )这个句子出现的概率。如果我们包括一个特殊的句子开头“单词”wₒ,并让第 n 个“单词”是句尾“单词”,我们得到

语言 L 给出一个句子 s 的概率
然而,在产品中省略第一个术语是很常见的,或者有时使用更长的起始上下文。
获得(比如说)美式英语口语的完美复制品是非常容易的。只要在街上拦住任何一个以英语为母语的人。当然,我们通常对教计算机模型感兴趣(因此,机器学习)。因此,我们将让 M 成为我们在计算机上成功构建的任何语言模型。
这种设置具有语言 L 和模型 M 非常通用,在各种自然语言任务中发挥作用:语音到文本、自动更正、自动完成、机器翻译——不胜枚举。自动完成是最明显的例子:给定某人到目前为止键入的单词,通过选择最有可能完成的单词来猜测他们接下来可能键入什么。
困惑
给定一个语言模型 M,我们可以使用一个保持 dev(验证)集来计算一个句子的复杂度。句子上的困惑 s 定义为:

语言模型 M 的困惑
你会从第二行注意到,这是乘积分母中各项的几何平均值的倒数。由于每个单词的概率(取决于历史)都被计算过一次,我们可以将此解释为每个单词的度量。这意味着,在其他条件相同的情况下,困惑不受句子长度的影响。
一般来说,我们希望我们的概率高,这意味着困惑低。如果所有的概率都是 1,那么困惑度将是 1,模型将完美地预测文本。相反,对于较差的语言模型,困惑度会更高。
很难为困惑提供一个基准,因为像大多数自然语言任务一样,这个标准高度依赖于词汇量。给定一个语料库,较小的词汇量意味着其他单词将全部被替换为一个
以下是一些基准测试:
- 最先进的。对于 WikiText-103 ,一个大约 28,000 篇高质量维基百科文章和大量(0.4% OOV 率)词汇的精选,一个语言模型的最先进的困惑度(截至本文撰写时)是 10.8 。
- 最坏的情况。在任何数据集上,基线模型只是以相等的概率随机猜测词汇表中的一个单词。在这种情况下,困惑只是词汇表的大小:WikiText-103 为 267,735 ,但是 WikiText-2 要小得多( 33,278 )。一般来说,30,000 对于一个语言模型的词汇量来说是相当合理的。
- 最好的情况。我在上面说过“最好的”可能的困惑是 1。但是如果那是真的,那么在一种语言中就只能有一个可能的句子,这是很无聊的。最近一篇探索文本生成的论文使用了 OpenAI 的GPT-2(WikiText-103 上有困惑的 22.1 大版本)。在他们选择的数据集上(WebText,GPT-2 就是在上面训练的),他们发现了 12.4 的困惑。但是,重要的是,他们发现,虽然他们的模型能够以低得多的复杂度生成文本(1.5!),生成的文本不是重复就是不连贯。离人类的困惑越近越好!
这最后一点非常重要。语言本身确定了一个困惑的下限。我们将在下面看到这一点。但是这指出了 NLP 中度量的一个普遍特征:一个容易评估的度量,比如困惑,不一定是模型真实性能的最佳预测者。困惑有利于开发(验证),但不一定有利于评估。评价的黄金标准仍然是人的评价。
熵
熵在物理学中是一个模糊的概念,但在信息论中却非常简单。假设你有一个过程(就像一门生成单词的语言)。在这个过程的每一步,发生的事情(事件)都有可能会发生。惊奇的量是–log(p),其中对数取任意你想要的底数(相当于换单位)。低概率事件具有高度的惊奇性。肯定会发生的事件( p =1)没有意外。不可能的事件( p =0)有无限的惊奇。
熵是由 i 索引的所有可能事件中意外事件的期望值;

概率分布的熵
所以,熵是当某件事发生时的平均惊奇程度。
根据克劳德·香农的信源编码定理,以 2 为基数的熵也是存储所发生信息的最佳位数。例如,如果我告诉你,一条 280 个字符的全长推文每个字符的熵为 1 位,这意味着,根据数学定律,无论 Twitter 做什么,他们的数据库中总要有 280 位(35 字节)的存储空间。(当然,在实践中,他们必须拥有更多)。
在我们的语言模型的上下文中,我们必须做一个调整。假设我们对长度为 n 的句子 s (事件序列)感兴趣,我们将每个单词(事件)的熵率定义为:

其中总和是所有句子的长度 n ,L(s)是句子的概率。最后一个技术点:我们要定义语言 L(或者语言模型 M)的熵,而不考虑句子长度 n 。所以最后我们定义了

语言(模型)熵的最终定义
香农-麦克米兰-布雷曼定理
在不痛不痒的假设下,熵会进一步简化。本质的观点是,如果我们取一个足够长的文本串,无论如何每个句子出现的概率都是成比例的。所以没有必要总结可能的句子。我们得到:

用香农-麦克米兰-布雷曼定理简化熵
这告诉我们,我们可以只取一个大的(n 是大的)文本,而不是试图从不同的文本中采样。
交叉熵
假设我们错误地认为我们的语言模型 M 是正确的。然后我们在没有意识到的情况下观察实际语言 L 生成的文本。交叉熵 H(L,M)就是我们测量的熵

我们的语言模型 M 的交叉熵
其中第二行再次应用了香农-麦克米兰-布雷曼定理。
至关重要的是,这告诉我们,我们可以通过测量随机句子样本(第一行)或足够大的文本块(第二行)的 log M(s)来估计交叉熵 H(L,M)。
交叉熵受语言真实熵的限制
交叉熵有一个很好的性质,即 H(L) ≤ H(L,M) 。在证明中省略极限和归一化 1/n:

在第三行,第一项只是交叉熵(记住极限和 1/n 项是隐式的)。第二项是 Kullback-Leibler 背离(或 KL 背离)。根据吉布斯不等式,KL 散度是非负的,并且只有当模型 L 和 M 相同时才为 0。KL-divergence 有点像距离度量(告诉你 L 和 M 有多不同)。⁴ ⃞
困惑与熵的关系
概括一下:
- 根据 Shannon-McMillan-Breiman 定理,在 L 生成的足够长( n 大)的开发/验证/测试数据集上评估 M 的熵近似于交叉熵 H(L,M)。我们只是通过取一个足够大的评估集来近似极限。
- 此外,这种交叉熵受到生成数据的语言的真实熵的限制

足够大数据集交叉熵的困惑定义和简化
现在剩下要做的就是展示两者之间的关系。假设我们以 e 为底取对数:

困惑与熵的关系
如果我们以 2 为底取对数,用 2 为底,以此类推。
所以,总结一下:
- 我们为生成数据的真实语言 l 建立一个语言模型 M。
- 我们评估 M(相对于 L)的困惑度,或者等价地,交叉熵。
- M 的困惑被实际语言 L 的困惑所限制(同样,交叉熵)。
困惑度量了我们模型中“随机性”的数量。如果困惑度是 3(每个单词),那么这意味着模型有 1/3 的机会猜出文本中的下一个单词。因此,它有时被称为平均分支因子。
结论
我想给你们留下一个有趣的记录。书面英语文本的真实熵是多少,这是一个悬而未决的问题(抛开其他格式,如“推特”或“口语”以及其他语言,如“俄语”。)
通过不等式 H(L) ≤ H(L,M),一种获得困惑度或熵的上界的方法是创建一个语言模型,我们在上面看到了一些困惑。
在这种情况下,我们通常对每个角色的熵(同样每个角色的困惑)感兴趣。当使用以 2 为底的对数测量时,这就变成了每字符位数(BPC)。
克劳德·香农(在计算机出现之前)估计,书面英语的熵在每个字符 0.6 到 1.3 比特之间。上面提到的 OpenAI 的 GPT-2 在(另一个)维基百科数据集上实现了每个字符 1 比特。
请记住,在书面英语中,每个单词大约有 5 个字符,这相当于大约 5 位,或 2⁵=32.的困惑请注意,这远远高于作为最新性能指标评测讨论的复杂性!怎么回事?记住不要在词汇或数据集之间比较困惑:单词长度可能不一样。
如果你想了解更多关于信息论的内容,请看我之前的文章了解逻辑回归系数。
参考
除了上面联系/提到的那些
[1]通常使用光束搜索进行估计。
[2]或任何给定上下文的一个可能的延续。因此,每个可能的起始单词只有一个可能的句子,或者,在论文的上下文中,给定前 40 个单词,一篇文章只有一个可能的结尾。这将违反格莱斯的准则,一套关于语言的通用规则。特别是,如果文章的其余部分是由开头决定的,为什么还要写呢?一般来说,自然语言避免低复杂度(熵)的话语,因为它们是不必要的。
[3]假设该过程是平稳的和遍历的。事实上,这些假设不适用于自然语言。如果这困扰着你,你可以把这个定理看作是一个非常合理的近似。
[4]它不是距离度量,因为它不是对称的 D(p||q)!= D(q||p)。然而,在统计流形上解释,其围绕 D(p||p)的二阶泰勒展开给出了费希尔信息度量,这是唯一的(根据陈佐夫定理,直到一个标量常数)适用于统计流形的黎曼度量。参见信息几何方法了解有限维情况下的更多参考。
显著性、功效、样本量和效应量的关系
显著的成果只是开始。

亚历山大·Cvetanovic 在 Unsplash 上的照片
祝贺你,你的实验取得了显著的成果!你可以确定(嗯,95%确定)自变量影响了因变量。我想你剩下要做的就是写下你的讨论,并把你的结果提交给学术期刊。对吗……?
获得显著的成果本身就是一个巨大的成就,但它并不能说明你的成果背后的全部故事。我想借此机会讨论统计意义、样本大小、统计功效和效应大小,所有这些都对我们如何解释我们的结果有巨大的影响。
显著性(p = 0.05)
首先,让我们讨论统计意义,因为它是推断统计学的基石。我们将在真实实验的背景下讨论显著性,因为它是最相关和最容易理解的。真实验是用来检验一个或多个变量之间因果关系的特定假设。具体来说,我们假设一个或多个变量(即自变量)产生另一个变量的变化(即因变量)。变化是我们推断的因果关系。 如果你想了解更多关于各种研究设计类型的信息,请访问我的文章( 链接 )。
例如,我们想测试一个假设,即权威的教学风格会使学生获得更高的考试分数。为了准确地测试这个假设,我们随机选择了两组学生,他们被随机安排到两个教室中的一个。一个教室是威权老师教的,一个是权威老师教的。整个学期,我们收集所有教室的考试成绩。在年底,我们将所有的分数进行平均,得出每个教室的总平均分数。让我们假设权威课堂的平均测试分数是 80%,权威课堂是 88%。看起来你的假设是正确的,与权威老师教的学生相比,权威老师教的学生在考试中平均得分高 8%。然而,如果我们把这个实验进行 100 次,每次都用不同的学生群体,你认为我们会得到相似的结果吗?教学风格对学生考试成绩的这种影响是偶然发生的还是潜在的(即不可测)变量?最后但同样重要的是,8%是否被认为“足够高”,与 80%有所不同?
无效假设:假设组间无显著差异的假设。在我们的教学风格示例中,零假设将预测基于教学风格的学生测试分数之间没有差异。
替代或研究假设:我们预测权威教学风格的原始假设将产生最高的学生平均考试分数。
现在我们已经做好了准备,让我们来定义什么是 p 值,以及它对您的结果有什么意义。
p 值(也称为 Alpha)是我们的零假设为真的概率。获得显著结果仅仅意味着通过您的统计测试获得的 p 值等于或小于您的 alpha,在大多数情况下是 0.05。
p 值 0.05 是许多研究领域中使用的常用标准。
显著的 p 值(即小于 0.05)表示零假设正确的可能性小于 5%。如果是这种情况,我们拒绝零假设,接受我们的替代假设,并确定学生测试分数彼此显著不同。注意,我们并没有说不同的教学风格导致了学生考试成绩的显著差异。p 值只告诉我们组与组之间是否不同,我们需要进行推断性的跳跃假设教学风格影响了组与组之间的不同。
观察显著 p 值的另一种方式是考虑这样的概率,如果我们运行这个实验 100 次,我们可以预期至少 5 次学生测试分数彼此非常相似。
如果我们将 alpha 设置为 0.01,我们需要得到的 p 值等于或小于 0.01(即。1%)才能认为我们的结果有意义。当然,这将强加一个更严格的标准,如果发现显著,我们将得出结论,零假设是正确的概率小于 1%。
统计能力
你的研究中的样本大小或参与者数量对你的结果是否有意义有着巨大的影响。各组之间的实际差异越大(即学生测试分数)样本越小,我们就需要找到显著的差异(即 p ≤ 0.05)。理论上,在足够大的样本量下,with 可以在大多数实验中发现显著差异。然而,极大的样本量需要昂贵的研究,并且极难获得。
I 型错误(α) 或假阳性,得出分组的概率显著不同,而实际上它们不是。我们愿意承认有 5%的可能性错误地拒绝了零假设。
第二类错误(【β】)或假阴性,是当事实上各组不同时,得出各组没有显著差异的概率。我们可以通过确保我们的统计测试具有适当的功效来降低犯第二类错误的概率。

功效定义为 1 —第二类错误的概率 ( β)。换句话说,它是当差异实际存在时检测到组间差异的概率(即正确拒绝零假设的概率)。因此,当我们增加统计检验的能力时,我们就增加了它检测显著的(即 p ≤ 0.05)组间差异。
人们普遍认为我们应该以 0.8 或更大的功率为目标。
那么我们将有 80%的机会找到统计上的显著差异。也就是说,我们仍然有 20%的机会无法检测出两组之间的实际显著差异。
效果大小
如果你记得我们的教学风格的例子,我们发现两组教师之间的显著差异。威权课堂测试平均得分 80%,权威课堂 88%。效应大小试图回答这样一个问题:“尽管这些差异在统计学上是显著的,但它们足够大到有意义吗?”。
效应大小提出了“最小重要差异”的概念,即在某一点上,显著差异(即 p≤ 0.05)非常小,在现实世界中没有任何益处。因此,效应大小试图确定权威型和独裁型教师之间学生考试成绩 8%的增长是否足够大,足以被认为是重要的。请记住,我们所说的小并不是指小的 p 值。
观察效应大小的另一种方法是定量测量静脉注射对静脉注射的影响程度。高效果大小表示非常重要的结果,因为对 IV 的操作会对 DV 产生很大的影响。
效应大小通常表示为 Cohen 的 d。Cohen 描述了小效应= 0.2,中等效应大小= 0.5,大效应大小= 0.8

较小的 p 值(0.05 及以下)并不表明有大的或重要的影响,高的 p 值(0.05 以上)也不意味着不重要和/或小的影响。给定足够大的样本量,即使非常小的效应量也能产生显著的 p 值(0.05 及以下)。换句话说,统计显著性探究了我们的结果是偶然的概率,而效应大小解释了我们结果的重要性。
将所有这些放在一起(功耗分析)
我们可以计算实验所需的最小样本量,以达到特定的统计功效和分析效果。这种分析应该在实际进行实验之前进行。
功率分析是在研究的设计阶段进行的一个关键步骤。通过这种方式,你将很好地了解每个实验组(包括对照组)所需的参与者数量,以发现显著差异(如果有一个差异的话)。
G*Power 是一个伟大的开源程序,用于根据您的功率和效果大小参数快速计算所需的样本大小。
G*Power 是一个计算统计功效分析的工具,适用于许多不同的 t 检验、f 检验、χ2 检验、z 检验和一些…
www.psychologie.hhu.de](https://www.psychologie.hhu.de/arbeitsgruppen/allgemeine-psychologie-und-arbeitspsychologie/gpower.html)
g *功率

- 选择适合您分析的“测试系列”
- 我们会选择 t 检验
2.选择您用于分析的“统计测试”
- 我们将使用平均值:两个独立平均值之间的差异(两组)
3.选择“功率分析类型”
- 我们将选择“先验”来确定您希望达到的功率和效果大小所需的样本。
4.选择尾部的数量
- 如果您只想确定一个方向上各组之间的显著差异,请使用一个尾部。通常,我们选择双尾检验。
- 我们将选择一个双尾检验
5.选择所需的效果尺寸或“效果尺寸 d”
- 我们将讨论一系列的效果尺寸
6.选择“αerro prob”或α或当各组之间存在实际差异时不拒绝零假设的概率。
- 我们将使用 0.05
7.选择您希望达到的功率。
- 我们将选择 0.8 或 80%的功率和 0.9 或 90%的功率
选择“N2/N1 分配比例”
- 如果您预计每组(治疗组和对照组)的参与者人数相同,则选择 1。如果一组中的人数是另一组的两倍,则选择 2。

阿尔法= 0.05
一般来说,大效应需要较小的样本量,因为它们对于分析来说是“显而易见”的。随着效应尺寸的减小,我们需要更大的样本尺寸,因为更小的效应尺寸更难找到。这对我们有利,因为效果越大,我们的结果就越重要,我们需要招募的参与者就越少。
最后但同样重要的是,这些是每个参与者组所需的样本量。例如,在一个具有 4 个组/水平的 IV 和一个 DV 的实验中,您希望找到一个具有 80%功效的大效应大小(0.8+),您将需要每组 52 个参与者或总共 208 个参与者的样本大小。
开启自动驾驶汽车的意想不到的最后一步:人类监督
偶尔出现的远程人类控制车辆的自动驾驶的中间阶段将具有难以置信的市场价值。

T 目前驾驶经济学最大的成本是驾驶员的时间。这对个人和组织来说都是一种成本——司机只有有限的时间(在一辆车上),每次支付一个人导致拼车应用程序出现一些令人印象深刻的损失(来源和来源)。为了保持市场价值,在一些城市,优步的乘坐费用高达半价(优步费用工具和优步三藩市费用)。
移动公司发出信号,取消司机是盈利的一条途径,但是对于许多汽车很少司机的中间阶段怎么办?
这篇文章向您展示了:
- 遥控汽车的技术既接近又直观。
- 自动驾驶汽车将很快出现在特定的环境中,以及经济上的影响。

我做了一些自动驾驶汽车的研究。
自动驾驶汽车简史
无线电控制的汽车于 1925 年首次展示,仅仅 5 年后,在迈尔斯·j·布鲁尔 1930 年的书《天堂与钢铁》中,科幻小说预言了完全的自主。
来自罗宾·r·墨菲的《科幻小说中的自动驾驶汽车》,2020 年。《天堂与钢铁》预言天堂岛上的每一个移动系统都是完全自主的——甚至没有方向盘。这延伸到汽车以外,这意味着起重机是自主的,建筑是无人操作的。全自动驾驶系统将触及的不仅仅是自动驾驶汽车。
自动驾驶汽车是我们关注的案例研究,因为这是我们花费大部分时间的事情(2018 年仅在美国就有超过 2.7 亿辆注册车辆)。自动驾驶汽车与工程交叉的故事始于 2004 年 DARPA 大挑战。穿过沙漠的 150 英里长的路线。
2004 年,0 辆汽车跑了 10 英里。
2005 年,一对夫妇完成了这门课程。下面的视频向你展示了当时的自动驾驶汽车与现在有多么不同。这是在挑战自治的极限。****
现在,自动驾驶汽车是一个更加明确的研发领域。这不是一篇关于自动驾驶汽车在技术水平上处于什么位置的文章。政府甚至有网站来定义这一点。
汽车技术的持续发展旨在提供更大的安全优势和自动驾驶…
www.nhtsa.gov](https://www.nhtsa.gov/technology-innovation/automated-vehicles-safety)
这是一篇关注一个问题的补丁的文章。
问题—极限情况:无人驾驶汽车不擅长处理不可预见的环境,如建筑、倒下的树木、道路损坏等。
解决方案——远程控制:召唤一个人来计算如何绕过这个罕见的障碍物。
为什么会这样:有了足够多的传感器和计算机,我们可以让自动驾驶汽车变得非常安全。当他们对某事不确定时,他们走得很慢。当他们从未见过的东西,他们会停下来。
不过,一辆停下来的车并没有多大用处。这时,我们让人类监督者打电话进来,查看视频,并绕过挑战。每个人都希望他们的特斯拉是完全自动驾驶的,但我们需要一些方法来获得汽车没有看到或可能永远不会看到的 0.0001%英里的数据。
自主汽车的遥操作
将会有供优步司机使用的办公楼(或者他们会被外包给印度)。在这里,车手们将会收到迷你驾驶挑战。这些小挑战对电脑来说很难,但对人类来说却微不足道。比如:有一个人拿着慢行标志,这条路现在是单行道,或者:路上有一个垃圾桶。操作员需要在障碍物周围指定 3 个航路点。
在一个测试车队中,比方说一辆车有 10%的几率会卡在停车标志或未知的障碍物上。这意味着理想情况下,一个人可以覆盖 10 辆车,但安全起见,还是说 5 辆车吧。这是让优步烧钱的驱动成本的 1/5。
这个因素非常好。考虑一轮只有 1%未知车辆的测试版自动驾驶汽车。现在 1 个司机控制 50 辆车。这种扩展只会随着时间的推移而改进。它导致成本的大幅降低。**
这将是无人驾驶汽车的一次范式转变。我们拥有的技术已经非常接近这一点——这只是取决于你能接受的中断程度。让一个系统接管我会舒服得多,这个系统就是安全第一,有支持人工监督。《连线》是我找到的唯一一份给予这款应用应有关注的出版物。这里是一些继续阅读。**
没有其他大公司公开其汽车偶尔对人类的依赖,但大多数公司都在悄悄地计划…
www.wired.com](https://www.wired.com/story/phantom-teleops/) [## 遥控自动驾驶汽车的战争升温
即使在中午,从旧金山到圣何塞的 50 英里路程也是一件痛苦的事情。像一个蹒跚学步的孩子,湾区…
www.wired.com](https://www.wired.com/story/designated-driver-teleoperations-self-driving-cars/)
谁会是第一批自动驾驶汽车?
这是对任何自动驾驶汽车文章的公开辩论。谁先做?我觉得答案是我们还没见过的人,但这要看你说的“解决自动驾驶”是什么意思了。
特斯拉:数据驱动的方法
通过获得足够的数据,埃隆·马斯克打赌端到端深度学习方法可以安全地控制特斯拉汽车。他还认为它会比任何竞争对手都早(我有点怀疑)。这是一种高度特定于应用的方法,具有增加汽车价值的巨大潜力。
目前还不清楚特斯拉计划如何处理这种情况。神经网络本质上是记忆数据,那么它们是如何记忆没见过的数据的呢?
Waymo:自主堆栈蓝图
许多传感器,过度设计的安全性,以及长远的眼光。Waymo 并不想与特斯拉竞争,它试图制定一个安全可靠的自动驾驶蓝图,不仅仅是自动驾驶(它正在获得一些资金支持来完成这项工作)。什么是“自治堆栈”?它是智能算法的集合:一个用于规划走哪条路,一个用于控制转向柱,一个用于控制电机功率等。Waymo 希望做到这一切,制造他们的汽车。
这是一个长期的方法。如果它适用于乘用车,那么它也适用于卡车、送货无人机、建筑管理等等。
小型自主创业公司:填补经济空白
其他创业公司将填补数据驱动的汽车特定方法和工程蓝图之间的空白。这里会有很多经济上可行的应用。
第一个在特定城市获得自动驾驶出租车的人:巨大。
第一个获得安全、自主送货无人机(用于亚马逊或食品):巨大。
第一个获得封闭路线自动驾驶汽车(想想机场班车):巨大。在有限区域内的自动驾驶汽车遇到的紧急情况要少得多,请来的人类专家可以轻松应对。 Optimus Ride 想把自动驾驶汽车带到小而高的交通区域。通过理解自主系统在最初几年将会有局限性——并在自主堆栈中为人类援助进行设计——他们可以更快地推出。
这种情况太多了。让人类修补角落的情况,更快地获得可行的产品。

伊萨卡是峡谷。承蒙作者好意。
灵感来自 Lex Friedman 和 Sertac Karaman 的精彩对话。看这里。***
研究科学家崩溃了
研究科学家面试问题

图片来自 Pixabay
What:研究科学家做什么?
研究科学家和数据科学家之间的界限并不明确,但一般来说,研究科学家负责使用复杂的机器学习、数学和深度学习理论在一个非常小众的领域建立和开发模型。
虽然数据科学家和相邻职位处理大量数据和指标,但研究科学家在特定的专业领域内封装了深刻的理解,与不同的团队跨职能合作,开发原型并验证假设。
研究科学家所需的技能和资格
对科研科学家的要求因公司而异:一些公司有更严格的标准,而另一些公司在经验年限、学位水平等方面更灵活。即使在公司内部,不同团队之间的工作资格也可能有所不同,所以一定要仔细检查你感兴趣的职位。
一般来说,您可以肯定会遇到以下情况:
- 强大的编程经验 : Python 或 C++无疑是许多顶级公司的必备工具,但一些公司也接受其他编程语言的类似资格。
- 相关领域的硕士、博士:看看顶级雇主,硕士学位通常是研究科学家的最低学位要求。相关领域一般包括机器人学、统计学、计算机科学等等。注:行业经验也可以补偿不同程度,即“具有 3 年行业经验的学士学位”。
- 深度学习和机器学习的经验:这在很大程度上因公司和领域而异,但许多职位要求你了解如何将机器学习概念应用于不同的解决方案。
- 所有数据:你应该非常熟悉数据分析和可视化,以及如何将你的分析转化为可操作的见解。
对于一些公司和职位,还有一个额外的、相当独特的要求:
- 丰富的研究经验:第一作者的出版物和在顶级会议上发表的经验非常重要,也是你在不同项目中的参与和经验的重要指标。
拥有研究科学家 Roles的顶级公司

图片来自 Pixabay
为了说明不同公司的研究科学家角色的多样性,这里有一些科技和其他行业顶级公司的空缺职位的例子。请注意:这些公司中有几个研究科学家职位的例子是在招聘中高级人员,所以列出的要求可能没有反映出研究科学家整体所需的资格。
Lyft研究科学家访谈
Lyft 在世界各地有几个普通研究科学家职位的空缺。在这个职位中,你将与工程师和产品分析师一起在不同的团队中工作,分析数据并提供业务见解。
This 公司有相当严格的要求,寻找拥有硕士学位和至少四年行业经验的候选人,以及一系列额外的偏好。
此外,具有特定名称和部门的职位(如“研究科学家,自动驾驶”)与小型、高度专业化的团队合作开发某些产品和服务,通常属于行业突破性角色。这些工作有更高的要求:博士学位、深度学习知识、出版经验等。
对 Lyft 感兴趣?观看我们的 Lyft 模拟面试视频 ,查看我们的 Lyft 面试文章 !
Facebook研究科学家访谈
Lyft 除了专业职位之外,还有各种各样的一般研究科学家职位,相比之下,脸书将其所有的研究科学家组织成特定的部门。以下是一些目前开放的 world-wide:的例子
- 研究科学家(永久 Research)
- 研究科学家(AI)
- 研究科学家(Research)隐私组织
- 研究科学家(神经界面相互作用)
根据领域的不同,这些职位通常需要相关领域的博士学位,至少一年的实验室经验,第一作者出版物,以及涉及不同概念、技能和技术的丰富经验,这取决于职位。
Linkedin研究科学家访谈
Linkedin 的研究科学家角色相当于 Lyft 的一般研究科学家职责和脸书的招聘要求的结合。
Linkedin 的研究科学家工作主要包括数据处理和组织,具体团队有不同的津贴。候选人通常被期望拥有相关领域的硕士或博士学位,根据具体的职位有几年的行业经验。
其他资格主要取决于你申请的团队。例如,人工智能团队需要深入了解机器学习,以便在求职功能中开发算法。
研究科学家访谈流程

图片来自 Pixabay
和往常一样,科研人员职位的面试过程中有几个关键步骤。这里有一个你可以期待的大致框架,尽管它肯定会因公司而异。
初始电话 Screen
这次面试将由招聘人员或招聘经理进行。涵盖的一般话题将包括你过去的经历,你的简历,以及你参与过的与该职位相关的项目。这是你和公司之间的一次非常普通的“了解你”的谈话,所以放松点,给对方留下最好的印象。
技术 Interview
这(很有可能)是另一个电话面试,你将被期望展示专门与研究科学家职位相关的技术知识。共同的主题将最有可能围绕机器学习概念,分析案例研究和基本的统计概念。面试中问题的难度和广度取决于职位的侧重点。
注意:一些面试官可能会把最初的电话面试和技术面试结合起来,或者干脆直接跳过前者,所以确保你总是有所准备!
现场 Interview
现场面试是研究科学家面试过程的最后一部分。此时,你已经通过了基本筛选,并充分展示了你的技术知识,所以这次面试更多的是评估你在公司内的适合度,如果相关的话,在特定团队内的适合度。
您可能会遇到许多行为类型的问题,以及与团队当前项目相关的潜在的更多技术问题。在这里,技术面试将较少关注你的知识范围,而更多关注你对问题具体部分的方法和理由。
文化和适合的问题肯定会出现,所以在进入面试之前,最好研究公司价值观并真正了解更多关于团队目标的信息。
最后,现场面试的结构很大程度上取决于公司本身。更大、更成熟的公司,如脸书、亚马逊、谷歌等。现场部分可能会有多个面试者和轮次,这意味着你可能会在一天的大部分时间里面试不同的团队成员、其他研究科学家等等。
科研人员面试问题的类型

图片来自 Pixabay
X 概念是如何运作的?/X 的假设有哪些?/你会如何应用 X?
你明白了:这种类型的问题基本上要求教科书回忆不同的机器学习概念及其应用或条件。
不要过度复杂化!面试官在这里只是检查你是否知道和理解基本概念。特别是对于研究科学家来说,你肯定可以指望基本的机器学习概念至少出现一次。其他常见的话题从不同的统计应用到编程问题。
凯斯·study
这类问题可能会在技术筛选时提出,但几乎肯定会在现场面试中提出。
在这里,重点不在于具体的方法或内容(尽管您不希望完全胡说八道),而在于您的方法——您对不同特性的选择及其权衡。如果你能证明你的方法是正确的,并且积极地和面试官讨论问题,你应该会做得很好。
如果您想了解有关案例研究问题的一般框架的更多细节和提示,请查看我们的 数据科学案例研究访谈 文章。
产品/功能 Questions
这类问题需要对你申请的特定团队和公司进行更多的个人研究。这个问题的结构将沿着“当 Y 改变时,X 将如何改变?”,其中 X 和 Y 可能构成团队项目中的不同变量。
基本上,这个问题可以归结为你在准备过程中的承诺。面试官希望评估你是否知道公司的目标,你团队的焦点,以及你职位的总体目标。
编码问题
对于研究科学家的职位来说,编码问题经常出现。几乎所有科技公司的研究科学家都必须在实践中开发和模拟他们的想法和理论,然后交给工程师进行实际推广。
大多数研究科学家编写面试问题围绕着测试数学和算法概念。你可能会被要求模拟不同种类的随机变量(二项式,贝叶斯)或模拟(蒙特卡洛)。
好吧,希望这能为研究科学家的职位提供更多的关键见解,以及不同资格的细分,面试过程是什么样的,以及你可以期待什么样的问题。
感谢您的阅读,要了解更多内容,请务必查看采访查询,并加入数千名数据科学家和研究科学家的社区,为他们的下一次采访做准备。
感谢阅读
- 如果你有兴趣通过实践磨练你的数据科学技能,请查看 面试查询 !
- 查看我的 Youtube 频道 获取更多数据科学面试指南、商业 vlog 帖子和解决问题的技巧&。
- 如果你对数据科学感兴趣,可以看看这篇关于我工作过的科技公司的 数据科学薪水 的深度阅读。
原载于 2020 年 10 月 7 日 https://www.interviewquery.com**T21。
数据科学:学术严谨的需要
最近,我和几个人就获得数据科学或机器学习的高级学位的重要性进行了辩论。他们的论点是学位只是一张纸,我不同意。学位不仅仅是一纸文凭,社会信任体系也是建立在认证基础上的;这种信任根植于先前导致人们死亡的错误原因中。

他们反对正式学位的理由是,通过适当的培训,任何人都可以从事数据科学。因此,他们会倡导纳米学位和训练营,以替代硕士或博士等更严格的培训。他们认为,有一种更简单、更温和的方式可以成为数据科学家。
成为数据科学家没有更简单、更容易的方式
我不认为有更容易、更柔和的方式来培养出优秀的数据科学家或机器学习工程师。这两个领域都需要大量的工作和时间。虽然有些人可能会说,被训练的算法可以由许多人来完成,但我的问题还是回到安全上来。最终,你会像拥有高学历的人一样信任他们的工作吗?你会相信飞机不会坠毁,汽车或手机电池不会爆炸吗?

数据科学或数据表示做得不好的一个很好的例子是一个生死攸关的问题。【https://history.nasa.gov/rogersrep/v5p896.htm 号
虽然每个人都想认为这是任何人都可以实现的,但事实并非如此。这也是为什么工科前两年的淘汰率这么高的原因。根据的一项调查,学生申报工科第一年的淘汰率为 20%,四年和六年的毕业率分别为 35%和 54%。不仅工程更难完成,而且工程师通常需要更长的时间来完成。
工程学不是容易的课程,也不应该是。工程项目被 ABET 认可是有原因的。这和成为一名有执照的工程师需要去一所被认可的学校是一个道理。
你会在一座由读过大量土木工程知识并上过几堂桥梁建筑训练营课程的人设计的桥上开车吗?
工程学校被认可是有原因的,法学院、医学院、教学学校等等也是如此。他们证明你可以信任这个人,这个人可能在深度和广度上都比你知道的更多。如果没有经过认证的课程,人们可以做任何事情。那是人死的时候。
有人记得 Max 8 吗?
一个学位表明你已经通过了这个领域的人的测试,他们认为你应该能够胜任。这对于博士来说尤其有趣,因为在 3 到 5 年内,一个博士可能会在他们的领域内取得其他博士的资格。所以博士们稀释他们领域的可能性是巨大的。
这种现场质量稀释很容易在工业中发生。比方说,有人(没有工程或科学背景)获得了几个纳米学位,并在一些公司担任了多年的数据科学家,他们的工作不会影响安全。然后另一家公司决定聘请他们担任类似的角色,但现在他们的工作确实有可能影响人们的物质生活,比如说一辆自动驾驶汽车。一家公司给他们资质,下一家公司认定资质还可以,但没有和公众达成协议,认为这样的资质就够了。更糟糕的是,那个人可以在招聘过程中提供帮助,雇佣更多像他们一样的人,因为他们认为没有学位不应该成为任何人的障碍。现在他们的人才库被人才严重稀释,而这种人才可能是人们生存或死亡的原因。
我不是说纳米学位或新兵训练营没有他们的位置。它们当然有助于已经从事科学和工程的人掌握一些基本技能,以提高工作能力。然而,这些并不能代替实际的学位。
我知道这个领域很热门,但这并不意味着有一个简单的方法可以进入,也不应该有。工程学难是有原因的,数据科学和机器学习也是如此。如果你正在学习这两个领域中的任何一个,而不是高级学位,如果它看起来超级简单,我会小心的。这可能好得令人难以置信。我想活下去,我想对合格的人保持信任,因此,随着这个领域的成熟,我感到不仅有义务只雇用合格的人,而且有义务说出这个话题。
如果你愿意,可以在 Twitter 和 YouTube 上关注我,我会在那里发布不同机器上的浓缩咖啡照片和浓缩咖啡相关的视频。你也可以在 LinkedIn 上找到我。
旋转的医院大门:用线性回归预测病人流动率
如何使用简单线性回归模型估计住院时间
随着每年大约有 170 万人感染医疗保健相关感染(HCAIs ),卫生专业人员越来越关注如何最大限度地减少感染这些通常威胁生命且代价高昂的疾病的风险。最近的举措包括识别处于延长住院时间(LOS)高风险的患者,并创建个性化干预以减少他们在医院的时间和接触 HCAIs。
对于这个项目,我利用线性回归来预测患者入院时的住院时间,并确定导致延长住院时间的关键因素。
方法学
受 Daniel Cummings 关于使用机器学习来预测 LOS 的文章的启发,我利用了麻省理工学院的 MIMIC-III 开源数据库,其中包含来自波斯顿贝斯伊斯雷尔女执事医疗中心(BIDMC)的去身份信息。在数据库中,我合并了包含患者人口统计和诊断信息的表。
如下图 1a 所示,患者损失范围为 0-294 天。然而,我意识到,我的预测的准确性在不同的尺度上有不同的意义。例如,如果患者要住院 100 天,则预测的准确性不如患者仅住院 3 天重要。考虑到这一点,我决定把重点放在那些在医院最多呆 30 天的短期病人身上。图 1b 显示了 LOS 分布。

图 1a(左):原始数据集中损失分布。图 1b(右)住院 30 天或更短时间的患者的服务水平分布。由 Molly Liebeskind 创建的图像。
MIMIC 包括 2001 年至 2012 年的数据,通过多次访问跟踪患者。为了减少最近就诊后返回医院的患者的自相关误差,我在分析中仅利用了首次入院。
EDA 和特征工程
在只有分类特征的情况下,探索数据的最佳方式是查看每个单独特征与 LOS 的关系,以识别模式。以下是我探索中的几个亮点。
年龄:我的第一步是创建一个包含患者年龄的新列。作为去识别过程的一部分,与给定患者相关的所有日期被随机调整若干年。然而,单个患者的年数是一致的,这意味着出生日期(出生日期)和出生日期可以用来计算患者的年龄。如图 2 所示,老年患者比年轻患者住院时间更长。

图 2:患者年龄分布及其住院时间。由 Molly Liebeskind 创建的图像。
入院类型:在 BIDMC,患者入院类型分为四组。急诊表示患者需要立即介入治疗,以应对威胁生命的情况。紧急表示需要立即护理,以解决不被视为危及生命的身体或精神状况。选项用于接受预先计划医疗护理的患者,而新生儿表示入院事件与分娩相关。下图 3 显示,需要急诊和急救护理的患者通常在医院呆的时间更长。我推测,急诊病人通常在医院里呆的时间最长,因为他们需要加强医疗护理,但他们可能比急诊病人的护理优先级低。

图 3:入院类型和住院时间的关系。由 Molly Liebeskind 创建的图像。
ICD9 代码:我面临的最大挑战来自 6000 多个用于指示诊断的独特 ICD9 代码。数据集文档概述了解释 ICD9 代码的方法,包括查看一般诊断的前三个数字,然后利用后两个数字来识别具体情况。从那里,ICD9 代码能够被分成 18 个更广泛的类别,这些类别是我从维基百科上搜集来的。
模型
使用交叉验证的线性回归模型,我能够预测给定患者的住院时间,平均绝对误差为 3.75 天。在我为测试保留的 20%的数据中,图 4 显示了实际的患者损失和预测的损失。

图 4:绘制实际和预测的医院损失。由 Molly Liebeskind 创建的图像。
从这个模型中,我能够看到哪些因素对 LOS 有最大的影响,这对于医院识别高风险患者至关重要。下面的图 5 显示了对模型贡献最大的特性。可以直接比较这些系数,以了解模型预测中每个因素的相对权重。

图 5:特征对模型预测的重要性。由 Molly Liebeskind 创建的图像。
因为我只使用了病人入院时可用的数据,所以数据集仅限于大多数分类特征,这限制了可预测性。增强该模型的一种方法是纳入入院后不久获得的信息,包括生命体征和患者病史。此外,需要进一步分析,以确定哪些特征在较短和较长的时间尺度上影响最大。由此,在使用回归预测 LOS 之前,可以使用分类模型将患者分为非过夜、短期和长期住院候选人。
参考
https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6245375/
https://www . health catalyst . com/success _ stories/reducing-length-住院时间
https://en.wikipedia.org/wiki/List_of_ICD-9_codes
正确的 C 可以让你在班上名列前茅。
现实世界中的 DS
关于协作、文化和社区,沉浸式数据科学教会了我什么

佩里·格罗内在 Unsplash 上的照片
在我的职业生涯中,我有过领导团队的经历——从小型战术代理团队,到精心组织复杂的国际跨职能团队,以实现全球品牌的年度目标。
我重视从每一次经历中学习,并在持续改进的过程中发扬这些经验,以利于组织和我自己。我还认为,挑战自己,在工作场所之外学习新技能,为我们的工作关系增加更多价值,这一点很重要。
最近,我有机会通过加入一个密集的数据科学沉浸式(DSI)来做到这一点,在那里,我每天都与来自不同背景、经历和年龄的一大群人打交道,所有人都将我们的集体优势和才能集中在解决摆在我们面前的挑战上。
作为一名学生,我发现自己可以独立工作,作为团队的一员,并且在整个课程中对某些实验室和项目提供见解和领导。
我没有预料到这一点,但我很幸运在这门课程中了解到的不仅仅是数据科学。它让我对当今工作场所中协作、文化和社区的重要性有了新的认识。

合作
我们在商业上的合作方式已经发展了几十年,我不仅仅是在谈论技术进步如何使我们今天能够做到这一点。我说的是合作精神的改变。
仔细想想,在短短几十年里,我们已经从高度竞争的“适者生存”管理结构中走了很长一段路,在这种结构中,个人或小型内部团体为了实现共同的目标而相互竞争。
德勤(Deloitte)的《人力资本趋势报告》(Human Capital Trends Report)最近指出,全球 94%的公司认为“敏捷性和协作”对其组织的成功至关重要,其中 32%的公司表示,他们正在改变其组织结构,以更加“基于团队”。
我们非常幸运,今天的环境包含了真正的合作精神,而不是激烈的内部竞争。今天,我们看到了一种方法,它同时利用每个人的优势,允许更多的思想交流和更好的产品或解决方案,以及一个比几十年前的工作场所环境更具生产力和效率的流程。该 DSI 提供了倾听、学习和领导的绝佳机会:
- 当我们作为团队的一员参加黑客马拉松挑战时,我们有一天的时间来创建和提出我们最好的模型,并尝试发布当天最高的准确度分数。在最初的对话中,我们每个人都提供了自己的优势,并分享了我们认为可以做出最大贡献的地方,之后,我们每个人都创建了自己的代码部分。然后我们把它贴了出来,发给我们的其他队友去改进和补充。我们的最终代码真实地反映了每个人的最佳贡献,当我们公布最高的准确性分数时,完全出乎我们的意料。
- 在另一个项目中,在不同的团队中,很明显我们很难将我们的方法与自然语言处理解决方案联系起来。在我们的第一次工作会议之后,我决定绘制一份流程图,列出我们所有的想法,以及我认为我们试图阐明的前进道路。在我们下一次见面之前,我把它放松给小组,以便在我们重新联系之前建立联系。让所有人步调一致至关重要。一旦有了清晰的架构,所有的想法都得到了认可,紧张感消失了,我们团队的活力变得更好了。
无论是在一场友好的课堂黑客马拉松比赛中,还是在实验室工作时在课堂外分享见解,甚至是在一个松弛的通道中通过踢代码来解决深夜问题,我们都积极地相互帮助。
我们都参加了,人人为我,我为人人。我们了解到,当团队成员之间存在信任、清晰的沟通以及想法能够激发、点燃和煽起更大概念的火焰时,就出现了真正的协作。
谷歌最近开展了一项名为“亚里士多德项目”的计划,在该计划中,他们分析了有效的团队,并确定了对他们的成功贡献最大的品质。信任是最重要的因素,被定义为心理安全:
在一个心理安全度高的团队里,队友觉得在队友身边冒险很安全。他们相信团队中没有人会因为承认错误、提出问题或提出新想法而为难或惩罚其他人。

由 You X Ventures 在 Unsplash 上拍摄的照片
文化
我的 DSI 经历不仅强化了协作精神,还让我深入了解了科技公司为其团队成功培育的协作文化。
在旧的“适者生存”结构中,讨论“下一步”意味着在提出问题之前就有了所有的答案。在当今快节奏的开发世界中,参与机会中的“下一步”—庆祝项目的进展,讨论项目的下一步,并在此过程中征求其他人的改进或创新想法。
当文化是协作的时候,公司就赢了。
当有一个为了公司的更大利益而在团队之间分享想法和资源的环境时,他们会赢,当他们出现内部竞争时,他们会输。
例如,我们的 DSI 最重要的元素之一是我们的个人顶点项目。课程进行到一半时,我们必须向导师和同事展示三个潜在的概念,以获得反馈,并讨论我们会考虑构建哪个概念。
你最初会认为在顶点时间每个人都会疯狂地互相竞争,但是我们没有。随着思想的公开交流,我们的团队从一开始就非常相互支持,当他们看到相关的东西时,会主动提供建议和文章链接。我相信我们才华横溢的导师创造了这样的环境,我知道这种环境是基于他们自己的工作经验。
我的顶点性质要求我训练自己使用一种在我的 DSI 课程中没有探索过的工具(由于我正在抓取的一个网站的结构,我意外地不得不自学如何使用 Selenium for Python,你可以在这里阅读更多关于它的内容)。经过两个星期的紧张训练和导师的指导,我找到了使用它的窍门。
大约在那个时候,我的一个同学意识到她也需要跳入 Selenium,并向我寻求指导。我很高兴能与她分享我所学到的一切,当我看到她最终的顶点项目和演示是多么令人难以置信时,我也同样激动。
我们不是唯一的,这种动力在我们的团队中循环。
这是做数据科学家的好处之一。我们利用数据来提供见解和解决问题,我们有机会使用令人难以置信的工具进行实验和工作,我们将人们聚集在一起,同时与优秀的同事合作。

克里斯蒂娜@ wocintechchat.com 在 Unsplash 上的照片
社区
在沉浸式数据科学环境中与同学一起工作是一回事,向在不同领域积极从事数据科学家工作的沉浸式数据科学校友学习是另一回事。
我们有机会花时间与五位极具才华的个人进行了小组讨论,他们加入该计划时有着不同的背景,现在已经成为数据科学家,发挥了他们的优势。
例如,一位小组成员非常擅长推动协作,并在他的组织中充当销售和数据分析师团队之间的粘合剂。另一位利用了她出色的法务会计背景、数据科学技能,以及她在一家著名的法务和诉讼咨询公司服务客户和管理团队的能力。
在所有情况下,他们帮助我们理解我们在课堂上所经历的就是他们每天所经历的。无论是在他们最初的求职过程中,还是在他们所扮演的角色中,合作文化都是一样的。
现在,除了在他们的日常生活中生活这种文化之外,他们现在回头积极地引导和欢迎我们进入他们的社区。

安妮·斯普拉特在 Unsplash 上的照片
结论
德勤(Deloitte)的《人力资本趋势报告》(Human Capital Trends Report)最近指出,全球 94%的公司认为“敏捷性和协作”对其组织的成功至关重要,其中 32%的公司表示,他们正在改变其组织结构,以更加“基于团队”。
毫无疑问,在我看来,任何人从像我们这样的数据科学沉浸式体验中走出来,都会在一个具有协作文化和团队结构的公司中表现出色。事实上,对于那些刚刚意识到自己也需要向这个方向转变的公司来说,它们也将是一笔巨大的财富。
协作文化存在于这个社区中,今天培育这种文化的公司,明天就会利用这种文化。
更多关于谷歌对来自项目 Aristotle 的高效团队的发现,点击这里。欲了解德勤最新人力资本趋势报告,请点击此处。
适合我的电动汽车:联合分析的用例

图片由来自 Pixabay 的 Francis Ray 拍摄
了解汽车制造商如何利用联合分析在市场竞争中胜出
2020 年可能是电动汽车成为主流的一年。事实上,在 2019 年的一项研究中,39%的司机表示,他们会考虑购买电动汽车作为下一辆车。作为一个新兴市场,了解什么问题对消费者来说是重要的是至关重要的,因为这可以帮助汽车制造商不仅在电动汽车市场建立立足点,还可以享有忠诚的客户群。联合分析是一种流行的营销工具,正是为此目的而设计的。
我认为分析加州租赁的电动汽车会很有趣,因为该州拥有美国最发达的电动汽车市场。以下是 2019 年底旧金山可供租赁的车辆(来源:【https://electrek.co/best-electric-vehicle-leases/】)。

旧金山出租的电动汽车型号
租赁详情包含在字段月成本、前期成本和期限中。其余字段涉及电动车辆的规格(例如范围、轿车或 SUV )。车辆的相对受欢迎程度可以在这里找到:https://inside EVS . com/news/343998/monthly-plug-in-EV-sales-score card/如果有令人眼花缭乱的选择,你应该购买哪一款电动汽车?
联合分析简介
联合分析为回答这个问题提供了一个原则性的方法。这种分析的一个基本概念是效用。效用试图量化消费者对一件商品的特定属性的重视程度。因此,效用反映了消费者的优先事项、价值观和偏好。效用越高,消费者从产品中获得的使用就越多,因此,如果消费者是理性的,他就会购买效用最大化的产品。
但是我们如何衡量一个人的效用呢?通常,一个群体的效用是通过要求他们对一组产品进行偏好排序或从一个小集合中选择一个产品来推断的。

来源:维基百科
通过仔细控制展示的产品组合的顺序,并通过分析回答者的选择,人们可以估计产品的各种属性对群体的隐含效用。
下面的所有分析都是在下面链接的 Github repo 中实现的。不幸的是,没有公开的电动汽车公用事业数据集可供我进行联合分析。因此,我选择模拟一组 560 个人的效用,他们分为三代:千禧一代、X 一代和婴儿潮一代。这三个细分市场是从略微不同的分布中模拟出来的,考虑到了细分市场之间在口味/偏好上的明显差异。这是三个人每月分期付款的模拟公用设施。

这三个人都有单调递减的效用(即他们是理性的,喜欢每月支付较少的钱)。人 B 对价格最敏感,因为她对月成本的效用得分范围最大。对于所有三个人,效用分数的总和将为零。这对于记录在任何属性上的效用分数都是正确的。
我们考察了同一用户对电动汽车范围的效用。

我们看到这三个人都更喜欢续航里程更长的电动汽车,其中 A 认为车辆续航里程最重要。注意,对于所有三个人来说,效用从最低 EV 范围到最高 EV 范围的增加小于他们效用分数从最可负担每月分期付款到最不可负担每月分期付款的绝对移动。因此,这三个人都优先考虑租赁的每月分期付款,而不是 EV 范围。
我们也可以测量分类变量的效用。一个流行的衡量标准是看人们从各种品牌中获得的效用。

A 和 B 强烈倾向于特斯拉而不是其他品牌。C 人不太看重电动汽车的品牌,但相对于特斯拉,他不太喜欢日产。
问题是,为什么一家公司要花这么多的麻烦和费用来进行一项研究,以得出一组用户的隐含效用分数。正如我们将看到的,它们提供了一种了解市场需求的强有力的方法,并能使一家公司在竞争中胜过其对手。
联合研究的回报
联合研究可以提供对市场状况的多种见解,使公司能够了解市场需要什么,以及它将如何对产品供应的变化做出反应。我们在下面列出了一些可以从联合研究中获得的见解。同样,关于如何实施分析的更多细节包含在下面链接的 Github repo 中。
1.预测电动汽车车型的市场份额
也许联合研究最明显的用例是,它使人们能够预测各种模型产品的相对市场份额。根据受访者的效用得分,我们预计他们会选择效用最高的电动汽车车型,因此,通过记录拥有效用最高的特定车型的受访者数量,我们可以预测该车型在更广泛市场中的受欢迎程度。下表显示了基于模拟公用事业数据的电动汽车租赁的相对受欢迎程度。

电动汽车租赁的预测受欢迎程度
同一品牌的所有型号都有相同的颜色条。我们看到,特斯拉是最受欢迎的品牌,约 60%的受访者选择了它。
上述计算假设客户将总是购买给他们带来最高效用的产品。更实际的是,考虑到第 k 个模型的效用,联合分析通常假设选择第 i 个模型的概率是:

将效用分数映射到购买概率
对一个产品效用高,对其他所有东西效用低的产品,会有很大概率被挑中。
2.对所选模型的吸引力
公司对客户的忠诚度非常感兴趣——他们的客户是喜欢他们的产品,并且相信市场上没有其他产品可以与之媲美,还是他们只是微弱地喜欢公司的产品而不是市场上的其他产品?后一种情况将表现为,例如,奥迪客户对奥迪 e-tron 的效用最高,但竞争车型(例如,特斯拉 Model X)对该客户的效用几乎一样高。
下面的热图显示了每种车型对客户的吸引力。对角线元素反映了与市场上的其他产品相比,客户对其选择的偏好程度。特斯拉,Model X 客户对他们的选择特别满意。非对角线值显示了其他电动汽车对各种电动汽车客户的相对吸引力。例如,如果交易变得更好(例如,更便宜的价格、附加产品),一些大众、e-tron 客户可能会被说服转向特斯拉、Model X。

热图中的每个非对角线单元格都有相应的散点图。散点图针对 EV 模型的一组预测客户,由所选单元的 y 坐标给出。单元格的 x 坐标将相应 EV 模型的效用与首选 EV 模型进行比较(在 y 坐标中)。这种比较是在散点图的 y 轴上进行的,散点图比较每辆车被购买的概率比率。客户根据他们所属的细分市场进行颜色编码(千禧一代是绿色,X 一代是金色,婴儿潮一代是灰色)。我们可以看到,千禧一代和 X 世代的客户更容易被说服转向 Model X。
3.顾客对品牌的忠诚度
我们可以收集所有预计会购买某个特定品牌的人,并绘制出他们购买属于该品牌的型号的概率。他们预测品牌的概率越高,对品牌的忠诚度越高。

我们看到,预计购买特斯拉电动汽车的人最有可能购买,而日产的预计客户最有可能购买日产电动汽车。
4.寻找公司最激烈的竞争对手
对于每个电动汽车品牌,我们可以关注预测购买其汽车的受访者,并通过绘制他们预测购买其他品牌的概率,我们可以看到他们认为自己预测的首选品牌与其他七个品牌相比有多有吸引力。

这里我们重点关注预测的日产客户。因此,日产的概率分布(根据定义)是最右边的。在日产之后最靠右的品牌分布是日产最大的威胁。我们看到,日产品牌最容易被特斯拉和起亚抢走客户,因为这些分布在日产分布之后最靠右。
5.模型设计对关键财务指标的影响
竞争市场中的公司通常在产品开发上投入大量资金,因为这使他们能够定期更新产品。联合分析使人们能够看到不同的租赁结构(或新的电动汽车模型)对公司财务状况的影响。假设特斯拉希望看到 Model 3 和 Model S 每月增加 100 美元的月供以及 Model X 每月增加 200 美元的月供对其财务状况的影响。

左上角的面板显示了对客户数量的影响。正如预期的那样,增加每月分期付款会导致特斯拉失去客户,而起亚受益最大。然而,右上图(月收入)显示,剩余客户支付的更高分期付款足以弥补这一不足。底部面板显示了对每个客户平均月收入以及 EBIT 的影响。
我们也可以选择检查当共同改变两个属性时,对这些相同的财务措施的影响;例如,每月分期付款和前期费用。

6.客户档案与模型产品的关系
最后,我们可以看到一组特定的产品将对公司客户的人口统计特征产生什么影响。通过了解他们的产品吸引哪些客户,公司可以更好地进行营销活动。

我们看到千禧一代对价格最敏感,25%的千禧一代特斯拉客户因每月分期付款增加 100 美元而流失。注意不同的行为:例如,失去的婴儿潮一代客户大多转向丰田,而没有失去的 X 一代客户转向丰田。
我们可以更清楚地了解在任何选择的价位上各个细分市场的情况。例如,在+100 美元/分点,对分段的影响如下:

结论
联合分析是理解市场需求和欲望的有力工具。它可以帮助公司更好地满足客户的需求,并在市场竞争中胜出。
链接
联合分析 Github:https://github.com/Melvin-Var/ConjointElectricVehicles
Youtube 演示:【https://youtu.be/JucZrr-W6CY
感谢您花时间阅读这篇文章!如果您喜欢这篇文章,您可能会喜欢我写的其他一些媒体文章:
- 了解如何在 AWS 上部署仪表板(如上面 Github repo 中的仪表板):如何使用 Docker 在 AWS 上部署仪表板应用
- 了解深度学习的优势和局限性:不,深度学习是不够的
查阅字典的正确方法
PYTHON 词典指南
小心点!你可能做错了

在用 Python 编程时,字典是现成可用的数据结构之一。
在我们开始之前,什么是字典?
Dictionary 是一个无序和无序的 Python 集合,它将惟一的键映射到一些值。在 Python 中,字典是用花括号{}写的。键与键之间用冒号:隔开,每个键-值对用逗号,隔开。下面是用 Python 声明字典的方法。
#A dictionary containing basketball players with their heights in m
playersHeight = {"Lebron James": 2.06,
"Kevin Durant": 2.08,
"Luka Doncic": 2.01,
"James Harden": 1.96}
我们已经创建了字典,但是,如果我们不能再次检索数据,这对我们有什么好处呢?这是很多人做错的地方。我应该承认,不久前我也是其中之一。当我意识到优势后,我再也不会回头了。这就是为什么我有动力与你们分享它。
错误的方式
众所周知的,或者我应该说是传统的在字典中访问一个值的方法是通过引用它在方括号中的键名。
print(playersHeight["Lebron James"]) #print 2.06
print(playersHeight["Kevin Durant"]) #print 2.08
print(playersHeight["Luka Doncic"]) #print 2.01
print(playersHeight["James Harden"]) #print 1.96
一切都很好,对吗?没那么快!如果你输入一个字典里没有的篮球运动员的名字,你认为会发生什么?仔细看
playersHeight["Kyrie Irving"] #KeyError 'Kyrie Irving'
请注意,当您想要访问字典中不存在的键值时,将会导致 KeyError。这可能会很快升级为一个大问题,尤其是当你正在构建一个大项目的时候。不要烦恼!当然有一两种方法可以解决这个问题。
使用 If
if "Kyrie Irving" is in playersHeight:
print(playersHeight["Kyrie Irving"])
使用 Try-Except
try:
print("Kyrie Irving")
except KeyError as message:
print(message) #'Kyrie Irving'
这两个代码片段运行起来都没有问题。现在,看起来还可以,我们可以容忍写更多的行来处理可能的 KeyError。然而,当你写的代码是错误的时候,它会变得很烦人。
幸运的是,有更好的方法来做到这一点。不是一个,而是两个更好的方法!系好安全带,准备好!
正确的方式
使用 get()方法
使用 get 方法是处理字典时最好的选择之一。这个方法有两个参数,第一个是必需的,第二个是可选的。然而,为了发挥get()方法的全部潜力,我建议您填充这两个参数。
- First:要检索其值的键的名称
- 第二:如果我们要搜索的键在
#A dictionary containing basketball players with their heights in m
playersHeight = {"Lebron James": 2.06,
"Kevin Durant": 2.08,
"Luka Doncic": 2.01,
"James Harden": 1.96}#If the key exists
print(playersHeight.get("Lebron James", 0)) #print 2.06
print(playersHeight.get("Kevin Durant", 0)) #print 2.08#If the key does not exist
print(playersHeight.get("Kyrie Irving", 0)) #print 0
print(playersHeight.get("Trae Young", 0)) #print 0
当键存在时,get()方法的工作方式与引用方括号中的键的名称完全相同。但是,当键不存在时,使用get()方法将打印我们输入的默认值作为第二个参数。
如果不指定第二个值,将返回一个None值。
您还应该注意,使用get()方法不会修改原始字典。我们将在本文后面进一步讨论它。
使用 setdefault()方法
什么?还有别的办法吗?是的,当然!
当您不仅想跳过 try-except 步骤,还想覆盖原来的字典时,您可以使用setdefault()方法。
#A dictionary containing basketball players with their heights in m
playersHeight = {"Lebron James": 2.06,
"Kevin Durant": 2.08,
"Luka Doncic": 2.01,
"James Harden": 1.96}#If the key exists
print(playersHeight.setdefault("Lebron James", 0)) #print 2.06
print(playersHeight.setdefault("Kevin Durant", 0)) #print 2.08#If the key does not exist
print(playersHeight.setdefault("Kyrie Irving", 0)) #print 0
print(playersHeight.setdefault("Trae Young", 0)) #print 0
我说的改写是这个意思,当你再次看到原词典的时候,你会看到这个。
print(playersHeight)
"""
print
{"Lebron James": 2.06,
"Kevin Durant": 2.08,
"Luka Doncic": 2.01,
"James Harden": 1.96,
"Kyrie Irving": 0,
"Trae Young": 0}
除此之外,setdefault()方法与get()方法完全相似。
最后的想法
get()和setdefault()都是你们都必须熟悉的高级技术。实现它并不困难和简单。你现在唯一的障碍是打破那些旧习惯。
但是,我相信随着你使用它,你会立即体验到不同之处。过一段时间,你就不再犹豫改变,开始用get()和setdefault()的方法。
记住,当你不想覆盖原来的字典时,用get()方法。
当你想对原来的字典进行修改时,setdefault()会是你更好的选择。
问候,
弧度克里斯诺
用 Python 构建 API 的正确方法
关于 Flask 中的 API 开发,您需要了解的所有内容

我们如何建立一种从一个软件实例到另一个软件实例的通信方式?这听起来很简单,而且——说实话——确实如此。
我们只需要一个 API。
API(应用编程接口)是一个简单的接口,它定义了请求的类型(需求/问题等)。)能做的,怎么做的,怎么加工的。
Flask API 视频演练——涵盖了本文中的所有内容!
在我们的例子中,我们将构建一个 API,它允许我们向不同的端点发送一系列 GET/POST/PUT/PATCH/DELETE 请求(稍后将详细介绍),并返回或修改连接到我们的 API 的数据。
我们将使用 Flask 框架来创建我们的 API 和 Postman 来测试它。简而言之,我们将涵盖:
**> Setup**
- Our Toy Data
- Initialize a Flask API
- Endpoints
- Running a Local Server
**> Writing Our API**
- GET
- POST
- 401 Unauthorized
- PUT
- DELETE
- Users Class (summary)
**> That's It!**
设置
我们的 API 将包含两个端点,users和locations。前者将允许访问我们的注册用户的详细资料,而后者将包括咖啡馆的位置列表。
这里假设的用例是一个数百万的咖啡馆书签应用程序,用户打开应用程序,将他们最喜欢的咖啡馆加入书签——像谷歌地图,但没有用。
我们的玩具数据
为了简单起见,我们将这些数据存储在两个本地 CSV 文件中。实际上,您可能想看看 MongoDB 或 Google Firebase 之类的东西。
我们的 CSV 文件如下所示:

users.csv 中的用户数据。图片作者。

locations.csv 中的位置映射。图片作者。
你可以在这里下载users . CSV,在这里下载locations . CSV。
初始化烧瓶 API
现在,对于我们的 Python 脚本,我们需要导入模块并初始化我们的 API,如下所示:
from flask import Flask
from flask_restful import Resource, Api, reqparse
import pandas as pd
import astapp = Flask(__name__)
api = Api(app)
端点
正如我们已经提到的,我们的 API 将有两个端点,users和locations。
这样做的结果是——如果我们的 API 位于www.api.com,那么与Users类的通信将在www.api.com**/users**提供,而Locations将在[www.api.com**/locations**](http://www.api.com/locations.) 提供。
为了创建一个端点,我们定义了一个 Python 类(可以使用任何名称)并用api.add_resource将它连接到我们想要的端点,就像这样:
- Flask 需要知道这个类是我们 API 的一个端点,所以我们用类定义传入
Resource。 - 在类内部,我们包含了我们的 HTTP 方法(GET、POST、DELETE 等。).
- 最后,我们使用
api.add_resource将我们的Users类与/users端点链接起来。
因为我们想要两个端点,所以我们复制逻辑:
运行本地服务器
最后,当我们写出我们的 API 时,我们需要测试它!
要做到这一点,我们需要托管我们的 API,我们可以通过在脚本末尾添加app.run来本地完成,如下所示:
if __name__ == '__main__':
app.run() # run our Flask app
现在,当我们运行我们的脚本时,我们应该看到类似这样的内容:

本地主机服务器的初始化。图片作者。
一旦我们的服务器设置好了,我们就可以在使用 Postman 构建 API 时对其进行测试,如果您以前没有使用过它的话,因为它是 API 测试的事实标准。别担心——使用起来非常简单——从这里下载 Postman。
在继续之前,你可以在这里找到我们将要构建的的完整脚本。如果您不确定代码片段应该放在哪里,请查看那里!
编写 API 方法
在每个类中,我们保留了 HTTP 方法 GET、POST 和 DELETE。
为了创建一个 GET 方法,我们使用def get(self)。POST 和 DELETE 遵循相同的模式。
得到
GET 方法是最简单的。我们返回所有存储在users.csv中的数据,这些数据被包装在一个字典中,就像这样:
然后,我们可以运行脚本来初始化我们的 API,打开 Postman 并向我们的本地主机地址(通常是[http://127.0.0.1:5000](http://127.0.0.1:5000)))发送 GET 请求——这是我们的 API 入口点。

如何向我们的 API 发送 GET 请求。图片作者。
要在 Postman 中向我们的 API 发送 GET 请求,我们:
- 从下拉列表中选择获取
- 键入我们的 API 实例+
/users(端点)的入口点 - 点击发送
- 检查我们的 API 返回的状态代码(我们应该看到
200 OK) - 查看我们的 API 的响应,是 JSON (像字典)格式的
users.csv
邮政
POST 方法允许我们向数据中添加记录。在这种情况下,我们将采用usedId、name和city的参数。
这些参数作为 URL 参数传递给我们的 API 端点,如下所示:
*[http://127.0.0.1:5000/users**?userId=abc123&name=The**](http://127.0.0.1:5000/users?userId=abc123&name=The) **Rock&city=Los Angeles***
我们可以指定所需的参数,然后使用reqparse解析提供的值,如下所示:
让我们分解一下解析器代码:
- 我们用
.RequestParser()初始化我们的解析器。 - 用
.add_argument([arg_name], required)添加我们的参数——注意required=True意味着参数在请求中是必需的。或者,我们可以用required=False添加可选参数。 - 使用
.parse_args()将我们的参数及其值解析到一个 Python 字典中。
然后,我们可以访问传递给每个参数的值,就像我们通常在字典中访问键值对一样。
让我们将这些放在一起,为我们的 CSV 增加价值:
如果它开始看起来有点混乱,我们所做的就是:
- 从 URL 参数
args创建一行新数据new_data - 将其附加到预先存在的
data - 保存新合并的数据
- 并且,返回
data和一个200 OK状态码。

我们通过向我们的/用户端点发送包含 userId 、 name 和 city 参数的 POST 请求来创建一个新用户。图片作者。
我们现在可以发送一个 POST 请求来创建一个新用户,很简单!
401 未经授权
我们的代码处理 POST 请求,允许我们向users.csv写入新数据——但是如果那个用户已经存在了呢?
为此,我们需要添加一个检查。如果userId已经存在,我们返回一个401 Unauthorized代码给用户。

如果我们尝试用用户 id“ABC 123”再次发布,我们将返回以下 401 未授权状态代码和消息。图片作者。
回到 Postman,我们可以通过尝试添加同一个用户两次来测试我们的 API 是否正常工作——这一次,Rock 收到了一个401 Unauthorized响应。
放
如果我们想给一个用户添加一个咖啡馆呢?我们不能使用 POST ,因为这会返回一个401 Unauthorized代码——相反,我们使用 PUT 。
与 POST 类似,我们需要在提供的userId不存在的情况下增加 if-else 逻辑。
除了对代码做了一些小的调整,我们的 PUT 方法与 POST 几乎相同。

这里我们使用 PUT 方法将 ID 为 0007 的咖啡馆添加到 Rock 的书签位置。图片作者。
回到 Postman,我们需要的输入参数已经改变。现在,我们只需要userId和一个location来添加到用户书签locations中。
删除
我们也可以用 DELETE 方法删除记录。
这个方法非常简单,我们需要指定一个userId来移除,并在不存在userId的情况下添加一些 if-else 逻辑。
因此,如果Jill认为我们的应用程序毫无用处,想要离开,我们会发送一个包含她的userId的删除请求。

发送针对用户 id‘B2C’的删除请求,从我们的用户数据中删除 Jill 的记录。图片作者。
我们可以在 Postman 中测试这一点,不出所料,我们返回的数据没有 Jill 的记录。如果我们尝试删除一个不存在的用户会怎么样?

如果我们删除一个不存在的用户标识,我们将收到一个 404 未找到状态代码和一条解释用户标识不存在的消息。图片作者。
我们再次收到我们的404 Not Found和一条简短的消息,说明没有找到userId。
用户类别
这是组成Users类的所有部分,通过我们的/users端点访问。你可以在这里找到的完整脚本。
之后还需要把Locations类拼起来。这个类应该允许我们获取、发布、修补(更新)和删除位置。
每个位置都有一个唯一的 ID——当用户将一个位置加入书签时,这个唯一的 ID 会被添加到他们的带有PUT /users的locations列表中。
这个的代码和我们在Users类中写的没有太大的不同,所以我们不会重复。然而,你可以在Users级旁边找到它。
就是这样!
就这么简单。用 Flask 和 Python 建立一个 API 非常简单。
我们现在有了一个易于使用的标准化方法来在不同的接口之间进行通信。
我们已经讨论了所有最常见的请求方法——GET、POST、PUT 和 DELETE——以及一些 HTTP 状态代码——200、401 和 404。
最后,我们已经学会了如何在本地托管我们的 API,并使用 Postman 测试它——允许我们快速诊断问题,并确保我们的 API 按预期运行。
总而言之,API 开发对于开发人员、数据科学家以及你能想象到的几乎任何其他技术倾向的角色来说都是一项至关重要的技能。
如果你想要更多,我在 YouTube 这里发布编程教程。或者,如果您有任何问题或改进的想法,请在 Twitter 或下面的评论中告诉我。
我希望你喜欢这篇文章,感谢你的阅读!
🤖《变形金刚》课程 NLP 的 70%折扣
想在 API 开发中采取下一步措施并与世界分享您的成果吗?点击此处了解谷歌云平台的 API 部署:
将您的 API 部署到 Google 云平台
towardsdatascience.com](/how-to-deploy-a-flask-api-8d54dd8d8b8a)*
将深度学习用于表格数据|实体嵌入的正确方法
从业者已经将自然语言处理(NLP)中使用的网络嵌入到表格数据中。

米卡·鲍梅斯特在 Unsplash 上的照片
最近,我参加了一个深度学习课程,在这个课程中,我被分配了一个利用深度学习技术的项目。当我在职业生涯的前 6 个月从事结构化数据工作时,我立即想到了对表格数据使用深度学习或神经网络。
在表格数据中使用深度学习并不是一个新想法。人们对这些数据使用全连接神经网络已经有很长时间了,但是它也有一些缺点;
- 神经网络需要大量数据
- 与更流行的机器学习算法(例如随机森林、梯度推进树)相比,模型性能的增益微不足道
- 缺乏可解释性
因此,对表格数据使用深度学习从未真正起步。这是真的,直到从业者将自然语言处理(NLP)中使用的嵌入网络的想法转移到表格数据。
这就是它的工作原理。
传统上,“性别”或“种族”等分类变量使用一键编码进行处理,变量中的每个实体都有一个唯一的列来跟踪实体的存在。

独热编码的例子
这种方法虽然将数据转换成适合机器学习算法的格式,但它假定实体之间是独立的,并产生稀疏矩阵。
另一方面,实体嵌入使用向量来表示每个实体,而不是二进制值。这有几个优点:
- 消除计算效率低的稀疏矩阵问题
- 生成显示每个实体之间关系的向量(获得额外的见解,而不是将它们视为独立的)
因此,我决定做一个使用表格的项目来演示实体嵌入的使用。我使用的数据集是来自 Kaggle 的 IEEE-CIS 欺诈检测数据,您可以在这里找到。
下面是一步一步的代码(包括我在 Colab 工作时的 Google Colab 特定代码)。
首先,要检查 colab 中分配给您的 GPU,您可以运行以下代码。
!nvidia-smi

在我的谷歌硬盘旁边,
from google.colab import drivedrive.mount('/content/drive')
从 Kaggle 下载数据集,为此您需要 Kaggle API 令牌。如果你需要任何帮助从 Kaggle 下载数据集,这个可能会有帮助。
!mkdir /root/.kaggle!echo '{"username":"USERNAME","key":"KEY"}' > /root/.kaggle/kaggle.json!chmod 600 /root/.kaggle/kaggle.json!kaggle competitions download -c ieee-fraud-detection# unzip all files!unzip train_transaction.csv.zip
!unzip test_transaction.csv.zip
然后,将 csv 文件读入熊猫数据帧
train = pd.read_csv("train_transaction.csv")
test = pd.read_csv("test_transaction.csv")
由于这是一个欺诈检测数据集,拥有不平衡的数据并不奇怪。
train["isFraud"].mean() # 0.03499000914417313
由于数据探索和特征工程不是这篇文章的目的,我将使用最小特征来预测欺诈标签。为了确保您可以复制我的代码,下面是我的处理步骤。
# generate time of daytrain["Time of Day"] = np.floor(train["TransactionDT"]/3600/183)
test["Time of Day"] = np.floor(test["TransactionDT"]/3600/183)# drop columnstrain.drop("TransactionDT",axis=1,inplace=True)
test.drop("TransactionDT",axis=1,inplace=True)# define continuous and categorical variablescont_vars = ["TransactionAmt"]
cat_vars = ["ProductCD","addr1","addr2","P_emaildomain","R_emaildomain","Time of Day"] + [col for col in train.columns if "card" in col]# set training and testing setx_train = train[cont_vars + cat_vars].copy()
y_train = train["isFraud"].copy()
x_test = train[cont_vars + cat_vars].copy()
y_test = train["isFraud"].copy()# process cont_vars
# scale valuesfrom sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
x_train["TransactionAmt"] = scaler.fit_transform(x_train["TransactionAmt"].values.reshape(-1,1))
x_test["TransactionAmt"] = scaler.transform(x_test["TransactionAmt"].values.reshape(-1,1))# reduce cardinality of categorical variablesidx_list = x_train["card1"].value_counts()[x_train["card1"].value_counts()<=100].index.tolist()
x_train.loc[x_train["card1"].isin(idx_list),"card1"] = "Others"
x_test.loc[x_test["card1"].isin(idx_list),"card1"] = "Others"# fill missingx_train[cat_vars] = x_train[cat_vars].fillna("Missing")
x_test[cat_vars] = x_test[cat_vars].fillna("Missing")for cat, index in categories.items():test[cat] = pd.Categorical(test[cat],categories=categories[cat],ordered=True)
处理步骤完成后,现在我们可以将分类变量转换成整数。
# convert to numerical value for modellingdef categorify(df, cat_vars):categories = {}for cat in cat_vars:
df[cat] = df[cat].astype("category").cat.as_ordered()
categories[cat] = df[cat].cat.categoriesreturn categories def apply_test(test,categories):for cat, index in categories.items():
test[cat] = pd.Categorical(test[cat],categories=categories[cat],ordered=True)# convert to integers
categories = categorify(x_train,cat_vars)
apply_test(x_test,categories)for cat in cat_vars:
x_train[cat] = x_train[cat].cat.codes+1
x_test[cat] = x_test[cat].cat.codes+1
由于高度不平衡的数据集,我不得不使用一种称为合成少数过采样技术(SMOTE)的技术人工生成更多的欺诈数据。文档可以在这里找到。
from imblearn.over_sampling import SMOTEsm = SMOTE(random_state=0)x_sm, y_train = sm.fit_resample(x_train, y_train)
x_train = pd.DataFrame(x_sm,columns=x_train.columns)
最后,我们可以对数据进行建模。这个实体嵌入的实现采用了杰瑞米·霍华德的“程序员机器学习入门课程的思想和最佳实践。因此,杰里米通过他的研究和经验选择了许多技术细节,如嵌入大小和隐藏层。无论如何,如果你没有看过这个课程,我强烈建议你参加这个课程,听听杰里米的机器学习方法。它也是完全免费的。
# get embedding size for each categorical variabledef get_emb_sz(cat_col,categories_dict):
num_classes = len(categories_dict[cat_col])
return int(min(600,round(1.6*num_classes**0.56)))
现在来定义神经网络。网络的结构是连续变量与每个分类变量的嵌入层的简单连接。
# define the neural networksfrom tensorflow.keras.layers import Input, Embedding, Dense, Reshape, Concatenate, Dropout, BatchNormalizationfrom tensorflow.keras import Modeldef combined_network(cat_vars,categories_dict,cont_vars, layers):inputs = []
embeddings = []
emb_dict ={}# create embedding layer for each categorical variablesfor i in range(len(cat_vars)):
emb_dict[cat_vars[i]] = Input(shape=(1,))
emb_sz = get_emb_sz(cat_vars[i],categories_dict)
vocab = len(categories_dict[cat_vars[i]]) +1
embedding = Embedding(vocab,emb_sz,input_length=1)(emb_dict[cat_vars[i]])
embedding = Reshape(target_shape=(emb_sz,))(embedding)
inputs.append(emb_dict[cat_vars[i]])
embeddings.append(embedding)# concat continuous variables with embedded variablescont_input = Input(shape=(len(cont_vars),))
embedding = BatchNormalization()(cont_input)
inputs.append(cont_input)
embeddings.append(embedding)x = Concatenate()(embeddings)# add user-defined fully-connected layers separated with batchnorm and dropout layersfor i in range(len(layers)):if i ==0:
x = Dense(layers[i],activation="relu")(x)
else:
x = BatchNormalization()(x)
x = Dropout(0.5)(x)
x = Dense(layers[i],activation="relu")(x)output = Dense(1,activation="sigmoid")(x)
model = Model(inputs,output)return model
现在初始化模型。
layers = [200,100]model = combined_network(cat_vars,categories,cont_vars, layers)opt = tf.keras.optimizers.Adam(0.0001)model.compile(optimizer=opt,loss='binary_crossentropy',metrics=["accuracy"])
处理神经网络的输入。
# process x_train input to fit modelinput_list = []for i in cat_vars:
input_list.append(x_train[i].values)
input_list.append(x_train[cont_vars].values)# modify x_test input to fit modeltest_list = []
for i in cat_vars:
test_list.append(x_test[i].values)
test_list.append(x_test[cont_vars].values)
训练模特~
model.fit(input_list,y_train,epochs=10)
做出预测
y_pred = model.predict(test_list)# choose a optimal threshold
y_pred = y_pred>0.1
最后,竞赛使用 ROC-AUC 对排行榜进行排名。因此,我们计算我们的 ROC-AUC,看看我们如何与他人相比。
roc = metrics.roc_auc_score(y_test,y_pred)
roc
0.8787572838641191
对于一个只使用部分功能的模型来说,这还不错。
这就是了。使用实体嵌入进行 Kaggle 表格数据竞赛。希望你喜欢它。
数据科学薪水的涨跌和再涨
意见
2015-2020 年数据科学薪资有怎样的变化,是什么原因造成的?

艾萨克·史密斯在Unsplash【1】上拍摄的照片。
目录
- 介绍
- 薪资和增长
- 摘要
- 参考
介绍
根据 Glassdoor 的就业市场报告[2],在过去的五年里,美国数据科学的工资累计增长率在 12%之间波动。在这五年间,有几个月出现了大幅增加和减少。在本文中,我将概述这五年中特定月份和年份的关键指标,包括基本工资中位数、累计增长和同比增长。有些类似的职业,如软件工程,在同一时期也出现了稳步上升,所以注意数据科学工资的波动是很重要的。
我将推测为什么在每一个重要的时期,随着其相应的基本工资中位数的增加或减少。发生这些变化的原因有很多,观察数据科学工资(总计超过 10,000 美元)在月份和年份之间的差异很有意思。如果你想了解更多类似职位的工资信息,如数据分析师和软件工程师,你可以通过点击本文末尾的链接来参考相同的 Glassdoor 就业市场报告。
薪资和增长
我将在下面讨论数据科学薪资的涨跌和回升的关键指标。
升高
【2015 年 6 月
五年期的首次上涨是在 2015 年 6 月。本月的平均基本工资为95,798 美元,累计增长 6.2% 。这种增长可能有几个原因。虽然没有记录,但我可以推测是什么导致了累积工资增长的这种变化。
我认为,增长的峰值来自于公司意识到数据科学这一职业是多么强大和受欢迎。一旦公司雇佣越来越多的数据科学家,不仅对申请人来说,对雇主来说都变得更有竞争力。我在考虑,在这种情况下,2015 年,数据科学已经非常成熟,申请人在要求更高的工资时会更有信心,而公司在看到或听到这个职位在商业上取得的广泛成功后,会将更多预算分配给数据科学职业。
在某些情况下,您可能会争辩说,一名数据科学家可以通过 Python 等编程语言来执行通用流程自动化中两名分析师的功能,那么为什么不多付一个人一点钱,而不是从长远来看让两个人让您的企业付出更多成本呢?当然,所有的公司在某些方面都是不同的,他们各自的角色也是不同的,所以这可能是有益的,也可能是有害的。此外,数据分析师有时可能有相当不同的任务、流程和影响。
同样,这是第一次上升的指标:
*Rise of June 2015*median base salary: **$95,798**cumulative growth: **6.2%**
秋天
【2016 年 6 月
一旦公司雇佣了他们的第一个数据科学家,他们就会寻求雇佣更多的人。
也许这种趋势意味着他们已经有了一名高级数据科学家,下一个合理的选择是寻找一名初级数据科学家,可以用更低的工资收购。
2016 年 6 月的下降幅度相当大,基本工资中位数降至88,649 美元,累计增长 -1.7% ,同比增长 -7.5% 。是的,最后两个数据是阴性的。虽然我不确定工资大幅下降的原因,但我知道未来的日子会更好。作为一名数据科学家,我会创建一个数据集来隔离关键的重要特征,如下所示:
- 位置
- 人口统计学的
- 初级和高级角色的分布
- 数据科学和机器学习职位的拆分
- 薪资范围扩大
- 负面新闻
- 员工评估
- 预算削减
- 预算分配
- 报告工资时的错误
- 时事
- 通货膨胀
- 等等。
正如你所看到的,有几种不同的方式来剖析这种工资的下降。幸运的是,下跌没有持续很长时间,一个巨大的上涨将超过最初的上涨。以下是再次强调的指标:
*Fall of June 2016*median base salary: **$88,649**cumulative growth: **-1.7%**year-over-year growth: **-7.5%**
死而复生
【2020 年 6 月
过了几年才再次看到这种上升,最近一次发生在 2020 年 6 月。也许是在新冠肺炎,随着员工要求在家工作,或者被要求在家工作,技术角色变得更受关注。面向客户的角色可能会减少,因为许多新职位需要在家里通过视频会议平台单独完成。近 100,000 美元,本月数据科学家的基本工资中位数为99,674 美元,累计增长 10.5% ,同比增长 5.5% 。对于数据科学家来说,这种再次上升当然是个好消息。如果你还没有注意到,重要的是要注意到所有这些关键日期都在各自年份的 6 月份,也许这只是一个巧合,但知道为什么会出现这种趋势和模式会很有趣。
汇总信息在这里再次上升:
*Rise Again of June 2020*median base salary: **$99,674**cumulative growth: **10.5%**year-over-year growth: **5.5%**
摘要

作者 Google Data Studio 截图[3]。
为了便于查看,上图总结了关键日期及其各自的基本工资中位数、累计增长和同比增长指标。这个图表是在 Google Data Studio 中制作的,涵盖了本文中讨论的关键时间点。如果您想查看更多月份和年份的更详细的时间序列图,不仅包括数据科学统计数据,还包括其他技术位置统计数据,请访问下面参考资料部分中的 Glassdoor 链接。
至于数据科学薪酬的未来,随着疫情的出现,很难预测,曾经稳定的公司现在本身就不稳定。或许,随着越来越多的科技公司表现更好,数据科学的薪酬将会上升,或者随着越来越多的公司总体上出现下滑,薪酬将会下降。此外,数据科学职位可能很快会根据职位的具体要求提供或多或少的薪酬。例如,2025 年,数据科学家的基本工资中位数可能会降至 95,000 美元,而机器学习工程师的基本工资中位数可能会升至 105,000 美元。这种变化可能会导致公司需要更多地依赖模型的部署,减少面对面的互动。
在这篇文章中,我们讨论了数据科学工资的上涨、下跌和再次上涨。在过去的五年里,工资增长的这些变化有几个原因。请在下面随意评论为什么你认为这个工资中位数变化如此频繁。请记住,这种高度变化的趋势对于软件工程、系统工程和 web 开发人员等技术领域的类似职位来说是不一样的。
我希望你觉得我的文章有用而且有趣。谢谢你看我的文章!
参考
[1]照片由艾萨克·史密斯在Unsplash(2018)上拍摄
[2]格拉斯门公司,就业市场报告,(2008-2020 年)
[3] M.Przybyla,谷歌数据工作室截图,(2020)
OLAP 立方体的兴衰
列数据库成本结构的变化如何影响从过去预先构建 OLAP 立方体到直接在数据库中运行 OLAP 工作负载的转变。

照片由 克里斯蒂安·弗雷南 来自 Unsplash
更新:对复杂的分析前景感到困惑?查看我们的书: 《分析设置指南》 。
过去十年中,数据分析领域最大的转变之一是从构建“数据立方体”或“OLAP 立方体”转向直接在列数据库上运行 OLAP工作负载。*
(*OLAP 指的是在线分析处理,但我们一会儿会深入了解这意味着什么)。
OLAP 魔方的衰落是一个巨大的变化,尤其是如果你在过去三十年里一直从事数据分析工作。
这是一个巨大的变化,尤其是如果你在过去三十年里一直从事数据分析工作。在过去 50 年的商业智能中占主导地位的 OLAP 立方体正在消失,这可能对你来说很奇怪。您可能有理由怀疑这种向列数据库的转变。有哪些权衡?有哪些成本?这步棋真的有所有新厂商说的那么好吗?当然,在你的后脑勺有个声音在问:这是不是又一个会消失的时尚,就像之前的 NoSQL 运动一样?它会持续下去吗?
OLAP 魔方的衰落是一个巨大的变化,尤其是如果你在过去三十年里已经在数据分析领域建立了自己的职业生涯。
这篇文章试图成为一个关于 OLAP 立方体的历史和发展的详尽的资源,以及当前远离它的转变。我们将从术语的定义(OLAP 与 OLTP)开始,涵盖 OLAP 立方体的出现,然后探索列数据仓库作为 OLAP 工作负载的替代方法的出现。
这篇文章是为新手写的。如果你是一个更有经验的数据分析人员,请随意跳过前几节,以便在这篇文章的结尾找到有趣的部分。让我们开始吧。
OLAP 到底是什么?
在线分析处理(或 OLAP)是一个用来描述某一类数据库应用程序的时髦术语。这个术语是由数据库传奇人物 Edgar F. Codd 在 1993 年的一篇名为向用户分析师提供 OLAP:一项 IT 任务的论文中发明的。
Codd 创造这个术语并不是没有争议的。在他发表论文的一年前,Arbor Software 发布了一款名为 Essbase 的软件产品,而且——惊喜,惊喜!— Codd 的论文定义的属性恰好完全符合 Essbase 的特性集。
《计算机世界》杂志很快发现,为了更好地销售自己的产品,阿伯已经付钱给 Codd,让他“发明”OLAP 作为一种新的数据库应用。Codd 因为他的利益冲突而被点名,并被迫撤回他的论文…但似乎没有太大的影响:今天,Codd 仍然被认为是“关系数据库之父”,OLAP 从那以后一直作为一个类别存在。
那么 OLAP 的 T3 是什么样的 T2 呢你可能会问。解释这一点的最简单方法是描述两种类型的业务应用程序用法。假设你经营一家汽车经销商。您需要执行两种数据库支持的操作:
- 你需要使用数据库作为某些业务流程的一部分。例如,您的销售人员向客户销售最新的本田思域,您需要在业务应用程序中记录该交易。您这样做是出于操作原因:您需要一种跟踪交易的方法,您需要一种在汽车贷款或保险最终获得批准时联系客户的方法,并且您需要它来计算月底销售人员的销售奖金。
- 你使用数据库作为分析的一部分。你需要定期核对数据,以了解你的整体业务情况。在其 1993 年的论文中,Codd 称这种活动为“决策-支持”。这些问题包括“过去 3 个月伦敦售出了多少辆本田思域?”以及“谁是最高效的销售人员?”以及“轿车和 SUV 总体销量更好吗?”这些是你在月末或季度末问的问题,用来指导你近期的商业计划。
数据库使用的第一类被称为“在线事务处理”,或“OLTP”。数据库使用的第二类被称为“在线分析处理”,或“OLAP”。
或者,我喜欢这样想:
- OLTP:使用数据库来运行您的业务
- OLAP:利用数据库了解你的业务
为什么我们要区别对待这两类人?事实证明,这两种使用类型具有非常不同的数据访问模式。
使用 OLTP,您可以运行类似“记录一笔销售交易:2020 年 1 月 1 日伦敦分公司简·多伊的一辆本田思域”的操作。
有了 OLAP,你的查询会变得非常复杂:“给我过去 6 个月绿色本田 Civics 在英国的总销量”或“告诉我无名氏上个月卖了多少辆车”,以及“告诉我本田汽车这个季度与上个季度相比表现如何”?与前者的查询相比,后者的查询聚合了更多元素的数据。
在我们的汽车经销商的例子中,您可能能够在普通的关系数据库上运行 OLTP 和 OLAP 查询类型。但是如果你要处理大量的数据——例如,如果你要查询过去十年汽车销售的全球数据库——将你的数据从商业应用中分离出来进行分析就变得很重要了。否则会导致严重的性能问题。**
OLAP 的绩效挑战
为了让您对我们正在讨论的各种性能困难有一个直观的认识,请想一想当您在汽车经销商处分析汽车销售时必须提出的问题。
- 给我过去 6 个月绿色本田 Civics 在英国的总销量
- 告诉我无名氏上个月卖了多少辆车
- 与上一季度相比,本季度我们售出了多少辆本田汽车?
这些查询可以减少到一些维度——我们想要过滤的属性。例如,您可能希望检索按以下方式聚合的数据:
- 日期(包括月、年和日)
- 汽车模型
- 汽车制造商
- 售货员
- 汽车颜色
- 交易金额
如果您将这些信息存储在典型的关系数据库中,您将被迫编写类似这样的内容来检索三维汇总表:
***SELECT** **Model**, ALL, ALL, **SUM**(Sales)
**FROM** Sales
**WHERE** **Model** = 'Civic'
**GROUP** **BY** **Model**
**UNION**
**SELECT** **Model**, **Month**, ALL, **SUM**(Sales)
**FROM** Sales
**WHERE** **Model** = 'Civic'
**GROUP** **BY** **Model**, **Year**
**UNION**
**SELECT** **Model**, **Year**, Salesperson, **SUM**(Sales)
**FROM** Sales
**WHERE** **Model** = 'Civic'
**GROUP** **BY** **Model**, **Year**, Salesperson;*
一个三维卷需要 3 个这样的联合。这是可概括的:结果是 N 维上的聚合需要 N 个这样的联合。
你可能认为这已经很糟糕了,但这还不是最糟糕的例子。比方说,你想做一个交叉制表,或者 Excel power 用户所说的“数据透视表”。交叉制表的示例如下:

照片取自本文
交叉制表需要更复杂的联合和GROUP BY子句的组合。例如,六维交叉制表需要 64 个不同的GROUP BY操作符的 64 路联合来构建底层表示。在大多数关系数据库中,这会导致 64 次数据扫描、64 次排序或散列,以及非常长的等待时间。
商业智能从业者很早就意识到,对大型 OLAP 工作负载使用 SQL 数据库不是一个好主意。更糟糕的是,在过去,计算机并不是特别强大:例如,在 1995 年,1GB 的内存价格为 32,300 美元——对于我们今天认为理所当然的内存量来说,这是一个疯狂的价格!这意味着绝大多数业务用户不得不使用相对较小的内存来运行 BI 工作负载。因此,早期的 BI 实践者确定了一个通用的方法:从关系数据库中只获取你需要的数据,然后将它放入一个有效的内存数据结构中进行操作。
OLAP 魔方的崛起
进入 OLAP 立方体,也称为数据立方体。
OLAP 魔方源于计算机编程中的一个简单想法
OLAP 魔方源于编程中的一个简单想法:获取数据并将其放入所谓的“二维数组”中,也就是一个列表的列表。这里的自然进展是,您想要分析的维度越多,您使用的嵌套数组就越多:三维数组是列表的列表的列表,四维数组是列表的列表的列表,等等。因为嵌套数组存在于所有主要的编程语言中,所以将数据加载到这种数据结构中的想法对于早期 BI 系统的设计者来说是显而易见的。
但是,如果您想要对远远大于计算机可用内存的数据集进行分析,该怎么办呢?早期的 BI 系统决定做下一件合乎逻辑的事情:它们聚集然后缓存嵌套数组中的数据子集——偶尔将嵌套数组的部分持久存储到磁盘。今天,“OLAP 立方体”特指这些数据结构远远超过主机主内存大小的环境,例如数万亿字节的数据集和图像数据的时间序列。

OLAP 魔方的影响是深远的——并且改变了商业智能的实践直到今天。首先,几乎所有的分析都是在这样的立方体中进行的。这反过来意味着,每当需要新的报告或新的分析时,通常都必须创建新的多维数据集。
假设您想要运行一个按省份划分的汽车销售报告。如果您当前可用的多维数据集不包含省份信息,您必须要求数据工程师为您创建一个新的 OLAP 多维数据集,或者要求她修改现有的多维数据集以包含此类省份数据。
OLAP 立方体的使用也意味着数据团队必须管理复杂的管道来将数据从 SQL 数据库转换到这些立方体中。如果您正在处理大量的数据,这样的转换任务可能需要很长时间才能完成,因此一个常见的做法是在分析师开始工作之前运行所有的 ETL(提取-转换-加载)管道。这样,分析师就不需要等待他们的立方体加载最新的数据——他们可以让计算机在晚上处理数据,并在早上立即开始工作。当然,随着公司全球化,并在多个时区开设办事处,要求访问相同的分析系统,这种方法变得越来越有问题。(当你的夜晚是另一个办公室的早晨时,你如何在“夜晚”运行你的管道?)
以这种方式使用 OLAP 多维数据集还意味着 SQL 数据库和数据仓库必须以更容易创建多维数据集的方式进行组织。例如,如果你在过去的二十年里成为了一名数据分析师,那么你很有可能受过神秘艺术的训练,比如金博尔维度建模、T2、蒙氏实体关系建模、T4 数据仓库建模。这些花哨的名称只是组织数据仓库中的数据以满足企业分析需求的简单方法。
Kimball,Inmon 和他们的同事观察到,特定的访问模式发生在每个企业。他们还观察到,考虑到数据团队为报告创建新的多维数据集所花费的时间,草率的数据组织方法是一个糟糕的想法。最终,这些早期的实践者开发了可重复的方法,将业务报告需求转化为数据仓库设计——这种设计将使团队更容易以他们的 OLAP 立方体所需的格式提取他们所需的数据。
这些限制在过去四十年的大部分时间里塑造了数据团队的形式和功能。重要的是要理解,非常真实的技术限制导致了 OLAP 立方体的产生,而 OLAP 立方体的需求导致了我们今天认为理所当然的数据团队实践的出现。例如,我们:
- 维护复杂的 ETL 管道,以便对我们的数据建模。
- 雇佣一个庞大的数据工程师团队来维护这些复杂的管道。
- 根据 Kimball 或 Inmon 或 Data Vault 框架对数据进行建模,以便更容易地将数据提取和加载到多维数据集中。(即使我们已经脱离了多维数据集,我们仍然保持这些做法,以便将数据加载到分析和可视化工具中——不管它们是否建立在多维数据集之上。)
- 让大型数据工程师团队也维护第二组管道(从建模数据仓库到立方体)。
然而今天,导致创建数据立方体的许多约束已经有所松动。电脑更快。内存便宜。云起作用了。数据从业者开始意识到 OLAP 立方体自身也存在一些问题。
枯萎 OLAP 魔方
让我们暂时假设我们生活在一个内存廉价、计算能力唾手可得的世界。让我们假设在这个世界中,SQL 数据库足够强大,可以同时支持 OLTP 和 OLAP。这个世界会是什么样子?
当您可以简单地在现有的 SQL 数据库中编写查询时,为什么还要花费额外的步骤来构建和生成新的多维数据集呢?
首先,我们可能会停止使用 OLAP 立方体。这是显而易见的:当您可以简单地在现有的 SQL 数据库中编写查询时,为什么要费心去经历构建和生成新的多维数据集的额外步骤呢?如果您需要报告的数据可以盲目地从您的 OLTP 数据库复制到您的 OLAP 数据库,为什么还要费心维护一个复杂的管道呢?除了 SQL 之外,为什么还要费心培训您的分析师呢?
这听起来像是一件小事,但事实并非如此:我们已经从分析师那里听到了许多可怕的故事,他们不得不依赖数据工程师来构建多维数据集,并为每个新的报告需求建立管道。如果在这种情况下你是一名分析师,你会觉得无力在截止日期前完成任务。你的商业用户会阻止你;你会阻止你的数据工程师;您的数据工程师很可能正在努力应对数据基础架构的复杂性。这对谁都不好。最好完全避免复杂性。
第二,如果我们生活在另一个世界,那里计算成本低廉,内存充足……那么,我们将放弃严肃的数据建模工作。
这听起来很荒谬,除非你从基本原则的角度去思考。我们根据 Kimball 或 Inmon 等严格的框架对数据进行建模,因为我们必须定期为我们的分析构建 OLAP 立方体。从历史上看,这意味着一个严肃的模式设计时期。这也意味着,随着业务需求和数据源的变化,为了在我们的仓库中维护这种设计,我们需要做大量的繁忙工作。
但是如果您不再使用 OLAP 立方体进行分析,那么您就不再需要定期从数据仓库中提取数据。如果您不再需要定期从数据仓库中提取数据,那么就没有理由将您的数据仓库模式视为珍贵的东西。毕竟,如果您可以通过在您的数据仓库中创建新的“模型化”表或物化视图来“模型化”数据,那么当您需要它时,为什么还要做这些忙碌的工作呢?这种方法具有传统数据建模的所有功能优势,而没有设计和维护 Kimball 风格模式时的仪式或复杂性。
让我们讨论一个具体的例子:假设你认为你的模式是错误的。你是做什么的?在我们的另一个世界中,这个问题很容易解决:您可以简单地转储表格(或丢弃视图)并创建新的表格。由于您的报告工具直接连接到您的分析数据库,这导致了很少的中断:您不必重写一套复杂的管道或改变创建多维数据集的方式——因为您首先没有任何多维数据集要创建。**
一种新的范式出现了
好消息是这个平行宇宙不是平行宇宙。这就是我们今天生活的世界。
我们是怎么到这里的?据我所知,在过去的二十年里有三个突破——其中两个很容易理解。我们将首先处理这两个问题,然后详细探讨第三个问题。
第一个突破是摩尔定律的一个简单结果:计算和内存已经成为真正的商品,而且现在都便宜得离谱,并且很容易通过云获得。今天,任何持有有效信用卡的人都可以去 AWS 或谷歌云,几分钟内就有一个任意强大的服务器为他们运转起来。这一事实也适用于基于云的数据仓库——公司能够以几乎为零的固定成本存储和分析庞大的数据集。
第二个突破是,大多数现代的基于云的数据仓库都有所谓的大规模并行处理* (MPP)架构。MPP 数据库开发背后的核心观点实际上非常容易理解:如果您将查询分布在数百台甚至数千台机器上,您将不会受到单台计算机的计算能力和内存的限制,而是可以从根本上提高查询的性能。然后,这些机器将处理它们的查询部分,并将结果向上传递,以便聚合成最终结果。所有这些工作的结果是您获得了荒谬的性能改进:例如,Google 的 BigQuery 能够在没有索引的情况下对 3 . 14 亿行执行完整的正则表达式匹配,并在 10 秒内返回结果( source )。*

说“啊,MPP 数据库是一个东西”很容易,但是至少有 40 年的工作才使它成为今天的现实。例如,在 1985 年,数据库传奇人物迈克尔·斯通布雷克发表了一篇名为 无共享的案例 的论文——认为 MPP 数据仓库的最佳架构是处理器之间不共享任何东西的架构。几位研究者反驳了这一观点,用 无事生非 于 1996 年发表;我的观点不是说斯通布莱克是对的,他的批评者是错的;要指出的是,在开始时,即使是像“分布式数据仓库是否应该让它的计算机共享内存或存储?”是一个需要调查的公开问题。(如果你好奇的话:这个问题的答案是“基本上没有”)。
第三个突破是柱状数据仓库的发展和普及。这个概念上的突破实际上是三个中更重要的,它解释了为什么 OLAP 工作负载可以从多维数据集转移回数据库。如果我们想了解商业智能的未来,我们应该理解这是为什么。
典型的关系数据库以行的形式存储数据。例如,交易的单个行将包含字段date、customer、price、product_sku等等。但是,列式数据库将这些字段分别存储在不同的列中。如下图所示(摘自 Harizopoulos、Abadi 和 Boncz 的 2009 年演讲):

摘自 Harizopoulos、Abadi 和 Boncz 于 2009 年发表的演讲
虽然 OLAP 多维数据集要求您将感兴趣的维度的子集加载到多维数据集中,但是列数据库允许您以同样好的性能水平执行类似的 OLAP 类型的工作负载,而不需要提取和构建新的多维数据集。换句话说,这是一个非常适合 OLAP 工作负载的 SQL 数据库。
列数据库是如何实现如此高的性能的?事实证明,将数据存储在列中有三个主要好处:
- 列型数据库具有更高的读取效率。如果您正在运行一个类似“给我过去 5 年所有交易的平均价格”的查询,一个关系数据库将不得不加载前 5 年的所有行,即使它只是想聚集价格字段;列式数据库只需检查一列——价格列。这意味着列数据库只需筛选总数据集大小的一部分。
- 列数据库也比基于行的关系数据库压缩得更好。事实证明,当你将相似的数据存储在一起时,你可以比存储完全不同的信息更好地压缩数据。(在信息论中,这就是所谓的“低熵”)。提醒一下,列数据库存储数据的列——意味着具有相同类型和相似值的值。与行数据相比,这要容易压缩得多,即使在读取值时会以一些计算(某些操作中的解压缩)为代价。但总的来说,这种压缩意味着当您运行聚合查询时,可以将更多的数据加载到内存中,从而导致更快的整体查询。
- 最后一个好处是,列数据库中的压缩和密集打包释放了空间,这些空间可用于对列中的数据进行排序和索引。换句话说,列数据库具有更高的排序和索引效率,这更多是因为强压缩带来了一些剩余空间。事实上,这也是互利的:研究列数据库的研究人员指出,排序的数据比未排序的数据压缩得更好,因为排序降低了熵。
所有这些属性的最终结果是,列数据库为您提供了类似 OLAP 立方体的性能,而没有显式设计(和构建)的痛苦!)立方体。这意味着您可以在您的数据仓库中执行您需要的一切,并跳过多维数据集维护带来的繁重工作。**
但是,如果有一个缺点,那就是列数据库中的更新性能非常糟糕(为了更新一个“行”,您必须访问每一列);因此,许多现代列数据库限制了您在存储数据后更新数据的能力。例如,BigQuery 根本不允许您更新数据——您只能将新数据写入仓库,而不能编辑旧数据。(更新:最初的 Dremel 论文解释说 BigQuery 有一个仅追加的结构;从 2016 年起不再如此)。
结论
所有这些发展的结果是什么?我之前在撰写《另一个世界》时所做的两个预测正在慢慢成为现实:较小的公司不太可能考虑面向数据立方体的工具或工作负载,严格的维度建模随着时间的推移已经变得不那么重要。更重要的是,亚马逊、Airbnb、优步和谷歌等精通技术的公司已经完全拒绝了数据立方体范式;这些事件和更多的事件告诉我,我们将看到这两种趋势在未来十年蔓延到企业中。
然而,我们才刚刚开始这种变化。未来可能就在眼前,但分布不均。这是意料之中的:MPP 列数据库只出现了十年左右(BigQuery 于 2010 年推出,Redshift 于 2012 年推出),我们只看到利用这种新范式的工具(如 Looker、dbt 和 Holistics)在前十年中期出现。一切都还为时过早——在大型企业抛弃他们遗留的、受立方体影响的系统并转向新系统之前,我们还有很长的路要走。
如果您是 BI 服务提供商,您可能会对这些趋势感兴趣,但让我们稍微关注一下这些趋势对您职业生涯的影响。如果你是一名数据专业人士,而 OLAP 立方体正在衰落,这对你意味着什么?
在我看来,你必须滑向冰球所在的地方:
- 主 SQL 大多数 MPP 列数据库已经将 SQL 作为事实上的查询标准。(更多关于这个这里)。
- 对那些深陷 OLAP 魔方工作流程的公司持怀疑态度。(在这里学习如何做这个)。
- 让自己熟悉列数据库时代的建模技术(Chartio 可能是我见过的第一家有这方面指南的公司;阅读此处的…但要明白这相对较新,最佳实践可能仍在变化。
- 尽可能使用 ELT(相对于 ETL);这是新范式的结果。
- 研究 Kimball、Inmon 和 data vault 方法,但着眼于在新范式中的应用。了解他们每种方法的局限性。
我开始这篇文章时,重点关注 OLAP 魔方,以此来理解商业智能历史上的一项核心技术。但事实证明,立方体的发明对我们在这个行业中看到的几乎所有东西都有影响。注意它的衰落:如果你没有从这件作品中学到什么,就让它这样吧:OLAP 魔方的兴衰对你的职业生涯比你最初想象的更重要。
跟进: 我们已经发布了一个跟进帖子,标题为: OLAP!= OLAP 魔方 。
来源
- https://en.wikipedia.org/wiki/Data_cube
- 金博尔、罗斯、 数据仓库工具包
- 大数据和 Hadoop 时代的维度建模和金博尔数据集市
- 数据立方体:概括分组依据、交叉表和小计的关系聚集运算符 (Gray,Bosworth,Lyaman,Pirahesh,1997)
- *Cuzzocrea A .(2010)*OLAP 数据立方体压缩技术:十年历史 。参加人:Kim T,Lee Y,Kang BH。,lzak d .(eds)未来一代信息技术。FGIT 2010。计算机科学讲义,第 6485 卷。施普林格、柏林、海德堡
- OLAP:过去现在未来?
- 一事无成 ,,,无事生非,,(诺曼、祖雷克、塔尼西)**
- 关于 big query:Thedremmel paperbig query 中计算与存储的分离big query 下的一个内幕请看 BigQuery 白皮书。**
- 并行数据库系统:未来的高性能数据库处理 (德威特&格雷,1992)
- (Harizopoulos,Abadi and Boncz,2009)****
Airbnb 在西雅图的崛起:数据科学方法

图片来自 wikipedia.org
Airbnb 是世界上大多数主要城市中最常用的找住处的方法之一。它极大地改变了寻找短期甚至长期住宿的传统方式。
西雅图是美国的主要城市之一,因此也是 Airbnb 用户的热门地点之一。仅在 2016 年,西雅图就完成了近百万份预订。
在这篇文章中,我将对西雅图的 Airbnb 数据集进行深入分析。该分析仅通过 Python 3 执行,用于执行该分析的代码可以在 my Github 中找到。通过分析数据,我想回答四个不同的问题:
- Airbnb 在西雅图的这些年是如何增长的?
- 与超级主持人最相关的特征是什么?
- 主持人如何在不花钱的情况下增加自己成为超级主持人的几率?
- 一年中什么时候去西雅图最便宜?
描述性分析
本次分析使用了两个数据集:
- 列表-西雅图可用列表的详细描述,从 2008 年开始。该表包含 3818 个列表和 98 个特征,包括连续特征(如价格、纬度、经度等。),离散的(比如主机响应时间,床位数,卫生间数等。)和分类的(例如,如果主机是“超级主机”,邻居,这是主机验证,等等。).
- 日历—提供列表 ID、日期(如果列表在该特定日期被预订)以及预订价格的表格。该数据集包括近 100 万个不同的预订。
下表显示了经过一些小的预处理后的列表数据的快速描述。

从 2008 年开始在西雅图可用的列表的描述性分析。
数据显示最低价格为 22 美元,最高价格为 1000 美元。还有一个离谱的5000 美金的保证金。此外,我们看到,平均而言,主机响应率相当高(平均值为 95%)。审查分数等级通常也很高,但是,最低值是 40(满分为 100)。有趣的是,有 0(零!!)卫生间。当然,这可能是由于来自主机的错误条目。
有几种不同类型的财产,从船和阁楼到帐篷(!).以下是不同房产数量的大致情况,以及每种房产的平均价格。有趣的是,普通的树屋 比阁楼还要大。!).此外,绝大多数(约 90%)房源要么是房子,要么是公寓。

Airbnb 在西雅图暴涨
下面我制作了一张 GIF 图,展示了从 2008 年到 2015 年 Airbnb 房源数量的增长。很明显,大部分房源都在西雅图的中心区域。
现在用颜色区分各个街区,我们可以看到一些街区的房源非常密集,而另一些则很稀疏。这可能是由于几个不同的原因,例如它是否靠近市中心、生活成本、可居住的地方(例如工业区没有列表)。

与超级主持人最相关的特征是什么?
为了评估对成为超级主机的因子分解影响最大的特征,进行了两种类型的数据分析:使用 Tensorflow 库的深度神经网络和使用 scikit-learn 库的逻辑回归。长话短说,通过将数据应用于神经网络,我能够以大约 80%的准确度建模、验证和测试模型,而通过简单的逻辑回归,我能够达到大约 78%的准确度。
有许多因素会影响这种相对较低的准确性,但肯定的是,列表的小数据集(预处理后不到 3000 个列表)不允许更好的准确性。尽管如此,该模型确实给了我们一个对影响超级主机选择的主要特征的良好估计,这些特征可以在下表中看到。

从表中可以清楚地看出,最重要的特征是 1)评审分数评级;2)经核实的审查和 3)每月审查。所有这些都是基于用户的,意味着用户(列表的客人)、列表(即房屋、公寓、阁楼等)和主人之间的交互。这些都是相当明显的,但是,重要的是要了解他们的重量差异。例如,有经过验证的评论比经过验证的电话号码重要两倍。
此外,如果最近的审查是最近完成的,这也是一个加分。如果主持人住在西雅图,这也增加了超级主持人的价值。令人惊讶的是,如果主持人有严格的取消政策,这也被视为会导致成为超级主持人的事情。
现在问题来了:主持人如何在不花钱的情况下增加自己成为超级主持人的几率?
从前面描述的逻辑回归中,我可以得出一些关于增加成为超级主持人的概率而不需要额外花钱的结论:
- 尽可能快地回答客人的问题:结果显示主人回答客人的问题越快越好。
- 不要对潜在顾客的问题置之不理。
- 有严格的取消政策。
- 如果可能的话,试着列出你所在城市的房产。
- 进行尽可能多的验证,比如你的电话、电子邮件、身份等。经 Airbnb 核实。
- 尽你所能描述你的财产。
一年中什么时候去西雅图最便宜?
我使用之前描述的日历数据集来分析一年中去西雅图旅游最便宜的时间段。下图总结了数据,显示了每天的平均价格与一年中一周的函数关系。

从 1 月 1 日开始是第 0 周,很明显,冬天是一年中在 Airbnb 住宿花费最少的时候。但是,也很冷。😦
另一点是,周末全年都比较贵,与工作日的平均差价约为每天 7 美元。
结论
Airbnb 在西雅图的市场增长迅猛。这里显示的分析显示了西雅图上市的一些趋势。此外,它还描绘了一些技巧,以增加成为超级主持人的机会,而不花任何钱。我以一些一年中游览西雅图的最佳时间的评论结束了这篇文章。
我目前正在寻求更换运营商,试图进入数据科学市场。请随时查看我在 https://www.linkedin.com/in/henrique-neves-bez-50a64157/ T2 的 LinkedIn。
承认
我要感谢 Simone Centellegher,他在他的 Github 上提供了一种绘制条形图的美丽方式,我通常觉得这很枯燥。链接将于 2020 年 1 月 27 日开通。
无代码知识图的兴起
NoCode 知识图如何将数据科学的精华引入教育、金融、商业等领域

这个故事最初发表于inside bigdata。
知识图表是 21 世纪 20 年代最重要的技术之一。Gartner 预测图形处理和图形数据库的应用将在未来几年以每年 100%的速度增长。
在过去的二十年中,这项技术主要被工程师和本体学家采用,因此大多数知识图工具是为具有高级编程技能的用户设计的。
1900 年,40%的人口从事农业。
今天是 1%。编码是现代的“农业”,因为只有 0.5%的世界人口知道如何编码。
NoCode 给各行各业的人才带来平等的机会。
让我们想象一下,如果世界上大多数人能够利用尖端技术来解决最重要的问题,这会产生什么影响。
用无代码方法为顶尖人才赋能
工程和编程是重要的技能,但只有在正确的环境下,并且只有对愿意投入必要的时间和资源的人来说。这同样适用于其他许多技能,如商业、医学或艺术。专注于编码夸大了找到“正确”方法的重要性,而不是理解问题和解决方案的途径。
我们生活在一个竞争异常激烈的世界,那些能够快速采用顶级技术的人会走在时代的前面。无代码方法使拥有顶级技能的用户能够快速采用技术。
知识图表是一个很好的例子。通过一种无代码的方法,他们将数据科学世界的精华带到了医学、金融、商业、教育和艺术领域,使任何人都能够从孤立的数据源中生成并可视化独特的见解。

通过知识库开发的知识图应用的知识图
行动中的无代码知识图
如今,大多数组织通过电子邮件和存储在共享驱动器上的电子表格就关键业务流程进行协作,有时存储在云上,通常存储在员工的笔记本电脑上。不同的部门倾向于使用不同的技术。这通常会造成信息孤岛,使他们难以共享通用信息。客户、供应商、会计、运营、销售和营销以及产品数据通常跨一系列平台进行维护。

通过 Kgbase 为耐克、赫尔利和匡威开发供应链地图
有了无代码知识图,公司的所有部门都可以使用相同的“语言”来连接销售、营销和产品数据集之间的点。合作者可以贡献、可视化和查询他们的数据,消除信息孤岛并增强战略决策。
同样,知识图表被用作语义搜索引擎,激发新的想法,提高教育和研究的学习能力。无代码知识图使用户能够跨概念、关系和领域直观地探索数据,从可能被忽略的资源中学习。

2020 年 3 月 6 日,在纽约市美国自然历史博物馆,STEM Brown 学者的无代码知识图表天体物理学课程
最后,简单地将信息存储在数据仓库中会限制其有用性和价值。特别是,从多个电子表格中汇总数据并得出有意义的信息几乎是不可能的。

美国自然历史博物馆的银河数据集
使用无代码知识图连接数据源很容易,任何使用 csv 文件的人都可以导入他们的数据,定义实体之间的关系,并创建他们自己的知识图。
知识图谱成为主流
知识图表因其在高级搜索引擎和推荐系统开发中的战略作用而闻名,但它们在金融、商业、研究和教育方面也有无数有价值的应用。
随着知识图的发展势头越来越大,NoCode 方法使得这项技术成为主流。由于大多数数据集是孤立的,产生了信息过载的挑战,无代码知识图是在大型数据集上协作的游戏规则改变者,无需大量耗时的培训。
机器学习的数学路线图

除非另有说明,图片由作者提供
从头开始理解神经网络的内部运作
了解机器学习算法背后的数学是一种超能力。如果您曾经为现实生活中的问题构建过模型,您可能会体验到,如果您想要超越基线性能,熟悉细节会大有帮助。当你想突破艺术的极限时,尤其如此。
然而,这些知识大部分都隐藏在层层高等数学的背后。理解像随机梯度下降这样的方法似乎很困难,因为它是建立在多变量微积分和概率论之上的。
不过,有了适当的基础,大多数想法都可以被视为相当自然。如果你是一个初学者,不一定受过高等数学的正规教育,为自己创建一个课程是很难的。在这篇文章中,我的目标是提出一个路线图,带你从绝对零度到深入理解神经网络如何工作。
为了简单起见,我们的目标不是涵盖所有内容。相反,我们将专注于获得我们的方向。这样,如果需要的话,你将能够毫无困难地学习其他主题。
与其一口气读完,我建议你把这篇文章作为学习的参考点。深入介绍一个概念,然后检查路线图,继续前进。我坚信这是最好的学习方式:我给你指路,但你必须走下去。
基本面
大多数机器学习建立在三个支柱之上:线性代数、微积分和概率论。因为最后一个建立在前两个的基础上,所以我们应该从它们开始。微积分和线性代数可以独立学习,就像标准课程中通常的情况一样。

结石
微积分是研究函数的微分和积分的学问。本质上,神经网络是一个可微函数,所以微积分将是训练神经网络的基本工具,正如我们将看到的。
为了熟悉这些概念,你应该把事情简单化,第一次学习单个变量的函数。根据定义,函数的导数由下式定义

其中给定的 h 的比值是点 (x,f(x)) 和 (x+h,f(x+h)) 之间的直线斜率。
在极限情况下,这基本上是点 x 处切线的斜率。下图说明了这个概念。

可视化函数的导数
微分可以用来优化函数:导数在局部极大值或极小值处为零。(然而,在另一个方向上却不是这样;在 0 处见 f(x) = x 。)导数为零的点称为临界点。临界点是最小值还是最大值可以通过查看二阶导数来决定:

关于差异化有几个基本规则,但可能最重要的是所谓的链式规则:

这告诉我们如何计算复合函数的导数。
积分通常被称为微分的逆运算。这是真的,因为

这适用于任何可积函数 f(x) 。函数的积分也可以认为是曲线下的带符号面积。举个例子,

因为当函数为负时,那里的面积也有一个负号。

-π和π之间正弦曲线下的有符号面积
积分本身在理解期望值的概念中起作用。例如,像熵和 Kullback-Leibler 散度这样的量是用积分来定义的。
深造

线性代数
正如我提到的,神经网络本质上是使用微积分工具训练的函数。然而,它们是用类似矩阵乘法的线性代数概念来描述的。
线性代数是一个庞大的学科,有许多机器学习的基本方面,所以这将是一个重要的部分。
向量空间
为了更好地理解线性代数,我建议从向量空间开始。我们最好先讨论一个特例。你可以把平面上的每个点想象成一个元组

这些基本上是从零指向 (x₁,x₂) 的向量。您可以将这些向量相加,并与标量相乘:

这是向量空间的原型模型。一般来说,一组向量 V 是实数上的向量空间,如果你可以将向量加在一起并将向量与实数相乘,则以下性质成立:

不要慌!我知道这看起来很可怕(至少在我还是数学专业的大一学生时是这样),但事实并非如此。这些只是保证了向量可以像你期望的那样相加和缩放。当考虑向量空间时,如果你把它们想象成

赋范空间
如果你觉得你对向量空间有很好的理解,下一步应该是理解如何测量向量的大小。默认情况下,向量空间本身没有为此提供工具。在飞机上你会怎么做?你可能已经知道,在那里,我们有

这是一个规范的特例。一般来说,如果存在函数,向量空间 V 就是赋范的

叫做 norm

这可能有点吓人,但这是一个简单而重要的概念。有很多规范,但最重要的是 p-norm 家族

(用 p = 2 我们得到上面提到的特例)和上确界范数

有时,像对于 p = 2 ,范数来自所谓的内积,这是一个双线性函数

到这样的程度

有内积的向量空间叫做内积空间。一个例子是经典的欧几里得乘积

每一个内积都可以通过

当两个向量的内积为零时,我们说这两个向量彼此正交。(尽量在飞机上拿出一些具体的例子,更深入的理解概念。)
基和正交/标准正交基
虽然向量空间是无限的(在我们的例子中),但你可以找到一个有限的向量集,它可以用来表示空间中的所有向量。例如,在飞机上,我们有

在哪里

这是基和标准正交基的特例。
一般来说,基是向量的最小集合

使得它们的线性组合跨越向量空间:

任何向量空间都有一个基。(它可能不是一个有限集,但我们现在不应该关心这个。)毫无疑问,当谈到线性空间时,基大大简化了事情。
当一个基中的向量相互正交时,我们称之为正交基。如果一个正交基的每个基向量的范数是 1,我们说它是正交的。
线性变换
与向量空间相关的关键对象之一是线性变换。如果你以前见过神经网络,你会知道基本的构建模块之一是形式的层

其中 A 是矩阵,b 和 x 是向量, σ 是 sigmoid 函数。(或者任何激活功能,真的。)嗯,部分 Ax 是线性变换。一般来说,该功能

是向量空间 V 和 W 之间的线性变换

适用于所有的 x,y 中的 V ,以及所有的 a 实数。
举一个具体的例子,在平面上绕原点的旋转是线性变换。
毫无疑问,关于线性变换最重要的事实是,它们可以用矩阵来表示,这一点你会在接下来的学习中看到。
矩阵及其运算
如果线性变换是清楚的,你可以转向矩阵的研究。(线性代数课程往往从矩阵开始,但我会推荐这样做,原因稍后解释。)
矩阵最重要的运算是矩阵乘积。一般来说,如果 A 和 B 是由下式定义的矩阵

那么他们的产品可以通过

这似乎很难理解,但实际上很简单。请看下图,演示了如何计算乘积的第 2 行第 1 列中的元素。

矩阵乘法之所以这样定义,是因为矩阵表示向量空间之间的线性变换。矩阵乘法是线性变换的合成。
如果你想了解更多这方面的内容,这里有一篇很棒的文章《走向数据科学》,详细解释了一些事情。
线性代数是机器学习的基石之一。这比你想象的更直观
towardsdatascience.com](/why-is-linear-algebra-taught-so-badly-5c215710ca2c)
决定因素
在我看来,行列式无疑是线性代数中最难掌握的概念之一。根据你的学习资源,它通常由递归定义或者通过所有排列迭代的和来定义。如果没有丰富的数学经验,他们中没有一个是好对付的。
要理解这个概念,请观看下面的视频。相信我,这是魔法。
综上所述,矩阵的行列式描述了一个物体的体积在对应的线性变换下是如何缩放的。如果变换改变了方向,行列式的符号是负的。
你最终需要理解如何计算行列式,但我现在不担心这个。
特征值、特征向量和矩阵分解
标准的第一线性代数课程通常以特征值/特征向量和一些特殊的矩阵分解如奇异值分解结束。
假设我们有一个矩阵一个。数字 λ 是 A 的特征值,如果有一个向量 x (称为特征向量)使得

保持。换句话说,由 A 表示的线性变换是由 λ 对矢量 x 的缩放。这个概念在线性代数中起着重要的作用。(实际上在广泛使用线性代数的每个领域都是如此。)
至此,您已经准备好熟悉一些矩阵分解。如果你想一想,从计算的角度来看,什么类型的矩阵是最好的?对角矩阵!如果一个线性变换有一个对角矩阵,计算它在任意向量上的值是很简单的。

大多数特殊形式旨在将矩阵 A 分解成矩阵的乘积,其中最好至少有一个是对角矩阵。奇异值分解,简称 SVD,是最著名的一种分解,它指出存在特殊矩阵 U 、 V、和对角矩阵σ,使得

保持。( U 和 V 是所谓的酉矩阵,这里我不做定义,知道它是一个特殊的矩阵族就够了。)
SVD 也用于执行主成分分析,这是最简单也是最著名的降维方法之一。
深造
线性代数可以用许多方法来教。我在这里概述的道路是受谢尔登·埃克斯勒的教科书《线性代数做对了》的启发。对于在线讲座,我推荐麻省理工学院开放式课程中的线性代数课程,这是一个很好的资源。
如果一门课程可能太多,有很好的文章,例如,下面的。
它是如何工作的,在哪里使用,如何更快地学习它。
towardsdatascience.com](/mathematics-for-ai-linear-algebra-and-how-to-understand-it-better-63b430999069) 
多元微积分
这是线性代数和微积分结合的部分,为训练神经网络的主要工具奠定了基础:梯度下降。从数学上讲,神经网络只是多个变量的函数。(虽然,变量的数量可以以百万计。)
类似于单变量微积分,这里的两个主要话题是微分和积分。假设我们有一个函数

将向量映射到实数。在二维中(即对于 n = 2 ),你可以把它的情节想象成一个曲面。(由于人类看不到高于三个维度的东西,所以很难想象具有两个以上实变量的函数。)

二元函数图。
多变量微分
在单变量中,导数是切线的斜率。你如何定义这里的切线?曲面上的一个点有几条切线,而不只是一条。但是有两条特殊的切线:一条平行于 x-z 平面,另一条平行于 y-z 平面。它们的斜率由偏导数决定,定义如下

也就是说,你对除了一个变量之外的所有变量求导。(形式定义对于≥ 3 个变量是相同的,只是符号更复杂。)
这些特殊方向的切线横跨切面。

切面。
梯度
还有另一个特殊的方向:梯度,它是由定义的向量

梯度永远指向涨幅最大的方向!因此,如果你在这个方向上迈出一小步,你的提升将是你可以选择的所有其他方向中最大的。这就是梯度下降的基本思想,这是一种最大化函数的算法。其步骤如下。
- 计算你目前所在的点 x₀ 的坡度。
- 向坡度方向迈一小步,到达点 x₁ 。(步长称为学习率。)
- 回到步骤 1。并且重复该过程直到收敛。
当然,这个基本算法有几个缺陷,这些年来对它进行了几次改进。现代基于梯度下降的优化器采用了许多技巧,如自适应步长、动量和其他方法,我们在这里不打算详述。
在实践中计算梯度是困难的。功能通常由其他功能的组合来描述,例如我们熟悉的线性层

其中 A 为矩阵, b 和 x 为向量, σ 为 sigmoid 函数。(当然,可以有其他激活,但是为了简单起见,我们将坚持这样做。)你会怎么计算这个梯度?在这一点上,甚至不清楚如何定义像这样的向量-向量函数的梯度,所以我们来讨论一下!一项功能

总是可以写成向量标量函数,比如

g 的梯度由矩阵定义,其第 k 行是第 k 个分量的梯度。也就是说,

这个矩阵叫做 g 的全导数。
在我们的例子中

事情变得有点复杂,因为它由两个功能组成:

和

通过应用单变量 sigmoid 分量来定义。函数 l 可以进一步分解为从 n 维向量空间映射到实数空间的 m 个函数:

在哪里

如果你计算总导数,你会看到

这就是多元函数的链式法则的全部一般性。没有它,就没有简单的方法来计算神经网络的梯度,神经网络最终是许多函数的组合。
高阶导数
类似于单变量的情况,梯度和导数在确定空间中的给定点是局部最小值还是最大值方面起作用。(或者都不是。)提供一个具体的例子,训练神经网络等价于最小化参数训练数据的损失函数。这完全是为了找到达到最小值的最佳参数配置 w :

在哪里

分别是神经网络和损失函数。
对于一般的可微向量标量函数,比如说 n 个变量,有 n 个二阶导数,形成海森矩阵

在多变量中,黑森行列式的作用是二阶导数。同样,它可以用来判断一个临界点(即所有导数都为零的地方)是最小值、最大值还是仅仅是一个鞍点。
继续教育
关于多变量微积分有很多很棒的在线课程。我有两个具体建议:
现在我们准备学习最后一门课程:概率论!

概率论
概率论是对概率的精确数学研究,是所有科学领域的基础。
抛开确切的定义,让我们思考一下概率代表什么。比方说,我掷一枚硬币,有 50%的机会(或 0.5%的可能性)是正面。重复实验 10 次后,我得到了多少个头?
如果你回答了 5,那你就错了。正面为 0.5 的概率并不能保证每一秒都是正面。相反,这意味着如果你重复实验 n 次其中 n 是一个非常大的数,人头数将非常接近 n/2 。
为了更好地理解概率,我推荐下面这篇我不久前写的文章,它提供了一个简洁但数学上正确的概念。
测度论导论
towardsdatascience.com](/the-mathematical-foundations-of-probability-beb8d8426651)
除了基础知识,还有一些高级的东西你需要了解,首先也是最重要的,期望值和熵。
预期值
假设你和你的朋友一起玩游戏。你掷一个经典的六面骰子,如果结果是 1 或 2,你就赢了 300 美元。否则,你会损失 200 英镑。如果你玩这个游戏的时间足够长,你每回合的平均收入是多少?你应该玩这个游戏吗?
嗯,你以 1/3 的概率赢了 100 块,以 2/3 的概率输了 200 块。也就是说,如果 X 是编码掷骰子结果的随机变量,那么

这是期望值,也就是长期来看,你每一轮得到的平均金额。既然这个是负的,那你就亏了,所以千万不要玩这个游戏。
一般来说,期望值由下式定义

对于离散随机变量和

对于实值连续随机变量。
在机器学习中,用于训练神经网络的损失函数是以某种方式的期望值。
大数定律
人们常常错误地将某些现象归结于大数定律。例如,正处于连败中的赌徒认为他们应该很快会赢,因为 T4 大数定律。这是完全错误的。让我们看看这到底是什么!
假如

是代表相同实验的独立重复的随机变量。(比如说,掷骰子或掷硬币。)
本质上,大数定律表明

这是长期结果的平均值,等于期望值。
一种解释是,如果一个随机事件重复了足够多的次数,个别结果可能并不重要。所以,如果你在一个赌场里玩一个期望值为负的游戏(他们都是这样),偶尔赢一次也没关系。大数法则暗示你会赔钱。
为了领先一点,LLN 将是随机梯度下降的关键。
信息论
让我们玩一个游戏。我想到了一个 1 到 1024 之间的数字,你要猜。你可以提问,但你的目标是用尽可能少的问题。你需要多少?
如果你聪明的话,你会用你的问题来表演二分搜索法。首先你可能会问:数字是在 1 到 512 之间吗?这样,你就把搜索空间缩小了一半。使用这个策略,你可以在

问题。
但是如果我在选号的时候没有用均匀分布呢?例如,我可以使用泊松分布。

泊松分布的概率质量函数。来源:维基百科
这里,您可能需要更少的问题,因为您知道分布倾向于集中在特定的点上。(这取决于参数。)
在极端情况下,当分布集中在一个数字上时,你需要个零题才能猜对。通常,问题的数量取决于分布所携带的信息。均匀分布包含的信息量最少,而奇异分布则是纯信息。
熵是对此进行量化的一种方式。它的定义是

对于离散随机变量和

对于连续的,实值的。(对数的底数通常是 2、 e ,或者 10,但这其实并不重要。)
如果你以前使用过分类模型,你可能会遇到交叉熵损失,定义如下

其中 P 是基本事实(集中于单个类别的分布),而 hatted 版本代表类别预测。这衡量了预测与事实相比有多少“信息”。当预测匹配时,交叉熵损失为零。
另一个常用的量是 Kullback-Leibler 散度,定义如下

其中 P 和 Q 是两个概率分布。这实质上是交叉熵减去熵,可以认为是量化了两种分布的不同程度。例如,当训练生成性对抗网络时,这是有用的。最小化 Kullback-Leibler 散度保证了两个分布是相似的。
继续教育
在这里,我给你推荐两本书:
- Christopher Bishop 的《模式识别与机器学习》,
- Trevor Hastie、Robert Tibshirani 和 Jerome Friedman 的《统计学习的要素》。
这是两本基础教材,它们教给你的远不止概率论。他们都超越了基础,但相应的章节提供了一个很好的介绍。
超越数学基础
至此,我们回顾了理解神经网络所必需的数学。现在,你已经准备好了有趣的部分:机器学习!
要真正理解神经网络是如何工作的,还得学习一些最优化和数理统计。这些主题建立在我们设定的基础之上。我不会详细介绍,因为这超出了本文的范围,但是我已经准备了一个学习路线图来指导您。

如果你想了解更多关于这些话题的内容,可以看看我下面的一些文章!
超越函数拟合的视角
towardsdatascience.com](/the-statistical-foundations-of-machine-learning-973c356a95f) [## 如何在 NumPy 中构建 DIY 深度学习框架
通过从头开始构建神经网络来理解神经网络的细节
towardsdatascience.com](/how-to-build-a-diy-deep-learning-framework-in-numpy-59b5b618f9b7) [## 深度学习的数学优化
关于如何最小化具有数百万个变量的函数的简要指南
towardsdatascience.com](/the-mathematics-of-optimization-for-deep-learning-11af2b1fda30)
如果你喜欢把机器学习概念拆开,理解是什么让它们运转,我们有很多共同点。看看我的博客,我经常在那里发表这样的技术文章!
机器学习算法对缺失值或异常值的鲁棒性
让我们来探索经典机器学习算法在面对异常数据时的表现,以及标准插补方法提供的好处。

Gabriel Crismariu 在 Unsplash 上拍摄的照片
缺少值,这是每个数据科学家第一次探索数据集时的诅咒!
是的,现实生活通常与教程相去甚远,在教程中,每一列都是干净的,充满了格式正确的值,有良好的文档记录,离群值很明显,相互关系触手可及。
缺失值:NaN,null,empty," ",凡是你能想到的!从两个角度来看,它们确实是建模过程中的一个关键问题:
- 从纯数学的角度来看,大多数算法依赖于线性代数,向量或矩阵中的一个缺失值会使整个计算过程崩溃。
让我们用一个简单的向量乘法来想象这种效果:

线性代数…有或没有缺失值
- 从建模的角度来看,缺失的值代表现实的一部分,它是不可访问的、隐藏的。想象一下,作为一名调查人员,得到经过消毒的文件:你知道你不是什么都知道!

来源:维基百科(模糊缩小)

至少,你什么都不知道…
在工业上看起来怎么样?
从我的经验来看,诀窍是坏了的传感器不会把 NaNs 送回给你;那太容易被发现了!更有可能的是,您将获得零、有偏差的或随机的值。很棒不是吗!?
有一段时间,我担心在我处理的数据中加入异常值。当你探索 5000 万行 x 300 个特征时,这比在下面的图片中找到长颈鹿或豹子要困难得多:


在某个时候,我决定进行自己的测试,并评估我得到的异常值的比率(总是小于 1%,大多数低于 0.5%),最重要的是,这种现象如何影响我正在使用的算法的性能。
该测试背后的原理非常简单,与通常的过程相反:
正常情况下,一个理智的数据科学家会试图估算缺失或异常值,以提高其模型的准确性;我选择了反过来做!
首先,我会根据一个完美的数据集来评估经典机器学习算法*的性能。而且,我会逐步增加引入训练集的异常值的比率,以测量准确性的变化。
(* Lasso、KNeighbors、随机森林和梯度增强树回归变量)
并且,当我处于“基准模式”时,我决定反转(再次!)的过程,并比较标准插补技术带来的好处:
- 简单估算器:缺失值将由一个常量值填充,该常量值是预先确定的或从特征的统计数据(平均值、中值、众数)中得出。
注意:如果你对数据集的正态性没有信心,并且可能存在一些重要的异常值,我建议使用中位数而不是平均值,因为平均值对异常值不太敏感(见下面的例子)。

- 迭代估算器:每个要素都将被视为数据集中所有其他要素的函数。然后回归器将根据所有其他特征来确定缺失值。这依赖于变量之间全局一致性的假设。

- KNNImputer :该插补算法基于 k 近邻法来识别数据集中的不同聚类,并在需要时使用聚类的特征来插补缺失值。
[## 6.4.缺失值的插补-sci kit-学习 0.23.1 文件
由于各种原因,许多真实世界的数据集包含缺失值,通常编码为空白、NaNs 或其他…
scikit-learn.org](https://scikit-learn.org/stable/modules/impute.html) 
渴望了解更多信息?让我们开始吧!
像往常一样,我们将从创建一个虚拟的“工业”数据集开始。传感器、探头、实验室测量值通常不以 0 为中心,因此我们将增加它们的值以符合现实情况:在下面的示例中,范围在 10 和 100 之间:

数据帧样本

数据框架的基本统计
我们随机定义训练集和测试集,并记录算法在测试集中的初始性能。

我们可以清楚地看到算法之间的初始性能差异
一旦定义了计算方法,我们将并行运行插补方法,以获得最佳的比较结果。每个循环如下:
- 我们将原始的 X_train 数据帧复制到 X_train_NaN 中,为其估算一个定义的 NaN 比率
- 我们首先将所有 NaN 替换为 0,并创建最坏的情况
- 我们用这个 X_train_NaN 数据集训练每个模型,并根据原始的 X_test 测量其性能。这将提供异常值对算法的影响
- 最后,我们用标准插补技术(平均值、迭代或 KNN 方法)替换所有的 nan,并再次检查回归变量的性能。

一张 GIF 抵得上千言万语:-)
当整个过程结束后,我们可以比较每个模型的性能:
- 使用初始和清洁的 X_train 套件进行训练
- 用越来越多的0进行训练
- 接受过标准插补技术的培训
下图显示了初始性能和以 0 的递增比率训练的模型之间的差异:

我们可以立即看到,一旦引入第一个异常值,Lasso 的性能就完全崩溃了:0,5%导致性能下降 75%。这是由于其模型的线性结构(=方程)。
如果我们排除 Lasso 回归器,我们可以注意到系综树方法(随机森林和梯度推进)非常稳健,并且优于 KN 回归器:

我们现在可以关注三种插补方法的性能。
当引入 10%的异常值时,随机预测的性能下降了 8.8%。简单的、迭代的和 KNN 估算法使其在相同的 NaNs 比率下回到 1%以下:

当涉及到梯度推进回归变量时,KNN 估算器获得“最低”性能,在性能下降中回到 1%。
引入 10%的 NaNs 后,均值和迭代估算值带来了接近 0.3%的性能,这确实非常好!

像往常一样,这只是评估异常值对机器学习算法的影响的一种方式,不同的用例和假设可能会有很大的不同。
数据科学、机器学习和创新
pl-bescond.medium.com](https://pl-bescond.medium.com/pierre-louis-besconds-articles-on-medium-f6632a6895ad)
人工智能在基于网络的 ADA 和 WCAG 合规中的作用

由于 1999 年发布的 W3C 网页可访问性倡议及其 WCAG 1.0(网页内容可访问性指南)( 2008 年被 WCAG 2.0 取代), 20 多年来,残疾人网站可访问性指南已经有了雏形。
然而,与 2018 年 H1 奥运会相比,2019 年上半年的网站无障碍诉讼增加了 51.7% ,预计 2019 年 pace 将创下历史新高,达到 3200 多起,远远超过 2018 年的 2285 起。
虽然我们在等待 2019 年的完整数字,但事实仍然是,在《美国残疾人法案》(ADA)第三章以及延伸到在线财产的类似州和地方法律的支持下,网站可访问性诉讼出现了前所未有的增长。更重要的是,形势不会很快缓和下来。
事情到底有多糟?
如果上面提到的数字没有打动(或吓到)你,我们只能说有人积极寻找网站并起诉他们。诉讼趋势催生了术语“系列原告”,掠夺性的律师提起诉讼,只是为了解决问题。他们获得了巨额的法律费用,而原告只能得到和解的一小部分。
这在道德上是否正确无关紧要。当涉及到定义什么是无障碍网站时,当前的法律留下了足够多的灰色区域,以至于 WWW 的很大一部分是这种诉讼的温床。
事实上,accessiBe 最近对 1000 万个网页进行分析后得出的数据显示,全球 ADA 和 WCAG 2.1 合规性水平非常低。一些关键要点包括:
● 98%的网站未能满足与菜单相关的要求;
● 52%的网站未能为图片实现适当的 alt 属性(实际上被认为是一个不错的比例);
● 89%的网站未能达到弹出窗口的最低合规级别(考虑到弹出窗口打破了网站的整体合规级别,这是相当糟糕的);
● 71%的网站未能确保表格的可访问性;
● 83%的网站没有 WCAG 兼容按钮,主要是因为缺少标签;
● 22%的网站不符合链接要求——迄今为止最符合要求的网站元素组,主要是由于默认的浏览器设置。
这些只是网站为了合规而必须包含的一些更突出的(或者更明显的,如果你喜欢的话)可访问性要求。该研究描绘了一幅关于 ADA 和 WCAG 合规性现状的严峻画面,其原因要么是缺乏关注,要么是没有意识到问题的严重性。
使用人工智能实现全面的可访问性和合规性
可以说,防止网站易访问性诉讼的最好方法是提前计划:在设计和构建时考虑网站易访问性。然而,在大多数情况下,这是无效的,因为基础已经建立,并且由于需求的绝对范围,手动实现可访问性几乎是不可能的。
这就是人工智能介入的地方。有一些专门从事这一领域的服务,由扫描和分析网站设计每个方面的机器学习技术提供支持。
为了理解人工智能如何提供帮助,我们首先需要了解一下 WCAG 2.0 和 WCAG 2.1 技术标准。它们被组织在四个原则下:可感知的、可操作的、可理解的和健壮的。简而言之,网站需要具备:
●除了简单的鼠标导航之外,易于使用仅键盘命令进行导航;
●提供的信息易于查找和处理;
●可根据用户不断变化的需求进行调整;
●易于理解。
这是一个很大的范围。正如预期的那样,自动化测试允许更快地发现和解决潜在的干扰和问题。然而,人工智能解决方案不同于更基本的自动化测试,因为它能够模拟浏览器。它可以彻底理解一个网站的结构和它的各种元素的作用,特别是那些隐藏的,只有在行动时才显示出来的元素。
翻译成这四个 WCAG 2.1 原则,人工智能可以做的一些可操作的项目是:
●针对有运动障碍的人,通过“Tab”按钮优化键盘导航;
●方便盲人对内容进行音频描述;
●为有视觉障碍的人稍微调整图形元素,如字体、颜色,甚至间距;
●为那些有认知障碍的人提供一个内置的习语、俚语和以不寻常的方式使用的短语库;
还有很多。
另一个主要因素是更新。一旦第一个元素开始生效,遵从性级别就会下降,因为有新的元素需要审查。更多的更新意味着更多的维护,这意味着更多的潜在差距。
定期检查网站以确保其符合特定要求对于避免法律问题至关重要。作为在不明确需要编程的情况下不断从数据中学习的底层技术,机器学习算法可以发现这些变化,并在没有人类干预的情况下做出决策。此外,当需求发生变化时,集成它们会更容易。
需要立即修复的疏忽
几乎每个行业的所有类型的网站都是 ADA 诉讼的被告,不管是个人、小企业还是企业。这很大程度上是因为许多网站和企业主对什么是可访问性以及为什么它如此重要知之甚少,尽管他们负有法律和道德责任。
残疾有不同的形式,如视觉、听觉和色盲(仅举几例),这意味着需要结合不同的辅助技术来实现合规性。如上所述,这种情况很少发生。
因此,使网站符合《美国残疾人法案》和《WCAG 法案》已成为一个需要尽快纠正的疏忽。一个主要原因是为了避免陷入昂贵的法律纠纷,这可能会关闭一个网站或企业,但这个故事还有另一面。这也是为了吸引对限制性导航和功能性能力感到厌恶的整个潜在客户群体。
好消息是,人工智能提出了一种负担得起且可扩展的方法,让每个人都能访问每个网站。数学很简单:一个功能齐全的网站表现更好,创造更多的投资回报率。换句话说,投资建立一个所有人都能访问的网站是一个聪明的营销和商业决策。
最后的想法
随着诉讼洞察的不断发展,任何拥有在线业务的人都必须遵守 ADA 和 WCAG 标准,以避免昂贵的诉讼和负面报道。人工智能的进步为残疾人创造了更多无障碍互联网的新机会。曾经艰巨而昂贵的过程现在可以以更快的周转速度和可承受的速度完成,更重要的是,可以持续获得良好的结果。
人工智能的使用是为大量未开发的人口创造包容性环境的重要一步。就其本身而言,这是一个需要时间来赢得用户信任的过程,但如果你真的想一想,你对人的投资将与对技术的投资一样多。就投资而言,这总是一个不错的选择。
贝叶斯统计在后 COVID 世界中的作用
新冠肺炎告诉我们,基于过去数据的预测会很快过时。

来源:照片由来自 Unsplash 的 Katie Moum 拍摄
贝叶斯统计的一个核心概念是后验分布。简单来说,这种分布结合了一个人在直接观察到一组数据之前对该组数据的先验信念(先验分布)和未来观察到一组特定数据的概率(似然函数)。
这是后验分布的样子:

来源:图片由作者创建
传统的正态分布(均值=中位数=众数)完全依赖于过去的数据。
因此,数据分布的突然变化意味着先前的预测不再适用。
我们举个例子。

来源:RStudio —基于 Antonio、Almeida 和 Nunes (2016 年)研究的数据集
这是一家葡萄牙酒店的周取消预订数量的分布图(COVID 之前)。我们可以看到取消事件的数量每周都在变化,并且大致接近正态分布。
然而,由于新冠肺炎疫情酒店,该酒店每周取消预订的数量要高得多,上述分布现在与该酒店的任何预测无关。
不确定性在预测中的作用
作为贝叶斯统计应用的一个例子,下面是一个基于后验分布的酒店取消预测。使用张量流概率库实现预测。

来源:张量流概率
在这里,我们可以看到预测(橙色线)仍然或多或少地符合实际每周取消的范围。
然而,考虑到在新冠肺炎之前运行该模型将会表明,基于预测的整体范围——酒店可能会看到超过 500 个取消——远高于之前的取消范围。
在这方面,这样的预测可以提醒酒店经理潜在的极端情况,并引发以下问题:
“在什么情况下,我的酒店每周会有超过 500 次的取消预订,我该如何防范?”
“一刀切”的预测信息不多
贝叶斯方法在金融领域也越来越受欢迎,甚至在新冠肺炎之前。
通过预测来预测资产价格的一个大问题是,这种价格天生就受制于一个反馈循环。
它不像预测天气或其他人们不能直接影响时间序列的量。
例如,让我们假设您希望建立一个 LSTM 模型来预测特定股票的价格。你生成一个预测价格误差小于 5%的模型。
现在,假设每个人都开始使用 LSTM 来预测股票价格。在这种情况下,该模型现在没有预测能力,因为价格会立即调整,因此使用该模型没有任何优势。
因此,风险分析在金融中发挥着重要作用,即使用统计方法来预测特定价格的预测范围,而不是对价格的预期走向做出“一刀切”的断言。
贝叶斯推理可以允许基于先验信念和更新数据的更加混合的预测。
例如,如果一位分析师假设未来三个月市场将出现低迷的概率为20%——基于过去的数据和概率假设,这将如何影响价格?
如果根据新的信息,例如新冠肺炎导致经济产出下滑,这个概率被更新为 70% 会怎么样?这对预测有什么影响?
在这方面,贝叶斯推断可用于在新数据可用时更新概率假设,从而产生更明智的预测,而不是完全基于过去的数据,并且不考虑基于未来条件变化的不确定性的作用。
限制
尽管如此,贝叶斯统计并不一定是万无一失的。
与传统的统计方法不同,贝叶斯推断主要依赖主观意见来生成预测。
例如,一个人可能认为未来三个月股市下跌的概率为 30%。然而,另一个人可以查看相同的可用证据,并得出 50%的可能性。
此外,贝叶斯推理不一定告诉我们如何选择先验分布。
回到股票市场的例子——先验分布是基于过去一年的数据吗?过去五年?
在这方面,如果选择了不正确的时间周期,研究人员可能会无意中对预测结果产生负面影响。也就是说,减轻这种风险的一种可能的方法是通过回测,即给定一段时间的过去数据和一个指定的概率,该模型在这种情况下如何预测未来数据?
结论
从商业的角度来看,新冠肺炎的意思是,企业基于先前数据做出的许多预测已经变得多余。
另一方面,包含不确定性的预测可能会更好地为企业未来的正确行动提供信息。
贝叶斯统计有其自身的局限性,而且绝非万无一失。然而,我预计,随着我们开始意识到仅仅基于过去数据的预测可能非常“偶然”,这一统计分支将变得更加流行。
免责声明:本文是在“原样”的基础上编写的,没有任何担保。本文旨在提供数据科学概念的概述,不应以任何方式解释为专业建议。
参考
人员分析在组织内管理新冠肺炎危机中的作用
人员分析如何帮助公司努力减轻新冠肺炎在组织中的影响。

我们在新冠肺炎时代的新生活和工作方式凸显了重塑我们的工作方式、流程、沟通和人才管理方法、绩效和参与度衡量、奖励计划等的重要性。
在这个充满不确定性和混乱的时代,人力资源部门在管理新冠肺炎危机和打造经济复苏的工作程序方面获得了核心和决定性的发言权。在这方面,人力资源和人员分析是 CHROs 和人力资源分析负责人手中的一个强大工具,他们的任务是在这些压力巨大的时期保护人们的安全,同时保持生产力和工作士气。
事实上,如果在危机之前,CHROs 的角色可能会受到其他 C 级角色的挑战,那么现在可以肯定的是,疫情危机已经提升了首席人力资源官在 C-suite 中的角色。为了成功管理远程人才,人力资源部门有很短的时间让直觉休息,并为大胆的数据驱动型决策和创新思维腾出空间。因此,我们将深入探讨人力资源和人员分析如何帮助人力资源专业人员、人力资源总监和企业人力资源主管管理组织中的新冠肺炎危机。

照片由 Amy Hirschi 在 Unsplash 上拍摄
管理远程工作
由于全国范围内的停工,员工需要在家工作,因此人力资源部门面临着这样的挑战:既要确保实现目标,又要在远程工作环境中保持高昂的士气。随着许多大公司,如 Twitter、Google、微软、Zillow、Slack、亚马逊、PayPal,决定扩大在家工作的选择,其他公司预计也会效仿,为管理远程工作做出调整的需求变得更加明显。
因此,如果 people analytics 是 CHRO 最需要的战略差异化因素,那么今天管理危机是绝对必要的,正如 David Green 引用 Thomas Rasmussen 关于 people analytics 如何支持澳大利亚国家银行应对危机的演讲。
在远程工作领域,人员分析团队致力于支持员工、分配资源和关注点、衡量影响以及在人力资源数据的帮助下提前规划。但与此同时,人力资源职能部门通过捕捉整个企业的数据,使用人员分析来衡量生产力、协作和倦怠,以便监控员工的健康状况和远程工作的影响。

发现和雇佣人才
不幸的是,新冠肺炎危机导致了许多行业的大规模裁员,并使我们陷入了可能是自大萧条以来最严重的经济危机。此外,麦肯锡报告称,在接受调查的 190 名各行各业的首席执行官和职能领导中,有 67%的人表示,他们预计未来 12 个月将减少在长期招聘上的支出。
尽管劳动力需求有所减少,但找到并雇佣具备所需技能的合适人才仍然是人力资源部门的关键领域之一。根据麦肯锡的报告,急需的 IT 和数字技能仍然短缺,CHROs 应该开始重新思考他们的招聘流程,并考虑那些更容易将人们与工作联系起来的工具和平台,并更深入地了解他们的技能以及这些技能如何与可用的工作相匹配。
做出明智和战略性的招聘还需要有清晰的招聘洞察力,并跟踪重要的人力资源分析指标,以做出正确的决策。人力资源分析可以在招聘过程中提供帮助,并获得有意义的见解,以节省有限的时间和资源,并雇用合适的技能。
人力资源主管应考虑跟踪可用数据的方法和工具,如申请人跟踪系统或其他用于报告招聘的人力资源系统。人力资源从业者应该跟踪的一些指标有:招聘时间、每次招聘的成本、减少招聘时间、早期流动、采购渠道的有效性、访问者到申请人的转换率、招聘质量、每个员工的收入等。

监控和奖励绩效
受当前新冠肺炎危机影响的另一个工作方面是奖励和绩效计划。此外,麦肯锡强调,远程工作的人甚至更依赖绩效管理来告诉他们做得如何。
实施战略性人员和劳动力分析不仅可以优化工资和奖励,还可以帮助人力资源部门在提供公平工资的同时积极影响公司的底线。此外, CEB 分析研究指出,成功与人力资源分析合作的公司可以将人才成果提高 9 个百分点,导致毛利率提高 4%,每 10 亿美元的收入可以节省 1280 万美元。
依靠人员分析来制定奖励和薪酬计划,解决员工薪酬问题并管理求职者的薪酬预期,使企业领导者和人力资源经理能够为组织和员工做出基于事实的正确决策,尤其是在这样的不确定时期。

约根德拉·辛格在 Unsplash 上的照片
区分优先级并获取情报
风险和危机管理中最关键也是最具挑战性的部分之一是优先级。在这样一个动荡时期,人力资源部门有无数的火要扑灭,因此很难确定在哪里部署资源的明确目标。人员数据有助于获得决策所需的重要信息。
获取情报和洞察力以进行优先排序的一个例子是拥有识别高风险员工所需的人口统计和位置数据。为了在短时间内做出明智的决策,企业领导人需要了解疫情的最新发展,并将公共卫生仪表板集成到人员分析系统中。
组织的另一个优先事项,以及获取情报的手段,是拥有数据集,让人们深入了解新冠肺炎如何影响日常工作,如跟踪缺勤或分发员工疾病如何影响团队工作的脉冲调查。
组织的一个重要优先事项是识别对企业至关重要的员工,没有他们企业就无法有效运营。拥有准确且可访问的人员数据,以及关于员工的位置和人口统计数据,可以帮助 HR 识别和定位这些人,评估他们的风险情况,并制定应急计划,确定在他们缺席的情况下团队中谁可以代理。
为后危机新常态提前规划
努力在组织中实现人员分析并获取绩效、生产力和福利数据的人力资源主管和领导者将具备丰富的知识、技能和最佳实践的洞察力,以便在危机情况下组织和分配工作,并为恢复期和经济重启提前做好规划。
原载于 2020 年 8 月 31 日 Hyperight.com**。
流程挖掘在数字化转型中的作用
你能转换你不理解的东西吗?

图片由Monster Ztudio通过 Adobe Stocks 授权
Genchi gembutsu 是一个日语术语,翻译过来就是“去看看”这是转型领导者永远不能忘记的两个词。
在数字化转型的背景下, genchi gembutsu 的意思是,如果不分析工作进行的地点和员工使用的流程,就很难理解一个组织是如何运作的。
因为现实和理想从来都不一样,这也适用于业务流程。
流程挖掘为组织的工作方式带来了急需的透明度,因此使转型领导者能够了解在创建组织的下一个版本时应该关注哪里、优先考虑什么以及要转型什么。
什么是流程挖掘?
组织是非常复杂的适应性系统,具有多个利益相关者、信息流、决策机构、流程和支持基础设施。
在典型的一天中,组织执行数百万个任务来向他们的客户交付产品、服务或供应品。一些生产时尚产品;其他人出售咨询服务或软件产品。为了做到这一点,他们遵循他们需要完成的过程、任务块,以便能够实现输出、结果或决策。
案例示例:批准新的原材料供应商
让我们假设一家制药公司被一家新的供应商接洽,该供应商有兴趣向该公司销售原材料。在受监管行业中运营的制药公司有明确定义的流程,用于分析和接受任何新的生产原料。
这可能包括检测原材料的质量,如化学成分、杂质、生物适应性和物理标准。还可能包括调查供应商是否通过了制药公司强加给其供应商的特定业务标准和政策(例如,信誉、GMP 和 ISO 认证、付款条件)。
这些过程中的一些可以在并行进行。例如,质量保证实验室中的几项测试不需要相互等待。但其他流程需要按顺序进行;例如,如果原材料不符合实验室的质量标准,就不应该在小规模试生产中进行测试,因为后者是一个非常昂贵的过程。
如果质量保证部门没有首先批准该材料,制造部门没有提供其批准印章,则供应商不应被审核其 GMP(良好制造工艺)实践,这可能需要访问供应商的工厂。
如您所见,流程会变得复杂。
作为动态地形的流程
流程也不会过时。它们随着组织面对他们需要响应的场景而发展,从这些经验中学习并改变。
例如,对于任何投资决策总是遵循阶段门流程的制造商,可能会决定开发一个快速周期的产品推出流程,以将增量创新引入市场。这对于对抗新的竞争对手可能是绝对必要的,因为新的竞争对手在将新产品推向市场方面要敏捷得多。突然之间,员工会选择是否使用 fas-cycle 方法。如果他们 80%的时间都跟着它走呢。我们同意吗?如果这个竞争对手破产了,但是流程还在。我们同意吗?
如果没有流程挖掘,我们永远也不会知道这些情况是否会发生。
组织中存在的流程是组织面临的真实世界事件和场景以及组织选择如何应对它们的最终结果。
因此,一个大的组织会有成千上万的过程和这些过程的许多例外。仅仅看“原样”的流程流是不可能知道真正发生了什么的。当然,一个组织的生产力将与它的运营能力,团队运作的效率和效果紧密相关。
应用过程挖掘技术,如过程发现,揭示了一个组织如何真正地一步一步地工作。流程挖掘算法努力分析 IT 系统,调查和分析真实事件日志,并将它们与相关流程配对;一路揭示对理想工艺流程的所有修改和偏差。
通过过程挖掘的发现帮助转换团队决定过程是否有优化的潜力。如果有与过程相关联的活动和任务可以并且应该被避免、加速或者改进,那么该过程就是评审和优化的理想候选。
如果流程中存在弱点,比如瓶颈、循环或者效率低下,那么该流程通常是优化或者自动化的绝佳候选。
员工可能没有遵循理想的流程有很多原因,导致我们所说的流程偏差。有时,偏差和变化是有保证的。其他时候,它们是完全没有必要的。
你不会知道这一点,除非你有办法让工作透明。这就是流程挖掘如此重要的原因。
近年来,随着公司进行数字化转型,以及新的数据挖掘算法被开发出来并可用于分析这些海量事件数据,流程挖掘变得更加重要。
一些软件初创公司已经开发了智能流程挖掘工具,这些工具可以自动分析和可视化流程,并有助于揭示组织如何工作,以及存在哪些偏差。来自德国的 Celonis 和 Lana Labs 就是其中的两个组织。
这是他们如何定义流程挖掘的。
根据 Celonis 的网站:
“流程挖掘是一门 分析学科 ,用于通过从当今信息系统中容易获得的事件日志中提取知识来发现、监控和改进真实流程(即,非假设流程)。
Process mining 从实际事件日志中获得客观、基于事实的见解,通过回答与合规性和绩效相关的问题,帮助您审计、分析和改进现有业务流程。”
资料来源:Celonis.com
根据 Lana Labs 发表的一篇文章,流程挖掘是对事件日志的可视化和分析。
“流程挖掘首先是借助算法和数学程序对事件日志进行可视化和分析。
事件日志是基于 IT 的流程的协议。它们列出了事件(IT 系统中的单个活动)及其属性。
典型的属性是案例 ID、开始和结束时间的时间戳,以及依赖于系统的事件的其他属性,例如处理事件的人员或位置。
因此,一个事件日志从头到尾完整地映射了一个或多个业务流程。过程挖掘方法是“过程发现”、“一致性检查”和“模型增强””
来源:Lana 实验室关于培养基的文章
所有以上都是使用机器学习算法来执行的,这些算法是 Celonis 和 Lana Labs 等公司开发的,旨在让流程发现团队快速确定流程偏差的根本原因。
为什么流程挖掘对数字化转型至关重要?
再问一次:你能转化你不理解的东西吗?
我相信你已经知道我的答案是什么了。
如果你是企业家或颠覆者,你有从一张白纸开始的自由。大多数公司做不到这一点。因此,在他们尝试开始转型之旅之前,应该努力理解工作是如何完成的。
缺乏对工作如何完成的详细理解,领导一个大规模战略变革项目的主管几乎总是在黑暗中操作。此外,她的期望不会建立在事实的基础上,更糟糕的是,她可能无法成为她的团队迫切需要的领导者。
如果一个组织的领导者不清楚他们的公司是如何运作的,他们就不太可能重新发明它。
杰夫·贝索斯是标准化、自动化和敏捷性的信奉者,据引用他说过如下的话:
“在今天这个动荡的时代,除了重新发明,没有别的办法。相对于其他人,你唯一可持续的优势就是敏捷,仅此而已。因为没有什么是可持续的,你创造的任何东西,别人都会复制。”
如果敏捷是你转型的一个关键支柱,我希望如此,那么你应该尽一切努力去理解和改进你现在的工作方式。
这就是为什么我建议在转型之旅的一开始就参与流程挖掘。此外,我还建议公司在任何机器人流程自动化(RPA)之前采用流程挖掘。
虽然流程挖掘有助于识别和改进流程,并对适合自动化的流程进行优先排序,但在优先排序的流程上应用机器人流程自动化,公司可以专注于真正的机会,并真正重塑他们的业务。
这样做不仅会增强您对组织运作方式的理解,还会提高您转型成功的可能性。
深刻的理解加上创造力和创新通常会导致再发明。过程挖掘是一种重要的分析方法,可以帮助你深入理解。
艮赤玄宗!
我帮助我的客户在行动前诊断、理解、优先考虑和集中注意力,这样他们就可以真正地重塑自我,而不是浪费宝贵的资源。 和我们谈谈 如果您正处于转型过程中,并且您的团队没有使用像流程挖掘工具这样的技术进步。
原载于 2020 年 1 月 30 日http://www . rapid digital . ventures。**
统计在工业中的作用
数据科学和机器学习
有一些统计学的术语和一些关于统计学学科的观点,以及一些与相关领域的联系

照片由来自 Pexels 的 Markus Spiske 拍摄
统计无处不在,大多数行业都是依靠统计和统计思维来支撑业务的。对掌握统计学的兴趣也要求成为一名成功的数据科学家。你需要证明你对这个学科领域的热衷。
什么是统计?
它是一门包含从数据中学习的所有特征的学科。作为一种方法论,我们谈论的是允许我们处理数据和理解数据的手段和方法。统计学家采用并开发数据分析方法,并不断探索以了解它们的特性。
这些工具何时能提供洞察力?
他们什么时候可能会误导人?
所有不同学术领域的研究人员,许多行业的工作者,正在实施和实现统计方法,他们正在为进行数据分析提供新的方法和技术。首先需要一个简明的术语,这是统计学和统计学领域的区别。
我们每天都会遇到来自数据收集的数字或图形报告。例如,所有学生期末考试的平均分数,一些国家就业和失业工人的比例,或者一天中股票价格的波动。这些是统计数据。
然而,统计领域是一个侧重于研究方法的学术学科。作为统计学家,最重要的方面是开发新的统计工具,从数据中计算统计数据,并与专家合作,以适当的方式解释这些结果。
毫无疑问,统计学是一个不断发展和壮大的领域。此外,它提供了挑战和机遇。
在数据科学中,大量的统计方法正处于不断的研究中,以了解如何正确地使用它。许多新的应用领域是可用的,这些领域导致开发创新的分析方法的必要性。例如,如何测量数据的想法,以及可用的新类型的方法导致需要分析的新类型的数据。因此,我们经常依赖这些计算方面的进步,不仅使我们能够进行数据分析,而且能够对收集的大量数据进行更复杂的分析。
统计学是一门重要的学科,尤其是对于数据科学家来说,统计学领域有许多流派。它包含了来自理论、实践和相关领域的全新理念。
**Numerous viewpoints on the field of statistics are:*** The ability of summarizing data
* The idea of uncertainty
* The idea of decisions
* The idea of variation
* The art of forecasting
* The approach of measurement
* The principle of data collection
汇总数据的能力
数据可能是可怕的,因为理解这些数据是有条件的,这通常包括减少和总结。数据简化的主要目标是使数据集对人类观察者来说是可理解的。统计学家有不同的技术来汇总数据,这是实现数据有意义的目标所必需的。因此,统计学家在使用适当的、精确的和有效的方法来总结数据方面训练有素。
不确定性的概念
数据可能会误导人。开发统计字段的主要目的是获得评估数据的结构和框架。一般来说,来自数据的见解不是 100%准确的,但荒谬的是,我们有一种方法来量化报道的发现与事实有多远。一些评估报告返回时会有误差。这一误差幅度让我们了解到在公开发表的和真实的民意之间可能存在的差异。
决策的概念
理解数据是至关重要的,这导致需要能够对我们发现的东西进行处理。在统计的某些领域,决策的想法是任何统计分析的最终目标。在个人和职业的旅程中,我们面对困难做出决定。我们必须比较不同方法的成本和收益。
例如,如果一个人发现自己患某种特定类型癌症的风险可能高于平均水平,他们是否应该接受预防性治疗?统计数据有助于决策过程。
变异的概念
当我们总结数据时,通常,我们的主要焦点是典型的或中心的价值。这意味着我们必须高度重视从统计学的角度理解数据的变化。例如,如果你知道平均每个月美国人有大约 8000 美元的信用卡账单,你就很清楚信用卡债务分布的中心价值。如果你被提供了大约 10%以上,这个百分点给你更多关于信用卡债务可变性的信息。
预测的艺术
统计学的基本职责是预测。你不能绝对肯定地知道未来。不过,如果你有效地使用了可用的数据,它有时会做出相当准确的预测,如天气预测、股票市场价格预测和洪水风险预测。此外,试图计算新产品在市场上销售的未来需求或预测选举的结果。
测量方法
假设您正在收集大量数据。有些变量是可以测量的,有些可以以相当高的精度测量。一个人的年龄或身高,以及一些更具挑战性的变量。例如,血压每分钟都在变化,所以要确定下来有点困难。此外,还有情绪、个性和政治意识形态等更难定义和量化的概念。在确定概念和评估各种方法的质量时,统计在构建和评估衡量这些困难的有用方法方面发挥着重要作用。
数据收集的原则
最后,统计是原则性数据收集的基础。有时候,收集数据既费钱又痛苦。资源限制了可以获得多少数据,这意味着如果我们的数据太少,发现就不会最大化。然而,统计为管理这种权衡提供了一个极好的方法。您可以在了解并允许这些资源限制的情况下获得更多数据。

杰瑞米·泽罗在 Unsplash 上的照片
追溯到古代,文明一直在收集收成和人口数量的数据。现在,随机性和变化可以更精确地定义。现代统计学发展于 19 世纪,源于遗传学、计量经济学和统计理论在 20 世纪的发展,在科学和工业中有许多新的应用领域。例如,有能力用计算机做数据分析的出现。接下来,大数据、海量数据、数据科学、机器学习的兴起。
统计学确实与其相关领域有许多交集。
计算机科学为我们提供了处理数据的算法、结构和操作数据的编程语言。在数学中,我们得到了更简洁地展示这些统计概念的语言和图形,以及评估和解释这些分析方法的性质的工具。
数学的一个分支是概率论,它是统计学基础的一个重要部分,允许我们揭示随机性和不确定性的概念。
然后是数据科学,它为我们提供了数据库管理和机器学习,这些基础设施能够进行数据分析。
结论
统计学已经从一个小的领域发展成为研究和工业中的一个重要的联盟。众多不同的应用包括计算机视觉、自动驾驶汽车、面部识别、在线搜索推荐系统和在线购物。
在卫生领域,我们有预测和分析、精准医疗、欺诈检测、环境和基础设施风险评估、职业培训方面的社会和政府服务,以及行为治疗。统计和统计思维帮助我们理解我们周围的数据和信息。
关于作者
Wie Kiang 是一名研究员,负责收集、组织和分析意见和数据,以解决问题、探索问题和预测趋势。
他几乎在机器学习和深度学习的每个领域工作。他正在一系列领域进行实验和研究,包括卷积神经网络、自然语言处理和递归神经网络。
数据科学的根源
这一切是如何开始的。

Héizel Vázquez 插图
我们给对数据进行科学探索以发现有价值的信息和解决商业问题的行为起了一个名字:数据科学(DS)。这个说法不是定义,只是基本描述。
DS 在那里已经有一段时间了。我在过去已经广泛地介绍了我对这个领域的想法(查看底部的参考资料),但是我想在这篇文章中谈论一些不同的东西。
DS 不会从任何地方冒出来。它来自统计学的迭代,特别是统计学和数据分析的算法传统。三篇伟大的文章是我们领域的奠基者(正如我们现在所知):
- 数据分析的未来。
- 统计建模:两种文化。
- 数据科学:扩展统计学领域技术领域的行动计划。
但是这些论文也依赖于一个更大的图景。我试图用我和姐姐海泽尔·巴斯克斯创造的时间线来展示 DS 领域的整个发展:

插图作者:伊泽尔·巴斯克斯
请确保也检查来源。
正如我们所看到的,我提到的三篇论文中最老的一篇是 Tukey 的。我将告诉你为什么我提议这是我们领域的开始(即使在时间线中在它之前有论文)。不过,在此之前,我想讨论一下这篇文章中的一些观点:Luhn 的商业智能系统。
在开始之前

作者声明:Héizel Vázquez
在论文《商业智能系统》中,卢恩提出了一个自动系统,向任何工业、科学或政府组织的各个部门传播信息。
但我想从这篇文章中带来两个定义。一、企业的定义:
“商业是为了任何目的而进行的活动的集合,无论是科学、技术、商业、工业、法律、政府、国防等等。”
智力的定义是:
“智力的概念是[……]理解所呈现的事实的相互关系的能力,这种能力能够引导行动朝着预期的目标前进”
我喜欢这些定义。正如我们将看到的,“商业智能系统”的概念将指导后来的作者解释数据科学。
鲁恩也说道:
“有效的沟通是人类努力的所有领域取得进步的关键。[……]由于人类活动的速度加快,范围扩大,平均教育水平稳步提高,信息的产生和利用速度越来越快。[……]也越来越需要在远低于过去惯常水平的责任级别上作出更迅速的决定。[……]鉴于目前的增长趋势,自动化似乎为检索和传播这种信息提供了最有效的方法。”
我们来谈谈这个。作者说的是沟通和信息。此外,公司正在利用这些信息做出比我们过去所能做的更先进的决策。请记住这篇文章是 1958 年的。
Luhn 还谈到了自动化对于传播这些信息的重要性,这是数据挖掘的基础之一(数据科学之父之一)。
到目前为止,我们有四个重要的组件,它们将很快变得重要:
- 信息
- 智力
- 商业
- 自动化
从统计到数据分析

插图作者:伊泽尔·巴斯克斯
约翰·图基是历史上最重要的统计学家之一。在精彩的文章《数据分析的未来》中,他这样说道:
很长一段时间以来,我一直认为自己是一名统计学家,对从特殊到一般的推论感兴趣。但是当我看到数理统计学的发展时,我有理由感到惊奇和怀疑。[……]总而言之,我觉得我最感兴趣的是数据分析……
一个统计学家发表的重要声明。在这个时代,“数据科学”这个词并没有像今天这样存在,但图基描述数据分析的方式非常接近我们现在所说的数据科学。他甚至称数据分析是一门科学,因为它通过了这三项测试:
- 知识性内容。
- 组织成一种可以理解的形式。
- 依赖经验测试作为有效性的最终标准。
他在文章中还提到了一件重要的事情:
如果数据分析是有帮助的和有用的,它必须被实践
这似乎是显而易见的,但它指导了人们如何描述 DS。从这篇文章中我们理解了什么?统计学的发展将创造图基所谓的新数据分析,定义为:
“分析数据的程序,解释此类程序结果的技术,规划数据收集以使其分析更容易、更精确或更准确的方法,以及适用于分析数据的所有(数学)统计学机制和结果”
在这个定义中,一个至关重要的想法是,数据分析还包括计划收集数据进行分析,以及分析和解释数据的统计机制。
除了说应该练习数据分析,Tukey 还说:
我们需要正视更现实的问题
当然,他说的是数据分析。尽管这篇文章的想法是解释如何在正式和学术领域教授和使用数据分析,但 Tukey 明白我们需要超越教科书和理想化的场景。理解鲁恩的文章和这篇文章之间的联系很重要。
从数据分析到数据科学

作者声明:Héizel Vázquez
在 Tukey 出版 35 年后,Jeff Wu 说:
统计学=数据科学?
他在会上提议将统计学重新命名为“数据科学”,将统计学家命名为“数据科学家”。在今天的标准下,我们知道统计学本身不属于数据科学,但是为什么呢?因为我们还需要编程、业务理解、机器学习等等(但很快会有更多)。
在与吴杰夫的一次谈话中,他提到:
“我的演讲题目是统计学=数据科学?。在那里,我把统计学描述为数据收集、数据分析和决策的三部曲。我说的显然是分析统计学,而不是描述统计学。我建议将我们的名字从“统计学”改为“数据科学”,将“统计学家”改为“数据科学家”。“我记得我甚至在讲座中开玩笑说,只要把名字改成数据科学家,工资就会更高。如今确实如此。很有意思”
关于吴对统计学的定义,有趣的是数据分析是其中的一部分。我不能完全肯定 Tukey 是否会同意吴的观点,但想法是明确的:
数据科学依赖于数据收集、数据分析和决策制定。
最后,我们开始说点别的:决策。这是图基关于数据分析和统计的观点与卢恩关于商业智能的观点之间的联系之一。
请查看时间表,记住我正在谈论的文章和演示的日期。
吴的报告(2001)发表四年后,有两篇论文把所有的东西都放在了一起。2001 年 4 月,克利夫兰提出了一个扩大统计领域技术范围的行动计划,他称之为数据科学。然后,同年 8 月,Breiman 提出,使用算法建模(作为一种不同的统计文化)将更好地解决数据问题,而不是经典的统计建模。
这两篇文章以不同的方式相关联,克利夫兰的文章旨在创建一个教授数据科学的学术计划(类似于图基为数据分析所做的),而布雷曼的文章则试图谈论数据科学的实际意义及其与商业的关系(接近卢恩想要用应用程序解释的内容)。
尽管克利夫兰的文章是针对大学和教育机构的,但他提到:
大学被选为实施的场所,因为它们是我们传统的创新机构[……]。但是类似的计划将适用于政府研究实验室和企业研究机构
因此,他认识到政府和组织在将数据科学作为一个严肃领域制度化的过程中的重要性。
在文章中,克利夫兰指出数据科学依赖于四件大事(他谈到了六件事,但去掉了与教授 ds 相关的部分):
- 多学科项目。他在这里提到:
数据科学的新工具和理论的最大刺激是对数据的分析,以解决在调查的主题方面提出的问题。面对数据带来的问题,有创造力的研究人员会提出大量的新想法,这些想法通常比产生这些想法的特定数据集应用得更广泛。
这里需要强调的重要事项:
1.-数据分析和数据科学的主要目标是解决问题(当我们谈论 Breiman 的文章时,这一点很重要)
2.-数据科学从业者需要研究不同的问题和领域,以便能够有一个更大的视野,发挥创造力,并理解不同类型的数据和数据带来的问题。
- 模型和方法。他在这里提到:
数据分析师面临着两个使用统计模型和方法的关键任务:(1)规范——为数据建立模型;(2)估计和分布——正式的数学概率推理,以模型为条件,其中模型的数量被估计,不确定性以概率分布为特征。
需要注意的是,他将数据科学的从业者称为数据分析师,但我们将称他们为数据科学家(需要思考)。
在这里,我们必须强调:
1.-建模是数据科学的核心。这是理解“现实”,我们周围的世界,但创造一个更高层次的原型来描述我们所看到的,听到的和感觉到的事物的过程。尽管如此,这是一个代表性的东西,而不是“实际”或“真实”的东西。图基在他的文章中也谈到了这一点。
2.-数据科学需要方法(和方法论)。
3.-数据科学家为数据创建模型,并使用统计技术和方法来开发这些方法。正如我们将在 Breiman 的文章中看到的,他强调算法而不是形式数学方法。
- 用数据计算。他在这里提到:
今天的数据分析项目依赖于数据库、计算机和网络硬件以及计算机和网络软件。[……]除了计算方法,数据计算还包括用于数据分析的数据库管理系统、用于数据分析的软件系统和用于数据分析的硬件系统。
他还谈到了统计学家和计算机科学家之间的差距:
[……]数据挖掘是当前的一个工作趋势。但是对数据分析师的好处是有限的,因为计算机科学家关于如何思考和处理数据分析的知识是有限的,就像统计学家关于计算环境的知识是有限的一样。
他的想法之一是“知识(统计和计算机科学)基础的融合将产生强大的创新力量”。
需要强调的其他一些事情:
1.-数据科学家需要了解数据库和计算软件。编程也是如此。他还谈到统计软件包和相关软件。但现在我们知道,如今数据科学的道路取决于对一些编程语言(目前主要是 Python 和 R)的理解。
2.-数据科学也依赖于技术进步。2001 年是这样,今天也是这样。数据科学家使用的方法受到理论发展的影响(查看时间轴),但也基于这样一个事实,即今天我们拥有强大的计算机、更便宜更快的内存、高速互联网,以及 GPU 和 TPU。
3.-我们需要统计学家学习计算机科学,需要计算机科学家学习统计学。这个缺口现在由数据科学家填补,但我们不能忘记,在这些领域之间流动正变得越来越常见,我们需要统计学专家来学习计算机科学,也需要计算机科学专家来学习统计学,而不仅仅是精通这两方面的人。
- 理论:在这里,他提到:
理论,无论是数学理论还是非数学理论,对数据科学都至关重要。理论工作需要为数据分析师提供清晰的结果,尽管在许多情况下是间接的。数据科学工具-模型和方法以及计算方法和计算系统-链接数据和理论。新数据产生了对新工具的需求。新的工具需要新的理论来指导其发展。
数据科学是一个实践领域,但需要理论来理解和解释他们的方法和模型。今天我们知道,如果你想理解机器学习,你将需要了解线性代数、微分学、统计学和概率(提到一些最重要的)。
需要强调的重要事项:
1.-数据科学的工具及其模型将数据和理论联系起来。我们需要理解理论来创建更好的模型,当我们建立模型时,我们使用所有的理论工具。
2.-不同的数据集需要不同的理论背景。这在 Tukey 的论文中很清楚,他提到了一些最重要的数学和统计学知识来处理不同的数据集。当大数据爆炸时,我们看到了这一点,我们必须分析不同的数据源。
3.理论上的进步指导了新工具和模型的创建。这让我们想起了科学的历史,在那里,不仅数据和实验导致了新理论的产生,而且新理论还发展了指导实验、模型和工具。
数据科学中的算法建模文化

Héizel Vázquez 插图
正如我提到的,在 2001 年 8 月,Leo Breiman 发表了一篇关于统计学的两种文化的论文:数据建模和算法建模。他在文章中的一句话是:
统计学的根源,就像在科学中一样,在于处理数据和用数据检验理论。我希望在本世纪我们的领域将回到它的根源。
在这里,他提到,在统计文化中,有些人受数据建模驱动,有些人受算法建模驱动。其中第一个假设我们有一个随机数据模型,将输入变量 x 映射到响应变量 y 。第二种认为映射过程既复杂又未知,他们的方法是找到一个函数 f(x) ,它作用于 x 来预测响应 y 。
然后,他继续讨论为什么数据建模文化长期以来对统计学不利,导致不相关的理论和可疑的科学结论,阻止统计学家使用更合适的算法模型和研究令人兴奋的新问题。此外,他还谈到了光谱的另一部分的奇迹,从他的作品中给出了算法建模文化的例子,以及其他关于它如何解决困难和复杂问题的例子。
他说算法文化:
[…]将焦点从数据模型转移到算法的属性。它描述了它们作为预测器的“强度”,如果它们是迭代的,则描述了它们的收敛性,以及是什么赋予了它们良好的预测准确性。理论中的一个假设是数据是从一个未知的多元分布中提取的。
他并不是说“旧的”统计文化是无用的。相反,他的意思是算法文化更适合于当前(当然是回到 2001 年)由数据引起的问题。
Breiman 认为,这种新文化中的一个指导原则更接近于我们在数据科学中所做的事情,即:
目标不是可解释性,而是准确的信息
如果我们看到他的论文发表后发生了什么,那就是事实。算法、方法和模型的进步是为了提高准确性,牺牲了可解释性。幸运的是,在过去的几年里,“黑盒”的可解释性和可解释性有了巨大的进步;我们现在有工具来解释随机森林、支持向量机或深度神经网络是如何工作的。
我喜欢他在一些咨询工作中解释算法文化的使用方式,我们可以看到如何改变数据和数学使用的一些基本方面,我们可以提高准确性并解决更复杂的问题。
结论
结合本文中提到的作者的工作,以及时间轴中提出的理论、计算和科学进展,我们可以了解数据科学的历史发展。
数据科学的根源是统计学,但也是利用数据解决业务问题的思想。数据科学应该是实用的,但是它依赖于数学和计算机科学理论的使用。数据科学的实践和研究应该是每所大学、政府和组织的一部分,它们希望使用数据来解决复杂的问题。
数据科学已经成为学术界和业界解决问题的标准框架,而且在一段时间内还会如此。但是我们需要明白我们从哪里来,我们是谁,我们要去哪里。
如果我们将现有的资源集中起来,让这一领域的知识为更大的利益而共同努力,我们就能对世界和我们的生活产生巨大的积极影响。这是我们的时代。
规则三:计算尚未发生的事件的概率
实践教程
我们有多大把握让加州、纽约等蓝色州。下次选举不要变红?

前总统巴拉克·奥巴马的第二次就职演说(2013 年)。由 Dyana Wing So 在 Unsplash 上拍摄
作者注:我正在尝试一种更短的文章形式,旨在介绍有趣的统计事实和经验法则。让我知道你如何喜欢他们。如需更深入的分析:
又是一个选举周期,又是一次我们对总体结果感到困惑的时候。任何一方都没有井喷。选举是一场扣人心弦的比赛。民主党人和共和党人在几次竞选中都取得了意想不到的进展。
面对每个选举周期不断上升的不确定性,我的一个朋友欢呼道:
我们可以确定的一件事是,加州从来没有,也永远不会变红。
首先,这在历史上是不正确的——加州在 1992 年大选前一直支持红色。我的朋友必须将他的观察限定为“他观察的[自 1992 年以来的]选举”,或者如果他将地点改为哥伦比亚特区。然而,如果他知道即使在这次选举中,加利福尼亚州 1000 万张选票中有三分之一投给了特朗普总统,他对自己的预测仍会不太有信心。仅仅因为我们[表面上]观察到一个地方是一个民主堡垒,并不意味着它在未来不会变红,反之亦然。

我朋友所做的预测是一种非常常见的心理归纳,我们每天都在练习。就像飞机不应该坠毁一样,智齿拔除不应该造成神经损伤,卫冕英超冠军也不应该因为一支在英国足球第五梯队打滚的球队而沮丧。然而,在现实中,这些事情确实发生了。仅仅因为我在过去的 10 年里没有骑摩托车遇到任何事故,并不意味着事故的风险为零。
问题是: 我们能否量化尚未发生的事情的概率? 理想情况下,我们会想给罕见事件分配一个概率,但是这些事件的分子是 0,我们无能为力。在这些情况下,量化风险大小的一个简便方法叫做三个的法则:
如果某一事件在有 n 名受试者的样本中没有发生,则从 0 到 3 的区间/n为总体中发生率的 95%置信区间。
这里需要注意的一点是,观察的样本越小,置信区间越宽,这意味着小样本的置信区间上限大于大样本的置信区间上限。但是,如果说在一个小的系列中,不良事件发生的真实概率更大,那就错了。
它是如何工作的?
这个规则的证明很简单,用 X 表示事件的数量,用 p 表示我们观察到一个不良事件的概率( p 接近于 0),我们要找到给出 Pr( X = 0) ≤ 0.05 的 n 观察的二项分布的参数 p 的值。
因此,我们需要求解 p ,这样:

然后我们可以通过使用 Maclaurin 级数来近似实体 ln(1- p ,它是函数 f(x) 在 a = 0 处的泰勒展开式的求值

将此应用于 ln(1- p ,我们得到:

这样,我们就有了 -np ≤ -2.996 或者 p ≤ 3/ n 。
快速模拟:
虽然数学很简单明了,但为了证明它确实有效,我们可以尝试运行一个简单的模拟:
- 想象一下我们在生产线上测试缺陷。假设我们知道缺陷概率是 p = 0.001
- 我们一个接一个地测试每一个下线的产品,直到我们遇到一个缺陷(测试号 n+1 )。
- 然后,我们制作一个由 0 和 3/n 限定的置信区间,并记下它。我们检查置信区间是否包含缺陷 p = 0.001 的真实概率。
- 我们重复这个过程很多次,例如 100,000 次迭代
这是一段 R 代码:
正如你所看到的,从长远来看,大约 95%的区间【0,3/n这样的区间应该包含真正的潜在缺陷概率。

模拟的直方图。红线显示了故障的真实概率(p=0.001)。我们看到红线右侧的面积总计为 95%,这意味着在 95%的情况下,我们在这个过程中获得的置信度包含了真正的潜在缺陷概率。
回到原问题:
所以让我们回到最初的问题:让我们忘记 1992 年之前的所有选举。由于我们没有观察到加州在过去 8 次选举中投票支持红色,使用三的规则,我们可以推断出加州走向红色的 95%置信区间在 0 和 3/8 = 37.5%之间。对于哥伦比亚特区,它将是[0,3/15= 20%]。
需要说明的是,这是一个有趣的例子,为了让它起作用,我必须在这里做一些全面的假设,可能没有一个是正确的。
- (1)我们假设每个选举结果都是相互独立的。这在很大程度上是不真实的,因为我们知道一个选举结果至少可以影响地区地图或者激发下一次选举的投票率,等等。
- (2)有一个潜在的、固定的州投票给红色的概率,这可能是不真实的,因为我们知道,该州的人口统计、经济前景和人民情绪在很大程度上影响着政党归属和结果如何产生,并一直在变化。
- (3)对于加州,我们忽略 1992 年之前的所有选举。如果我们包括以前的数据,在这种罕见的事件确实发生过的地方[但它并不罕见,因为加利福尼亚在 1990 年以前被认为是一个红色的州],三的规则就不应该被使用[然而华盛顿没有这个问题]
一个实际的用例:
那么三法则实际上是用来做什么的呢?非常受欢迎的使用案例是在许可前临床试验中,不良事件发生率非常低,例如疫苗开发项目。通常,10,000 名受试者范围内的样本量可被认为足以确定新疫苗的保护效力,但不足以检测更罕见的事件或并发症。
如果在涉及 10,000 人的许可前临床项目中没有观察到任何特定类型的事件,则可以估计该事件发生率的上限为 3/10,000。实际的并发症发生率,即发生频率低于疫苗靶向疾病的发生率,只能通过一些可靠的上市后监测系统来检测。
因此,下次你的牙医说他从未失败过一个手术时,你知道该怎么做:问他服务过多少病人,用三法则找到他失败率的置信区间,看看你对上限有多满意。
你可以在我的 Github 页面找到这篇文章的代码。
参考资料:
将 AI 推向边缘的热潮
为什么苹果、英特尔、谷歌等公司试图将人工智能从云端转移到边缘
今年早些时候,苹果宣布以 2 亿美元收购西雅图的边缘人工智能初创公司 Xnor.ai。这是它将人工智能推理从云带到本地硬件的许多其他举措之一。

Canva.com
今天,算法坐在云上,为你的请求服务。正如您所猜测的,当数据必须在云服务器和远程客户端之间传输时,可能会有延迟。还可能附带许多隐私问题。智能设备能力的稳步增长正慢慢带来在本地边缘而非云端运行算法的机会。所有主要的科技巨头现在都在竞相将人工智能推向边缘。
“机器学习将以一种大规模的方式在边缘发生,最大的问题是你如何高效地完成它?”斯坦福大学教授 Subhasish Mitra 说。
什么是 Edge AI?
惠普表示,在边缘计算中,数据由设备本身或本地计算机或服务器处理,而不是传输到数据中心。现在当我们谈论人工智能时,这些计算变得非常复杂,普通的边缘设备变得无法执行它们。这就是为什么目前这些复杂的计算都留给了数据中心的大型服务器。
如果你曾经使用过 FaceApp(尝试不同外观的应用程序),你可能会注意到它需要相当长的时间才能给你结果。后端发生的事情是,您的图像(加密)被发送到远程服务器,服务器应用您请求的算法,并将其发送回您的设备。现在,如果这个完整的过程以某种方式发生在你的本地,它会更快,更不用说安全了。这就是 Edge-AI 的用武之地,Xnor.ai 等公司正在开发能够实现本地推理的技术。

获取最佳商业见解的热潮
为什么 Edge AI 很重要?
Edge AI 为更快、更可靠、更安全地做出任务关键型和时间敏感型决策提供了可能性。对于苹果和其他许多声称将用户隐私置于一切之上的公司来说,edge AI 肯定会是一项必不可少的技术。
Xnor.ai 的技术在手机、物联网设备、相机、无人机、嵌入式 CPU 等边缘设备上高效运行深度学习模型。诀窍是建立高效的硬件,能够运行高能耗的算法,而不损失这些算法的准确性。苹果收购 Xnor.ai 将有可能帮助它挑战云技术、亚马逊网络服务、微软 Azure 和谷歌云领域的巨头。另一方面,所有这些也在不断增加他们对利用人工智能和边缘计算优势的关注。
您如何针对边缘进行优化
有两种方法可以提高 edge 上算法的性能:优化模型架构,优化设备硬件,或者两者都用。
优化模型架构
传统的人工智能算法使用传统的数字表示法。例如,您的 32 位 PC 可能对模型使用 32 位权重和偏差。多年来,人们观察到,权重和偏差不需要精确到 32 或 64 位就能提供良好的精度。研究表明,当 32 位精度权重和偏差被 8 位或 16 位精度替代时,模型的精度没有显著下降。
Xnor.ai 在 2016 年发表的一篇题为使用二进制卷积神经网络的 ImageNet 分类的出版物提出了标准卷积神经网络的两种有效近似:二进制权重网络和 Xnor 网络。他们将精度降低到 1 位(二进制),以便节省 32 倍的内存。XNOR 网络主要使用二元运算来近似卷积,从而使计算速度提高了 58 倍。期末成绩优秀;该论文称,“二进制权重网络版本的 AlexNet 的分类精度与全精度 AlexNet 相同,”这纯粹是令人惊讶的。需要注意的一点是,这篇论文发表于 2016 年,现在有更好的架构。
优化硬件
下一个方法可能是构建更好的硬件来支持计算和耗电的人工智能算法。Myriad 就是这样一家致力于开发硬件单元的公司,尤其是为人工智能推理开发硬件单元。2016 年,AI 收购了 Movidius,今天的硬件被称为英特尔的神经计算棒。神经计算棒或 NCS 允许您在需要实时推理的低功耗应用程序上开发、微调和部署传统的卷积神经网络(CNN)。

英特尔 NCS 2 ~ intel.com
NCS Stick 与英特尔的 OpenVINO toolkit 配合使用,可以帮助您采用传统的机器学习模型,生成中间表示,然后使用推理引擎来推断给定输入数据的结果。中间表示由工具包的模型优化器模块生成,该模块将您的模型转换为推理速度更快的形式。
然而,最好的方法是整个管道的软硬件协同设计。这将确保您的性能在硬件和软件层面都得到优化。在你下面的视频中,你可以看到 Xnor.ai 如何出色地构建了一个太阳能物体检测芯片。这种芯片的使用可以跨越数千种现实生活中的应用。
什么在等待着我们
随着 Edge AI 变得更加强大并开始成形,我们将在我们的设备上见证真正的人工智能。我们的智能设备将不再需要连接到互联网来访问基于人工智能的应用程序;等待时间将大大减少,最重要的是,真正的隐私将得到保证。

Canva.com
这是一个激动人心的时代,全球各地都在发生着许多激动人心的事情。我绝对期待的一件事是,一旦边缘人工智能成熟,它将如何影响医疗保健。感谢阅读这篇文章,我希望你喜欢它。后会有期:)
😭Twitter 上最悲伤的一天:公司推文中的情绪分析和参与趋势
6 个月内 tweets 中参与度指标和情绪值的每周趋势的数据分析和可视化。

马科斯·保罗·普拉多在 Unsplash 上拍摄的照片
如果发了一条推文,但没有人在旁边检查分析,它会产生影响吗?好吧,这是一个相当松散的关于一棵树在树林中倒下的问题的释义。🌳但是,你知道我在说什么。
我用果酱(推特制作果酱)发微博已经一年多了。现在是时候详细了解一下在文案写作和交流中可以从这种练习中获得什么样的见解了。除了提及、标签、表情符号和文本之外,我有兴趣看看我们的推文如何根据一周中的某一天表现。
因为如果每个人都在吃没有电话的早午餐,为什么还要在周日发微博呢?🤷♀️
日期时间的时间
这是我们开始之前数据框的前几行。

40 个不同有用程度的专栏…
我们有 529 行和 40 列,但是在分析的初始阶段,我们删除了其中的一些(你可以在这个笔记本中看到完整的数据分析)。
第一步是处理我们最喜欢的变量日期时间!还有人把 strftime 和 strptime 弄混了吗?🙋♀️,这就像混淆了左边和右边,也许我们永远无法治愈自己。
我们将把该列拆分成日期和小时并提取一周中某一天的名称。
这使我们能够按天对数据进行分组,并提取一周中每一天的平均值。
请注意我是如何巧妙的按照日名(人类友好的名字)分组,但是按照日排序,这是一个数字表示。如果你按 day_name 排序,你会得到按字母顺序排序的日子,这没有帮助。☝️
输出:

这已经足够让我们绘制值了。我们可以创建一个很好的函数,让我们画出选择的变量。💁♀️
当然,我们必须有点小心我们在同一个图表上绘制的那些。不同的值有不同的比例,例如,比较印象与参与度,如果 y 轴拉长,图表最终可能不会提供太多信息。
让我们策划一下的东西,比如说约会、转发和喜欢。
plot_means_by_weekday(‘engagements’, ‘retweets’, variable_3=’likes’)
输出:

这是什么?周末大跳水!🤔
为了更好地了解趋势,我们可以将这些值归一化。
现在,让我们再画一次。
plot_means_by_weekday(week_mean_norm_df, 'engagements', 'retweets', variable_3='likes')
输出:

仍在下降。但是,现在很清楚,所有的价值都遵循相同的趋势。
大幅下跌可能部分是由于周末的数据非常少,因为我们周末根本不发推特,假设人们不怎么发推特。
🎺令人印象深刻的星期一?
让我们来了解一下平均每日印象。通过使用聚合函数,我们可以很容易地获得印象的平均值和特定工作日发送的所有 tweets 的计数。
“week_impressions”数据框如下所示:

我们可以画出来。
输出:

如果我们只看平均印象,似乎周一、周二和周三是发推特的最佳时间。但是,让这个图表不清楚的是,每天发送的推文数量不同,印象的平均值也不同。让更清晰的是计算并绘制每条推文的发送数量与接收数量的比率。
输出:

现在我们清楚地看到,在一周的中间,推文与印象的比率确实是最高的。
😠变得多愁善感&看看消极是什么样子
我们可以对这些推文做的一件事就是计算文本情感。要做到这一点,我们可以使用 VADER (Valence Aware 词典和情感推理机),这是一个专门设计来分析社交媒体上表达的情感的词典和情感分析工具。
下载 vader 词典后,我们将情感强度分析器应用于文本栏。它将返回一个包含四个值的字典。
注意:你会注意到情感栏已经出现在上面的一个 gists 中。说到这个数据分析项目的年表,这一步👆(计算情绪,)完成的比较早。
输出:

不用说,转向柱需要清理一下。🧹:首先让我们看看我们总共有多少正面、负面和中性的推文。
输出:
{‘positive’: 380, ‘negative’: 69, ‘neutral’: 80}
69 条负面推特?!我以为我是一个嬉皮士式的推特精灵。我们一会儿会检查它们。
首先让我们创建四个单独的列,每种情感值用一个数字表示。这对后面的计算会有帮助。
现在,我们可以过滤负面推文。让我们选出消极得分最高的人来看看根据 VADER 所说的“消极”是什么样子。
输出是负面得分最高的两条推文的文本:
1
👌 Be your product's worst critic, said @susanavlopes from @onfido at #JAMLondon 2019.
What's the latest criticism you've given to your #product? [https://t.co/SxJbmrtQQu](https://t.co/SxJbmrtQQu)
2
Connect with #product designers from Barcelona! 🇪🇸🎨
How?
Follow this list (Come on, who doesn't like a good list! ) 👉 [https://t.co/gy2bZjyXmy](https://t.co/gy2bZjyXmy)
Anyone missing? Tweet at us so we can add them! #pmot #design #prodmgmt
我的假设是,否定、负面最高级以及“批评”或“失踪”等词的存在导致情绪分析器将推文归类为负面。
哪几天是正面和负面推文的来源?
The top value of positive sentiment was observed on Saturday (2.108), and top value of negative sentiment on Tuesday (1.04).The lowest value of positive sentiment was observed on Tuesday (-1.217), and the lowest value of negative sentiment on Sunday (-1.976).
为了更清楚起见,让我们使用我们之前编写的函数来绘制它:
输出:
*#plot sentiment for week day*
plot_means_by_weekday(week_mean_norm_df,'sentiment_positive', 'sentiment_negative', 'sentiment_compound')

显然,周二需要一些欢呼!😐
它有最低的积极情绪值和最高的消极情绪值。可能是来自我们常青图书馆的相同的“负面”推文在同一天被持续发送。
那个周末是愉快的,这可能是以下几个因素的组合:整个周末很少发推文,如果有的话,也往往比较轻松——不那么“聪明”,也不那么事务性。
🤔相关性:我们能违反数学定律吗?
任何敬业度指标和变量是否相互关联?检查的方法只有一个。计算相关性。
对这些值的标准解释是:0.7 表示强正相关,0.5 表示中等相关,0.3 表示弱正相关(加上一个负号,表示负相关)。
我们可以绘制相关值,尽管如此多的值可能会使更少而不是更清晰。不过,它会成为一个漂亮的浴室瓷砖图案。🤷♀️
*#plot correlations*
fig, ax = plt.subplots(figsize=(15,15))
_ = sns.heatmap(corr, annot = True, ax=ax)plt.title("Correlation matrix of engagement metrics", fontsize=16)
plt.show()
输出:

前面要点的打印结果更容易理解:

您可以将这些结果解读为:
- 展示越多,参与越多,参与越多,个人资料点击越多。
- 喜欢越多印象越多,印象越多喜欢越多,等等。
这些结果并不令人惊讶。让我感到惊讶的是,如果字数与字符数呈负相关,这将违反数学定律。
🤠下一步!
我将从 Twitter Analytics 收集更多的数据,也许最终样本量会大到足以获得有统计学意义的结果。
如果我有更多的耐心,我会尝试创建更大的自举样本。只是因为(我觉得?)我可以,因为它增加了样本量,有助于获得更有意义结果,而不需要等待更多的数据。
Twitter 数据分析的更多帖子:
数据科学中最悲伤的等式
为什么统计永远不会给你真相
下面是文章的音频版本,由作者为你朗读。
准备一盒纸巾!我将要投下一个关于统计学和数据科学的真相炸弹,它会让你热泪盈眶。

模因模板:来源。
推断=数据+假设。换句话说,统计数字不会给你真相。
常见的神话
以下是一些标准的误解:
- “如果我找到正确的方程式,我就能知道未知的东西。”
- “如果我足够努力地计算数据,我就能减少不确定性。”
- “统计可以把数据转化为真理!”
它们听起来像童话,不是吗?那是因为他们是!
痛苦的事实
世界上没有让你无中生有的魔法,所以现在就放弃那个希望吧。统计学不是这样的。从统计学家那里得知。(作为奖励,这篇文章可能会让你避免浪费十年的时间去研究统计的黑魔法来追逐那个难以实现的梦想。)
不幸的是,有很多骗子可能会试图说服你。他们会对你施一个典型的欺负动作,“你不明白我用什么等式来打你,所以在我的优势面前低头,照我说的做!”
抵制那些装腔作势的人。

图片:来源。
别摔着地,伊卡洛斯!
把统计推断(统计)想象成从我们知道的(我们的样本数据)到我们不知道的(我们的人口参数)的类似伊卡洛斯的跳跃。
在统计学中,你知道的并不是你希望知道的。
也许你想要明天的事实,但你只有过去能通知你。(记不住未来的时候好烦是吧?)也许你想知道你所有的潜在用户对你的产品有什么看法,但是你只能问一百个用户。然后你要处理的不确定性!
这不是魔法,这是假设
你怎么可能从你知道的跳到你不知道的?你需要一座桥来跨越这个鸿沟…而这座桥就是 假设 。这让我想起了所有数据科学中最痛苦的等式:数据+假设=预测。
数据+假设=预测
(如果你喜欢,可以随意用“推断”或“预测”来替换单词“预测”——它们在这里都是同一个东西:对你无法确定的事情的陈述。)

假设在你知道什么和不知道什么之间架起了一座桥梁。图片:来源。
什么是假设?
如果我们知道 所有事实(并且我们知道我们的事实实际上是真实的事实),我们就不需要假设(或统计学家)。假设是你用来弥合你所知道的和你希望你知道的之间差距的丑陋补丁。当你忽略事实时,你必须使用这些技巧来进行数学运算。
假设是丑陋的创可贴,你贴在信息缺失的地方。
我应该说得更直截了当吗?假设不是事实,它是你编造的一派胡言,因为你的知识中有很多漏洞。如果你习惯于用你的过度自信区间来欺负别人,花点时间提醒自己,把任何基于假设的事情称为真理是牵强的。最好开始把整件事当成个人决策工具不完美但聊胜于无(具体情况)。
统计是你在一个不确定的世界中尽力而为的尝试。
总是有假设的。
假设是决策的一部分
给我看一个“无假设”的现实世界决策,我会快速说出一大堆你自己都没有意识到的隐含假设。
举例:当你读报纸时,你是否假设所有的事实都被核实了?当你制定 2020 年的计划时,你是否认为不会有全球性的疫情?如果您分析了数据,您是否认为信息是准确无误地捕获的?你认为你的随机数发生器是随机的吗?(他们通常不是。)当您选择网上购物时,您是否假设会从您的银行账户中提取正确的金额?你上次吃的零食呢,你认为它不会毒死你吗?当你服药的时候,你是否知道任何关于它的长期安全性和有效性的事情…或者你是假设的?
不管你喜不喜欢,假设是决策的一部分。
不管你喜不喜欢,假设总是决策的一部分。对真实世界数据的适当探索应该包含大量写下的假设,其中数据科学家坦白他们不得不走的弯路。
即使你选择避开统计数据,你也可能在用假设来指导你的行动。为了安全起见,跟踪你的决策所基于的假设是至关重要的。
统计“魔法”是如何发生的
统计学领域为你提供了一整套工具,使你的假设形式化,并结合证据做出合理的决策。(点击这里观看我的 8 分钟统计简介。)
期待一个包含不确定性和概率的分析成为真理的来源是荒谬的。
是的,这就是统计“魔法”是如何发生的。你选择你愿意接受的假设,然后你将它们与数据结合起来,在这个邪恶组合的基础上采取合理的行动。这就是所有的统计数据。

伊卡洛斯插图:来源。
这就是为什么包含不确定性和概率的分析永远不会成为真理的来源。没有秘密的黑暗艺术可以为你做到这一点。
两个人可以从相同的数据中得出完全不同的有效结论!只需要使用不同的假设。
这也是为什么两个人可以从相同的数据中得出完全不同的有效结论!只需要使用不同的假设。统计学给了你一个更深思熟虑地做决定的工具,但是没有唯一正确的方法来使用它。这是一个个人决策工具。
一项研究的好坏取决于你对它做出的假设(T2)。
科学呢?
当一个科学家用统计学得出结论的时候意味着什么?简单地说,他们已经形成了一个观点,并决定与世界分享。这不是一件坏事——科学家的工作就是不情愿地形成观点,这让我对假设这些观点值得一听感觉更好。
勉强形成观点是科学家的工作。
我非常喜欢听取那些比我更有专业知识和信息的人的建议,但是我从来不会让自己把他们的观点和事实混淆。但是,尽管许多科学家精通概率工作,我也见过其他科学家制造足够多的统计混乱,足以持续好几辈子。观点不能(也不应该)说服那些不愿意做出假设的人,那些观点是从证据和相互的混合中得出的——合意的未经检验的假设。
如果你想听更多我对科学和科学家的思考,请阅读 这篇 。
概括起来
最好把统计学看作是在不确定的情况下改变你想法的科学。这是一个帮助你在缺乏信息时做出深思熟虑的决定的框架…并且没有唯一正确的方法来使用它。
不,它没有给你你需要的事实;它给了你所需要的去应对没有这些事实摆在第一位。整个目的是帮助你在一个不确定的世界中做到最好。
要做到这一点,你必须开始做假设。
感谢阅读!人工智能课程怎么样?
如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:
在这里欣赏整个课程播放列表:bit.ly/machinefriend
喜欢作者?与凯西·科兹尔科夫联系
让我们做朋友吧!你可以在 Twitter 、 YouTube 、 Substack 和 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格联系。
接下来
在后续的文章中,我会写假设从何而来,如何挑选“好的”假设,以及测试一个假设意味着什么。如果这些话题让你感兴趣,你的转发是我最喜欢的写作动机。
与此同时,本文中的大部分链接会带你去我的其他思考。不能选择?尝试以下方法之一:
谎言,该死的谎言,还有 STAT101
towardsdatascience.com](/hypothesis-testing-decoded-for-movers-and-shakers-bfc2bc34da41) [## 分析和统计有什么区别?
理解两种完全不同职业的价值
towardsdatascience.com](/whats-the-difference-between-analytics-and-statistics-cd35d457e17) [## 可解释的人工智能不会交付。原因如下。
可解释性并不是信任的最佳基础
medium.com](https://medium.com/hackernoon/explainable-ai-wont-deliver-here-s-why-6738f54216be)
简单 Python 中的 Sardinas-Patterson 算法
检查可变长度代码的唯一可解码性

图片来自皮克斯拜
在关于数据科学的对话中,两个经常被冷落的领域是 信息论 ,研究信息的量化、存储和交流, 编码理论 ,研究代码的属性及其各自对特定应用的适用性。加雷思·a·琼斯和 j·玛丽·琼斯的《信息和编码理论》是对这两个领域的精彩介绍。几年来,我一直把这本书列在我的待办事项清单上(我是在遇到作者的另一本书初等数论后添加的,在宾夕法尼亚州立大学数学 465 中),最近决定打开它,看看它到底是关于什么的。
如题,这篇帖子讲的是撒丁纳斯-帕特森算法 (书中定义为撒丁纳斯-帕特森定理),可以用来判定一个变长码是否唯一可解码。
在我们深入研究算法之前,我们需要给出一些定义。出于可读性的考虑,我将在这里做一些演示,但更严格的定义和所有代码可以在我的 Github 上的笔记本中找到。
定义
出于我们的目的,我们可以把一个代码 C 想象成一组独特的码字,这些码字由一些源字母表中的符号构成。在这篇文章中,我将把我的源字母表限制为{0,1,2},只是为了保持简单,但是我们将看到的代码可以处理更多。本例中的码字将是由至少一个数字组成的字符串,如 012、1201021,甚至只是 0。
码字的长度是该码字中使用的符号序列的长度。例如,码字 0012 的长度是 4,因为它由序列(0,0,1,2)组成。
在许多频道上,没有指示一个码字在哪里结束,下一个码字在哪里开始——这是我们问题的核心。我们得到一串字母,只有代码本身的属性允许我们确定是否可以恢复编码的信息。例如,我们可能需要解释以下符号串:
1202120
如果从代码字构造的每个符号串(例如上面的串)可以被唯一地分解成恰好一个代码字序列,则代码是唯一可解码的。可以很容易地证明,所有字都具有固定长度的代码是唯一可解码的,但是我们对更困难的问题感兴趣——确定码字具有可变长度的代码是否是唯一可解码的。
让我们看几个可能在字符串 1202120 中产生的不同代码,来说明我们所说的“唯一可解码性”是什么意思
唯一可解码的代码
首先,假设 C = {120,21,20}。
我们可以通过找到共享第一个字母的码字来开始解码消息 1202120,在这种情况下,120 也以 1 开始,因此我们可以将该消息“因式分解”为 120.2120。
接下来,我们移动到下一个符号 120。 2 120,并检查是否有任何码字以 2 开头——我们有两个码字,21 和 20,所以我们看看是否找到下一个符号的匹配:120。 21 20。
答对了。
21 是一个有效的代码字,幸运的是,接下来的两个符号 20 也是。我们可以将此消息因式分解为 120.21.20。
不可唯一解码的代码
现在,假设 C = {02,12,120,21,20}。
使用与上面相同的过程,我们可以得到 1202120 的两种不同的因式分解:
12.02.120
120.21.20
因为我们的频道没有告诉我们一个单词在哪里结束,下一个单词在哪里开始,所以我们不知道该用哪个。在特定情况下,这可能是毁灭性的。例如,假设我们像这样编码重要的英语单词:
02 →不是
12 →还没有
120 →清除
21 →至
20 →引爆
我们的信息可以被解读为:
还不清楚
或者
准备引爆
我会让你的想象力来填补这个不幸的场景,既导致这种混乱,又在误译后展开。

图片来自 Pixabay
为了避免这样的歧义,我们需要确保我们使用的代码字集是唯一可解码的。为此,我们有萨丁纳斯-帕特森算法。
定义 C(n)
我将试图说明这个算法是最简单的,最不数学的英语,但是我们需要建立我们的方法来达到它。
首先,提醒一下:
C 是我们感兴趣测试的一组代码字。当我们对我们的信息进行编码时,这就是我们映射到的单词集。在我们上面的非唯一可解码的例子中,C 是{02,12,120,21,20}。我们让 C(0) 等于 C ,我们将归纳定义一个新集合的序列 C(1),C(2),…。请记住,C(n)并不代表 C 作为 n,的函数,而是下标 C_n 的索引。括号是为了以后的可读性。
C(1) 是一组后缀,可以加到 C 中的单词上,以便得到 C 中的另一个单词
例如,0 可以加到 12 上得到 120,所以 0 在 C(1)中。事实上,这是唯一的后缀,它可以添加到 C 中的一个单词,以创建 C 中的另一个单词,因此 C(1) = {0}。下面的代码演示了这一点,它找到了所有可以附加到“a”以在集合{a,an,apple}中创建另一个单词的后缀。
c = set(['a', 'an', 'apple'])
c1 = set()for u in c:
for v in c:
if len(u) > len(v) and u.find(v) == 0:
c1.add(u[len(v):])
c1
# {'n', 'pple'}
我们在外循环中遍历c中的单词,然后(在这种情况下)在内循环中再次遍历单词(当你到达那里时,与下面的例子进行比较)。在每一步,我们检查内部循环的单词是否是代码中的一个单词的开头,如果是,我们就给c1加上后缀。
现在我们已经定义了 C、C(0)和 C(1),我们可以归纳定义 C(n)的更一般的定义:
C(n)是所有后缀的集合,这些后缀可以被添加到 C 中的原始码字之一以创建 C(n-1)中的后缀,或者可以被添加到 C(n-1)中的后缀以创建原始码字之一。
继续我们的 C = {02,12,120,21,20}和 C(1) = {0}的例子,C(2)是可以添加到 C 中的单词以创建“0”的所有后缀的集合(没有后缀),或者是可以添加到 C(1)中的后缀以从 C 创建单词的后缀的集合——唯一的元素是“2”,它可以添加到“0”以创建 02。这意味着 C(2) = {2}。
诸如此类。我们可以将它包装在一个函数中,该函数接受 C 和 n,生成 C(n-1),并执行与上面的函数相同的比较。因此,我们有generate_cn(c, n),我们可以用它来计算 C(3)、C(4)、C(5)和 C(6):
def generate_cn(c, n):
if n == 0:
return set(c)
else:
# create a set to hold our new elements
cn = set()
# generate c_(n-1)
cn_minus_1 = generate_cn(c, n-1)
for u in c:
for v in cn_minus_1:
if (len(u) > len(v)) and u.find(v) == 0:
cn.add(u[len(v):])
for u in cn_minus_1:
for v in c:
if len(u) > len(v) and u.find(v) == 0:
cn.add(u[len(v):])
return cnfor i in [3, 4, 5, 6]:
print(generate_cn(set(['02', '12', '120', '20', '21']), i))# {'0', '1'}
# {'20', '2'}
# {'0', '1'}
# {'20', '2'}
一般逻辑与我们检查的第一段代码相同,但是现在我们必须检查 c 和 c(n-1)中的前缀。
注意在输出中,对于我们的非唯一代码,我们最终会遇到一个输出循环;这是我们在构建撒丁岛-帕特森算法语句所需的最终集合时需要小心处理的事情。
在继续之前,还值得注意的是,如果 C(n)为空,那么 C(n+1)也将为空。考虑下面的代码,它构造了 C(0)、C(1)和 C(2),对于代码{'0 '、' 1 '、' 21'}:
c = set(['0’, '1', '21'])for n in range(2):
print(‘C({})’.format(n), ‘\t’, generate_cn(c, n))#C(0) {‘0’, ‘1’, ‘21’}
#C(1) set()
#C(2) set()
在构造 C(1)时,没有后缀可以附加到 C(0)中的任何单词上,以从 C(1)创建另一个单词。因此,在 C(2)中我们没有什么可追加的。可以想象,这意味着 C(3),C(4),等等也将是空的。
定义(C∞)
理解撒丁纳斯-帕特森算法的最后一块拼图如下:
C(∞) :所有 C(n)的并集,其中 n ≥1。
C(∞)可以被认为是所有可能的后缀的集合,这些后缀从在解码中产生歧义的原始码字中导出。
我们将通过构造 C(1)、C(2)、C(3)等等来计算它,直到发生以下两种情况之一:
- C(n)为空,在这种情况下 C(n+1)将为空,在这种情况下 C(n+2)将为空…以此类推。
- 我们遇到一个 C(n ),它等于先前计算的某个 C(m ),这表明一个类似上面看到的循环。
可以证明,其中一个最终会发生;直观来看,一个有限的源字母表,一个有限的 C,拆原字的方式也一定是有限的。
考虑到这些因素,我们有以下函数:
def generate_c_infinity(c):
cs = []
c_infinity = set()
n = 1
cn = generate_cn(c, n)
print('c_{}'.format(n), cn)while len(cn) > 0:
if cn in cs:
print('Cycle detected. Halting algorithm.')
break
else:
cs.append(cn)
c_infinity = c_infinity.union(cn)
n += 1
cn = generate_cn(c, n)
print('c_{}'.format(n), c_infinity)
return c_infinity
c = set(['02', '12', '120', '20', '21'])
generate_c_infinity(c)
为了检测循环,我们将每个 C(n)存储在一个 Cs 列表中。如果我们遇到一个以前见过的 C(n ),我们就中断循环,如果我们遇到任何空的 C(n ),循环前提条件就失败。
考虑到这一点,加上我们工具包中的这些函数,我们有足够的拼图块来最终组合成唯一可解码性的必要和充分条件,这就是所谓的萨丁纳斯-帕特森算法。

马库斯·温克勒在 Unsplash 上的照片
撒丁纳斯-帕特森算法
一个码 C 是唯一可解码的当且仅当集合 C 和 C(∞)不相交。
稍微解释一下,记住每个 C(n)给我们一个可能产生歧义的后缀,就像我们在 not . yet . clear/clear . to . explode 例子中看到的那样。这个定理的另一种表述方式是
"在原始代码字集中没有产生歧义的后缀."
使用我最喜欢的 set 的属性,将它实现为一个函数非常简单:
def sardinas_patterson_theorem(c):
"""
Returns True if c is uniquely decodable
"""
c_infinity = generate_c_infinity(c)
return len(c.intersection(c_infinity)) == 0def check_decodability(c):
if sardinas_patterson_theorem(c):
print(c, 'is uniquely decodable')
else:
print(c, 'is not uniquely decodable')c = set(['02', '12', '120', '20', '21'])
check_decodability(c)
我们做到了!判定一组码字是否唯一可解码的一个充要条件。
我已经尽了最大努力让普通读者远离大部分数学符号,但是如果你有兴趣阅读更正式的(并从书中整理和稍微改写)定义,或者如果你有兴趣深入笔记本本身,你可以在 my github 上找到它们。
投资组合优化的科学
如何使用数据科学来{重新}分配投资

尼古拉斯·卡佩罗在 Unsplash 上拍摄的照片
来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
不久前,我在为我的博士论文寻找灵感时观看了两门优秀的课程,即金融理论 I 和数学中的金融应用主题,这两门课程都可以在麻省理工学院的开放课件上免费获得。这些课程帮助我思考时间序列数据中的【变化】(我博士的课题)意味着什么。我想确定我已经学完了那两门课程的内容。因此,我决定实现一些产品,包括定价估算器、算法交易器和我将在这篇文章中提出的想法:投资组合优化器。
序文
这一切都始于优化交易机器人的想法。更具体地说,我在寻找能够检测时间序列变化并对不同类型的加密货币市场做出反应的机器人。我想到了创建一个 bot 投资组合的想法,它将研究市场的变化,并分配一个合适的 bot。
在研究交易机器人和实现我自己的想法时,我发现有人在为股票市场实现类似的软件。在后来的交谈中,我发现这个人碰巧和我学了完全一样的课程。当然,这两个课程都提出了这个想法来定量评估更好的资产组合。注意,类似的软件确实存在,比如 PyPortfolioOpt 。我的想法建立在最初发布的 Eiten 之上,这是一个早期的开源项目。以下是我对投资组合优化的看法。
注意,本帖不构成理财建议。如果你想投资,请咨询专业人士。最重要的是,做你自己的研究。
投资组合选择与投资组合优化
首先,选择一组资产进行投资并不等同于对其进行优化。当选择一组资产时,人们在选择他们信任的公司的同时寻求分散投资。在优化方面,人们分析其选择的投资组合,管理投资于每项资产的金额。例如,一个人可以将 5%、30%和 0%投资于三种不同的资产。这是一个试图将风险最小化和/或回报最大化的资源分配问题。
我根据其他人之前选择的股票和我自己的判断选择了一些资产,我将用它们来举例说明我的管道。这些股票是:微软(Microsoft)、亚马逊(Amazon)、北欧美洲油轮(Nordic American Tanker)、美国银行(Bank of America Corp)、达美乐比萨(Domino's Pizza)、迪士尼(Disney)、可口可乐(Coca-Cola)、可口可乐(KO)、好市多(COST)和星巴克(Starbucks)。让我们从我选择的价格图表开始看。

一段时间内选定资产的价格。
随着时间的推移,这些股票似乎表现不错。然而,看价格并不能让我清楚地知道我能赚多少钱。我真正想知道的是,在研究期间,这些资产的回报率是多少。为了找到答案,我计算了每只股票在一段时间内的回报率。我在下图中展示了这个计算。

每项资产的累积百分比回报。
如果我只看价格,我会说亚马逊似乎比其他投资做得更好。当我分析回报时,我能更好地理解 MSFT 和 DPZ 紧随其后。
预测未来价格
我们希望我们的资产在未来表现良好。挑战是:我们不知道未来是什么样子,所以我们需要估计。我们首先将数据分成两组:历史数据和未来数据。请注意,因为我们没有应用机器学习算法,所以我们没有分成训练、验证和测试。
为了估计未来的回报,我们可以使用几种方法,如样本回报、 CAPM 等等。不同的方法会给我们每种资产不同的价格估值。使用估值器,我们可以分析每项资产的估计回报。例如,在下图中,我们可以探究四种不同的方法是如何估算所选资产的过去收益的。

给定我们的评估者,每个选定资产的估计回报
请注意,当我们使用基于百分比收益(又名 get_price_deltas)的估算器时,我们对所有资产的估值都是正值。使用更复杂的方法,如对数标度估计量(又名 get_log_returns),我们可以捕捉到 NAT 在此期间显示的负回报。然后,我们可以将历史数据中的估值与未来数据中的估值进行比较,并计算回报,这样我们就可以评估每种方法,并选择一种方法来计算投资组合权重。我们计算了过去和未来之间的误差,并显示在下图中。

估计方法的平均绝对误差
在上面的分析中,最佳估计量是指数加权估计量(又名 get_predicted_returns)。其过去和未来数据之间的平均绝对误差(MAE)小于 0.1%。因此,我们将选择这个估计量来预测我们的投资组合权重。
协方差
有了回报,我们现在可以估计所选资产的相关性。我们将使用协方差计算来检查哪些资产具有相似的回报。这将使我们能够分散投资,确保我们投资的资产在其他资产表现不佳时能够增长。
再说一遍,市场是动态的,事情一直在变。过去相关的资产将来可能不相关!我们需要找到一个能很好地概括未来数据的协方差矩阵,所以我们比较了几种协方差计算方法。我们在下面展示了一个例子,但是我们支持 OAS [1],Ledoit-Wolf [2]这样的方法。我们还支持基于随机矩阵理论的协方差矩阵清理方法。我不会在这方面赘述,你可以阅读斯科特·罗马的博客文章或者埃德尔曼和饶的精彩课堂笔记。

使用 NumPy 协方差函数计算的协方差矩阵
有了协方差矩阵和权重,我们现在可以应用策略来生成投资组合。策略向目标函数优化。例如,我们可以针对夏普比率进行优化,我们希望在风险和回报之间找到平衡。使用回报和协方差矩阵,该策略将输出每项资产的权重。这些权重可以是正的也可以是负的。正权重意味着策略建议多头,而负权重意味着策略建议空头。多头头寸意味着资产被买入,我们预计回报将是正的(价格将随着时间的推移而上涨)。同样,空头头寸意味着资产被出售,我们预计回报将是负的(价格将随着时间的推移而下降)。你可以在这里阅读更多关于多头和空头头寸。

投资组合中每项资产的每种应用策略的权重
在上图中,我们可以看到每个策略赋予每个资产的权重。然后,我们可以通过计算投入资金与权重的比率,使用这些权重来输出投资组合。
测试我们的投资组合
现在最大的问题是,如果我们使用给定策略的输出进行投资,我们的投资组合表现会有多好?我们可以通过将我们学到的策略运用到数据中来做到这一点。做机器学习的人(像我一样),可能会对此感到畏缩,但没什么好害怕的,我们有部分数据集。请将此视为验证测试。

随着时间的推移,建议投资组合的回报
在上图中,我们可以看到所有提议的投资组合都击败了 S&P500(间谍)基准。众所周知,遗传算法的回报是基准的两倍多。
但我们的投资组合未来会有好的表现吗?
我们将通过两种不同的评估来回答这个问题。首先,我们将对未来价格进行蒙特卡洛模拟。简而言之,这是一种随机方法,我们使用过去的价格来寻找分布,并随机生成未来的价格。

蒙特卡洛试验中生成的投资组合的性能
我们看到,如果价格遵循蒙特卡洛价格,计算出的投资组合继续表现良好。特别是,最大的夏普投资组合(MSR)预测三个月后将超过 0.8%。
我们还留出了 90 天的数据来测试投资组合是否真的可以推广。给定投资组合权重,我们得到以下表现。

生成的投资组合在未来数据中的表现
我们可以看到,生成的投资组合表现接近基准,短期内表现稍差。MSR 的投资组合有时表现优于基准,但也存在差异。我们可以从最后的分析中学到一些东西:多元化很重要。该基准只有来自不同行业的大约 500 家不同公司,而拟议的投资组合只有 10 家。这使得投资组合更容易受到某个行业或某项资产特定变化的影响。选择好的股票甚至比优化更重要!
结论
投资组合优化是一项艰巨的任务,应该谨慎从事。一方面,一些渠道报告称,T2 的大多数基金经理无法跑赢基准,比如标准普尔 500 指数。另一方面,像 Renaissance 这样的基金多年来一直跑赢基准。
最后,投资组合构建甚至比投资组合优化更重要!优化很难,但如果我们试图优化表现不佳的股票,那就更难了。记得做你自己的研究,明智地选择资产,并在下面留下你的掌声。如果你喜欢你所读的内容,不要忘记关注我以获取更多未来的内容。
外部链接
这篇文章中使用的软件是开源的,可以在我的 GitHub 中公开获得。欢迎随时在 LinkedIn 上联系我!对我好奇?这里是我的网站。看看我关于股票价格预测的最新文章。
参考
[1]陈 Y,威塞尔 A,灵族,英雄敖。MMSE 协方差估计的收缩算法。 IEEE 信号处理汇刊。2010 年 6 月 14 日;58(10):5016–29.
[2] Ledoit O,Wolf M .高维协方差矩阵的条件良好的估计量。多变量分析杂志。2004 年 2 月 1 日;88(2):365–411.
[3]埃德尔曼 A,饶 NR。随机矩阵理论。数字行动。2005 年 5 月 1 日;14:233.
[4]穆尼 CZ。蒙特卡洛模拟。Sage 出版物;1997 年 4 月 7 日。
超级成功的科学

图片来自 Unsplash.com(免费)
每次都使用 Python 准确预测如何赢得超级粉碎兄弟终极版。
使用 Ryland Leupold 完成分析。在 GitHub 上找到代码 这里 。
介绍
如果你正在读这篇文章,你可能听说过,玩过,或者看过别人玩超级粉碎兄弟。你也可能在游戏中表现很好,还可以,或者很差(像我一样)。下面的 Python 建模和分析使用了《超级粉碎兄弟终极版》中 73 个可玩角色的角色战斗统计数据,以精确地最大化任何人的获胜机会。觉得不可能打败游戏?继续读。所有的结论和最大化胜利的建议都列在底部。
背景
超级粉碎兄弟终极版是一款由任天堂创建的交叉格斗视频游戏,有超过 70 名来自不同任天堂特许经营的可玩战士。这款游戏非常受欢迎,人们在网上花费数小时创建自己的等级和排名,亲自决定“最佳”超级粉碎角色。
为了进行更定量的分析,关于每个可玩角色的战斗统计数据是从ultimateframedata.com中抓取的,它提供了每个角色的地面、空中、特殊和其他攻击的信息,以及每次攻击的 fps 启动速度(点击攻击启动的控制器后多长时间,以每秒帧数为单位)。

分析

一个关键的主要发现是较轻的角色使用与他们较重的对手相同的击打动作在所有的战斗速度下造成较少的伤害。不管速度如何,只有重的角色才有稳定的击打伤害,这表明他们总是更强大。

另一个关键发现是,任何自降速度的减缓都会导致受到的伤害大大降低。增加移动速度只会对对手造成少量的伤害增加,这意味着移动更慢,协同攻击比跑更好。
也有几个权衡的时间,每一步采取完全执行对手。需要更长时间完成的移动往往有更高的伤害,但会迫使角色在原地停留更长时间;当执行更长的移动时,风险与回报类型的思考。下面举例说明了这种权衡。


建模
为了测试更重的角色总体上更慢但更强大的普遍发现,我们可以分析角色属性如何最好地分类粉碎-移动能力;换句话说,什么样的角色整体扣球能力更高/更强?
使用重量、力量和速度属性将每个角色分类为强或弱类别,我们使用决策树分类器(简单条件预测器)、梯度推进分类器(最小化总体误差)和逻辑回归(关系/预测器的强度)。这三个测试可以全面确认或拒绝我们的发现。

三个模型中的每一个都证实了 73%的准确率在预测角色的粉碎力。每个模型都表明重的体重、中等的倾斜力量和慢的速度是性格力量的最强预测因素。这个证实了一个理论,即更重、更慢的角色是最强大的。
结果和建议
我们可以明确地得出结论,当选择一个粉碎的终极角色时会有权衡,如果这个角色发挥了它的长处,胜利是有保证的。让我们重温一下我们关于较重的角色最强大的结论。单纯选择较重的角色并不能保证胜利。还必须考虑以下因素:
- 重的角色施加更多的伤害,但是速度更慢,更容易被击中。
- 专注预测对手动作用高伤害招式惩罚。
- 持续时间长的招式会造成很大的伤害,但是只有在你确信它们会击中的情况下才使用,否则你就会成为活靶子。
- 最重的人物是布瑟和大金刚。
但这并不意味着只有更重的角色才能确保胜利!我们的速度分析告诉我们,较轻的角色应该按照以下相邻的规则来玩:
- 较轻的角色造成的伤害较少,但是更快也更难击中。
- 重点利用速度躲避对手并利用难以惩罚的快速移动。
- 仅在必要时运行,并尝试缓慢下降以获得更少的损伤/更多的整体给定。
- 最轻的角色是桃公主和吹牛老爹孔。
相信了吗?自己试试这些建议,或者在你自己的超级粉碎兄弟技巧下面发表评论——看看数据是否支持你所说的。
人工智能系统中分析可变性的灾难
走向艾的生产力高原
为什么工作流和管道的标准化对于构建高效可靠的人工智能系统至关重要?

概率论的经典解释中有一个著名的悖论叫做 贝特朗悖论 。伯特兰把一个非常简单的问题表述如下。
在一个圆内接一个等边三角形,然后确定随机选择一条弦使其尺寸大于三角形边长的概率。

感谢:罗伯特·皮什(维基百科 ) CC BY-SA 3.0
他给了三个 有效的论据来解决这个问题,但每一个都产生了不同的结果。如果感兴趣,可以查看维基百科上关于这三个论点的文章。这个悖论的解决源于这样一个事实,即每一个有效的论点似乎都在解决同一个问题,但本质上它们是在解决不同的数学问题。
我将在这篇文章的背景下重新审视这个悖论,但在此之前,需要强调我们目前构建人工智能系统的方式中的一些问题。
在 ICT 行业,工程师越来越多地转向构建人工智能系统,通过解决现有问题和提高流程效率来为客户增加价值。随着深度学习看似成功的应用,专家们确信人工智能的冬天终于结束了。
但是,在建立人工智能系统时,我们至少要处理三个主要问题(各种专家也报道过)。
构建黑盒模型
ML 工程师在不同的抽象层工作。对于打算将其与整个系统集成的工程师来说,底层机器学习算法往往是一个黑匣子。一般来说,一个特定模型的使用伴随着许多很少被验证的假设。
ML 工程师倾向于使用大量开源包。一般来说,在 python 环境的情况下,一个特定的包带有一系列的依赖性。如果达到了预期的结果,那就好,否则就要尝试另一个具有大量依赖项的包。不需要投资去理解为什么某件事行得通,或者为什么行不通。这些软件包没有标准,而且通常没有对这些模型进行严格的测试和评估。这种黑箱方法不利于确保人工智能系统的可靠性。此外,当正确性本身受到质疑时,效率被迫退居二线。
但问题不仅仅是工程师应该遵循的最佳实践。深度学习模型目前在工作中并不透明,它们的底层特征对研究人员来说仍然是一个谜。事实上,实证结果与现有的统计学和最优化理论相矛盾。事实上,据称深度学习研究人员的行为就像中世纪炼金术士试图创造类似于他们试图制造黄金的魔法。
这种缺乏理解也是造成另一个问题的部分原因,这就是缺乏再现性。
缺乏再现性
人们期望一个知名研究者发表的算法在被其他人独立正确地重新实现时会产生相同的结果(无论是人还是机器)。
由于糟糕的学术实践,部分原因是围绕人工智能的炒作,许多研究人员在开发算法时走捷径。例如,最近有研究表明,许多有望超过现有最先进水平的深度学习模型要么未能令人信服地做到这一点,要么通过应用简单的启发式算法,传统的 ML 算法可以在指定的数据集上做同样的事情。另一个渎职的例子是只报告算法多次运行的最佳结果,而不披露差结果的细节。
除了缺乏对深度学习模型的理解,如上所述,研究人员未能解释他们的算法中可以归因于结果改善的部分。这使得另一个研究者很难分析为什么在重新执行时结果会不同。
隐藏的技术债务
当构建人工智能系统时,机器学习组件是微不足道的,而围绕它的“管道”消耗了大部分精力。来自 Google 的 Scully 等人在 2015 年展示了他们的工作,强调了构建 ML 系统的风险因素,由于未声明的数据依赖、纠缠、软件反模式等因素,这可能导致未来的高维护成本。
例如,考虑这样一个场景,其中为了特定目的以日志的形式提取数据。另一组在此基础上构建一个 ML 系统(或多个相互依赖的系统),假设数据将保持其一致性。在某个时间点,如果数据捕获方法或数据本身的性质被更改为适合原始目的,这将导致相关系统层级中的级联故障。
人工智能系统中的分析可变性是什么?
在此背景下,让我们以 ML 系统中的分析可变性的形式来讨论这些问题的主要表现。作为一个动机,首先让我们讨论一下最近在神经成像领域的工作,其中70 个独立团队的任务是使用相同的数据集测试相同的假设集。团队可以灵活使用自己的分析工作流程和管道。最后,由于方法不同,各小组得出的结论有很大差异。这就想起了前面解释过的著名的伯特兰悖论。
这个悖论类似于一个典型的机器学习工程师试图建立一个系统来解决特定的现实世界问题的场景。类似于 Bertrand 给出的三个完全有效的论点,一个用英语给出的问题,但给出的解决方案结果是对应于三个完全不同的数学问题;ML 工程师有责任开发完全不同版本的系统,试图解决相同的问题,但本质上产生不同的结果。
当数据科学家或工程师分析、设计和实施 ML 系统时,上述三个问题以各种方式出现时,这种情况经常发生。
随着人工智能走向生产力的高原,我们预计它将超越脸书、谷歌、推特等互联网公司。并在医疗保健、医药、教育、交通等领域发挥更积极的作用。
考虑卫生部门中的任意场景,其中新疫苗已经成功开发,并且需要推荐系统来识别在第一阶段必须开始接种疫苗的人群。这项活动是最重要的,其风险远远高于推荐系统,推荐系统推荐电影供消遣。如果给三个数据科学家这个任务,他们会提出三个不同的系统,产生非常不同的输出。这样的 AI 系统可靠吗?决策者为什么要相信这一点?
此外,如果同一个数据科学家再次应用相同的流程,是否能保证他会得到相同的解决方案?不出意料,答案是不!— 如上所述,ML 系统面临着大量的再现性问题。
人工智能系统中的这种分析可变性极其危险,因为它直接控制着人们的生活。

潜在步骤
毫无疑问的事实是,最终,人工智能将达到其生产力的高原。但为了在最短的时间内达到这一目标,同时建立决策者的信心,人工智能从业者应对人工智能系统中分析可变性的灾难至关重要。
以下是实现这一目标的三种可能方法。
- 为开发 AI 系统的管道和工作流制定标准。确保作为构建模块的机器学习 API 配备有严格的使用指南。
- 在使用复杂的算法之前,数据科学家或 ML 工程师必须使用传统的 ML 算法或简单的试探法来开发基线。随着时间的推移,这些基线必须在行业中标准化。
- 软件测试人员和他们现有的范例对于‘测试’人工智能系统不是特别有用。应该开发更复杂的对抗性人工智能系统来做到这一点。本质上,它相当于由一组其他人工智能系统测试人工智能系统。这种方法值得单独写一篇文章。
随着我们转向人工智能在警察、医学、农业、安全等领域更负责任的应用。我们必须确保我们构建的人工智能系统是可靠和高效的。
领域知识—作为数据科学家,第二重要的技能。
你可能没有意识到这一点,但是如果你在一个非常具体的专业领域有丰富的经验,你可能有资格成为数据科学团队的一员。

数据科学,直接去构建模型,谁关心领域知识,对吗?
数据科学目前正处于风口浪尖!在谷歌上快速搜索关键词,得到的不是该领域的维基百科页面,而是搜索结果第一页上的数百个教程。
虽然本质上并不是一件坏事,但容易获得的在线学习资源帮助了很多自学者,包括我自己,让我们涉足海洋。没有它,我们就很难理解如何自学。然而令人惊讶的是,我注意到在那些资源中很少提到“D o 主要知识】,即使是简短的。
或许,他们更多的是针对一个月内“学数据学的误导,登顶 Kaggle 排行榜!这是社会迫切需要解决的一个主要问题。大规模在线学习平台没有让人们有能力胜任数据科学的工作,而是制造出无能的“程序员”,他们认为 Scikit-learn 库中的一个简单的 RandomForests 分类器可以解决所有问题!
诚然,基本的统计、数学和编码技能是一些较难掌握的技能,但数据科学家往往忽略了最基本的可行主题专业知识。但相比之下,题材专长才算王道!特别是在特定领域有丰富的工作经验,这可能是他/她最有价值的技能。
领域知识——它如何帮助企业?
与前面提到的相反,请注意大多数 Kaggle 竞赛的参与者并没有任何实质性的专业知识。然而,尽管缺席,他们还是一个接一个地赢得比赛,在排行榜上获得高分。
这是因为,幸运的是,在某个地方,有人足够聪明地思考&简化了做出预测的过程。因此,像 Scikit-Learn 这样的高级预测分析库在后端完成了大部分繁重的工作,然而,这些库足够健壮,即使使用默认参数也能产生令人惊讶的好结果。实际上,只需几行代码,任何一个汤姆、迪克和哈利都能够在数据集上训练一个模型&将其提交给 Kaggle,以最小的努力在排行榜上获得至少前 50%的分数。
另一方面,企业在主要的财务和时间限制下工作,同时试图维持他们在市场中的地位。别忘了,他们进入市场也是为了可持续地为自己创造利润。此外,一般来说,对于大多数企业来说,在内部投资开发特定于他们领域的算法是不可行的。因此,他们雇佣急需的数据科学人员,希望新员工能够帮助解决他们面临的问题。同样,如果机会出现了,就向前迈进,或者可能的话,利用它。
为什么领域知识对数据科学家至关重要?
数据科学家应该记住,领域知识的三个方面相互关联,但又清晰可辨,它们可以在上下文中定义为
- 源头问题,企业正在努力解决和/或利用。
- 企业拥有的一套专门的信息或专业知识。
- 特定领域数据收集机制的确切诀窍。
另一方面,公众对数据科学& ML 有一个相当不幸的误解,即 ML & AI 是神话中的诺亚方舟,致力于解决曾经面临的每一个微不足道的问题。

“机器学习”
作者幽默地将其总结为 xkcd 漫画,其中数据科学家被视为来自霍格沃茨的巫师,拥有名为机器学习的魔杖,能够解决他们面临的任何问题或想要从中获利。【1】
但与普遍看法相反的是,数据科学家需要优先规划可持续的逻辑业务战略,然后实施。打个比方,建造一架穿梭于纽约和东京之间的航天飞机听起来像是一件愚蠢的差事。同样,猫狗分类器也没有任何可持续盈利的商业前景。相反,适应业务部门&获得必要的领域知识将对整个业务更有益,而不是立即构建预测算法的技术诀窍。
第二,也许是数据科学社区中讨论最多的话题是业务所拥有的信息的上下文。这些信息就像罗塞塔石碑,帮助分析师找到更好的方法和/或手段来完成他/她的工作。关于行业和领域的先验信息增强了基于数据集中的可用特征来制作更精确和准确的预测模型的过程。另一个好处是,该模型可以更好地推广到现实世界的情况。
此外,强调特征工程的重要性&这样做如何提高模型的整体准确性是很常见的&是社区各个角落讨论的话题。但是执行适当的和有洞察力的特征工程是一项技能,只有少数有经验的人能够做得很好。
因此,提醒我,我偶然看到了一篇由 Xavier Martinez 发表在—Catalonia GDP:Insights&Regression Analysis的相当有趣的文章,这是一个非常详细的&数据集特征工程组件的主要示例,用于创建更新的列/特征以供进一步分析。他根据数据集的特征工程 GDP 成分预测了加泰罗尼亚的 GDP 增长率&,这表明广泛精通一个领域可以帮助做出非常有洞察力的&精确观察。Xavier 正是这样做的,基于我们经济学家所谓的“需求驱动的增长”。
最后,请注意,当您阅读本文时,全球每秒钟产生 1.7 兆字节的数据,相当于每天 2.5 兆字节的数据。这需要利用和处理大量的数据。理解哪一部分、如何&何时处理那一大块数据是至关重要的。这不仅会降低企业运营中的低效率,而且如前所述,时间&资金是企业最大的制约因素。能够将所需分析缩减到最低限度也有助于降低成本&处理时间。
社区应该更多地谈论领域知识。
因此,我假设可以安全地得出结论,在数据科学角色中关注领域知识的重要性。此外,社区应该宣扬同样的观点,只有这样,企业才能找到胜任其公司数据科学职位的员工。但是请记住,即使有这么多的说教,领域知识也可以在工作中获得,而且也不是什么难事,但是忽视它将是完全不负责任的。
参考资料:
[1] xkcd,机器学习(2017)
【2】Domo,数据从不睡觉 6.0( 2020)
我是一名自由职业的数据分析师,帮助企业了解如何利用他们的数据需求。如果您有任何相关的问题,请随时通过 Twitter 联系我。
此外,如果你喜欢读我的这些文章,你可能会喜欢读这些:
或者,您甚至可以 订阅 我的邮件列表,以便在有新的更新时立即得到通知!
RPA 项目成功的秘诀
在开始 RPA 项目之前,您需要知道一件事,这是项目成功的关键。
RPA 无处不在,感觉任何有数字化转型计划的人都必须有 RPA 战略。RPA 的前景是巨大的,但现实却远没有这么美好。事实证明 RPA 很混乱。很难实施和履行承诺,因此许多 RPA 项目失败,数百万美元付诸东流。为什么?你能做得更好吗?在这篇文章的结尾,你将会知道和理解一个简单的规则,它将会引导你走向成功。

自动化是未来。经济和心理上的收益是显而易见的。“让机器做重复枯燥的工作,让人类专注于智能创造性任务”。这很有意义,因为当任务是重复性的,而机器恰恰相反时,人类表现如此糟糕。从卡车司机到医生,每个人都讨厌重复无聊的任务。不管受教育程度如何,所有人都有创造力和洞察力,我们都喜欢使用它。自动化不是对劳动力的威胁,相反,它是让我们更快乐和更有生产力的希望。
RPA 被定位为可以自动化一切的技术。是吗?让我们深入研究一下,看看 RPA 在故事中的位置。
自动化有几大支柱:集成和流程编排。(还是把成本留到最后吧)。在现代商业中,几乎每个用例都涉及到许多不同的子系统,这些子系统需要和谐地协同工作。为了实现自动化,机器必须能够与这些子系统进行通信并控制它们。这当然不是新的。集成技术在计算的早期就已经存在。企业服务总线、消息队列、RPC 服务、RESTful APIs 只是一个简短的例子列表。但是当感兴趣的子系统在其前端只有一个 UI 时会发生什么呢?UI 只为人类设计。不是给机器看的!只有 UI 的系统破坏了自动化!出于商业或历史原因,许多系统选择不公开 API。如果是你遗留的会计系统或多年前集成的人力资源产品,有许多子系统只有人类才能与之交互。当然,这远非最佳,但这是现实,所以我们该怎么办?
RPA 技术拯救世界。现代 RPA 解决方案具有强大的“录制”引擎,可以学习人类如何与 UI 交互,然后自动执行相同的行为。乍一看,它看起来很完美,因为现在我们可以自动化只有人类才能完成的程序,但稍微深入一点的调查显示了一个根本的区别。机器不“理解”自动化过程的本质。人类有。在应对变化时,这个简单的事实至关重要。即使一个系统完全改变了它的外观和感觉,人类最终也能知道该做什么,因为他们理解环境。这可能需要一些时间和实验,但最终人们会“明白”。现代网站每天都在改变他们的用户界面,没有什么会中断。相反,AB 测试与应用程序表现的设计和功能特别相关,公司收集有价值的反馈来帮助他们改进。对于机器来说,情况就不同了。幸运的是,并不是每个简单的改变都会破坏 RPA 记录。因此,典型的现代 RPA 解决方案使用复杂的方法来识别组成 UI 的组件。因此,如果典型 UI web 表单中的顺序或字段布局发生变化,记录应该不会中断,因为它通过标签或名称甚至输入类型来标识字段,而不仅仅是通过顺序或位置。尽管如此,令人印象深刻的是,打破 RPA 解决方案所需的改变是如此之少。正如我们稍后将讨论的那样,无论您在 RPA 解决方案中投入多少机器学习,它都永远不会有接近人类理解的东西,因此它永远无法模仿人类在需要应对变化时使用的逻辑。
实时数据分析就是要缩小数据收集、分析和行动之间的差距。与……
www.datadriveninvestor.com](https://www.datadriveninvestor.com/2020/07/30/why-is-real-time-data-processing-so-challenging/)
RPA 系统弥补了自动化流程和仅为人类设计的系统之间的差距,但它的方式远非完美。因此,卢旺达爱国军应被视为一种临时的权宜之计,而不是永久的解决办法。只有引入 API 或其他机器友好界面才能被认为是真正的补救措施。这可能是昂贵和复杂的,甚至可能被认为是不可能的,但即使是遗留系统最终也会改变(或被取代)。那时你需要确保下一个版本将包含 API。在此之前,您可以接受 RPA 自动化解决方案,但同时,您需要考虑所有的限制和您引入的脆弱性。
自动化的下一个(也是更重要的)支柱是流程编排。这里我们描述自动化过程的逻辑和流程。日光之下并无新事。每个计算机程序都有一个控制流程。从经典编程语言到图形流程表示和低代码,有许多方法可以对编排进行编程。你决定如何编码你的编排流并不重要,只要它被很好地定义,机器就可以执行它。人类理解上下文,这就是为什么我们可以适应设计时没有考虑到的情况。我们识别实体,将它们映射到现有的知识,然后我们使用深思熟虑,最后,我们应用大量的认知过程来找到要采取的最佳操作集。
到今天为止,机器还做不到这些。机器不像人类那样真正“理解”概念,也不能够基于这种理解开发一系列步骤来解决复杂的问题。显然,这种情况将来会改变,但还有很长的路要走。分类、回归和许多其他机器学习方法是重要和有用的,但我们应该小心不要将它们与人类风格的理解混淆。说到计算解决复杂问题的最佳行动流程,强化学习的目的是教机器做到这一点,简而言之,就是如何找到解决复杂问题(即获得最大回报)的最佳策略(即一系列行动),然而数学表明,这种算法(如马尔可夫决策过程)的复杂性随着构成问题“世界”的状态数量呈指数增长。机器人技术中有令人印象深刻的强化学习实现,例如一个机器人学习如何行走或驾驶直升机,但如果我们想要解决我们在“真实”世界中每天工作时都面临的日常问题,我们将需要我们今天没有的计算机。对认知和符号人工智能的研究可能会在未来给我们一些方法,教计算机人类如此自然地使用的世界知识,但这项研究甚至没有触及需要做的事情的表面。可能要过很多年我们才能到达那里。
为了证明我的观点,我想提一下 OpenAI 于 2020 年 6 月 11 日发布的 GPT-3。这是迄今为止最大的神经网络。其核心是一个语言模型,通过找到最有可能的下一个单词来生成文本。它是在大部分互联网和一个包含了历史上绝大多数文字的书籍语料库上被训练出来的。很难想象一个更大的训练集。结果令人兴奋,但是在那个网络中有真正的智能吗?乍看之下,它可能看起来像是有的。你可以问 GPT-3 几乎任何事情,并得到相当不错的结果。它可以计算算术,编写代码片段,并告诉你历史事实。它甚至可以创作看起来完全由人类创作的原创短篇小说。为了弄清楚 OpenAI 是否创造了第一个真正的类人智能,让我们做以下简单的测试。算术很简单,我们就在那里玩吧。首先,让我们让 GPT-3 解决简单的算术问题与数百的规模的数字。GPT 3 号将以惊人的精确度给出正确的答案。很好,现在让我们重复同样的问题,但是现在用更大规模的数字。随着人数的增长,GPT-3 将会举步维艰。这不是我们对一台真正理解数字和算术运算符含义的机器的期望。一元店最简单的 1 美元计算器以完全相同的计算质量解决数百和数百万数字的算术问题。规模并不重要(只要合理)。计算器不是智能的,我们给它们编了程序来精确地做什么,但是 GPT-3 不是为解决算术而设计的。它只是阅读了世界上所有的书籍,所以我们现在试图弄清楚它是否通过阅读所有这些文本来学习算术?不幸的是,我相信它没有。原来,小数字的算术问题在普通文本中是很常见的。它可能是显式的算术表达式或带有“sum”列的数据表,隐式地告诉 GPT-3 A+b 是多少。含有大数的算术实在是太罕见了,所以 GPT-3 没有学会它。更重要的是,它证明了 GPT 没有应用真正的算术来解决我们提交的练习。它只是计算文本概率。它不像我们一样“理解”世界,因此它不能得出结论或应用认知过程。
今天,能够设计出良好的编排,定义与其他子系统有效集成的流程以处理模糊情况的机器是科幻小说,但请记住:悬浮滑板在“回到未来”中也是科幻小说。人类智能和人工智能有着深刻的不同。不要混淆它们。
我想讨论的最后一点是成本。正如我们所了解的,RPA 解决方案非常脆弱。他们需要你的密切关注和维护。能够执行这种操作的人是昂贵的。您需要在开始 RPA 之旅之前计算成本。另一个隐藏的成本因素是关于责任和可解释性。在一个完全自动化的过程中,你可能会被要求解释为什么你的系统会有这样的行为,特别是当一个利益相关者受到负面影响的时候。这也是有代价的。遗憾的是,这些类型的成本没有出现在 RPA 解决方案产品手册中。
这让我想到了一个简单的规则,它将提高您使用 RPA 的成功几率。在使用技术之前,了解它的局限性和真正目的。RPA 旨在弥合定义良好的流程编排流程与仅公开用户界面的传统系统之间的差距。把它作为一个临时的解决方案,尽可能地通过 API 集成你的系统。不要听信市场营销——让你的架构建立在事实的基础上,尤其是涉及到成本的时候。
秘密神经网络公式
如何在不过度拟合的情况下制作复杂的神经网络!

照片来自创业股票照片。
介绍
为深度学习模型选择正确的架构可以极大地改变所取得的结果。使用太少的神经元会导致模型无法发现数据中的复杂关系,而使用太多的神经元会导致过度拟合效应。
对于表格数据,通常认为不需要很多层,一两层就足够了。为了帮助理解为什么这就足够了,看看通用逼近定理,它(用简单的术语)证明了一个只有一层和有限数量神经元的神经网络可以逼近任何连续函数。
然而,你如何为神经网络挑选神经元的数量呢?
确定神经元的数量
目标是找到正确数量的神经元,以防止过度拟合和欠拟合,当然,这不是防止过度拟合和欠拟合的全部解决方案,但它有助于减少这种情况的发生。
在机器和深度学习中,模型的自由度是可以学习的参数数量。增加模型的自由度可以让模型更灵活地适应更复杂的函数,但是过多的自由度会让模型过度适应数据。
这可以从下图中看出:

拟合前 25 个数据点并用于预测最后 5 个数据点的两条线性回归线。
这意味着减少过度拟合的一种方法是限制模型中的自由度。
我在研究这个问题时发现的一个公式是:

N_h 为神经元数量, N_s 为训练样本数量, N_i 为输入神经元数量, N_o 为输出神经元数量,α为待选超参数。
数据集中的自由度是 N_s(N_i + N_o) ,目的是将模型中自由参数的数量限制在数据自由度的一小部分。如果你的数据是一个很好的代表,这应该允许模型很好地概括,太多的参数,这意味着模型可以过度适应训练集。
Alpha 表示与您的模型相比,您的数据多了多少自由度。有了 alpha = 2 ,你的数据中的自由度将是你的模型中的两倍。建议使用2–10的 alpha 值,您可以循环查找最佳的 alpha 值。
帮助我直观理解公式的一个方法是让 beta = 1/alpha (保持 alpha 在 2 到 10 之间),然后增加 beta 表示复杂度增加。一个更加非线性的问题将需要一个更大的贝塔。
主要规则是保持 alpha ≥ 1 ,因为这意味着模型自由度永远不会大于数据集中的自由度。
例子
这个例子是一个 Jupyter 笔记本,比较了杰夫·希顿在选择一层中的神经元数量时给出的建议。我选择这个建议是因为新手很可能会听从杰夫·希顿的建议,因为他在这个领域很重要。
这丝毫没有偏离杰夫·希顿的建议,而是试图展示如何使用这篇博客文章中提供的公式选择神经元的数量,数据科学家可以在不过度拟合的情况下创建更复杂的神经网络。创建更复杂的神经网络可以带来更好的结果。
杰夫·希顿的建议是:
1.隐藏神经元的数量应该在输入层的大小和输出层的大小之间。
2.隐藏神经元的数量应该是输入层大小的 2/3,加上输出层的大小。
3.隐藏神经元的数量应该小于输入层大小的两倍。
参考
[1]stack exchangehttps://stats . stack exchange . com/questions/181/how-to-choose-the-number-of-hidden-layers-and-nodes-in-a-前馈神经网络中的公式参考
[2]杰夫·希顿的。隐藏层数。 希顿研究。https://www . Heaton research . com/2017/06/01/hidden-layers . html
[3]杰瑞米·霍华德和西尔万·古格。 fastai:深度学习的分层 API。 arXiv 。arXiv:2002.04688https://arxiv.org/abs/2002.04688。2020.
现代神谕的秘方

来源:约翰·科利尔/公共领域
在古希腊,人们相信任何重要的决定都是由神来指导的,因此,人们认为神是通过神谕来说话的——来自拉丁语动词‘orare’(说话)。先知被咨询关于农作物的产量,健康问题,财政财富,等等。现代的甲骨文离开了希腊,改变了服装,并缩小了一个人的重点,以预测公司的收入,客户流失,和公司的销售。有许多预测技术和方法,现代的甲骨文可以用来做到这一点,从德尔菲技术到脚本编写,时间序列预测,但在这篇文章中,我想谈谈时间序列预测与先知。
Prophet 是脸书发布的开源 R 和 Python 库,基于可分解的(趋势+季节性+假期)模型——在这里阅读更多。我在库中最喜欢的是,您可以对周期性事件(如季节性事件)和不规则事件(如节假日)进行建模。想知道如何以互动的形式自动获得你的预测吗?力量 BI 来拯救你。
什么?
Python 库、Power BI Desktop & Power BI Pro(云)、csv/a 数据库连接和个人网关。
怎么会?
第一步。起初,我以为我会带着我的 Python 库离开,但是经过几个小时与'unable-to-import-required-dependencies:numpy'、'unable-to-import-required-dependencies:matplotlib'、'please-install-mkl-service-package'等的斗争之后。我认输了,安装了康达(此处阅读安装指南)。我第二次举起白旗是在安装 Anaconda 之后,我既没有在“默认路径”上安装 Anaconda,也没有将 Anaconda 的 python 设置为默认的 python 命令…嗯,起泡沫,冲洗,重复。
第二步。如果你选择了“只有我”——我就是这么做的,默认情况下,Anaconda 会被安装在C:\Users\{YourUserName}\Anaconda3文件夹中。如果你不确定,在任务栏的搜索框中输入 cmd 然后点击“Enter”打开常规的命令提示符(适用于 Windows 用户),然后输入where python获得 Python 路径。就我而言,我得到了C:\Users\Eka\Anaconda3\python.exe。太好了。
第三步。打开你的 Power BI 桌面> > 文件> >选项和设置 > > 选项,添加你的 Anaconda 路径和 Python 可执行文件的路径。如果你已经创建了一个虚拟环境,请看这里的文章。

更改目录

更改目录 _2
第四步。通过添加您的数据源获取数据。在我的。 pbix ,我已经连接到了一个 csv 文件——当前的解决方案也在数据库连接上进行了测试——它具有“日期”、“值”和“类型”列(参见此处的文件)。
第五步。转到主页> >编辑查询进入超级查询编辑器。

运行 Python 脚本
第六步。将日期列改为“文本”是很重要的,否则,您将得到“microsoft.ole.db.date”错误—是的,在我的例子中,这是一个很大的改动。
在查询编辑器中,点击转换>运行 Python 脚本。

运行 Python 脚本 _2
步骤 7。在脚本编辑器窗口中添加你的代码。我最初的错误是我没有改变‘value’列的类型,所以当我得到新的 float 实际记录时,脚本失败了。下面的脚本很基本,只是为了演示这一点,对于更高级的选项,请参考库文档这里。
# 'dataset' holds the input data for this script
#import libraries
import pandas as pd
from fbprophet import Prophet#convert to pandas dataframe
df = pd.DataFrame(dataset)
df["date"] = pd.to_datetime(df["date"]) #change format of the date column to date
df["value"] = df.value.astype('float') #change format of the column you want to create predictions for to float
df = df.rename(columns={'date': 'ds',
'value': 'y'}) #change the names of the columns otherwise prophet will complain
daily = df.copy()
my_model = Prophet(interval_width=0.95) #create an instance of the prophet class
my_model.fit(daily) #fit the model
future_dates = my_model.make_future_dataframe(periods=12, freq='d') #create empty future dataframe
forecast = my_model.predict(future_dates) #create predictions
forecast_set = forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']] #select only certain fields
df_merged = pd.merge(forecast_set, df, how='left') #merge original dataframe with the predictions
df_merged.columns = ['date','forecast','yhat_lower','yhat_upper','actual', 'type'] #re-name the columns
第 8 步。如果你成功地完成了“起泡、冲洗、重复”的循环,你应该能看到几个表格被创建。点击表格中与“df_merged”相对的超链接,加载与您的实际数据框合并的预测数据框。然后,关闭&应用加载到您的 Power BI 桌面。

加载结果

加载结果 _2
步骤九。根据您的要求创建视觉效果,将工作簿发布到Power BI cloud。

创造视觉效果
第十步。例如,从这里下载并安装个人网关。请记住,您需要个人网关,因为互联网上评论说,您只能通过个人网关运行 Python 脚本。登录到您的 Power BI cloud,确保网关启动并运行。

验证网关
第十一步。为该网关添加数据源,并安排仪表板刷新。说完,我结束了我的循环。
作为一个预言未来的先知,感觉如何?
附言:我没有测试过的:声明“运行超过 30 分钟的 Python 脚本会自动超时。”;如何将每日数据汇总到每周/每月。
非常感谢为这篇文章提供灵感的 Sanjo。
成为数据科学家、人工智能或人工智能工程师的自学之路
不是每个人都有时间在教室里学习数据科学、人工智能或人工智能,也不是每个人都负担得起正式学习数据科学、人工智能或人工智能的费用。

尼克·莫里森在 Unsplash 上拍摄的照片
正如前面副标题中所述,时间和成本是人们在尝试学习数据科学、人工智能或机器学习时面临的巨大障碍。自学是一门艺术,需要自律、奉献和纪律来掌握。如果掌握得当,它能让你灵活地将学习与工作或学校结合起来。然而,当开始学习数据科学、人工智能或人工智能时,开始阶段非常艰难,但相信我,我说这是值得担心的。自学时取得良好进步的关键是按照自己的节奏学习。在这个故事中,我将分享一条道路,希望学习数据科学、人工智能和人工智能的人可以遵循这条道路,并在学习新事物方面取得良好进展。我也将分享我个人使用过的资源的链接,并且毫无疑问可以推荐。
学点数学
虽然这听起来很烦人,但在这个领域它是非常必要的。我认为可以肯定的是,任何阅读这篇文章的人都从高中开始就有一些基础到中级的数学知识。这是一个好的开始,但在数据科学、人工智能和人工智能领域还远远不够。你需要更深入一点,学习一些统计、代数和其他主题的概念。我会编制一个主题和资源列表来帮助你学习数据科学的数学,但这已经在Ibrahim Sharaf ElDen的这篇文章中完美地完成了。
学习编码
作为初学者,不要直接学习为机器学习编写代码,而是要学习编程的核心概念。了解什么是编程,了解现有的代码类型以及如何正确地编写代码。这是非常重要的,因为你将会学到很多基本的概念,这些概念将会伴随你在这个领域的余生。这一步慢慢来,不要急着学习高深的东西,理解这一步的大部分东西会决定你在这个行业会有多优秀。你可以在这里找到一个非常好的视频资源,向你介绍编程和计算机科学。这个视频带你了解编程和计算机科学的所有重要概念。慢慢来,确保你理解它的每一点。
让自己对编程语言感到舒服
如今,数据科学家、人工智能和机器学习工程师使用许多语言来完成他们的工作,最常用的语言是 Python、R、Java、Julia 和 SQL。许多其他语言也可以使用,但我列出的是最常用的语言,原因有很多。
- 如果一个人投入足够的时间去学习并保持一致,他们很容易学习,发展也很快。
- 他们让你用更少的代码做更多的事情。
- 他们有一个围绕他们建立的良好而稳固的社区,可以在你遇到任何问题的时候帮助和支持你。
- 他们几乎拥有你作为数据科学家、人工智能或人工智能工程师在工作中需要的所有库和包。
- 它们是开源的,可以免费使用。
学习多种语言绝对没有错,事实上,知道多种语言是一件好事。然而,在学习编程语言时,你必须慢慢来,尽可能不要同时学习一种以上的语言,因为这可能会让你感到困惑,并让你迷失方向一段时间。慢慢来,一次学一门语言,确保只学你职业需要的那部分语言。我建议你在学习任何其他语言之前先学习 python,因为它是一种相对容易理解的语言。我还建议你在学习数据科学和 AI/ML 的 python 之前,先学习通用 python 。
了解如何获取数据
数据通常不会直接交给你,有时根本没有数据给你,但不管是哪种情况,你必须找到一种方法来获得你可以使用的数据。你工作的单位可能有一个很好的数据收集系统,如果他们有,那对你来说是一个优势。如果没有,你必须想办法获取数据,不是随便什么数据,而是你可以用来实现目标的好数据。获取数据并不直接意味着挖掘数据,它是数据挖掘下的一个过程。你可以在互联网上的许多地方获得免费的开源数据,有时你可能不得不从网站上搜集数据。网络抓取非常重要,我恳求每个人都学习它,因为在你作为数据科学家、人工智能或 ML 工程师的职业生涯中,可能会出现对它的需求。这里有一个很好的网页抓取教程。数据也可能保存在数据库中,因此作为一名数据科学家、人工智能或 ML 工程师,你必须了解一些数据库管理知识,以便能够连接到数据库并直接从数据库中工作。SQL 方面的知识在这个阶段非常重要。你可以在这里学习数据科学的 SQL。
学习如何处理数据
这通常被称为数据争论。这一过程包括清理您拥有的数据,这可以通过对您拥有的数据执行一些探索性的数据分析并剔除数据中不需要的部分来完成。该过程还包括将您拥有的数据组织成您可以使用的形式。这个阶段是数据科学、人工智能或机器学习项目中最令人疲惫的部分。在学习过程中,您将要使用的大多数样本数据都已经过预处理,但是真实世界中的数据可能没有经过任何处理阶段。作为一个有志于在这个领域做得更好的人,你应该找到一些真实世界的数据并解决它。真实世界的数据几乎可以在任何地方找到,但 Kaggle 是一个从全球各地的公司获得真实世界数据的神奇地方。数据争论或处理是一个非常累人的任务,但随着不断的奉献和一致性,它可以是一件非常有趣的事情。你可以在这里找到剑桥大学教授关于数据争论的精彩演讲。
了解如何可视化数据
作为一名数据科学家、人工智能或人工智能工程师,并不一定意味着你的工作场所或团队中的每个人都能够理解你所在领域的技术细节,或者能够从原始数据中做出推断。这就是为什么需要学习可视化数据。数据可视化基本上是指以图形形式呈现数据的过程,以便让任何人(无论他们在数据科学、人工智能或人工智能方面的知识如何)了解数据是关于什么的。有许多可视化数据的方法。作为程序员,编写可视化数据的代码应该是我们的首选方法,因为这种方法既快速又没有成本。编写代码来可视化数据可以通过我们使用的编程语言附带的许多免费开源库来完成。Matplotlib、Seaborn 和 Bokeh 都是我们可以用来可视化数据的 python 库。你可以在这里找到 matplotlib 的数据可视化视频教程。另一种可视化数据的方式是使用闭源工具,如 Tableau 。有许多用于数据可视化的闭源工具,它们用于制作更优雅和复杂的可视化,但它们是有成本的。Tableau 是最常见的一种,也是我个人经常使用的工具。学习使用 Tableau 是我会推荐给大家的。你可以在这里找到一个很好的使用 Tableau 的教程。
人工智能和机器学习
人工智能和机器学习更像是数据科学的子集,因为它们是由数据驱动的。他们指的是通过向机器或其他无生命物体提供经过良好处理的数据,来训练它们像人一样行为的过程。通过逐步教导和引导,机器可以被教会做人类可以做的许多事情。把这种情况下的机器想象成完全没有知识但被逐渐教会识别物体、说话、从错误中学习并变得更好的婴儿。机器也可以用同样的方式被教会去做大部分的事情。人工智能和人工智能基本上是通过使用许多数学算法给机器带来生命。人工智能和机器学习的全部潜力仍然未知,因为它是不断改进的领域之一。但目前,人工智能和人工智能广泛用于认知功能,如对象检测和识别、面部识别、语音识别和自然语言处理、欺诈和垃圾邮件检测等。我将把人工智能和人工智能的深入介绍留给另一个故事,但现在,我想让你在这里了解人工智能和人工智能的一般应用,并从这个视频资源中深入研究机器学习。在这些视频结束时,您应该已经掌握了关于机器学习的初级到中级知识,了解了许多可用的机器学习算法,它们的作用以及如何使用它们。现在你应该已经准备好建立你的第一个简单的机器学习模型,你可以在的帮助下完成。
了解如何在互联网上使用您的机器学习模型
通过部署,您使用机器学习构建的模型可以供互联网上的每个人使用。要做到这一点,需要对 web 开发有很好的理解,因为你必须创建一个或一组网页来存放你的模型。网站的前端也需要与包含模型的后端进行通信。为此,你还需要知道如何构建和集成 API 来处理网站前端和容纳机器学习模型的后端之间的通信。如果你打算通过管道或 docker 容器在云服务器上部署你的机器学习模型,你可能需要对云计算和 DevOPs 有很好的理解。有许多部署机器学习模型的方法,但首先,我建议您学习如何使用 python web 框架 Flask 部署机器学习模型。一个很好的教程可以在这里找到。
给自己找个导师
自学是令人惊奇的,但是没有什么比直接向业内专业人士学习更好的了。这是因为你可以学到真实的生活概念和其他只有亲身经历才能传授的东西。有一个导师有很多好处,但并不是每个导师都能对你的职业生涯或整个生活产生影响。这就是为什么有一个好的导师很重要。 Notitia AI 是一个很好的平台,可以在数据科学、人工智能和机器学习方面从初学者到专家水平进行培训,在这里你将被指派一名私人导师,他将在个人和专业方面为你在所选领域的成长做出贡献。这也是你能找到的最实惠的虚拟培训和指导平台。
注意,仅仅参加课程和从在线资源中学习不会让你成为数据科学家、人工智能或 ML 工程师。你必须获得提供这些领域认证的机构的认证,一些工作岗位也需要你有一些学位。花点时间去学习,获得证书或学位,你将为行业做好准备。
希望你喜欢这个故事,对你有所帮助。感谢您抽出时间阅读本文。请分享你对这个故事的想法和意见,并在你认为我做错的地方随时纠正我。我是人,因此,我容易犯错误。你可以直接在推特或 LinkedIn 上联系我。你也可以联系我,建议你希望我在后续报道中写的话题。祝你有美好的一天。
非常感谢安娜·阿伊库校对并纠正了我写这篇文章时犯的许多错误。
自助神话
以及数据民主的需求层次

TL;速度三角形定位法(dead reckoning)
建立数据民主很困难,但并非不可能。没有工具可以修复文化之类的东西或为您创建流程,但是任何工具与您业务的这些部分的集成程度都可以决定您的数据民主是成为新的现实,还是只是一个失败的实验。
数据有区分观点和偏好的诀窍,但有一样东西我们似乎都想要:数据民主。无论你是分析师、首席执行官还是企业用户,将“数据的力量”带给人们的想法都非常吸引人。
然而很少有公司能达到这个目标。就像他们的政治表亲一样,数据民主几乎不可能正确。
那么,为什么数据民主会失败呢?你如何避免同样的错误?
在过去的 10 年里,我一直在大型和小型公司的数据团队中工作,并参与了许多数据民主化计划。在过去的几年里,我有幸与数百家公司讨论过这个话题。
在梳理这些经历时,我震惊地发现,这些公司中有多少曾经充满热情并决心让他们的团队能够使用数据,但最终却满足于更少的东西。事实上,他们中的许多人都有如此痛苦的经历,以至于他们最终转向了完全相反的方向:一个高度控制的数据环境,用户只能从少数报告中获得数据,甚至很少有人被允许进行自己的分析。
对于这些公司中的大多数来说,许多失误导致他们放弃了数据民主愿景,但第一个失误却惊人地一致。他们采用了市场上众多自助分析选项中的一个,并假设仅一项就能实现他们的愿景。
剧透:没有。
我为你做了笔交易!
自助服务分析是商业智能(BI)的一种形式,支持并鼓励业务线专业人员在名义上的 IT 支持下自行执行查询并生成报告—高德纳[1]
过去十年见证了自助式分析工具的爆炸式增长。这些工具承诺了一种非常简单的数据分析体验,以至于你公司的任何人都可以像专家一样分析数据。没有编程语言。没有包裹。没问题。听起来相当完美…
难怪公司会将这些工具作为数据民主之旅的第一步。但在我的研究中,我发现投资自助服务解决方案的公司很难真正实现用数据赋予员工权力的目标。那么,这到底是哪里出了问题?
陡峭的学习曲线
在大多数自助工具中,简单的事情很容易,但中等难度的事情却非常痛苦。
这意味着一旦所有的基本分析都完成了,就很难再继续深入挖掘寻找答案了。用户可能会看到销售额呈下降趋势,但他们可能无法找出为什么。
你的数据一团糟。
这当然让我们看到了你的数据!通常,获得自助服务工具的公司还没有投资让他们的数据对典型的商业用户可用。所以最初的几个月(几年?)仍然需要分析师创建大量定制视图,并回答关于他们应该使用哪个版本的“user_id”的相同问题。
你跳过了最基本的。
人们很容易认为,当被问到时,我们都会记得我们在高中学到的东西,但事实并非如此。如果你已经 10 多年没有考虑过均值和中值之间的区别,你可能不习惯在给老板的报告中选择哪一个。对于大多数商业用户来说,知道做什么比如何做更具挑战性。
你的文化和流程不支持。
在这一点上,您的业务用户感到非常害怕,完全没有权力,即使他们知道他们应该像过时一样分析数据。最糟糕的情况是没有人提到他们的挫折,但他们经常这样做,但这不是人们想听到的。毕竟,他们刚刚在一个本应使分析变得简单的工具上投入了大量资金,而且很可能被一份合同锁定,所以这并不是什么好消息。
有了后知之明,我们可以考虑事情可能会有什么不同…
在你毁掉自己之前,先检查一下自己
自助服务工具专注于简化用户查询和可视化数据的方式,很大程度上忽略了其他一切。需要说明的是,他们中的大多数在这一部分做得相当好。这并不能解决你的大部分问题。
在投资任何工具之前,考虑实现数据民主所涉及的其他因素是很重要的。通过我们的研究,我们已经确定了一个数据民主需求层次结构,它对这些要素进行了优先排序,并为您提供了一种更现实的方法来评估您的选项。

在我们的研究中,我们排除了数据科学和人工智能领域,因为它们产生了自己的挑战,并专注于如何使业务用户能够使用数据做出他们需要的决策。虽然这些层中的每一层都有自己的一篇文章(敬请关注),但下面有对每一层的简要介绍:
文化👐
原型和透明 FTW
为了使这种转变成功,文化需要能够容忍一些失败。特别是你的团队和领导,应该准备好重复这个过程,在报告中看到“坏”的数字,尝试不起作用的过程,等等。成长从来都不容易,但如果每个人都认同最终目标,那就值得了。
建议:改变文化是出了名的困难,与其说是一门科学,不如说是一门艺术,但是这篇文章【HBR】有一些实用的技巧。
处理🗺️
早点开始;翻新很难
过程是任何文化的支架。在这里,你要弄清楚如何让用户觉得他们的声音被听到了,让他们觉得把数字弄对没有学习过程重要。其中的关键部分是找到将数据团队与业务整合的方法,而不是使用自助服务工具来进一步分离它们。
建议:定期 KPI 评审 与业务&数据团队
数据基础🔤
教概念,不教工具。
这个阶段开始将短暂的文化与具体的数据联系起来。它包括回顾 KPI 的含义,和对数据更基本的理解。您不需要教每个人 SQL,甚至什么是关系数据库,但只要让他们能够舒服地询问他们负责的指标,并得到他们需要的答案就足够了。
建议:我在下面写了一些想法。尝试根据您公司的数据和指标对其进行定制。
以及如何修复它
medium.com](https://medium.com/count/why-your-data-literacy-training-isnt-working-158122b43181)
数据模型🥇
以业务为中心构建
是的,您需要为您的业务用户构建简化的视图。是的,你需要广泛地记录它们。但更重要的是,他们需要了解这些领域如何与他们现有的世界联系起来。这意味着你需要和他们坐下来,帮助他们弄清楚如何建造他们想看的东西。在几次这样的会议之后,你会开始找到一些可以为他们服务的静态视图..直到他们的问题变得更加复杂,他们需要更多。顺便说一下,那是一个好的标志。
建议:利用数据字典,向任何需要的人公开你的数据模型
数据分析📊
让用户能够使用数据做出决策
最后,你如何从这些数据中提取一些你现在理解并有信心使用的意义?一旦解决了以上所有问题,你会惊讶地发现这一步是多么简单。这里的例子很多,所以要确保有足够多的好例子,用户可以复制并开始试验。关键是用户必须能够理解他们得到的报告,识别问题,和能够使用数据找到解决方案。专注于帮助用户利用数据做决策,而不仅仅是拿出数字。
建议:从他们已经熟悉的关键绩效指标开始,与他们一起理解数据是如何呈现的,以及他们如何挖掘这些数据以了解更多。
展望未来
希望现在已经很清楚了,没有什么灵丹妙药可以让你的公司瞬间变成一个高效的数据民主国家。然而,工具确实发挥了巨大的作用。选择正确的方法与让你的文化和流程正确同样重要。
堆叠在堆叠在堆叠上
对于公司来说,为流程的每个部分选择由不同工具组成的数据堆栈是很常见的:收集数据、转换数据、存储数据、分析数据和元数据。这种方法成本高、耗时,并且需要大量开销来管理单独的工具。如果你能管理它,你越能利用单一的工具,你的数据民主就越好。更少的工具意味着端到端的流程更容易遵循——黑箱更少,事情更透明。随着您的成长,您可能需要扩展到更专业的工具,但是如果可以的话,简单的堆栈也有好处。
如果你想建立一个数据民主,上面解释的层次结构提供了一个很好的基准来评估你的选择。
快速环顾四周
随着新工具的不断涌现,这个领域正在快速变化。也就是说,有几组玩家是一致的:
- 仅 SQL 查询构建器:市场上最常见的工具,这些工具仅触及金字塔的最顶层。我不鼓励您从这里开始,但是如果您觉得您已经完成了金字塔的其余部分,并且您的团队已经很擅长 SQL,那么它们可能会起作用。
- 基于模型的方法:这些工具在层次结构上更进一步,它们允许数据定义和一些数据建模功能,因此您可以使更多的 ETL 过程对业务透明。
- 一体机:提供端到端功能的工具甚至更少,这意味着您可以在一个地方存储、建模、记录和可视化。特别是小团队,可以从快速采用一体化工具而不是长时间使用几个独立的工具中获益。
在过去的几年里,我一直是开发这种工具的团队的一员。您可以在此了解我们的更多信息:
组合、组织和可视化数据的最快方式。Count 是您和您的……
包装它
总之,建立一个数据民主很困难,但并非不可能。没有任何工具可以修复文化之类的东西或为您创建流程,但任何工具与您业务的这些部分的集成程度都可以决定是将[数据]的力量带给人们,还是我们都希望避免的数据锁定噩梦。
从头开始建立数据团队?我们有这方面的时事通讯。报名 这里 !
参考
[1] Gartner 词汇表:自助服务分析(2020) ,Gartner.com
机器学习的七宗罪
打破你的机器学习实验可信度的七个常见错误

不要屈服于机器学习的七宗罪!Maruxa Lomoljo Koren 从 Pexels 拍摄的照片。
机器学习是一个伟大的工具,它正在彻底改变我们的世界。在许多伟大的应用中,机器,特别是深度学习,已经显示出比传统方法优越的多。从用于图像分类的Alex-Net到用于图像分割的U-Net,我们看到了计算机视觉和医学图像处理的巨大成功。尽管如此,我每天都看到机器学习方法失败。在许多这样的情况下,人们会陷入机器学习的七宗罪之一。
虽然所有这些问题都很严重,并会导致错误的结论,但有些问题比其他问题更严重,甚至机器学习专家也可能在对自己的工作感到兴奋时犯下这样的错误。这些错误中的许多很难发现,即使对于其他专家来说也是如此,因为你需要详细查看代码和实验设置,以便能够找出它们。特别是,如果你的结果好得令人难以置信,你可以用这篇博客文章作为检查清单,以避免对你的工作得出错误的结论。只有当你绝对确定你没有陷入这些谬论的时候,你才应该向同事或公众报告你的结果。
原罪 1:滥用数据和模型

过度拟合会产生完美解释训练数据的模型,但通常不会推广到新的观察结果。下图 CC BY 4.0 来自深学学讲。
这个罪是深度学习初学者经常犯的。在最常见的情况下,实验设计是有缺陷的,例如,训练数据被用作测试数据。使用简单的分类器,如最近邻,这立即导致对大多数问题的 100%识别率。在更复杂和更深入的模型中,它可能不是 100%,而是 98–99%的准确性。因此,如果你在第一次拍摄中获得如此高的识别率,你应该始终 仔细检查你的实验装置。但是,如果您使用新数据,您的模型将完全失效,您甚至可能产生比随机猜测更差的结果,即比 1/K 更低的准确性,其中 K 是类的数量,例如在两类问题中低于 50%。同样,您也可以通过增加参数的数量来轻松地使您的模型过拟合,以便它完全记住训练数据集。另一种变体是使用不能代表您的应用程序的太小的训练集。所有这些模型都可能会在新数据上出现问题,即在实际应用场景中使用时。
罪恶之二:不公平的比较

不要在比较中有失公允。您可能会得到想要的结果,但是这些结果可能无法在其他数据上重现。图片由 Elias Sch 提供。来自 Pixabay 。
即使是机器学习方面的专家,也可能陷入这种罪恶。如果你想证明你的新方法比最先进的方法更好,这是典型的承诺。特别是研究论文经常屈服于这一点,以说服评论者他们的方法的优越性。在最简单的情况下,您从某个公共存储库中下载一个模型,并在没有微调或适当的超参数搜索的情况下使用该模型,该模型是针对手头的问题开发的,您调整了所有参数以获得测试数据的最佳性能。文学作品中有许多这种罪恶的例子。最近的一个例子是 Isensee 等人在他们的 not-new-net 论文中披露的,他们在论文中证明了最初的 U-net 在 10 个不同的问题上几乎优于 2015 年以来对该方法提出的所有改进。因此,您应该始终对最先进的模型执行与您应用于新提出的方法相同的参数调整。
原罪 3:微不足道的改进

显著性测试确保你不是在报告沧海一粟。图片来自皮查拜的费利克斯米特迈尔。
在做了所有的实验后,你终于找到了一个比最先进的模型产生更好结果的模型。然而,即使在这一点上,你还没有完成。机器学习的一切都是不精确的。此外,由于学习过程的概率性,你的实验会受到许多随机因素的影响。为了考虑这种随机性,您需要执行统计测试。这通常是通过使用不同的随机种子多次运行您的实验来执行的。这样,您可以报告所有实验的平均性能和标准偏差。使用显著性检验,比如 t 检验,您现在可以确定观察到的改进仅仅与机会相关的概率。这个概率应该至少低于 5%或 1%,才能认为你的结果是有意义的。为了做到这一点,你不必是一个专家统计学家。甚至有在线工具来计算它们,例如用于识别率比较或相关性比较。如果您运行重复实验,请确保您还应用了 Bonferroni 校正,即您将所需的显著性水平除以相同数据的重复实验次数。关于统计测试的更多细节,你应该查看我们深度学习讲座的这个视频。当然,显著性测试是第一步,更好的是提供更精细的统计数字,如置信区间。
原罪 4:混杂因素和不良数据

尺寸缩放后,用两个不同的麦克风录制了 51 个扬声器。每个点代表一个记录。该数据变化的主要因素是麦克风的差异。下图 CC BY 4.0 来自深 学 讲座。
数据质量是机器学习的最大陷阱之一。它可能会引发严重的偏见,甚至导致种族歧视。然而,问题不在于训练算法,而在于数据本身。作为一个例子,我们展示了使用两个不同麦克风的 51 个说话者的降维记录。因为,我们记录了相同的说话者,如果给定适当的特征提取,他们实际上应该被投射到相同的点上。然而,我们可以观察到相同的记录形成两个独立的簇。事实上,一个麦克风直接位于说话者的嘴部,另一个麦克风位于大约 2.5 米远的记录现场的摄像机上。通过使用来自两个不同供应商的两个麦克风,或者在医学成像环境中通过使用两个不同的扫描仪,已经可以产生类似的效果。如果您现在在扫描仪 A 上记录了所有病理患者,在扫描仪 B 上记录了所有对照受试者,您的机器学习方法可能会学习区分扫描仪,而不是实际的病理。你会对实验结果非常满意,产生了接近完美的识别率。然而,你的模型在实践中会完全失败。因此,请避免混杂因素和不良数据!
原罪 5:不恰当的标签

每个训练实例一个标签通常不足以理解问题的复杂性。如果向多名评核人展示(蓝色分布),有些情况可能会产生许多不同的标签,而其他情况下所有评核人会产生相同的标签(红色曲线)。来自 Pixabay 的马克塔·马乔瓦的图片。
普罗泰戈拉已经知道:“万物的尺度是人。”这也适用于许多分类问题的标签或基本事实。我们训练机器学习模型来反映人为的类别。在很多问题中,我们在定义类的时候就认为类是明确的。当我们查看数据时,我们发现它经常包含模糊的情况,例如,在 ImageNet 挑战中,一个图像显示两个对象,而不是一个。如果我们去研究复杂的现象,比如情绪识别,那就更加困难了。在这里,我们意识到在中,许多现实生活中的观察情绪甚至不能被人类清楚地评估。为了得到正确的标签,我们需要询问多个评分者并获得标签分布。我们在上图中对此进行了描述:红色曲线显示了清晰案例的尖峰分布,即所谓的原型。蓝色曲线显示了模糊案例的广泛分布。在这里,不仅是机器,还有人类评分员都可能以相互矛盾的解释而告终。如果你只用一个评定者来创造你的基本事实,你甚至不会意识到这个问题,这个问题通常会引起关于标签噪音以及如何有效处理标签噪音的讨论。如果您可以访问真实的标签分布(当然,这是很昂贵的),您甚至可以证明您可以通过删除不明确的情况来显著提高您的系统性能,例如我们在表演情感与现实生活情感的情感识别中看到的。然而,在您的实际应用中,情况可能并非如此,因为您从未见过不明确的情况。因此,你应该选择多个评定者,而不是一个人。
原罪 6:交叉验证混乱

不要使用相同的数据来选择您也用于评估的模型和特征。图片来自的。
这几乎与第一项罪相同,但它是伪装的,我甚至在几乎提交的博士论文中看到过这种情况。所以即使是专家也可能上当。典型的设置是,在第一步中,您有一个模型、架构或特性选择。因为您只有几个数据样本,所以您决定使用交叉验证来评估每一步。因此,您将数据分成 N 个折叠,选择 N-1 个折叠的特征/模型,并在第 N 个折叠上进行评估。重复 N 次后,计算平均性能并选择性能最好的特性。现在,你已经知道什么是最好的特性,你可以继续使用交叉验证为你的机器学习模型选择最好的参数。
这似乎是正确的,对不对?不要!它是有缺陷的,因为你已经在第一步中看到了所有的测试数据,并对所有的观察值进行了平均。因此,来自所有数据的信息被传递到下一步,您甚至可以从完全随机的数据中获得极好的结果。为了避免这种情况,您需要遵循一个嵌套过程,它将第一步嵌套在第二个交叉验证循环中。当然,这是非常昂贵的,并产生了大量的实验运行。请注意,只是由于您正在对相同的数据进行大量的实验,在这种情况下,您也可能只是由于偶然的机会而产生一个好的结果。同样,统计测试和 Bonferroni 校正也是强制性的(参见 Sin #3)。我通常会尝试避免大的交叉验证实验,并尝试获得更多的数据,这样你就可以进行训练/验证/测试分割。
原罪 7:过度解读结果

让别人来庆祝你的工作,不要自己去做。照片由 Rakicevic Nenad 从 Pexels 拍摄。
除了之前所有的罪,我认为我们在机器学习中经常犯的最大的罪,现在在当前的炒作阶段,是我们过度解释和夸大了我们自己的结果。当然,每个人都对机器学习创造的成功解决方案感到高兴,你完全有权利为它们感到骄傲。然而,你应该避免根据看不见的数据或状态来推断你的结果已经解决了一个问题,因为你已经用相同的方法解决了两个不同的问题。
此外,由于我们在《原罪 5》中所做的观察,声称超人的表现引起了怀疑。你如何超越你的标签的来源?当然,你可以在疲劳和注意力集中方面打败一个人,但在人造课上胜过人类?你要小心这种说法。
每一个主张都应该以事实为依据。你可以假设你的方法在讨论中的普遍适用性,清楚地表明你的推测,但是要真正声称这一点,你必须提供实验或理论证据。现在,很难让你的方法得到你认为它应得的知名度,陈述大的主张当然有助于推广你的方法。尽管如此,我建议留在地面上,坚持证据。否则,我们可能很快就会迎来下一个人工智能冬天,以及前几年已经存在的对人工智能的普遍怀疑。让我们在当前的周期中避免这种情况,并坚持我们真正能够证明要实现的目标。
当然,你们大多数人已经知道这些陷阱。然而,你可能想时不时地看看机器学习的七宗罪,只是为了确保你仍然在地上,没有上当:
原罪#1:数据和模型滥用——分割训练和测试,检查过度拟合!
原罪之二:不公平的比较——同时调整基线模型!
原罪 3:无关紧要的改进——进行显著性测试!
原罪 4:混杂因素和不良数据——检查您的数据&采集!
原罪 5:不恰当的标签——使用多个评分者!罪恶 6:交叉验证混乱——避免过多的交叉验证!
罪过 7:过度解读结果——坚持证据!
如果你喜欢这篇文章,你可以在这里找到更多文章,在这里找到更多关于机器学习的教育材料,或者看看我的深度 学习 讲座。如果你想在未来了解更多的文章、视频和研究,我也会很感激你在 YouTube、Twitter、脸书、LinkedIn 上的鼓掌或关注。本文以 Creative Commons 4.0 归属许可发布,如果引用,可以转载和修改。
可疑或不太可疑的情报世界
这篇文章从一个潜在投资者的角度出发,深入探讨了情报贩子和体育博彩行业的世界

Lionello DelPiccolo 在 Unsplash 上拍摄的照片
如果从正确的角度来看,体育博彩行业可能会提供一个未被发现的投资机会,而不仅仅是一个赌徒的平台?根据个人经验以及统计和数学模型,我试图回答一些紧迫的问题,例如:
- 追踪一个举报人的账户能获得令人满意的投资回报率吗?
- 投资线人账户有什么风险?
三个主要人物
赌客:通常是对体育赛事的结果下金钱赌注的人
收受赌注者:收受赌注者是以约定的赔率接受和支付体育和其他赛事赌注的组织或个人。
告密者:告密者是指定期在互联网网站或专门的博彩场所提供有关体育赛事可能结果的信息的人。
线人帮助赌客识别体育博彩市场的隐藏价值。如果一个市场有“价值”意味着什么?当市场的隐含赔率高于或低于情报提供者确定的市场赔率时,情报提供者认为市场具有价值。
让我们来看一个例子:镇上有一家新的博彩公司,他是第一个推出十字军 vs 蓝调市场的人。他们为十字军打败蓝军提供了 1.80 的赔率。那就是一个隐含概率 1/1.80100 = 55.5%。*情报贩子注意到这个市场,他的第一印象是这个市场提供价值。这种印象之后是对过去比赛、当前状态、首发阵容、天气预报、比赛裁判等的严格研究。在这个例子中,研究证实了情报提供者的第一印象,并表明十字军大约有 70% 赢得比赛,而不是 55.5% 。如果消息人士是对的,那么在十字军身上下注 1.80 美元肯定是有价值的。根据爆料者的说法,正确的赔率应该更接近于 1.43 。
最好的情报提供者通常致力于某项运动,每周花费数小时研究市场,以确定提供最大价值的市场,然后将他们的情报提供给他们的订户。投注者使用这些线人帐户试图在体育博彩行业中获得对庄家的优势。
可以把线人账户想象成新手交易员的 etoro 账户。简而言之,休闲投注者宁愿每月支付费用,以反映一个声誉良好的情报,研究哪个体育博彩市场拥有最佳价值(如果有的话),而不是自己做艰苦的英里。同样, etoro 允许新手交易者自动模仿领先交易者。
贪婪和假设的危险
这一切对我来说听起来很容易。当我涉足体育博彩时,我在 Twitter 上搜索消息灵通人士的账户。假设和我开始从体育博彩中赚钱的渴望让我确信,从长远来看,模仿拥有最多追随者的线人一定是有利可图的。令我吃惊的是,我错了。我得到了一个惨痛的教训,没有适当的尽职调查,这是一个肯定会捐钱给庄家的方式。
数学占了上风
如何对线人进行适当的尽职调查?很快就变得很明显,决定一个线人账户生存能力的两个主要变量是他们小费的准确性和平均几率。让我们更详细地探讨这两个概念。小费准确性不言自明:它是成功小费的数量(导致庄家支付的小费)除以小费者提供的小费总数。这可以显示为小数或百分比。
赔率通常以十进制赔率的形式表示,代表博彩公司在成功选号的情况下将付给投注者多少钱。
让我们来看一个例子:一家博彩公司可能提供 1.80 的赔率支持蓝军击败红军。这意味着,如果一个玩家在这个市场下注 $100 ,那么在成功选择的情况下,他们将赢得总计 $180 (包括他们的股份)的 ROI 为 80% 。
平均赔率是情报提供者提供的所有市场赔率的平均值。
例如,情报提供者账户可能提供以下三个市场的情报
- 蓝军以 1.80的赔率击败红军
- 蓝军 vs 红军,总积分超过 52.50 赔率为 1.70
- 蓝军 vs 红军,蓝军以超过 3.5 的赔率尝试 1.85
这三个市场的平均赔率为 1.78
可以清楚地看到为什么平均选择准确率和平均几率都是至关重要的。在平均赔率为 1.05 的情况下,选择准确率为 80% 的情报贩子远不如在平均赔率为 20.00 的情况下,选择准确率为 30% 的情报贩子有利可图。
风险和回报——我的 7 个问题
因此,像大多数谨慎的投资者一样,我们应该在风险和回报之间寻找完美的平衡。潜在投资者可能会提出如下问题:
- 长期盈利能力。如何确定情报提供者在一段特定的时间内或挑选后是否会长期获利?
- 精度波动。如果情报贩子的拣货准确率从 74% 下降到 65% ,对盈利能力会有什么影响?
- 斗气波动。如果市场上的平均赔率从 1.85 下降到 1.75 会发生什么?
- 失去条纹。情报贩子继续连败的可能性有多大?即对于一个 Y 投注样本,连续错得 X 投注金额的概率是多少?
- 风险厌恶。我应该在每个提示上下注占我账户总余额的百分比(姑且称这个百分比为【Z】)以及增加Z 会如何影响我在一段特定时期或若干次挑选中的风险敞口和期望值。
- 正收益概率。如果我的起始资金是 P 在一段特定的时间或选股后,以 3P 结尾的概率有多大?
- 负收益概率。如果我的起始资金是 P 在一段时间或若干次挑选后,以 0.5P 结束的概率是多少?
预期值
作为一个潜在的投资者,这些对我来说都是重要的问题。为了回答问题 1-3,我使用了一种叫做期望值的概率理论。简而言之,期望值(EV)是一个变量的预测值,计算方法是所有可能值的总和乘以其出现的概率。所有的计算都强烈依赖于之前讨论的两个变量,即线人的小费准确性和他们小费的平均市场赔率。
足够的样本量
在这一点上,一个谨慎的投资者可能会想:“如果线人账户只提供了几个他们都发现了的提示,那会怎么样?这将意味着他们有一个 100%的偏斜选择准确性。这个值肯定不能作为所有未来预测的指标吧?”
潜在投资者再次提出了合理的担忧。为了对情报提供者的选择准确性有信心,应该确保计算中使用了足够的样本量。如上例所示,小样本量不能用于精确预测。有关确定适当样本量的更多信息,可以阅读了解二项式分布的置信区间。根据经验,在计算情报提供者的选择准确度时,建议使用至少有 100 个数据点的数据集。
马尔可夫的奇妙世界
为了回答问题 4 ,我回复到使用马尔可夫链。马尔可夫链是非常强大的、随机的数学系统,在各种行业中用于对达到给定状态的概率进行建模。马尔可夫链用于经济学、遗传学、金融以及谷歌搜索引擎的排名算法。马尔可夫链不仅允许我们精确地模拟连续得到 X 数量的选号的概率,对于 Y 选号的样本是错误的?它还可以确定自动交易机器人在一个 Y 交易的样本中获得 X 错误/正确交易量的概率。
全押加注
问题 5 的答案在于投资者的雄心。如果投资者正在寻找一个激进的投资(更高的风险和更高的回报),那么他会希望在他的账户余额的 10% — 20% 范围内的某个地方下注他的账户总余额的更大部分。一个更保守的方法(风险更小,回报更少)将会看到一个投注者投注他们账户总余额的 5-10%的。**
交叉检查
为了回答问题 6 & 7 我做了 4,000 次模拟,使用举报人账户的历史数据来确定 N次举报/天后的最终账户余额。这些模拟是使用输入变量来完成的,这些输入变量包括情报提供者的平均提示准确性、每个下注市场的平均赔率、起始帐户余额以及每次选择下注的总帐户余额的百分比。解释了情报提供者选择准确性的差异。**
我的 Excel 皮革人和肥皂
随后,我开夜车构建了一个 excel 电子表格,它为我提供了一个工具,让我可以对情报提供者的账户进行探究。他们中的绝大多数就像被车灯照着的鹿一样束手无策。然而,这些精英却表现得像一个在聚光灯下蓬勃发展的弗拉门戈舞者。我发现的一个不太为人所知的线人账户是一个赌注的儿子又名肥皂。
- SOAP 选择橄榄球联盟作为体育博彩行业的利基市场。他们为大多数大型橄榄球比赛提供提示,特别关注超级橄榄球和世界七人橄榄球系列赛。
- SOAP 对他们的数字和他们的跟踪记录是透明的。他们在推特上发布每一次选择,并保持他们选择准确性的最新记录(这可以在他们的推特账户上验证)。
- 他们目前对超级橄榄球和世界七人橄榄球系列赛的选择准确率是 87/118。这是一个 73.7%的选择准确率。
- 肥皂小费市场的平均赔率是 1.85。
以 $1,000 的起始资金为例,并假设总资金的 15% 在总共 20 周(每周提供 2 次提示)中的每一次下注会生成以下曲线图:

该图表示在 20 周内跟踪 SOAP 提示的投注者的账户余额(使用了期望值的概率理论)
当使用期望值的概率理论时,该图表明遵循 SOAP 提示的投注者在 20 周之后将有 8359 美元的期末账户余额。
下表包含一些值得注意的数字:

从情报分析 Excel 表中获得的 SOAP 投资见解
我对未来价值预测进行了两次单独的分析,以验证预测的价值。账目平衡了。在4000 次模拟 SOAP 特定指标后,平均期末资金为$ 8335,这与使用期望值概率理论时从 SOAP 分析曲线图中读取的$ 8359期末账户余额几乎相同。
结论
作为一个认真的投资者,在 20 周的时间里,736%的投资回报率足以让我惊讶。几乎令人难以置信的是,目前, SOAP 正在 twitter 上免费提供他们的精选。我相信,用不了多久,就会有人发现他们的服务有赚钱的潜力。
…还是他们将继续成为体育博彩行业的现代罗宾汉?
作者不是注册投资顾问或经纪人。作者表达的所有投资或金融观点均源于个人研究和经验,旨在作为教育材料。作者明确建议你在做投资决定之前先向专业人士寻求建议。
从数据到行动的不稳固的桥梁
一个现实,不同的事实,不同的观点,相反的行动
注意:在这篇文章中,我试图检验事实和数据之间的关系,以及我们的主观解释和随后的决定。随着我们越来越多地看到对似乎是同一现实的不同解释,这种对这一主题的兴趣最近有所增加。
我太热了——我太冷了……

如果我说“太热了”,你说“太冷了”,那些只是的观点,我们谁也不对!如果你改为说“现在是 70 度”,那么这就是事实这是无可争议的,我们可以就其含义进行更富有成效的对话。
我的一位同事过去就是这样在会议中打断激烈的辩论,并通过敦促人们关注事实和数据来重启讨论的。他的干预往往有助于在最紧张的情况下安抚情绪。在许多方面,这种说法有一种老生常谈的味道,但其中的一些东西确实吸引了我的笛卡尔思维:冰冷的事实和数据是真理的本质,主观意见让我们离真理更远。伦敦统计学会的创始章程(成立于 1834 年)也说了类似的话:数据在任何情况下都必须优先于观点和解释。数据是客观的;观点是主观的。这个信条今天仍然指导着许多统计学家:事实上,我认为对数据的“盲目信仰”比以往任何时候都更强烈,以至于我们故意决定忽略人类专家的意见,而是依赖“数据说了什么”。
在一个事实空前丰富的时代(“大数据”收集了一切,加速了科学进步,倍增了处理数据的计算能力……),我们应该比以往任何一代人都更接近真相!然而,我们的时代也充满了越来越多不同的观点和信仰,不仅是对 20 世纪那样的意识形态,而且是对核心事实(有人知道假新闻吗?).在当今时代,事实和数据从未如此丰富,然而“真相”却更加难以捉摸、相对和主观。
对我来说,这是一个有趣的悖论,值得进一步研究。我在下面试图通过分析我们实际上是如何理解现实并决定什么是真什么是假来做到这一点。我用下面的图表总结了我的方法。

资料来源:Wissam Kahi
- 事实是描述通过观察过程产生的现实的原始数据,它们是我们能够得到的最接近现实的数据。这是 观察层
- 描述符(或估计值、模型、统计摘要)允许我们总结原始数据,使其有意义(如平均值、方差、中位数、相关性等)。这是的分析层的
- 图表是我们展现真相的各种方式(使用图表、图画、图像甚至描述符本身)。这是 可视化图层
- 叙述是我们的主观解释。叙述可以通过估计得到信息,但它们也受到许多其他外部因素的严重影响,如我们的价值观、信仰(教育、背景……)。这是 意见层
最后,意见非常重要,因为它们最终会推动行动
让我们用另一个“温度”类比来说明这一点:气候变化。
事实是全球各地不同年份和地点的温度测量、海平面上升和人为碳排放的大量数据集。这些当然是无可争议的,但也是无法实现的(还没有人整合所有的测量数据),而且它们的原始格式不适合人类食用(正如我在以前的博客文章中所阐述的,我们的大脑无法吸收它们)。
估计值和描述符是科学家用来建模、总结和理解数据的各种方法:全球气温和海平面的平均上升,灾难性天气事件和热浪的发生,等等。以及与人为排放的相关性
代表和可视化是代表上述内容的各种出版物、文章和图表。
由此产生的观点和信念当然会有所不同,从光谱的一端人们肯定气候变化和人类行为之间有明确的关系,到另一端声明这种说法没有足够的证据,气候变化纯粹是一种与人类活动无关的周期性现象。在现实中,科学家通常会根据概率来陈述他们的断言(例如,科学家可能会声称,在未来 50 年内,人为引起的气候变化有 70%的可能性会导致海平面上升 50 厘米,或者相反,“自然气候变化有 80%的可能性会导致海平面上升。这是由温室气体排放引起的可能性非常小,几乎可以忽略不计),但实际上,这些问题往往会被简化为更通用、更确定、更简单的陈述(化石燃料导致海平面上升——海平面上升不是由人类引起的,我们对此无能为力)。
行动是作为这些意见的结果而实施的政府政策(或非政策)
这个简单的例子清楚地表明,聪明的受过教育的科学家如何从相同的事实得出不同的结论,更重要的是,政府实施非常不同的政策
那么这种“现实—事实—估计—观点—行动”的脱节发生在哪里呢?让我们分别检查每个维度
I- Facts(观察层)

海岸线悖论
科学史上有一个故事一直让我着迷:Lewis Fry Richardson 是一位英国物理学家,他想验证一个有趣的理论:两个国家之间发生战争的概率取决于它们共同边界的长度!在研究数据时,他开始发现令人不安的不一致之处:比如荷兰和比利时之间的边界长度,在不同来源之间差异很大。例如,在一个源中可能是 380 公里,而在另一个源中可能是 449 公里。
理查森最终解决了这个悖论,他认识到了一个在今天看来非常直观的东西:边界或任何自然海岸线的长度取决于尺子的大小。如果你用 50 公里的尺子,用 200 公里的尺子你会得到不同的答案(见下图)

海岸线悖论图解—来源:海岸线悖论—维基百科
这一发现后来被称为“海岸线悖论”,是数学家伯努瓦·曼德尔布罗研究分形的一个重要因素。
你可能会认为这是一个微不足道的发现:当然,用更精细的尺子,我会得到更长的不规则线条。但是我感兴趣的不是 Richardson 的发现本身,而是 T2 在 1950 年制造了它!想想看,当时科学界已经在量子力学和广义相对论等领域取得了重大进展,然而没有人注意到这个很可能被古希腊人发现的微不足道的事实!
被认为是不容置疑的“事实”——西班牙和葡萄牙之间的边界长度是 987 公里,西班牙人声称是 1214 公里,葡萄牙人声称是 1214 公里——结果证明对双方都是错误的。事实上,分形理论表明,随着尺子变得更细,这个长度会发散到无穷大:从理论的角度来看,没有长度可言…
我们看到的和看不到的

Nicholas Nassim Taleb 论文的关键图表“你所看到的和你所没有看到的
我最近读到的最有趣的数学演示之一是纳西姆·塔勒布做的。简而言之,一般结论如下:如果您有 n 个形成特定分布(即,观察值的直方图)的观察值,并且 K 是您的样本中最大的观察值,则未来观察值大于 K 的概率为 1/n(对于所有幂律分布,这是一个非常通用的集合)。这个相当简单的结论却有着深远的影响:它告诉我们一些事情,比如“我们有多大可能遭遇比已有记录的 100 次更强的热浪”或者“下一次金融危机有多大可能比我们目睹的更强”。事实上,许多“专家”过度依赖现有的历史数据,这使得他们低估了隐藏在我们历史上观察到的最大模式背后的潜在“肥尾”。这再次提醒我们,我们的观察有时是自然选择向我们揭示的,但她可能保留了一些隐藏的卡片…
PS:如果你对这个属性的简单图解感兴趣,可以看看麦克·劳勒的伟大 帖子 。这里的数学演示可以进入
结论
有多少其他的“真理”我们今天认为是不容置疑的,结果却被未来的发现动摇了我们的信心?当然,像上面这样的发现并不是每天都会发生,但是当考虑到事实通常是对现实的“测量”时,我们必须考虑到一些误差(即使是出于最好的意图——比如尺子有多精细引起的误差)。
我自己处理原始数据,从我的经验和对同事的观察中我知道,人们对原始数据的质量过于自信,这往往是因为这是你能得到的最好的数据。质疑数据来源、反复检查数据质量并为其分配适当的误差幅度是一项乏味的任务,大多数分析师都会避免,因为直接进行分析更有吸引力……就像理查森对他的战争概率理论所做的那样(这比测量边界更令人兴奋……)。
康德说我们从未真正体验过现实,而只是通过我们感官的面纱来感知它(他称之为感知的面纱)。记住数据本身是一种人造的人类构造是有好处的:它是我们感知现实的方式——也可以说是通过“面纱”。
II —描述符(分析层)

永远不要跨过平均 4 英尺深的河
我写了一篇单独的文章,题目是“ 从不跨过平均 4 英尺深的河——总结战争与和平 ”就在这个话题上。(文章强调了我们汇总数据时面临的挑战和不可避免的“信息丢失”。)的关键前提是,试图使用平均值等描述符来总结数据集有点像试图用几句话来总结“战争与和平”:这是一种高尚的努力,但在某种程度上对于向亲爱的朋友传达这部杰作的内容来说是可笑的。
我不会在这里展开这个主题,但下面只是文章中详细介绍的各种示例中的一个,以便让您有所体会。
我碰巧是一家餐饮公司的合伙人,这家公司从世界各地雇佣有才华的难民厨师。公司厨师开发了几十种来自他们烹饪传统的菜肴——虽然在我看来都很特别,但他们的菜肴对典型的美国人来说或多或少是成功的。在我们不断努力为顾客提供最佳服务的过程中,我们希望了解谁是我们最好的厨师,我们发起了一项调查,顾客可以对每位厨师的烹饪进行评分。在我们承办的每个活动中,每个厨师通常都会准备一道菜。
每位厨师的平均结果如下所示

《Eat Offbeat》——wiss am Kahi 餐厅每位厨师的评分
在这个节目中,Faven 的评分比她的厨师同事低得多。我们或许应该解雇她,或者至少让她在厨房帮忙,而不是用不为人知、显然不受欢迎的味道折磨我们的顾客?
嗯…没那么快。事实证明,所有这些结论都是错误的,或者至少是误导性的:我们的调查确实要求每个顾客对厨师进行评价,我们知道每个厨师为每个活动准备了不同的菜肴。如果我们不只是平均厨师的结果,而是平均相应菜肴的结果,会怎么样?结果如下:

《吃另类》每道菜的评分——wiss am Kahi
我们可以清楚地看到,最受欢迎的一道菜是埃及穆萨卡,它是……厨师法文的创造!仅仅依靠平均每位厨师,我们就要解雇负责我们最受欢迎菜肴的人了!Faven 主厨有另外两种菜降低了她的平均水平,这些菜显然不受纽约人的欢迎,应该被淘汰。但她显然有一些天赋,我们应该鼓励她创造一些新的菜肴。
III——表示(可视化层)

毕加索有一句名言可以作为这一章的最佳副标题:“我们都知道艺术不是真理。艺术是让我们认识到真理的谎言,至少是给我们去理解的真理。”我要说的是,当我们将数据可视化时,我们实际上是在进行一种艺术创作,毕加索的名言与此非常相关。
改变颜色…改变想法
让我用一个我在 Tableau 技术传播者安迪·科特格里夫的博客上读到的例子来说明。下面是 2011 年伊拉克的伤亡图表,来自南华早报

伊拉克的血腥工具(2011 年 12 月 17 日—南华早报)
图表中最引人注目的当然是红色“血腥”的使用,以及暗示滴血的倒轴。这是非常有效的煽动读者的情绪和标题“伊拉克的血腥收费”是非常恰当的。
现在考虑安迪·科特格里夫在下图中的旋转:

安迪·科特格雷夫的担当 伊拉克血腥屠杀
事实上,他不仅使用了相同的数据,还使用了相同的图表——他所做的只是将图表向上旋转(从倒置的数字中可以看出)并赋予它不同的颜色。当然,现在一个不同的标题更合适:“伊拉克:死亡人数在下降”。
让我们再举一个可能会引起许多美国读者强烈共鸣的例子:下面是 2016 年美国总统大选地图

2016 年美国总统选举县地图(红色=共和党,蓝色=民主党)-来源:土地不投票-人们通过下雨来投票
上面的地图用红色填充,似乎表明特朗普取得了压倒性胜利。但是你可能已经猜到了,用地图来表示人们的投票是非常误导人的。下面的Karim dou EB给出了这种表述的平衡

Karim Douï eb 人口调整后的 2016 年选举调整地图(红色=共和党,蓝色=民主党)
在这个可视化中,县的大小与其人口成比例,而不是与其地理面积成比例(毕竟所有人都投票,而不是土地面积!)并在视觉上展示了一个非常不同的画面。
一个故事抵得上一千…数据点
**“一个人的死亡是悲剧;100 万人死亡是一个统计数字”——约瑟夫·斯大林(Josef Stalin)狡猾地利用这一数字为自己谋利(当然也损害了人类)。众所周知,故事比统计数据更有影响力,细节比一般的更引人注目,触及心灵比诉诸理性更有效…
我仍然感到震惊的是,即使受过教育的人应该意识到自己的偏见,这仍然是多么真实:例如,一个为难民筹集资金的慈善机构通过展示一个女孩的照片筹集的资金会比展示一群难民的照片筹集的资金更多(甚至更少展示统计数据)。更糟糕的是,展示同一个女孩和她的兄弟或家人也将筹集更少的钱……(有几个关于这个主题的研究,但你可以查看几个这里和这里
IV-意见(解释/叙述层)

我最近被选为大陪审团的成员。在 4 周的时间里,我和其他 22 名大陪审团成员坐在一个房间里,助理地方检察官会过来向我们介绍他们针对某一特定被告的案件,我们必须投票决定是否有足够的证据起诉被告(意味着有足够的证据将案件提交审判)。我们在 4 周内回顾了约 40 例病例。
我最初认为这将是一个可怕的负担和巨大的时间浪费,实际上却是一个非常有趣的实验:他非常有见地地观察到不同的陪审员在面对相同的事实时如何得出不同的结论。事实上,在许多情况下,事实是不完整的——但这是人类思维的一个特征,用主观假设来填补这些事实的空白,并建立一个叙事——这不正是一种观点吗?我们没有用自己的感官目睹犯罪,我们被邀请在自己的头脑中建立一个故事,相应地填补空白。
判断是否有足够的证据将案件提交审判或驳回显然是一种意见(从这个角度来看,该系统并不完美,因为它依赖于人们的意见而不是纯粹的事实,但有趣的是,在许多方面,这是我们唯一的“公平”选择)。我同样认为解释或“理解”一个数据图表必然会形成一个关于它的观点——否则它只是纸上的数字。
让我们考虑另一个熟悉的类比:杯子满了 1/2 和杯子空了 1/2 都是“6 盎司杯子里有 3 盎司水”(客观现实)这一准确说法的准确意见(主观现实)。后者并不比前者更“真实”。有趣的是,人工智能将只能表达客观陈述,如“杯子里有 50%的水”,而不能区分半满/半空的观点。在可预见的未来,这些区别仍将是人类固有的——这正是我认为它们至关重要的原因。
简而言之,我们处理信息的方式只部分取决于信息本身,同样也取决于我们有偏见的感知。如果表示层(前一章)处理的是作者在传达数据时引入的偏见,那么解释层处理的是数据的读者在理解数据时引入的偏见。扩展一下我使用的比喻:如果表示层是关于作者用不同的颜色画笔来表示数据,那么解释层是关于读者通过他们自己的有色眼镜来看待事实
有几个因素可以显著影响这种解释,其中一些是我们人类固有的潜意识偏见,另一些根植于我们的内在信仰、文化和世界观,最后还有一些是外部因素,例如我们“消费”事实时碰巧进入的群体。
1 —潜意识偏见—叙事谬误
诺贝尔经济学家丹尼尔·卡内曼写了一整本书《思考,快与慢》,主题是潜意识偏见。我不会试图在这里总结它——尽管我非常鼓励你去读它——但是我会用一个关于叙述谬误的例子来说明。
叙事谬误
假设您正在尝试评估销售代表在创造收入方面的效率。你将每个客户的收入与销售代表给每个客户打电话的次数进行对比,并生成下图。

增加对客户的呼叫会增加收入
该散点图显示了客户呼叫次数与客户创造的收入之间的密切相关性。你把它展示给公司领导层,每个人都看到了清晰的模式:当我们增加对客户的拜访时,收入也会相应增加。因此,合理的结论是激励我们的销售人员打更多的客户电话——尤其是那些我们过去忽视的客户。
现在想象一下,你反转坐标轴,在 Y 轴上画出呼叫次数。图表如下所示。

当客户收入较高时,销售人员会增加致电客户的次数
现在至少观众中的一些人会得出不同的结论:当客户收入更高时,销售人员往往会更频繁地拜访他们!
你可能已经猜到这两种说法都存在逻辑谬误。事实上,对这种相关性的一个完全合理的解释是影响这两个指标的第三个混淆变量,例如,客户规模/消费倾向可能会影响销售人员拜访客户的频率以及公司的收入,换句话说,销售人员足够聪明,可以拜访“值得”的客户。

客户收入与销售拜访频率相关性的潜在解释
你们中的许多人可能对我们在统计学课上学到的著名的“相关性并不意味着因果关系”很熟悉。令人震惊的是,同样意识到相关性/因果关系差异的高管、经理和受过高等教育的人每天仍然经常陷入这个陷阱(实际上上述虚构的例子是从真实事件中获得的灵感)。
丹尼尔·卡内曼谈到了大脑“急于下结论”的倾向。尼古拉斯·纳西姆·塔勒布,另一个我最喜欢的作家,把这解释为叙事谬误
叙事谬误解决了我们在不解释事实的情况下观察事实序列的有限能力,或者,换句话说,在事实上强加一个逻辑链接,一个关系箭头。解释将事实结合在一起。他们使他们更容易记住;他们帮助他们变得更有意义。这种倾向可能出错的地方是当它增加我们理解的印象时
在我们的例子中,我们被训练试图通过 x 轴上的变量的行为来解释 y 轴上的变量。如果我们能把一个因果故事中的变量联系起来,那就有趣多了。但是,翻转轴就足以得到不同的解释……当然,受过训练的人不会相信他们在这方面的第一直觉,而是更深入地挖掘,他们通常会对相同的数据有不同于“常识”的解释。
2-内在价值观和信念
潜意识偏见是人类本性中固有的,从定义上来说,在个体中是普遍的。相比之下,我们的价值观和信仰因人而异,因为它们受到个人教育、教养、文化环境、过去经历等的影响。
气候变化主题是展示这些值如何影响数据解释的理想选择。NOAA 的下图显示了地球大气中二氧化碳的增加,最近已经超过了 410 ppm。

二氧化碳百万分率趋势—【climate.gov 资料来源
保守派评论员兼电台主持人马克·莱文(Mark Levin)利用这一信息辩称,二氧化碳只是地球大气中的一种微量气体。他谴责当权派经常极力劝阻反对意见,并宣称在气候变化问题上科学界近乎一致。“他们从未提及二氧化碳在大气中所占的比例有多小,”莱文说。https://www . Washington examiner . com/Americans-for-carbon-CO2-mark-levins-idea-of-time-come
从纯事实的角度来看,莱文是对的:二氧化碳确实是大气中的一小部分。但是也许有人应该给他一杯水,里面有极少量的砷,并请他向我们展示他有多勇敢——毕竟它是如此之小…
玩笑归玩笑,这是对道德价值观和群体思维(在这种情况下是气候否定论者群体)如何严重影响事实解释的完美例证。一个更细致的图表可能如下,它着眼于一个更长的时间段:

二氧化碳百万分率趋势——资料来源:Climate.gov 的 NOAA
这表明,410 ppm 是历史上前所未有的,引用一个更具戏剧性的数字将是“今天的二氧化碳浓度比过去 80 万年的历史峰值高 30%以上”。
我们在莱文身上看到的是确认偏差在起作用:当面对几个事实时,人们会挑选最能支持他们当前信念的数据,而忽略其他一切。我们在政治光谱的另一端看到了同样的确认偏见,人们挑选的数据会让它听起来最具戏剧性。现实情况是,虽然在这一论点的一端有科学上的多数,但这还不是一个完全的共识,因为在事实分析中仍然存在差距,不能以某种方式提供“不可辩驳的证据”, a)增加是由人类引起的,b)它将导致灾难。尽管存在不确定性(我将在下一章详细阐述),但我对如何解决这个问题有自己的看法。
3-外部因素
我从霍华德·韦纳和哈里斯·l·兹韦林的一篇文章中借用了这个例子,但对其进行了扩展。我还接触了丹尼尔·卡内曼的书《思考的快慢》。
你是一名数据分析师,在一家领先的私人实验室开发一种新的癌症,领导指派你了解肾癌发病率最高的地区。你做了调查,并向领导展示了以下数据图

与美国各县人口相比,每 100,000 人的肾癌发病率——资料来源:Howard Wainer 和 Harris L. Zwerling 的数据——wiss am Kahi 的可视化
你把图表展示给围坐在会议桌旁的高管们,在最初的一分钟左右,没有人知道它是怎么回事。但就在这时,眼尖的 CEO 说:“我明白了!癌症发病率最高的县大多是农村、中西部和南部人口稀少的地区。这些州的贫困程度更高,饮食脂肪含量更高,饮酒和吸烟过多,没有良好的医疗保健。完全说得通!“现在每个人都明白了这个模式,并点头表示同意。
如果你自己再次点头表示同意,再想一想,因为结论实际上是错误的。事实上,癌症发病率最低的县也是农村、人口稀少以及中西部、南部和西部的县……下面的图表将人口为< 50,000 和> 50,000 的县分开,并显示它们如何划分肾癌的低发病率和高发病率。如你所见,在这两种类型的县中,癌症低发病率的县一样多,在较小的县中,癌症低发病率和高发病率大致相当。

南部、西部和中西部癌症发病率低、中和高的县的分布——人口<50,000 vs. > 50,000 的县——资料来源:Howard Wainer 和 Harris L. Zwerling 的数据——wiss am Kahi 的可视化
这里的合理解释是“大数定律”:当我们的样本总体较小时,我们更有可能在平均发病率周围有较高的方差。因此,我们更有可能在较小的样本(在这种情况下是较小的县)中找到极端值(低或高),而较大的样本往往更接近平均值,变化较小(实际上,您可以看到较大的县有更高的百分比属于“中等”类别。)
上述解释基本上是随机的——没有因果关系解释为什么较小的县会有较低或较高的发病率。但是我们的大脑不喜欢随机性,并且会一直积极地寻找因果关系(在丹尼尔·卡内曼的书中会有更多的论述)。
这和上面的叙事谬误类似。但这里还有另一个有趣的影响:注意,解释可能会完全不同:房间里的一些人可能已经注意到许多小县的癌症发病率非常低,并用农村生活方式的好处,没有污染等来解释这一点。这并没有发生:观点向一端的转变是由组织中具有道德权威的人(在这个例子中是 CEO)的权力动态和角色模型驱动的。虽然为了说明的目的,这个例子被明显地夸大了,但是请注意,这在组织中非常频繁地发生,尽管是以更微妙的方式。这些群体动态如何出现的例子包括,例如,谁具有更强的性格或权威,或者有时只是谁第一个发表意见。请注意,在这些情况下,通过在参与讨论之前征求每个人的意见,或者由对统计有更深入了解的人提供更清晰的图表,可以鼓励更健康的辩论。
垂直行动——结束循环

在我朋友用来说明“事实胜于观点”的“太热/太冷”的例子中,有一点总是困扰着我,那就是感觉不对劲。我花了一些时间才弄明白是什么,事后看来很明显:如果辩论只是关于知道温度是多少,就像科学家试图测量自然现象一样,那么类比是有意义的,但如果类比涉及到人们是否对温度感到舒适,那么类比就不成立。事实上,知道温度“客观上”是华氏 68 度并没有以任何方式减少冷或热的主观感觉。毕竟,带来满足感的唯一方法是他们中的一个站起来调节恒温器,从而带来一个新的现实。换句话说,这个比喻暗示着客观真理应该永远胜过主观真理。然而,最终导致行动的往往与客观无关,而完全与主观有关。
这种“客观与主观”是许多学科中的一个古老的争论。然而,与本文相关的是,行动是主观——或集体主观——的结果,并且这些行动对现实有影响。所以我们描述的线性链条“现实→观点→行动”实际上是一个闭环。
在这里引入反身性的概念是值得的:到目前为止,我们一直在谈论观察者作为一个通过几个镜头(观察、分析、表现、解释……)理解数据和事实的个体,但是假设这个个体仅仅是一个现实的被动观察者,就像科学家观察蚂蚁一样。反身性认为,在许多领域,将个人纯粹视为被动的观察者是不正确的,因为他将形成的观点实际上会对他正在观察的情况产生影响——使关系具有反身性。换句话说:现实并不独立于参与者的感知——它可以被这种感知所塑造。在前面的章节中,我们已经确定了两个人在面对同样的事实时,是如何形成两种截然不同的观点的。我将在这里解释为什么这种感觉很重要,尤其是当它成为集体的反映时。事实上,这在与人类事务相关的领域尤其相关,例如金融或社会科学,在这些领域中,一群主观观察者同时也是他们所观察的客观现实的参与者。
卡尔·波普尔(Karl Popper)将反身性作为科学中的一个问题,他强调了预测对被预测事件的影响,称之为“俄狄浦斯效应(Oedipus effect)”,指的是希腊传说中实现神谕预言的事件序列受到预言本身的巨大影响。乔治·索罗斯(他的学生)后来在这个话题上有了很大的发展。在金融市场中可以找到一个简单的例子:

来源:乔治·索罗斯的《易错性、反身性和人类不确定性原理》
a)参与者(如对冲基金)对资产价格形成了与事实不同的偏见观点(即,基于主流经济理论的市场基本面应该已经反映了这一观点),根据上述章节,很容易理解为什么这种观点会有偏见。索罗斯称之为认知功能,并引入了易错性的概念来描述人类的偏见
b)然后参与者会根据他们的偏见采取行动。市场会相应地调整价格。这将有利于价格更优惠的公司,因为它们将有更多的机会获得资本,并惩罚不公平地向下倾斜的公司。在某种程度上,这变成了一个自我实现的预言。索罗斯称之为操纵功能。
c)参与者和现实之间的持续互动反映了这种理解和塑造现实的循环努力。
政治调查和民意测验也有类似的现象。由 CNN 或 Fox 发布的“不完美民意调查”不仅仅是潜在情绪的快照——它还会影响他们!
让我们用一个当代问题来说明为什么这也与我们的数据到行动框架密切相关:假新闻和假账户对世界各地的一些选举产生了重大影响。除了影响观点之外,许多这些虚假账户还创建了脸书页面,就各种有争议的话题组织示威活动——通常基于假新闻——真正的共同主持人在不知情的情况下被招募并组织了这些活动。所以“虚构的人”组织了真实的活动,由真实的人参加,他们的情绪被“虚构的新闻”煽动起来!因此,为了进一步证明现实和虚构之间的界限在这种情况下是如何模糊的,想象以下场景:
在某个城镇,一项调查显示,5%的人相信第 x 期。一个虚假账户创建了一个基于假新闻的演示,以推广第 x 期,招募真正的共同主持人,开始在城镇组织集会。一项新的调查显示,10%的城镇支持 X 问题…你认为哪一个百分比(5%或 10%)代表了城镇对 X 问题的真实看法?老实说,我自己也没有一个好的答案——但是这个例子说明了我们如何才能解开这个动态闭环:现实→意见→行动→现实
结论——将所有这些应用到我们当前的危机中?

现在,我们已经,至少在概念上,完成了循环,我们已经建立了
- 不要盲目相信事实和观察——大自然可能还没有选择亮出它所有的底牌
- 总结和分析事实的描述符只是对现实的概括——而总结是不完美的
- “画家”可以操纵描述符的图表和表示来影响解释
- 由于各种偏见(叙事谬误、价值观和信仰、外部群体压力、小数法则……),人们可能对同一图表有不同的解读
- 事实和行动之间的关系不仅仅是线性的,而是循环的,特别是对于涉及人类行为和集体行动(金融、社会科学……)的现象,这使情况更加复杂
那我们该怎么办?我确实想以积极的方式结束发言。我不认为我要努力的是放弃,而是要意识到心流中的不确定性,并保持适度的怀疑。这将继续区分我们人类和人工智能:人工智能本质上是客观的——它不受价值观和文化规范的阻碍,因此应该能够得出公正的结论(例如,基于结果的概率)。这些不完美不是我们软件中的小故障,而是让我们成为人类的一个特征。
某些权势集团坚信“答案就在数据中”。我希望通过上面的例子,我可以驱散这种误解。作为一名数据爱好者,我确实相信数据是一个更大难题中非常重要的一块,这个难题需要包括许多其他学科来进行决策,包括特定领域的专业知识,也包括哲学、伦理以及历史。即使面对不确定性,我们仍然可以明智地选择我们的行动。
现在我将结束这个循环,再次用气候变化来说明。虽然事实和数据往往是无可争议的,但科学界对因果关系没有完全的共识(例如,这是人类行动的原因吗?)和预测模型(即影响发生的速度有多快?),因为这些是更高层次的顺序,更不容易伪造。话虽如此,我认为这种不确定性确实意味着某种行动方针:即使我们对悲观模型正确的概率赋予很小的可能性,预防原则也意味着我们不能什么都不做,因为失败的成本太高了。
脚注:
例如,最近我读到了村上春树的新书《客观不一定超越主观,你知道》。现实不一定会熄灭幻想。”
2 美国国家海洋与大气管理局
3 反身性与 一般均衡理论 不一致,一般均衡理论规定市场走向均衡,非均衡波动仅仅是随机噪音,很快就会被纠正。在均衡理论中,长期均衡价格反映了潜在的 经济基本面 ,不受价格影响。反身性断言,价格确实影响基本面,这些新影响的基本面然后继续改变预期,从而影响价格;这一过程以自我强化的方式继续。因为这种模式是自我强化的,市场趋向于不平衡
咖啡的形状
使用模式识别的颗粒分析
制作咖啡需要研磨,但哪种研磨机最好呢?我不确定,但我看到的是相当多的咖啡研磨分布数据。有些研磨机比其他研磨机更好,仅仅是因为它们有更紧密的分布,但是分布是唯一需要考虑的吗?
我最初研究颗粒大小是因为我编写了分析过滤孔的代码。可以使用相同的处理,但是我发现了两个主要的困难:
- 在地面不接触的地方获取图像是很困难的。
- 这项技术只能分辨 100 微米的 1 个像素,因此很难更好地感知更细微的颗粒。
另外,粒子不是圆形的。我没多想,因为我还有其他实验在进行,但一年后,我得到了一台显微镜。事实证明,大多数地面都不是圆形的。它们也不是正方形的。那么如何理解它们呢?你如何确定一个粒子的大小?半径不太有意义,但面积可能有意义。
如果你用面积来测量颗粒的大小,你会有两个尺寸分布非常相似但结果不同的研磨机吗?我被这个问题困扰着,为了理解咖啡渣,我求助于模式识别。
在这项工作中,我做了一个简单的预处理,然后我应用了一些标准的模式识别技术。对于每个粒子,我做了一个线性二进制模式(LBP)的特点是规模和旋转不变。然后我应用 k-means 聚类来确定粒子的类型。
我不知道这是否会成为理解粒子研磨的另一种方式,但我打算在未来进行以下测试:
- 研磨设置
- 筛过的粉末
- 研磨机比较
- 拍摄前与拍摄后的背景形状
初步加工
我把咖啡放在一张白纸或 iPad 屏幕上。然后我拍了一张照片。在这项工作中,我不担心规模,但这相对容易在以后的日期纳入。这里的关键是加工。然后我反转图像,对每个像素取 RGB 的乘积。应用一个简单的阈值后,我得到了这个图像:

这是一个特写图像。即使在这张图片中,你也可以看到各种各样的粒子形状。

最初,我看了一些指标,比如长轴与短轴之比。假设形状是一个椭圆。肯定有分布,而且不是线性相关的。我怀疑这表明了粒子形状的多样性。

然后我比较了长轴和短轴与面积的比率。同样,存在一个分布,它根据孔的面积而不同。

用于形状分析的模式识别
咖啡颗粒不是圆形的。不同的研磨设置或不同的研磨机会改变出来的颗粒形状吗?我们如何理解不同的形状?
线性二元模式
一种技术是使用线性二进制模式。这是一个应用于每个像素的简单模式,通过简单的等式(像素>中心像素)将周围的像素与中心像素进行比较来生成代码,如下所示。有 2⁸可能模式(256),但如果你考虑围绕中心像素旋转,只有 59 个独特的模式。最后一个特征是图像中属于每个类别的像素百分比的 59 个元素长。

k 均值聚类
之后,我们可以应用 K-means 聚类来查看不同类型的形状是如何分类的。K-均值聚类包括设置 K 个节点(在本例中为 16 个),并将所有要素分组到它们最近的节点。然后,该算法反复调整节点和分组,以最好地分离数据。

选择集群的数量更多的是一门艺术而不是一门科学。要使用的主要指标是类内平方和(WSS),随着类数量的增加,会有一个收益递减的点,在本例中是 16 个类。

现在,我们可以在全局视图中比较这些不同簇的粒子面积,然后在每个空穴面积箱中进行归一化。

我不确定这说明了什么,只知道这是一种观察分布和颗粒大小的新方法。这是一个漂亮的图表,但最终,它能告诉我们什么呢?这些信息能够更好地区分好的研磨机吗?

我已经在网上看到了很多其他人的粒子分布,但我不清楚如何使用这些信息来区分最好、相当好、好、坏和最差。你可能会说研磨机不好,但我觉得好像少了点什么。我的经验是,我的 200 美元的韩国研磨机制作了很棒的浓缩咖啡,尽管与几千美元的研磨机相比,它并不被认为是一个很好的研磨机。希望,我们作为一个社区,将找到一些客观的衡量标准,这样人们将更容易花几千美元在磨床上。
如果你愿意,可以在 Twitter 和 YouTube 上关注我,我会在那里发布不同机器上的浓缩咖啡照片和浓缩咖啡相关的视频。你也可以在 LinkedIn 上找到我。
我的进一步阅读:
被盗浓缩咖啡机的故事
克鲁夫筛:一项分析
美国总统选举的格局
绘制选举结果的方法有很多——你可能没有尝试过这种方法(而且你还来得及赶上今年的选举)。
作者 菲利普【魏勒】刘易斯弗朗切斯科【帕尔马】 和 托马斯**
很少有人知道每个人在特定时间点对特定事情的看法。大选真实地反映了一个国家的居民如何看待他们国家的需求和优先事项。虽然我们必须谨慎下结论,但选民投票的方式反映了(在一定程度上!)他们的处境和他们的价值观。
选举之后,分析家们用一系列的例证来支持他们的结论,从而赋予这些原始材料以意义。一个反复出现的例子是选举地图。这张地图显示了实际的物理边界是如何与政治边界相一致的。具体来说,在美国,它传达了一个普遍的信息,即农村地区的选民是保守的,而人口稠密地区的选民是自由的。

选举地图用投票边缘着色
选举地图证实了我们的先验,并作为一个健全的检查。然而,它所代表的有限信息限制了我们能够提出的假设的多样性。
找出因果关系并不总是容易的,因为它们不受地理位置的限制;有时我们只是不知道要寻找什么。
尽管你投票的方式完全是主观的,但研究表明,像你的社会经济背景,甚至你的邮政编码等因素都会影响你的投票偏好。制定适当的假设仍然是主观的,特别是在考虑高维数据集时,在变量之间建立正确的联系是一个真正的挑战。
为了揭示新的见解,使用一种系统的方法来直观地汇总数据符合我们的利益。这就是映射器算法可以帮助我们的地方。这是一种无监督的方法,它将数据分成不同的区域,并在适当的时候将它们连接起来。这些区域是产生新假说的关键。
美国县域经济景观
县是美国一个州的行政分区。通常,县级分析提供了最详细的见解,因为关于它们的统计数据通常是可用的最小尺度。
通过使用 Mapper 算法,我们希望了解是否有一种自然的方式将各个县划分为社会经济类别,并将它们与投票行为联系起来。我们对 2016 年县级数据的研究使用了来自美国经济分析局的 21 个社会经济特征,例如,包括个人收入数据和人均退休。因为缺乏一些县(如阿拉斯加和夏威夷县)的数据,他们被排除在我们的研究之外。结果,我们统计了 3043 个县。
我们的结果简而言之
我们的研究表明,我们可以根据经济指标将这些县分为五个主要区域:
1.高净值
2.高人均净资产
3.高人均退休率
4.高净值和平均净值
5.低净值

Giotto-learn Mapper 描绘的 2016 年美国社会经济景观
高人均退休人数本身就是一个集群,这并不是唯一令人惊讶的结果。结合低净值县,两者都占了绝大多数的县和表面积。同样值得一提的是,一个县的高净值并不能转化为高净值的个人,因此,在我们的研究中创造了两个独立的类别。
当结合选举结果时,我们发现在 2016 年,高人均退休和低净值地区是共和党的据点。除了一些高净值和中等净值的县以外,其余三个地区主要投票给民主党。
我们的结果是通过 Giotto-learn 实现的映射器获得的。你可以在这篇博文中找到关于其内部运作的更详细的解释。如果你想复制我们的结果或者自己尝试,我们使用开源库 Giotto-learn 提供了代码来实现。Mapper 在美国投票中的另一个应用可以在这里找到。
方法论
成功应用 Mapper 需要选择:
- 过滤函数,即从数据集到低维空间的映射,
- 图像空间的盖子,
- 一种聚类方法

在 Giotto-learn 中运行映射器算法的工作流程
只需几行代码,Giotto-learn 的 Mapper 就会为你提供一个彩色的图表。这些节点表示分类,默认情况下,这些分类由分类内点的平均过滤器值来着色。当两个群集共享至少一个点时,将绘制一条边。在我们的例子中,一个点代表一个县。

按过滤器值着色的映射图
图表结构中的含义可以通过用感兴趣的变量给节点着色来揭示。例如,通过用每个节点成员的平均净值来给每个节点着色,我们可以看到哪些节点集是相似的。默认的“平均着色”过滤器值将连接的组件分为两个区域:高过滤器值和低过滤器值。单线态在过滤值上是多样的,因为它们覆盖了整个光谱。然而,这并不能提供太多的洞察力,因为过滤函数太抽象,难以解释。幸运的是,在 Giotto-learn 的 Mapper 实现中,很容易改变节点的颜色来从结构中提取洞察力。
给映射图着色以寻找含义

按个人收入着色的映射图

按人均收入着色的映射器

按人均退休人数着色的映射图
用个人收入、人均个人收入或人均退休来给图表着色,揭示了上面提到的五个相关区域。这五个区域之所以可见,是因为我们同时分析了 21 个特征。如果我们单独研究这些特征,获得这样的分类会困难得多,甚至是不可能的。
为了查看这在地图上是如何展开的,我们相应地给县地图着色。

地图绘制者图表和美国地图上用颜色标出的五个主要地区
虽然这些县在制图图中分离得很好,但当它们按位置绘制时,情况就不一样了。这些区域的拓扑结构非常重要,可能连专家都不会选择这样的分组。
为了显示映射器输出的重要性,我们可以用任何感兴趣的变量给图形着色。
美国的投票行为
Mapper 图表通过分别用共和党和民主党赢得的县的百分比来给节点着色,帮助我们理解投票行为。我们的颜色范围从深蓝色(所有县都是民主党赢得的)、白色(两党赢得的县数量相等)到深红色(所有县都是共和党赢得的)。这些数据已经由麻省理工学院选举数据和科学实验室提供。
我们不限于社会经济框架,也可以引入时间维度。保持映射图不变,并用不同年份的选举结果来着色,有助于我们理解投票行为是如何随着时间的推移而演变的。在这里,我们用新千年总统选举的结果来给节点着色。
为了反映一个集群的相对权重,我们可以通过改变节点的大小来增加另一个层次的信息。我们根据节点所负责的选举人的百分比来调整节点的大小。我们用下面的方式定义这个数字(每个县):给定一个州每个县的选举人数量,我们用这个县的人口百分比来加权。
结果
在主连通分量中有两个极性相反的分量,它们与高/低滤波器值分离几乎完美地对齐。一般来说,共和党往往在选举人数量少的县表现强劲。我们注意到,2004 年以后,高净值、高人均净值、高人均退休的票数保持稳定。粗略来看,“摇摆”县包含在高净值、中等净值和低净值县中。关于单身一族的一个小事实是:他们几乎总是完全被其中一个政党赢得。
投票的演变:2004 年至 2008 年
奥巴马总统赢得选举的那一年,我们注意到两件事:高人均退休和低净值地区不那么受共和党人支配。2004 年,高人均收入地区主要投票给共和党,而在 2008 年,它变成了民主党。

按选举结果着色的映射图
投票的演变:2012 年至 2016 年
2016 年,我们看到共和党在上述地区的投票净进展。在传统的共和党地区,我们注意到与前几年相比,平均增长了 10-20%。然而,也有一个共和党人的据点被民主党人设法接管。

按选举结果着色的映射图
各郡对选举团的贡献
民主党倾向于赢得大县(如洛杉矶,相当于 2.7%的选举人),共和党赢得小但很多的县,这反映在 Mapper 图的节点中。我们可以根据每个县的平均选举人数量来划分两个新区域中的节点。第一个区域包含有少量选举人的县。对于第二个区域,情况正好相反。
例如,2016 年,一个大型深蓝色节点代表 4.5%的选举人,只包含 9 个县,其中 8 个县由民主党人赢得。与此同时,在共和党集群中,惊人的 700 个县总计占 10%的选举人,这意味着每个县只负责区区 0.015%的选举人。共和党赢得的每个县的选举人百分比总是小于民主党赢得的选举人百分比。
从经济指标到投票行为
至于任何政治分析,我们需要小心我们的结论。由于我们无法获得投票后的民意调查数据,因此无法得出明确的结论。然而,这一分析表明,社会经济因素与投票行为之间存在持续的相关性:
1.在高净值县和大多数高净值县,民主党获得了更多的选票。
2.另一方面,共和党在高人均退休和低净资产地区得分。
3.摇摆票包含在两党各自的优势选区的边界区域。
结论
Mapper 算法降低了数据的维度,并在保留拓扑属性的同时聚合数据。通过映射图,我们发现了不同的社会经济类别,这些类别似乎有投票趋势。
了解这些趋势以及它们如何随着时间的推移而变化,可能有助于为竞选活动制定策略。
有用的链接:
人工智能辩论失败的原因

关于人工智能的公共话语的恰当总结——作者塔博尔 ( 许可)。
围绕人工智能的公开辩论对资金、研究、监管以及其恶意滥用的程度产生了重大影响。我们的论述失败了,因为我们共同标榜这个术语的几个定义。
闪亮的炒作列车
自从数据科学是21 世纪最性感的工作 的过度劳累和令人生厌的评论,以及随之而来的摧毁现代机器学习概念的炒作列车布莱曼的概念——从学术边缘到主流劳动力市场令人眼花缭乱的灯光,疯狂的流浪汉们急于将逻辑回归重新包装为前沿人工智能始于我在看你, IBM Watson 。
大多数在野外发现的外行人对人工智能的看法在乌托邦和反乌托邦的极端之间摇摆不定。乌托邦式的愿景以对短期潜力的不切实际的期望为标志(想想自动驾驶汽车)。这种情绪是危险的,因为过度承诺有助于刺激炒作周期,这是人工智能历史上的一种常见趋势,当这些泡沫不可避免地破裂时,公众信心就会减弱,随之而来的还有声誉、生计和投资者。
另一方面,反乌托邦的观点是从科幻小说中汲取的。《刀锋战士》、《〈T2〉太空漫游》和《〈T4〉西部世界》等故事中的人工智能之所以引人注目,是因为它跨越了令人费解的哲学和可塑的情节设计之间的界限,但你是否遵循菲利普·迪克(Philip K Dick)、阿西莫夫(Asimov)等人的作品并不是真正的重点,重点是这些作者使用的语言和思想已经嵌入了许多在人工智能辩论中拥有平台利益的人的作品中。它被用来帮助设计关于劳动力市场、人工智能的短期潜力以及基本机器学习应用程序的营销活动的媒体出版物。
就像穿着连帽衫,弓着背看着一个矩阵状的屏幕上如雨点般的代码的技术型穴居黑客已经成为媒体对程序员的喜爱漫画一样,拥有霓虹蓝色网络大脑的机器人也成为了 ML 从业者的宠儿。但是这幅画暗示了一个与曼梯·里目前的能力相差几光年的世界。推动这种情绪的群体,实际上是受这一群体影响最大的人,经常想象人形表征,社会的诡异洗牌,以及一个孤独的天才创造者,类似于黑客。对反乌托邦极端的过度关注将掩盖我们因滥用当代机器学习而面临的更紧迫的危险。
人工智能在庸医广告人的选择夸张中的角色在某种程度上削弱了它的本意,并把有用的术语变成了陈词滥调,有时甚至是骗人的模因。但是比语义变化问题更紧迫的是(词语的含义总是在足够长的时间范围内变化),交战派别之间的定义差异降低了公共话语的价值,经常使其堕落为令人沮丧的顽固集会之间的错误信息的喊叫比赛。美国政治,有人知道吗?
最见多识广的公开辩论是那些竞争双方之间术语差异很小的辩论,这样当我阐述我的论点时,术语的编码就不会在你试图解码时被误解。强大的公理基础允许出现更深思熟虑的论点,这在趋势技术讨论中尤其重要,在这种讨论中,理解应用潜在干预的含义通常是至关重要且微妙的。
牵制住人工智能
到目前为止,我们只讨论了领域外的人通常如何解读人工智能,但从业者是怎么想的呢?那些至少在坊间如此狂热地嘲笑目光暗淡的公众不理解人工智能的知情人,认为人工智能实际上是什么?我敢打赌,他们自己不会达成任何一致的裁决。此外,我敢打赌,他们会根据受众改变自己的定义,对于那些寻求研究资金的人来说尤其如此;由于人工智能目前的炒作指数很高,你当然会想把它也算进去。顺便说一句,在第二届“ AI 冬季”期间,当一个充满膨胀预期的炒作泡沫破裂后,这个术语被拖进了泥沼,那些留在这个领域的人发现,他们可以通过完全避免这个失去光泽的术语来赚更多的钱。
当该领域的一些人谈论人工智能时,他们实际上指的是机器学习。对于大多数应用程序来说,机器学习是建模中很小的一部分,它位于数据摄取、转换、管理和服务的漫长管道中,涉及许多基础设施和数据仓库、胶合代码、中间件和 REST APIs 等之间的复杂相互作用。机器学习是对欺诈交易进行评分的轻型 GBM,是用于检测乳腺癌的 CNN,是 Word2Vec 注入的推荐引擎。
当这个领域的其他人谈论人工智能时,他们指的是人工智能。,也就是 2018 年让埃隆·马斯克(Elon Musk)夜不能寐的那个东西。对于其他人来说,人工智能只是下一个最大的突破,并且总是感觉触手可及——如果我们能实现<空白>就好了!-但永远达不到目标,因为每一个新完成的里程碑都拉开帷幕,只露出和以前一样的情绪……那个门槛不是这个里程碑,而是下一个,一遍又一遍。道格拉斯·霍夫斯塔德的一句妙语(或者是拉里·特斯勒?)指出“人工智能就是那些还没有被完成的东西”。人工智能中转移目标的想法并不新鲜,但当人们讨论这个话题时,它往往会被忽略。顺便说一下,这种效应被恰当地称为人工智能效应。
现在怎么办?
不管你如何定义这个词,人工智能自 1955 年作为一门学术学科成立以来已经走过了漫长的道路。但它显然离其最神圣的目标还很远:人工智能。今天最先进的模型往往擅长解决非常具体的领域问题,但通常无法一般化,对于更复杂的问题,如图像识别,需要大量的计算能力和训练数据。
我的抱怨并不是说我们过早地给美国大兵下了错误的定义,事实远非如此。而是我们的讨论因不一致而变得模糊不清,我们中的许多人都在用关于人工智能的争论堵塞我们的集体大脑空间,这些争论要么无关紧要,要么被广告商和营销商最近炒作的古怪承诺所操纵。比人工智能的长期威胁或对创新步伐的误导性期望更紧迫的是已经存在的机器学习技术的邪恶应用所带来的短期危险。虽然它不会拼写出 iRobot 意义上的反乌托邦,但肯定会被恶意和不道德地使用,并带来潜在的灾难性影响。现代恶名的一个例子是 Clearview AI 。
说到底,试图为“”达成一个全球共享的叙事是不可行的,也是不可取的。然而,如果参与者理解并承认,没有一个单一的定义,特别是他们的定义,应该成为我们如何构建一场有许多定义的辩论的基础,那么这场辩论的各个分支就不会如此明显。**
感谢阅读。
混淆 P 值与临床影响:显著性谬误
重要性并不意味着重要性——但是你需要它来判断质量

参见附录中的rpubs.com/ericjdaza/607888的重要性并不意味着重要性的证明示意图。
免责声明:本文不支持或反对最近的 remdesivir 发现。相反,它是为了帮助你更好地区分临床发现的重要性和支持或反对这些发现的证据的质量。这两者在新闻中经常被混为一谈——甚至被医生和健康专家混为一谈!
*技术免责声明:为了简单起见,我们将把恢复时间作为连续变量来分析,尽管事件发生时间/存活分析更合适。
2021 年 7 月 26 日更新:见我的更新帖子放弃“统计学意义”了解相关想法和建议在你的论文中使用的语言——以及回复评论者的批评。*
主要教训
- 问问你自己,不管样本大小如何,随机对照试验报告的效应大小估计值是否有意义。
- 训练你自己内在化那种重要性并不意味着重要性。(但是你需要统计学上的显著性,以便判断你的证据的质量。)
- 记住样本大小与效果大小无关。
- 当你真正的意思是“统计显著”时,千万不要只说“显著”。你会被误解为说“重要”。相反,总是说或写出整个短语“统计显著”。
介绍
emdesivir 最近再次成为头条新闻,这要归功于一些新的发现,即它可能有助于缩短住院新冠肺炎患者的康复时间。请记住,这只是一个随机对照试验(RCT),所以我们不会真的知道很多,直到更多的 remdesivir 随机对照试验完成。但是我们甚至可以从这个试验以及它是如何被报道的中学到很多。
在阅读或观看关于 RCT 的新闻时,请注意以下两点:
- 明显的混乱。当你在新闻中听到有人写或谈论来自 RCT 的“重大”发现时,假设他们想要告诉你它在临床或科学上是否有意义或有用。但是相反,当他们真正想报告其科学或临床重要性时,他们会报告其统计显著性。他们会告诉你证据有多好,当他们真的想告诉你治疗有多有用的时候。这是因为他们把他们想要告诉你的科学或临床的事情(即重要性)与证据的质量(即统计学意义)相混淆,而没有真正意识到他们正在做的事情。这被称为“显著性谬误”( Kühberger et al,2015;Silva-aya guer 等人,2010 年;巴尼特和马西森,1997 年。
- (效果)大小很重要。此外,听听他们报告的效果的估计大小(例如,恢复时间从安慰剂组的 15 天减少到 remdesivir 组的 11 天)。这一发现具有“统计显著性”,仅意味着在这一特定研究中有足够的统计证据表明观察到的差异可能是真实的(即,有足够多的患者被招募来检测平均差异)。问问你自己,效应大小在实际的医疗、临床和医院护理中有意义或有用吗?减 4 天够吗?可能会,也可能不会,这取决于具体情况以及特定社区或医院的需求。(例如,参见沙利文和费恩,2012 年。)
不幸的是,对于我们的记者或卫生官员来说,我们将在下面看到统计学意义并不意味着科学或临床重要性。在阅读或聆听这样的报道时,千万不要、千万不要、千万不要、千万不要、*千万不要仅仅抓住“重大”这个词不放。它通常意味着“有统计学意义”,如果没有效应大小的背景和它的临床有用性,它是没有用的。*****
但是,在你将此斥之为“迂腐的统计政策”之前,请继续阅读…
两种假设情景
从数学上讲,仅仅知道一项发现是否具有“统计显著性”是不可能判断它在临床上或科学上是否重要的。
在 RCT 中,“统计显著”效应是指有足够的统计证据支持假设的效应,而不是无效应或其他基线效应(例如,来自护理标准)。这是否意味着该发现在临床或科学上有实际意义?也许是,也许不是。从数学上讲,仅仅知道一项发现是否“具有统计学意义”是不可能判断它在临床上还是科学上是重要的。(参见图 1 和图 2 以及位于 rpubs.com/ericjdaza/607888的附录中的示例和验证草图。)
即使对于给定的效应大小,统计显著性也只能告诉你样本有多大——而不是效应大小有多重要。一般来说,样本大小与效果大小并不相关:招募更多的患者可以增加统计学意义,但不会改善或减少你的药物的临床效果。(本来就是这样。)
也就是说,“统计学意义”与证据的质量息息相关。但是它与“临床重要性”(即,证据显示的东西是否有意义或有用)没有任何关系。出现这种混乱是因为在 RCT 中,“统计学显著性”要么是由一个非常大的治疗效果产生的,要么是由一个效果的大量证据产生的。大多数人——包括我自己——很自然地认为“重大”一词指的是前者。然而,当这些事情中只有一件是真的时,一个发现仍然是“统计显著的”,如下面的两个假设场景。**
首先,让我们假设对所有患者的影响是相同的,但是恢复时间平均变化 2 天(即,标准偏差是 2 天)。我们还假设 15 天是恢复的真实基线时间(即对照结果),因此我们将设计单组试验,其中所有患者都接受雷地昔韦治疗。
在图 1 中,我们看到,在 0.05 的统计显著性水平上,从一项招募 3 名患者的假设性研究中估计的 12 天的大恢复时间减少与从一项招募 16 名患者的研究中估计的 2 天的小恢复时间(p = 0.0012)在定性上是“显著的”(p = 0.0091)。但这作为临床重要性的声明毫无意义!

参见附录中的rpubs.com/ericjdaza/607888中重要性不意味着重要性的证明示意图。**
这在图 2 中可能更清楚,坐标轴翻转了:估计平均减少 12 天(y 轴)不太“显著”(x 轴;p = 0.0091)而不是 2 天中的一天(p = 0.0012)。(图 1 和图 2 是使用双面 t 检验创建的,标准偏差设置为 2 天。代码和细节见附录。)
样本大小与效果大小无关。
为了详细说明这两种情况:
- ****确实有很大的影响,但证据很少。假设 remdesivir 实际上大大缩短了平均 12 天的恢复时间。我们在随访的单臂 RCT 中招募了 3 名患者,并将这种未知的真实效果估计为平均减少 10.6 天——在 0.05 的水平上完成“显著 p 值”为 0.0157。效果如此之大,以至于我们只需要 3 个病人就能看到。(记住,一个 RCT 只能提供一个真实效果的估计。我们几乎肯定会估计真实的影响,每次都有一些变化;这里,10.6 天是对 12 天真实平均效应的估计。p 值也会因样本而异,除非另有说明,否则实际上只是真实 p 值的近似值。)
- ****有一个小的真实影响,但是有很多证据。现在假设 remdesivir 仅平均减少 2 天的恢复时间。我们招募了 16 名患者,估计这种未知的真实效果减少了 2.2 天,其“非常显著的 p 值”为 0.0002。(我们这里大得多的样本量让我们对真实效果有了更精确的估计。)这种影响非常小,我们需要 16 个病人才能看到。
大多数人会同意,第一个发现在直觉上更“重要”:越大越好。然而,这两个发现都是“统计显著的”,10.6 天的估计比 2.2 天的估计“不太显著”(即,更大的 p 值),这与直觉相反。这两个简单的场景说明了为什么“显著性”——作为整个短语“统计显著性”的常见、被误导的简写——并不意味着科学或临床的“重要性”。
简单的解决办法:当你真正的意思是“统计上的显著”时,千万不要只说“显著”。你会被误解为说“重要”。相反,总是说或写出整个短语“统计显著”。
(要更深入地了解这个例子,请参见附录中的 R 代码和完整的模拟结果。)
不仅仅是学术
** [## 国家卫生研究院:新冠肺炎药物的关键研究显示患者对治疗有反应
政府对 Gilead 的 remdesivir 的研究,也许是最密切关注的治疗小说的实验药物…
www.statnews.com](https://www.statnews.com/2020/04/29/gilead-says-critical-study-of-covid-19-drug-shows-patients-are-responding-to-treatment/)
当然,像新闻中这样具有统计学意义的发现仍然传达了好消息:在这个 RCT 中,似乎有足够的统计证据表明,当服用 remdesivir 时,恢复时间从 15 天减少到 11 天,具有临床意义(前提是 RCT 的功率适当;参见 Brownlee,2018Python 统计幂教程)。也就是说,可能有足够的统计支持(即,来自 1,063 名患者的样本)来声称这种影响大小可能接近真实情况。
但是如果上面的场景 2 是真的呢?媒体或健康专家会报道“remdesivir 显著缩短了恢复时间,从 15 天缩短至 13 天”(四舍五入)。你说什么
千万不要 当你真正的意思是“统计上显著”时,就说“显著”。你会被误解为说“重要”。相反,总是说或写出整个短语“统计显著”。
想想这在临床上意味着什么。2.2 天的减量可能没有 10.6 天的减量重要。但是媒体和健康专家会称这两个减少的估计是“显著的”,错误地认为他们报告了临床重要性。也就是说,他们会将统计发现与科学或临床发现混淆。
重要的是,注意甚至医生和健康专家也会犯这个错误。全部。的。时间。
这意味着“统计学意义”和“临床重要性”之间的区别不仅仅是学术上的。它在塑造领导人如何决定治疗新冠肺炎患者的建议方面具有现实世界的公共卫生和政策影响。
统计学有助于科学——但它本身并不是科学。
但是为什么连专家都会犯这个错误呢?我认为原因与“相关性并不意味着因果关系”这句话的流行有关:我们都可以这么说——但我们都仍然不断地努力遵循它。我的理解和观点是,进化让我们将相关性误认为因果关系:看到因果关系——即使根本没有——比偶尔犯下这种认知错误更重要。我的猜测是,我们倾向于结果导向而不是证据导向,原因类似于为什么我们倾向于因果导向而不是关联导向。(进化心理学家和认知科学家,你们的想法?)
但在当今世界,犯下重要性谬误会产生全社会的后果——不仅仅是个人或部落的。有影响力的领导人制定了影响成百上千人的政策,他们不能犯这样的错误。不屈服于自然直觉需要一致的精神警惕。即使是我们这些受过如何不犯这种错误的专门训练的统计学家,仍然会犯错误:毕竟,我们是人。(我保证!)
摘要
统计学有助于科学——但它本身并不是科学。每当你把一个“统计上显著”的发现简单地称为“显著”,你就错误地把统计学和科学混为一谈(瓦瑟斯坦和耶戈,2016 )。据我所知,这很正常。
显著性谬误远非迂腐和学术,而是具有严重的健康含义:无意中将统计数据与科学混淆(特别是对于小效应规模而言)影响了影响数百万人的政策和医疗实践。这每天都影响着你的健康,以及你的朋友和家人的健康。
但正如我们所见,还是有希望的。我们都可以学会做以下事情:
- 问问你自己,不管样本大小如何,RCT 报告的效应大小估计值是否有意义。
- 训练自己内化重要性并不意味着重要性。(但是你需要统计学上的显著性,以便判断你的证据的质量。)
- 记住样本大小与效果大小无关。
- 当你真正的意思是“统计显著”时,千万不要只说“显著”。你会被误解为说“重要”。相反,总是说或写出整个短语“统计显著”。
如果我们中有足够多的人能做到这四件事,我们就能帮助我们的领导者做同样的事情——或者成为重要的领导者。
参考
- p 值的暴政:统计学意义和常识之间的冲突。1997: 534–536.journals.sagepub.com/doi/pdf/10.1177/00220345970760010201
- Python 中统计能力和能力分析的简明介绍。统计学。2018 年 7 月 13 日。machinelingmastery . com/statistical-power-and-power-analysis-in-python/
- 推论统计学中的显著性谬误。BMC 研究笔记。2015 年 12 月;8(1):84.bmcrenotes . biomed central . com/track/pdf/10.1186/s 13104–015–1020–4
- Silva-aya guer LC,Suárez-Gil P,Fernández-Somoano A .卫生科学研究中的零假设显著性检验(1995–2006):统计分析和解释。BMC 医学研究方法论。2010 年 12 月 1 日;10(1):44.【link.springer.com/article/10.1186/1471–2288–10–44
- 使用效应大小——或者为什么 P 值不够。研究生医学教育杂志。2012 年 9 月;4(3):279–82.www.jgme.org/doi/full/10.4300/JGME-D-12-00156.1
- 沃瑟斯坦 RL,耶戈纳。美国儿科学会关于 p 值的声明:背景、过程和目的。2016.tandfonline.com/doi/full/10.1080/00031305.2016.1154108
附录
例子:重要性并不意味着重要性
参见附录中rpubs.com/ericjdaza/607888处的示例和验证草图。
RCT 模拟


在图 A1 ( ggp_pvalues1)中,我们看到所有 10,000 个模拟随机对照试验中的 93%给出了具有统计显著性的真实差异估计值 12(总体统计显著性水平为 0.025)。在图 A2 ( ggp_pvalues2)中,我们看到 92%的 RCT 同样给出了具有统计显著性的真实差异估计值 2。
r 代码**
关于作者
Daza 博士是一名生物统计学家和健康数据科学家,而不是流行病学家,他为个性化(n-of-1)数字健康开发因果推断方法。| ericjdaza.com🇵🇭🇺🇸t16】@埃里克森 t18】linkedin.com/in/ericjdaza|statsof1.org@ stats of@ fsbiostats
版权 2020 埃里克·j·达扎和 Stats-1。保留所有权利。
岗位也可在【rpubs.com/ericjdaza/607888】任职。**
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
p 值的重要问题
对 p 值的误解在研究中很常见。
p 值通常用于科学研究,并在教育实践中教授。本文将讨论零假设显著性检验。我将详细阐述 p 值的含义和误解。
零假设显著性检验
1925 年,罗纳德·费雪写了关于“显著性检验”的文章。费希尔试图检验一个假设,推断是否拒绝零假设。
1933 年,杰吉·内曼和埃贡·皮尔森发表了关于假设检验的文章。他们的方法是比较两个简单的假设,推断采取什么行动。
费希尔和尼曼-皮尔逊之间存在严重分歧。用于零假设显著性检验的现代程序是一个混乱的混合体。混合框架是:
- 陈述无效假设和替代假设。无效假设通常意味着没有影响或没有差异。
- 陈述错误率。第一类错误是当零假设为真时拒绝零假设的长期概率。(这就是通常所说的显著性水平。)
- 收集完数据后,计算测试统计量。
- 对于检验统计,计算相关的 p 值。
- 如果 p 值小于规定的显著性水平(步骤 2),则拒绝零假设。如果 p 值更大,不要拒绝这个假设。
美国统计协会非正式地将 p 值定义为:
在特定的统计模型下,数据的统计汇总等于或大于其观察值的概率。
零假设显著性检验的主要目的是通过矛盾来证明。如果零假设是真的,那么观察到的数据可能是不寻常的。如果观察到的数据不寻常,拒绝那个假设。
p 值不是什么
关于 p 值是什么,研究人员有很多困惑。美国统计协会在 2016 年发表了他们的声明。该声明希望纠正对 p 值的误解。
p 值是给定模型和观测数据之间兼容性的度量。“统计显著性”是 p 值的二元分配。
p 值不是零假设为真的概率。
p 值假设零假设为真。这不是假设的概率。
p 值不是结果偶然发生的概率。
p 值计算假设 chance 单独运行。同样,它不可能是那个假设的概率。
0.05 的阈值是约定俗成的。
这个惯例来自于研究人员统计方法中的一句话:
P = .05 或 1/20 的值是 1.96 或接近 2;在判断一个偏差是否被认为是重大的时候,以这一点为界限是很方便的。
p 值不显示效果的大小或重要性。
当一项研究规模很大时,小的影响会产生“重大”的结果。
框架问题
零假设显著性检验框架有几个问题。
Fisher 的 p 值与 Neyman-Pearson 假设检验不相容。结合两种方法会导致内部不一致。Fisher 的 p 值是一个间接的证据衡量标准,使用的数据来自一个单一的研究。尼曼-皮尔森框架是关于在许多研究中设定错误的长期频率。p 值在他们的决策过程中不起作用。
经典统计学不为假设分配概率。研究人员经常问:给定我的数据,假设的概率是多少?p 值提供:给定假设,我的数据的概率是多少,或者更极端的情况?概率的经典定义是事件的长期频率。这个定义意味着我们不能给假说一个概率。这个假设成立与否。
分配假设很重要。我们赋予数据的基本分布很重要。这是进行 p 值计算的假设的一部分。使用不同模型下的相同数据,p 值可能会有很大差异。

相同的数据,不同的假设。(图片: ggplot2 )
你如何收集数据很重要。关于 p 值计算的另一个经常被提及的假设是数据收集。如果我们打破这个假设,p 值只在我们不关心的另一个宇宙中有意义。
零假设被拒绝。完全没有影响或差异通常是一个虚假的假设。
“重大”和“非重大”结果并不冲突。两项研究可以估计完全相同的效应大小。一个是‘重大’。另一个不是。区别在于中央估计的精度。

在这里,同样的效果既有“显著的”也有“不显著的”。(图片:自然)
二元区分鼓励过度自信。有人认为如果 p = 0.051,他们不能拒绝零假设,但是如果 p = 0.051,他们会拒绝吗?“重要”和“不重要”之间可以是不重要的。
多重比较会给出误导性的结果。对同时进行的多项测试的处理可能会令人困惑。存在多种方法来“校正”显著性水平,但并不总是适用。
小影响不一定为零。例如,我们可以跟踪一段时间内的估计失业率。每个变化都在抽样误差范围内。然而,大的变化可以从累积的小变化中发生。一点一点,一点变成很多。
在统计实践中,研究设计、数据收集和分析以及令人信服的表述至关重要。研究估计影响,我们应该用不确定性来描述。正如美国统计协会所说:
没有一个单一的指数可以替代科学推理。
用 Python 实现自然语言处理中单词嵌入的简单方法
使用 Gensim 和 Plotly 探索单词嵌入

学习 NLP 的下一步?
当头脑风暴研究新的数据科学主题时,我总是倾向于自然语言处理(NLP)。这是一个快速发展的数据科学领域,不断有创新需要探索,我喜欢分析写作和修辞。NLP 自然符合我的兴趣!之前,我写了一篇关于使用“单词袋”模型开始 NLP 的简单项目的文章。本文旨在通过探索使用 Word2Vec 通过 Python Gensim 库生成单词嵌入的快捷方式,从而超越简单的“单词包”方法。

https://radimrehurek.com/gensim/
传统单词包 vs Word2Vec
当我开始探索自然语言处理(NLP)时,我了解的第一个模型是简单的单词袋模型。尽管它们非常有效,但也有局限性。
传统的词汇袋方法
单词包(BoW) 是描述文本语料库中单词出现的文本表示,但不解释单词的顺序。这意味着它对待所有的单词都是相互独立的,因此得名单词包。
BoW 由一组单词(词汇)和一个类似于频率或 TF-IDF 的指标组成,用来描述每个单词在语料库中的值。这意味着如果词汇表非常大,BoW 会导致稀疏矩阵和高维向量,这会消耗大量计算机资源。
为了简化弓向量化的概念,假设您有两个句子:
狗是白色的
猫是黑色的
将句子转换为向量空间模型会以这样的方式转换它们,即查看所有句子中的单词,然后用数字表示句子中的单词。如果句子是一次性编码的:
狗是白色的猫是黑色的
狗是白色的= [1,1,0,1,1,0]
猫是黑色的= [1,0,1,1,0,1]
BoW 方法有效地将文本转换成用于机器学习的固定长度向量。
Word2Vec 方法
由谷歌的一组研究人员开发的 Word2Vec 试图解决 BoW 方法的几个问题:
- 高维向量
- 假设彼此完全独立的词
使用只有几层的神经网络,Word2Vec 试图学习单词之间的关系,并将它们嵌入到低维向量空间中。为此,Word2vec 根据输入语料库中与其相邻的其他单词来训练单词,从而捕获单词序列中的一些含义。研究人员设计了两种新方法:
- 连续的单词袋
- 跳跃图

CBOW 架构基于上下文预测当前单词,而 Skip-gram 根据当前单词预测周围的单词。
这两种方法都会产生一个向量空间,该向量空间基于上下文含义将单词向量紧密地映射在一起。这意味着,如果两个单词向量很接近,那么基于它们在语料库中的上下文,这些单词应该具有相似的含义。例如,使用余弦相似性来分析他们的数据产生的向量,研究人员能够构建类似于国王减去男人加上女人 =?
最匹配皇后的输出向量。
king - man + woman = queen
如果这看起来令人困惑,不要担心。应用和探索 Word2Vec 很简单,随着我对示例的深入,它会变得更有意义!
依赖性和数据
Python 库 Gensim 使得应用 Word2Vec 以及其他几种算法来进行主题建模变得很容易。Gensim 是免费的,可以使用 Pip 或 Conda 安装:
pip install --upgrade gensimORconda install -c conda-forge gensim
数据和所有代码可以在我的 GitHub 中找到,并且是与前一篇文章中使用的垃圾邮件数据集相同的 repo。
[## bendgame/nlpBeginnerProjects
NLP 中级入门项目。通过创建帐户,为 bendgame/nlpBeginnerProjects 的开发做出贡献…
github.com](https://github.com/bendgame/nlpBeginnerProjects)
导入依赖项
from gensim.models import Word2Vec, FastText
import pandas as pd
import refrom sklearn.decomposition import PCAfrom matplotlib import pyplot as plt
import plotly.graph_objects as goimport numpy as npimport warnings
warnings.filterwarnings('ignore')df = pd.read_csv('emails.csv')
我首先使用 Pandas 加载库并读取 csv 文件。
探索 Word2Vec
在处理电子邮件数据之前,我想用一个简单的例子来探索 Word2Vec,这个例子使用了几个句子的小词汇表:
sentences = [['i', 'like', 'apple', 'pie', 'for', 'dessert'],
['i', 'dont', 'drive', 'fast', 'cars'],
['data', 'science', 'is', 'fun'],
['chocolate', 'is', 'my', 'favorite'],
['my', 'favorite', 'movie', 'is', 'predator']]
生成嵌入
注意,句子已经被标记化了,因为我想在单词级而不是句子级生成嵌入。通过 Word2Vec 模型运行句子。
# train word2vec model
w2v = Word2Vec(sentences, min_count=1, size = 5)print(w2v)
#Word2Vec(vocab=19, size=5, alpha=0.025)
注意,在构建模型时,我传入了 min_count =1 和 size = 5 。也就是说,它将包含出现≥ 1 次的所有单词,并生成一个固定长度为 5 的向量。
请注意,打印时,模型会显示唯一 vocab 单词的计数、数组大小和学习率(默认为. 025)
# access vector for one word
print(w2v['chocolate'])#[-0.04609262 -0.04943436 -0.08968851 -0.08428907 0.01970964]#list the vocabulary words
words = list(w2v.wv.vocab)print(words)#or show the dictionary of vocab words
w2v.wv.vocab

考察词汇的两种不同方法
注意,一次可以访问一个单词的嵌入。
注意,可以使用w2v . wv . vocab .以几种不同的方式复习词汇中的单词
可视化嵌入
既然已经使用 Word2Vec 创建了单词嵌入,那么可以使用一种方法来可视化它们,以在展平的空间中表示矢量。我使用 Sci-Kit Learn 的主成分分析 (PCA)功能将单词向量展平到 2D 空间,然后使用 matplitlib 将结果可视化。
X = w2v[w2v.wv.vocab]
pca = PCA(n_components=2)result = pca.fit_transform(X)# create a scatter plot of the projection
plt.scatter(result[:, 0], result[:, 1])
words = list(w2v.wv.vocab)for i, word in enumerate(words):
plt.annotate(word, xy=(result[i, 0], result[i, 1]))plt.show()

单词嵌入图
幸运的是,语料库很小,所以很容易可视化;然而,很难从标绘的点中解读出任何意义,因为该模型可以学习的信息如此之少。
可视化电子邮件单词嵌入
现在我已经完成了一个简单的例子,是时候将这些技巧应用到更大的数据中了。通过调用 dataframe head()检查邮件数据。
df.head()

df.head()
清理数据
请注意,文本根本没有经过预处理!使用一个简单的函数和一些正则表达式,清除文本中的标点符号和特殊字符,并将其全部设置为小写很简单。
clean_txt = []
for w in range(len(df.text)):
desc = df['text'][w].lower()
#remove punctuation
desc = re.sub('[^a-zA-Z]', ' ', desc)
#remove tags
desc=re.sub("</?.*?>"," <> ",desc)
#remove digits and special chars
desc=re.sub("(\\d|\\W)+"," ",desc)
clean_txt.append(desc)df['clean'] = clean_txt
df.head()

df.head()显示干净的文本
请注意,数据帧中添加了 clean 列,文本中的标点符号和大写字母已被清除。
创建语料库和向量
因为我想要单词嵌入,所以文本需要标记化。使用循环的,我遍历标记每个干净行的数据帧。创建语料库后,我通过将语料库传递给 Word2vec 来生成单词向量。
corpus = []
for col in df.clean:
word_list = col.split(" ")
corpus.append(word_list)#show first value
corpus[0:1]#generate vectors from corpus
model = Word2Vec(corpus, min_count=1, size = 56)

文集
请注意,数据已经进行了标记化,可以进行矢量化了!
可视化电子邮件单词向量
电子邮件数据的语料库比简单示例大得多。由于包含了很多单词,我不能像使用 matplotlib 那样绘制它们。

用 matplotlib 可视化电子邮件单词
祝你理解这一点!是时候使用不同的工具了。代替 matplotlib ,我将使用 plotly 生成一个可以缩放的交互式可视化。这将使探索数据点变得更加容易。
我再次使用主成分分析技术。然后我把结果和单词放入一个数据框中。这将使 plotly 中的图形和注释更容易。
#pass the embeddings to PCA
X = model[model.wv.vocab]
pca = PCA(n_components=2)
result = pca.fit_transform(X)#create df from the pca results
pca_df = pd.DataFrame(result, columns = ['x','y'])#add the words for the hover effect
pca_df['word'] = words
pca_df.head()
请注意,我将单词 column 添加到了 dataframe 中,因此当鼠标悬停在图表上的点上时,就会显示该单词。

PCA_df.head()
接下来,使用 ploty Scattergl 构建散点图,以在大型数据集上获得最佳性能。有关不同散点图选项的更多信息,请参考文档。
N = 1000000
words = list(model.wv.vocab)
fig = go.Figure(data=go.Scattergl(
x = pca_df['x'],
y = pca_df['y'],
mode='markers',
marker=dict(
color=np.random.randn(N),
colorscale='Viridis',
line_width=1
),
text=pca_df['word'],
textposition="bottom center"
))fig.show()
注意,我使用 Numpy 为图形颜色生成随机数。这使它在视觉上更有吸引力!
注意,我将文本设置到 dataframe 的单词列。当鼠标悬停在数据点上时,会出现该单词。

Plotly 很棒,因为它可以生成交互式图形,并且允许我放大图形,更近距离地检查点。

放大
使用单词嵌入进行分析和预测
除了可视化嵌入之外,还可以用一些代码来探索它们。此外,模型可以保存为文本文件,以便在将来的建模中使用。查看 Gensim 文档,了解完整的功能列表。
#explore embeddings using cosine similarity
model.wv.most_similar('eric')model.wv.most_similar_cosmul(positive = ['phone', 'number'], negative = ['call'])model.wv.doesnt_match("phone number prison cell".split())#save embeddings
file = 'email_embd.txt'
model.wv.save_word2vec_format(filename, binary = False)
Gensim 使用余弦相似度来查找最相似的单词。
请注意,评估类比并找出与其他单词最不相似或不匹配的单词也是可能的。

查找相似单词的输出
使用嵌入
我不会在本文中涵盖完整的示例,但是在预测建模中使用这些向量是可能的。为了使用嵌入,需要映射单词向量。为了使用训练好的模型将多个单词的文档转换成单个向量,通常取文档中所有单词的 word2vec,然后取其平均值。
mean_embedding_vectorizer = MeanEmbeddingVectorizer(model)
mean_embedded = mean_embedding_vectorizer.fit_transform(df['clean'])
要了解更多关于在预测建模中使用 word2vec 嵌入的信息,请查看 kaggle.com 的笔记本。
[## 基本自然语言处理:单词包,TF-IDF,Word2Vec,LSTM
使用 Kaggle 笔记本探索和运行机器学习代码|使用来自个性化医疗的数据:重新定义癌症…
www.kaggle.com](https://www.kaggle.com/reiinakano/basic-nlp-bag-of-words-tf-idf-word2vec-lstm) 
添加了数组列的数据帧
最后的想法
使用 Word2Vec 模型可用的新方法,很容易训练非常大的词汇表,同时在机器学习任务上获得准确的结果。自然语言处理是一个复杂的领域,但是有许多 Python 的库和工具可以使入门变得简单。如果您有兴趣了解更多关于 NLP 或数据科学的知识,请查看我的其他文章:
[## 用 Python 收集自然语言处理(NLP)文本的入门指南
通过 API 和 Web 抓取收集文本
towardsdatascience.com](/ultimate-beginners-guide-to-collecting-text-for-natural-language-processing-nlp-with-python-256d113e6184)
谢谢大家!
- 如果你喜欢这个, 在 Medium 上关注我 获取更多
- 通过订阅 获得对我的内容的完全访问和帮助支持
- 我们来连线一下LinkedIn
- 用 Python 分析数据?查看我的 网站
对期望简单而深刻的介绍
"期待意想不到的事情显示了完全现代的智慧."——奥斯卡·王尔德

Sebastian Unrau 在 Unsplash 上拍摄的照片
在这篇文章/故事中,我们将通过美丽的图表及其背后的概念来理解期望的概念。这个故事是这篇文章的延伸。
什么是期望?
期望值是当我们进行某个实验时,出现的几率高的随机变量的值。
实验或随机过程
任何事情都可以是实验或随机过程:从阅读一本书到写博客,从吃早餐到健身,从云的移动到树叶的脱落,任何事情都可以被视为我们的主题,并仔细监控每个行动的结果。
为了简单起见,让我们继续把掷硬币或掷骰子作为统计实验的主题。如果我们掷硬币和掷骰子,可能会有什么结果?硬币的结果是Head或Tail,骰子的结果是1或2或3或4或5或6。
随机变量
简单来说,量化一个随机过程定义为随机变量。一个随机变量可以是统计(量化)整个月我们一天走了多少个脚步(随机过程),也可以是整个月我们每天在镜子上看到自己美丽瑰丽的脸多少次等等。
通常随机变量被表示为X。为了简单起见,让我们把掷硬币和掷骰子(随机过程)的结果(量化值)作为我们的随机变量。
出现的机会
这被简单地称为概率。一些现实生活中的例子可以是,蜜蜂访问百合花或茉莉花或两者的机会,切叶蚁群赢得对黄色疯狂蚁群的战争的机会,或反之亦然。
解释概率的观察
让我们想象我们家有麻雀。麻雀夫妇快乐地筑巢并下一个蛋。现在,那个蛋变成小麻雀的概率是多少?嗯,这个问题有两种可能性或结果,要么鸡蛋可能孵化并成为小麻雀(快乐的结果),要么鸡蛋会掉下来,打破并失去生命的本质(这真的在我家发生过几次,是悲惨的结果)。

照片由 Belinda Fewings 在 Unsplash 上拍摄
我们都需要一个快乐的结局。在这里,在这种情况下,麻雀需要它们的蛋进化成小麻雀,但不要在上面的悲惨结局中崩溃并神秘地失去生命。
但是我们如何精确地量化它呢?我们的大脑理解数字。为了填补这个空白,数学家们提出了一个叫做概率的概念。
概率是指事件发生或不发生的机会。在这里,机会代表了可观测宇宙中任何事件的不确定性(意味着它可能发生或不发生)。因此,概率给出了不确定性元素的数值度量。
概率值的范围在0和1之间。如果我们知道某个特定事件是确定的,那么这个事件的概率是 1,例如,太阳每天都会升起,不管是什么季节。类似地,如果我们不确定某个事件是确定的,那么该事件的概率就不是 1。

拉普拉斯的定义和作者的形象
在上面的观察中,一个蛋成为小麻雀的概率是1/2,一个蛋面临悲惨结局的概率也是1/2。而确定和不确定结果的概率之和是P + Q = 1。
让我们把这些点联系起来,这次用流程图。

作者图片
因此,我们有一个随机过程,从中提取一个随机变量X,用它来构造一个概率分布表,我们取XP(X)的总和,最后,我们计算期望值,即E(X)。
是时候写点真正的代码了
按作者编码—导入所有必需的 API
按作者编码—计算期望值并返回概率分布表
我们将为硬币实例化,
作者代码—硬币的实例化
输出:
No. of Coins in the Experiment: 8

作者图片
E(X) = 4.0
8 枚硬币的概率分布表
该图清楚地显示了期望值E(X)是4。4 发生的概率很大。我们在代码中做了什么?我们随机得到 8 枚硬币,如果我们同时扔这 8 枚硬币,结果会是,
['HHHHHHHH', 'HHHHHHHT', 'HHHHHHTT', 'HHHHHTTT', ..., 'TTTTTTTT']
这就是我们的样本空间。一旦我们有了样本空间,我们现在对每个H或T进行计数,这个选择将是随机的(在代码的第 34 行中定义)。这里的计数基本上就是我们的随机变量。最后,我们计算计数的概率。根据我们的结果,我们有 4 个,因为最有可能发生和平均概率条形图清楚地描述了 4,它具有更高的高度。
我们将为骰子实例化,
作者代码—骰子的实例化
输出:
No. of Dice in the Experiment: 6

作者图片
E(X) = 21.0
6 个骰子的概率分布表
这个情节清楚地表明了期望E(X)是21。21 发生的概率很大。让我们来理解代码,我们随机得到 6 个骰子,它们一次全部掷出。所以我们有这样的总结果,
[1 1 1 1 1 1] = 6
[1 1 1 1 1 2] = 7
[1 1 1 1 1 3] = 8
...
[6 6 6 6 6 4] = 34
[6 6 6 6 6 5] = 35
[6 6 6 6 6 6] = 36
上述结果的 L.H.S 是我们的随机变量,也就是说,我们用 sum 来量化骰子的结果(在代码的第 40 行中定义)。最后,我们计算和的概率。根据我们的结果,我们有 21 个,因为最有可能发生,甚至概率条形图清楚地描述了 21 个具有更高的高度。
我们都需要注意的一件事是,从上面的图表(硬币和骰子)中我们观察到,4 和 21 有更大的高度。这也意味着 4 和 21 是我们进行的实验中最预期的结果。令人兴奋的是 4 和 21 位于图表的中心。这意味着什么?这意味着任何随机变量的期望都是该分布的一个中心度量。由此可见,期望是中心倾向的量度之一。
让我们先来关注一下硬币。以下是同时投掷 8 枚硬币的结果。
['HHHHHHHH' 'HHHHHHHT' 'HHHHHHTH', ..., 'TTTTTTTT']
现在,让我们假设我们对H感兴趣。所以,这就给了我们一个简单的理解,Count(H)是一个投掷 8 个硬币(随机过程)的量化标准。因此,我们现在可以说,Count(H) = X。下表中的X用四个不同的列表示(这样做是为了表格的可读性)。
量化随机过程 X
我们得到了随机变量X,现在我们可以单独计算概率。根据上面的定义,我们得到下面的概率。
P ( X)表
奇怪为什么用256做分母?256 是同时投掷 8 枚硬币产生的结果总数。
神奇的事情发生在我们计算X P(X)的时候。让我们快速计算一下。
X P ( X)表
X = 0 => 0 * P(0) => **0 * (1/256)**
X = 1 => 1 * P(1) => **1 * (8/256)**
X = 2 => 2 * P(2) => **2 * (28/256)**
X = 3 => 3 * P(3) => **3 * (56/256)**
X = 4 => 4 * P(4) => **4 * (70/256)**
X = 5 => 5 * P(5) => **5 * (56/256)**
X = 6 => 6 * P(6) => **6 * (28/256)**
X = 7 => 7 * P(7) => **7 * (8/256)**
X = 8 => 8 * P(8) => **8 * (1/256)****E(X) = Sum(XP(X))
= [(0*1) + (1*8) + (2*28) + (3*56) +(4*70) +
(5*56) + (6*28) + (7*8) + (8*1)] / 256****E(X) = 4.0**
我们现在粗略地看一下没有概率的总结果。
[8, 7, 7, 6, 7, 6, 6, 5, 7, 6, 6, 5, 6, 5, 5, 4,
7, 6, 6, 5, 6, 5, 5, 4, 6, 5, 5, 4, 5, 4, 4, 3,
7, 6, 6, 5, 6, 5, 5, 4, 6, 5, 5, 4, 5, 4, 4, 3,
6, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2,
7, 6, 6, 5, 6, 5, 5, 4, 6, 5, 5, 4, 5, 4, 4, 3,
6, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2,
6, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2,
5, 4, 4, 3, 4, 3, 3, 2, 4, 3, 3, 2, 3, 2, 2, 1,
7, 6, 6, 5, 6, 5, 5, 4, 6, 5, 5, 4, 5, 4, 4, 3,
6, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2,
6, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2,
5, 4, 4, 3, 4, 3, 3, 2, 4, 3, 3, 2, 3, 2, 2, 1,
6, 5, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 3, 2,
5, 4, 4, 3, 4, 3, 3, 2, 4, 3, 3, 2, 3, 2, 2, 1,
5, 4, 4, 3, 4, 3, 3, 2, 4, 3, 3, 2, 3, 2, 2, 1,
4, 3, 3, 2, 3, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 0]
我们现在将对上述数字进行频率分析。
Count(0) is **1**
Count(1) is **8**
Count(2) is **28**
Count(3) is **56**
Count(4) is **70**
Count(5) is **56**
Count(6) is **28**
Count(7) is **8**
Count(8) is **1**
如果我们观察,上面的频率与 P(X)列的 P(X)表的分子相匹配。如果我们计算结果的平均值,它将是 4,这是一个高频率。
现在很清楚了,期望值只是总结果的平均值。因此,通过查看概率分布图,可以找出该分布的期望值。
结论
无论我们何时进行实验,从长远来看,大多数结果都是集中的,因此它们是高度期望的。
新冠肺炎数据如此令人困惑的原因很简单
为什么准确的报告不够好
考虑报道新冠肺炎数据的两个说明性标题:
1 |年轻人在新冠肺炎住院人数中占很大比例
在美国首次报告的病例中,超过 40%需要住院治疗的患者年龄在 65 岁以下。
2 |年轻人的新冠肺炎不太严重
约 10%的 65 岁以下确诊新冠肺炎病例的成年人最终会住进医院,比更大年龄组的人住院的可能性低 70%。
这两个说明性的标题都是准确的[1],然而却存在清晰性的危机:它们向更年轻、更健康的人传递了关于新冠肺炎风险的相互矛盾的信息。
40%的年轻人面临的潜在风险和 10%的更相关风险之间存在巨大差异。由信息冲突引起的认知失调会产生不良影响,包括人们不予理睬,或者更糟——得出错误的结论,或者最糟糕的——以错误的行为回应。
穿越混乱
读者必须调和两个标题,才能使其中任何一个成为有意义的新闻。[2]不幸的是,在没有更多信息的情况下,不可能调和这两个标题,所以我们用与这两个标题一致的(假设的)数据建立了一个表格:

两种视图:政治家和专业人士跨行查看数据,但媒体和普通大众希望查看列下的数据。
像这样的二维表格可以有两种解读方式:水平方向(各行的百分比总和为 100%);和垂直方向(其中百分比加起来为 100%)。
水平视图对应第一个标题。这是政治家和专业人士的观点,他们放眼整个社会。重要的是,在这个视图中收集数据要容易得多——只需计算医院中的人数。以这种方式组织的数据对于资源和容量规划非常有用。
垂直视图对应第二个标题。这是普通大众的观点,包括大多数媒体。它回答了“这对我意味着什么?”不幸的是,垂直视图的数据更难收集,而且很少以这种方式呈现。
这就是了——同样的信息,两种准确但不同的观点和解释。原因很简单,年轻的成年人可以在住院率低的情况下占住院率的很大比例?年轻人比老年人多得多。
我们需要总体人口的这一关键“先验信息”来调和这两种观点,但它经常被忽略——这是丹尼尔·卡内曼(和其他人)所谓的“基础率忽视”的一种形式[3]
混乱的观点,混乱的人
现在我们明白了两种观点都是正确的,并且各自回答了不同但重要的问题,这意味着没有问题吗?
不,有一个很大的问题:大多数时候数据是以水平视图呈现给我们的,而我们大多数人感兴趣的是垂直视图问题:“它对我来说意味着什么?”[4]
混乱的观点导致混乱的人。许多人只是不予理会。其他人得出了错误的结论——在这种情况下,令人震惊但错误的结论是,超过 40%的年轻新冠肺炎患者正在住院治疗。"混杂的信息让人们追随他们的偏见,相信他们想要的一切."[5]
更糟糕的是:当“专家”(横向)观点和“大众”(纵向)观点不一致时,就会滋生对专家及其动机的不信任。不清晰的准确性可能会导致“回旋镖效应”,即试图说服而导致采取相反立场的意外后果。[6].
在新冠肺炎疫情的早期阶段,美国医务总监杰罗姆·亚当斯博士要求美国人停止购买口罩,因为“它们不能有效防止公众感染#冠状病毒,但如果医疗保健提供商不能让他们照顾病人,就会使他们和我们的社区处于危险之中。”他有理由担心医疗保健系统(横向视角),但模糊了公众面临的风险(纵向视角)。[7]
然而,许多人都知道亚洲国家是如何将口罩视为人身安全的必需品的,这引起了人们的困惑,并让人对美国专家及其动机产生了怀疑。可悲的是,一些人的反应与专家的意图相反——起初是囤积口罩,后来(在专家改变方针后)拒绝佩戴口罩。
数据科学家的准确性和清晰性
认识到有两种观点,为数据科学家提供了一个领导追求准确性和清晰性的机会。我们之前提到过,通常很难为垂直视图编译人口数据。当我们把人口分成小群体时,尤其如此。
假设新冠肺炎住院数据缺少垂直视图的大部分数据:

假设您正在修补来自三个来源的信息:
- 一项研究告诉我们,在新冠肺炎病例中,年轻人和老年人各占 70%—30%;
- 一项医院调查显示,超过 40%的住院患者是年轻人;和
- 测试数据显示,17%的新冠肺炎确诊病例正在住院治疗。
注意,1。第二。是水平视图数据,以及 3。是垂直视图数据。你想回答垂直视角的问题:“这对我意味着什么?”
贝叶斯法则提供了一种结合水平和垂直视图来推断缺失信息的优雅方式。即使大部分垂直视图不可用(通常是这样),您也可能有足够的信息来创建它:

贝氏救援队。

求解“我们想知道的”

水平和垂直视图的贝叶斯可视化:小方框中表示的住院是准确的,但不清楚。大框中关于人口的上下文信息提供了急需的清晰度。
为了清楚起见,我们能做什么?
任何展示表格数据的人都可以通过阐明水平或垂直视图(只要有可能,两者都要)为公共话语提供很好的服务。明确哪个方向加 100%!清晰是一种天赋……你建议、教导和说服他人的能力——以及最终被理解的能力——取决于此。

现在庆祝吧!
参考
[1]这些标题是根据 2020 年 5 月中旬至下旬的报告和调查合成的。
[2]赫伯勒,雷。(2020 年 4 月 29 日)。如何利用贝叶斯定理更智能地消费新闻。 走向数据科学 。
【3】基础利率谬误。(2020).维基百科。(检索于 2020 年 6 月 7 日。)
[4]举一个最近来自瑞士的例子:Schild,Darcy。(2020 年 5 月 31 日)。根据一份新的报告,大约 40%的新冠肺炎重症监护病人不到 60 岁。内幕。
[5]约翰逊。如何组织公共卫生信息,让人们听到? 学人 。(2020 年 4 月 4 日。)
【6】回旋镖效应(心理学)。(2020).百科。(2020 年 6 月 7 日检索。)
[7]阿斯梅拉什,利亚。(2020 年 3 月 2 日)。卫生局局长希望美国人停止购买口罩【视频文件】。 CNN。
关于认知偏差和新冠肺炎的进一步阅读,如指数增长谬误和习得无助:
关于作者
马修·拉斐尔森马修是一名管理顾问,他通过数据科学帮助公司增加收入。此前,他是一名高级财务主管,拥有 25 年应用定量建模和数据科学来启动和管理数十亿美元业务的经验。他是 ProbabilityManagement.org 大学金融应用系主任,拥有斯坦福大学商学院的 MBA 学位。
Raj DevRaj 是一位利用数据科学和分析技术做出人才和人员决策的倡导者。Raj 是 EleveneX 的管理合伙人。此前,Raj 是不可能食品公司的人力运营副总裁。在此之前,他曾在 Credit Sesame 和特斯拉担任高级管理职务。Raj 拥有耶鲁管理学院的工商管理硕士学位。
监督学习和非监督学习的简单术语
数据科学和机器学习
用机器学习解决任务的算法可以分为两种主要类型,有监督的和无监督的

来自 Pexels 的 Artem Podrez 摄影
在这篇文章中,我想谈一谈用机器学习解决问题的方法。
一般来说,我发现在一个特定的例子(图像分类)的上下文中考虑监督和非监督学习是有帮助的。在这种情况下,您已经得到了一组车辆类型的图像。
监督
监督学习意味着我们的训练数据是由图像和它们对应的类别标签组成的。假设你有汽车、自行车、公共汽车和其他东西的图片,它们都有自己的名字或者被称为真相。接下来,您可以训练一个接受图像作为输入的图像分类器。目标是生成一个尽可能接近实际类标签的标签。当您训练分类器时,它会尝试提高其准确性。
监督学习意味着我们有一个特定的目标;在这种情况下,已知的标签,在训练过程中瞄准。当模型在学习上高度准确时,我们就成功地训练了如何预测实际标签,给定它以前没有见过的新数据。换句话说,不属于训练集的数据。
无人监督的
让我们思考一下,如果我们没有被贴上任何标签,你会如何完成这项任务。所以我们的训练集是由未标记的图像组成的。我们必须采取无人监管的方法。这意味着,我们不能依赖于给出如何对所有带标签的数据进行分组的信息,而必须在数据中找到自然的分组。
您可以训练一种算法,根据颜色或几何特征的相似性将图像分成不同的组。但是您没有办法检查这些分组是正确的还是不正确的。所以没有衡量准确性的标准。
您必须开发一种新的度量标准来将数据分组。类似于相似和不同数据组之间的距离,在训练结束时,将以图像聚类算法结束。图像聚集在一起的方式是为了让我们对给定数据集中自然出现的模式有所了解。
现在,我们来讨论一下模型设计和算法选择。选择无监督或有监督的方法与你的最终目标有很大关系。
当你的最终目标相对简单时,无监督学习通常是最有用的。
例如,当您只想对相似的观察结果进行分组时,您不需要关于每个视图的大量细节。要将车辆分为汽车、自行车和公共汽车,您可能不需要特定的汽车型号。或者,假设你被要求区分不同型号的汽车,比如特斯拉和丰田普锐斯的图像。
您可能需要对车辆图像数据进行额外的标记,以训练特定的分类模型(Jing 等人,2012)。如果您有许多未标记的数据,您可能想知道如何有效地标记这些数据。不幸的是,数据标记是一项密集的人工任务。理想情况下,您会希望将原始图像发送给能够手动绘制不同汽车模型的边框的人,因为识别汽车模型是您正在解决的问题。
Lorbach,Poppe 和 Veltkamp (2019)还想到了在主动学习模型的帮助下自动化数据标注任务的方法,这种机器学习模型可以从初始的人类注释中学习。像亚马逊 SageMaker 这样的服务将这两种能力和方法结合起来,将数据发送给真实的人,并为未来的任务创建一个主动学习模型,成为一个名为地面真相的功能。
Ground truth 试图解决从原始数据到标签训练数据的问题。它允许你首先发送你的一些数据来被人类标记,而不是得到这些初始的标签。它训练了一个机器学习模型,该模型学习在未来自动执行这一标记任务。总体而言,这些技术将未来标注相似数据集的时间和成本减少了约 70%。
k 均值聚类
一种常用的图像分割技术是 K 均值聚类。这是一种机器学习技术,通过对具有相似特征的数据点进行聚类或分组,将图像分成片段。
K-means 被称为无监督学习方法,这意味着你不需要标记数据。相反,无监督学习旨在对未标记的数据集进行分组和表征。在这样做的时候,它经常识别数据组中的模式和相似性。你可以给 K-means 一组任何未标记的数据。
因此,您可以给 K-means 一组任何未标记的数据,如图像中的像素值,并告诉它将其分成 K 个簇,其中 K 是一个变量,其值由您选择。
结论
监督学习让你从以前的经验中收集数据或生成输出。你用标有的数据训练机器。然而,无监督学习是一种机器学习技术,其中你不需要监督模型,它可以帮助你发现数据中的各种未知模式。
关于作者
Wie Kiang 是一名研究员,负责收集、组织和分析意见和数据,以解决问题、探索问题和预测趋势。
他几乎在机器学习和深度学习的每个领域工作。他正在一系列领域进行实验和研究,包括卷积神经网络、自然语言处理和递归神经网络。
**References**#1 Jing, X.-Y., Li, S., Zhang, D., Yang, J., Yang, J.-Y., 2012\. Supervised and Unsupervised Parallel Subspace Learning for Large-Scale Image Recognition. IEEE Transactions on Circuits and Systems for Video Technology. doi:10.1109/tcsvt.2012.2202079#2 Lorbach, M., Poppe, R., Veltkamp, R.C., 2019\. Interactive rodent behavior annotation in video using active learning. Multimedia Tools and Applications. doi:10.1007/s11042-019-7169-4#3 [Amazon Sagemaker](https://aws.amazon.com/sagemaker/)
用 Python 制作 gif 和数学视频最简单快捷的方法

图像由作者提供——SVM 分类器的判定边界演变(用赛璐珞制成)
如何使用赛璐珞在几秒钟内制作出令人惊叹的动画
赛璐珞,简单的 Matplotlib 动画
我真的很喜欢使用数据可视化,当我必须解释一些结果或复杂模型时,我总是想知道提供更直接和直观的可视化交互的最佳方式是什么。
最近,我开始使用 gif 和快速视频。即使这使得编码部分更加困难和复杂,结果通常在交流我的发现和过程时更加有效。
但是在 Python 中,总有更容易、更简单的方式,为了简化动画制作过程, 赛璐珞 就这样诞生了。
仅使用 50 行代码来处理 Matplotlib Artists 和 ArtistAnimations 赛璐珞从您想要绘制到相机抽象中的一系列图像创建一个动画。
让我们从用
$ pip install celluloid
现在让我们开始吧!
四个使用示例
- 最简单的一个
- 进化图
- 使用图像
- 使用动态标签和标题
最简单的一个
让我们创建一个简单的绘图来演示如何在 Jupyter 笔记本中运行代码的基本用法,但是我们也可以使用方法****save(' filename . gif _ or _ MP4 ')
from celluloid import Camera # getting the camera
import matplotlib.pyplot as plt
import numpy as np
from IPython.display import HTML # to show the animation in Jupyter
fig, ax = plt.subplots() # creating my fig
camera = Camera(fig)# the camera gets the fig we'll plot
for i in range(10):
ax.plot([i] * 5, c='black') # 5 element array from 0 to 9
camera.snap() # the camera takes a snapshot of the plot
animation = camera.animate() # animation ready
HTML(animation.to_html5_video()) # displaying the animation


作者图片
进化图
这是一个有趣的情节,但不是很有用。这个想法是绘制一点一点进化的数据集。
from celluloid import Camera # getting the camera
import matplotlib.pyplot as plt
import numpy as np
from IPython.display import HTML
fig, ax = plt.subplots(figsize=(10, 6)) # let's make it bigger
camera = Camera(fig)# the camera gets our figure
x = np.linspace(0, np.pi*2, 60) # a sine circle
y = np.sin(x) # sine
for i in range(len(x)):
x_t = x[:i] # current dataset
y_t = y[:i] # current sine
ax.plot(x_t, y_t, c='blue')
camera.snap()
animation = camera.animate()
HTML(animation.to_html5_video())


作者图片
一个有趣的小技巧,使情节看起来像手绘
x_t = x[:i] + 1.3*np.random.random(size=i)


作者图片
使用图像
图像可能对表达想法有很大帮助,使用图像的算法主要通过视频进行很好的解释
在这个例子中,我制作了我的猫和蒙克的尖叫之间的神经风格转换的动画。我对模型进行了 200 个时期的训练,并且每 10 个时期保存一次结果(我将在另一篇文章中详细解释这个算法)
在我的例子中,我保存了培训期间的 20 张照片,以使用该模式制作 GIF”。/NST/epochs/epoch_k.jpg "
from celluloid import Camera # getting the camera
import matplotlib.pyplot as plt
import numpy as np
from IPython.display import HTML
import os
fig, ax = plt.subplots() # make it bigger
camera = Camera(fig)# the camera gets our figure
for img in os.listdir("NST/epochs"):
img_obj = plt.imread(os.path.join("NST/epochs"), img) # reading
ax.imshow(img_obj) # plotting
camera.snap()
animation = camera.animate()
HTML(animation.to_html5_video())

作者图片
使用动态标签和标题
这是赛璐珞最有趣的方面之一,在这里我们有能力让情节变得非常动态。
在这个例子中,我绘制了两个均值不同但标准差相同的正态分布,然后我改变了这个标准差,以评估它对每条曲线的影响。
我把标题上的当前标准差和真实均值作为每条曲线的标签。我必须将计算的标签作为元组传递,因为我使用了两条曲线,如果只有一条曲线,我可以使用 like PLT . legend([calculated _ label]),这很简单
from celluloid import Camera # getting the camera
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from IPython.display import HTML
std = 3 # start std
Am = 15\. # mean of first normal
Bm = 12.5 # mean of second normal
fig, ax = plt.subplots(figsize=(9,6)) # empty fig
camera = Camera(fig)
for j in range(10):
plt.ylim((0, 0.2)) # setting up the limits (or else it will auto ajust
plt.xlim((-50, 50))
A = np.random.normal(Am, std, size=(1000)) # creating the 1000-sized normals
B = np.random.normal(Bm, std, size=(1000))
A_plot = sns.distplot(A, color='red')
B_plot = sns.distplot(B, color='blue')
plt.legend((
'Real Mean A: {:.2f}'.format(np.mean(A)),
'Real Mean B: {:.2f}'.format(np.mean(B))
))
ax.text(0.5, 1.01, "Standard Deviation = "+str(std), transform=ax.transAxes) # making the dynamic title
camera.snap() # camera snapshot
std += 1 # incrementing the std
anim = camera.animate() # animating the plots
HTML(anim.to_html5_video())

作者图片
完成了吗?
这只是我关于如何使用赛璐珞的基本想法,但说实话,可能性是无限的,我已经在几个应用程序中使用过,甚至是为了演示一些机器学习算法如何学习检查一下。
决策图表

作者图片—决策树分类器边界图(此处可用
支持向量机分类器

作者图片— SVM 分类器边界图(此处可用)
如果你喜欢这个教程,用过并且有效(或者无效)请使用我个人资料中的链接联系我
用 Python 抓取表格数据的最简单方法
数据科学基本指南
用 Python 脚本的 3 行代码抓取新冠肺炎统计数据的例子

插图作者金彩云
你们中的任何人可能已经从网站上读过几篇关于数据搜集的文章。他们大多建议用 Node.js 搭配 Cheerio 库或者 Python 搭配美汤。虽然当你掌握了这些技术后,这是非常有效的,但它需要你花费时间和精力,直到你完成所有的编码,找到你需要的元素,请求数据,清理数据以创建一个数据帧,然后才能进行实际的数据分析。(当然,还有一些额外的时间来修复所有的 bug 和错误🐛)
这篇短文将向您展示如何用三行 Python 脚本以最简单的方式从任何网站获取表格数据的教程!

我们的英雄是(红色)熊猫!是的,你们所知道的受欢迎的熊猫很可爱,并且能够自动从 HTML 文件中提取表格数据。
从 Worldometer 收集实时新冠肺炎数据的示例:
例如,您想从 Worldometer 网站获取表格数据。由于这个数据集是动态的,会随着时间的推移而变化,所以数据抓取是有意义的,每次运行脚本时我们都会得到最新的结果!

来自 Worldometer 的新冠肺炎表格数据示例。(作者截图—2020 年 5 月 19 日)
要抓取这个数据集,请在您的机器上准备好 Python 和 Pandas。我们将使用熊猫read_html()提取任何网页的所有表格。然而,我们不能仅仅用它来直接读取 URL,因为你可能会面对一个error 403: Forbidden。为了避免这个错误,我们将在使用 Pandas 读取 HTML 之前,先用request模块请求它来获取 HTML 正文。总的来说,该脚本如下所示:
从 Worldometer 获取新冠肺炎数据的示例 Python 脚本。(作者提供的示例脚本)
dfs是一个列表结果,包含来自所请求的 HTML 主体的表类的多个数据帧。让我们通过打印出第一个dfs来研究从上面的脚本中得到的数据帧。
print(dfs[0])

示例输出新冠肺炎案例数据帧(用 Spyder 探索)
是的,大概就是这样。
有了三行 Python 代码,你就可以得到新冠肺炎数据的更新数据框架来玩,简单和容易!
享受数据分析/可视化的乐趣!!我希望你喜欢这篇短文。如果您有任何问题、意见或建议,请随时给我留言。
关于我&查看我所有的博客内容:链接
安全健康和健康!💪
感谢您的阅读。📚
《辛普森一家》是学习英语单词的最佳电视节目
《辛普森一家》和 83 部电视剧中所有剧集所用词汇的数据分析。跟着辛普森一家学英语,增加你的词汇量

斯蒂芬·格雷奇在 Unsplash 上拍摄的照片
《辛普森一家》(T4)播出了 32 季,娱乐了数百万人,被认为是有史以来最伟大的电视节目之一。但是你有没有想过这个电视节目可以让你的英语词汇更上一层楼?这是真的,尤其是当你把英语作为第二语言学习的时候。在本文中,我将通过比较 83 部热门电视节目中对话的词汇来证明这一点,包括老友记、权力的游戏、生活大爆炸、实习医生格蕾等等。你也会知道哪些《辛普森一家》679 集最适合你学英语。
《辛普森一家》有什么不同?
你有没有想过你是如何通过看电视节目来学习新单词的?这是通过重复。你在一集中听到一个词,然后在一周的电视节目中听到更多次。然后瞧!你刚刚学了一个新单词!这就是辛普森一家的独特之处。它在高级英语词汇中重复次数最多。有研究说至少 6 次是你学会一个单词之前重复或接触的次数,也有人说是 17 次。根据 83 部电视节目几乎所有剧集的文字记录,我计算了对话中至少重复 10 次(两次研究的平均值)的单词数。
《辛普森一家》是迄今为止用更高级的单词重复十次或更多次的电视节目(1929 个单词来自四级及以上)。《辛普森一家》在《老友记》、《权力的游戏》和《生活大爆炸》系列中,高级词汇重复了 10 次或更多次。在下面的情节中找到你最喜欢的电视节目。**
作者图片
现在你可能会想,“如果《辛普森一家》的总播放时间比大多数电视节目都长,那么它有更多的单词重复是有道理的,”这是真的,但这不是发生这种情况的唯一原因。如果你仔细检查,你会发现两部电视剧比《T2》和《辛普森一家》播放时间更长,但重复次数更少。此外,《辛普森一家》的前 16 季比运行时间更少或更多的电视节目有更多的词汇重复。
那些‘高级词汇’是什么?
研究表明,英语中 1000 个最常见的词族(1 级)涵盖了电影中 81.54%的词汇和电视节目中 85.11%的词汇。稍后,我将向您展示最常见的 3000 词家族(第 3 级)涵盖了一集《辛普森一家》中 94%的对话,但首先,我们来看看《辛普森一家》对话中那些来自第 4 级及以上的难词。剧透一下,你可能会发现很多俚语!



左边的词是辛普森对话中重复次数最多的高级词,右边的是重复次数最少的高级词。
在你开始奇怪为什么左边的单词看起来不那么难之前,你必须知道它们实际上是所有辛普森一家剧集中第 4 级及以上最常见的单词。也就是第一个词云里面的词是四级及以上里面最容易的。相比之下,右边的是重复至少 10 次的最不常见的高级单词。
《辛普森一家》679 集中有哪些集涵盖了最基础和最高级的词汇?
无论你是英语初学者、中级还是高级学习者,你一生中可能至少有一次因为听不懂你最喜欢的角色讲的笑话而感到沮丧。我有好消息告诉你;我按照难度排列了所有辛普森一家剧集,就像我在学习英语的 100 部最佳电影中所做的那样。最右边的剧集涵盖了更多基础(1 级)或中级(1+2+3 级)词汇。覆盖率越高,就越容易理解一集《辛普森一家》。
将鼠标悬停在情节中的点上,查找您将要观看的下一集《辛普森一家》是什么!
作者图片
我发现第五季第 22 集《成功婚姻的秘密》覆盖了最高比例的一级词汇,这意味着这一集可能是你能轻松理解对话的一集。然而,你可能很难理解最左边几集的笑话,比如《老粗和扫帚柄》(第 21 季-第 7 集)和杂耍鲍勃最后的闪光(第 7 季-第 9 集)。
这是我在 YouTube 频道上看到的一集成功婚姻的秘密中的一个片段。如果你说或学英语,你会注意到对话非常简单。**
以下是《辛普森一家》中英语词汇最简单的 10 集:
- S5E22:成功婚姻的秘密
- S9E7:两位 Nahasapeemapetilons 夫人
- 第一季第六集:呻吟的丽莎
- 我们不一样的方式
- 丽莎·辛普森,这不是你的生活
- S8E19:小学机密
- 第五季第十二集:巴特出名了
- S9E16:哑铃赔偿
- 第一季第九集:快车道上的生活
- S4E14:来自同一个星球的兄弟
679 集里他们在说什么难懂的词?
如果我让你相信《辛普森一家》有增加英语词汇量的潜力,那么你应该考虑在每次看新一集的时候查看下表。在观看《辛普森一家》一集之前,你可以通过在下面的方框中搜索来找出你将会听到哪些难词。可以按词、集、季过滤。
在你看新一集之前,查找任何你觉得困难的单词的定义,你会增加下次看《辛普森一家》时理解笑话的机会!
哪些角色说的话最难?
自然,荷马、玛吉、巴特和丽莎·辛普森的台词比其他角色多——这就是这部剧被称为《辛普森一家》的原因,对吗?然而,四个主要角色都没有在台词中使用复合句。实际上,像伯恩斯、斯金纳、克鲁斯蒂和弗兰德斯这些银幕时间较少的角色倾向于使用更高级的词汇。对你来说他们是最聪明的角色吗?
作者图片
《辛普森一家》随机剧集中的词汇覆盖
《辛普森一家》一集的平均字数是 2472 个单词。《辛普森一家》对话中使用的大部分词汇属于最常见的 1000 个英语单词。大多数电视节目都会出现这种情况;那么对于非英语母语的人来说,通过看电视节目很容易习得一级和二级词汇。不过大部分电视剧单集都有一点高级词汇。幸运的是,像《辛普森一家》这样的电视节目有很多单词在每集中至少重复 10 次,这有助于建立高级词汇。
作者图片
关于成绩单和词汇水平
最后,关于抄本和词汇水平的一些观察:
- 这 83 个电视节目的脚本是从不同的网站上获得的,粉丝们在这些网站上转录对话。为了找到《辛普森一家》中的角色台词,我使用了《T2》Kaggle 上的一个数据集。
- 这个分析背后的所有代码都可以在我的 Github 上找到。
- 《辛普森一家》剧集中听不到的词,比如场景描述和说话人的名字,都从文字记录中删除了。
- 我用来对电视节目中的词汇进行分类的大部分词汇表都是由 Paul Nation 的语料库制成的。你可以在这里下载一些列表。
- 先前使用这些单词表的研究表明,这些单词表是可靠的;然而,通过分析《辛普森一家》几集,我发现了几个弱点。例如,一些动词如“to hoover”在四级及以上的列表中被考虑;结果,像胡佛小姐这样的角色名字被认为是高级词汇。然而,这种情况并不经常发生,因为还有一个专有名词列表帮助我过滤掉大多数角色的名字。
- 大多数感叹词被排除在“边缘词”列表之外。然而,其中一些像“哇”和“呀”被认为是 4 级或以上。对大多数人来说可能很常见的词,如“真棒”也包括在内。这与语料库中的文本有关。
如果你想看这个分析背后的代码,你可以在这里找到它。记住,词汇不是很好理解电视节目的唯一因素。发音、口音和语速也可能会提高或降低你的理解水平。
最后的想法
我不得不承认我不是《辛普森一家》的忠实粉丝,但是在发现这个电视剧提供的好处后,我会考虑在我有空的时候看它!应该从哪一集开始看?
数据科学的最佳入门统计学书籍
了解数据科学最重要的支柱
每个人和他们的母亲都想学习数据科学。我不得不承认,这个领域非常有趣,但是有很多先决条件。最重要的一门是统计学——既有描述性的,也有推理性的,还有概率论。

尤里·埃夫列莫夫在 Unsplash 上的照片
科技大学很好地涵盖了统计学,那么这篇文章的重点是什么?朋友,有三个要点。阅读这篇文章,如果:
- 距离你上次接触统计数据已经有一段时间了
- 在你的研究中,你没有发现它的直观性和很好的解释
- 你被田野陶醉了
如果你属于这三类中的任何一类,男孩,我有一些有价值的资源给你。在我获得学士学位后,我已经阅读了这本书的很大一部分,其余部分是在我获得数据科学硕士学位后阅读的。
我很高兴我那样做了,否则这条路会更颠簸。
好的,让我们看看我在下一部分谈论的是什么书。请记住——在下面你会找到这本书的附属链接。这对你来说没什么,因为价格是一样的,但是如果你决定购买,我会得到一点佣金。
人头优先统计
这可能会让你大吃一惊。这不是你通常能在大学课程中看到的书——主要是因为它充满了可视化和简单明了的解释。另一方面,大学的书充满了公式、证明和枯燥乏味的文字。
亚马逊网站:头优先统计:一个大脑友好的指南:9780596527587:格里菲斯,黎明:书籍
amzn.to](https://amzn.to/31YkF1B)
当你第一次看到这本书的纸质版本时,你可能会有点焦虑——因为它有 700 多页。以任何标准来看,这本书都不算短,但它肯定不像一本 700 页的书。我来详细说明一下。
从大学里拿起任何一本统计和概率的书——很有可能有 500 页左右,如果不是更多的话。虽然这明显少于 Head First Statistics ,但一般来说,大学的书很可能没有充满可视化的例子和可视化。
如果有人从这个 Head First Statistics 中取出所有的可视化,总页数将减少一半,如果不是更多的话。
为什么这很重要?
好问题。对我们大多数人来说,阅读一页又一页枯燥乏味的文本并不是世界上最有趣的事情。如果你全职工作,并且想在工作之余学习统计学,那就更是如此了。这是不可能的——你读到第三段就会睡着。
你需要适量的文字,接着是一些漂亮的视觉效果,接着是实际的例子。
诚实地回答我这个问题:如果我把这篇文章写成一个段落,你会读吗?不,因为那会看起来很烦人——不必要的烦人。此外,我们的注意力持续时间很短。如果你不能在 30 秒内读完一段,很可能你就不会继续读下去了。用更简单的话来说——如果文章没有以视觉上令人愉悦的方式格式化,你会找到一个是这样的。
书籍也是如此。每次我看到 30 行的段落,我就有立刻放下这本书的欲望——不管它有多好。你看,同一主题的 10 本不同的书通常涵盖相同的主题,但使这本书成为畅销书的是它对读者的亲和力(当然还有营销)。
好了,我们现在知道了在一本书里要寻找什么,以及为什么我们从来没有读完一些书——不管这些信息有多有价值。现在让我们探索一下头部第一统计提供了什么。
我的简短回顾
正如我所说的,我大约在一年半前完成了这本书,它是更高级主题的很好的入门书。如果我现在阅读一本关于 Python 的统计学的书,它并没有深入地涵盖理论,由于扎实的背景知识,我不会感到困惑。
这就是这本书的真正读者——无论是完全的初学者,还是以前上过统计学课程的人,但教学风格很糟糕。如果你已经完成了几门大学水平的统计和概率课程,你可能会想跳过这一门。
该书涵盖以下主题:
- 基础数据可视化
- 集中趋势和扩散的度量
- 概率、排列、组合和分布
- 统计抽样
- 置信区间
- 假设检验
- 回归分析
并且覆盖得非常非常好。这本书没有涵盖大学课程以外的任何内容——但如果你没有上过世界上最好的大学,我真的认为这本书对你更有帮助。
在你走之前
统计学是每个数据科学家的必备工具,这一点毋庸置疑。同时,你在统计学上的正规教育可能很糟糕,或者根本不存在。这并不意味着你不能学习这个话题,只是需要更多的手工操作。
这就是像 Head First Statistics 这样的书派上用场的地方。根据你以前的知识和你能抽出的时间,完成它不会花你太长时间——大约 1 到 2 个月。一旦你完成它,你将能够很容易地理解数据科学和机器学习中更高级的主题。
感谢阅读。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
[## 通过我的推荐链接加入 Medium-Dario rade ci
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@radecicdario/membership)
人工智能/人工智能公司无法规模化的最大原因是什么?
你可以做三件事来避免它发生在你身上。

资料来源:Unsplash 上的马龙
“这个机器学习(ML)模型的准确性如何?”
“培训时间多长?”
“需要多少训练数据?”
在一家为机器人技术开发机器学习软件的公司工作,我每天都会听到这些问题。机器学习成了大家都想追求的闪亮对象。超过 80%的公司正在研究至少一个人工智能项目。
用户通常想知道装载一个新物品需要多长时间,以及模型的表现或概括程度如何。他们需要一种方法来衡量总体成本与性能。然而,以上问题的答案并不能给你一个完整的描述。更糟糕的是,它们具有误导性。
M 模特培训只是冰山一角。大多数用户和 AI/ML 公司忽略的是获取适当数据集、清洗、存储、聚合、标记和建立可靠数据流以及基础设施管道的巨大隐性成本。
根据最近的研究,公司在 AI/ML 项目中花费 超过 80%的时间在数据准备和工程任务上。 换句话说,如果你把大部分注意力放在构建和训练模型上,你的总工程努力和成本可能会比你最初的估计多五倍。
此外,机器学习模糊了用户和软件提供商之间的界限。
我们已经开始看到 AIaaS 或 MLaaS 的出现。云中的模型随着数据的增加而不断改进。这是机器学习的最大好处,也是为什么 MLaaS 比 SaaS 更具挑战性。

来源:巴斯蒂安·黄(medium.com/@Bastiane)
模型从训练数据中学习。没有高质量的数据,模型就不会有好的表现。用户并不总是知道生成或注释适当数据集的最佳实践。事实上,大多数时候,他们不会。
当系统表现不佳时,用户倾向于责怪模型。因此,AI/ML 公司通常会花费大量的时间和资源来培训用户并与用户合作以确保数据质量,这成为了 AI 公司和客户之间的共同责任。
例如,为了在生产线上训练用于缺陷检测的模型,计算机视觉公司需要与其客户合作,以正确的角度和位置安装摄像机,检查分辨率和帧速率,确保每个场景都有足够的正面和负面训练样本。
对于机器人或自动驾驶汽车应用程序,数据收集甚至更加耗时和昂贵,因为有人需要控制机器人或车辆来执行某些操作。
即使有了所有的培训课程、用户手册和指南,您仍然不能完全控制用户生成的数据。一家机器视觉相机公司告诉我,他们有工程师手动验证 100%的传入数据,以确保数据完整性。
所有这些额外且经常被忽视的培训、手动检查、数据清理和标签任务都给人工智能公司带来了巨大的开销,使 MLaaS 成为一项更具挑战性、毛利率更低的业务。
为了建立一个更具可扩展性的人工智能/人工智能业务,我们可以做三件事:
扩展性才是王道。确定大量客户愿意为之付费的正确用例,并且您可以使用相同的模型架构解决这些用例。你最不想做的事情就是在没有标准产品供应的情况下为不同的公司构建和培训不同的模型。
让尽可能多的东西自助。尽可能自动化您的培训和数据管道,以提高运营效率并减少对人工的依赖。公司倾向于优先考虑客户可见的特性,而不是内部工具或自动化。但后者回报很快。确保为内部流程自动化分配足够的资源。
最后,确定并跟踪你的成本,尤其是隐性成本。您的工程师在清理、过滤或聚合数据上花费了多少时间?他们花了多少时间来确保第三方正确完成注释?他们多久需要帮助客户设置环境并正确收集数据一次?其中有多少可以自动化或外包?
我们连线吧!如果你喜欢读这篇文章,请在这里订阅我的个人博客!
Bastiane Huang 是 OSARO 的产品经理,OSARO 是一家总部位于旧金山的初创公司,致力于开发软件定义的机器人。她曾在亚马逊的 Alexa 小组和哈佛商业评论以及该大学的未来工作倡议中工作。她写关于 ML、机器人和产品管理的文章。跟着她到这里 。
无代数的奇异值分解

阿什·埃德蒙兹在 Unsplash 上拍摄的照片
用几何理解终极线性代数概念
这是一个不幸的现实,许多人试图用代数来学习线性代数,而实际上发生的事情本质上是一个几何问题(这意味着你可以用图片来理解)。我之前在用几何学理解回归中描述过这个观点,这里我将尝试用奇异值分解做一些类似的事情。
奇异值分解是线性代数的基本概念。有了它,你可以理解,除了许多事情之外,矩阵到底是什么,各种其他相关的分解,特征值和特征向量,以及伪逆。在计算机科学/数据科学方面,奇异值分解是 NLP 中的潜在语义分析等技术的基础,并且与在推荐系统中使用的各种协同过滤 / 矩阵分解算法相关。
为了得到奇异值分解,我们首先要消除向量是一列数字,矩阵是一组数字的神话。然后我们将介绍和描述分解。
这里假设的背景是你知道什么是向量(如果你认为它是一列数字的话,那就更好了),同样也知道什么是矩阵。您应该熟悉:
- 可以添加向量:[1,2] + [3,4] = [4,6]
- 一个向量可以乘以一个常数:3[1,2] = [3,6]
- 可以通过画一个从原点指向指定点的箭头来绘制矢量。
- 矩阵可以相乘(稍微复杂一点,但是我们实际上不需要做任何实际的矩阵乘法,不用担心)。
技术说明:本文仅限于考虑实数和有限维(我们的向量由有限的数字列表组成,而不是无限的列表)。此外,我们添加了一个技术假设,即我们有一个内积结构,你可以认为这意味着勾股定理是有效的。我们所做的一切都将适用于复数或无限维:前者需要调整几个词;后者让事情变得极其复杂。
向量不是一系列数字
首先,让我们建立我们的几何背景:传统的欧几里得空间。你应该描绘一个完全平坦的无限平面(二维空间)或者我个人最喜欢的三维空间,就像我们生活的这个空间。
这就是问题所在。你可能习惯于在二维空间画 x 轴和 y 轴,或者在三维空间画 x 轴、y 轴和 z 轴。这是非常误导人的,所以请把它们从你的照片上抹去。取而代之的是,在空间的某个地方(通常是“中间”)放一个点,称它为原点。
请注意,我们将要做的一切都在 n 维中工作,其中 n 可以是一个大整数。我只是一个凡人,我只能在三维空间想象,我在二维空间画得最好。如果你能想到更多,你就有更多的力量。
向量是向量是向量
下图在左边显示了两个向量 A 和 B,以及它们的和。右边是向二维空间添加轴的两种不同方式。根据我们如何选择轴,我们得到不同的数字!我们不会担心这些数字之间的关系(当然,这是代数出现的地方,我保证我们不会这样做)。
要点是矢量是矢量是矢量:它的存在独立于用来描述它的数字,如果有的话。这是爱因斯坦相对论的一个重要观点:根据你的观点,你可能会描述不同的东西;但这并不能改变它是什么。

这里有几个要点。首先,向量是什么包括它的长度(离原点的距离)和它相对于其他向量的角度。这是几何学的精髓。第二,我们选择我们的轴是正交的(垂直的),这不是我们必须做的。但是如果你不选择它们,事情会变得非常复杂,所以在整篇文章中,我们总是假设我们有正交轴。第三,我们应该在技术上选择一个 基准 而不是轴。然而,这只是增加了代数,减去了直觉,让事情变得更加复杂。如果你关心的话,基只是通过选择长度为 1 的向量指向每个轴的正方向。
向量存在于向量空间中
这里不多说了。向量空间是一个有趣的词,指向量所在的空间。在某种意义上,它只是所有相关向量的集合。并且有一个特殊的向量 0(原点)。在上图中,向量生活在二维向量空间中。
我提出这个的唯一原因是因为我们需要一次处理不止一个向量空间。例如,我们可能有一个 2 维向量空间 V 和一个 4 维向量空间 W。V 中的向量与 W 中的向量无关(目前)。你不能把 V 中的向量和 W 中的向量相加。
矩阵不是一组数字
"根据我的经验,如果抛开矩阵,涉及矩阵的证明可以缩短 50%。" —埃米尔·阿廷
这里的许多混乱源于这样一个事实,即在大量的计算环境中,矩阵仅仅是一个数字阵列,并不参与所涉及的完整的数学结构。但是,如果你正在读这篇文章,你可能会对完整的数学结构感兴趣。
矩阵是向量空间之间的(线性)映射
“地图”只是一种功能,但其内涵是“保留结构”函数(在数学中)是接受输入并给出输出的东西。在向量空间的上下文中,结构是“有一个原点”,“你可以添加向量”以及“将它们乘以一个常数”。这种结构被称为线性,因此在这个上下文中,我们总是含蓄地表示“线性映射”(因此得名:线性代数)。
因此,矩阵是一个函数 f ,它从一个向量空间(“源”)获取向量,并返回另一个向量空间(“目标”)中的向量。此外,它必须满足三个属性才能成为线性:

线性地图满足三个特性
在英语中:
在二维源向量空间中,我们可以选择如图所示的两个一般向量 A 和 B,并且该函数可以为这两个输入返回任何输出。在一个 n- 维的源中,我们需要挑选 n 个通用向量。目标可以是从 0 到 1 万亿或更高的任何维数。注意“一般”我排除了一些退化的情况,比如(说)如果 a 和 b 是同一个向量,或者 b 是这个设置的两倍 A.⁴,我们需要:
- 该函数从原点到原点
- 应用于和 f(A + B)的函数与我们先应用函数的和是一样的:f(A) + f(B)。
- 对于标量倍数也是如此:f(cA) = c * f(A)。
请注意,有时,源和目标可能是相同的,但这在概念上不会改变任何事情。
关于矩阵的最后一点。就像当我们重新分配轴时,向量中的数字会改变一样,矩阵中的数字也会改变。它们取决于源和目标中使用的轴。所以实际上,矩阵是线性映射的一种表示,在源空间和目标空间中隐含或明确地选择轴。
在下文中,我们将假设每个矩阵都有一个隐含的轴选择;如果我们改变坐标轴,矩阵中的数字会改变,但线性地图本身不会改变。出于这个原因,我们会稍微滥用这个术语,用“矩阵”来表示“线性地图”这里的基本观点是,你根本不应该考虑数字数组:你应该考虑线性映射。
线性地图做什么
好了,现在让我们建立一个稳定的例子。下图显示了两个二维向量空间之间的线性映射可以做的一些事情。为简单起见,目标中的图像 f(A)和 f(B)仅标记为 A 和 B。
第 1-4 项显示了线性地图可以做的一些事情。此外,它可以做这些事情的任何组合,右下角显示了一个示例。

线性地图能做的事情。
要记住的重要一点是,在一个 n- 维空间中,更多的组合是有意义的。例如,对于 5 个维度和垂直向量 A、B、C、D 和 E,我们可能让 A、B 和 C 进行三维旋转,同时 C、D 的反射折叠到 C 上,而 E 消失。(是的,真的,这叫“杀死”病媒;一个暴力的比喻但那是数学家说的)。在某些情况下,在高于 2 或 3 的维度中会发生更多,但这不是那些情况之一。
奇异值分解
我们现在能够给出奇异值分解的非正式陈述。
定理(奇异值分解,非正式说法)。每个线性地图都是旋转、反射、缩放和矢量删除的组合,前提是轴选择正确。
几个要点。“杀死”一个矢量实际上只是把它缩小到零。也请注意,我忽略了折叠:正如我们将看到的,折叠实际上是由其他部分组成的。
因此,如果你理解了上面的图表(以及它在比如说 4 维空间中是如何工作的),那么你就理解了在这个上下文中关于线性地图的所有知识的本质(官方说法是:具有内积结构的真实的有限维向量空间)。
这里有一个例子。如果你看上面的图表,你不会看到任何类似“smush”的东西事实上,所示的“smush”实际上是单个向量的缩放;但是我们需要考虑所示的向量 x 和 y ,而不是考虑 A 和 B。

正确地看,“Smushing”是单个向量的缩放
记住,我们说过要从二维源向量空间描述一个线性地图,我们只需要选择两个一般向量,然后看看它们去哪里。但关键是,如果仔细选择这两个向量,地图将允许一个简单的描述。
现在,我说我们应该仔细选择轴,而不是这两个向量。但是真正做一个就是做另一个。我建议将这两个向量命名为 x 和 y ,因为实际上,我们选择了 x- 和 y - 轴,然后使 x 和 y 只是指向这些轴的向量。之前我们已经选择了 A 和 B 来为我们指出我们的轴(其中 A 轴沿着 A ,而 B 轴沿着B——我们可以随意命名这些轴)。所以考虑两个向量和考虑两个轴是一样的。做任何对你来说自然而然的事。
正式声明
奇异值分解的官方陈述必然只涉及最少量的代数,但我将努力用英语从几何角度解释它。
定理(奇异值分解)。
设 a 是一个有 m 行和 n 列的矩阵(m⨉n),视为从一个 n- 维向量空间 V 到一个 m 维向量空间 W 的线性映射。
那么 A 可以被分解为三个矩阵 A = RDS 的乘积,其中:
- s 是源和目标都为 v 的 n⨉n 旋转矩阵
- d 是具有源 v 和目标 w 的 m⨉n 对角矩阵:它唯一的非零元素在对角线上。例如:

对角线上有 1,2.3,-7 和 0 的非正方形对角矩阵
- r 是具有源 w 和目标 w 的 m⨉m 旋转矩阵
回想一下,线性映射 A 隐含地带有轴的选择,特别是通常的 x-、y-、z-等。-V 轴和 w 轴。
这意味着从 V 到 W 的线性映射 A 可以认为分三步发生。首先,使用 s 旋转 V 中的向量,其次,用一个常数(可能是 0,它会杀死向量,也可能是负的)沿每个轴缩放向量,然后通过使用隐式带有 A 的轴(使用 D)将它们放入 W 中。最后,对 W 中的向量进行旋转(使用 R)。
请注意矩阵乘法的工作方式,S 先作用,然后 D,然后 R(因为向量在右边)。
请注意,如果你在维基百科上查找奇异值分解,你会看到一个稍微不同的陈述。我向你保证,我的版本也是真实的,而且简单得多。
维基百科上的陈述使用了 S 的“转置”,而不是 S 本身。这是为了明确旋转矩阵有效地重新调整我们选择的轴。Wikipedia 语句也允许 S 和 R 包含额外的反射,但是我们可以用 D 中的负比例来代替。
但是,一旦我们认识到一个旋转矩阵等价于改变轴(是的,我保证),那么希望你会明白为什么上述定理的非正式陈述是正确的。如果允许我们首先选择合适的轴,我们可以把 A 写成一个对角矩阵,它缩放轴,并把它们从源 V 移动到目标 w。
一些术语:在源和目标中形成对角线的特殊轴称为左奇异向量(在目标中)和右奇异向量(在源中)。它们是 R 的列和 S 的行是左右奇异向量。D 对角线上的值称为奇异值。
部分校样草图
我将只提供矩阵 S、R 和 D 的构造,以给奇异值分解增加一点几何直觉。这还不足以成为充分的证据。
光谱定理
奇异值分解推广了谱定理。谱定理之所以这么说,是因为其思想是,存在一个可以提取的矩阵“真实性质”的幽灵(“幽灵”)。在谱定理的上下文中,“真正的本质”是我们可以选择轴(使用奇异向量),这样矩阵只是一个缩放矩阵。“特征”是德语中“真实”的意思,因此在谱定理的上下文中,奇异向量被称为“特征向量”,奇异值被称为“特征值”。
谱定理只适用于具有相同源和目标的方阵。它也只对一些方阵(正常的)有效,不是所有的。相比之下,奇异值分解适用于非方阵,适用于每个矩阵的。
矩阵转置
你可能听说过矩阵转置。假设我们在选择轴的时候很友好,不淘气(它们需要垂直),矩阵转置就是把矩阵翻转到对角线的另一边。

转置翻转一个矩阵,并把它放在一边
转置是一个反向映射。如果 A 把源 V 映射到目标 W,那么它的转置是向后的:转置是有源 W 和目标 V。
获取奇异值
设 A 是一个有源 V 和目标 w 的矩阵,跟随它的转置产生一个从源到自身的映射。

通过转置跟随映射导致从源到自身的映射
原来谱定理适用于这张图。特征向量提供了右奇异向量。同样,如果你先做 A 转置,然后做 A,你会得到左奇异向量。一旦有了这些,你要做的就是提取奇异值作为特征值的平方根。证明这是可行的有点复杂,但并不疯狂。
结论
我希望您已经看到,将矩阵视为线性映射而不是数字数组是理解它们的一种非常强大的方法。如果为源空间和目标空间选择了正确的轴组,每个线性图可以非常简单地描述为对角缩放矩阵。在应用中,人们感兴趣的往往是那些轴,因为它们在某种意义上提供了观察矩阵的“真实”或“潜在”方式。
作为练习,如果你已经理解了这一点,你应该能够理解 Moore-Penrose 伪逆,它将逆矩阵推广到非方阵和不可逆矩阵。
参考资料/进一步阅读
如果你遵循这一点,你应该能够把这种理解带到任何好的线性代数教科书。我们称之为“轴”的东西变成了“基”,线性代数的大部分工作来自于对基的计算,以及用更多的术语更详细地考察矩阵能做什么。但是绝大多数可以通过奇异值分解的镜头来理解。
[1]正式地说,我们正在处理真实的有限维希尔伯特空间,并且该定理对任何希尔伯特空间都有适当的推广。如上所述,为了简单起见,本文将始终假设我们在一个具有内积结构的有限维实向量空间中工作(由于我们具有有限维,所以它自动成为希尔伯特空间)。
[2]特别是,如果轴不正交,矩阵的转置将不再包括在对角线上翻转数字。
[3]对于那些了解内情的人来说,我们假设我们有一个标准正交基,但是我们将尽可能避免谈论基。
[4]正式地,我们要求选择的源向量是线性独立的并且跨越空间,这使得它们成为基。“一般”的官方定义是从代数几何中的类属的概念宽松地借用来的,并且粗略地意味着,在我们用来定义线性地图的基向量的选择空间中,不可接受的选择形成了至少为 1 的余维的子种类。
数据质量的六个方面——以及如何处理它们
在坚实的基础上构建您的模型和分析

图片由 XKCD
垃圾进,垃圾出。这是一句耳熟能详的话,诞生于计算机科学的早期,强调验证你的输入的重要性。
你可以拥有最巧妙、最优雅、经过充分测试的功能、模型或应用——但出来的东西和进去的东西一样好。
每当我们开发代码时,我们都提前对它将处理的数据的性质做出假设;一个简单的算术函数可能需要一个浮点数。点心亭的需求预测模型可以以特定的表格形式预测最近五年的销售数字。自动驾驶汽车控制器将从车辆周围的许多传感器接收不同的数据流。
如果这些假设被违反,那么会发生三种情况之一。
- 代码根据预期检查输入,并启动计划 b。这可能是为了警告用户数据有问题,然后优雅地停止。
- 代码遇到运行时错误,导致程序崩溃。
- 代码继续运行,忽略了错误的输入,并产生一个看似合理但不正确的输出。
第一个场景给你一个降落伞,第二个场景给你一个头痛,第三个场景给你一个多车连环相撞在一滩融化的 Cornetto 中。
错误的数据= >错误的决策
随着组织变得越来越数据成熟,重要的业务决策越来越依赖于数据分析和建模。如果做出这些决定的数据不符合标准,那么你基于这些数据的推理将是有缺陷的,可能会产生非常昂贵的后果。
这就是为什么理解数据质量并意识到您正在使用的数据可能在许多方面达不到您的要求如此重要。
准确(性)

曾经创建的每一条数据都源于现实世界中的一个事件或测量。这可能是温度传感器的输出、金融交易的记录或某人在 web 表单中键入他们的名字。准确性描述了"数据正确描述被描述的“真实世界”对象的程度。”
为了实现这一点,从现实世界到数据集的旅程中的每一步都必须正确地保留原始数据的本质。
在测量或记录事件/对象的过程中,一开始就有可能出现错误。2020 年 5 月,由于填写令人困惑的申请表时出现错误,澳大利亚政府将 COVID 19 工资补贴计划的支出承诺高估了 600 亿澳元(390 亿美元)。雇主们被要求说明他们参加该计划的雇员人数。然而,在 0.1%的情况下,他们反而提交了他们所要求的补贴的美元价值——正确金额的 1500 倍。这些错误被忽略了,它们的总价值流入了议会通过的一项法案。几周后,政府红着脸宣布了自己的错误,但可能不会因为在沙发背上发现 600 亿美元而太不高兴。
在上面的例子中,简单地列出前 100 名左右的索赔人可能会对这个问题有所帮助。你会发现大型快餐和零售品牌,连锁酒店等。但是当你碰到一家当地的餐馆或小型旅游公司声称有几千名员工时,你就知道有问题了。
这突出了基本分析和概要分析对于理解数据集的重要性。在您做任何报告或建模之前,您需要仔细查看每个字段,看看它的值是否有意义,没有奇怪的惊喜。
准确性有一个密切相关的表亲:精度。环法自行车赛的赛段时间是以小时和秒来记录的,但这在奥运会的 100 米决赛中是行不通的。在数据类型转换过程中,或者由于用于进行初始测量的仪器的灵敏度,精度可能会降低,从而导致模型的方差降低。
完全

照片由 Gabriel Crismariu 在 Unsplash 拍摄
数据完整性表示“所需数据在数据集中的程度。”任何数据集都可能有缺口和缺失数据,但这些缺失数据会影响您回答问题的能力吗?要理解的关键是是否引入了会影响结果的偏见。
1936 年,《文学文摘》 进行了一项民意调查,询问受访者是会投票给共和党人艾尔弗·兰登,还是现任民主党人富兰克林·罗斯福。然而,邮件列表主要是从电话簿中选择的。现在,在 1936 年,电话远未普及,被认为是奢侈品。因此,邮寄名单最终偏向上层和中产阶级选民,遗漏了那些买不起电话的人。一旦收到回复,文学文摘正确预测了压倒性胜利。然而不幸的是,在美国历史上最一边倒的选举中,兰登获得了压倒性胜利,而不是罗斯福,他最终赢得了 48 个州中的 46 个。通过使用更完整的数据集,如选民名册,或至少通过了解和调整因缺失数据而产生的偏差,投票数字可能会更接近目标。
完整性问题可能发生在记录级别,就像上面丢失整行的情况,但也可能发生在列级别,即一个字段 80%的时间都是空白的。这可能会使许多机器学习方法出错,并且如果缺失值不是均匀分布的,可能会再次引入偏差。为了缓解这个问题,有两种方法:
- 扔掉不完整的列
- 丢弃包含缺失数据的行
- 输入缺失的数据(即填空)
Yoghita Kinha 的优秀文章如何处理数据集中的缺失值对上述方法进行了全面介绍。
一个更隐蔽、更隐蔽的完整性问题是,默认值给人一种完整字段的错觉,尽管实际的响应率要低得多。当我为一个零售时尚品牌建立客户终身价值模型时,这种情况曾经发生在我身上。在每个顾客档案上都有一个“性别”标志——M 代表男性,F 代表女性。该领域在数据集中具有很高的完整性,但是当一些基本分析显示大约 6 个月前女性客户的急剧变化时,就产生了怀疑。原来,在最近对注册表单的重新设计中,性别字段已经从没有默认值的必需下拉框变成了 default =“女性”的下拉框。这一小小的变化意味着,忽略该字段的客户现在被记录为女性,而不是被送回表单进行填写。
一致性

如果数据在多个位置复制,它需要在所有实例中保持一致。对于一家百货商店,您可能通过忠诚度计划、邮件列表、在线账户支付系统和订单履行系统来保存特定客户的数据。在这个混乱的系统中,可能会有拼错的名字、旧地址和冲突的状态标志。这可能会在仅从数据点的一个实例读取数据的流程中导致问题,例如,如果客户取消订阅营销电子邮件,但这并没有反映在该客户的所有表现中,他们可能会继续收到通信,这让他们非常沮丧。不一致的联系方式也可能导致金钱浪费在打电话或寄信上。
在上面的例子中,拥有一个集成良好的客户数据平台,如细分市场或 Omneo 可以帮助整合客户的单一视图,并确保一致性问题得到解决。
及时

照片由 insung yoon 在 Unsplash 上拍摄
您的数据集是否足够新?在一个事件发生和它出现在你的数据中之间有多长时间的延迟。许多数据分析和建模将建立在历史快照的基础上,因此将它们运行到今天可能没有必要。然而,实时决策需要实时数据。如果雷达系统的数据只能一天一次批量下载,对空中交通管制员来说就没什么帮助了。如果由于连接问题,某些商店周日的销售数据被推迟,你周一管理层会议的数据就会被取消。
数据集的及时性可能依赖于导致其创建的数据集成管道。这可以是实时的,使数据在它描述的事件后很快可用,或者批量处理,这意味着数据被“冻结”直到下一次刷新。对这一渠道的改变可能会使你获得更多最新的数据,并对最近的事件作出更迅速的反应。
独特性

里卡多·戈麦斯·安吉尔在 Unsplash 上的照片
每个真实世界的对象或事件在一个特定的数据集中应该只表示一次。即,如果有 John Doe 的客户记录和 Johnny Doe 的客户记录,尽管他们实际上是同一个人。
因此,任何涉及客户的指标(客户数量、每个客户的花费、购买频率)都将因为包含一个人的重复表示而被丢弃。
发现这个问题意味着识别一个合适的主键。在 John Doe、Johnny Doe 示例中,他们可能有不同的姓名和客户 id,但电子邮件地址匹配,这是他们是同一个人的有力线索。这意味着在进行任何分析或建模之前,需要额外的数据整理步骤来整合这些客户记录。
有效期

数据集中的字段可能需要满足某些条件才能被视为有效。电子邮件地址必须有一个“@”符号,电话号码必须是一系列数字,会员等级字段可能需要是“金”、“银”或“铜”。
在许多情况下,使用正则表达式可以很容易地检查有效性。网上有一些数据库,比如 regexlib.com,其中包含了数千种常见数据类型的正则表达式。对于离散数据类型,比如上面的成员层示例,简单的频率统计可以告诉您是否存在有效性问题。如果你有除了“金”、“银”或“铜”之外的大量值,那么一定有问题。
一旦识别出无效数据,它实际上就变成了一个完整性问题,可以使用前面描述的方法来处理这个问题。
概括起来

约翰·巴克利普在 Unsplash 上拍摄的照片
在任何数据科学项目的开始,清楚地了解您的数据以及它从源到数据集的路径是非常重要的。虽然匆忙实现项目中更性感和更复杂的部分很有诱惑力,但是如果它建立在不稳定的基础上,那么这种努力就白费了。只有通过问问题、测试假设、分析和理解你的数据,你才会对你的分析质量真正有信心。
关于 Scikit-plot 你需要知道的六件关键事情
向 scikit-learn 对象添加绘图功能的直观库。

"想象给了你一些你不知道的问题的答案."— 本·施奈德曼
可视化是数据科学和机器学习中最重要的组成部分之一。如果你需要向某人展示你的结果,你可以向他们展示可视化的结果,而不是 Excel 中的一堆数字。当谈到机器学习实验时,在训练阶段可视化模型,结果非常重要,可以帮助你对下一步做什么做出好的决定。通过可视化你的结果,你可以注意到你从来没有期望看到的东西。Scikit-plot 可以帮助您执行机器学习项目中的任务。
什么是 Scikit-plot?
Scikit-plot 是一个 python 包,可以帮助您在机器学习项目的不同阶段可视化您的数据、模型(在训练期间)和实验结果。Scikit-plot 是一个谦逊的尝试,它提供了一个用尽可能少的样板文件生成快速、漂亮的图表和绘图的机会。
在本文中,您将学习 Scikit-plot 库中提供的以下模块:-
“一张照片最大的价值是当它迫使我们注意到我们从未期望看到的东西”——约翰·图基
装置
安装简单!首先,确保您已经安装了依赖项 Scikit-learn 和 Matplotlib 。
然后运行:
pip install scikit-plot
如果使用 conda,您可以通过运行以下命令来安装 Scikit-plot:
conda install -c conda-forge scikit-plot
以下简单的机器学习项目将向您展示如何在您的下一个机器学习项目中实现这些 scikit-plot 模块。
我们将使用来自拉各斯和尼日利亚主要城市的保险数据集。我们将建立一个预测模型来确定一栋建筑在一定时期内是否会有保险索赔。我们将不得不预测在建筑物的保险期内至少有一次索赔的概率。你可以在这里下载数据集。
我们将从导入这个 ML 项目的重要包开始。
加载保险数据集。

前五行
在这个数据集中,我们有分类值和数值。
让我们看看数据集的形状
data.shape(7160, 14)
我们有 14 个变量和 7160 行。
数据集中的列列表。

列列表
你可以在这里阅读这个数据集中每个变量名的含义。我们的目标变量是一个索赔,它有两个唯一的值。
- 1 如果建筑物在保险期内至少有一项索赔。
- 如果建筑物在保险期内没有索赔,则为 0。
我们将删除两列客户 Id 和地理代码。
检查数据集中缺失的值。

每个变量中缺少值
我们有 3 列缺少值,它们是花园、建筑尺寸和入住日期。
以下代码将使用最频繁和平均策略处理所有缺失值。
在数据集中,我们有一些分类变量将通过使用 scikit-learn 的 LabelEncoder 方法 进行数字转换。
Residential、Builiding _ Painted、Building_Fenced、Garden 和 NumberOfWindows 变量已被转换成数值。
让我们把目标变量和自变量分开。
我们将使用 scikit-learn 中的 MinMaxScaler 对自变量进行缩放。
将数据集拆分为训练集和测试集。
我们将使用数据集的 10% 作为测试集。在我们进一步训练模型之前,一个独立变量列表将保存在 feature_columns 中。
现在让我们了解 scikit-plot 可以提供什么。
评估模块
scikit-plot 中的估计器模块包括专门为 scikit-learn 估计器(分类器/回归器)实例(如随机森林)构建的图。您可以使用自己的估计器,但是这些图假定 scikit-learn 估计器具有共同的特定属性。
现在让我们从 scikit-learn 创建我们的分类器。我们将使用 GradientBoosting 算法作为我们的分类器。
1.学习曲线图。
Scikit-plot 提供了一个 plot_learning_curve 方法,它可以为分类器生成一个训练和测试学习曲线图。该曲线可以帮助您更好地了解训练期间的模型行为。
我们将在 plot_learning_curve 方法中传递分类器、自变量、目标变量等重要参数,这意味着分类器将被训练,同时生成一条学习曲线。

学习曲线
正如你所看到的,学习曲线可以帮助你更多地了解你的模型行为。从图中可以看出,的训练分数随着训练样本数量的增加而减速,而的交叉验证分数试图在训练样本数量增加时保持其性能。
2.特征重要性图
数据集中包含大量要素并不意味着您可以创建性能良好的模型。有时候,一些重要的特性是您创建一个具有良好性能的模型所需要的。
Scikit-plot 可以通过使用 plot_feature_importances 方法生成分类器特征重要性的图。
我们将在 plot_feature_importances 方法中传递重要参数,这些参数是经过训练的模型分类器并列出特征名称。

重要性特征
上面的图显示了一个重要特性的列表,从最重要的特性到最不重要的特性。我们数据集中最重要的特征是建筑尺寸,最不重要的特征是花园。
这意味着我们可以移除数据集中的花园要素,因为它对模型预测没有太大贡献。
度量模块
度量模块包括机器学习评估度量的图,例如混淆矩阵、轮廓分数、ROC 等。
4.混淆矩阵图
混淆矩阵是大多数数据科学家和机器学习工程师都非常了解的。混淆矩阵是一种总结分类算法性能的技术。
您可以使用 plot_confusion_matrix 方法从预测和真实标签生成混淆矩阵图。
我们将传递 plot_confusion_matrix 方法中的重要参数,它们是真实标签和预测标签。

混淆矩阵
从上图可以看出,0 类的 96% 预测正确,1 类只有 21% 预测正确。
4.受试者工作特征曲线
Roc 曲线是预测二元结局概率的有用工具。这是对于 0.0 和 1.0 之间的多个不同候选阈值的假阳性率 (x 轴)相对于真阳性率 (y 轴)的曲线图。
Scikit-plot 可以通过使用 plot_roc 方法从标签和预测得分/概率生成 ROC 曲线。
我们将在 plot_confusion_matrix 方法中传递真实标签和预测概率来生成图。

受试者工作特征曲线
该图显示了 4 条不同的曲线及其面积值,分别为
- 0 类 Roc 曲线。
- 第一类 Roc 曲线。
- 微观平均 Roc 曲线。
- 宏观平均 Roc 曲线。
5.精确回忆曲线
精度-召回曲线是不同阈值的精度 (y 轴)和召回 (x 轴)的曲线图,用于评估分类器输出质量。当类别非常不平衡时,精确召回是预测成功的有用度量。
精度-召回曲线显示了不同阈值的精度和召回之间的折衷。曲线下的高区域表示高召回率和高精度,其中高精度与低假阳性率相关,高召回率与低假阴性率相关。两者的高分表明分类器正在返回准确的结果(高精度),以及返回所有肯定结果的大部分(高召回率)。
Scikit-plot 可以通过使用 plot_precision_recall 方法从标签和概率中生成精度-召回曲线。
我们将在 plot_precision_recall 方法中传递真实标签和预测概率来生成绘图。

精确召回
该图显示了 3 条不同的曲线及其面积值,分别为
- 0 级精度-召回曲线
- 第一类精确召回曲线
- 微观平均精确召回曲线
分解模块
分解模块包括专门为 scikit-learn 估计器构建的图,这些估计器用于降维,例如 PCA。您可以使用自己的估计器,但是这些图假定 scikit-learn 估计器具有共同的特定属性。
6.PCA 成分方差
主成分分析(PCA)是最早的多元分析技术之一。然而,它不仅幸存了下来,而且可以说是减少多元数据维度的最常见方法,以揭示有时隐藏的、通常隐藏在它下面的简化结构。其他人将它定义为一种数学算法,它减少了数据的维度,同时保留了数据集中的大部分变化。
在实践中使用主成分分析的一个重要部分是估计需要多少成分来描述数据的能力。这可以通过查看作为组件数量的函数的累积解释方差比来确定。PCA 中的解释方差比率计算由每个选定组件解释的方差百分比。
Scikit-plot 可以使用plot _ PCA _ component _ variance方法生成 PCA 成分的解释方差比率。
我们将在 plot_precision_recall 方法中传递具有**explained_variance_ratio_**属性的 PCA 实例来生成曲线。

方差比
上面的曲线量化了前 N 个分量中包含了多少总的 14 维方差。例如,我们看到数字的前 3 个分量包含大约 81.4% 的方差,而您需要大约 8 个分量来描述接近 100% 的方差。
可以阅读 Matt Brems 写的文章,了解更多关于 PCA 的知识。
在教科书的开始,我用我的研究生统计理论课,作者(乔治卡塞拉和罗杰…
towardsdatascience.com](/a-one-stop-shop-for-principal-component-analysis-5582fb7e0a9c)
包裹
在本文中,您了解了如何向 scikit 添加绘图功能——学习对象并通过查看彩色绘图获得洞察力。你可以开始在你的下一个机器学习项目中实现 scikit-plots。
如果您对绘制集群感兴趣,scikit-plot 具有 Clusterer 模块,包括专门为 scikit-learn Clusterer 实例构建的图,您可以查看文档以了解关于 Clusterer 模块的更多信息。
本文的数据集和源代码可以在 Github 上找到。
[## davisy/带有 Scikit-Plot 的机器学习项目
Scikit-plot 是一个谦逊的尝试,为缺乏审美的程序员(比如我自己)提供机会…
github.com](https://github.com/Davisy/Machine-Learning-Project-with-Scikit-Plot)
如果你学到了新的东西或者喜欢阅读这篇文章,请分享给其他人看。也可以随意发表评论。在那之前,下一篇文章再见!也可以通过推特 @Davis_McDavid 联系到我。
最后一件事: 在下面的链接里多看看类似这样的文章。
探索性数据分析逐步指南。
medium.com](https://medium.com/analytics-vidhya/why-you-need-to-explore-your-data-how-you-can-start-13de6f29c8c1) [## 使用投票方法的特征选择
特征选择是自动或手动选择那些对…贡献最大的特征的过程
medium.com](https://medium.com/analytics-vidhya/feature-selection-by-using-voting-approach-e0d1c7182a21) [## 如何用 Python 日志模块运行机器学习实验
有时候“打印”并不是一个好主意
medium.com](https://medium.com/analytics-vidhya/how-to-run-machine-learning-experiments-with-python-logging-module-9030fbee120e)
伟大的数据科学家与众不同的技能
当最重要的事情是问自己一些棘手的问题时,我们倾向于关注硬技能。

Patrick Amoy 在 Unsplash 上拍摄的照片
在新的和有抱负的数据科学家中,有一种可以理解的趋势,即专注于获得硬量化和编程技能。他们急于学习最新流行的语言和技术,希望这能让他们在就业市场上更具竞争力,或者给老板留下深刻印象。
多才多艺很棒。它可以节省时间,并且可以帮助您找到更好的建模方式。这也让你的思维更加敏捷,更有创造力。都是非常好的东西。
但最终,多功能性并不是数据科学家能够拥有的最重要的技能。这是因为,几乎根据定义,数据科学家一开始就非常全能。一旦你学会并使用了几种语言或建模技术,学习另一种通常是相当容易的。
换句话说,多功能性和硬数据科学技能是商品,在数据科学市场上只能给你有限和暂时的竞争优势。
相反,在数据科学家中有一种更罕见的品质,一种远没有那么耀眼或被谈论的品质,但它可以成就或摧毁你作为一名数据科学家。它比新的语言和技能更难获得,因为它违背了大多数数据科学家的优化思维。这是伟大的数据科学家真正与众不同的地方。
伟大的数据科学家总是诚实地问自己一个问题:
这个数据集/算法中有什么看起来不对劲?
听起来很简单,对吧?只是基本常识。毕竟,当你问自己这个问题时,你就更有可能发现问题并提高工作质量。它还可以帮助您找到数据中隐藏的故事,然后您可以将这些故事集成到工作产品中。

最重要的是,虽然使用次优的统计技术可能会让你失去一点预测的准确性,但包含错误的变量或无意中利用大量有偏差的数据集的影响可能会大得多。它会完全破坏你的工作成果和你作为数据科学家的可信度。
因此,很自然地,你会认为大多数数据科学家在发布数据和工作产品之前会问自己可能出了什么问题。有什么比批判性地思考数据、你使用的变量和你的发现更容易的呢?
事实证明,很多。我在数据科学领域工作了 10 年,最初是一名数据科学家,后来成为了一名数据策略师和讲师,我发现在职业生涯的早期问自己这个问题,或者在以后教其他人坚持这样做,非常困难。
虽然每个数据科学环境都不尽相同,但有几个共同的原因使得数据科学家更具自我批判性具有挑战性:
- 你有很多事情要做。当您从一个项目跳到另一个项目时,一旦您的工作产品通过了最低质量控制阈值,就很容易“勾选这个框”,这是可以理解的。你希望有更多的时间钻研数据,但是你的老板或客户已经给了你很大的压力。
- 你相信你的数据所讲述的故事。确认偏差是数据科学中的一个主要问题。如果你觉得它是对的,那么你就没有动机去质疑它。但是,即使事情看起来有点不对劲,也很容易解释清楚,更不用说更方便了。数据科学家是事后合理化的专家。
- 你不想承认你不知道怎么回事。有时,当事情看起来不对劲时,你会深入调查,但却无法找出问题所在。它可能是随机的噪音或者更有意义的东西——你不知道,而且数据没有变化。但现在你已经发现了问题,你可能会觉得向你的主管或客户提及这个问题有点尴尬。这可能会影响你的工作。为什么挖得太深会招来问题?接受事物的本来面目要容易得多。
所有这些都是为什么很少有数据科学家能够始终如一、诚实地问自己什么看起来不对劲。
有很多方法可以解决上述每一个障碍。例如,我发现,承认数据中一些无法解释的混乱非但不会伤害你,反而会建立与主管和客户的信任。一旦有人发现问题并要求你解释,那么“打勾”的感觉就不那么好了。我的一些最好和最有影响力的工作开始于注意到数据中的一些东西看起来不对劲。
所以如果你刚刚开始,我给你的建议是学会质疑自己和你的数据。硬技能不错。但是当你发现一个数据科学家问自己一些棘手的问题时,你知道你可以绝对信任他们。那就更有价值了。
懒鬼将自己重塑为数据科学家指南
数据科学/职业
给我们其他人的固执己见的建议。热爱数学,选修。

Andrew Itaga 在 Unsplash 上拍摄的照片
自从我写了一篇关于 我的数据科学之旅 的文章后,很多人向我咨询关于他们成为数据科学家之旅的建议。一个共同的主题开始出现:有抱负的数据科学家对如何开始感到困惑,一些人因为大量的信息而溺水。那么,另一个是什么,对吗?
嗯,让我们看看。
我敦促有抱负的数据科学家放慢脚步,后退一步。在我们开始学习之前,让我们先处理一些事情:重塑自我的艺术。重塑自我需要时间,所以我们最好在游戏中尽早开始。
在本帖中,我将分享一种非常固执己见的方法,让自己重塑数据科学家的形象。我会假设关于你的三件事:
- 你破产了,但你有勇气。
- 你愿意牺牲和学习。
- 你已经做出了 有意识的决定 成为一名数据科学家。
让我们开始吧!
重要的事情先来
我非常相信尤达的智慧:“做或不做,没有尝试。”对我来说,要么你做点什么,要么你不做。对我来说,失败不是一个选项,我知道除非我完全放弃,否则我不会真正失败,这让我感到安慰。所以第一点建议:不要放弃。永远不会。
做或不做,没有尝试。—尤达
从心中的目标开始
让我们把网上的事情安排好,开始考虑 SEO。SEO 代表搜索引擎优化。最简单的思考方式是一种非常好的艺术,尽可能多地在互联网上放上你的真实职业名称,这样当有人搜索你时,他们只会找到你希望他们找到的东西。
在我们的例子中,只要您的名字出现在搜索结果中,我们就希望出现“数据科学”或“数据科学家”这两个词。
所以让我们开始在网络上乱扔垃圾吧!
- 如果你还没有一个专业的 Gmail 帐户,就创建一个。不要让你的用户名成为 sexxydatascientist007@gmail.com。谨慎行事,越无聊越好。以first.last@gmail.com、开头,或者如果你的名字很普通,就加上“数据”,比如first.name.data@gmail.com。不惜一切代价避免数字。如果你已经有了一个,但是它没有遵循前面提到的指导方针,那就再创建一个!
- 创建一个 LinkedIn 账户并使用你的职业邮箱地址。将“培训中的数据科学家”放在标题中。“数据科学爱好者”太弱了。我们已经做了一个有意识的决定,并致力于这项任务,记得吗?当我们在做的时候,让我们把应用程序也放在我们的手机上。
- 如果你还没有一个脸书账户,那就创建一个,这样你就可以宣称你的名字了。如果你已经有了一个,把它放到 private pronto 上!多做一点,删除手机上的应用程序,这样你就不会分心。对 Twitter、Instagram 和 Pinterest 等其他社交网络也是如此。暂时将它们设置为私有,稍后我们会考虑清理它们。
- 如果你还没有推特账户,创建一个账户。我们可以在用户名上留一点余地。让它简短、令人难忘,但又不失专业,这样你就不会伤害任何人的感情。如果你已经有了一个,决定是要保留它还是重新开始。你要问自己的主要问题是:你的历史中有没有什么内容可以被解释为不专业或有轻微争议的?谨慎为上。
- 开始在 LinkedIn 和 Twitter 上关注数据科学领域的顶级声音。这里有几个建议:凯西·科济尔科夫,安吉拉·巴尔蒂斯,莎拉·n .,凯特·斯特拉赫尼,克里斯汀·凯莱,法维奥·瓦兹奎,当然,还有我一直以来最喜欢的:埃里克·韦伯。
- 创建一个 Hootsuite 账户并连接你的 LinkedIn 和 Twitter 账户。开始安排数据科学相关的岗位。您可以分享其他人关于数据科学的有趣文章,或者发布您自己的数据科学冒险经历!如果你确实分享了其他人的帖子,请确保你给出了适当的署名。简单地添加一个网址是懒惰和没有好处的。感谢 埃里克·韦伯 为此亲提示!
- 拍摄一张专业照片,并将其作为你所有社交媒体账户的个人资料照片。如果可能的话,以中性背景为目标。确保照片中只有你,除非你是埃里克(他已经赢得了他的印章,所以不要质疑他!LOL。)
- 创建一个 Github 账户,如果你还没有的话。当你开始做数据科学项目时,你会需要这个。
- 奖励:如果你能抽出几美元,去wordpress.org给自己弄一个有你职业名称的域名。我很幸运有一个不常见的名字,所以我有ednalyn.com,但是如果你的名字很常见,发挥创意,编造一个你能识别的名字。也许类似于 janesmithdoesdatascience.com 的作品。然后你可以开始计划在网上发布你的简历,或者甚至写一两篇关于数据科学的博文。我呢,刚开始学数据科学的时候是从写经验开始的。
- 清理:如果时间允许,开始审核你在社交媒体上发布的攻击性、诽谤性或不讨好的内容。如果你想节省时间,试试像 brandyourself.com 这样的服务。警告!它会变得很贵,所以注意你点击的地方。
做你的家务
不开玩笑!当你做家务、散步或者甚至开车时,听播客谈论数据科学话题,如线性离题和 TwiML 。不要太执着于记住他们所说的话。顺其自然,迟早他们讨论的术语和概念会听起来很熟悉。请记住,不要太沉迷于你开始燃烧你正在做的任何东西的讨论,或者像我过去多次发生的那样错过退场。
最基本的部分
既然我们已经处理了生活和呼吸数据科学的预备知识,现在是时候处理实质性问题了:实际上是学习数据科学。

作者截图
关于如何学习数据科学,从来不缺少观点。他们太多了,让你不知所措,尤其是当他们开始谈论先学习基础数学和统计学的时候。
废话!
告诉我我忘记,
教我我记住,
让我参与我学习。—中国古训
虽然重要,但我不认为首先学习理论有什么意义,因为我可能很快就会睡着,或者更糟的是,被数学公式的冲击吓倒,以至于我非常恼火,最终放弃了!
相反,我谦卑地提议,采用 Ken Jee 在他的文章 中描述的“最小可行知识”或 MVK 的概念:我将如何学习数据科学(如果我不得不重新开始) 。
在他的文章中, Ken Jee 将最低限度的可行知识描述为学习“刚刚能够通过实践学习”我建议检查一下:
从我的数据科学之旅中学到的经验
towardsdatascience.com](/how-i-would-learn-data-science-if-i-had-to-start-over-f3bf0d27ca87)
我对 MVK 的方法非常直接:学习足够的 SQL 以便能够从数据库中获得数据,学习足够的 Python 以便能够控制程序并能够使用 pandas 库,然后做端到端的项目,从简单的到越来越有挑战性的项目。在这个过程中,您将学习数据争论、探索性数据分析和建模。交叉验证和网格搜索等其他技术肯定也是您旅程的一部分。诀窍是永远不要太舒服,总是慢慢地逼自己。
以列表为导向,下面是我的流程:
- 学习足够的 SQL 和 Python,以便能够完成越来越复杂的端到端项目。
- 对于每个项目,经历数据科学管道的步骤:规划、获取、准备、探索、建模、交付(讲故事/演示)。一定要在你的 Github 账户上记录你的努力。
- 冲洗并重复(迭代)。
要更深入地讨论数据科学管道,我推荐以下文章:
数据科学项目生命周期
towardsdatascience.com](/papem-dm-7-steps-towards-a-data-science-win-f8cac4f8e02f)
对于每个迭代,我建议做一个端到端的项目,实践以下每一种数据科学方法:
- 回归
- 分类
- 使聚集
- 时间序列分析
- 异常检测
- 自然语言处理
- 分布式 ML
- 深度学习
对于每种方法,实践它不同的算法、模型或技术。例如,对于自然语言处理,您可能希望练习以下技术:
- n 元语法排序
- 命名实体识别
- 情感分析
- 主题建模
- 文本分类
按一下就行了
当你做端到端项目时,在 Github 上公开你的工作是一个很好的实践。它不仅会跟踪你的进度,还会备份你的工作以防你的本地机器坏了。更不用说,这是一个展示你进步的好方法。注意,我说的是进步,不是完美。一般来说,如果我们的 Github 库有点乱,人们会理解的。事实上,大多数人都希望如此。至少,只要确保每个回购都有一个很好的 README.md 文件。
Github Repo README.md 上的内容:
- 项目名
- 项目的目标或目的是什么
- 项目背景
- 如何使用项目(如果有人想自己尝试)
- 提及你的关键词:“数据科学”、“数据科学家”、“机器学习”等等。
不要忽视这一点:不要犯大错,不要在公共代码中硬编码您的凭证或任何密码。把它们放在一个。env 文件和。别理他们。作为参考,请查看 Github 的文档。
关于如何使用 Git 和 Github 的深入教程,请查看安妮·邦纳的指南:
Git 和 GitHub 基础知识,供好奇和完全困惑的人使用(加上最简单的方法来为您的第一次公开…
towardsdatascience.com](/getting-started-with-git-and-github-6fcd0f2d4ac6)
出于对数学的热爱
最后,随着你越来越好地运用不同的技术,你开始做超参数调整,我相信在这一点上,你已经准备好面对必要的邪恶,那就是数学。很有可能,你越理解和发展直觉,你就越不会讨厌它。也许,只是也许,你甚至会爱上它。
当谈到学习数据科学背后的数学时,我有一个一般性的建议:慢慢来。对自己温柔一点,不要设期限。再说一次,如果最终会让你发疯,那么雄心勃勃和解决一些重大问题是没有意义的。这一点都不好玩。
学习数学通常有两种方法。
一种是采用结构化的方法,首先从学习基础开始,然后逐步学习更具挑战性的部分。为此我推荐 KhanAcademy 。个性化你对微积分、线性代数和统计学的学习。迈出小步伐,庆祝小胜利。
如果您看到此消息,这意味着我们在网站上加载外部资源时遇到了问题。如果你是…
www.khanacademy.org](https://www.khanacademy.org/math/ap-statistics)
另一种方法稍微适合更多的实际操作,需要一点逆向工程。我称之为逆向学习。你首先要找出一个项目中涉及到的数学概念,然后把这个概念分解成更多的基本概念,并以此为起点。这种方法更适合那些喜欢边做边学的人。
在 Analytics Vidhya 上的一篇帖子展示了一个边做边学的好例子:
[## 用 Python 和 R 语言学习朴素贝叶斯算法的 6 个简单步骤
注意:本文最初发布于 2015 年 9 月 13 日,更新于 2017 年 9 月 11 日概述了解其中一个…
www.analyticsvidhya.com](https://www.analyticsvidhya.com/blog/2017/09/naive-bayes-explained/)
由本文补充:
概述贝叶斯定理是统计学中最强大的概念之一,是数据科学专业人员的必备知识…
www.analyticsvidhya.com](https://www.analyticsvidhya.com/blog/2019/06/introduction-powerful-bayes-theorem-data-science/)
休息一会儿
嗯,学数学真的很难!它如此强大和强烈,你最好经常休息一下,否则会有大脑过热的风险。另一方面,休息并不一定意味着休息一天。毕竟,疲倦的人是没有休息的!
每隔一段时间,我强烈建议你在学习技术的同时,了解一些商业方面的知识。对于这一点,我推荐马克斯·史隆的经典著作:《T2:用数据思考》。你也可以在 Medium 上找到很多文章。
例如,看看的 Eric Kleppen 的文章:
数据科学不仅仅是算法和建模
towardsdatascience.com](/the-business-side-of-data-science-5-tips-for-presenting-to-stakeholders-fb624a9a6e54)
与人交谈
休息一下有时会很孤独,独自一人思考会让人筋疲力尽。所以你可能最终决定与你的家人交谈,问题是,你对数据科学如此积极和狂热,以至于你只能谈论它。迟早,你会惹恼你爱的人。
它发生在我身上。
这就是为什么我决定和其他有相似兴趣的人交流。我参加聚会,并开始与已经在从事数据科学的人或像你一样渴望成为数据科学家的人建立联系。在我们所处的后 COVID(希望如此)时代,群组视频通话更加普遍。这实际上更有利,因为现在,地理不再是一个问题。
LinkedIn 是一个很好的资源。你可以使用社交网络找到其他有相似兴趣的人,甚至找到当地的数据科学家,他们每个月还能抽出一两个小时来指导有积极性的学习者。从你当地的公司开始。找出他们是否有在那里工作的数据科学家,如果你找到了,请给他们发一条个性化消息,请求联系。给他们选择优雅地拒绝的机会,让他们把你推荐给另一个有时间指导你的人。
最坏的情况是他们拒绝了。别难过,好吗?
结论
感谢阅读!这就是我关于将自己重塑为数据科学家的非常固执己见的建议。我希望你从中有所收获。我欢迎任何反馈。如果你有什么想补充的,请在评论或回复中发表。
我们继续这个讨论吧!
如果你想和我联系,你可以通过 Twitter 或LinkedIn联系我。我喜欢与人交流,我会尽最大努力回复他们的询问。
敬请期待,下期帖子再见!
如果你想了解更多关于我从懒鬼到数据科学家的旅程,请查看下面的文章:
我的无学位数据科学之旅。
towardsdatascience.com](/from-slacker-to-data-scientist-b4f34aa10ea1)
[1]引用调查者。(2020 年 6 月 10 日)。告诉我,我忘了;教我,我可能会记得;牵扯到我和我学。https://quoteinvestigator.com/2019/02/27/tell/
[2]走向数据科学。(2020 年 6 月 11 日)。我将如何学习数据科学(如果我必须重新开始)。https://towards data science . com/how-I-would-learn-data-science-if-I-had-to-start-over-F3 BF 0d 27 ca 87
大数字的小问题
人类的大脑特别不擅长解释大量的数字。
不要误解我的意思,任何受过基础教育的人都可以按照自己内心的渴望来计算——或者直到他们意识到这项任务或生活总体上是徒劳的。真正的挑战是理解这些大数字意味着什么。
例如,我们知道一百万、十亿和一万亿是巨大的数字——但大多数人很难理解它们之间的差异有多大。
从时间上来理解这个稍微容易一点。
一百万秒是十一又二分之一天
10 亿秒相当于 31 又 3/4 年
1 万亿秒是 31710 年
除非你是数学课本上谈论的那种人——那种购买数百个西瓜让孩子们练习代数的人——否则你每天都不会和大数字打交道。
即使从进化的角度来看,我们旧石器时代的祖先也不需要担心大量的数字。早期人类只需要对小批量的数量有一个基本的概念,比如部落中的人数,或者有多少动物可能占据某个区域,或者其他穴居人关心的事情。
我们设法更好地数数(再次对买西瓜的人大声喊出来,没有你不可能做到),但大数字仍然让我们困惑。
尽管有这种认知障碍,我们每天都被庞大的数字包围着,并被期望去理解它。无论是最新的疫情数据、政府的预算提案、最新的新闻、科学研究,还是其他我们假装看懂了听起来很聪明的东西。
现在,如果是关于如何真正理解大数字的话,这将是一个伟大而有用的帖子。
但事实并非如此。
这是为了帮助你认识到你在理解大数字方面有多糟糕。
一副牌可以有多少种排列方式?

每当你洗一副牌的时候,很有可能你已经把它们按照宇宙历史上从未有过的顺序排列了。但是有多少种方法可以做到呢?
任何上过概率初学者课程的人都会告诉你这很简单——答案是 52!
对于门外汉来说,一副标准的纸牌有 52 张独特的牌,还有“!”最后并不是因为数字特别激动人心,而是读作“52 阶乘”。这就是数学上的乘以小于它的数。
52! = 52 * 51 * 50 … 3 * 2 * 1
=80658175170943878571660636856403766975289505440883277824000000000000
以你敏锐的观察力,我相信你一定已经发现这是一个巨大的数字。但是这个数字到底有多大?
这里有一个创造性的方式来看待它。
设置一个计时器,这样就需要 52 分钟!几秒钟后到达 0。
现在,选择赤道上的任何一点。你得沿着赤道绕地球走一圈。但是有一个问题——每十亿年你只能走一步。
当你完成一次绕赤道的旅行并到达出发点后,从太平洋中取出一滴水。
现在重复整个过程——以每一步 10 亿年的速度绕地球走一圈,每绕地球一周,从太平洋中移除一滴水。继续下去,直到海洋变空。
清空太平洋后,拿一张纸,平放在地上。
重新填满海洋,重新开始整个过程,每次清空海洋时都要在堆栈中添加一张纸。
这样做,直到纸堆到达太阳。
一旦栈到达太阳,把它拿下来,然后 … 你猜对了,再做一遍。
更有一千倍的。
现在计时器肯定已经到 0 点了吧?
没有。
你只完成了三分之一的时间!
那是多大的 52!真的是。
延伸阅读
这是个脑筋急转弯。拿一张纸,用端点 0 和 10 亿画一条线。然后打一个勾号…
www.wsj.com](https://www.wsj.com/articles/grasping-giant-numbers-is-far-from-second-nature-1490952621) [## 如何理解难以理解的大数
我们人类是聪明的一群,但是当涉及到理解和处理过多的数字时,我们真的很糟糕…
io9.gizmodo.com](https://io9.gizmodo.com/how-to-comprehend-incomprehensibly-large-numbers-1531604757) [## 52 阶乘
它们看起来足够无害,52 片层压纸板薄片,侧面印有彩色设计。然而,作为…
czep.net](https://czep.net/weblog/52cards.html)
Snapchat 数据科学家访谈
Snapchat 数据科学面试问题

图片来自 Unsplash
目录
介绍
Snap Inc .,俗称“相机公司”,是一家社交媒体公司,成立于 2011 年,总部位于美国加州圣莫尼卡。Snapchat 用户发送和接收视频、图片、文本和图画。该公司还开发了 Spectacles,这是一种可佩戴的太阳镜,能够以普通视频格式拍照和录制视频。Spectacles 还可以连接到用户的 Snapchat 档案。
2019 年第一季度,Snapchat 的日均用户数超过 2.03 亿,而每天发送的快照达到 35 亿条。2019 年,Snapchat 互动镜头的播放量也超过了 150 亿次。
Snapchat 有一个数据宝库,数据科学家和分析师可以在此基础上分析数据,以更好地了解用户行为,改善他们的体验,并推动广告目标。简单地说,Snapchat 生成的数据量使其成为数据科学家茁壮成长和发展职业生涯的完美环境。
阅读更多关于 Snapchat 的 数据科学面试题 。
Snapchat 的数据科学角色
在 Snapchat,每个数据科学家都被安插在不同的团队中,如工程、营销、产品管理等。,解决基于业务和产品的问题。Snapchat 的数据科学家的角色各不相同,从专注于产品的分析到更具技术性的计算机视觉研究,每个角色都有。
所需技能
Snapchat 聘用在数据科学或其他相关定量领域拥有 3 年以上行业经验(高级职位 5 年以上)的合格申请人。招聘要求对团队中的工作角色来说非常具体。在申请时,强调符合这些职能角色的行业经验至关重要。
其他相关资格包括:
- 丰富的因果推理技术、实验设计和/或 A/B 测试经验
- 扎实的 SQL 或其他大数据查询语言背景(3 年以上)
- 使用 Python 或 R 等编程语言的经验
- 有使用 SciPy 或 Panda 等分析软件包的经验
- 具有在商业智能(BI)工具(例如 Looker、Tableau、Power BI、Google Data Studio)中创建视觉效果和仪表盘的经验
- 能够清晰有效地向高管传达分析结果
Snapchat 有哪些数据科学团队?
根据分配的团队,Snapchat 数据科学家的职能包括:
- 广告运营:创建和测试假设,建立模型和机器学习管道,以了解 Snapchat 用户如何与 Snapchat 上的广告互动,并与产品和工程团队合作,以创建和扩展见解。
- Snap Games: 利用数据分析和模型提供对玩家、游戏和产品性能的洞察。
- 产品设计:创建和测试假设、实验设计和 A/B 测试。创建视觉效果和仪表盘来推动和影响公司数据文化。
- 感知:利用先进的数据分析工具,包括针对不同用户创建和测试假设。
- 增长:设计和构建数据管道和关键数据集,以支持仪表盘和探索性分析。跨团队协作,应用定量分析、数据挖掘和统计建模。这些信息用于推动业务决策,并了解用户如何与产品和功能交互。
面试过程

图片来自 Unsplash
Snapchat 数据科学家面试流程从与招聘人员或招聘经理的初次面试开始,随后是与数据科学家的技术筛选。通过技术筛选后,将进行现场面试,包括与团队经理、数据科学家和产品经理的五次一对一面试。
初始屏幕
这是一个试探性的电话和与招聘经理或招聘人员的聊天。在这次面试中,他们试图了解你的技术背景和过去的相关项目和经验。还讨论了 Snapchat 的团队、适用的工作角色和工作文化。
技术屏幕
技术筛选(45 至 60 分钟)由数据科学家通过 Skype 完成,主要侧重于分析和统计。问题(通常是开放式的)是标准化的,围绕 SQL、A/B 测试、实验设计和一些 Python 脚本。一般来说,标准并不是很高,他们希望你理解基本原理。
对于在技术屏幕期间会遇到什么样的面试问题,请查看一份清单 Snapchat 的技术数据科学面试问题 。
现场面试
现场面试是流程的最后一个阶段。它包括五次一对一的会议,每次大约 45 分钟,由团队经理、数据科学家和产品经理参加。除非是视频聊天,否则还会提供午休时间来讨论文化。
请记住,面试的目的是评估候选人如何利用数据科学概念、算法和模型来提供业务影响洞察。Snapchat 数据科学家访谈结合了大多数数据科学概念,如产品分析、统计和概率、A/B 测试和实验设计、SQL 和数据操作以及预测建模。
温习这些概念以及回归和分类建模和其他相关领域的知识。在白板上练习编码也很有帮助。
在我们的 SQL 编辑器中,在面试查询上尝试下面的 SQL 问题:

编写一个 SQL 查询来创建 2020 年 1 月每个用户评论数量的直方图。假设容器桶分类间隔为 1。
感谢阅读!
如果你喜欢这篇文章,并想了解更多关于 Snapchat 的数据科学采访…
- 查看 Snapchat 的数据科学面试问题 。
- 对更多数据科学指南感兴趣?查看 谷歌 和脸书 数据科学面试题。
- 报名 面试查询 每天在你的收件箱里获取几个数据科学面试问题。
- 订阅我的 Youtube 频道 了解更多数据科学访谈。
病毒式增长中的社会图表
从人际互动中推理集体结果的方法:数学模型的计算机模拟
在撰写本文时,由病毒新型冠状病毒引起的冠状病毒疾病新冠肺炎正在全球蔓延。病毒从一个有传染性的人传播给另一个人,经过一段时间的潜伏期后,病毒可能会继续传播给另一个人。
一种观点认为,病毒在世界的社交图谱中传播。社交图是社区中人们的相关社交互动的数学表示,在这种情况下,真实世界的互动具有非零的传播病毒的概率。
在接下来的内容中,我阐述了传播如何依赖于社交图的特征。
我使用建立在抽象基础上的数学模型的计算机模拟。因此,模拟处理事物或信仰如何在网络中复制的一般现象,以及所述网络的性质如何反过来影响传播的性质。经济学家、营销人员、反恐怖分子和流行病学家等在他们的实践中应用网络和图表理论。
我进行的模拟将病毒在社区中传播的宏观陈述与相互作用和复制机制的细节联系起来。换句话说,关于人际互动的直觉可以与病毒传播的宏观或集体属性联系起来。自下而上的计算机模拟是根据对基本属性的信念来设计解释的。这是这种方法的优点之一。
然而,我并不要求对特定的新冠肺炎病给出定量的预测或个人或集体行动的建议。地方卫生当局是寻找这些信息的更好的地方。更确切地说,我相信,如果世界的模型及其逻辑是明确的,那么作为一个群体,可以获得一种对复杂事件进行推理的更明确的方式。我们对一种行为的偏好,或者对过去的判断,都建立在对世界如何运转的信念之上。我们的选择只是,我们是否以及如何让这些信念——这就是模型——变得明显。
为了超越我阐述的定性陈述,需要针对具体数据和验证进行更大的努力。但是病毒传播现在比以往任何时候都更加合理。这就是我展示这些工具的原因。
在接下来的部分中,我将展示并讨论计算机模拟的结果。最后,我提供了一些技术方法细节以及我创建和使用的 Python 代码的链接。
建立的关键数量:完全混合社会图中的病毒传播
想象一个社区,其中每个人都与每个人互动,对彼此没有偏好。像这样一个理想化的社区是一个合适的基线,用来比较随后的模拟和添加到社交图上的额外异质性。
一个混合良好的社区映射到一个完整图上。节点代表社区中的个体。这些边连接成对的个体,这些个体可以相遇,此时病毒传播发生的概率通常很低,但不是零。

完整社交图中四个节点(个人)的小插图
在接下来的内容中,我使用了一个通用的时间单位(TU) ,而不是小时、天或周,以避免产生一种错误的特定感。如果需要,读者可以替换术语。
对于基线场景,进一步描绘如下:除了一个人,所有人都健康地开始。当一个传染性个体在社会图中遇到一个未受感染和未免疫的个体时,病毒在一个 TU 中的传播以概率 P 发生。一旦被感染,基线情景中的个体进展如下:
- 在感染事件的大约 1-3 个月之后,个体变得具有传染性,并且可以开始感染他们遇到的其他个体。
- 在大约 6-10 TUs 后,疾病被发现,此时个体自我隔离,并停止与社会图中的其他个体接触(并因此感染)。
- 大约 10-15 TUs 后,个体恢复,此后对进一步感染免疫,并返回到它们在社会图中的先前位置。
我省略了死亡事件的建模。在现实世界中,它们当然是最重要的。我目前的重点是短期的病毒传播,所以这个省略是有道理的。
进一步设想基线场景的两个小变化:
- 更有可能的传输者:作为基线情景,除了会议发生时的传输概率是基线的两倍。
- 延迟恢复:作为基线情景,除了恢复发生在感染事件后约 13-18 tu。
这三个场景是用完整社交图中的一千个人模拟的。

这三种情况的共同点是,在疾病发展的早期,受感染的人数呈指数增长。那是因为受感染的个体在当时是相对罕见的,所以绝大多数受感染的个体是有可能将病毒传染给健康个体的会议的一部分。
一段时间后,增长趋于平稳,并达到峰值。当许多会议涉及成对的已经感染的个体或免疫个体时,社交图中较少的会议可以有助于病毒在社区中的传播,并且恢复率很快超过感染率。
这些情景之间的集体结果的差异源于以下关系:
- 如果病毒更容易在个体之间传播,受感染个体的数量在开始时增长更快,下降也更快。
- 如果一种疾病需要更多的时间来恢复,那么在任何一个时间点上被感染的个体数量都会更大,因为恢复的个体流回到社会图需要更多的时间来开始。
这些是相当直观的关系,是进一步分析的良好基础。
表征集体结果的另一种方式是确定在健康个体自我隔离并随后康复之前,传染性个体将病毒颗粒传播给健康个体的数量。
从最初 100 名受感染个体的疾病进展中,获得了以下直方图。

在更有可能的传播情况下,受感染的个体更有可能在自我隔离之前感染更多的个体。这是量化这种情况下感染增长更大的一种不同方式。在这个量上,延迟恢复与基线没有什么不同,这是因为它们的不同之处不在于传播的性质,而在于恢复。
在流行病学文献中,每个受感染个体的传播平均值有时被称为 R0 。在一些病毒传播模型中,这些直方图是模型的输入,而不是结果,在合理的理论假设下,它们可以被建模为负二项分布。
到目前为止所描述的结果和关系可以从使用常微分方程或简单类型的随机抽样的标准增长模型中获得。因此,它们在数学上非常高效。这种模型做出各种同质性假设,包括关于社交图的假设。
由于我明确地模拟了个体对个体的动态,我可以引入异质性,并看看它如何在集体结果中表现出来。这就是我想要探索的直觉和宏观观察之间的联系。
社交距离对所有人都有利,即使不是所有人都参与其中——这可能是一个正在形成的协调困境
我从两个维度对社交距离建模:一个给定的个体进行了多少社交距离,以及有多少个体参与了这种社交距离。因此,对社区中个人之间的非统一程度的社会距离进行了建模。
我继续使用完整的社交图,并使用如上所述的相同基线场景。此外,还模拟了以下种类的变化: X%比 Y%更谨慎。这意味着模拟社区中的 X%的人在与社交图中的另一个人互动时,传播或接收病毒的可能性降低了 Y%。其余百分比的个人,100-X%,与基线场景中的个人没有什么不同。
同样,一千个人被模拟。

图中的曲线展示了被称为平坦曲线的特性。社区中在社会交往中持谨慎态度的个人比例越大,增长就越慢,因此感染高峰就越低。
下图显示了前 100 名感染者依次将病毒传播给了多少其他人。不出所料,相互作用越谨慎,每个感染者的传播就越少。

在这些模拟中,社区的人口由两种类型的个体组成:实行社会距离的个体和不实行社会距离的个体。换句话说,后一部分与构成基线情景人口的个人类型相同。
单独分析模拟群体的那一部分,即非距离个体。

该图显示了在不同模拟社区中被感染的非远距离个体的相对数量。请注意,这些曲线已经过缩放,因此可以进行比较,而不仅仅是反映社区中非距离个体的不同数量。
关键的结论是,随着社区中实行社会距离的其他个体数量的增加,那些没有改变他们个人行为的个体仍然会以较低的比率被感染。
实践社交距离的人也从他们的实践中受益,尽管如果更少的其他人参与同样的实践,受益会更少。换句话说,集体成果是合作的,而不仅仅是各部分的总和。
因此,在某些条件下,这可以起到类似于经典协调困境的作用,类似于著名的囚徒困境。举例来说,如果实行社交距离是有成本的,那么个人的最佳选择就是成为唯一一个不实行社交距离的人,而其他人都这样做。一旦一些人“背叛”了保持距离的做法,个人保持社会距离的好处就会减少,背叛的动机就会增加。因此,集体最优是不稳定的。
然而,必须指出的是,仅仅因为一个困境可能存在,它可能不会在现实世界中被激活。正如奥斯特罗姆和西格蒙德等人所指出的,对现实世界中的人类、制度和文化的研究表明,额外的规范和禁忌往往演变成间接短路协调困境。一旦我们可以回顾新冠肺炎疫情,这将是有益的经验调查世界各地的不同社区如何度过这些潜在的协调困境。
下图对比了社交距离对更可能的发送者情景(见上一节)的影响和基线。

在更有可能的传播情景中,相当大的社会距离仍然会导致比基线情景更快的感染增长。
这表明,尽管社会距离在质量上总是使曲线变平,但病毒传播的其他特性对通过这种缓解努力可以实现的精确的 T2 数量减少非常重要。如果需要将峰值拉平到给定阈值以下,则必须从病毒传播相关特性的定量考虑中推断出需要多少社交距离。
我只是在模拟社区的个体中模拟了适度的异质性。社会距离的程度和范围可能会随着社区对疾病严重性的认识而变化,这种认识会随着病毒传播的过程而变化。为了解释这一点,需要更复杂的个人意图和行为模型。所谓的基于主体的模型提供了在某些利己假设下根据信念和意图对行为进行建模的手段。当面对极端事件时,根据定义,几乎没有可用于模型训练的追溯数据,因此需要人类和社会力学的基本原理模型。
穴居人图和小世界中的病毒随机游走:社会图拓扑可能是人际动力学中不确定性的放大器
在图论中,大量的原型图被定义和研究。上一节中使用的完整图形是一个。这是连通性的一个极端例子:每个节点离所有其他节点只有一步之遥。
一个更少连通的图是所谓的穴居人图。我将使用相关的放松穴居人图作为社交图,并探索它如何改变传播的本质。

图像中的蓝点代表图中对应于健康个体的节点;四个红点是被感染的个体;白色的重叠和交叉线是连接节点对的边。节点被放置成使得彼此之间具有许多连接的节点是靠近的。十个白色束中的每个包含 100 个节点,每个节点形成几乎完全连接的组或集团。图中只有 1%的边在组之间。
一束几乎完全连接的节点的特写。

放松的穴居人图形代表了一个原型社区,其中每个人都与一个小的子社区紧密相连。一些个体直接连接到两个或更多的子社区,尽管对于任何个体来说,大量的社会联系都在群体内部。然而,在社区中的所有个体之间总是存在一条通过中介的路径。每个人至少都是其他人的朋友的朋友的朋友。
下面的动画图像显示了一个模拟的疾病轨迹,以五个 tu 为一步。除了蓝色和红色的节点,紫色的代表反应性自我隔离的个体,绿色的代表康复和免疫的个体。

这种蔓延似乎是以两次爆发的形式进行的。首先,五组开始从蓝色过渡到红色,紫色,然后绿色。第二,当第一组大部分是绿色时,其余五组开始从蓝色明显转移。
这种传播突然增加的现象是群体间病毒传播很少的结果。实际上,有一个看不见的过渡障碍。
然而,在病毒传播或社交图中,没有任何东西要求传播像上述那样以两次爆发的方式进行。特定的结果取决于一些关键的低概率事件的结果。下图显示了在放松的穴居人社会图(社会和传播事件的不同随机化)的九个独立模拟中,随着时间推移的感染人数,以及其他基线病毒特性。

在放松的穴居人社会图中,围绕感染的平均(或预期)进展,病毒传播有很大的差异。重复数 2,清晰的双峰曲线,是动画图像中显示的曲线。
关键是输入信息的不确定性转化为结果的大量不确定性。模型中的随机变量量化了我们对过程中各个组成部分的知识的不确定性。例如,在某一天,A 个体可能与 B 个体相遇,如果发生,可能导致病毒传播。如果个人 A 和 B 属于不同的节点群,这种相遇和转变可能会被证明——事后证明——是使病毒传播到大多数健康个体群的关键事件。
对于完整的社交图,同样存在输入知识的不确定性。然而,在这种类型的社交图中,病毒传播在集体输出中的可能结果的范围要窄得多。因此,随着社交网络拓扑结构的改变,相同的人际传播特性会转化为不同的集体结果。
另一个结果是,在放松的穴居人社会图中,两个相同的群体可以在某个时间点经历完全不同的结果,原因仅仅是一个罕见的事件发生了不同的转变。回顾性观察到的一些差异没有需要解释并转化为前瞻性陈述的重大结构性原因。
另一类图是小世界图。许多现实世界的网络是高度聚集的(一个人的朋友也可能是彼此的朋友),并且具有适度的最短路径长度(如果可以找到的话,网络中几乎任何两个个体之间都有相对较短的路径)。用 Strogatz-Newman 图算法构造了一个原型小世界社会图,再次模拟了基线情景病毒的传播。

结果的可变性没有放松的穴居人大,尽管比完整的社交图大。
另一个原型图形是环格。个体以与小世界图中相同的方式聚集。不过,任何两个节点之间的最短路径长度都可能很长。然而,没有像放松的穴居人图中那样明显的节点组。

作为参考,设置不同社交图的模拟,使得 TU 中的会议总数无论如何都是相同的。因此,图表类型之间的差异不也不反映每个 TU 的会议总数的任何变化。
为了便于比较,将增长的平均值放在一起。小世界(10%)图类似于上面的小世界社交图,但是在非聚集节点之间有额外的路径。

对于更聚类的社交图,病毒传播更持久,受感染个体的峰值因此降低,尽管这些社交图的任何单个特定结果都可能偏离平均值更多。
如果我们把病毒想象成一个在社会图中随机移动的物体,那么它发现通向某个人的路径的能力将取决于图的拓扑结构。瓶颈、群集之间的捷径数量等是社交图的特征,除了病毒在人与人之间传播的容易程度之外,这些特征还决定了集体结果,包括可能结果的范围。毕竟,我们只观察一个现实,所以距离关系到对未来可能发生的事情的陈述(这个话题我已经在详细讨论过了,关于多伦多的城市火灾)。
上面的社交图是说明性的原型。它们只是为了说明在其他条件相同的情况下,社会特征的差异如何影响集体的结果。与任何特定案例相关的实际社交图是什么,比如新型冠状病毒在一个城市的传播,社交媒体上的猫迷因,或者文艺复兴时期佛罗伦萨的政治影响,是一个不明显的实证问题。
如果恢复没有带来免疫力和其他试探性问题呢?
到目前为止,所有的模拟都假设对进一步感染的免疫力来自于康复。对于病毒感染来说,情况往往如此,因为免疫系统可以适应特定的病原体。然而,这并不能保证,因为人可以通过药物治疗(不是疫苗)通过免疫系统的非适应性部分康复,或者也可能发生在流行期间,病毒发生变异,使得以前感染的免疫记忆占据应用。
这种动态可能很复杂,取决于第一轮感染中死亡的人群以及特定病毒的适应能力。我目前对可能性的范围了解得太少了。因此,我不会进一步探讨这个问题,只需注意这对于病毒传播的长期发展非常重要。
另一个与社交图谱中的传播有关的特征是主动隔离,即人们被隔离,而不管他们已知的感染状态。在其最简单的形式中,它可以被建模为穴居人图中的一组节点,与其他组完全隔离。然而,大规模的隔离通常会引起摩擦,比如个人的反抗,或者是持续时间,而不是疫情状况,决定了隔离是否适用。这些动力学需要更多的思考来包含,我把它推迟到另一个时间。
模型细节
接下来,我将简要介绍这个模型。底部的代码链接。
一个人被建模为具有疾病状态。该状态可以经历一个状态转换。下图中的绿框代表数学模型中的疾病状态,箭头上方的黑色文本代表状态转换。

箭头代表条件关系(不是流程图)。激活和下游状态转换被建模为随机事件。动力学知识中的不确定性通过累积概率密度分布来量化。例如,激活转换需要感染存在。在给定的条件下,伯努利试验的结果决定了某一天是否发生了状态转换。伯努利试验的概率参数取决于从感染转变以来已经过去了多少天,使得状态转变变得更有可能是久而久之。
infect 状态转换依赖于社交图中个体和邻居之间的交互。可能导致感染的步骤有:
- 在社交图的所有边上循环。
- 对于一条边,让伯努利试验的结果决定该边所代表的会议是否发生。概率参数是与边相关联的权重。
- 如果会面发生,那么只有当一个人具有传染性,而另一个人既没有被隔离也没有免疫也没有被感染时,尝试以某种概率进行病毒传播。如果成功,则执行感染 状态转换。
在上述模拟中,边上的权重被设置为使得一个 TU 内会议的总预期数量与节点数量成比例。不管社交图拓扑如何,这都是真的,这意味着图拓扑之间的差异而不是来自尝试的病毒传播数量的任何差异。
Python 代码可以在这个 Github 库中免费获得,没有任何质量保证或支持。代码特别建立在 Pandas 和 networkx 库的基础上,图形是用 Bokeh 库创建的,除了网络图像是用 Cytoscape 创建的。
Scrum 大师的孤独
财务与技术
敏捷框架应该如何适应变化

托尼克在 Unsplash 上拍摄的照片
"软件开发是一场洞察力的游戏,洞察力来自有准备的、休息放松的头脑."
肯特·贝克
我完全同意肯特·贝克的观点。当然准备好了…休息好了!轻松!不是在第一波,第二波,或任何一波期间,而是在疫情的整个过程中。让我们明确一点,尤其是如果你是一个女人。
前提
我不想在这里谈论 SARS-COV2。这是新的常态。下一个正常。无论你想要什么。反正是事实问题。因此,在这个(更加)复杂和有趣的时代,我们中的许多人将要领导一个软件项目。
有人认为“重要的不是物理距离,而是缺少 Einheit ”你们中的一些人可能已经有过在全球分布的团队中工作的经历。但是我们在封锁期间经历的,并且仍然在经历的,是一个分布式团队(可能在同一个时区)的极端和矛盾的版本,即“在家工作”。
我也理所当然地认为你在使用精益和敏捷的方法开发软件产品。在这里,我讨论了 Scrum,并对 Scrum 作为一种敏捷方法应该或者能够如何适应这个时代做了一些思考。
我认为不管你是不是 Scrum 的粉丝,我的考虑都是有益的。我一直认为,要实现一个软件项目,你需要很大的自由。自由意味着在所有的可能性中辨别、辨别和决定什么对你是好的。总而言之,自由就是选择一套适合你的规则。所以,本质上,要自由,你需要规则。真是自相矛盾!我认为这适用于我们生活的任何方面,适用于我们做出的每一个简单的选择,而不需要看复杂的东西,如软件项目!
总的来说

我可以目睹更大的疲劳与冲突的感觉和动力。
一方面,更多的物理隔离(和集中),另一方面,更多的物理隔离(和痛苦)。
在这里,我将向您介绍四个基本点以及一个指南针,让您一起驾驭这些变化:
- 建筑
- (超)专业化
- 每日混战
- 控制狂
我们的指南针:人类动力学。
建筑

法尔汗汗在 Unsplash 上的照片
也许我们需要框架中的另一个角色,或者一个更不平衡的团队。
架构是一个软件项目中所有东西的整体构架。它不仅仅是开发粘合剂:它定义了大粒度的交互;它让我们明白如何维持非功能性特征;它确保我们开发的不是所有东西的大杂烩,而是复杂系统中相互作用的部分。
XP、Scrum 以及其他敏捷方法似乎支持新兴架构的概念,没有大的早期结构化,而是微观选择的结果。以这种方式工作是非常非常困难的,也是非常有益的,有时这是唯一可能的方式。然而,奇怪的是,它需要大量的能力和沟通,更重要的是,大量的纪律!从这三种资产,加上敏捷性和最佳实践,一个伟大的软件架构可能真的会出现。
无论如何,这实际上是一个开放的问题,在敏捷方法和强大的、内聚的、一致的软件架构的开发之间。这甚至更难远程实现,因为涉及到许多远程互动,远程互动更难、更不轻松、更令人疲惫。好吧,那怎么做?根据我的经验,有两种可能的方法:
- 更多地关注架构的显式设计,当然是迭代地和增量地,而不是试图以软件和系统动力学原理等复杂系统的行为为代价,让它浮现出来(假设你已经意识到使用 Scrum 来处理它们)。这种动态是可行的,即使可能会让这个过程变得不那么有趣。
- 团队中的一个人可能比团队中的其他人更快、更有领导能力、更有经验,以至于她不知不觉地、致命地塑造了架构,这要归功于她在编写代码方面的生产力和经验水平。某种类型的团队领导(显然不是另一个 Scrum 大师,只是一个不愿意并且因为她的能力,自然倾向于带领其他人走向精确方向的人)。我们知道不支持集体代码所有权的动态风险,并且基本选择可能不会被所有人完全共享或认可。敏捷实践的对立面。但也许当距离更远,更两极分化的团队可以工作得更好。
无论哪种情况,你都在改变 Scrum 中的力量平衡,中期内会改变到什么程度还不清楚。
(超)专业化

给他们需要的环境和支持(!)并相信他们能完成工作。
敏捷还意味着团队中的所有开发人员都承诺在中期能够轮流做所有的事情。而这也是靠伟大的沟通来维系的。
专门化在这里指的是系统地避免组成软件系统的某个部分、某种算法、组件或其他东西的开发人员,相反,每次都更喜欢其他东西,并将她的活动集中在这些组件上,对它们越来越熟练,对其他组件越来越不熟练或几乎不熟练。这种动态可以在短期内产生积极的影响,但当然,这与敏捷相反,在中长期内只会产生负面影响。
在很长一段时间里,我们可以很少或很少质量地交流,我们都是孤立的,这种动态可能导致项目的漂移。那又怎样?
对此的唯一答案是,当你远离与任何你想要的人分享键盘的机会时,你必须更勇敢,更愿意,克服懒惰和恐惧,像在同一房间一样与他人分享那些该死的信息。如果你想以同样的方式保持敏捷,就要做额外的工作!
我要补充的是,通过有一个更清晰和定义明确的架构,你将通过设计避免(过度)专业化。
每日混战

特别是当你设法做非正式的日常 scrum,当你必须在线安排它们时,它结束了一件更加僵硬和复杂的事情。
在某些情况下,你可以组织日常的 scrum,而不会看起来像“日常 scrum”。这不是欺骗自己或别人,而是简单地说,即使看起来不是那样,你也这样做。而且是加分!因为每天的检查不应该是一种责任,而是一种分享和“同步”我们工作日的快速交谈,一种具有最大透明度的快速非正式交谈。最初很难达到,但是几次之后,达到了一些凝聚力,就变得容易和有益了。相反,当你每天在网上进行 scrums 时,一切看起来都很奇怪和笨拙。
当你和 5-6 个人在 Skype 上进行日常聊天时,即使你和这些人很熟,也不可能是无缝的聊天。最重要的是,不是快速的。即使你能做到透明和清晰(这对你、你的团队、你的人际关系、你的家庭背景、你作为一个团队的凝聚力以及许多其他东西都有好处),你在保持非正式性和更重要的简洁方面也会有更多的困难!一个电话变成了一个约会,变成了一次会议,变成了“让我们一起开一个半天的开发会议”,而不是每天的混战。
生产力可能会受到影响。然而,它也可以成为一件好事。安排一次所有团队都参与的会议,而不仅仅是一个小组或两个人参与,这并不常见。康迪视有光明的一面。然而,每天的 scrums 已经变成了别的东西。在对框架进行全面评估时,必须考虑到这一动态。
控制狂

照片由pix poeties在 Unsplash 上拍摄
Scrum 里没有老板。
Scrum Master 在某种意义上是一个领导者,但不是团队的首领或老板。相反,她是一个促进者,一个可以保护团队免受外部干扰的人,这样团队可以更容易、更自由、更有成效地工作。我想起这个概念是因为,在一些糟糕的 Scrum 应用中,经常会有这样的误解,认为 Scrum 大师就是老板。没有什么比这个框架的真实性更远的了。
除此之外,无论你是否使用 Scrum,你都可以很容易地找到这样一个人,他告诉你:如果你不想陷入混乱,你就必须更努力!当然,这也是对做好软件的一个很大的误解(不仅是在 Scrum 上)。然而,情况变了,人也变了。当然,我们都是专业人士……当然……尽管在其他情况下,人们很容易撒谎,随波逐流,变得悲伤,变得疯狂,因为没有看到你的 Scrum Master 而变得更开心,迷失在交流中,等等……
“那我做了什么?”
Scrum 大师
问题是不要咄咄逼人或专横跋扈,要远程实现正常甚至更好的表现。当然,这不可能是解决办法。然而,有些人认为。
其实我觉得,从远程来说,比平时更多地策划工件,比平时更多地关心任务的明确命名,照看冲刺规划,温柔地梳理任务状态的完成情况,用爱珍惜来自龙岗的感悟等等,才是根本。通过这种方式,您可以保持透明和沟通,这是敏捷的两大支柱,从远处塌陷。
但是这种对工件和沟通的更多关注并不能成为你脱离团队的借口!如果你是真诚的。你不能只关注 git 问题、Trello 卡或 asana 计划,因为这样你就没有时间和精力编码了!
总的来说,如果你认为交流少是问题所在,你需要解决真正的问题:撒谎!与你所想的相反。为了让其他人放心,为了支持团队中的良好情绪,善意的人可能会隐藏问题。这是一个问题!
这就把我们带到了…人类动力学。在这风雨飘摇的时刻,我们唯一真正的指南针。
指南针:人类动力学

Alex Alvarez 在 Unsplash 上的照片
围绕有积极性的个人建立项目。
- 首先,人们还会以这种方式“快乐”地工作吗?但是没有唯一的答案。有些人更快乐,有些人更悲伤,有些人更糟糕,有些人完全不开心..向上。有些人最终会更专注、更有效率,而有些人会感到无聊,因为有效率需要别人。退一步说:所有习惯敏捷的人必须熟悉一种不同的敏捷方式。
- 我们来谈谈谎言吧!不想让别人失望的愿望导致只交流积极的事情,也是因为你不想让团队除了你自己以外的人难过。因为我知道,人与人之间是不同的:你可以在一秒钟内从不同的情绪中转换。但是,请忍住!以回避问题的方式谈论问题会让问题变得更大。即使推迟问题讨论也会让他们成长。我敢打赌,在我们陷入这种恶性循环的所有时间里,我们更有可能出现重大错误。
- 这需要的不仅仅是增加交流。因为让我们明确一点:在复杂的技术方面,几乎不可能远程地相互理解。正如开发人员所知,最好的方法是亲自带着两个记号笔和一块板。相反,即使有最好的连接,最好的屏幕共享,最好的东西,也很难甚至不可能理解复杂的编码问题。你没有看到所有的事情。所以,结果就是你讲简单的事情就这样了。复杂的东西是单独面对的,而不是和其他人一起攻击,这导致在编码的复杂方面的共享权更少,从而导致更低的质量。因为和别人一起做某事和在你做了之后解释同样的事情是不同的。不会吧,不一样。
- 我知道你通常不想和客户交谈,但是远程…你会有两个敌对部落的感觉!请不要这样做…它甚至可以更好地从远程与商业人士交谈,这是他们的栖息地。请考虑这样做,即使你最终可以回到你非常开放的交流空间。
结论
我们需要适应当前的变化。没有什么比 Scrum 更能拥抱这种变化了。因此,Scrum(以及其他方法)也应该适应这个奇怪的时代。对于 Scrum 来说,这可能包括更多不平衡的团队或者改变日常 Scrum 的概念。可以肯定的是,能活下来的,只是那些能更好地适应环境有奋斗或乐趣的人。
关注我的 Medium 了解更多信息。
让我们也在 Linkedin 上保持联系吧!
我们不缺乏沟通。相反,我们拥有太多了。我们缺乏创造力。我们对现在缺乏抵抗力。
德勒兹和瓜塔利
参考
[1] G .赫姆克斯和 l .金泰拉;《正确扩展:如何通过 Scrum@Scale 实现业务敏捷性并使竞争变得无关紧要》(2020);Scrum@Scale。
[2] K .贝克和 c .安德烈斯;《极限编程解释:拥抱变化》(1999);艾迪森-韦斯利。
[3] K .施瓦布;“使用 Scrum 的敏捷项目管理”(2004);微软。
[4]《历史是武器——暴动宣言》(1991);比基尼杀手杂志 2
从长远来看,专业化的“数据科学家”将会胜出
意见
成为专家会比成为多面手让你走得更远

Bermix 工作室在 Unsplash 拍摄的照片
在我的上一篇文章“ 品牌在数据科学中的重要性 ”中,我提到数据科学已经变得过于宽泛,因此品牌是一个很好的策略,可以用来克服成为“数据科学家”的噪音,这反过来在审查过程中对我们有利。
最近,一个特别的话题在我和朋友的讨论中反复出现。品牌的重要性!我…
towardsdatascience.com](/the-importance-of-branding-in-data-science-467b2d2b1e7f)
在思考了一段时间我自己的写作后,它让我想知道…
如果我告诉人们要专门化,会不会更容易些?
尽管作为一个社区,我们正面临着身份危机,但我通常并不关心头衔。然而,我理解区分角色的重要性,在此基础上,如果我们开始看到像“统计建模师”、“自然语言处理工程师”或“计算机视觉工程师”这样的角色(可能不是这些确切的名称,但你会明白我的意思),而像数据分析师这样的角色开始恢复他们的身份,我不会感到惊讶。
换句话说,数据科学的热潮已经结束,是时候专门化了。原因如下:
这样更容易
成为一名不可或缺的“数据科学家”需要做很多事情,包括紧跟最新趋势、最佳实践和发展。鉴于数据科学的广泛性,必须全面记住所有这些东西就像打一场败仗。为了保存赢得战争的资源,你最好输掉这场战斗。
全面掌握最新的数据科学就像打一场败仗。你最好输掉那场战斗,这样你就可以把注意力集中在赢得战争上!
这引发了一个问题……战争是什么?好问题。在你的职业生涯中长寿,不可或缺,是未来的证明。
我们都知道技术变化有多快,因此通过专业化我们可以减轻负担,因为我们减少了学习曲线。一般化的技能需要做更多的工作,而且会耗费更多的精力,因为我们没有经过精细磨练的技能。或者,通过专注于一个(或两个)领域,你更容易集中你的时间和注意力,从而获得更好的理解和专业知识。
创建一个学习计划来成为一个强大的 NLP 实践者比创建一个数据科学领域的学习计划要容易得多,所以为什么不这样做呢?成为一个专家通才需要太多的时间,而与此同时,一个人可以发展专业技能并拓展业务。
败家子
我已经提到了我的上一篇文章“ 品牌在数据科学中的重要性 ”以及它是如何促使我写这篇文章的,但让我们更强调一下如果你今天进行转变,它将如何有所帮助...
“当竞争激烈时,脱颖而出是值得的”
哈佛称数据科学将是 21 世纪最性感的工作,现在每个人都想要最性感的工作。在我看来,这绝不是一件坏事。我希望尽可能多的来自不同背景的人参与数据科学,然而,在人们聚集的地方,脱颖而出是值得的。
还记得那个经典问题吗:“如果你有心脏问题,你会更喜欢一个能处理各种问题的医生给你做手术,而不是一个专业的心脏外科医生吗?”。大概不会!
我们可能会不惜一切代价让专家胜过多面手,即使这意味着要付出难以想象的一大笔钱。这并不是说你应该纯粹为了经济利益而成为专家。尽管如此,您的深度和知识将成为您的客户的信任和可信度,我们知道这些客户更喜欢专家—财务收益纯粹是副产品。
"你的优势是你在某个领域的深度和知识."
让我们换一个问题:“你愿意让一个专门研究计算机视觉的人来处理你的图像分类问题,而不是让一个拥有一般知识的人来处理吗?”
享受
好吧,你决定专攻某样东西。说,计算机视觉!你已经制定了你的学习计划,并决定了一个很酷的项目,你想用你正在学习的技能来完成它。
你会变得更好更快,因为你可以把所有的精力放在开发你的计算机视觉技能上,当你擅长某件事时,你会更喜欢它,因此你会想做得更多…
资料来源: Giphy
徘徊在“这不是我的工作,这是我喜欢做的事情”的境界是我们都想去的地方。当你擅长你所做的事情时,你会获得更大的个人和职业满足感,这让你更想做这件事——“当你玩得开心时,时间过得很快”。
因此,专业化将把你培养成一个更有效率和更有成效的从业者。如果你花更少的时间做你正在做的事情,你就有更多的时间做你想做的事情!
最后的想法
与我的想法相反,也有一些很好的理由来解释为什么有人会决定忽略我的意见,例如:
- 拥有一套通用的技能可以增加你独立完成任务的可能性,而不必依赖他人的帮助
- 你不太可能感到无聊,因为你广泛的技能允许你处理不同的问题
- 你是更多公司买得起的。
你站在哪里?—留下回应,或者让我们在 LinkedIn 上继续对话。
[## Kurtis Pykes -人工智能作家-走向数据科学| LinkedIn
在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有一个工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)
学习数据科学的阶段
如何在关键学习点“摆脱困境”
许多人认为学习数据科学是一个线性过程。事实上,这是一个混乱的进程,更接近于一系列的平稳期。

感知与现实的数据科学学习曲线
幸运的是,已经有一个很好的通用学习模型来解释这些平台是如何工作的。这种模式是诺埃尔·伯奇在 20 世纪 70 年代创造的,罗伯特·格林在他的书《掌握》中对其进行了扩展。根据这个框架,我们经历了 5 个学习阶段:无意识无能、有意识无能、有意识胜任、无意识胜任和精通。学习数据科学也遵循这个过程。

诺埃尔·伯奇和罗伯特·格林的学习阶段
在本文中,我将解释在数据科学的框架中,每个阶段是什么样子的。我谈论我在每个阶段的经历,也包括一些我发现的从一个阶段到下一个阶段的最快方法。
阶段 1:无意识的无能(完全新手)
在这个水平上,你才刚刚开始进入数据科学领域。你几乎没有编码或统计经验。阶段 1 一般以过度自信为特征。很多人认为学一两门课就能学会该领域。
这是我大学毕业时的普遍感受。有了几门经济学课程,我觉得我已经准备好进入体育分析的世界了。学习数据科学似乎是下一个实际步骤。从高层次来看,这个领域似乎很简单,你只需要在数据中找到趋势,并提出见解。简单吧?
不用说,我完全错了。开始学编程后,我已经无可救药的迷茫了。我开始把我需要学习的所有不同的概念放在一起,这个任务从简单变得极其艰巨。
为了从阶段 1 进入阶段 2,您需要了解什么是数据科学,以及它需要哪些编程和数学概念。我建议观看 YouTube 视频,并涉猎一些 python 编程来达到这种理解。
阶段 2:有意识的无能(恐惧)
一旦你开始对编程和数学的世界之大感到不知所措,你就进入了第二阶段。这是一个很多人卡住甚至退出的阶段。在这里,您将了解数据科学有多深入。要学的东西太多了,不清楚从哪里开始。
度过这一阶段的关键是将数据科学分成小步骤。你也只需要从某个地方开始。最基础的,对于数据科学来说,你需要了解一些编程(Python 或者 R)和简单的统计学。在网上找一些地方来了解这些领域。我推荐参加免费的编程或数据科学课程(【kaggle.com】微课程是我的最爱)。
在这个阶段减少我不知所措的感觉的是思考我为什么要学习这个领域。我心中有一个具体的项目。我想建立一个模型,改善我每天玩的幻想运动的结果。如果我只专注于必要的技能来构建它,我可以让数据科学看起来小得多,也更容易管理。
为了进入下一阶段,我建议专注于一个特定的问题,使你的学习标准更小。与学习整个数据科学领域相比,更容易理解完成单个项目需要什么。做一个小项目也没有“学习 python”或“学习统计学”那么令人生畏,因为这些概念是如此宽泛和模糊。在早期阶段,你真的只需要知道这两个领域的基础知识,就能够实践数据科学。如果你完成了这些小项目中的几个,你就会进展顺利。
我也建议在 kaggle 上复习一下别人的代码。你可能根本不会理解,所以不要惊慌。随着时间的推移,它将开始变得有意义,而只是大量地看代码是这个过程的一个好的开始。列出你看到但不理解的术语、包和算法。每天,研究一些这些概念,并试着理解它们。你会对自己在几周内取得的进步感到震惊。
第三阶段:意识能力(轻微危险)
至此,您已经完成了几个不同的项目,学习了如何实现特定的算法。您现在有一些代码可以参考了!
当我处于这个阶段时,我收集了所有我经常使用的代码片段,并把它们放入一个主文档中。我可以只参考这个科学怪人的文档,而不是试图记住如何做每件事。这使得以更快的速度完成更多的项目成为可能。这可能感觉像是欺骗,但我认为在这一点上,关注实现比关注语法更有意义。你应该做尽可能多的项目,应用你在研究中发现的所有不同的算法。
在应用这些概念之后,你应该开始理解它们是如何工作的。在这个阶段,我开始读研。在我的课程中,我们被要求从头开始编写这些算法。我认为这对所有数据科学家来说都是一个很好的实践。虽然我有一些在 matlab 中编写神经网络的 PTSD,但这绝对是值得的。从编写算法开始,您开始理解各种技术的输入、约束和限制。
从阶段 3 到阶段 4 没有秘密可言。让你跨过门槛的是重复,不断的练习。
阶段 4:无意识能力(艺术和科学)
当你到达第四阶段时,你知道面对问题时该做什么。您不必再参考庞大的代码片段库,您可以开始专注于优化您的问题解决方法。在这里,您将专业领域的专业知识和商业直觉与您的工作相结合,为您的挑战创造最佳的解决方案。
我相信这是真正的数据科学艺术开始发生的地方。你不再关注如何解决问题,而是寻找一个优雅且可持续的解决方案。您将更多的时间花在特性工程、模型调整和将项目投入生产上。你还与商业利益相关者更紧密地合作,以确保你提供的服务产生最大的影响。
我相信我仍然经常在阶段 3 和阶段 4 之间波动。希望今后我能在我的角色中更多地感受到这种“流动”状态。
阶段 5:掌握(贡献)
在这个水平上,你已经接近在这个领域的某个领域达到精通。在数据科学中,我真的不认为有人能掌握整个学科。你能够通过发现新的算法或解决问题的新方法来突破界限。
这个阶段是虚幻的,我认为很少有人达到这个顶峰。我认为,属于这一类别的大多数人都倾向于学术界,并且更专注于研究而不是业务实施。
最后的想法
我希望这个框架能够帮助您以新的视角评估自己的数据科学学习之旅。我还希望它能给你一个坚实的路线图来提升你的数据科学知识。从我的经验来看,学习数据科学是一个漫长但愉快的过程。
https://www.youtube.com/watch?v=hpMc6TgT34I
斯坦福情感树库(SST):使用 NLP 研究情感分析
斯坦福情感树库(SST)快速指南,它是最著名的情感分析数据集之一。
发表于 2013 年的“情感树库语义组成的递归深度模型”介绍了斯坦福情感树库(SST)。SST 被认为是一个重要的数据集,因为它能够测试 NLP 模型的情感分析能力。让我们来看看这个有趣的数据集。

在斯坦福情感树库上预测从非常消极到非常积极的情感水平(-,0,+,++)。图片来源于论文的原作者 Socher 等人。
任务。 SST 处理情感分析的关键任务,其中模型必须分析文本的情感。例如,这可以以确定餐馆评论是正面还是负面的形式出现。以下是一些虚构的例子,展示了他们情绪中的一系列积极和消极方面:
这是我不幸吃过的最差的餐馆。
这家餐厅送食物有点慢,而且他们似乎没有使用最好的食材。
这家餐馆相当不错——考虑到价格低廉,它的食物还可以接受。
这是西半球最好的餐厅,我一定会回来再吃一顿!
基于这些例子,情感分析似乎是一项简单的任务。然而,有许多具有挑战性的细微差别使得准确分析一个短语的情感变得困难。对于 NLP 模型来说,诸如否定、讽刺和以肯定的方式使用否定术语等语言异常尤其难以处理。举以下例子:
我不讨厌这家餐馆。(否定)
我就是喜欢吃冷食!(讽刺)
这种食物独特得令人不安。(否定词表示肯定)
从这些例子中可以看出,这并不像仅仅寻找“恨”和“爱”这样的词那么容易。相反,模型必须考虑上下文,以便识别这些具有细微差别的语言使用的边缘情况。由于模型良好运行所需的所有复杂性,情感分析在 NLP 中是一项困难的(因此也是适当的)任务。
编译数据集。对于 SST,作者决定关注烂番茄的电影评论。通过搜集电影评论,他们最终得到了总共 10662 句话,其中一半是负面的,另一半是正面的。在将所有文本转换成小写并删除非英语句子后,他们使用斯坦福解析器将句子拆分成短语,最终得到总共 215,154 个短语。

用于标注 SST 的标注界面—标注者使用滑块来选择短语的肯定或否定程度。图片来源于论文的原作者 Socher 等人。
SST 是如何被注释的?作者拿出经典的亚马逊机械土耳其工人,以随机顺序呈现这些短语,并要求注释者使用滑块指出每个短语的情绪和情绪程度。滑块允许多达 25 种不同的情绪水平(有关这方面的详细信息,请参见下图),作者使用注释来定义任务的细粒度和二进制版本。在 SST 的细粒度版本中,有 5 个不同的类别(非常负面、负面、中性、正面、非常正面),并且所呈现的基线模型达到 45.7%的准确度。在 SST 的二进制版本中,只有 2 个类别(正对负),并且所呈现的基线模型达到 85.4%的准确度。

特定长度(n-gram 长度)的短语的情感注释直方图。较短的短语更可能是中性的,而较长的短语分布更均匀。图片来源于论文的原作者 Socher 等人。
海温的影响。作为情感分析的领先数据集,SST 经常被用作测试 BERT 和 ELMo 等新语言模型的许多主要基准数据集之一,主要用于展示各种语言任务的高性能。
SST 将继续成为未来许多年情感分析的首选数据集,并且它肯定是即将发布的最有影响力的 NLP 数据集之一。
延伸阅读:
- Socher 等人的原始论文
- 斯坦福情感树库的主页——包括数据集的下载链接。
2020 年人工智能的状态
通过了解人工智能的过去来了解我们的未来走向。这篇文章对人工智能的过去、现在和未来进行了深入的概述。

毫无疑问,在过去十年中,人工智能、机器学习和数据科学已经成为技术领域最强大和最具前瞻性的力量。这些技术带来了突破性的见解和应用,可能会真正让世界变得更好。当然,这要归功于数据收集、硬件创新和被驱动的研究人员在 2010 年代的共生现象。这导致我们在从视觉到自然语言处理到音频理解到复杂信号处理的所有方面赋予计算机令人难以置信的能力。要了解我们的发展方向,重要的是要了解这些突破是如何形成的,以及我们目前所处的位置。这篇文章旨在做到这一点,并帮助揭示人工智能在当前状态下的局限性,以形成对未来的愿景。
本文中的
- 我们从哪里来
- 我们现在在哪里
- 我们要去哪里
我们从哪里来
自 20 世纪中期以来,人工智能已经采取了许多不同的形式。这包括从自动机到线性回归和感知器到决策树以及最终神经网络和深度学习的一切。随着进步和公众开始意识到这个“人工智能”到底是什么,这些方法通常会不可避免地从智能转向统计技术。2010 年代已经将大多数这些形式抛在身后,并允许从简单的神经网络转向深度学习的突破性方法。
神经网络到深度学习
虽然神经网络自 20 世纪中期以来就已经形成了理论,但计算和数据限制使得它们直到 21 世纪初才得以成功实施。这导致了这种数学方法的研究和能力的指数扩展,允许机器学习线性和非线性数据形式的模式。神经网络背后的概念或多或少是一组具有激活函数的堆叠和连接的线性回归。随着这些“神经元”的增加,网络有更多的变量需要训练,因此可以模拟更复杂的模式。数学和结构已在此进一步详细说明。

前馈神经网络(来源【9】)
大约在 2010 年及以后,计算和数据能力真正开始赶上这些理论。出于这个原因,研究人员和工程师意识到,随着他们增加更多的层和每层的神经元,这种统计技术可以以接近人类的方式为回归或分类模式建模。这些系统很快就获得了在更简单的数据集上产生与基于规则的系统相同或更好的结果的能力。随着 GPU 技术允许更深的网络,深度学习接管了机器学习空间,实际上开始了一场比以往任何时候都更广泛的机器学习革命。
卷积和递归神经网络
随着深度学习的形成,人们很快意识到,语言和图像领域的计算机科学问题可以通过这种新形式的人工智能更有效地解决。因为研究变得如此广泛,而不仅仅是建立越来越深的网络,现有框架内的新老方法都得到了开发和利用。语言模型开始利用和适应递归神经网络的概念,计算机视觉实现了卷积神经网络。到 20 世纪 90 年代末,这两种形式不可避免地在许多方面混合在一起,但它们的独立道路对它们的突出至关重要。
递归神经网络基于当前输出依赖于先前时间步长的先前输出的思想。这当然是语言和大多数其他基于时间序列的数据类型的本质。当人类说话时,下一个单词不是从基本上下文中随机决定的,而是依赖于前一个单词和上下文。RNNs,更具体地说是 LSTM(长短期记忆)正是为此而实现的。这种网络结构循环反馈过去的输出作为输入,以产生下一个输出。这些输入既可以馈入典型神经网络的前端,也可以处理更复杂的内部矩阵运算,如 LSTMs 所示。这种方法允许在 NLP 和许多其他时间序列数据集中实现最强大的飞跃。语言生成和预测第一次变得更加可行。要更详细地了解 LSTMs,请点击这里。

通用卷积神经网络(来源 [10])
卷积神经网络现在已经接管了大部分人工智能空间,它们的创造者 Yann LeCun 预测,它们可以处理几乎任何我们可能想到的人工智能任务。不管这是真是假,CNN 已经在复杂的计算机视觉任务中实现了近乎完美的准确性。这个概念源于图像的三维特性。经典的深度学习网络通常使用一维输入,因此图像像素值将被展平为单个向量。这种活动导致每个像素的大部分空间关系的信息丢失。卷积的概念允许 3D 输入(即 RGB 图像),并使用一组过滤器值对输入执行滑动点积运算。这允许学习多个特征图,在训练期间,这些特征图通常剖析图像的不同特征。总的来说,这允许较低数量的权重,因为滤波器覆盖了所有 3 个维度和网络,以提取图像的更深层次的特征。在过去的 10 年里,操纵 CNN 的许多努力已经导致了计算机视觉的巨大突破。这些成就中的许多都详细记录在胜利中,如 ImageNet 结果。
培训和图书馆
当然,如果没有训练这些数学模型的能力并通过可访问的代码来这样做,这些进步都是不可能的。反向传播是用于训练任何神经网络的典型方法。这个概念利用基于输出权重的每一层的导数梯度来调整网络内部的每个权重。这需要复杂的编程和硬件来实现,尤其是对于更复杂形式的架构。
幸运的是 GPU 技术得到了发展,以及更多的数学方法使这种训练方法变得高效。NVIDIA CUDA 等技术允许在大规模并行 GPU 上执行数学运算,将训练时间从几天缩短到几分钟。这允许更快的迭代,从而更快地得到结果。与此同时,诸如批量标准化、丢弃和 ADAM 等强大的优化器等方法更进一步,允许可预测和有效的训练会话。

(来源 [12])
最后,如果没有随着 Python 和诸如 Tensorflow、Keras 或 PyTorch 等库的兴起而出现的语言和库支持爆炸,这些进步都是不可能的。由于其易用性和库支持,Python 已经成为最突出的编程语言。同样,它也是数学编程最理想的语言之一。这使得更多的人能够试验和构建新概念,同时消除了更复杂语言的麻烦。最重要的是,像上面列出的那些库的创建,允许更广泛的人接触这项技术。这反过来又创造了一个更加民主化的技术生态系统。总的来说,过去的十年让更多的人拥有了更多的能力,这才是技术发生真正指数级转变的原因。
我们今天在哪里
自然语言处理
语言处理的当前技术水平已经有效地融合了递归和卷积神经网络,同时在内部创建了新的方法。所有这些都围绕着变形金刚、自我关注和单词嵌入。这些概念都有助于对大规模并行 CNN 或 fcn 中的单词关系进行建模,从而有效地理解完整的语料库。
转换器完全按照它的名字来做——将一组单词嵌入转换成另一组单词嵌入或类似的结构。这对于机器翻译、单词生成或用于分类的向量创建特别有效。这是对变形金刚的深入研究,但简而言之,它们基本上是一对编码器和解码器网络,经过训练可以完成上述任务。一个强有力的概念是自我关注,它是变形金刚的核心。自我关注是谷歌最近开发的一种方法,用于在单次网络传递中模拟语言的重现性和空间性。为此,使用查询、键和值矩阵对每个输入序列执行复杂的数学方法。这些值被调整以模拟序列中所有单词的空间关系。

变压器编码器(源 [2])
这些概念已经通过伯特和 GPT-2 架构成功实现。虽然每个网络都有自己不同的方式,但它们都实施了超深度变压器模型,以成功完成序列到序列和多任务目标。GPT-2 的创造者 OpenAI 目前有可供下载的模型(经过一些争议),允许研究人员提示网络并接收创造性的“AI”书面文本。在内容创建、聊天机器人和文本生成中有许多这样的用例。这种强大网络的可用性应该允许技术继续其指数增长。
引用我创造的受过哲学训练的 GPT-2:
“生活的意义在于为那些缺乏这种能力的人创造可能性的幻觉……”
计算机视觉
随着卷积对于图像处理任务和其他任务变得更加有效,社区已经决定在他们的网络架构中进行更深入和更广泛的研究。这带来了残余网络的强大趋势。残余神经网络,例如在最先进的 Google Inception 网络的情况下,拼凑残余块来构建最强大的 CNN。残差块通常是两个或更多并行的 CNN,它们被连接或添加在末尾。这反过来利用强大的并行计算架构来实现比以往更好的结果。

谷歌盗梦空间(来源 [10])
与此同时,新的卷积方法被开发出来,使事情更进一步。比 Google Inception 网络高一级的是 Xception 网络。这个网络与其前身几乎相同,但使用了一种新型卷积,称为深度方向可分离卷积。该概念允许更少的参数计数和更高的精度。这在上面的论文中有更好的描述,但简而言之,它将卷积运算分成两部分。分别滑过每个通道的深度方向卷积,以及逐个像素地滑过所有通道的点方向卷积。这是我们熟知的方法中创新力量的又一个例子。
最后一个趋势是迁移学习,不仅在计算机视觉中,在所有用例中都是如此。迁移学习的概念是突出的,因为训练有素的网络不需要为每个用例重复。迁移学习通常采用预训练的特征提取网络减去其分类层,并冻结权重。然后将它们作为输入附加到用户自己的分类器上。训练过程现在只是训练新的分类器来利用来自大量训练的网络的输出。这使得计算机视觉网络,如 Xception,经过几个月的训练,可以适应任何领域的用例。
生成性对抗网络

由我的 GAN 实现生成的艺术
尽管它们还没有在商业用例中得到广泛应用,但生成对抗网络是当今人工智能最有趣的形式之一。其概念是建立一个生成器网络,将向量映射到图像矩阵或类似的矩阵。该输出被馈送到鉴别器网络,该网络学习解密生成内容和真实内容之间的差异。由于两个网络是串联训练的,生成器在欺骗鉴别器方面变得更好,因为它也变得更好。这个博弈均衡的最终结果是一个能够创造接近真实内容的生成器。这导致了一些相当惊人的艺术,写作,当然还有深刻的赝品。
训练和部署
人工智能已经达到了对一些生产软件系统有用和几乎至关重要的程度。详细描述的方法允许可接受的精确度水平,以允许这项技术进入野外。这在很大程度上要归功于强大的云技术,它允许可扩展的部署和理想的培训场景。
为了向公众部署强大的模型,需要理想的培训和架构。这正是神经结构搜索和超参数调整发挥作用的地方。使用巨大级别的计算资源,神经架构搜索在潜在架构(层、神经元、方法等)的组合级别集上运行训练。).然后可以使用结果来部署理想的模型进行训练和部署。在这个过程中,进一步调整超参数,以获得更理想的模型。
2020 年,库和云功能使部署人工智能驱动的应用变得简单。云可以容纳常见形式的人工智能,并提供 it 资源来扩展和管理应用程序的生命周期。同时,库允许数据科学和软件开发角色分离。这是因为通用模型文件类型只需要开发人员理解几乎任何编程语言中的给定库就可以部署数据科学家的模型。
我们要去哪里
在不久的将来,更复杂的架构和搜索算法的趋势将会继续增长。但是很快,人们就会质疑这些暴力手段的效率和聪明程度。已经证明了这些方法是如何产生碳足迹的。随着越来越多的社会开始看到人工智能的真实面目,并考虑这些分支,社区将需要新的方法。最近出现的一种方法是修改训练方法,开始从资源密集型反向传播方法转移。这方面的一个例子是贪婪 InfoMax 优化(GIM) 。这种方法允许分层训练,特别是在迁移学习的情况下,可以大大减少以较小梯度的形式训练所需的变量数量。

炒作周期(来源 [11])
技术进步是一个发现导致研究和发明方法并最终导致实施的过程。当我们通过这个周期时,它比任何东西都更强调当前的阶段。目前,我们正处于我们所知的人工智能的实施阶段,深度学习的发现和创新正在迅速应用于几乎每个商业问题。当然,这扼杀了对全新机器学习方法的整体发现努力。随着我们在未来几年在这个狭窄的空间中循环创新,随着深度学习被视为真实情况,可能会出现广泛的幻灭。随着世界认识到“人工智能”不是魔法,并开始看到实际上只是大量数学的局限性,他们可能会要求研究更加努力地接近真正的人工通用智能(AGI)。这是人工智能炒作周期将摆脱幻灭阶段,让位于稳定的新创新的时候。
这将意味着深度学习之外的全新方法将开始形成。强化学习将继续创新,但要真正达到人类或更高水平的智能,可能需要发生不可预测的范式转变。这些方法可能会开始以量子力学和计算系统为中心,因为量子计算的概念允许人工智能和决策的概率性质以前所未有的方式建模。量子也允许极高维度的系统,一次可以考虑比单一输入多得多的因素。作为人类,我们做决定并与周围的物理世界互动。我们每个行为的总体决定因素或智力是宇宙的总体物理系统。利用量子力学的概念而不是大脑作为人工智能系统的最终决定因素可能更有意义。总而言之,如果我们打算在人工智能上投入这么多时间,我们的目标不应该是比我们自己的大脑更好的东西吗?它是一种完全由我们控制的工具。这可能是定义我们大部分人生的不可预测的技术未来的走向。
机会是无穷的,因为任何独特的想法都可以带来方法的巨大变化,关于人工智能和数据伦理的辩论将继续,企业将越来越依赖这些方法作为他们最有价值的资源。花时间了解我们从哪里来,我们将去哪里,可以让每个人发展自己对未来的愿景。这些独特的人类愿景的全球矩阵将引领我们进入一个有人工智能在我们身边的光明未来。
“衡量智力的标准是改变的能力。”——阿尔伯特·爱因斯坦
在 LinkedIn 或Twitter上与我联系,继续对话。
在https://www.mindbuilderai.com看看我目前在做什么
参考文献
[1] Krizhevsky,a .,Sutskever,I .和 Hinton,G. (2017)。基于深度卷积神经网络的图像网分类。美国计算机学会的通讯,60(6),第 84-90 页。
[2]插图中的变压器,http://jalammar.github.io/illustrated-transformer/
[3]瓦斯瓦尼,a .,沙泽尔,n .,帕尔马,n .,乌兹科雷特,j .,琼斯,l .,戈麦斯,A. N .,凯泽,,还有 Polosukhin,I .你需要的只是关注。在神经信息处理系统进展中,第 5998–6008 页,2017。
[4]Devlin,j .,Chang,m-w .,Lee,k .和 Toutanova,K. Bert:语言理解的深度双向转换器的预训练。 arXiv 预印本 arXiv:1810.04805 ,2018
[5]亚历克·拉德福德、杰弗里·吴、雷文·蔡尔德、戴维·栾、达里奥·阿莫代伊和伊利亚·苏茨基弗。2019.语言模型是无人监督的多任务学习者。 OpenAI 博客,1(8)。
[6]弗朗索瓦·乔莱。"例外:具有深度可分卷积的深度学习."2017 年 IEEE 计算机视觉与模式识别大会(CVPR) (2017): n. pag。交叉引用。网络。
[8]S·洛伊,P·奥康纳,B·韦林。2019.结束端到端:表征的梯度隔离学习。一份 rXiv 预印本
[9]https://brilliant.org/wiki/feedforward-neural-networks/
[10]https://missing link . ai/guides/卷积神经网络/卷积神经网络架构锻造路径未来/
[11]https://en.wikipedia.org/wiki/Hype_cycle
[12] [前 5 名:最流行的机器学习库Python …
人工智能伦理的现状
一些清晰的信号来自刺耳的噪音

面部识别等使用人工智能/人工智能的工具可能会变成控制和压迫的机制。[图片来自 Pexels 的陈堃]
在他的博客文章“人脸识别和人工智能的伦理”中,Benedict Evans 谈到了在 20 世纪 70 年代和 80 年代初,人们对关系数据库有两种类似的担忧,就像我们今天对人工智能系统的担忧一样——首先,这些数据库将包含坏数据或坏假设(因为我们担心我们的偏见被融入人工智能系统),其次,这些数据库将被故意用来制造坏事来伤害人们(因为我们担心人工智能系统的邪恶应用)。担心是否有效,担心是否无效。
我们对人工智能系统的担忧在两个重要方面与我们对数据库的担忧略有不同——首先,人工智能系统正在拾取人类不知道存在的信号(棘手的复杂性),其次,先进的人工智能系统可以提供正确的声音答案,这些答案在非显而易见的方面是错误的(无意的欺骗)。该领域的人们越来越清楚,我们需要解决这两种行为。
谨慎乐观是好事。一些组织和政府为理解和解决这些担忧做出了合理的努力。在过去的几年里,关于人工智能伦理的文章激增,似乎来自所有与技术有关的组织,无论是国家政府还是大型科技公司。它们以指导方针、政策文件、原则或战略的形式出现,并伴随着一些委员会或董事会来监督其实施。哈佛大学伯克曼·克莱恩中心的研究人员撰写了一篇像样的论文,总结了对 36 份此类文件的分析,可以在这里找到。出现了八个关键主题——隐私、问责制、安全和安保、透明度和可解释性、公平和不歧视、人类对技术的控制、职业责任、促进人类价值观。值得注意的是,人类控制技术和促进人类价值是这 36 份文件中最少提及的原则。作者以一句警告的话结束了“在这些高层次概念的表达和它们在现实世界中的实际成就之间存在着广泛而棘手的差距”,即写关于伦理的政策文件固然很好,但如何将其转化为行动呢?
嗯,这很难。伦理是本土化的。试图将自己的本土伦理观点强加于一个全球性现象会带来挑战。有一些善意的努力将人工智能伦理原则转化为行动。我将它们大致分为技术、政策、人员和监管类别,尽管所有类别都错综复杂地联系在一起。
技术
技术工作包括实现允许更好的机器学习可解释性的技术工具(例如,使用本地可解释的模型不可知解释,或 LIME,一种模型不可知工具,用于提供对分类器为什么预测某些事物的解释;或使用深度学习重要特征,或 DeepLIFT,一种用于识别神经网络中的哪些输入在使用反向传播预测某个输出时最重要的方法);算法可解释性(使用逐层相关性传播,LRP 或类似);以及算法去偏置(例如,通过使用模型对抗去偏置、变分自动编码器,或者通过训练数据的动态上采样,或者分布鲁棒优化)。单独实施技术措施来建立道德人工智能是有限的,因为社会偏见更加深刻和系统化——因此需要与政策、人员和法规紧密结合。
政策
拥有通过设计倡导算法公平的政策(拥有问责制、透明度和责任)是实现人工智能伦理原则的一个重要里程碑。问责制意味着证明一个人的设计决策的能力——这将需要在人工智能系统的操作背景下更深入地钻研道德价值观和社会规范——并需要涵盖指导功能(我们选择这样做,而不是那样)和解释功能(这是我们为什么这样设计系统)。问责制是对组织内的其他人、外部机构(监管机构)或受人工智能系统影响的个人(或团体)负责。创建一个透明的人工智能系统意味着能够描述这些系统做什么,复制它,并解释它们如何做出决策和适应它们的环境,并展示它们使用或创建的数据治理机制。责任意味着能够为组成人工智能系统的设计决策指定一个人类所有者(或一组人类所有者)。
人
了解设计决策的制定者和受这些决策影响的人非常重要,了解他们的能力和局限性也很重要。构建人工智能系统的团队需要仔细挑选——确保这些团队是多样化的,并且对人工智能解决方案所针对的问题有良好的接触,这一点很重要。当构建一个人工智能系统时,人们的偏好、偏见和历史偏见应该被讨论并至少被仔细承认,如果不能避免的话(因为有时避免这些既不可行也不合适)。在发展的同时,应该进行公平透明的协商,征求所有利益攸关方的意见。需要授权参与端到端流程的人员提供充分的监督,并且应该仔细研究对所有相关利益方的影响和益处。
监管
法规无法阻止人工智能实施中的错误——这些错误将不可避免地发生。然而,他们可以要求一个审计过程来发现这些错误,并通过处罚或禁止来帮助纠正这些错误。监管必须在适当的焦点水平上执行——太宽泛的话,你就有成为极权主义者的风险。强制开发人员遵循软件工程中的最佳实践——记录责任意味着我们将需要在检查这些最佳实践方面具有专业知识的监管机构。人权应该被视为道德人工智能系统的核心——这些机构应该能够提供保护,防止非法歧视、不公平做法、失去自由、增加监控、刻板印象强化、要人伤害和社会污名化等。如果治理是由再分配定义的,我们需要治理人类对技术的应用。

人工智能伦理警告需要转化为一个强大的监管框架[图片来自 Pexels 的 Fernando Arcos
在过去的几十年里,许多工作场所已经意识到他们招聘系统中的偏见。他们已经采取了系统的措施来最大限度地减少这些偏见——在内部建立员工的招聘意识,使用经过验证的评估,标准化面试流程,优先考虑多样性和包容性,改变广告渠道和外联。除了同质的工作场所比多样化的工作场所效率低这一事实之外,雇佣歧视还有严重的法律后果。在美国,1964 年民权法案第七章和相关法律保护免受年龄、性/性别、性取向、种族、宗教、残疾、怀孕(或其他病史)和基因歧视。同样,在欧盟,《就业平等框架指令》和《种族平等指令》为维持公平公正的招聘程序提供了法律支持。结构是存在的,我们不需要从头开始。
问题是——如果招聘是使用人工智能系统自动化的,偏见(以及歧视行为)会变得更难检测吗?招聘算法是由人类设计、开发、训练、测试和部署的——如果歧视被确定,我们需要追究建立、拥有和操作这个系统的人的责任,而不是把我们的手扔到空中,声称“是人工智能干的”。还有一个相反的论点——机器学习算法将会进化——现在适用于一套人工智能系统的一套去偏置工具将会随着新的算法集的进化而迅速过时。今天的算法还处于起步阶段。随着算法越来越多地模仿人类水平的思维,我们转移到这些算法上的固有偏见也将变得更加复杂,反映出当前现有的社会偏见。
通过我们的监管流程,我们可以强制要求审计流程承认并避免这些偏见。然而,我认为我们必须超越偏见。算法是有偏差的,因为人是有偏差的——偏差不是 AI 的特殊特征,而是人性固有的一部分。当我们将我们的知识转移到人工智能系统上时,我们也将我们的偏好和刻板印象转移到它身上。这些偏好和刻板印象反映在我们的社会结构中,其中一些我们认识到需要改变,因此集体同意改变它们。规范、政策和法律是谈判的产物,是这种变化的工具——它们清楚地表明什么行为被认为是不好的,以及实施这些行为的后果。这些规范、政策和法律需要适用于设计人工智能系统的人类,就像它们适用于设计药物的人类一样。即使是作为法律实体的公司也是人类意图的延伸,它们的行为可以(也确实)与其人类代表联系在一起。创建一个人工智能系统需要人类来设计这些系统。这些设计决策可以被文档化,进而可以被审计。这种设计和意图的标准是可以设定和执行的。所有人类活动都发生在某种监管框架的背景下;因此,大多数人工智能系统已经受到监管,因为绝大多数人工智能已经并将可能继续由商业驱动。
在我开始提到的八个主题中,人类价值的提升对人工智能伦理的影响最小。将这一点带入中心舞台可以打破平衡,有利于一个伦理驱动的人工智能采用时代。
2020 年数据网站和投资组合的状态(以及如何制作)

卢克·皮特斯拍摄于 Unsplash
拥有一个可视化产品、网站或仪表板来展示你在编码/机器学习项目上的艰苦努力是一件真正壮观的事情!然而,这通常非常困难,因为通常需要大量的工具和技术。不过不要紧张,我们将讨论和比较两个框架 (Dash 和 Streamlit),这使得创建令人印象深刻的投资组合(没有陡峭的学习曲线)!
你刚刚创建了一个机器学习模型。花了很长时间,但终于完成了,你想享受一下你的胜利。你应该休息一下…但是聪明的老尤知道建立一个纪念碑来展示你的工作的重要性。
你采取自然下一步,查找如何建立一个网站。他们从像 Flask 和 Django 这样的 Python 框架开始,然后继续到 JavaScript,不久你就会陷入考虑使用哪个前端框架,以及如何解析 Python 后端(模型)和 JavaScript 前端(实际网站)之间的数据。哦,天啊…这是一个又长又黑的兔子洞,很难穿过。但是突然,你听说有一个简单网站的简单解决方案。你查找这个新的 shinny 框架(Streamlit),它确实很容易😊并且使用快捷。不久你就会忘记所有的烦恼和不安全感!但是你突然意识到 Streamlit 的问题…它只适用于简单的 Jupyter 笔记本-esk 网站。对你来说,一切都在网络开发列车上。请求和 JavaScript,你来了😰。
虽然不一定非得这样,但你可以找到中间立场。一些简单到可以在几天内理解的东西,但也足够复杂…嗯,几乎任何东西都可以🤓!欢迎来到 Dash。您仍然需要了解一些 web 基础知识(HTML 和 CSS),但至少您的开发之旅有一条清晰的前进道路。即使感觉有点笨拙,它也能很好地完成工作!
整个过程可以归结为三个决定:
- 你想在页面上看到什么(文本、图表、表格、图像等)
- 如何排列和样式化页面(使用 CSS)
- 您希望用户如何与页面交互
不再有 JavaScript、HTTP 请求,甚至不再有多个独立的前端和后端框架!
开始使用 Dash
要开始,请确保您安装了 Dash。对于普通 Python 使用pip install dash,对于 Anaconda 使用conda install -c conda-forge dash。接下来,创建一个新的 Python 文件并导入相关的库:
import dash
import dash_core_components as dcc
import dash_html_components as html
如果你试着运行这个应用程序,你会注意到一件事——没有任何反应。这是因为我们实际上必须创建一个 Dash 应用程序对象,并告诉它启动。
app = dash.Dash(__name__, external_stylesheets=["https://codepen.io/chriddyp/pen/bWLwgP.css"])
app.title = "Allocate++"
if __name__ == "__main__":
app.run_server(debug=True)
我们可以包含一个样式表(使用external_stylesheets的 CSS)并设置我们网站的标题(app.title),让事情看起来更好。检查__name__ == "__main__"只是确保网站只在直接启动时启动(而不是在另一个文件中导入)。
如果我们尝试运行这段代码,在终端中我们会得到如下消息:
Running on http://127.0.0.1:8050/
Debugger PIN: 409-929-250
* Serving Flask app "Main" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
Running on http://127.0.0.1:8050/
Debugger PIN: 791-028-264
它表示您的应用程序已经启动,可以使用 URL http://127.0.0.1:8050/找到。虽然它目前只是一个空白页(真实的花哨的),但它确实表明一切都运行良好。
一旦你准备好继续,试着添加一个标题:
app.layout = html.H1(children="Fancy-Schmancy Website")
保存文件后,该网站应该会自动重新加载。如果它没有重新加载,或者屏幕上有弹出窗口,你可能在源代码中有一个错误。更多信息请查看实际的终端/调试器。
现在你已经熟悉了如何获得一个基本的网站,让我们继续把你的概念转换成代码。它从所谓的布局开始,布局由组件组成。Dash 提供核心(dash_core_components)和 HTML ( dash_html_components)组件。您总是从使用 HTML 元素开始,因为它们为文本和组合组件提供了基本的构建块,然后才是核心组件。核心组件提供更多的交互性(图形、表格、复选框...).现在很自然地会问,如何设计网页的样式。简而言之,您可以使用 CSS(层叠样式表)来实现这一点。Dash 本身提供了对核心组件的具体概述,可信的 Mozilla 有令人惊叹的 HTML 和 CSS 介绍。如何使用这些元素的几个例子是这里的。
任何 Dash 应用程序的最后一部分都是使其具有响应性。获取你点击的按钮、你输入的文本和你上传的图片…做点什么吧!这是事情通常会变得困难的地方,但这里真的还不算太糟糕。使用 Dash,您需要定义的只是一个接收和控制特定元素属性的函数。属性以“@”符号开始。
@app.callback(
[dash.dependencies.Output("output element id", "property to set value of")],
[dash.dependencies.Input("input element id", "input property")]
)
def update_output(value):
return value
我们可以通过向这些列表中添加更多的Input和Output对象来为多个元素做这件事!不过这里要注意一件事——更多的Input对象意味着函数需要更多的输入,更多的Output对象意味着要返回更多的值(听起来很明显,但是很容易忘记)。另外,请注意,您不应该在这些函数中修改全局变量(出于技术原因,这是一种反模式)。关于这些回调提供了进一步的文档。
前进和 JavaScript
这就是你开始创建一个交互式的令人印象深刻的 web 应用程序所需要知道的一切!创建一个可能仍然很困难,但是关于 Steamlit 和 Dash 的官方文档和教程是惊人的。也有使用 Dash 和 Streamlit 的示例应用程序的酷图库(这样你就可以学习其他人的例子)。
当然,JavaScript 也有用例。其实你可以用 JavaScript/React 和 D3.js 为 Dash 搭建插件。见鬼,如果你已经熟悉了网络技术,那么使用它们可能会更容易。然而,使用 JavaScript 不再是建立网站的 100%必要了(它更像是可选的)。了解 web 技术可能是有用的,但是如果你的目标不是成为一个全栈 web 开发人员,你不需要成为一个专家来制作一个华而不实的作品集🥳!
希望这对你有所帮助!Dash 帮我在一天内组装了我的第一个仪表盘。如果你做了一个很酷的网站、应用程序或作品集,一定要发表评论并告诉我。可以随意查看我的其他帖子——一些亮点是实用编码工具、 web 报废和机器学习(与实用项目)。你可以关注我的时事通讯和推特获取更新😉。





浙公网安备 33010602011771号