TowardsDataScience 博客中文翻译 2020(二百三十六)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

机器学习中回归的代价函数及其优化技术

原文:https://towardsdatascience.com/cost-functions-of-regression-and-its-optimization-techniques-in-machine-learning-2f5931cd33f1?source=collection_archive---------13-----------------------

深入探讨回归的成本函数及其优化技术:Python 中的漫游

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

亚历山大·密尔斯在 Unsplash 上拍摄的照片

价值函数

成本函数用于衡量机器学习模型的性能。缺乏成本函数的机器学习模型是无用的。成本函数有助于分析机器学习模型的性能。成本函数基本上将预测值与实际值进行比较。成本函数的适当选择有助于模型的可信度和可靠性。

损失函数与成本函数

  • 定义在单个数据实例上的函数称为损失函数。

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

回归的绝对损失

  • 在整个数据实例上定义的函数称为成本函数。

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

回归的平均绝对误差

回归的成本函数

回归任务处理连续数据。可用于回归的成本函数有:

  • 绝对平均误差
  • 均方误差
  • 均方根误差
  • 均方根对数误差

绝对平均误差

平均绝对误差(MAE) 是实际值和预测值之间的平均绝对差值。

  • MAE 对异常值更稳健。对异常值不敏感是因为它不会惩罚由异常值引起的高误差。
  • MAE 的缺点是它在零点不可微,并且许多损失函数优化算法涉及微分以找到参数的最佳值。

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

均方误差

均方差(MSE) 是实际值和预测值之间的均方差。MSE 通过平方误差来惩罚由异常值引起的高误差。优化算法受益于惩罚,因为它有助于找到参数的最佳值。

  • MSE 的缺点是对异常值非常敏感。当高误差(由目标中的异常值引起)被平方时,它甚至变成更大的误差。
  • MSE 可用于不希望出现高误差的情况。

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

均方根误差

均方根误差(RMSE) 是实际值和预测值之差的均方根。RMSE 可以用在我们想要惩罚高错误的情况下,但没有 MSE 那么多。

  • RMSE 对异常值也非常敏感。RMSE 中的平方根确保误差项被罚,但不像 MSE 那么多。

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

均方根对数误差

均方根对数误差(RMSLE) 非常类似于 RMSE,但是在计算实际值和预测值之间的差异之前应用对数。大误差和小误差被同等对待。RMSLE 可用于目标未被标准化或缩放的情况。

  • 与 RMSE 相比,RMSLE 对异常值不太敏感。它减轻了由于日志的存在而导致的高错误的惩罚。

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

成本函数优化算法

成本函数优化算法试图通过找到成本函数的全局最小值来找到模型参数的最优值。可用的各种算法有,

  • 梯度下降
  • RMS Prop
  • 圣经》和《古兰经》传统中)亚当(人类第一人的名字

加载预处理的数据

你输入给人工神经网络的数据必须经过彻底的预处理,以产生可靠的结果。训练数据已经过预处理。所涉及的预处理步骤是,

  • 老鼠归罪
  • 对数变换
  • 平方根变换
  • 顺序编码
  • 目标编码
  • z 分数标准化

有关上述步骤的详细实现,请参考我的 Kaggle 笔记本上的数据预处理。笔记本链接

用人工神经网络训练模型

更多细节请参考我的 Kaggle 笔记本上关于 Tensorflow 中的 ANN 的介绍。

梯度下降

梯度下降算法利用成本函数的梯度来寻找参数的最佳值。梯度下降是一种迭代算法。它试图找到一个全局最小值。

在每次迭代测试中,

  • 找到数据的成本。
  • 计算成本函数相对于权重和偏差的偏导数。
  • 然后通过利用成本函数和学习率𝛼.的梯度来更新权重和偏差𝛼的值可以从 0.0 到 1.0。𝛼的值越大,找到成本函数的全局最小值所采取的步骤就越多。
  • 继续上述步骤,直到完成指定次数的迭代或达到全局最小值。

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

均方根误差

RMS Prop 是一种非常类似于梯度下降的优化算法,但是梯度被平滑和平方,然后被更新以很快获得成本函数的全局最小值。

在每次迭代测试中,

  • 找到数据的成本。
  • 计算成本函数相对于权重和偏差的偏导数。
  • 权重和偏差参数被平滑,然后通过利用成本函数和𝛼(学习率)的梯度来更新。
  • 继续上述步骤,直到完成指定次数的迭代或达到全局最小值。

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

Adam(自适应矩估计)

Adam(自适应矩估计)是通过将梯度下降与动量和 RMS Prop 相结合而出现的算法。

在每次迭代测试中,

  • 找到数据的成本。
  • 计算成本函数相对于权重和偏差的偏导数。
  • 使用 RMS Prop 和带动量的梯度下降中使用的技术来平滑权重和偏差,然后通过利用成本函数和𝛼(学习率)的梯度来更新权重和偏差。
  • 继续上述步骤,直到完成指定次数的迭代或达到全局最小值。

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

摘要

  • 平均绝对误差对异常值是稳健的,而均方误差对异常值是敏感的
  • 梯度下降算法试图找到参数的最佳值,从而找到成本函数的全局最小值。
  • RMS Prop 和 Adam 等算法可被视为梯度下降算法的变体。

在我的 Kaggle 笔记本里找到这个帖子:https://www . ka ggle . com/srivignesh/cost-functions-of-regression-its-optimizations

参考文献:

[1]吴恩达,深度学习专精

LinkedInTwitter上联系我!

快乐的机器学习!

谢谢你!

营销活动的成本预测(数据清理和特征选择——第二部分)

原文:https://towardsdatascience.com/costs-prediction-of-a-marketing-campaign-data-cleaning-feature-selection-part-ii-6aa5298909b5?source=collection_archive---------35-----------------------

预测营销活动最佳目标候选人的数据科学方法

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

数据清理和特征选择—gon alo GUI mares Gomes

在第一篇文章中,我进行了探索性的数据分析,这让我们可以看得更远,超越最初的数据集。

EDA 可能是一项非常耗时的任务,很少是一次性走完的,尽管我们可能会发现自己经常回到早期部分更改和尝试一些不同的方法,但详细的分析通常会有所帮助,并为我们提供大量有关数据和变量行为的信息。

本文只关注第二部分,即清洁&功能选择

你可以在这里熟悉 EDA 部分
你可以在这里
找到这个项目的代码。
可点击
此处下载“bank_marketing_campaign.csv”数据集。

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

布拉登·科拉姆Unsplash 上拍摄的照片

数字特征之间的相关性

在降维的背景下,特征和目标变量之间的相关性分析被证明是双变量数据分析中的基本步骤,因为它帮助我们计算特征的重要性。

让我们从指出皮尔逊和斯皮尔曼的相关系数概念开始。

根据定义,皮尔逊相关系数,通常被称为皮尔逊相关系数r,是描述两个随机变量线性相关的程度,它们的统计关系有多强,在哪个方向发生,在二元数据中是否偶然。

值的范围从-1.0 到 1.0,其中第一个值表示总的负线性相关,而第二个值表示相反的线性相关。值为 0.0 表明没有线性关系。

另一个重要的推论是,皮尔逊相关性只能评估连续变量之间的线性关系,这意味着一个变量的变化意味着另一个变量以恒定的速率成比例地变化,否则它就是非线性关系。仅当变量呈正态分布时,才建议使用这种参数测试。

其中一个输出是相关性的 p 值,粗略显示了不相关系统产生某一数量级相关值的概率。低 p 值(通常≤0.05)告诉我们,相关性很可能是显著的。具体来说,p 值将揭示特征的预测能力。

# Most correlated against the target (Pearson method)
pearson = df_num.corr()
corr_target = pearson.target
display(corr_target.sort_values(ascending=False))

print("Ordered by rank in absolute values")
display(corr_target.abs().sort_values(ascending=False))

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

“Nr_employed”与目标最相关,其次是“pdays”、“euribor3m”和“emp_avr_rate”,同时,它们与目标的关系强度较低。下表让我们得出结论,所有特征都具有预测能力。

# Subdivision of target
ynum = df_num.target
Xnum = df_num.drop(["target"], axis= "columns")# Identifying variables with predictive power (Pearson p-value)
pd.DataFrame(
    [scipy.stats.pearsonr(Xnum[col], ynum) for col in Xnum.columns],
    columns=["Pearson Corr.", "p-value"],
    index=Xnum.columns,
).round(2).T

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

所有变量都有预测能力。

另一方面,斯皮尔曼相关系数,或斯皮尔曼相关系数,是一种秩序相关性的非参数度量,用于评估两个连续或有序变量之间的单调关系。

当出现以下情况之一时,出现单调关系:

当一个变量的值增加时,其他变量的值也会增加

b) 当一个变量的值增加时,其他变量的值就会减少

但是

a)+b) 不是以恒定的速率。

这意味着所有线性变量的关系同时是单调的,但反过来并不总是正确的,因为我们可以同时具有单调的非线性相关性。

# Numeric variables with higher monotonicity (spearman)
df_spearman = df_num.copy()
df_spearman.drop(["target"], axis=1, inplace=True)spearman_rank = pg.pairwise_corr(df_spearman, method='spearman').loc[:,['X','Y','r']]
pos = spearman_rank.sort_values(kind="quicksort", by=['r'], ascending=False).iloc[:5,:]
neg = spearman_rank.sort_values(kind="quicksort", by=['r'], ascending=False).iloc[-5:,:]
con = pd.concat([pos,neg], axis=0)
display(con.reset_index(drop=True))mask = np.triu(df_spearman.corr(method='spearman'), 1)
plt.figure(figsize=(19, 9))
sns.heatmap(df_spearman.corr(method='spearman'), annot=True, vmax=1, vmin=-1, square=True, cmap='BrBG', mask=mask);

10 个最相关的数字对,Spearman 方法:

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

“nr_employed”与目标最相关。变量‘EMP _ var _ rate’,‘NR _ employed’和‘euribor 3m’非常多余,但我相信这并不代表什么大问题。**策略:**暂时保留所有特性。

分类变量

当我们想要检查两个分类变量之间是否存在关系时,使用卡方独立性检验(此外,我们正在处理一个二元分类问题,卡方检验非常适合在这里执行)。

首先,我将指定零假设和替代假设来运行测试。

替代假设总是我们试图证明的,而无效假设是我们试图证明证据反对的假设。

  • (零假设) H0:特征和目标是独立的
  • (替代假设) Ha:特征和目标不是独立的

因此,对于被认为相关的特征,我们希望拒绝具有最低 p 值(p 值≤0.05)的 H0 (零假设)。

# Create categoric subset in order to see correlations results
Xcat = df_cat.select_dtypes(exclude=['int64','float64']).copy()
ycat = df.target# Study chi² for independence:
chi2 = []
p_val = []
for feature in cat_features:
    table = pd.crosstab(df_cat[feature], ycat)
    chi2.append(round(chi2_contingency(table)[0], 2))
    p_val.append(round(chi2_contingency(table)[1], 2))pd.DataFrame([chi2,p_val], columns = cat_features, index = ['chi2', 'p_value'])

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

**策略:**去除变量‘住房’和‘贷款’(p 值≥ 0.05)。

离群值、缺失值、异常和转换

数字特征

# Removing Target and creating a copy of the dataset
df_drop = df_num.drop(["target"], axis=1).copy()# Visualization of numerical data dispersion (boxplots)
fig, axs = plt.subplots(ncols=2, nrows=4, figsize=(16, 8))
index = 0
axs = axs.flatten()
for k,v in df_drop.items():
    sns.boxplot(y=k, data=df_drop, ax=axs[index], orient="h")
    index += 1
plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=5.0)display(df_drop.describe().loc[["mean","50%","std"]])
print(f"Any missing values: {df_drop.isnull().values.any()}")
print("")

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

所使用的技术确定了位于中位数的+1.5 IQR 和-1.5 IQR 的值,这是一种非参数方法,可用于我们发现的分布轮廓。

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

来源:https://upload . wikimedia . org/Wikipedia/commons/1/1a/box plot _ vs _ pdf . SVG

for column in df_drop.columns:
    median = df_drop[column].quantile()
    iqr_1_5 = (df_drop[column].quantile(q = 0.75) - df_drop[column].quantile(q = 0.25)) * 1.5
    outliers = df_drop[(df_drop[column]< median - iqr_1_5) | (df_drop[column] > median + iqr_1_5)][column].count()
    outliers_pct = round(outliers / df_drop[column].count() * 100, 1)
    print("'{}' = {} ({}%) outliers".format(column, outliers, outliers_pct))

输出:
‘age’ = 910 (2.2%)异常值
‘pdays’ = 1515 (3.7%)异常值
‘previous’ = 5625 (13.7%)异常值
‘emp_var_rate’ = 0 (0.0%)异常值
‘cons_price_idx’ = 770 (1.9%)异常值
‘cons_conf_idx’ = 1841 (4.5%)异常值
’ EUR

# Displaying visuals
fig, ax  = plt.subplots(figsize = (18,10))
ax.axis("off")
v = 1
for column in df_drop.columns:
    ax1 = fig.add_subplot(2,4,v)
    plt.hist(df_drop[column])
    ax1.set_title(column)
    v+=1
    median = df_drop[column].quantile()
    iqr_1_5 = (df_drop[column].quantile(q = 0.75) - df_drop[column].quantile(q = 0.25)) * 1.5
    outliers = df_drop[(df_drop[column]< median - iqr_1_5) | (df_drop[column] > median + iqr_1_5)][column].count()
    ax1.axvline(median - iqr_1_5, color='red', linewidth=2)
    ax1.axvline(median + iqr_1_5, color='red', linewidth=2)plt.show()

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

我意识到用于识别异常值的方法选择了许多记录,最严重的情况是前一列中有将近 14%的被选数据。

据我所知,我决定保留所有类别的大部分记录,因为数据似乎已经被正确地测量并反映了现实。

为了强调模型不受异常值数量扩展的影响,我们将只保证我们将使用标准化技术,该技术不会忽略中心值之间距离的细节。

从数值数据的离差分析来看,似乎没有异常值。“年龄”的绘制数据具有正常的行为,我假设变量“pdays”中的极端数据点是“超出范围”的值,至于其他的,每个变量似乎都有一个平衡的主体。

关于缺失值和其他异常,我已经分析了所有数值变量的唯一值和各自的计数,并且似乎没有缺失值

分类变量

继续讨论分类变量,检查是否有任何缺失值或其他需要处理的异常,以便通过各种技术将这些变量转换为数字特征,并根据降维和信息增益之间的最佳平衡进行逐案分析。

# Creating a copy
df_cat_t = df_cat.copy()df_cat.describe() # Describing the categorical dataframe

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

变量:‘作业’

print(f"Unique values: {df_cat.job.nunique()}")# Observations by class
num_obs = df_cat.job.value_counts()
num_o = pd.DataFrame(num_obs)
num_o.rename(columns={"job":"Freq abs"}, inplace=True)
num_o_pc = (df_cat.job.value_counts(normalize=True) * 100).round(decimals=2)
num_obs_pc = pd.DataFrame(num_o_pc)
num_obs_pc.rename(columns={"job":"percent %"}, inplace=True)
n_obs = pd.concat([num_o,num_obs_pc], axis=1)
display(n_obs)

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

在这种情况下,“未知”是我们缺少的值。这里的策略是用最常见的值——模态值来估算“未知数”。我们先把它转换成 np.nan,然后进行插补。

# Replacing 'unknown' by NaN
df_cat_t.job.replace(to_replace="unknown", value=np.nan, inplace=True)# Imputation missing values by the modal value
df_cat_t['job'] = df_cat_t.job.fillna(df_cat_t.job.value_counts().index[0])# Confirming and visualizing of "job"
df_cat_t.job.value_counts(dropna=False).plot(kind='pie', figsize=(10,6), explode=(0.02, 0.02, 0.02, 0.02, 
                 0.02, 0.02, 0.02, 0.02,
                 0.02, 0.02, 0.02));print(f"Unique values: {df_cat_t.job.nunique()}")

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

我还将显示在编码过程中,一个热编码和二进制编码会创建多少额外列的结果。

# Encoding 'job' OHE or BIN
df_job = df_cat_t.job
job_ohe = pd.get_dummies(df_job)
binary_encoder_job = BinaryEncoder()
job_bin = binary_encoder_job.fit_transform(df_job)print(f'''
*Results*
job OHE: {job_ohe.shape[1]} columns
job BIN: {job_bin.shape[1]} columns''')>> output:
*Results*
job OHE: 11 columns
job BIN: 5 columns <--- apply

此处要应用的二进制编码。虽然与 OHE 相比有一些信息损失,但就降维而言,这是一个更好的权衡。

# Removing attribute 'job' and concatenation job_bin to df_cat_t
df_cat_t.drop(["job"],axis=1,inplace=True)
df_cat_t = pd.concat([df_cat_t,job_bin],axis=1)
display(df_cat_t.head(2))
display(df_cat_t.shape)

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

变量:《婚姻大事》

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

“未知”被解释为缺少值。这与“工作”变量的情况相同。策略是用最常见的值来估算缺失值。

# Replacing 'unknown' by NaN
df_cat_t.marital.replace(to_replace="unknown", value=np.nan, inplace=True)# Imputation of missing values by modal value
df_cat_t['marital'] = df_cat_t.marital.fillna(df_cat_t.marital.value_counts().index[0])# Graph "pie"
df_cat_t['marital'].value_counts(dropna=False).plot(kind='pie', figsize=(10,6), explode = (0.02, 0.02, 0.02), autopct='%1.1f%%', startangle=120);print(f"Unique values: {df_cat_t.marital.nunique()}")

同样,显示一个热编码和二进制编码将使用编码过程创建多少额外列的结果。

df_marital = df_cat_t.marital
marital_ohe = pd.get_dummies(df_marital)
binary_encoder_marital = BinaryEncoder()
marital_bin = binary_encoder_marital.fit_transform(df_marital)print(f'''
*Results*
marital OHE: {marital_ohe.shape[1]} columns
marital BIN: {marital_bin.shape[1]} columns''')>> Output:
*Results*
marital OHE: 3 columns <--- apply
marital BIN: 3 columns

此处应用一种热编码,因为与二进制编码相比,它保留了更多信息。

df_cat_t.drop(["marital"],axis=1,inplace=True)
df_cat_t = pd.concat([df_cat_t,marital_ohe],axis=1)
display(df_cat_t.head(2))
display(df_cat_t.shape)

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

变量:“教育”

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

我们看的是同样的情况,其中“未知”被解释为缺少值。采用的策略是按最频繁值进行估算。

# Replacing 'unknown' by NaN
df_cat_t.education.replace(to_replace="unknown", value=np.nan, inplace=True)# Imputation of missing values by modal value
df_cat_t['education'] = df_cat_t.education.fillna(df_cat_t.education.value_counts().index[0])# Graph "pie"
df_cat_t['education'].value_counts(dropna=False).plot(kind='pie', figsize=(10,6), explode = (0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01), autopct='%1.1f%%', startangle=0);print(f"Unique values: {df_cat_t.education.nunique()}")

教育’ '有 8 个服从特定顺序的类,这意味着它将根据相同的等级进行编码。升序为:‘文盲’,'基础. 4y ‘,’ nasic.6y ','基础. 9y ',‘高中’,‘专业.课程’,‘大学.学位’。

为此,我将应用一个地图功能。数据映射用于将一个序列中的一组特定值替换为另一组可能从一个函数、一个字典或一个序列中导出的值。

df_cat_t["education"] = df_cat_t.education.map({"university.degree":7, "professional.course":6, "high.school":5, "basic.9y":4, basic.6y":3, "basic.4y":2, "illiterate":1 })display(df_cat_t.education.value_counts())
display(df_cat_t.head(2))
display(df_cat_t.shape)>> output:
7    13899
5     9515
4     6045
6     5243
2     4176
3     2292
1       18

变量:“默认”

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

在这种情况下,“未知”值被解释为缺失值。“是”类是没有意义的,任何“未知”值的插补都可能严重损害所有结果。所以,还是去掉这个变量比较好。

df_cat_t.drop(["default"], axis=1, inplace=True)
display(df_cat_t.head(2))
display(df_cat_t.shape)

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

变量:“poutcome”

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

在这种情况下,“不存在”被解释为相关值。要遵循的策略是不对这个变量进行任何转换。

# Encoding 'poutcome' OHE
df_poutcome = df_cat_t.poutcome
poutcome_ohe = pd.get_dummies(df_poutcome)
binary_encoder_poutcome = BinaryEncoder()
poutcome_bin = binary_encoder_poutcome.fit_transform(df_poutcome)print(f'''
*Results*
poutcome OHE: {poutcome_ohe.shape[1]} columns
poutcome BIN: {poutcome_bin.shape[1]} columns''')>> Output:
*Results*
poutcome OHE: 3 columns <--- Apply
poutcome BIN: 3 columns# Remove 'poutcome' and concatenation poutcome_ohedf_cat_t.drop(["poutcome"],axis=1,inplace=True)
df_cat_t = pd.concat([df_cat_t,poutcome_ohe],axis=1)
display(df_cat_t.head(2))
display(df_cat_t.shape)

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

# Analysis of the transformed dataset
display(df_cat_t.dtypes)
print("")
print(f"df_cat (original): ........ {df_cat.shape}")
print(f"df_cat_t (transformed): ... {df_cat_t.shape}")

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

# Concatenation of both numeric and categorical datasets
df_numcat = pd.concat([df_cat_t,df_num], axis=1)# Removing any NaN values
df_numcat.dropna(how="any", axis=0)

在这一阶段,在处理完所有缺失值和插补并将所有分类特征转化为数字特征后,让我们检查这些特征的相关性,确定并选择没有预测能力的变量。

# Subdivision of the target
y_numcat = df_numcat.target
X_numcat = df_numcat.drop(["target"], axis= "columns")# Identifying all variables with great predictive power (Pearson Correlation p-value)
dataframe = pd.DataFrame(
      [scipy.stats.pearsonr(X_numcat[col], y_numcat) for col in X_numcat.columns],
      columns=["Pearson Corr.", "p-value"],
      index=X_numcat.columns,
).round(2).sort_values(by="p-value", ascending=False)display(dataframe)

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

# Identifying columns in which p-value > 0.05
column = []
for item in dataframe.index:
    if dataframe['p-value'][item] >= 0.05:
        column.append(item)# Removing statistically non significant columns
df_numcat.drop(column, axis=1, inplace=True)df_numcat

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

就这样。我们已经准备好进行第三部分,也是最后一部分,肯定是我们项目中最激动人心的阶段,建模部分。在那里见。感谢阅读!

[## 机器学习:营销活动的成本预测(探索性数据分析——第一部分)

预测营销活动最佳目标候选人的数据科学方法

towardsdatascience.com](/machine-learning-costs-prediction-of-a-marketing-campaign-exploratory-data-analysis-part-i-758b8f0ff5d4) [## 熊猫变得容易(指南— I)

有许多最常用的函数和方法的例子

towardsdatascience.com](/pandas-made-easy-the-guide-i-81834f075893)

如果你想回顾这个项目的第一部分,EDA 部分,点击这里
你可以在这里找到这个项目的全部代码。

联系人

好的阅读,伟大的编码!

神经网络能预测特斯拉的巨大增长吗?

原文:https://towardsdatascience.com/could-a-neural-network-predict-teslas-enormous-growth-648b13d355f9?source=collection_archive---------40-----------------------

2020 年 1 月对埃隆·马斯克和他的公司来说是一个重要的月份。

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

来源: Unsplash

2020 年对特斯拉来说是意义非凡的一年。今年年初,特斯拉股票的价格为 430 美元,在撰写本文时,其当前价值为 **887 美元。**在 5 周的时间里,这是一个 106%的增长。🤯

编辑:从那以后就跌了。我将坚持使用这些数字,因为价格不可避免地会不断变化

投资者和华尔街分析师对这种巨大的增长感到困惑。有人说,这是因为股票正在经历卖空挤压,即当股票已经处于良好的反弹时,卖空者(卖出借来的股票并以更低的价格买回的人)被迫回购股票以弥补损失。这导致了有限供给下的过度需求,从而抬高了价格。

其他人说需求增加是因为 FOMO(害怕错过)。所有的投资者都想参与这次突然的上涨。或者这仅仅是因为特斯拉在过去的 6 个月里表现非常好,连续两个季度盈利,并以高于预期的速度开设工厂,并有望成为电动汽车电池行业的重要参与者。

不管惊人增长背后的推理是什么,我认为没有人能够预测到如此巨大的增长。尽管我的一些持有特斯拉股票的朋友坚持说他们从一开始就看到了这一点…

这就引出了一个问题,如果人类不能预测这种事件的发生,那么有没有什么系统能做到呢?答案是肯定的。

交易中的机器学习

证券交易是目前机器学习最大的应用之一。机器学习就是接受数据,从中得出结论和预测。在金融领域,数据随处可得,许多交易算法都严格依赖于数据处理。事实上,超过 70%的交易是由机器人进行的。

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

来源: Unsplash

具体来说,ML 在金融中的用途是从证券中获取历史数据,然后预测其价格在接下来的 x 时间内将如何变化。根据这一预测,你可以决定买入、卖出或持有该证券是否是一个好的决定。

有了这个,我试图创建一个机器学习模型,可以预测特斯拉令人着迷的 1 月份增长。

解释模型

我使用的模型将历史价格和交易量(当天交易的股票数量)作为输入。这样做的目的是看股票的走势是否有规律可循。

这种类型的分析在金融学中被称为技术分析,正式定义为“根据图表上的价格趋势和模式评估投资的学科。”技术分析师认为,对股票以往走势的洞察有助于预测其未来走势。

为了预测 1 月份的价格,我使用了 Telsa 从 IPO(早在 2010 年)到 2019 年 12 月的历史价格数据作为训练数据。该模型将使用这些数据点来找到模式,然后将它们应用到测试数据,即一月价格。我从 AlphaVantage 下载了 CSV 格式的数据,然后手动将数据分割成训练和测试 CSV 文件。

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

两个来自 AlphaVantage 的数据集。图片我的电脑截图

浏览代码

导入数据集后,构建模型的第一个重要步骤是 规范化 数据。标准化数据意味着调整值以适应一定的范围,在我们的例子中是 0 到 1。这使得模型可以更容易地学习非异常值。

图中表示的是一个试图通过减少模型损失来达到全局最小值的模型。使用统一的比例,模型更容易做到这一点。对于这个模型的正则化,我使用了 SkiKit Learn 的 MinMaxScaler。

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

我的主旨截图

LSTM 建筑

LSTM(长短期记忆网络)是这种模型中使用的神经网络类型。LSTM 模型是一种 RNN(递归神经网络),rnn 有一个过去的信息向量作为输入,称为隐藏状态,这有助于它稍后进行分类。LSTMs 非常擅长存储长期信息,而 rnn 会因为消失梯度问题而忘记这些信息。

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

关键理解:内存流经 LSTM,允许它通过 Colah 博客使用过去的信息图像

在本文中,我不会深入研究 RNNs 或 lstm 的技术深度,您只需理解一个关键概念,即 lstm 擅长存储长期相关性,这有利于股市预测。你可以在本文中了解更多关于 LSTMs 的信息。

LSTM 的时间戳数据结构

时间戳基本上就是股票在那个价格的日期。在我们的训练数据集中,我们有超过 2000 个时间戳(每天一个),每个时间戳都有开盘价、收盘价、最高价、最低价和交易量值。我们只关心开盘价和交易量。

我们的模型主要做的是查看过去 60 个时间戳(过去 60 天)的开盘价,并预测第二天的价格。

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

自我创造的形象

通过查看前 60 天,重复这个过程来预测第二天的产量。在代码中构造的方式是,X_train 是所有输入数组的数组,Y_train 是所有输出正确预测的数组(模型将根据其计算损失)。

我的主旨截图

建造 RNN

构建 RNN 变得很简单,因为我们使用了一个名为 Keras 的库,这是一个非常高级的 ML 框架。我们正在使用一个名为 Sequential 的 Keras 类,以及来自 Keras 的图层:LSTM、辍学和密集图层。

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

我的主旨截图

为了使用 Keras 方法,我们必须对输入数据(在时间戳步骤中创建的)进行整形,以满足 Keras 要求。我们使用 NumPy reshape 方法将 X_train 数组转换为 3D 数组。

然后,我们将输入数据传递到由 LSTM 层、漏失层和致密层组成的序列模型中。LSTMs 当然是试图在以前的数据中找到模式的主要层,丢弃层基本上丢弃 20%的神经元以防止过度拟合。最后的密集层产生只有一个节点的输出。

X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))regressor = Sequential()regressor.add(LSTM(units = 50, return_sequences = True, input_shape = (X_train.shape[1], 1)))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units = 50, return_sequences = True))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units = 50, return_sequences = True))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units = 50))
regressor.add(Dropout(0.2))
regressor.add(Dense(units = 1))

最后,使用 adam 优化器和损失函数的均方误差来编译和训练模型。我用 10 个时期运行该模型,并在训练数据上得到 0.04 的最终损失。

关键时刻…

既然已经对模型进行了训练,那么是时候在测试数据上测试模型了。LSTM 模型能预测特斯拉 1 月份的增长吗?

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

根据我的模型…不😂。

该模型无法非常准确地预测特斯拉股票的准确走势。这可能是因为它需要更多的历元来训练,或者对超参数进行其他调整。这是一次奇妙的学习经历,我学到了很多关于特征工程和 LSTM 网络的知识。

完整代码链接:【https://github.com/lewwwis/tslastockreplicate

嘿,你们好!👋我是亚伦,一个 15 岁的孩子,对人工智能和人类长寿之间的交叉有着超级的热情。请随时在Linkedin上与我联系,或者查看我的完整 作品集

人工智能能比政治家更好地管理经济吗?

原文:https://towardsdatascience.com/could-ai-manage-the-economy-better-than-politicians-6b37c6f68190?source=collection_archive---------53-----------------------

国会的工作支持率为 18%。算法的门槛很低

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

Salesforces 的 AI 经济学家

大多数明智的人会认为,电脑程序可以更好地完成我们选举出来的代表的工作是荒谬的。例如,对任何政府来说,管理经济及其所有运转部分都是一项艰巨的任务。平衡新政策的实施和保持稳定的掌舵手不是一件容易的事,即使有大批公务员随时准备给决策者提供备忘录和白皮书。

另一方面,就在几年前,计算机程序(人工智能)可以写诗的想法是荒谬的。现在,AI 可以写出好到足以愚弄有声望的法官认为这一定是人类写的诗。你可以将癌症诊断理论力学职业扑克添加到 AI 性能可以超越卑微的智人的令人惊讶的领域列表中。美国软件公司 Salesforce 的一项新举措旨在将“T8”经济政策添加到该列表中。

“人工智能经济学家”研究项目的负责人张(Stephen Zhang)表示,经济学家和政治家所依赖的典型经济模型正面临严峻挑战。为了能够进行可控的数学分析,模型依赖于假设。他们可能只会孤立地关注一个政策杠杆(比如,只关注商品及服务税,而不是所有税收),并努力应对像新冠肺炎那样的大规模冲击。最重要的是,经济模型依赖于被揭穿的人类是不知疲倦的理性行为者的观念。

张和 Salesforce 认为他们可以用人工智能解决这些问题。通过“强化学习框架”,Salesforce AI 可以制定有效的经济政策,而无需求助于任何经济模型或现有理论。人工智能通过模拟不同经济政策对一个经济体的影响并观察结果来做到这一点。人工智能的任务是实现不同的社会结果,并提出平衡这些目标的最佳经济方案。

“强化学习”指的是他们的人工智能在眨眼之间运行数百万次模拟的方式,每个实例都从上次模拟中“工作”的内容中学习。人工智能没有任何关于经济理论或政策的先验知识——它在观察了一个又一个模拟后,自己想出了要实施什么样的政策。你可以认为人工智能是从一张白纸开始的,它可以只关注结果,不受几十年来通常主导政策讨论的经济理论的阻碍。

人工智能经济学家的早期迭代是为一个称为“收集和构建”的场景而构建的。这个场景反映了一个简单的 2D 经济,不同的“代理人”收集资源,赚钱,建造房屋。人工智能可以按照工人喜欢的方式征税,也可以通过福利重新分配资金。人工智能的任务是最大化代理人的生产力,同时最小化不平等(代理人有不同的技能,改变行为,并倾向于赚不同的钱)。

在无数次模拟中,人工智能经济学家尝试了税收和福利的不同组合,以找到最佳平衡。就像在现实世界中,对代理商征税过多会降低他们的生产力,但不对他们征税意味着没有钱进行再分配。

强化学习阶段的结果令人印象深刻。在结论中,Salesforces 的 AI 计算出了能产生最高生产率和平等综合得分的精确税收和福利体系。

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

作为与人工智能经济学家的对比,研究科学家在更正统的经济政策体系下运行了这一场景。其中包括没有税收或再分配的自由市场体系、美国税收体系以及经济学家伊曼纽尔·塞兹(Emmanuel Saez)提出的广受欢迎的税收公式。这位人工智能经济学家,尽管在开始时没有税收理论或经济学方面的现有知识,但在最大化生产率和平等方面胜过了所有其他人。

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

尽管这是人工智能经济政策的一个令人鼓舞的开端,但简化的 2D 情景显然是对复杂混乱的实体经济的苍白模仿。当然,政府需要平衡的目标不仅仅是生产力和平等。然而,为人工智能经济学家提供动力的强化学习技术可以为更复杂的人工智能奠定基础,以管理现实世界的所有复杂性。Salesforce 乐观地认为它可以扩大他们有前途的工作。

考虑到人工智能在设计经济政策方面优于人类的根本潜力,提前思考对政治和政府可能产生的后果是值得的。虽然担心将经济决策权交给人工智能可能会导致民主遭到侵蚀是可以理解的,但情况未必如此。请记住,人工智能并不决定什么结果(生产力、平等等)是可取的,而是决定使用哪些经济杠杆来最好地实现这些目标。可以说,选民可能会被解放出来,专注于他们关心的事情(结果),而不是需要了解经济政策的细节。

作为这种后人工智能政治的一个例子,政党可以就他们将输入人工智能超级计算机的优先事项进行竞选。民主党人可能会说,他们会让人工智能承担平衡生产率和再分配的任务。共和党人可能会承诺给予人工智能自由,尽一切努力实现经济增长最大化。绿党会将环境保护置于 GDP 之上。诸如此类。无论哪个政党在选举中获胜,都可以向 AI 提供这些优先事项,AI 将据此制定未来三年的经济政策。

这是一个完全不同的政治图景,但至少我们会在经济问题上获得更透明的政治。目前,所有的政党都致力于实现一个“强大”、“公平”以及其他平淡无奇的经济。如果政党组建政府,他们甚至不一定会将自己的竞选立场转化为政策。拥有一个将它设定的社会目标转化为经济政策的人工智能,将迫使各方更清楚地知道他们愿意在优先事项方面做出什么样的取舍。

无论我们是否最终实现该国第二重要政治职位的自动化,人工智能都将在帮助政府制定政策方面发挥越来越重要的作用。凭借设计良好的人工智能的力量和规模,这一趋势应该受到欢迎,因为它是朝着更好的政府迈出的一步。然而,对人工智能的更大依赖确实引发了一些独特的问题。

首先,人工智能框架及其数据的完整性必须是神圣不可侵犯的。特别是如果国家的经济成果处于危险之中,人工智能将不得不受到保护,免受来自外部世界的黑客攻击和内部人士的干扰。与此相关,人工智能处理的数据必须不受目前困扰太多算法的偏见的影响。人工智能工程师往往是白人和富人,应该非常小心,以确保人工智能没有无意识地倾向于那些特权群体。现有的经济政策已经足够了。

最后,人工智能必须是“可解释的”——也就是说,特定的人工智能必须能够显示其政策建议背后的工作,以便专家可以交叉检查。这不是一个简单的技术壮举,因为高级人工智能的推理有时过于复杂,甚至连人工智能的创造者都难以理解。然而,将经济交给一个神秘而不透明的人工智能是一个反乌托邦的噩梦。

部分由于这些技术上的障碍,还没有政治家面临需要使用他们自己的失业计划的风险。但 Salesforces 的人工智能经济学家为人工智能政策设计开辟了一条道路。在吸收了政府掌握的所有大量数据后,一个今天可以用 2D GIF 概括其模拟的人工智能可能在十年后能够模拟整个经济。在那之前很久,“客观”和“最佳”治理的最高准则应该引发一些受欢迎的对话,讨论我们究竟从我们的代表那里寻求什么,以及他们通过的政策。

Nim 能代替 Python 吗?

原文:https://towardsdatascience.com/could-nim-replace-python-547145afcfd5?source=collection_archive---------0-----------------------

为什么这种羽翼未丰的计算机语言可能成为新的脚本之王

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

(src = http://nim-lang.org)

介绍

多年以来,没有一种编程语言比 Python 更适合编写脚本。Python 是 Guido Van Rossum 在 20 世纪 80 年代后期用 c 语言编写的一种解释型语言,Van Rossum 和其他许多著名的计算机科学家一样,来自荷兰,他在那里从 Centrum Wiskunde & Informatica 内部编写 Python,或者用粗略的英文翻译,

国家数学和计算机科学研究所

P ython 拥有当时计算机中流行的传统低级语言的巨大优势,如 C、FORTRAN、BASIC、C++和 Lisp。首先,Python 的语法简单得多,也容易掌握。这使得最终用户可以很好地使用 Python 来执行他们的系统所需的任务。此外,尽管以今天的标准来看,Python 被广泛认为是“慢”的,但在 1989 年,拥有一种读起来像英语的语言,甚至远不如其竞争对手的性能包装,这是一项相当了不起的成就。

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

(src = 堆栈溢出)

计算机编程语言

甚至在最近,

随着 Python 变得比 Java 和 Javascript 都更受欢迎,Python 和与其受欢迎程度相应的工作已经超过了“大男孩”。Python 的生态系统绝对是与众不同的,不仅是在一般的编程方面,而且在不断扩大的

机器学习

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

随着 Python 的流行,这种语言的缺陷和问题变得越来越普遍。虽然 Python 确实是一门伟大的语言,但它的速度,我之前提到的速度是它的

“致命弱点”

虽然这并不是说 Python 对于机器学习来说仍然不可行,但是从地球上最流行的统计语言进行改变肯定会带来一些性能上的好处。这也不一定是 Python 的错,因为这种语言被开发用于机器学习仅仅是因为它非常受欢迎。对于大多数应用程序,Python 工作得非常出色;但是,每当加载许多观察值时,这种情况通常会发生变化。出于这个原因,Scala 通常被选为在美国企业内部推动大数据的语言。Scala 也不是没有问题,尽管 Scala 确实拥有比其他两个竞争对手更好的生态系统,

r 和朱莉娅

介绍:尼姆

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

尽管 Nim 和 Python 有相似之处,但 Nim 比 Python 年轻得多,12 年前的 2008 年才被呈现出来。这给尼姆带来了一些显著的好处。首先,Nim 比 Python 更快,但仍由同一种语言 c 解释。尽管从技术上讲 Nim 是用解释器运行的,但应该注意的是,Nim 也有自己的编译器。也就是说,有许多很酷的特性使 Nim 成为 Python 的潜在替代者,这可能是你没有预料到的。

编译的可执行文件

Python 的一个常见主题是需要 Python 才能运行 Python,这包括应用程序的依赖性。这是有问题的,因为这意味着 Python 应用程序以这样或那样的方式被打包成具有所述依赖性的包。最重要的是,虚拟环境很可能会经常出现。虽然这并不可怕,并且承认大多数统计语言都是这样做的,但是 Nim 通过将可执行文件与运行所需的依赖项打包在一起,在这方面做得更好。这不仅使管理系统间的依赖关系变得轻而易举,还使部署变得容易

比 Py 容易(看到我在那里做了什么吗?)

这些编译后的可执行文件还可以通用地兼容 Unix 类系统、Linux、Mac 和 Berkley 软件发行版,以及 Windows NT 内核。编译后的可执行文件解决了依赖性问题,使得发布应用程序变得非常容易,甚至可以用一个简单的“.”来部署 API 或“源”命令。

普遍的

Nim 相对于 Python 有一个很大的优势,因为 Nim 不仅可以用 C 编译,还可以用 C++编译,更令人兴奋的是:

java 描述语言

这意味着 Nim 不仅有潜力担当 Python 作为运行基于数据的 web 后端的脚本语言的角色,而且 Nim 也可以作为类似于 Javascript 的前端。这是 Python 的一大优势。虽然 Python 当然非常适合部署端点,并且通常可以很好地完成工作,但是全面使用单一语言当然有它的优势!

特征

Nim 的代码库主要是基于函数范式构建的。这意味着 Nim 可以是一种非常有表现力的语言,而且可以轻松实现比 Python 更酷的特性。其中一个特性是我一直以来最喜欢的特性之一,早在 1958 年,随着 Lisp 的发布,

宏。

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

(我永远不会明白为什么这是 Lisp 的吉祥物,src = Common Lisp )

宏和元编程几乎和计算本身一样早就存在了,而且非常有用,尤其是在机器学习领域。

速度

众所周知,随着规模的扩大,对所有事情都使用 Python 会很成问题。这是因为许多训练算法利用递归成本或损失函数,该函数对于任何语言都是密集运行的。有很多语言和想法都试图对抗这一点,比如 Julia、Python 中的 Python(这本身就是一个兔子洞),还有更成功的:Cython。

然而,这些解决方案也带来了自身的问题。虽然事实上,Julia 是我最喜欢的语言,也可能是最有可能取代 Python 的语言,但它没有 Python 所标榜的生态系统。虽然有 PyCall.jl,但使用它时的性能通常会低于 Python,在这种情况下,

为什么不用 Python 呢?

Python 中的 Python 是一个有趣的概念,但还没有很好的实现,因为这个概念本身相当复杂。更糟糕的是,Python 中的 Python 比 Julia 或 Nim 这样的解决方案实现起来要困难得多。至于 Cython,与普遍的看法相反,Cython 并不普遍工作,依赖它可能不是一个好主意(去过那里,做过。)

Nim 的优势是比 Python 快。对于脚本来说,Nim 增加的速度肯定会改变系统维护和各种脚本的运行方式。使用 Nim 可能没有 Julia 或 C 那么快,但由于它与 Python 和 Bash 有着简单的相似性,它肯定会容易得多。

结论

尽管 Nim 确实是一种非常酷,甚至有用的语言,但我非常怀疑“Python 接管”即将到来。与 Python 相比,Nim 只是一个生态系统的一小部分,而且还需要做更多的工作来适应 Python,这使它在其他编程语言中处于一种边缘状态。尽管 Nim 的特性确实比 Python 的强,但很难与一个大家都知道如何使用的已建立的软件包库相提并论。

我认为尼姆的故事和朱莉娅的相似。Nim 是一种漂亮的语言,既富于表现力,又简单高效,但是如果没有一个稳定的后端,我认为 Nim 不太可能成为脚本领域的佼佼者,对我来说更重要的是:统计领域。但是所有这些并不是说 Nim 不是一种值得学习的语言。Nim 是一种超级酷、易用、快速的高级函数式编程语言。任何结合了所有这些词的东西都很可能对你的编程工具箱有益。

尽管尼姆可能不会成为世界上的下一个大人物,但我确实很享受和它在一起的时光。更令我兴奋的是 Julia 展现出的潜力,而不是 Nim,再多一点开发,我想我们肯定能提高 ML 的速度。在这方面,处理器的类比当然是合适的:在过去的几年里,没有 64 位注册表的处理器,没有时钟速度超过 1 GhZ 的处理器(以今天的标准来看,这完全是一个 slug。)未来是令人兴奋的,我简直迫不及待地想看看它将包括什么技术堆栈。

冥王星有可能真正取代木星吗?

原文:https://towardsdatascience.com/could-pluto-be-a-real-jupyter-replacement-6574bfb40cc6?source=collection_archive---------15-----------------------

意见

对 Pluto.jl 笔记本和其他 Julia 编程语言开发解决方案的简要概述和比较。

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

(图片由作者提供)

你是一个厌倦了 Jupyter Notebook 总是妨碍你编程的 Julia 开发者吗?

我没有。

尽管我总体上不需要新的笔记本系统,因为我甚至不经常使用我现有的系统,但由于一位朋友的推荐,我决定看看 Pluto.jl。Pluto.jl 是一个功能齐全的 web/markdown/code 笔记本,以一个简单的 Julia 包的形式出现。它拥有你可能从典型的 Jupyter 笔记本电脑中期待的所有优秀功能。有一段时间,我其实是用一个用 Scala 写的笔记本来写 Scala 的,它让我怀念 Jupyter,坦白说,它的替代品,

Spylon 内核

在 Scala 的数据分析坟墓上放一个新的墓碑。所有这些都是说,虽然我是朱莉娅的大力支持者,但我不确定这是否会改变我的想法——这个主题可能会变成一个问题,

为什么不用 Jupyter?

回答我的问题

尽管我会说我认为自己对此类事情持怀疑态度,但我当然愿意给 Pluto.jl 一个机会。首先,我想看看冥王星和木星之间的一些关键区别。如果使用冥王星有什么改进的话,那么它对我来说可能是一个更好的选择——因为我写了很多 Julia。

当然,我决定检查信息的第一个地方是 Pluto.jl Github README markdown 文件。就在这时,我意识到我对 Pluto.jl 的批评是完全没有根据的。这个笔记本实际上非常智能,它会不断地分析你写的代码。例如,如果我有一个州外代码,它还没有运行过我试图在其中使用的依赖项,那么 Pluto 将自动为我运行该代码。

此外,每当变量或函数发生变化时,Pluto 会自动运行与之相关的所有其他代码单元。这很方便,而且完全省去了转到笔记本顶部和垃圾邮件 shift+enter 活动。这是一个很大的节奏变化,也不用担心我的笔记本的可复制性。Julia 有很好的方法来管理包,因此大多数时间依赖性问题不会被其他程序员感觉到。除此之外,还有让代码运行内核状态的努力。

直接引用 Pluto.jl 自述文件,

在任何瞬间,程序状态完全由你看到的代码描述。

这是我的一个大问题。使用 JIT 会使情况变得更糟,当您不需要一直重启和运行所有单元时,JIT 会工作得更好。如果你想了解更多关于可重复研究和我在 Jupyter 遇到的基本问题,这里有两篇我写的关于这个主题的文章!:

[## 数据科学家可重复研究指南

你的假设还是假设!

towardsdatascience.com](/the-data-scientists-guide-to-reproducible-research-ea1a512be3e5) [## 笔记本——投资组合的杀手

为什么不应该将笔记本电脑作为数据科学投资组合的主要特征。

towardsdatascience.com](/jupyter-notebook-the-killer-of-portfolios-8fb70638491)

这对于分析来说非常酷的一个很好的例子是,我可以主动改变一个单元格中的数据,同时在另一个单元格中可视化它。仅仅改变 Jupyter 处理内核和状态的方式实际上是令人难以置信的令人耳目一新的。另一件很棒的事情是 Pluto.jl 解释器可以读取 Julia 代码——就像在真正的 Julia 代码中一样。没有。仅 ipynbs。jl 文件。这意味着在 Pluto 中开发的任何东西都可以在 Julia 的整个范围内使用,并且任何程序员都可以在任何会话中使用相同的代码非常容易地进行工作。

尝试一下

我想如果我要给 Pluto.jl 一个体面的尝试,我也可以用它投入到一个经典的数据科学项目中。对于我的技术堆栈,我将使用 DataFrames.jl 数据框架,牛虻. jl 用于可视化,而车床. jl 用于统计分析和机器学习——令人兴奋!当然,为了测试冥王星,我们需要首先添加它:

julia>]
pkg> add Pluto

添加 Pluto 后,可以使用 Pluto.run()函数运行它。

using Pluto;Pluto.run()

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

(图片由作者提供)

每当您第一次启动 Pluto 时,都会看到这个页面。我认为你必须在文本框中手动输入一个路径来打开一个笔记本有点乏味。进入这些笔记本的第一件事就是运行 pwd()来查看我在文件系统中的位置。

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

(图片由作者提供)

有趣的是,我在我的。Julia 目录位于~/。这是不幸的,因为我希望加载一些。CSV 数据输入。让我们看看当我们保存笔记本时,这种情况是否会发生变化。

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

(图片作者

好消息!

因此,在这个笔记本上,我有几个关于完成项目的主要问题。首先,每当我 ctrl+enter 时,它不会创建一个新的单元格。其次,stdout 在这些笔记本上不工作。我无论如何也不明白这是为什么,但你不能打印()或 println()。我跑题了,让我们实际上得到一些数据读入。我最近挑选的另一个很酷的包(Emmett 去购物了)是 PrettyTables.jl,所以希望我的数据框至少看起来不错。

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

(图片由作者提供)

这需要一些时间来适应。我确实喜欢笔记本的外观,当然也有一些方面我很喜欢,比如漂亮的输出。

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

(图片由作者提供)

我渴望得到一个分类问题,所以在这个小小的特性列表中,“Precip Type”分类确实吸引了我的注意。然而,就我所知,这个数据框架只能是雨天的分类。幸运的是,我们可以使用 Set 类型检查给定数组中唯一值的数量。

length(Set(df[Symbol("Precip Type")]))

返回 3。当然,对于一个分类问题来说,这是大量的类别,然而,其中一个类别碰巧是空的——这意味着我们可能应该清理这些数据,而不是将我们的手伸入机器学习饼干罐。幸运的是,“Summary”特性在这个包含大约 96,000 个观察值的数据集上有大约 27 个不同的分类。

Set(df[Symbol(“Summary”)])

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

(图片由作者提供)

在 Julia 语言中,检查缺失观测值的一个很好的方法是收集缺失观测值,并将其与数据帧的原始长度进行比较。

testmissings = collect(skipmissing(df[:Summary]))
length(testmissings)

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

(图片由作者提供)

好消息——是同一个号码!我不是天文学家或天气预报员,但如果要我猜的话,我会说这些描述很有可能与湿度有关。不过,为了确保万无一失,让我们过滤数据并进行测试。

老实说,这正是我对笔记本感到恼火的地方。很多事情都是我无法习惯的。很容易,最恼人的事情是我一次删除三个单元格,试图删除一些文本。在使用了这么长时间之后,我仍然没有找到如何添加 markdown。

我也最终迷失在如何修复我不小心改变了数据框的复制错误上。笔记本不允许我重新定义变量,这使得使用这些相对基础的代码变得非常乏味。尽管如此,我还是得到了一个模型拟合——它有 40%的准确率。在那之后,我想也许这些特征并不像我之前想的那样相关…无论如何,他们的统计测试并没有显示出很大的意义。

我对 Pluto 的另一大抱怨是文档浏览器,它甚至可能不存在,至少允许一个人运行常规的帮助功能。我认为这是一个伟大的想法,但是,也许只是需要一些熨平——可能一些 NLP 提示文本。

我跑题了,总的来说我是这个项目的粉丝,但肯定不会很快使用它。总的来说,我不是笔记本的忠实粉丝,但它们确实有它们的用途!如果我必须在 Pluto.jl 和 Jupyter 之间选择,我可能会选择 Jupyter 和 IJulia。然而,我希望这种情况在未来会有所改变。再加上这里和那里的一些东西,我确信这可能是一个有前途的开发环境。然而,在这一点上,我当然不能建议这样做…奇怪的是,这令人沮丧,而且坦率地说——感觉 IDE 对我的阻碍多于它对我的帮助。

希望以后 Pluto.jl 会更好。也有可能我不是目标观众,或者其他人可能比我更喜欢他们。虽然在引擎盖下确实有一些伟大的想法和真正非常酷的东西,但我有点兴奋地想看看未来会是什么样子。不过现在,我肯定会坚持使用 Atom 和 IJulia。

咨询聊天:引导高质量的治疗数据

原文:https://towardsdatascience.com/counsel-chat-bootstrapping-high-quality-therapy-data-971b419f33da?source=collection_archive---------13-----------------------

缺乏好的心理治疗数据。让我们继续努力。

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

照片由来自 PexelsPolina Zimmerman 拍摄

介绍

在过去的一年里,我一直在应用 NLP 来提高心理健康护理的质量。我发现在这个领域特别困难的一件事是缺乏高质量的数据。当然,你可以去搜索 Reddit,获得一些有趣的个人之间的治疗互动,但在作者看来,这是一个糟糕的替代客户和治疗师之间的实际互动。别误会,有数据集。他们只是,往往不是,专有或付费玩。

我希望这篇文章能介绍一组高质量的治疗师对真实病人的心理健康问题的回答。我将讨论数据源,关于数据集中有什么的基本信息,并展示一些简单的模型,我们可以使用这些数据训练聊天机器人!我和 counselchat.com没有关系,但是我认为他们做得很好,你应该去看看他们。这个项目的所有代码都可以在这里获得

关于 Medium 的一个不幸的事实是,它不允许你合著作品。这是一个与格林洛德博士的联合项目,他首先提出了这个项目,并帮助进行了所有的分析。此外,还得到了 CounselChat 联合创始人 Eric Strö和 Phil Lee 的帮助。Phil 是一位专注于创新机器学习和数据的连续创业者。埃里克是一名律师和有执照的心理健康顾问。

咨询聊天

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

Counselchat.com 登陆页面截图。

Counselchat.com 是专家社区的一个例子。这是一个平台,帮助辅导员建立自己的声誉,并与潜在客户进行有意义的接触。在这个网站上,治疗师回答客户提出的问题,用户可以喜欢他们认为最有帮助的回答。这是一个很好的想法,并提供了一些有趣的数据。

这个数据最酷的一点是,有经验证的治疗师发布了回答。不是每个回复都是优秀的,但是我们知道它来自领域专家。如果你使用 Reddit 数据,提供建议的人可以是任何人。这里我们知道提供建议的人是合格的顾问。相当整洁!重要的是要记住,与治疗师面对面的互动通常与我们在网上公开看到的非常不同。另外,这不是治疗师和病人之间的对话。它只涉及一次谈话机会。

数据

最初,我们从 www.counselchat.com 搜集数据。但是在联系 counselchat.com 的创始人进行评论后,他们为我们提供了这篇文章的所有数据!收集的数据和真实数据的数据转储在这里以 CSV 的形式提供。特别感谢 Philip 和 Eric,他们非常友好,愿意与社区分享他们的成果。所有的分析都是用我最初收集的数据完成的。

论坛上有 31 个主题,张贴的回复数量从“抑郁症”主题的 317 个到“军事问题”的 3 个不等(图 1-3)。该网站上有 307 名治疗师投稿人,其中大多数位于美国西海岸(华盛顿、俄勒冈州、加利福尼亚州)。他们包括博士级别的心理学家、社会工作者和有执照的心理健康咨询师。

该网站有一些重复的问题和答案,似乎是由用户自己生成的(例如,治疗师将一个问题的回答复制粘贴到另一个类似的问题上);我们没有为这种重复清理数据。

数据集以 CSV 格式呈现,包含 10 列,如下所述:

  • 问题 ID —唯一的问题标识符,对于每个问题都是不同的
  • 问题标题 —咨询聊天中问题的标题
  • 问题正文 —个人向辅导员提出的问题正文
  • 问题链接 —指向该问题最后一个位置的 URL(可能不再有效)
  • 主题 —问题所在的主题
  • 治疗信息 —每个治疗师的总结,通常是姓名和专业
  • 治疗师 URL——心理咨询网站上治疗师简历的链接
  • 回答文本——治疗师对问题的回应
  • upvotes —回答文本收到的支持票数
  • 分割 —用于训练、验证和测试的数据分割。

要处理数据,您可以使用 HuggingFace 数据集库。

from datasets import load_dataset

dataset = load_dataset("nbertagnolli/counsel-chat")
df = pd.DataFrame(dataset["train"])

一般来说,大多数问题只有几个回答,75%的问题有两个或更少的总回答。然而,许多问题需要很多治疗师的参与。评论最多的问题是我是否有太多问题需要咨询?很高兴看到治疗师对这类问题的精彩参与。作为一个次要问题,我真正喜欢处理治疗数据的一点是,你可以看到人类善良和理解的能力。

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

图 1——可视化响应数量

我们还可以观察到题目中一些有趣的趋势。如果我们按主题划分问题的数量,我们会发现大多数问题都与抑郁、关系和亲密度有关。

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

图 2 —按主题可视化问题数量

但是,有趣的是,咨询基础跃升了 12 位,在回答数量上排名第三。看起来治疗师对治疗有很多看法:)。

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

图 3——按主题显示回复数量

一般来说,大多数问题都很简短。治疗师似乎提供了更长的回复。平均问题长度为 54 个单词,但平均回答长度为 170 个单词。

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

Counselchat.com,就像现在任何一个好的社交网站一样,有能力投票支持治疗师对一个问题的回答。如果我们看一下有向上投票的回复的数量,我们可以看到大约 30%的回复得到了向上投票。大多数回答都没有获得赞成票。单个辅导员对一个问题的回答的赞成票范围是从 0 到 8;中值回应获得 1 票支持。

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

向上投票预测

为了查看什么可能有助于向上投票,我在 n 元文法上使用 TF-IDF 训练了一个简单的分类器,一个使用 BERT 特征,一个将两者结合起来。不幸的是,预测上升的票数似乎有点困难。我们的第一关 TF-IDF 模型的性能不是很好。通过使用 BERT,我们可以获得稍微高一点的精度,但总体来说还是不太好。对于 BERT 模型,我使用 BERT 作为特征提取器,正如我在这篇的另一篇文章中所做的那样。

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

训练主题分类器

除了 upvotes 之外,将治疗师的回答分成不同的类别也很有趣。有时知道人们是否在谈论抑郁症或者亲密关系是很有用的。为此,我对一架 SVM 进行了 TF-IDF 功能的训练。由于 BERT 的特性似乎并没有给我们带来太多的东西,所以我选择了一个更容易理解的模型。

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

不幸的是,验证集的性能看起来并不太好。如果我们查看验证集中的支持,我们会发现许多主题只出现一两次,所以我们基本上没有能力预测这些也就不足为奇了。随着时间的推移,这些结果应该会随着更多的数据而改善,特别是随着更多的人使用该平台。

我用我在这篇文章的中描述的代码看了一下这个模型的主要特性。看起来像是与药物使用、责任和损失相关的词会弹出来。考虑到焦虑、抑郁、悲伤和失落都可能与“失去”有关,这似乎有点合理。“药物滥用”也是一个类别,我敢打赌“12 步”是非常密切相关的。无论如何,最好抽查一下这些模型,确保它们能产生一些直观意义的单词。

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

可视化主题

我想看看伯特特性如何很好地划分空间可能也很有趣,所以我创建了一些简单的 UMAP·2D 嵌入。总的来说,我们看不到这两个阶层之间有明显的区别。然而,不同的主题组在某些情况下看起来更接近,而在另一些情况下看起来更远。以职场关系(紫色)为例,它非常非常接近于关系解除(黑色),但与咨询基础(亮绿色)完全分开。

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

训练治疗师聊天机器人

最近出现了大量应用程序,试图利用对话代理使精神健康变得更容易获得,参见 woebot.iowysa.com了解那里有什么。既然精神健康机器人现在这么火,我想我们应该用我们的新数据训练一个。

训练相当好的聊天机器人变得出奇的容易。抱脸有这样的例外穿越我不想在这里做训练聊天机器人的教程。尽管我的一些经历值得一提。为了训练这个聊天机器人,我几乎一字不差地使用了他们的代码。我对代码做了两处小小的修改,并且必须将 counselchat.com 数据解析成基于 transformer 的模型的正确形式。最终,我不得不编写和修改不到 50 行代码。

代码修改

拥抱脸模型对于在没有太多数据的情况下启动并运行一个相当不错的聊天机器人来说是非常棒的。我不想让我的机器人有任何个性,所以我必须在 get_data_loaders 函数中注释掉第 93 行。这一行对现有的人物角色进行了一些置换,但是我没有向模型传递任何人物角色,所以这是空的,需要注释掉。

persona = [persona[-1]] + persona[:-1] # permuted personalities

我做的另一件事是放置

assert max_l <= 512

pad_dataset 函数内部。 BERT 和 GPT2 有一些输入大小限制,当超过这些限制时,您可能会在训练过程中遇到一些神秘的错误,例如:

RuntimeError: index out of range: Tried to access index 512 out of a table with 511

添加这一行帮助我在运行模型之前发现我的数据是否太大。它对模型没有任何帮助,但是在我调试的时候非常有帮助:)。

为聊天机器人训练转换数据

拥抱脸变形模型的数据格式起初看起来有点混乱,但是它很容易生成。训练数据需要是具有以下签名的 JSON 文件:

{
  "train": [
    {
      "personality": [
        "sentence",
        "sentence"
      ],
      "utterances": [
        {
          "candidates": [
            "candidate 1",
            "candidate 2",
            "true response"
          ],
          "history": [
            "response 1",
            "response 2",
            "etc..."
          ]
        }
      ]
    }
  ],
  "valid": ...
}

让我们稍微分解一下。较大的 JSON 对象有两个主键。“训练”和“有效”。训练是训练数据,并且是个性、话语对的列表。除了验证集之外,Valid 是相同的。个性是定义说话者个性的句子列表。更多细节请看拥抱脸教程。对于我的模型,我只是将它留空以表示没有个性信息。候选人部分包含候选人响应列表。此列表包含对对话历史的一些非最佳响应,其中最后一句是基本事实响应。最后,我们必须定义历史。一般来说,这是一个字符串列表,其中每个位置包含一个新的话轮。对于我们的机器人,我们只有两次谈话机会,一次是提问者,另一次是治疗师的回应。所以我们就用这个问题来填充。我们这样做是因为我们在寻找对问题的好的单一反应,而不是训练一个普通的治疗机器人。

如果你想要另一个如何格式化数据的例子,拥抱脸在知识库中有一个很好的例子,你可以在这里找到。

数据经过适当的格式化后,我们可以将它直接传递给拥抱脸模型。我按照以下说明训练我的:

python3 train.py --dataset_path counsel_chat_250-tokens.json --gradient_accumulation_steps=4 --lm_coef=2.0 --max_history=1 --n_epochs=3 --num_candidates=4 --train_batch_size=2

瞧啊。我们有一个训练有素的聊天机器人能对真正的治疗师做出反应。如果你想玩这个模型,请在这里下载。然后你需要做的就是解压文件并运行

make build
make interact CHECKPOINT_DIR=counselchat_convai

这将为 Hugging Face 的对话式 AI 构建 docker 容器,然后用我们训练好的模型运行一个交互脚本。如果在构建时出现 docker 错误,尝试在 Docker -> Preferences 中将容器的内存增加到 5GB 左右。这似乎是人们试图构建这个容器时的一个常见问题。

这里有一个对话的例子!我们可以看到,模型是一个很好的倾听者。提供建议,一些同情和怜悯。在世界末日的场景中,它似乎也很方便,提供给我工具。

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

一些体面的回应

结论

很难获得良好的治疗师-患者互动,但如果你四处看看,就有好的数据。咨询聊天是有限质量的治疗师互动的一个极好的来源。我希望你能在你的领域里找到一些很酷的心理治疗数据的应用。

模型解释中的反事实解释

原文:https://towardsdatascience.com/counterfactual-explanations-in-model-interpretations-a73caec5b74b?source=collection_archive---------23-----------------------

我们回顾了从模型中产生可操作的解释和见解的方法

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

乔尔·菲利普Unsplash 上拍摄的照片

对比涉及特征属性的模型解释方法如前一篇文章中所讨论的,反事实是解释的一个有趣部分,它允许对机器学习模型进行事后解释。

在这篇文章中,我讨论了几种反事实解释方法的一些背景,包括那些非常注重多样性的方法以及另一种由原型引导的方法。这篇文章是对我和他人参考的概念的直觉练习。

讨论的主题:

  • 反事实解释和基本形式
  • 不同的反事实解释(骰子)
  • 原型引导的反事实

反事实解释和基本形式

在它的核心,反事实允许我们采取行动,以导致某种结果。就机器学习而言,动作是模型特征的变化,而结果是期望的目标响应。数据基本上被扰乱,直到返回对应于远离原始模型的模型预测类的新实例。因为有各种方法可以达到相同的结果,所以可能有多种反事实。

一个常见的例子和用例是贷款审批。客户可能需要增加他们的收入或教育的一些数额,以批准某些类型的贷款。

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

来源:微软研究博客

由于反事实可能性的空间相当大,评估有效性的度量标准通常分为三个主要方面:稀疏性、多样性和接近性。

  • 稀疏性与需要更改以达到输出类的要素数量相关联
  • 多样性处理生成的反事实之间的距离,并用于确保不同的方式改变到输出类跨度很大
  • 接近度与输出和原始实例之间的相似性有关。从概念上讲,这是一个衡量做出改变有多容易的标准

基本形式

为了更好地理解这个主题,我们从一个标准的分类器及其反事实目标函数的修改开始

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

f 是模型。xi 是最初的例子。易是最初的目标反应。p 是在损失函数上优化的权重上的正则化。“x”是反事实的例子。y 是所需的目标类。d 是距离函数。λ是平衡/正则化参数。

后一个目标函数的第一项实质上引导对新输出的搜索。第二项是距离函数 d ,它描述了原始实例和反事实之间的差异。这包括所有要素之间的距离,其中连续和分类要素以特定方式处理。这一项由中位数绝对偏差(MAD)来衡量。正则化参数 λ 平衡了两项之间的距离。

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

p 是特征计数。MAD 是中位数绝对偏差。s 是特色。n 是一些数据集。

MAD 值对异常值相当稳健,但对某些数据集仍有限制。下面几节提到了处理这个问题的不同方法。一种方法使用修改的 MAD 阈值,另一种方法简单地找到在扰动技术中使用 MAD 的替代方法。

从这里开始,工作变成了寻找反事实的优化问题。作者提到了 ADAM,尽管也可以使用其他优化器。由于问题的非凸性质,不同的最小值被用作生成多种反事实的不同集合的方法。

以下章节中讨论的方法提供了一些处理目前为止所涉及的策略的替代方案,并且总体上,还提供了对反事实目标函数的一般形式的扩展和改进。

下面我们来回顾一下:

  • 多样的反事实解释(骰子)
  • 原型引导的反事实

不同的反事实解释(DiCE)

多样性是反事实的一个重要属性。毕竟,根据使用案例和业务需求,太少和太相似的选项可能会成为瓶颈。以贷款为例,拥有选择与你的位置、收入、职业或教育相关的变化的选择权,对客户和贷方都有好处。

多样化的反事实解释方法试图提供一种平衡多样性和可行性的途径。如果没有如上所述的适当考虑稀疏性和邻近性,多样性本身可能并不总是有用的。可能有这样的情况,需要改变的特性数量可能太多,或者需要的改变太大而不可行。此外,在不提供域约束的情况下,可能存在这样的场景,其中反事实接近原始实例,但是仍然在真实世界域之外。最终,理想的选择将为个人提供不仅多样而且可行的变化,这些变化是可行的并且在他们的能力范围内。

作者用来提升这一属性的策略导致了多样性度量,决定性点过程(DPP ),它考虑了邻近性和约束。

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

k 是核矩阵。d 是距离函数。“x”是反事实的例子。

耦合 dpp_diversity 以及调整上述反事实的基本形式,我们在所有生成的反事实上建立以下优化框架:

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

x 是一个反事实。x 是原始实例。k 是反事实的总数。λ1 和λ2 是平衡参数。y 是期望的目标响应。

第一项和第二项类似于在基本形式中发现的那些,其中前者涉及将搜索导向期望的结果,而后者涉及反事实和原始实例之间的距离。第三项是我们刚刚引入的 dpp_diversity 以及一个额外的平衡超参数 λ ₂.

对于连续变量,距离函数 d 由类似于基本形式的 MAD 引导;然而,对于分类变量,这种方法就不那么简单了(毕竟,我们如何定义像职业这样的特征中类别之间的距离呢?)这种方法更多地采用二进制类型的赋值:如果特征与原始实例匹配,则距离取为 1,否则取为 0。

与上一节一样,从这里开始本质上是一个优化问题,作者使用带有指定搜索参数的梯度下降。

原型引导的反事实

另一种寻找可解释的反事实解释的方法涉及到类原型的指导。这样做的一个重要目的是加速反事实搜索过程。我们可以考虑在与实时决策相关的场景中对快速计算的需求。

原型基本上是一个代表数据集的实例。作者通过使用 k-NN 实例与数据集的代表性部分耦合的编码器或者通过使用 k-dd 方法来选择原型。第 3.3 节提供了更多详细信息。

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

为类别 I、类别数量 K 和编码器型号 ENC 定义的类别原型

在高层次上,这种方法的主要概念包括将一个额外的损失函数项整合到第一节的基本反事实方程的修改版本中,该损失函数项说明了这些原型。这为反事实搜索过程中的原型提供了指导。

这在计算上要求较低,尤其是在我们只能访问模型预测函数的情况下。而不是传统地仅使用与预测相关联的损失函数来偏离原始类别;该方法可以避开该项,而简单地使用对应于原型的损失函数。

正如多样化的反事实方法一样,在搜索过程中处理分类特征的想法有点模糊。第一节和第二节中介绍的方法都应用了某种类型的二进制,这里的策略稍微复杂一点,使用嵌入技术将分类变量投影到数值空间中。这是通过考虑特征之间的不相似性的度量以及它们的预测概率来实现的。附录 C 对此进行了更详细的描述。

再次,从这里我们可以继续优化,以产生反事实的解释。

值得注意的是,这个方法总体上提供了几个有趣的属性,以便提供快速的结果。首先,优化使用快速迭代收缩阈值算法(FISTA)作为快速收敛到结果的手段。其次,自动微分可以利用深度学习架构和权重进行显式评估。最后,如前所述,增加原型损失项可以灵活地绕过计算瓶颈。这对于黑盒用例尤其重要。

摘要

总之,反事实解释可以通过允许我们改变个别实例作为达到预期结果的途径,从而为模型预测提供可操作的见解。

  • 我们首先回顾了模型解释中反事实背后的一般思想及其一般形式
  • 然后,我们讨论在此基础上构建的扩展、修改和优化策略,探索强调多样性的方法以及原型提供的指导

参考

[1]s .沃希特、b .米特斯塔特和 c .拉塞尔(2017)“不打开黑盒的反事实解释:自动化决策和 GDPR。”

[2] Mothilal,R. K .,Sharma A .,和 Tan,C. (2020)“通过不同的反事实解释来解释机器学习分类器。”

[3] Arnaud,V. L .和 Klaise,J. (2019)“原型指导下的可解释的反事实解释”

解释了反事实政策梯度

原文:https://towardsdatascience.com/counterfactual-policy-gradients-explained-40ac91cef6ae?source=collection_archive---------39-----------------------

多智能体强化学习中的学分分配问题

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

Ales NesetrilUnsplash 上拍摄的照片

在众多挑战中,多主体强化学习有一个被忽视的障碍:“学分分配”为了解释这个概念,我们先来看一个例子…

假设我们有两个机器人,机器人 A 和机器人 b。他们试图合作将一个盒子推入一个洞。此外,他们都将获得 1 英镑的奖励,如果他们按下按钮,则获得 0 英镑的奖励。在理想情况下,两个机器人会同时将盒子推向洞口,最大限度地提高任务的速度和效率。

然而,假设机器人 A 做了所有的重活,也就是说机器人 A 把箱子推进洞里,而机器人 B 在一旁无所事事。即使机器人 B 只是四处游荡,机器人 A 和机器人 B*都会得到 1 的奖励。换句话说,即使机器人 B 执行了一个次优策略,同样的行为随后也会被鼓励。*这就是“信用转让”问题的由来。在多智能体系统中,我们需要找到一种方法,将“荣誉”或奖励给予为整体目标做出贡献的智能体,而不是那些让别人做工作的智能体。

好吧,那解决办法是什么?可能我们只给对任务本身有贡献的特工奖励。

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

照片由 Kira auf der HeideUnsplash 上拍摄

这比看起来要难

看起来这个简单的解决方案可能行得通,但是我们必须记住几件事。

首先,强化学习中的状态表征可能没有足够的表现力来恰当地定制这样的奖励。换句话说,我们不能总是很容易地量化一个代理人是否对给定的任务做出了贡献,并相应地给予奖励。

其次,我们不想手工制作这些奖励,因为这违背了设计多智能体算法的目的。告诉代理如何协作和鼓励他们学习如何协作之间有一条细微的界限。

一个答案

反事实的政策梯度解决了信用分配的问题,但没有明确给出代理人的答案。

这种方法背后的主要思想是什么?让我们通过将代理的操作与它可能采取的其他操作进行比较来训练代理策略。换句话说,代理会问自己:

“如果我选择了不同的行动,我们会得到更多的奖励吗?”

通过将这一思考过程纳入数学,反事实多主体(COMA)策略梯度通过量化主体对完成任务的贡献来解决信用分配问题。

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

布兰登·莫温克尔Unsplash 上拍摄的照片

组件

COMA 是一种演员-评论家方法,使用集中学习和分散执行。这意味着我们训练两个网络:

  • 一个 actor :给定一个状态,输出一个动作
  • 评论家:给定一个状态,估计一个价值函数

此外,critic仅在培训期间使用,在测试期间移除。我们可以把批评家看作算法的“训练轮”我们使用评论家来指导演员在整个培训过程中,并给它如何更新和学习其政策的建议。然而,当到了执行演员所学政策的时候,我们就把批评家去掉了。

关于演员-评论家方法的更多背景知识,请看 Chris Yoon 的深度文章:

[## 理解演员评论方法

预赛

towardsdatascience.com](/understanding-actor-critic-methods-931b97b6df3f)

让我们先来看看评论家。在这个算法中,我们训练一个网络来估计所有代理的联合 Q 值。我们将在本文后面讨论评论家的细微差别以及它是如何被特别设计的。然而,我们现在需要知道的是,我们有两个批评家网络的副本。一个是我们试图训练的网络,另一个是我们的目标网络,用于训练稳定性。目标网络的参数定期从训练网络中复制。

为了训练网络,我们使用策略训练。我们使用 TD(lambda)来确定我们的目标 Q 值,而不是使用一步或 n 步前瞻,TD(lambda)使用 n 步回报的混合。

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

使用 TD(λ)的 n 步返回和目标值

其中,γ是折扣系数,r 表示特定时间步长的奖励,f 是我们的目标价值函数,λ是超参数。这个看似无限的地平线值是由目标网络使用自举估计来计算的。

关于 TD(lambda)的更多信息, Andre Violante 的文章提供了一个奇妙的解释:

[## 简单强化学习:时间差异学习

所以最近我读了很多关于强化学习的书,还看了大卫·西尔弗的介绍…

medium.com](https://medium.com/@violante.andre/simple-reinforcement-learning-temporal-difference-learning-e883ea0d65b0)

最后,我们通过最小化该函数来更新评论家的参数:

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

损失函数

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

何塞·莫拉莱斯在 Unsplash 上的照片

问题是

现在,你可能想知道:这不是什么新鲜事!这个算法有什么特别之处?这种算法背后的美妙之处在于我们如何更新演员网络的参数。

在 COMA 中,我们训练概率策略,这意味着在给定状态下的每个动作都是以特定的概率选择的,该概率在整个训练过程中会发生变化。在典型的行动者-批评家场景中,我们通过使用策略梯度来更新策略,通常使用价值函数作为基线来创建优势行动者-批评家:

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

天真的优势演员评论家政策更新

然而,这里有一个问题。这没有解决我们试图解决的原始问题:“信用分配”我们不知道“任何一个个体对任务的贡献有多大”相反,考虑到我们的价值函数估计联合价值函数,所有的代理都被给予相同数量的“信用”。因此,COMA 建议使用不同的术语作为我们的基线。

为了计算每个代理的这个反事实基线我们计算代理可以采取的所有行动的期望值,同时保持所有其他代理的行动固定。

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

将反事实基线添加到优势函数估计中

让我们后退一步,剖析这个等式。第一项只是与联合状态和联合行动(所有代理)相关联的 Q 值。第二项是期望值。观察求和中的每一项,有两个值相乘。第一个是这个代理人选择特定行动的概率。第二个是采取行动的 Q 值,而所有其他代理保持他们的行动不变。

那么,这为什么会起作用呢?直觉上,通过使用这个基线,代理人知道这个行为相对于它可能采取的所有其他行为贡献了多少回报。这样,它可以更好地区分哪些行动将更有助于所有代理的整体奖励。

COMA 提出使用特定的网络架构有助于更有效地计算基线[1]。此外,通过使用蒙特卡罗样本估计期望值,该算法可以扩展到连续动作空间。

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

JESHOOTS.COMUnsplash 上拍照

结果

COMA 在星际争霸单位微观管理上进行测试,与各种中央和独立演员批评家变量进行比较,估计 Q 值和价值函数。结果表明,该方法明显优于其他方法。对于官方报道的结果和分析,查看原始论文[1]。

结论

没人喜欢懒鬼。机器人也不会。

适当地允许代理认可他们对任务的个人贡献,并优化他们的策略以最好地利用这些信息,这是使机器人协作的重要部分。在未来,可能会探索更好的分散方法,有效地成倍降低学习空间。然而,这说起来容易做起来难,所有这类问题都是如此。当然,这是一个强大的里程碑,让多智能体在更高、更复杂的层次上发挥作用。

参考

[1] J. Foerster,G. Farquhar,T. Afouras,N. Nardelli,S. Whiteson,反事实多主体政策梯度 (2017)。

从经典到最新,这里有讨论多代理和单代理强化学习的相关文章:

[## OpenAI 的 MADDPG 算法

多主体 RL 问题的行动者批评方法

towardsdatascience.com](/openais-multi-agent-deep-deterministic-policy-gradients-maddpg-9d2dad34c82) [## 分层强化学习:封建网络

让电脑看到更大的画面

towardsdatascience.com](/hierarchical-reinforcement-learning-feudal-networks-44e2657526d7)

用神经网络计算纸牌

原文:https://towardsdatascience.com/counting-cards-with-a-neural-net-ce426c2b6e57?source=collection_archive---------24-----------------------

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

埃斯特万·洛佩兹在 Unsplash 上的照片

机器学习能成功扳倒房子吗?

你可以在我的 Github 上找到我的代码。

这里是我以前在 21 点上的帖子的链接。我使用了我的旧 21 点模拟器的修改版本(在链接的帖子中详细讨论)。如果你想知道更多关于我是如何编码的,或者只是需要复习一下基本的 21 点策略,你可以先看看这些:

[## 让我们玩 21 点(用 Python)

我们用 Python 实现了一个 21 点模拟器,以便更好地理解去拉斯维加斯的风险

towardsdatascience.com](/lets-play-blackjack-with-python-913ec66c732f) [## 教神经网络玩 21 点

我们训练一个神经网络,看看应用深度学习是否可以改善我们的 21 点策略

towardsdatascience.com](/teaching-a-neural-net-to-play-blackjack-8ec5f39809e2)

去年,当我训练一个神经网络玩 21 点时,令我困惑的一件事是,当我向它提供算牌信息时,为什么我的神经网络没有做得更好。算牌难道不会给玩家带来显著的优势吗?

对于那些不熟悉这个概念的人来说,算牌是一种跟踪牌组中剩余大牌(10 张,杰克,皇后,国王,王牌)数量的方法。这个想法是,当一副牌中剩下很多正面牌时,这对玩家有利(因为我们更有可能拿到大牌,庄家也更有可能破产)。因此,如果我们的算牌提示我们剩下的牌更有可能是高牌,我们应该利用这一点,比正常情况下下更大的注。

当我去年试图将算牌集成到我的 21 点代码中时,它没有添加任何东西,因为我做得不对。我之前建立的模型接受玩家手中的牌和庄家正在展示的牌等信息,并决定是继续击球还是留下。

我试图通过向模型提供迄今为止作为其训练数据一部分的所有牌的详细计数来扩充我的模型(每次洗牌时计数都会刷新)。我认为,这个计数将允许神经网络预测交易商可能破产的时间——这些额外的信息将改善它的击中/停留决策。

令人惊讶的是,事实并非如此。表演居然变差了!**赢的概率从没有算牌数据的 42%下降到有了算牌数据的 38%。**平局概率也从 9%下降到 5%,暗示着更激进的打法。

有时候机器会学错东西

正如您在下面看到的,当给定牌数数据时,神经网络能够在庄家显示低牌时在赢或平的概率方面做得稍微好一点,但在庄家显示 10 或 a(11 表示 a)时明显不如其更简单(无牌数数据)的前身。以下图表中的概率是通过模拟大约 250,000 个 21 点游戏产生的,训练有素的神经网络决定是击中还是留下。

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

赢或平的概率,有和没有卡计数数据馈入神经网络(图片由作者提供)

如果我们只分离出庄家出 10、面牌或 a 的游戏,我们就能看到表现不佳的原因。我们被认为更聪明的神经网络(有卡片计数数据的那个)正在做一些非常愚蠢的事情。看下图中的蓝色条,我们可以看到,即使它已经持有 17 或更多的高手牌总数,它也选择频繁命中(它甚至在已经 20 的情况下偶尔命中)。相比之下,我们的模型更简单,它正确地知道停留在 17 手或更多。

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

当发牌人出示 10、脸牌或 a 时击中的概率(图片由作者提供)

也不全是坏事。前面我们已经看到,当庄家亮出低牌(6 张或更少)时,增加牌数数据可以提高获胜概率。直观地说,这样做的原因是,当发牌人亮出一张低牌时,发牌人肯定要打出一手牌,直到他的牌总数至少达到 17(或者他或她破产)。因此,在这种情况下,知道交易商何时更有可能破产应该会有所帮助。正如我们所见,我们的算牌神经网络的行为是不同的。它更有可能停留在总计为 13、14 和 15 的牌上,并且基于更高的获胜概率,在这些情况下,它似乎平均做出了正确的决定。

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

当庄家显示 2、3、4、5 或 6 时的命中概率(图片由作者提供)

尽管如此,获胜概率的整体下降令人失望。当我们的牌已经是 19 或 20 时,选择去打是一个大牌面。根据我们对神经网络的行为如何改变的检查,一旦我们添加了纸牌计数数据,看起来虽然额外的数据嵌入了一些信号,但它也导致了我们的模型变得过度拟合并做出了一些愚蠢的决定。所以让我们尝试解决这个问题。

试图修复我们的模型

当我回去回顾算牌实际上是如何工作的时候,我意识到我想错了。附加功能在帮助我们的模型知道是打还是留方面提供了有限的帮助。事实上,正如我们看到的,增加的特性更有可能混淆模型,而不是帮助它。但是牌数数据也许能帮助我们决定下多少注。如果我们知道一副牌中还有很多大牌,我们应该下更多的注,因为 21 点(由一张 a 和一张 10 或一张脸组成的两张牌手)的概率更高。相反,如果我们知道剩下的牌主要是低牌,我们应该只下最小注。

为了做到这一点,我们可以划分责任,而不是将所有东西都塞进一个单一的模型中。我们可以让已经运行良好的旧模型来处理“打还是留”的决定**,并建立一个新模型,该模型使用纸牌计数数据来决定下注多少**。它看起来会像下面的图片。关于纸牌计数功能的一个注意事项——我记录了到目前为止我看到的每种纸牌类型的数量,当庄家重新洗牌时,我将所有计数重置为 0。

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

两个模特各司其职(图片由作者提供)

当然,这一切都取决于纸牌计数数据是否真的有助于我们预测 21 点。让我们检查一下。我们可以使用 ROC 曲线来检查神经网络 2 的功效(如果您需要复习什么是 ROC 曲线,请查看以下链接)。

[## ROC 曲线和有效前沿

解释如何用一点金融来解释 ROC 曲线

towardsdatascience.com](/roc-curves-and-the-efficient-frontier-7bfa1daf1d9c)

根据 ROC 曲线(蓝线)下的较高区域判断,神经网络 2 似乎增加了价值(相对于随机决定):

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

试图预测黑杰克的神经网络 2 的 ROC 曲线(图片由作者提供)

因此,让我们用它来衡量我们的赌注,看看我们的表现是否有所改善。我模拟了 100 副 21 点纸牌(就像在赌场度过一个漫长的夜晚)100 次,比较了以下两种下注策略的平均结果和分布:

  1. 每次最小下注 10 美元。
  2. 当点数有利时,根据我们的自信程度下注更多(公式如下)。否则下注 10 美元。

以下是我如何决定下赌注的(完全公开——我并不认为这个决定规则有多难):

Using the training data, calculate the mean and standard deviation of the probabilities (of a blackjack) generated by neural net 2.Z-score neural net 2’s output prediction:
**Z_prob = (prediction - mean)/std_dev****if Z_prob > 0:
    bet = 10*(1 + Z_prob)
else:
    bet = 10**

基本上,如果得到 21 点的预测概率高于平均水平,我会下更多的注,而我下的额外赌注取决于预测概率比平均水平高多少。

酷,让我们看看我们是否能提高我们的赌博成绩。下面的情节比较了有和没有神经网络 2 的赌博表现。虽然看起来我们仍然无法持续赚钱,但动态下注规模确实提高了我们的表现。采用动态下注规模的平均期末资金比未采用时高 12%。

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

动态下注规模确实有帮助(图片由作者提供)

最后,让我们比较一下我们期末资金的分布,以确保我们的动态(和更大的)下注不会给我们的下注结果带来过度的波动。分布的形状看起来相当相似,动态下注大小(蓝色)稍微向右移动,这很好。

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

赌博结果直方图(图片由作者提供)

结论

我希望有更大的提升,但哦好吧。看起来更多的修补是必要的,但至少看起来我们正在做一些事情。它还表明,尽管深度学习模型可能很酷,也很灵活,但考虑周到并(尽可能多地)检查我们模型的工作方式仍然是值得的。最后,在不利的情况下获胜是很困难的!干杯!

数数很有趣

原文:https://towardsdatascience.com/counting-is-fun-7204fcb1f392?source=collection_archive---------20-----------------------

用数学和代码解决一些现实世界的问题

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

罗马法师Unsplash 上拍摄的照片

我最近开始了 MITx 的概率课程,发现它非常有助于更新我对一些基本计数原理的知识。

这些原则适用于许多现实世界的场景,例如计算出 A/B 测试的复杂性、赌博(掷硬币、掷骰子、扑克)、你为旅行打包的服装组合和座位安排难题,如下所示:

我将回顾我在课程中学到的计数原理,以及数学和 Python 代码中排列、组合和划分的应用。

还会有一些有趣的例子,希望你能像我一样喜欢学习或更新数学。

离散统一定律

我将首先在这里展示一个公式,因为在它的名字旁边没有火箭科学,我们在频率主义者的世界中知道它是:

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

这只是意味着,给定一个由 n 个元素组成的集合,并且事件A被定义为从 n 个元素中选择任意k个元素同等可能,那么概率就是简单的k除以n

计数有助于找出 k 和 T21 分别是多少。

基本计数原理

我经常遇到这样的问题:计算出一次旅行要带多少衣服。

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

是的,就像凯莉一样,via Giphy

所以我首先考虑我有多少天假期(这导致我每天想要多少种不同的风格),然后拿出几件衬衫、外套、连衣裙和牛仔裤来搭配——这是有趣的时光😳。

现在假设我不在乎衬衫和牛仔裤是否相配,但我想为两周的旅行准备足够多的不同服装,我至少需要打包多少衣服?

它可以是:

  • 👚x 7 和👖x 2 (14 种不同的组合,但可能有点单调)
  • 👚x 3 和👖x 3 和🧥x 2 (18 种组合,也许更好?)
  • 👚x 3 和👖x 3 和🧥x 2 和🥿👟👠👢x 4 (72 个选择,哇)

这个清单可以一直列下去…

所以计数原理说,如果你有r步和n步可能的选择,选择的总数可以概括为:

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

然而,现实从来没有这么简单,因为一些衬衫的颜色与另一种颜色不匹配,或者某些类型的鞋子在某些服装上不好看。但是是的,越多越好😏。

排列和组合

排列给出了排序 n元素的方式的数量。这里顺序很重要。n!阶乘代表可能排列的数量:

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

如果我们只有k的位置要填补:

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

相比之下,组合中的顺序并不重要。它有助于回答给定n选择和k元素子集的问题,有多少种方法可以做到这一点。

从根本上来说,这与填充上面的k 插槽是一样的。因为顺序不再重要,所以我们除以k元素的可能顺序数,即k!

n choose kC(n, k)表示:

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

有一天我们可能会面临另一个问题(或者如果你已经经历过,恭喜你!).

假设你想确保一对夫妇坐在一张有 6 个座位的桌子上,有多少种方法可以让他们坐在一起?

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

怎么安排座位???(用 Canva 制成)

由于ABBA的顺序在这里并不重要,该对可以被放置在任意两个空槽中,即6 * 2 = 12。一旦两个座位被他们占了,就剩下 4 个空位由另外 4 个客人来填补,这就是4!。因此,安排座位让这对夫妇坐在一起的方法总数是6 * 2 * 4! = 288🤯。

组合的一个扩展是找出一个集合{1, ..., n}可以有多少个可能的子集,即

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

这里的逻辑是,对于集合中的每个元素,有两种选择,要么将它包含在子集中,要么不包含。一个简单的例子是一个集合{1},它有两个 1 的子集和一个空集。

划分

这计算了我们将给定的一组项目划分成规定大小的子集的方法的数量:

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

通过 Giphy 切披萨

假设有 9 种不同口味的披萨分发给 3 个人(他们都不在乎得到哪种口味),A 得到 2 种,B 得到 3 种,C 得到 4 种。根据上面的公式,有

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

向 A、B 和 C 分配口味的方法!

回到 Twitter 的问题

我将尝试用分析的方式,通过 Python 代码的模拟来解决这个问题。

分析的

  1. 第一个人有 1/100 的机会获得最后一个座位
  2. 有 1/100 的机会,第一个人坐在第一个座位上,所有人都跟着坐
  3. 有 98/100 的机会坐在别人的座位上,他们坐在第一个或最后一个人的座位上的概率是 1/2

因此,最后一个人获得指定座位的概率是

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

模拟

或者,我们可以使用模拟来找出事件发生的概率,即最后一个人坐在最后一个座位上。

下图显示了模拟的高斯核密度,以及拟合的正态分布。它的平均值为 0.5,标准偏差为 0.01。

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

解决这个问题有多种方法,我在这里找到了其他解决方案以及在最初的推文中的讨论

最后的想法

组合学的概念不仅对数学和物理学的其他领域很重要,而且与我们的日常生活相关——数学无处不在!理解组合、排列和分割的一些基本概念肯定能帮助我们在现实世界中操纵无限的可能性。

如果你觉得这篇文章有帮助,请告诉我!如果您感兴趣,这里有一些关于此主题的参考资料:

帖子最初发表于此:https://www.chuxinhuang.com/blog/counting-is-fun/

数数很难,2019-nCoV 版

原文:https://towardsdatascience.com/counting-is-hard-2019-ncov-edition-94d5e502b0e3?source=collection_archive---------30-----------------------

不是每天我们都能看到专家解释数数有多难

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

今天,在目前以中国为中心的 2019 年新型冠状病毒爆发的全球热议中,我发现了这个关于一个数字的精彩推特帖子:R0,“R nough”,基本繁殖数。这个术语来自流行病学,我肯定不是流行病学专家,所以我尽量不把这个概念理解错。

在我们进入主题之前,根据我的粗略阅读,R0 的简单要点是这样的:

  • R0 < 1, every existing infection causes less than 1 new infection, disease will eventually die out
  • R0 = 1, every existing infection causes 1 more infection, disease keeps going
  • R0 > 1,每一个现存的感染都会导致一个以上的感染,因此被感染的人数将会增加,并且存在流行病的风险
  • R0 主要是数学模型中用来理解和描述疾病传播的概念。根据所使用的具体模型,它包括各种各样的假设,这些假设将限制它在现实世界中的实用性。
  • R0 很难(如果不是不可能的话)测量。

在像 2019-nCoV 这样的情况下,政府官员、医疗工作者甚至渴求信息的民众都需要考虑干预措施并迅速采取行动,人们很容易想到:“R0 的值是多少?计算 R0 能有多难?”

很明显,从题目来看,计算 R0 很难。对于不站在数据收集和建模界面的人,以及希望学习数据科学的人来说,这实际上是一个非常好的例子。

所有这一切的好处在于,流行病学是一门“硬科学”,早在整个“数据科学”之前就存在了。聪明人有时间认真思考这个问题,并且有强烈的动机(以人类生命和痛苦为代价)去解决这个问题。

潜入水中

这个帖子总结了 R0 的两个主要模型,非常简单:*R0=1+growth rate * time between one infection to the next.*

Caroline 指出,这是一个容易低估 R0 的简单模型,因为不可靠的报告和无症状病例本质上是丢失了你保证会有的数据点。该模型也只是描述性的,没有提供任何数学工具来分析干预的假设情景。

因此,Caroline 将注意力转移到一个简单的 SEIR 模型 T2,该模型模拟了人们从易受感染、暴露、被感染、抵抗的流动。(如果你想看到更多不同种类的模型,甚至维基百科页面也有大量的模型

在非常简单的 SEIR 模型中,R0 = bkd,参数如下。

SEIR 模型更有用,因为你可以输入编码干预的参数,如接种疫苗(去除易感人群)或隔离(降低接触率和易感人群)。你可以玩假设游戏,这对决策者来说是必不可少的。

但是为了估计 R0,我们需要…估计 3 个参数,b、k 和 d。建议是在缺乏详细信息的情况下,您可以首先从类似的既往疾病(SARS)开始估计参数,然后调整参数以适应您的新数据。当你时间紧迫,没有数据来直接测量时,比如在疫情爆发的超早期,这应该会让你合理地接近。

但最终,这仍然是一个猜测,因为也许 2019-nCoV 不会真的像 SARS 一样表现,因为大自然是不可预测的。由于时间限制,我们只能满足于估算。因此,我们希望在收到数据时实际测量真实参数。

然后,在您着手真正测量参数时,这条线索会进入您将会遇到的许多许多障碍。如果要估计 k,接触率…需要猜一个典型的人接触过多少人吗?你今天联系了多少人?过去的疾病也证明了每个人的情况不一样,所以这是一种分布。随着人们可能患病和康复,易感人群的数量也是一个不断变化的参数。

值得注意的是,SEIR 通常假设所有人都有相同的感染风险,因此您可以将研究单位视为一个城市。然后你可以将这个模型扩展成城市间的流行病模型…但是你必须模拟城市间甚至国家间的传播(耶,需要估计更多的参数!),而那些地方很可能 b,k,d 的参数都不一样!

最终你读完了所有这些,你会明白:R0 的绝对估计有这么多附加说明,认为它是一个铁的事实有点傻。

模型只是交流的框架

说到底,R0 只是一个数字。人们没有计算 R0,因为这个数字本身就能说明很多关于疾病的信息,因为它没有。实际有用的理解来自计算 R0 的工作。

人们用它来制定假设,显示我们应该在哪里收集数据,我们的误差源在哪里,以及如果我们做出某些改变,最终会发生什么。

值得注意的是,这个模型本身足够简单,可以在几条推文中合理地描述一个简化的版本。艰苦的(和潜在危险的)工作是在数据收集部分。我们应该记住,在我们更安全、更驯服的日常数据科学工作中。

这篇文章最初出现在兰迪的计数材料时事通讯上。

使用 GluonCV 和 MxNet 计算网络摄像头上的人数

原文:https://towardsdatascience.com/counting-people-on-your-webcam-using-gluoncv-and-mxnet-d1a9f05c427d?source=collection_archive---------56-----------------------

现实世界中的数据科学

基于 YOLOv3 目标检测模型

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

斯蒂芬·伯纳德Unsplash 上拍摄的照片

简介

在图像中计数是计算机视觉最常见的任务之一,有许多用例。在本教程中,我们使用了 GluonCV 工具包来支持我们这样做。GluonCV 在计算机视觉任务中提供了深度学习模型的前沿实现。它由用于图像分类、对象检测、语义分割、实例分割、姿态估计、对象跟踪和动作识别的最先进的预训练模型组成。你可以在格鲁恩科夫模型动物园看看其他模型。

[https://gluon-cv.mxnet.io/model_zoo/index.html](https://gluon-cv.mxnet.io/model_zoo/index.html)

通常,在对象检测任务中,我们有要检测的类、每个类的置信度得分以及图像中检测到的对象的边界框。

检测

例如,考虑包含狗、自行车和类似卡车的汽车作为突出对象的给定图像。

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

我的 colab 笔记本截图

当我们对图像应用对象检测模型时,我们的网络检查图像中的对象,将它们与地面真实标签进行比较,并返回置信度得分。边界框坐标是元组的形式,包括边界框的左上坐标、框的高度和宽度。

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

我的 colab 笔记本截图

为了检测图像中的人,我们在 COCO(上下文中的公共对象)类的集合中检查 person 类。COCO 数据集是一个奇妙的对象检测数据集,有 80 个类、80,000 幅训练图像和 40,000 幅验证图像。我们的模型“yolo3_darknet53_coco”在该数据集上进行了预训练。

为了流式传输我们的网络摄像头数据,我们使用开源计算机视觉库 OpenCV

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

OpenCV 是一个用于计算机视觉任务的开源机器学习库,来源:“OpenCV”,via: wikipedia

先决条件

在安装以下软件之前,在 Anaconnda 中创建一个虚拟环境(首选)

  1. OpenCV

要在您的系统中安装 OpenCV,请在您的终端或命令提示符中键入pip install OpenCV-python。我已经在 Anaconda 中使用了 Spyder 来完成这个任务,所以我已经在 conda 虚拟环境中安装了依赖项。

pip install opencv-python

2.MXNet 和胶子

要安装 mxnet 和 gluon,请在您的终端或提示符中键入pip install mxnet-Cu 101 gluonvv。我在我的虚拟环境中也做了同样的事情。如果您的虚拟环境中没有 CUDA,您可以安装不基于 CUDA 的 mxnet

pip install mxnet-cu101 pip install gluoncv

开源代码库

如果您熟悉 GitHub,请查看下面的资源库。

[## sid 0312/人 _ 计数器

这个库是作为我的中型博客 git 克隆 https://github.com/sid0312/people_counter…的源代码维护的

github.com](https://github.com/sid0312/people_counter)

让我们看看我给定的对象检测任务的源代码

  • 导入我们的依赖关系

  • 定义要使用的型号

  • 添加实用功能

a)将我们的帧从一个 NumPy ndarray 转换成一个 mxnet ndarray

b)将变换应用于 mxnet 阵列,以将其提供给网络

c)通过将网络应用于数据来获得 class _ ids、置信度得分和边界框

def detect(network,data):
  prediction = network(data)
  class_ids, scores, bounding_boxes = prediction
  return class_ids, scores, bounding_boxes

count _ object 函数,其对给定对象标签中超过给定阈值的对象数量进行计数

  • 创建一个 People_Counter 类,依次使用所有的效用函数和返回预测,以及 People,在单独的函数中计数

init 方法从 GluonCV model zoo 中导入预训练为‘true’的网络,因为我们使用的是预训练模型。使用 hybridize()加快网络速度。

set_threshold 方法设置对象置信度得分的阈值。置信度低于阈值的检测将不予考虑。

count_people 方法在实用函数的帮助下计算一帧中的人数

detect_people 方法返回对帧的检测。

class_names 返回 COCO 数据集中的所有 80 个类,这些类也是网络的类,因为它是在该数据集中预先训练的。

  • 为 People_Counter 类创建一个对象,并将阈值设置为 0.5。置信度低于 0.5 的检测将被考虑。

  • 加载网络摄像头处理程序,让网络摄像头自动对焦一秒钟

  • 使用 gluoncv.utils.viz 库设置循环,对每一帧进行检测和计数,并在窗口中显示结果

video.read()返回两个值,第一个被丢弃,第二个成为我们的帧。

使用计数器对象的 count()和 detect_people()

获得预测,并在每一帧上绘制边界框。将计数文本放在框架上。使用 cv2.imshow()显示帧

如果在窗口上下文中按下“q”键,则退出循环。

  • 释放网络摄像头,销毁所有窗口

结果

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

检测的单个帧

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

在我按下“q”之前的特定时间内的一些日志

非常感谢您的耐心。快乐的计算机视觉和快乐的深度学习。

制造和交易纸张的国家

原文:https://towardsdatascience.com/countries-that-make-and-trade-paper-bfd31b809f4c?source=collection_archive---------20-----------------------

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

1998–2018 年全球主要行业的数据可视化发现

简单地说,纸是由纸浆制成的。纸浆是由木材生产的,其次是稻草、竹子、棉花和其他天然纤维。在大规模生产的每一步,变异和多样化都是有意创造的,因此相对无差别的原材料——木材——变成了高度专业化的产品,用于书写、运输鞋子或擦拭溢出的乳制品。

化学和材料转化的进程可以理解为一个价值链。每一步都会创造价值。纸张或中间纸浆可以交易,并与其他价值链互动,如食品或消费电子产品。

因为纸无处不在,但制造复杂,而且基于天然原材料,在我们的星球上分布不均匀,所以价值链和贸易必然是全球性的。不同国家的工业必然会对这种全球交换纸和纸浆采取不同的关系,或者更一般地说,这些产品所体现的价值。

因为造纸是一个主要的行业,并且因为它依赖于重要的自然资源,所以这个行业需要进行大量的研究。在这篇文章中,我将现代数据可视化和分析的强大工具箱部署到 1998 年至 2018 年间全球造纸和纸浆生产和贸易的数据集。纸张价值链中的关系和趋势不仅仅是一些数字的函数,可以用这个工具箱来发现。

在这篇文章中,我将说明这个可视化工具箱可以做什么,并在这个过程中使纸张价值链,纸张贸易,纸张生产更好地理解。数据和方法的细节放在最后一节,还有一些代码片段。

纸张生产差异化

首先,我采取全球观点。

在下面的堆积面积图中,我展示了 1998 年至 2018 年间全球纸张生产总量,以及总量中包含的纸张类型。

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

在这 20 年间,总产量在增加。2008 年和 2009 年的金融危机在图表中表现为增长曲线的轻微下降。

纸张类型的类别定义非常广泛。毕竟不是所有的书写纸或包装纸都是一样的。尽管如此,分组还是捕获了一些不同的实用程序,我将在这个细节层次上执行数据分析。

从第一次观察上图中各区域的相对大小,可以明显看出纸的生产程度。用来装东西的纸显然是一个主要的使用案例。

将全球总量分解为国家总量是有益的,从字面上讲是为分析增加了另一个层面。我选择了一个特定的年份,并对每个国家(或至少是主要生产国)的纸张产量进行了举例说明。下面的堆叠横条是 2018 年的。

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

左边的图表显示了绝对数量。人口众多的主要制造业国家出现在顶部,就像许多其他制造业产出一样。

右边的图表显示了任何一个国家不同种类纸张的相对数量。从这个角度来看,国内生产的比例差异更加明显。其中,芬兰因其高比例的印刷和书写纸和低比例的案件材料而突出,而加拿大因其相对较高比例的新闻纸而突出。

为了进一步挖掘数据,可以选择一种特定类型的论文,并将几个国家随时间变化的趋势放入数据可视化中,以便进行时间和空间上的比较。在下面的多线图中,已经对新闻纸进行了上述操作。

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

彩色线条与左边的轴相关,显示了少数几个主要生产国的趋势;灰色线与右手轴相关,显示了全球新闻纸生产总量的趋势。

20 世纪 90 年代末两个最重要的生产国是加拿大和美国。然而,他们的产量在 20 年间一直在下降,现在还不到原来的一半。最初,全球总量没有下降。产量的减少被中国产量的增加所替代。然而,在 2000 年中期左右,所有国家的趋势明显是下降的。显而易见的原因是数字新闻媒体降低了纸张的特殊价值。

全球造纸贸易

一旦在某个国家生产,纸张就会在国内消费,或者进入该国不同的价值链,比如其他制成品的包装。纸张本身也可以跨境交易,这是专业化价值链的另一个共同特征。

2018 年的出口和进口,被理解为流出和流入一个国家,如下所示。(文章末尾提供了代码片段。)

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

在左手边,负向流动,堆叠的虚线显示了国家出口的文件类型。在右边,正向流动,交叉的条显示了国家进口的文件类型。

对可视化的检查揭示了不同的国家与全球票据市场存在不同的关系。

  • 例如,芬兰、瑞典、加拿大、印度尼西亚相当倾向于负向流动,换句话说,它们是净出口国。
  • 中国、美国、法国,特别是德国,作为进口国和出口国,都与纸张进行大量贸易。以这种方式进行交易是有意义的,这在一定程度上反映了并非所有的纸张都是相同的,而且,比方说一个德国用例更适合来自一个精轧机而不是德国轧机的纸张。此外,这表明重商主义已经今非昔比。
  • 英国(以及图中省略的许多国家)进口他们使用的大部分纸张。

为了可视化贸易流中的趋势,在国家类别和纸张类型类别仍然完全解析的情况下,与上面相同类型的图像被动画化。图像中的每一帧都显示了 2000 年至 2018 年期间的贸易流量。

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

在这种数据可视化中,与之前类似的趋势是显而易见的。加拿大减少的足迹和中国增加的足迹在全球贸易中非常突出,这从以前的可视化中可以理解为与新闻纸效用的减少有关。不变的特征也很明显,比如瑞典和芬兰一直是主要的净出口国。

另一个有意义的对比是国家贸易流量相对于总产量的差异。下面的散点图可视化了 2018 年的相关数量。

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

国家纸张存量被定义为某一特定国家当年生产或进口的所有纸张的数量。横轴表示出口的国家储备的百分比,纵轴表示通过进口获得的国家储备的百分比。最后,圆盘的面积表示相应国家的纸张生产总量。

圆盘的位置和大小揭示了与纸张价值链及其全球贸易的多种不同关系:

  • 瑞典和芬兰(右下)主要生产出口纸张。
  • 左下角的中国和日本是主要生产国,但主要是为了满足国内对纸张的需求。
  • 左上角的英国(以及许多被忽略的国家,它们生产的纸很少)通过进口满足了大部分的国内用纸需求。
  • 对角线上的德国、法国、意大利和加拿大通过生产和进口来满足国内需求,它们将很大一部分产品出口到全球市场。

这些关系在研究的这些年里大多是稳定的。除了动画之外,说明趋势的另一种方法是将圆盘的轨迹可视化为叠加图。在 2000 年至 2018 年间,下图中的一小部分国家已经这样做了。(文章末尾提供了代码片段。)

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

全球纸浆贸易

到目前为止,纸被认为是。但是造纸需要纸浆作为原料。纸浆也是一种可以生产、出口和进口的物品。纸张价值链的这一部分的特征体现在以下数据可视化中。

然而,必须首先注意数据集的局限性。

有些工厂既生产纸浆又生产纸张。这种造纸厂生产的一部分纸浆可以干燥后卖给国内外的其他造纸商。纸浆的另一部分可以在工厂内输送到相邻的造纸机,并在那里转化成纸。数据集只考虑了前一部分,而忽略了后一部分。这是一个可以理解的省略,因为后一部分完全是在一个工厂内进行的。

就目前的分析而言,这一遗漏意味着无法获得某个国家生产多少纸浆的总价值,因为可能有很大一部分没有计算在内。然而,全球纸浆贸易包含在数据中,因此可以按照与上述纸张贸易相同的思路进行分析。

2018 年纸浆进出口流量的相同类型的堆积条形图如下所示。

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

首先要注意的是,数据中纸浆的类别较少,这反映了部分中的在价值链的这个阶段,产品的变化较少。然而,正如上面提到的纸张类型,这些类别在内部并不统一(一个缺失的区别是由针叶树或非针叶树木材制成的纸浆,前者在北方国家更常见)。

其次,出口大量纸浆的国家较少:巴西、加拿大、美国、印度尼西亚、芬兰、瑞典和俄罗斯。毫不奇怪,这些国家境内都有大量森林。树很重,不容易运输。纸浆生产供应链中的一个常见现象是,工厂中转化的木材主要是从工厂周围相对较小的地理区域收集的。

显而易见,中国进口了大量纸浆。如上所述,中国是主要供国内使用的纸张的主要生产国。然而,相当数量的纸是用进口纸浆制造的。

另一个与纸面数据分析形成对比的是巴西。在早期的散点图中,与巴西相对应的圆盘属于主要为国内使用而生产纸张,较少用于全球贸易的国家类别。然而,纸浆出口量很大。显然,与瑞典和芬兰不同,巴西选择在价值链的不同阶段参与全球贸易:将纸浆而非纸张货币化。

图表的动画版本如下所示。

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

应该注意的是,用于造纸的纸浆可以由部分回收或再生纸制成。尽管在过去的某个阶段,纤维必须来源于由木材(或其他天然来源)制成的纸浆,但直接来源可以是其他纸张。此处未显示的数据表明,中国造纸生产的很大一部分直接来源于回收纸。因此,进口纸浆量和生产的纸张量之间的差异不一定是来自天然来源的国产纸浆。

贸易数据可以进一步分为双边交易,即出口国和进口国的网络。使用热图可以很好地可视化与一对类别相关的数量。以下数据为 2017 年木浆全球贸易。

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

进口木浆的国家的子集显示为行,出口最大量木浆的国家的子集显示为列。热图中任何给定单元格的颜色饱和度显示了来自相应出口国的进口占相应进口国总进口的百分比。

换句话说,看着一排颜色,向对应于所述排的国家供应纸浆的国家变得非常清楚。将行与行之间进行比较,可以看出果肉获取方式的差异和相似之处。

一些观察结果:

  • 欧洲大陆各国的纸浆进口也有类似的相对分布,它们从巴西、瑞典和芬兰进口大量纸浆,从加拿大和美国进口一些,但从俄罗斯和印度尼西亚进口很少或没有。
  • 东亚进口商从出口国(不包括瑞典和芬兰,它们的供应量相对较少)获得的木浆分布更加均匀。
  • 加拿大和美国互相贸易木浆,也从巴西进口。
  • 巴西是全球木浆出口国。

为了向下钻取和查看趋势,一种方法是选择特定的国家并沿水平维度显示时间。以下是对意大利进口的处理。

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

已经讨论过的全球纸浆贸易的总体趋势是显而易见的,其中来自巴西的数量增加,来自加拿大的数量减少。更微妙的是,从印度尼西亚的进口尽管总是相当适度,却减少了。然而,从以前的图表中可以看出,印度尼西亚的出口总量有所增加。中国需求的增长很可能是因为印尼纸浆的转向。

那些树呢?

如上所述,大部分纸浆是在上述工厂附近的森林中伐木生产的。木材的全球贸易是可能的。然而,木材的不同可能用途,如家具、建筑、能源,都必须纳入分析。那超出了我在这里要做的事。

此外,砍伐和改造森林有许多原因。正如在别处所讨论的,全球森林面积正在减少。另一方面,减少并不一致,事实上,在同一时期,欧洲的森林覆盖面积比这篇文章中的要大。

可以说,纸张价值链以及造纸和纸浆的过程都很先进,对全球经济的新兴特征具有指导意义,并且丰富的数据足迹正在变得可用。生态互动网络的额外连接创造了更多的探索空间。

数据和方法说明

  • 数据来自联合国粮食及农业组织(粮农组织)。特定的数据主要基于不同国家的官方数据。粮农组织投资建立了一个易于访问的开放数据门户
  • 所有可视化都是使用 Python 库 Bokeh 完成的。这个库为可视化及其设计提供了大量的灵活性和控制,尤其是当数据处理与 Python 库 Pandas 结合时。为了指导使用散景的编码工作,使用 Microsoft Power BI 完成快速数据概述。
  • 多维数据本来就很难研究,人类的视觉感知限制了可视化所能捕捉的内容。来自数据库的概念,如 OLAP 立方体,以及切片、切块和下钻的规范操作,有助于构建数据探索。数据可视化原则也很有帮助。
  • 写在介质上的文本不能利用与图表的交互。动画图是一个相关的变体,说明了如何在可视化中分解连续变量或顺序变量,而不需要空间轴。
  • GIF 动画是用 Python 库 imageio 制作的。
  • 造纸和纸浆制造是一门复杂的工程科学,包含许多化学和机械步骤。YouTube 上有介绍这个过程的视频。同样,作为一个行业,造纸是古老的。至少有一种历史观点认为纸是最重要的 50 项创新之一——这种观点认为,如果书写的文字一直印在动物的皮肤上,而不是更便宜、更柔韧的纸张上,印刷机的革命性潜力永远不会实现。

代码片段:磁盘轨迹图 的内循环

代码片段:创建导出-导入流程图 的主要部分

使用 Spotify 的 API 和 Python 中的 Seaborn 对音乐品味进行国别可视化分析

原文:https://towardsdatascience.com/country-wise-visual-analysis-of-music-taste-using-spotify-api-seaborn-in-python-77f5b749b421?source=collection_archive---------16-----------------------

你知道哪个国家喜欢欢快的音乐,哪个国家喜欢喧闹的音乐吗?

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

我最近开始使用 Spotify,并对驱动 Spotify 基于协同过滤和 NLP 的推荐系统的复杂技术感到惊讶。

在这个项目中,我调查了特定国家的音乐偏好。

数据采集:

我删除了 Spotify 每周地区图表的数据。这是包括“全球”在内的 64 个国家的每周排名前 200 的热门歌曲。图表中的数据从 16 年 12 月开始。

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

我已经从 11286 个‘page _ URLs’中删除了这个列表,得到了一个有 210 万行和以下属性的数据集:歌曲名称,歌曲 URL,艺术家,流,歌曲位置(前 200 名之内),国家和星期。数据集中有 48261 首独特的歌曲、9805 位艺术家和 1579 种风格。与您分享样本数据的快照:

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

“音乐的一个好处是,当它击中你时,你不会感到痛苦。”——鲍勃·马利

我用 Spotipy 获取了报废歌曲的其他相关音乐数据。Spotipy 是 Spotify Web API 的轻量级 Python 库,它允许完全访问 Spotify 平台提供的所有音乐数据。

我从曲目 URL 中获取了详细信息,如曲目流行度(得分在 0-100 之间)、艺术家 URL、艺术家流行度(0-100)、艺术家追随者和艺术家流派。

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

对于每首歌,我还使用 Spotipy 提取了音频特征。

音频特性简述:

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

除了响度和速度之外,所有特性的值都在 0-1 的范围内。

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

最具特色的 25 位艺人:

  • Plot 显示了一位艺术家在所有国家数周内出现在前 200 名榜单中的次数。
  • y 轴上的特色数字以百为单位,例如艾德·希兰已经被特色了 48,000 次。
  • 在前 200 名列表和前 30 名中出现的特定艺术家的独特歌曲的数量(从歌曲位置计算)也绘制在 y 轴上。

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

这是对印度的独家分析,因为我是印度人。

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

25 大流派剧情:

  • 每首歌曲都与一个艺术家相关联,并且每个艺术家可以有多个流派。
  • 48.2k 独特歌曲中的前 25 个流派绘制如下。
  • 它显示了与特定的数据科学流派相关的歌曲和艺术家的数量。

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

艺人人气博闻剧情:

各流派中艺人人气得分分布的箱线图(经典箱线图的增强版)如下所示:

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

  • 在说唱流派中,Median artist 的受欢迎程度(由中间的黑线表示)最高。
  • 与其他流派相比,流行艺术家一开始就有很高的受欢迎程度。
  • 拉丁艺术家的受欢迎程度最高。
  • 摇滚和 EDM 艺术家不能获得 90 以上的受欢迎分数。
  • Trap 艺术家的受欢迎程度从 52-93 不等,他们中的大多数位于这个范围的高端,而在其他流派中分布更加均衡。

让我分享一些对一些最受欢迎的流派的有趣见解。

流派艺术家追随者蜂拥图:

在下面的蜂群图中,每个点代表一个艺术家。我已经标记了每个流派中最受关注的艺术家。

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

200 强最具特色歌曲:

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

按流派来看,一首歌出现在前 30 名的次数:

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

  • 这里每个点代表一首歌。
  • 流行歌曲名列榜首。
  • 只有几首摇滚歌曲设法长期保持在前 30 名。

我最喜欢的流派:

我在 Spotify 中保存的歌曲的前 12 种风格的饼状图如下所示。检查这个链接来分析你的。我听的大多数歌曲都是流行舞曲。

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

让我们探索一些主要流派的顶级艺术家,包括我最喜欢的。这些是提到的流派中最有特色的艺术家的词云。

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

在这个过程中,我可以在我最喜欢的流派中探索顶级艺术家最受欢迎的歌曲,并扩展我的播放列表。

音频特征相关性分析:

现在来说说我提取的音频特征。

皮尔逊相关系数®是衡量两个变量之间线性关联强度的指标。它的取值范围从+1 到-1。值 0 表示无关联,大于 0 的值表示正关联;也就是说,随着一个变量的值增加,另一个变量的值也增加。

这是音频特征之间的关联热图。

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

  • 蓝色表示正相关,红色表示负相关。
  • 联想越强,阴影越深。
  • 响度和能量有很强的正相关性,这是有道理的。
  • 与其他配对相比,声音和能量具有更强的负关联。
  • 化合价与可跳舞性、能量和响度有轻微的正相关。

音频特写联合 KDE 剧情:

我们可以进一步分析这些对,比如说能量和响度,使用如下所示的联合核密度估计图。

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

  • 两者都与皮尔逊 r 值 0.73 呈正相关。
  • 这两个特征的分布是左偏的,这意味着大多数歌曲具有这些特征的较高值。请注意,轴标签不是从 0 开始的。
  • 大多数歌曲的音频特征具有接近 6 的响度值和接近 0.7 的能量值,如较暗的轮廓阴影所示。

音频特色 vs 流派泡泡剧情:

这里是另一个查看数据的视图。在下面的气泡图中,我用他们的平均速度和平均语速分别在 x 轴和 y 轴上标出了这三个流派的艺术家。气泡的大小决定了他们的受欢迎程度。

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

  • 语速是区分拉丁歌曲和其他流派的一个很好的标准。
  • 顶级说唱艺人的人气比其他人多。
  • 大多数受欢迎的说唱艺术家在他们的歌曲中有一个非常明确的平均速度范围(大约 120 bpm)。

音频特征分布分析

几种音频特征在不同体裁中的分布分析。

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

  • Hip hop,rap 和 trap 在 speechiness 中排名很高。
  • 摇滚歌曲的语速最低。

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

  • EDM 歌曲有一个非常明确的速度范围。
  • 通常,所有流派的节奏都在 90-160 BPM 之间。

音频特色 vs 流派径向热图:

在下面的流派-特征径向热图中,我采用了标准化后每个流派所有歌曲的平均特征值。

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

平均特征值越绿。摇滚在工具性方面排名最高。

为了更好地理解数据,我在每个同心圆(即每个特征)中突出显示了(21 个国家中的)前 7 个国家。我将每个特性中高于 66%的值标记为 1,其他值标记为 0,然后创建了热图。

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

如果我们看看标有价数的同心圆,平均价数得分最高的前 7 个流派是舞蹈流行、荷兰嘻哈、雷鬼音乐、荷兰城市、拉丁流行、热带和拉丁。

我最喜欢的舞蹈流派——流行音乐并不像它的名字所暗示的那样,在可跳性方面位列前七。😅

国家级分析:

再说国家,我拿了一些顶级音乐国家的样本。

每个国家的十大流派列表:

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

如果我们看下面的图表(整个图表包含总共 64 个国家的 64 个条),在 48.2k 首歌曲中,34.7k 首歌曲出现在一个国家,4.3k 首歌曲出现在两个国家。

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

迄今为止,共有 32 首歌曲在全球 64 个国家播放。在前 30 名中,只有一首歌在所有国家都有播放。

最多国家排名前 30 的歌曲列表:

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

一个国家的地域歌曲比例:

如果我们再深入一点,分析这些 34.7k 只在一个国家精选的歌曲,我们就可以知道哪些国家的地域歌曲在那个国家的前 200 名榜单中占据主导地位。

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

意大利、印度和法国在地区歌曲占主导地位的国家名单中排名靠前。如果我们看看这些国家的顶级流派,大多数都是地区性的。

在意大利,排名前六的流派包括像意大利嘻哈和意大利流行音乐这样的地区性流派。令人惊讶的是,印度的歌曲数量明显较少,这可能是因为当我们痴迷于一首歌时,我们不允许其他歌曲长时间出现在列表中。😜

特定国家的音乐偏好:

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

  • 西班牙的化合价很高。拉丁和瑞格顿是西班牙最流行的两种音乐类型(见上表),这两种音乐类型的价值都很高,如风格特征热图所示。
  • 法国也是如此,法国嘻哈音乐和都市流行音乐是两种最突出的流派,在可跳舞性方面排名都很高,因此法国在可跳舞性方面排名最高。法国的声音和语音也是如此。
  • 印度在声学方面排名很高。声学音乐主要使用通过声学手段产生声音的乐器,而不是电子手段。
  • 日本人更喜欢充满活力和喧闹的音乐,因为 j-pop 和 j-rock 是突出的流派。但是他们更喜欢其他流派的充满活力的歌曲吗?

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

该图显示了音频特征“能量”在每个提到的流派中的分布。左侧是国家/地区被选为“全球”的分布,右侧是日本。

在上面的“分裂小提琴情节”中,与全球音乐相比,他们对活力音乐的品味在拉丁、雷鬼音乐和热带音乐等流派中非常明显。

在下面的表格中,我选取了 Spotify 上 200 位最受关注的艺术家,并根据他们在歌曲中的音频特征的平均分,对他们的每个音频特征进行了排名。正如我们在 acousticness 中看到的,Arijit Singh,Armaan Malik 和 AR Rahman 都在前 15 名。此外,来自印度的 Neha Kakkar 在响度方面排名第一。(我太骄傲了🤩)

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

因此,如果你想制作一个播放列表来跳舞,你可以看看上面的 danceability 顶级艺术家名单。

其他方面的顶级艺术家:

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

p!nk Floyd,Coldplay 和 Khalid 都是器乐方面的顶级艺术家。如果你正在寻找有积极氛围的歌曲,你可以查看价栏中的艺术家名单。

全国十大最具特色艺人名单:

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

Spotify 上关注最多的艺术家:

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

使用 t-SNE 可视化数据:

让我们检查一下某一特定流派的歌曲是否有相似之处。这是 2D 空间中 9 维数据(9 个音频特征)的 t-SNE 投影。t-分布式随机邻居嵌入(t-SNE)是一种非线性技术,它将多维数据映射到一个低维空间,并试图通过基于具有多个特征的数据点的相似性识别观察到的聚类来发现数据中的模式。

我放映了所有属于这些流派的歌曲:法国嘻哈、流行舞曲和雷鬼音乐。我将模型运行了 10000 次迭代,困惑值为 75。

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

正如你所注意到的,SNE 霸王龙试图将不同的点分开,并将相似的点聚集在一起。

音频特征雷达图:

这是 3 种类型的雷达图。我们可以比较它们的音频特征,例如法国 hip hop 具有最高的语音值。音频功能在绘图前已标准化。

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

利用逻辑回归和线性 SVM 的体裁分类:

让我们看看机器学习算法使用音频特征进行流派分类的效果如何。我选择了 3 个流派的所有歌曲(流行舞曲、法国嘻哈音乐和雷鬼音乐)。我用 OneVsRest 分类器和线性 SVM 应用了逻辑回归,两者都在 alpha 上调整了超参数。

我在随机选择的 70%数据(训练数据)上训练模型,并在剩余的 30%测试数据上用 5 重交叉验证(cv=5)测试其准确性。我在阿尔法上做了超参数调整,也应用了线性 SVM。

逻辑回归模型表现稍好,准确率为 70.1%。微观平均 F1 分数被用作性能指标。我将在下一篇博客中讨论这个话题的细节。我们在这里可以得出的结论是,音轨的音频特征是将歌曲分类到其各自流派的重要属性。

代码片段:

感谢您的阅读!我希望你喜欢这篇文章。如果你想了解我的文章,请关注我。

快乐聆听!🎧

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

参考文献:

[## 一个机器学习对我的 Spotify 数据的深度挖掘。-开放数据科学-人工智能的新闻来源…

这是我们关于使用无监督和有监督机器学习技术的两部分系列的第二篇文章…

opendatascience.com](https://opendatascience.com/a-machine-learning-deep-dive-into-my-spotify-data/) [## 欢迎来到 Spotipy!- spotipy 2.0 文档

编辑描述

spotipy.readthedocs.io](https://spotipy.readthedocs.io/en/2.11.2/) [## 获取音轨的音频功能|面向开发者的 Spotify

需要路径参数授权。来自 Spotify 帐户服务的有效访问令牌:参见 Web API…

developer.spotify.com](https://developer.spotify.com/documentation/web-api/reference/tracks/get-audio-features/) [## Spotify 的“这是”播放列表:50 位主流艺术家的终极歌曲分析

每个艺术家都有自己独特的音乐风格。从献身于木吉他的艾德·希兰,到德雷克…

towardsdatascience.com](/spotifys-this-is-playlists-the-ultimate-song-analysis-for-50-mainstream-artists-c569e41f8118) [## Python Seaborn 初学者教程

让别人理解你的观点的最好但也是更具挑战性的方法之一是将它们可视化:这样,你可以更多地…

www.datacamp.com](https://www.datacamp.com/community/tutorials/seaborn-python-tutorial#sm) [## Matplotlib | FC Python 中的雷达图

在足球分析和视频游戏中,雷达图已经在许多地方得到普及,从国际足联系列…

fcpython.com](https://fcpython.com/visualisation/radar-charts-matplotlib) [## Spotify 音乐分析

使用 Kaggle 笔记本探索和运行机器学习代码|使用来自 Spotify 歌曲属性的数据

www.kaggle.com](https://www.kaggle.com/aeryan/spotify-music-analysis)

基于县的新冠肺炎数据集和分析趋势

原文:https://towardsdatascience.com/county-based-covid-19-dataset-and-analytical-trends-ff1617030ba8?source=collection_archive---------69-----------------------

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

县级,新冠肺炎数据科学( Kabir Moghe ,2020)

来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

作为一名关心学年和大学体育运动的高三学生,我很好奇新冠肺炎对特定县的影响。许多关于学年、室内运动和口罩要求的决定都是在当地做出的,但我意识到没有简单的方法来探索和分析县数据。总的来说,捕捉病毒影响的数据集和可视化数据并不缺乏,无论是来自约翰霍普金斯大学还是疾病预防控制中心。《纽约时报》也发表了令人印象深刻的分析历史数据的作品,麻省理工学院的德尔福项目构建了一个深度模型来预测未来几个月的趋势。然而,这些研究和数据集通常以国家或州为重点,对于县一级的分析来说过于粗略。

在过去的几个月里,我一直致力于在县一级汇编一个粒度数据集,它汇集了来自各种来源的不同属性。我的目标是提供有用的信息,帮助县工作人员、学校管理人员、政府官员以及家长和学生简化决策过程。虽然还有很多工作要做,但迄今为止,我已经搜集了在线资源并补充了许多新属性,以创建一个全面的县级新冠肺炎数据集,其中包含美国 3144 个县中的 3106 个县的信息。(除了少数缺乏完整信息的县,99%的县都包括在内。)

该数据集将每日新冠肺炎数据组织成每月每个县的新增病例和死亡人数,以及死亡率和死亡率,但它还包括每个县的重要属性:人口密度、教育、种族构成等。数据集是自我更新的,每天都有新的信息输入,它和代码本身都可以在这里访问。

总体而言,数据集包括以下内容:

  • FIP 代码和县
  • 每月新新冠肺炎病例
  • 新新冠肺炎每月相关死亡人数
  • 感染率
  • 致死率
  • 人口
  • 失业人口的百分比
  • 家庭收入中位数
  • 近似人口密度(根据面积和人口计算)
  • 种族人口统计
  • 教育水平
  • 社交距离政策,特别是全州范围内的面具规定(“是”、“否”或“某些部分”)

用于创建上述属性的数据来自各种来源(USAFacts、美国农业部、人口普查网站、masks4all 和 ArcGIS),所有这些都在底部链接。

分析学

用户可以多种方式利用数据集。可视化图表很简单,数据集还包括 FIP 代码,这使得在县和州级别上创建地图变得很容易。下面是一个示例,其中为数据集中包含的 3106 个县绘制了 8 月份的新病例。显示了病例的自然记录(即 48,505 个病例映射到 10.8),以强调各县之间的差异。(空白点是数据集未包括的县。)

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

每个县都显示了 8 月份新增病例的自然对数(0-10.9 分)。

该地图描绘了 2020 年 8 月每个县的新感染水平的彩色编码趋势。例如,洛杉矶县显示了较高的感染人数,因此我们可以进一步探索其趋势。尽管该地图仅描述了病例,但数据集也包含了死亡信息。下图显示了洛杉矶县每月的病例和死亡人数。

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

加利福尼亚州洛杉矶县每月案例

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

加利福尼亚州洛杉矶县每月死亡人数

我们可以更深入地挖掘和分析县的具体属性如何可能或可能不与新冠肺炎的影响相关。在以下各节中,研究了 2020 年 8 月的影响,但该框架可以扩展到一组特定的月份或更长的时间段(即过去 3 个月与过去 6 个月)。

新冠肺炎教对少数民族的影响

为了了解少数民族如何受到新冠肺炎的影响,我将数据集分类为**本月感染率最高和最低的前 100 个县,分别用 C-max 和 C-min 表示,**并绘制了新冠肺炎对这些县各种种族人口统计的影响。

(注:在本节和以下各节中,我使用了加权 平均值作为集中趋势的主要衡量指标,由下图中的水平线表示,以说明各县之间的人口差异,而不是使用常规平均值或中值,这可能会扭曲数据。对于每个属性,我将各县的单个属性乘以其各自的人口,并计算这些新的缩放数字的总和,然后除以各县的总人口,以获得加权平均值。)

C-max 和 C-min 县的非裔美国人百分比与感染率

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

C-max 县

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

C-min 县

平均而言,3106 个县平均有 13%的非裔美国人。然而,在 C-max 县,非裔美国人平均占人口的 18%,而在 C-min 县,非裔美国人仅占人口的 2.1%:相差近 9 倍。

C-max 和 C-min 县的西班牙裔百分比与感染率

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

C-max 县

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

C-min 县

在美国各地,数据集中的县平均约有 19%是拉美裔。我们在 C-max 县看到这个数字的巨大跳跃,在那里西班牙人占人口的 54%。相比之下,C-min 县的拉美裔占 4.2%,也就是说感染率最高的县的拉美裔是感染率最低的县的 13 倍。

C-max 和 C-min 县的白人百分比与感染率

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

C-max 县

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

C-min 县

另一方面,美国白人占 C-max 县人口的 78%,与 77%的全国加权平均水平相似。然而,有趣的是,C-min 县几乎全是白人,平均 91%: 与少数民族的相关性相反

简而言之,数据显示对少数民族,特别是非洲裔美国人和西班牙裔美国人高度集中的社区产生了不成比例的影响。此处也提供了其他少数族裔群体(即美洲原住民、亚裔美国人)的可视化数据,尽管它们并未显示出与感染率的显著相关性。

新冠肺炎和其他县属性

除了种族之外,该数据集还允许我们探索新冠肺炎的影响如何与其他县的属性相关联。(下面,我指的是我在上面使用的与种族相同的 C-max 和 C-min 县。)

C-max 和 C-min 县的教育与感染率

数据集中的教育启发由每年获得大学同等学力或大专文凭(在县一级)的人的大致百分比决定。下面,您可以看到 C-max 和 C-min 县各自的试探法。

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

C-max 县

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

C-min 县

在 C-max 县,教育指标平均为 6.5%,在 C-min 县,约高出 0.8%,为 7.3%。这可能意味着这种启发和感染率之间可能存在相关性,但肯定需要进一步的研究来验证这一点。

人口密度

使用 C-max 和 C-min 县作为 x 轴,我在下图的 y 轴上绘制了近似的人口密度(每平方英里的人口数)。

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

C-max 县

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

C-min 县

C-max 县的平均人口密度为每平方英里 791 人,而 C-min 县仅为 66 人,这意味着感染率和人口密度之间存在明显的相关性。

收入

作为收入的衡量标准,我使用了中等家庭收入,这是我为 C-max 和 C-min 县绘制的图表。

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

C-max 县

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

C-min 县

C-max 县的平均收入为 47 138.10 美元,而 C-min 县的收入约为 53 235.80 美元:相差 6 097.70 美元。虽然这可能表明感染率较低的县比感染率高的县收入高,但数据的差异不足以让我们确定收入是否确实在感染率中起作用。

失业

为了确定各县的失业率,我收集了最新的数据,并与 C-max 和 C-min 县进行了比较。

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

C-max 县

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

C-min 县

C-max 县和 C-min 县的平均失业率分别为 3.6%和 3.9%。尽管这可能看起来与人们的预期相反,但同样,像这样的小规模差异不能单独决定失业率和感染率之间是否存在相关性。

掩模要求

虽然目前没有关于县级口罩需求的数据,但有全州范围内的数据。在下面的表格中,我将 C-min 县和 C-max 县的感染率放在一起,为了简单起见,每个县都减少到 10 个县。

此外,对于 C-min 县,我使用了阳性感染率最低的 10 个县来关注口罩相关政策实际上可能对感染产生影响的县。

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

C-max 与全州面罩要求

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

C-min 与全州面罩要求

在 C-max 县中,4 个县有全州范围的口罩要求,其他 6 个县是仅在部分地区要求口罩的州的一部分。另一方面,10 个 C-min 县中有 8 个要求戴口罩,而包含另外 2 个县的州在某些地方要求戴口罩。虽然这似乎不是一个值得注意的差异,但我们需要在做出声明之前进一步解读一些国家的“某些部分”特征。

如果我们看看 C-max 县,根据 WBSTV密西西比州今日县口罩佛罗里达州政治的报道,在“某些部分”有全州范围口罩要求的县完全被排除在强制规定之外,所以 10 个县中有 6 个根本不需要口罩。然而,在 C-min 县,普拉特县(WY)和巴伯县(KS)都很小,不需要口罩,很可能是因为他们缺乏病例(根据 AARP县口罩)。一般来说,感染率最高的县有 60%不需要口罩,阳性率最低的县有 80%需要口罩

一般来说,教育、收入、失业和口罩需求等县属性仅表现出与感染率的名义关系,值得进一步研究。然而,人口密度似乎与感染率密切相关,这进一步证明了人与人之间的距离确实会影响新冠肺炎病毒的传播。

结论

我希望该数据集对郡工作人员、学校管理人员和公共卫生官员有用,让他们更好地了解趋势和郡属性,从而确定风险并做出与新冠肺炎相关的适当决策。数据集将每天更新,除了可视化,数据还将作为方便用户的工具发布在网站上。将来,我计划在县一级拟合一个模型来帮助预测未来的新冠肺炎数据。如果有任何想法或意见,请在 kabirmoghe@gmail.com留言给我!

参考文献:

[1]约翰·霍普金斯大学医学系,新冠肺炎美国各县病例 (2020),约翰·霍普金斯冠状病毒资源中心

[2]美国疾病控制和预防中心,美国疾病控制和预防中心 COVID 数据追踪器 (2020),美国疾病控制和预防中心

[3]《纽约时报》,冠状病毒在美国:最新地图和病例统计 (2020),纽约时报

[4]麻省理工学院, COVIDAnalytics (2020,COVIDAnalytics

[5] USAFacts 研究所,美国冠状病毒病例和死亡 (2020),USAFacts

[6]美国农业部,县级数据集 (2020),美国农业部经济研究局

[7]美国人口普查局,/programs-surveys/popest/datasets/2010–2019/counties/asrh 索引 (2020),美国商务部

[8] ArcGIS Hub, (2020),ArcGIS Hub

【9】Howard,Jeremy,et al .美国哪些州要求在公共场合戴口罩? (2020),#Masks4All

[10]WSBTV.com 新闻工作人员,完整列表:哪些城市和县要求戴口罩? (2020),北京电视台

[11] Harrison,Bobby 等人,随着病例激增,州长在 13 个县强制推行口罩 (2020),今天的密西西比州

[12]堪萨斯商会,郡面面具—堪萨斯商会 (2020),堪萨斯商会

[13]雅各布·奥格尔斯(Ogles,Jacob),面纱之后:佛罗里达州对戴口罩有什么要求? (2020),佛罗里达政治

[14]马克维茨,安迪,各州面罩要求指南 (2020),美国退休人员协会

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值