当您的 Docker 与 Pyspark 会面,对 10gb 以上的客户评论数据进行情感分析时——第 1 部分
在这篇博客中,我将向您展示如何轻松使用 Pyspark 来处理千兆字节规模的数据集。好了,让我们开始吧:
开始!(图片来自@Pixabay 的@Pexels)
设置 Docker 引擎
现在,docker 将用于轻松下载 jupyter/pyspark docker 映像,然后使用它进行分布式处理。所以,你必须知道的第一件事就是你的 OS 是否有 Docker 引擎。
Linux 用户在这方面不会有问题,他们只需按照说明在他们的操作系统中设置 docker,链接如下:
【Linux 用户 Docker 手册:
对于 Windows 和 Mac 用户,您可以通过官方链接来设置 docker 引擎:
注:如果你是一名数据科学家/分析师,在阅读这篇文章时,我强烈推荐你使用 Linux 操作系统发行版,因为它真的会对你有所帮助,尤其是在将数据科学成果投入生产的时候。
现在,有了 Docker 引擎,我们必须做的下一件事是获得 pyspark 图像(如果您没有的话)。这可以通过 bash 中的以下命令轻松完成:
这是一个有点大的文件(大约 4.5GB),在提取后,我们需要使用命令行仔细检查我们的图像:
这是我们本地机器中所有图像的列表,我们可以看到jupyter/pyspark-notebook是我们将使用的图像之一:
现在,如果你的清单上有 jupyter/pyspark 笔记本,那太好了!
来源:疯狂宝贝 via: @imgflip
将本地目录连接到 Docker 容器
现在,您有了一个讨论大数据的 spark 映像。现在,由于大多数情况下,我们的大数据不在 docker 所在的目录中,我们需要将大数据集移植到容器,这样容器就可以直接访问数据,在我的例子中,以下代码进行了这种装载(我将在下面分解):
好了,我们来破解上面的代码,全面了解一下:
因此,它将流量从我们机器上的端口 8888 传递到 Docker 映像上的端口 8888,在本例中为(jupyter/pyspark-notebook)
在这里,用本地工作目录替换“~/Documents/pyspark_docker”。这个目录将被容器访问,这就是选项“-v”在代码中所做的。该目录可能是空的,您稍后将需要放一些文件。所以,如果你完成了上述步骤,现在 Jupyter 笔记本应该会出现在你的浏览器中,你将会有你的数据的确切路径。现在,如果您已经达到了这个阶段,那么恭喜您,现在您已经准备好使用大数据了:
来源:像素
在这项工作中,yelp 数据集将用于 spark 的分布式计算。此链接提供的 Yelp 数据集将被用作典型的商业大数据:
【Yelp 数据集的开源链接
对于这个特定的数据,我发现这个博客对数据的数据建模很有帮助,如下所示:
来源:保罗·谢,via:
开始与 Spark 会话的数据争论
设置 Pyspark
通过 Spark 读取审查数据
仅从数据的规模来看,我们有大约 8000 万条评论,确实是一个大数据!:
来源:https://changhsinlee.com/pyspark-udf/,转自:张信利
number of rows:8021122
number of columns:9
root
|-- business_id: string (nullable = true)
|-- cool: long (nullable = true)
|-- date: string (nullable = true)
|-- funny: long (nullable = true)
|-- review_id: string (nullable = true)
|-- stars: double (nullable = true)
|-- text: string (nullable = true)
|-- useful: long (nullable = true)
|-- user_id: string (nullable = true)
情感分析
在下面的代码中,我定义了 text_processing 函数,该函数将删除标点符号,使所有评论变成小写,并删除英文停用词:
在这一步中,您可能需要运行以下代码来安装 NLTK 包。
/opt/conda/lib/python3.7/site-packages/sklearn/utils/deprecation.py:144: FutureWarning: The sklearn.feature_extraction.stop_words module is deprecated in version 0.22 and will be removed in version 0.24\. The corresponding classes / functions should instead be imported from sklearn.feature_extraction.text. Anything that cannot be imported from sklearn.feature_extraction.text is now part of the private API.
warnings.warn(message, FutureWarning)
添加 clean_text 列
+--------------------+--------------------+
| clean_text| text|
+--------------------+--------------------+
|worked museum eag...|As someone who ha...|
|actually horrifie...|I am actually hor...|
|love deagans real...|I love Deagan's. ...|
|dismal lukewarm d...|Dismal, lukewarm,...|
|oh happy day fina...|Oh happy day, fin...|
+--------------------+--------------------+
only showing top 5 rows
好了,现在我们有了干净的文本,是时候做情感分析来看看每个评论的分数了
+-----+--------------------+
|score| clean_text|
+-----+--------------------+
| 21.0|worked museum eag...|
|-11.0|actually horrifie...|
| 13.0|love deagans real...|
| -7.0|dismal lukewarm d...|
| 26.0|oh happy day fina...|
+-----+--------------------+
only showing top 5 rows
root
|-- business_id: string (nullable = true)
|-- cool: long (nullable = true)
|-- date: string (nullable = true)
|-- funny: long (nullable = true)
|-- review_id: string (nullable = true)
|-- stars: double (nullable = true)
|-- text: string (nullable = true)
|-- useful: long (nullable = true)
|-- user_id: string (nullable = true)
|-- clean_text: string (nullable = true)
|-- score: float (nullable = true)
根据审查分数对业务进行分组
在这里,我对所有业务的平均分进行分组:
root
|-- business_id: string (nullable = true)
|-- avg(score): double (nullable = true)
209393
在 Markdown 中写入介质?试试马克迪姆!
当回归模型的误差包含两个峰值时
(图片由作者提供)
关于处理双峰残差的 Python 教程
原始残差是实际值和由经过训练的回归模型预测的值之间的差值。
残差=实际值-预测值(图片由作者提供)
残差的频率分布图可以很好地判断模型是否正确指定,即模型是否是数据集的正确模型,是否考虑了所有重要的回归变量,以及模型是否以无偏的方式拟合了数据。
您通常希望看到的是以零为中心的正态分布残差图,如下所示。
残差的正态分布频率图(图片由作者提供)
残差的正态分布频率图是一个精选的、合适的模型的标志。
但残差图往往是偏斜的,或者有厚尾或者薄尾,有时也不是以零为中心。有办法解决这些问题。有时人们不得不接受某种程度的不正常。
在本文中,我将向您展示当您的模型的残差变成双峰时该怎么办,即它们有两个峰值而不是一个,如下所示:
双峰频率分布(图片由作者提供)
数据集
我们将使用为期两年的租赁自行车日常使用数据集。以下是数据集的前 10 行:
租赁自行车使用计数(来源: UCI 机器学习库)(图片由作者)
数据集中的变量如下:
瞬间:行索引
dteday :以 dd-MM-yy 格式进行测量的日期
季节:当时的天气季节
年:当时的年份:0=2011,1=2012
月:当时的月份:1 日至 12 日
节假日:测量是否在节假日进行(T16) no=0)
weekday :星期几(0 到 6)
工作日:测量是否在工作日进行(yes=1,no=0)
weathersit :当天天气情况:1 =晴朗,少云,部分多云,部分多云。 2 =薄雾+多云,薄雾+碎云,薄雾+少云,薄雾。3 =小雪,小雨+雷雨+散云,小雨+散云。4 =暴雨+冰托盘+雷雨+薄雾,雪+雾。
temp :温度,归一化到 39C
atemp :真实手感,归一化到 50C
嗡嗡声:湿度,归一化到 100
风速:风速,归一化到 67
休闲 _ 用户 _ 计数:休闲自行车租赁者计数
注册 _ 用户 _ 计数:注册(会员)自行车计数
你可以从这里下载数据集。
回归模型
我们将建立一个回归模型,其中因变量为 registered_user_count ,而解释变量或所谓的协变量如下:
季节、月份、假日、工作日、工作日、天气、温度、atemp、哼声、风速。
由于我们正在建模计数,我们将使用 Python statsmodels 库中的泊松回归模型。
让我们从导入所有必需的包开始:
**import** pandas **as** pd
**from** patsy **import** dmatrices
**import** numpy **as** np
**import** statsmodels.api **as** sm
**import** statsmodels.stats.stattools **as** st
**import** matplotlib.pyplot **as** plt
将数据集加载到 Pandas 数据框中:
df = pd.read_csv(**'bike_sharing_dataset_daywise.csv'**, header=0, parse_dates=[**'dteday'**], infer_datetime_format=True)
创建训练和测试数据集:
mask = np.random.rand(len(df)) < 0.8df_train = df[mask]df_test = df[~mask]print(**'Training data set length='**+str(len(df_train)))print(**'Testing data set length='**+str(len(df_test)))
用 Patsy 语法创建回归表达式。我们说 registered_user_count 是因变量,它依赖于~右侧提到的所有变量。
expr = **'registered_user_count** ~ **season** + **mnth** + **holiday** + **weekday** + **workingday** + **weathersit** + **temp** + **atemp** + **hum** + **windspeed'**
设置 X、y 矩阵:
y_train, X_train = dmatrices(expr, df_train, return_type=**'dataframe'**)y_test, X_test = dmatrices(expr, df_test, return_type=**'dataframe'**)
建立和训练泊松回归模型:
poisson_training_results = sm.GLM(y_train, X_train, family=sm.families.Poisson()).fit()
poisson_training_results 是一个类型为 GLMResults 的对象。打印模型摘要:
print(poisson_training_results.summary())
这会打印出以下内容:
拟合泊松回归模型的输出(图片由作者提供)
很高兴看到所有的模型系数在 p 值为< 0.001 i.e. at 99.999% confidence level.
As against linear regression models, models in which the dependent variable is a count, rarely produce normally distributed residual error distributions.
So we have to normalize the raw-residuals using other means. Three popular transformations are:
- The Pearson residual
- The Anscombe residual
- The Deviance residual
Statsmodels makes all three kinds of residual errors available to us via GLMResults. resid_pearson 时都具有统计显著性。 resid_anscombe ,以及 GLMResults。 resid_deviance 变量
原始残差在 GLMResults 中可用。 resid_response 。
我们将打印出所有 4 种残差的偏度和峰度,看看哪一种是最正态分布的。完美的正态分布的偏斜度为零,峰度为 3.0。
**raw_residual_skewness** = st.**robust_skewness**(poisson_training_results.**resid_response**)[0]**pearson_residual_skewness** = st.**robust_skewness**(poisson_training_results.**resid_pearson**)[0]**anscobe_residual_skewness** = st.**robust_skewness**(poisson_training_results.**resid_anscombe**)[0]**deviance_residual_skewness** = st.**robust_skewness**(poisson_training_results.**resid_deviance**)[0]
**raw_residual_kurtosis** = st.**robust_kurtosis**(poisson_training_results.**resid_response**)[0]**pearson_residual_kurtosis** = st.**robust_kurtosis**(poisson_training_results.**resid_pearson**)[0]**anscobe_residual_kurtosis** = st.**robust_kurtosis**(poisson_training_results.**resid_anscombe**)[0]**deviance_residual_kurtosis** = st.**robust_kurtosis**(poisson_training_results.**resid_deviance**)[0]
residual_stats = [
[**'Raw residual'**, raw_residual_skewness, raw_residual_kurtosis],[**'Pearson\'s residual'**, pearson_residual_skewness, pearson_residual_kurtosis],
[**'Anscombe residual'**, anscobe_residual_skewness, anscobe_residual_kurtosis],
[**'Deviance residual'**, deviance_residual_skewness, deviance_residual_kurtosis]
]
residual_stats_df = pd.DataFrame(residual_stats, columns=[**'Residual'**, **'Skewness'**, **'Kurtosis'**])
print(residual_stats_df)
这会打印出下表:
我们正在寻找偏度最接近零、峰度最接近 3.0 的残差类型。考虑到该表中所有值的接近程度,很难从该表中选择合适的残差类型。我们将选择皮尔逊残差,因为它的偏斜度最接近于零。
让我们绘制皮尔逊残差的频率分布图:
poisson_training_results.resid_pearson.**hist**(bins=50)plt.show()
我们看到以下双峰分布!
回归误差(皮尔逊残差)似乎具有双峰分布(图片由作者提供)
这里发生了什么导致了双峰回归误差?
当回归误差为双峰时,可能会出现以下几种情况:
因变量是二元变量,如赢/输、死/活、涨/跌等。但是你的回归模型可能会生成预测,一个连续变化的实值。所以如果你编码了(赢=1,输=0),或者(死=0,活=1)等等。并且您的回归模型在 0.5 附近的狭窄范围内生成预测值,例如 0.55、0.58、0.6、0.61 等,那么回归误差将在零的一侧(当真实值为 0 时)或零的另一侧(当真实值为 1 时)达到峰值。
如果您没有为数据集选择正确的回归模型,和/或您缺少关键的解释变量,而没有这些变量,大多数预测都徘徊在 0.5 左右,这又会发生。
在我们的例子中,因变量是计数,我们使用了一个适合计数的模型,即泊松模型,因此可以排除上述情况。
双峰残差的另一个原因是,人们可能遗漏了一个二元回归变量,该变量以下列方式影响输出值:
当变量值为 0 时,输出范围在一定范围内。
当变量的值为 1 时,输出将呈现一个全新的值范围,这是以前的范围中所没有的。
事实证明,在我们的例子中确实如此!我们忽略了二元变量 yr(观察年份),它有两个值:0 = 2011 年,1 = 2012 年。
我们来看看 yr 是如何影响因变量 registered_user_count 的。我们将绘制注册用户数与您的年数的关系图:
df.plot.scatter(**'yr'**, **'registered_user_count'**)plt.show()
注册用户数与年份(图片由作者提供)
位于红圈的注册用户计数的所有值仅在年份=1 时出现,即 2012 年。由于我们在模型中忽略了 yr,我们的模型无法解释更高值计数的存在。每次实际值在 5000–7000 范围内时,它都会产生系统误差,导致残差图中出现第二个峰值。
如果这个理论是正确的,将 yr 加入到模型中应该可以解决残差的双峰问题。因此,让我们将 yr 添加到回归表达式中,并再次构建和训练模型:
*#Set up the regression expression. This time, include yr.* expr = **'registered_user_count ~ yr + season + mnth + holiday + weekday + workingday + weathersit + temp + atemp + hum + windspeed'** *#Set up the X and y matrices for the training and testing data sets* y_train, X_train = **dmatrices**(expr, df_train, return_type=**'dataframe'**)y_test, X_test = dmatrices(expr, df_test, return_type=**'dataframe'**)
*#Using the statsmodels GLM class, train the Poisson regression model on the training data set* **poisson_training_results** = sm.**GLM**(y_train, X_train, family=sm.families.**Poisson**()).**fit**()
*#print out the training summary* print(poisson_training_results.**summary**())
这会产生以下输出:
泊松回归模型结果(图片由作者)
这一次,请注意 yr 是回归变量之一,其系数在 99.999%的置信水平下具有统计显著性。
此外,该模型的对数似然比是-52683,这比没有 yr 的先前模型的对数似然比(-114530)大得多。对数似然是一种拟合优度的度量。在这种情况下,它表明添加 yr 大大提高了模型的拟合优度。这与我们的理论一致,yr 的缺失阻止了我们的模型解释所有这些高值计数。
到目前为止一切顺利。
让我们检查包含 yr 的修正模型的所有 4 种残差:
**deviance_residual_skewness** = st.**robust_skewness**(poisson_training_results.**resid_deviance**)[0]
**raw_residual_kurtosis** = st.**robust_kurtosis**(poisson_training_results.**resid_response**)[0]**pearson_residual_kurtosis** = st.**robust_kurtosis**(poisson_training_results.**resid_pearson**)[0]**anscobe_residual_kurtosis** = st.**robust_kurtosis**(poisson_training_results.**resid_anscombe**)[0]**deviance_residual_kurtosis** = st.**robust_kurtosis**(poisson_training_results.**resid_deviance**)[0]
residual_stats = [
[**'Raw residual'**, raw_residual_skewness, raw_residual_kurtosis],[**'Pearson\'s residual'**, pearson_residual_skewness, pearson_residual_kurtosis],
[**'Anscombe residual'**, anscobe_residual_skewness, anscobe_residual_kurtosis],
[**'Deviance residual'**, deviance_residual_skewness, deviance_residual_kurtosis]
]
residual_stats_df = pd.DataFrame(residual_stats, columns=[**'Residual'**, **'Skewness'**, **'Kurtosis'**])
**print**(residual_stats_df)
(图片由作者提供)
皮尔逊残差再次以接近于零的偏斜度在所有产品中表现出色。虽然,原始残差的峰度最接近 3.0。
让我们绘制修正模型的皮尔逊残差的频率分布图:
df.plot.scatter(**'yr'**, **'registered_user_count'**)plt.show()
模型的皮尔逊残差的频率分布(图片由作者提供)
这一次,随着 yr 变量的加入,双峰现象在很大程度上消失了。
让我们并排看两个图,左边没有 yr,右边有 yr:
回归残差(左=没有 yr 的模型,右=有 yr 的模型)(图片由作者提供)
通过引入一个重要的二元回归变量,我们成功地修正了残差中的大部分双峰。添加缺失的变量也大大提高了模型的拟合优度。
让我们获取模型对测试数据集的预测,我们还将绘制预测计数与实际计数的对比图:
*#fetch the predictions* **poisson_predictions** = poisson_training_results.**get_prediction**(X_test)*#.summary_frame() returns a pandas DataFrame* predictions_summary_frame = poisson_predictions.**summary_frame**()*#print the predictions* **print**(predictions_summary_frame)*#The* ***mean*** *column contains the predicted count* predicted_counts=predictions_summary_frame[**'mean'**]*#get the actual count from y_test* actual_counts = y_test[**'registered_user_count'**]
*#Plot the predicted counts versus the actual counts for the test data.* fig = plt.figure()fig.suptitle(**'Predicted versus actual user counts'**)predicted, = plt.plot(X_test.index, predicted_counts, **'go-'**, label=**'Predicted counts'**)actual, = plt.plot(X_test.index, actual_counts, **'ro-'**, label=**'Actual counts'**)plt.legend(handles=[predicted, actual])plt.show()
我们得到如下的情节:
预测数量与实际数量的对比(图片由作者提供)
以下是本文中使用的完整源代码:
源代码
你可以从这里下载数据集。
进一步阅读的建议
…以及使用综合 K 平方和 Jarque–Bera 正态性检验的分步指南
towardsdatascience.com](/testing-for-normality-using-skewness-and-kurtosis-afd61be860) [## 泊松回归模型图解指南
和使用 Python 的泊松回归教程
towardsdatascience.com](/an-illustrated-guide-to-the-poisson-regression-model-50cccba15958)
数据集的引用:
Fanaee-T,Hadi 和 Gama,Joao,“结合集合检测器和背景知识的事件标记”,《人工智能进展》(2013):第 1–15 页,Springer Berlin Heidelberg,doi:10.1007/s 13748–013–0040–3。
感谢阅读!如果你喜欢这篇文章,请关注我的Sachin Date获取关于回归和时间序列分析的技巧、操作方法和编程建议。
英国哪些地方的人最脆弱?
与英国和世界其他地区一样,随着疫情继续发展,病例和死亡人数持续上升,我们一直在观察新冠肺炎的影响。
鲍里斯·约翰逊(Boris Johnson)实施英国封锁后,这是政府要求志愿者的新闻头条之一:
在英国,据估计有超过 150 万人患有潜在的健康疾病。这些人被要求呆在家里 12 周以保护自己免受病毒感染。这意味着他们将需要帮助来完成他们习惯做的日常活动,如购买食品杂货和去看医生。
对此,政府发出请求,要求志愿者在隔离持续期间支持国民保健服务。几天之内就有 50 万人注册了!这被认为是一个巨大的成功,因为政府只期待其中的一半。几天后,这一数字增加到 75 万名志愿者,政府被迫暂停任何新的申请,以便他们能够处理已经收到的申请。
这个分析的目的是什么?
然而,考虑到弱势人群遍布英国,英国国民医疗服务体系如何确保他们有足够的志愿者为最需要帮助的人提供帮助?这项分析旨在确定英国哪些地方是弱势人群高度集中的地区,以及 NHS 志愿者应该把工作重点放在哪里。
数据来源和假设是什么? 本次分析使用的数据来源有:
- 国家统计局 2018 年年中人口估计数。该数据集按性别、地区和年龄提供人口估计数。
- ONS 2016-2018 年健康预期寿命和无残疾预期寿命。该数据集提供出生时和 65 岁时的预期寿命、健康预期寿命和无残疾预期寿命,按性别和地区分列。
两个数据源都是从国家统计局网站上以 Excel 格式下载的。数据转换和合并是通过使用 Tidyverse 库在 R 中完成的。有关源代码和代码的更多细节,请参见源代码部分
基于数据源中已经应用的假设,应用了以下定义:
- 老年人是指居住在英国的 65 岁以上的人
- “健康状况良好”是指健康状况“非常好或良好”,日常活动“没有”限制
这两个来源按地区和区域级别进行了组合,以便进行有意义的粒度分析。
英国最老的人口在哪里?
人口估计数据集拥有英国每个年龄、性别和地区的人口估计数。在这种情况下,通过使用特定老年人的比例,我们可以确定英国人口比例较高的地区。在这种情况下,为了与预期寿命数据集保持一致,这个阈值被设置为 65 岁。
下图显示了 65 岁以上人口比例最高的地区。
从这张图中可以看出,五个最古老的地区中有三个位于英格兰南部,另外两个位于威尔士。比例最高的地区,65 岁以上人口超过 25%。比例最低的五个地区仅占 5%多一点,全部位于伦敦。
英国最不健康的人群在哪里? 健康预期寿命数据集具有可用的预期寿命数据、健康状况良好的预期寿命和无残疾的预期寿命,以执行各项活动。这一数据是按性别、地区和出生时以及年满 65 岁的人的预期寿命计算的。该数据集可用于识别健康状况良好的预期寿命较低的群体。
要找出英国最不健康的人群,首先要做的是计算健康预期寿命和无残疾预期寿命之间的平均值,作为总体健康寿命的近似值。这个数字将代表一个人在 65 岁时健康状况良好的寿命。
下图按区域显示了最低和最高的健康预期寿命:
平均寿命最低的地区在健康状况良好的情况下不会活到 73 岁。在最低的五个地区中,有两个位于威尔士。将这些数字与下图中预期最高的地区进行比较,人们将平均多活五年
英国大多数最不健康的地区在哪里?通过结合人口百分比和健康年龄预期这两个指标,有可能确定英国许多潜在弱势人群集中的地区。
- 每个点代表英国的一个地区;点的大小代表总体人口。
- 每个点的蓝色阴影代表每个区域在地理上的位置。
如下图所示,英国最脆弱的地区(65 岁以上人口比例最高,健康寿命最低)位于左上角区域:
英格兰北部和南部相比如何?
可以看到,较暗的颜色倾向于聚集在右下角,表明英国南部倾向于拥有更年轻、生活状态更健康的人口。
相比之下,西北和东北地区主要集中在图表的左上方,表明它们比南方更脆弱。
与全国其他地方相比,伦敦怎么样?
伦敦的大部分地区位于右下角,其中几个地区达到了最高的健康预期寿命。
某个地区与全国其他地区相比如何?
本分析中显示的图形是使用 Tableau 生成的,允许用户与数据可视化进行交互。这一分析已上传到 Tableau Public,使每个人都可以通过网络浏览器使用任何平台来使用它,而无需使用任何特定的软件。
只能通过以下链接http://bit.ly/UKVulnerablePeople访问数据可视化。
从这个分析中我们可以总结出什么?
我们的分析表明,通过在数据可视化工具中使用来自国家统计局的数据,我们可以识别弱势人群的主要地区,即健康预期寿命低的老年人比例较高。这表明有一种趋势,即英格兰南部的健康预期寿命高于英格兰北部,而伦敦的老年人比例最低。
这种分析结合交互式可视化工具可以用来识别可能需要更多 NHS 志愿者的领域。截至 4 月 6 日,NHS 志愿者的申请仍处于暂停状态,最初收到的 750,000 份申请没有进一步的分配通知。
我从这项分析中学到了什么?做这个分析的原因之一是将我的一些“呆在家里”的时间用在一些不同于网飞的事情上!但出于玩笑,我认为使用我的数据科学技能可能是有价值的,如果在使用这个工具后会感到更受鼓励来支持他们的社区。最后,这也有助于我通过使用国家统计局的数据,更好地了解英国的社会人口状况
本分析的来源
——BBC 文章:
https://www.bbc.co.uk/news/uk-52029877
-英国、英格兰和威尔士、苏格兰和北爱尔兰的人口估计:2018 年年中,使用https://www . ons . gov . UK/peoplepulationandcommunity/populationandmigration/populationestimates/datasets/populationestimates forukenglandwalesscotland Northern Ireland
-ONS 2016–2018 年健康预期寿命和无残疾预期寿命
https://www . ONS . gov . uk/peoplepulationandcommunity/healthandssocial care/healthandlifeexpectancyattbirthandage 65 bylocalareasuk
-R 代码和 Tableau 仪表板也可以在下面的 GitHub 资源库
https://github.com/eduardo-cc/UKVulnerablePeople中找到
特别感谢来自 4most 的 Jenika Karsan 帮助我校对和编辑这篇文章!
最初发表于http://speakthedata.com和https://www.4-most.co.uk。
AI &机器人恐惧疫情去了哪里?和它的支持者一起隐藏
为什么机器人、自动化和人工智能的恐惧传播反对者今天躲在一块石头下面?新冠肺炎缺陷告诉你为什么。让他们呆在那块石头下面。
机器人和人工智能,世界末日错位的罪魁祸首。图片来源
自从锁定以来,我对时间的感知已经发生了很大的扭曲……感觉像是 20 年,但这是两年多一点前,当埃隆·马斯克(Elon Musk)第无数次警告人工智能和机器人时,根据他(和其他一些错误的信息)的说法,这是我们即将到来的世界末日最可能的原因。
2017 年 9 月,这对我来说终于太多了,为了与其他许多真正的人工智能科学家和企业家分享我的观点,我在美国消费者新闻与商业频道接受了采访,解释了为什么这完全是错误的和误导的。
警告总是来自那些不擅长人工智能的人:如果他们擅长,他们会意识到错误地建造天网就像我 3 岁的孩子意外地用乐高积木建造了一个功能正常的空间站一样。
马斯克和他的朋友们没有考虑到大规模部署人工智能和机器人技术所带来的巨大价值。讽刺和虚伪的是,由于特斯拉的汽车利用人工智能来避免撞到东西和人…
【2020 年 4 月:故事发生了怎样的变化
在与今天发生在我们许多人生活中的最接近世界末日的事情的斗争中,智能、自主机器人在哪里?
无处可寻。特别是在那些最需要他们的关键部门——在这些部门,员工要么处于高风险状态,如医疗保健行业,要么不能去,如制造业。
而且不要被制造业是机器人为王的地方的虚假形象误导。人类是工厂里的国王……当他们不在的时候,工厂就会关闭。
在撰写本文时,意大利已有 60 多名医生死于新冠肺炎病毒,西班牙有超过 12000 名医护人员被感染。在美国,情况没有太大的不同,明尼苏达州和俄亥俄州分别报告了 28%和 16%的案件涉及医生或护士。
智能机器人在哪里帮助医生和护士完成最重复和潜在危险的任务?哪里部署了强大的人工智能诊断工具来帮助简化和减轻医疗保健工作者的负担?哪里的工厂在人类被隔离期间基本上自主地进行生产?
虽然已经进行了一些谨慎的尝试,例如用配备紫外线灯的机器人给医院消毒,但是还没有大规模部署来改变现状。
因此,关键的医护人员独自在飞行中,工厂被关闭。
历史重演:拍 2!
人工智能机器人在危险情况下替代和增强人类?我以前在哪里听过这句话?!
2010 年,当我还在波士顿大学担任人工智能教授时,美国国家航空航天局(NASA)联系了我的实验室,设计能够驱动自主机器人在没有人类监督的情况下探索未知领域的人工智能。需求是明确的:美国国家航空航天局对冒着生命危险去探索遥远的、有潜在危险的环境不感兴趣,他们想设计具有类似人类能力和自主性的智能机器人来接管这些任务。
2020 年,新冠肺炎疫情也有同样的需求。这一次,不是为了宇航员去火星,而是为了帮助护士和医生进行日常的危险互动,这可能会使成千上万的人面临感染的风险,最好的情况是将他们隔离,最坏的情况是杀死他们。
让他们停下
在过去几年中,围绕人工智能、自动化和机器人的辩论总是不幸地集中在失业的主题上,往好了说是末日。太多的人聚集起来反对自主机器人的发展,因为害怕无所不知的邪恶人工智能接管世界……如果这些人工智能机器人被开发出来并投入使用,以帮助应对新冠肺炎等流行病,或许它们本可以挽救生命。也许我们可以部署成千上万的智能机器人和人工智能技术,在此过程中拯救许多生命。
没有一个护士或医生会因为他们而丢掉一份工作!
事实上,自动化和机器人不仅可以拯救生命,而且可信的研究表明,它们并不是许多领域失业的根本原因,比如制造业。根据麻省理工学院最近的一份报告,美国和欧盟制造业的失业是由亚洲的低工资工人造成的,而不是机器人。
当我 20 年前加入人工智能领域时,我坚信人工智能、机器人和自动化将帮助我们解决面前的巨大挑战。不幸的是,新冠肺炎在 2020 年作为这样的挑战之一出现,却发现我们完全没有准备。
我们本可以做得更好。让我们确保在下一个挑战中,我们拥有最好的技术来帮助自动化任务,简化人类的工作,并让他们摆脱你不希望他们处于的境地。
数据科学训练营将何去何从?
克里斯·蒙哥马利在 Unsplash 上的照片
在一个远程教育和雇佣减少的世界里,这种模式还有意义吗?
我之前写过我参加数据科学训练营的经历。我非常喜欢它,并且非常深情地回忆起我的经历。我也感谢我的幸运星,我去年完成了这个项目,而不是今年。随着公司放缓或完全冻结招聘,数据工作市场已经放缓至爬行状态(经验丰富的数据科学家和分析师的竞争使情况变得更糟,他们受到裁员的影响或寻求退出正在衰落的公司)。
数据科学训练营面临着巨大的挑战,他们需要不断发展以保持业务活力。今天的文章探讨了数据科学训练营行业面临的挑战和机遇。
如果没有工作,没有友情,价值何在?
训练营的目的一直是尽可能快地找到一份技术工作(尽可能少的时间和金钱)。与传统教育不同,这里没有学位,只有一张结业证书,老实说,这对雇主来说没什么意义。
相反,训练营试图利用(1)他们的关系(充其量也是有限的),(2)你自己对失业的绝望,以及(3)和志同道合、同样绝望的同龄人在一起的动力,作为加速求职过程的催化剂。要求你辞去以前工作的全职数据科学训练营实际上是对你自己的一种赌注,这种赌注就是你将能够学习材料,获得面试机会,并在面试中有效地传达你的新知识。
根据我的经验,我发现(2)和(3)比(1)有效得多。在完成我的队列的大约 20 名学生中,只有 4 人通过训练营的直接联系找到了工作。但是我们其余的人从频繁的学习小组、合作和纯粹的约会中找到了很多动力。是的,我们本可以免费得到那个角色——但是在紧要关头,很难找到一群志同道合的人(还有失业者!)有这种积极性的朋友(没有什么比花大价钱更能激励人们从某样东西中获取价值了)。记住,当我们都开始找工作的时候,我们已经一起学习、工作和约会了 3 个月。尽管我现在很喜欢我的工作,但我经常深情地回忆起那些充满压力但又充满乐趣的日子。
同样,一旦人们找到了工作,他们也不会突然忘记自己的伙伴。我们都努力向同伴推荐机会——最终有两个人通过训练营朋友的推荐找到了工作(还有几个人通过他们的同学获得了面试机会)。
存在的价值
对我来说,由于缺乏更好的措辞,在那里有很多价值。我发现训练营给我和我的同伴提供了一个学习、探索和找工作的物理基地,这与其他任何市场化服务(如课程和就业安置)一样多,甚至更多。
但是今天,我们学习数据科学的狭小教室将是一个巨大的新冠肺炎风险。因此,大多数训练营,包括我参加的那个训练营,现在都转向了在线形式。这意味着每个人都在家学习和工作,虽然讲座在技术上仍然是现场直播的,但他们不再有那种感觉了。理论上,这看起来没什么不同,但是相信我,亲身经历是非常重要的。我至少不会花 16000 美元购买一个在线训练营。
有了远程学习,就不再需要互相监督来比较、讨论和调试代码了(不,缩放是不一样的)。很少有像这样的课堂互动,学生机敏的问题引发了 25 分钟的讨论(最终每个人都从讨论和好奇心中受益)。没有深夜炸鸡三明治、黑客项目和乒乓球(公平地说,他们在我的同伴之后拆掉了乒乓球室)。
**我想说的是,随着向在线形式的转移,许多让训练营体验变得美妙的微妙东西都消失了。**你签下了经验丰富的导师和职业支持——但当你从另一边走出来时,你会发现 80%的价值实际上来自于你与其他同伴建立的亲密关系和友谊。没有这些,训练营就失去了很多价值。
那么训练营能做什么呢?
不幸的是,没有简单的解决方法。健康安全第一。在一个每个训练营都在线(至少暂时在线)并且数据科学职位空缺较少的世界里,训练营提供者将需要接受这样一个事实,即他们的服务同时价值更低,需求更少。
因此价格下跌(和整合)可能是不可避免的。与此同时,对于勇敢和勤奋的训练营提供者来说,未来一年左右是一个向更好转变的重要机会。数据行业已经不像以前那样炙手可热了——在收入下降的情况下急于削减成本的公司将保留他们的软件工程师(因为他们一直在工作),同时解雇远离业务前线的员工(如数据科学家)。
这并不意味着不再需要分析或数据驱动的洞察力;只是它被搁置了,或者被认为成本太高,目前不值得追求。
这是训练营和他们的学生介入的机会。
一方面,有些公司对数据科学感兴趣,但没有预算支付全职数据人员的市场薪酬。另一方面,数据科学学习者渴望获得实际的实践经验,他们愿意以市场价格的一小部分从事这项工作。那么,为什么不重组训练营的体验来满足这种需求呢?
当前格式
目前,大多数训练营包括 3 个月的教学(和项目工作)。有 4 到 5 个项目,形成你的项目组合,成为你简历上的数据科学子弹。最后的项目通常伴随着对雇佣伙伴的演示。训练营结束后,每周或每两周会有职业服务登记,但除此之外,能否跟上求职步伐取决于你自己。
你可能不知道的一件事是,大多数正式的指导和讲座在 2 个月内结束,最后 4 周主要是做你的期末项目和面试练习。是的,训练营的最后几周有点像自习室(尽管教官和助教会在旁边问问题)。
更好的格式
当前与提议的格式
在我的想象中,训练营将会持续 4 到 5 个月。在前两个月,重点是提高学生的技能**,而后半个月则是让学生团队与实际公司一起从事数据科学咨询工作。**
训练营提供者有两个缺点。首先,一个更长的训练营意味着一个给定的地点一年只能毕业 2 到 3 批,而不是现在的 4 批;因此,在其他条件相同的情况下,供应商赚的钱会更少。其次,提供者需要在报名之前做更多的跑腿工作——他们需要为即将入学的学生安排公司和项目。
尽管充满挑战,但这也是实现显著差异化的机会。目前,训练营行业变得越来越商品化(给价格带来下行压力)。因此,无所作为也会导致收入减少。但是如果一个训练营可以通过列出许多有趣的项目来展示价值,那么他们可以收取更高的价格。
这给了训练营提供者的职业服务员工一个更有针对性的目标。目前,职业服务员工扮演着一个奇怪的角色,一部分是啦啦队员,一部分是网络员(试图与公司招聘人员和招聘经理建立联系),一部分是大学就业顾问(修改简历,进行模拟行为面试,并润色学生的 LinkedIn 个人资料)。这有很多工作,很难同时做好。加剧这一挑战的是,每个训练营通常只有一名职业服务人员,他或她不仅需要管理当前队列的求职,还需要管理所有先前队列的持续求职。在我提议的结构中,职业服务员工将从一个多面手变成一个专家,专门与对数据科学咨询感兴趣的公司建立联系(以及一系列酷项目)。
如果训练营提供商及其员工能够成功做到这一点,那么它就能让学生在找工作时处于更有利的位置(因为他们有在实际公司工作的实际经验),并将其产品与只在网上销售的同行区分开来。
显然,所有这一切当面进行会更好,但数据科学咨询也可以远程进行。这与公司喜欢给候选人的带回家作业的扩展版没有太大区别(他们给候选人一个数据集和一些开放式问题,并要求他们尽最大努力)。
结论
以前我建议过某人(不是它!)为有抱负的数据科学家搭建一个匹配数据科学项目和实习的平台。在看到同行努力寻找工作后,我觉得这样一个平台是帮助训练营毕业生和其他有抱负的数据科学家(来自非传统背景)更无缝地突破进入数据科学行业的缺失环节。
我在新冠肺炎之前就写了这篇文章,当时我觉得训练营没有什么动力去修正他们的商业模式。现在情况不同了。生存危机是可怕的——但它也是变得更好的催化剂和机会。已经有大量廉价或免费的学习数据科学的资源(大部分都是高质量的)。但是有抱负的从业者获得实际经验的途径很少。如果数据科学训练营想要保持相关性,那么他们应该想出如何最好地为他们的学生建立这些途径。
为什么要用均方差(MSE)?
从概率角度看均方误差
Genessa panainite 在 Unsplash 上拍摄的照片
大家好。
如果你对机器学习感兴趣,但没有深入研究它背后的概率论,你可能会想知道损失函数从何而来。他们仅仅是因为在实践中效果更好而使用吗?
一个来自knowyourmeme.com(原始网址)的常见模因模板
我想我会分享从 CS109(斯坦福大学计算机科学家的概率论)中获得的一个见解,这是我最近参加的一门课程。我们将回答以下问题:
- MSE 到底是从哪里来的?只是有人猜测一个好的损失函数吗?
- 为什么你想要预测和地面真相之间的差异的平方,而不是只取其绝对值,或将其提高到四次方,或六次方??换句话说,为什么 MSE 效果这么好?
快速品尝一下答案:这取决于我们对数据如何建模的合理假设的本质。
三项免责声明:
- 这不是激励 MSE 的唯一方法,但我确实没有见过,我认为这比“因为在实践中你可以更容易地得到它的导数”更有见地
- 我自己意识到了这一点,但我确信在我之前还有很多人意识到了这一点
- 我假设你熟悉概率(什么是正态分布,不太清楚),但不一定是上过概率论课的水平。如果有,太好了!你可以跳过一些背景。
但首先,了解一些背景知识。
背景
你可能知道,机器学习与概率交织在一起,所以我们将在这里介绍一些相关的概念。
最大似然估计
在很多机器学习中,你的目标是为你的数据找到最佳模型(无论是找到将图像分类为包含猫或狗或其他模型的最佳 convnet)。这背后的一个核心概念是最大似然估计。
什么是最大似然估计?我们将用下面的例子来演示(改编自 Youtube 频道 StatQuest 的这个很棒的视频)。
例子
让我们假设你有一个神秘的正态分布,点被抽样,并说它代表老鼠的体重。
统计学家做的一件有点奇怪的事情是假设数据是从某个模型中抽取的。在这种情况下,我们可以假设这个小鼠体重数据是从正态分布中取样的。现在让我们找到它!(这可能看起来与说一些关于 MSE 的事情非常无关,但请原谅我。)
直觉上,您可能希望正态分布在样本中心附近达到峰值。你也希望正态分布根据样本分布的距离而展开。
所以,你会而不是想要这样的东西
“坏”模型;来源: Youtube/StatQuest
但是你会想要这样的东西吗
一个“好”的模型;来源: Youtube/StatQuest
原来有一种数学方法可以表达一个模型有多“好”(这一节很重要)。我们称之为给定模型的数据的可能性。它可以用函数 L 表示如下,其中θ是模型,I 是样本的指数,f 是概率密度函数(PDF)。
可能性的定义
请注意,在函数 f 中,参数包含一个竖线|。这仅仅意味着我们正在评估函数*,因为*我们使用的是模型θ。
似然性本质上包含所有样本的概率密度的乘积。换句话说,这是对数据集被赋予选择特定模型的可能性的综合衡量。
然后,要找到最佳模型,只需取其“argmax”即可。
最佳模特
实际上,如果足够简单,这将涉及求导,或者如果更复杂,将涉及其他一些优化方法,例如梯度上升。
关于可能性的直觉
为了巩固关于可能性如何工作的一点直觉,考虑所有样本都是 x_i=5.0 的数据集。然后,假设你的模型是一个正态分布,紧紧围绕 x=15。然后,PDF f(x_i|theta)会极小,乘以许多小值会产生一个极小的似然值。
相比之下,考虑正态分布紧紧集中在 x=5.0 附近,正是样本出现的地方。直观来看,这款应该比上一款好很多。我们用似然来验证一下:PDF f(x_i|theta)会非常大,很多大值相乘会产生一个非常大的似然值。更好的模型可能性更大,这和我们的直觉不谋而合。
负对数似然
在实践中,我们实际上稍微修改了一下上面的可能性表达式。首先,我们取可能性的对数。为什么?两个主要原因:
- 这对于浮点运算来说要好得多(你不想因为把一堆小数字相乘而损失精度)。
- 求和的导数比求积更容易。
由于似然性通常位于 0 和 1 之间,因此对数似然性(表示为 L1(θ))将位于负无穷大和 0 之间。
现在考虑最大化负值是很尴尬的,所以我们取其负值,称之为(恰当地命名为)“负对数似然”,而不是最小化这个。这通常成为我们熟悉的常规损失函数(交叉熵损失只是负对数可能性的伪装,但这是另一个故事)。
MSE??
现在,我们将通过一个演示示例来展示 MSE 的来源。
为了简单起见,让我们执行线性回归;即找到最佳拟合线。
线性回归;来源:维基百科/线性回归
现在让我们写下如何对数据建模(在鼠标重量的例子中,我们假设它是通过正态分布生成的)。这正是导致 MSE 的原因。
我们的假设
让我们假设我们的数据是按照如下方式采样的:给定 X 的某个值,Y 完全由 mx+b 确定,该值受到以 0 为中心的正态分布的随机样本的扰动(其中“m”是斜率,“b”是 Y 截距)。这是有意义的,因为直觉上给定一个 X,Y 并不总是精确的 mx+b,而是在 mx+b 附近有一些噪声(现实世界会妨碍)。
从视觉上,你可以想象我们的模型真的只是一堆正态分布沿对角线方向堆叠,形成山脉般的外观。对于那些数学爱好者来说,我们的模型可以表示为
其中“X”是某个变量,参数是“m”和“b”,而“Z”是某个预先确定的具有零均值和某个方差σ的高斯函数。
推导 MSE
现在我们想计算这样一个模型的可能性(这里唯一的参数是θ= m)。首先,回想一下高斯分布的 PDF 的定义:
高斯分布的 PDF
现在,这个模型的可能性(我们可以忽略外部的正常数因子,因为它不影响我们的优化)是
此模型的可能性
我们简单地通过用高斯函数代替我们的 PDF 来获得之前的似然性定义。
在实践中,我们希望获得负对数似然。所以,经过一些代数运算后,对数似然是
此模型的对数似然
然后,负对数似然
负对数似然
瞧啊。负对数似然,我们从假设真实数据对于给定的 x 呈正态分布中获得的损失函数是非常精确的均方误差,即
一般来说,均方误差的定义
只差一个常数!还不错。
一些反思
所以这就是均方差是如此普遍和巨大的损失函数的原因;它基于极其合理的概率假设:给定一些自变量的值(也称为世界的某个状态),因变量按照高斯分布分布。现在已经非常清楚(y_i - y_pred)的来源:高斯分布 PDF 中的指数项。我认为这是一种更好的思考 MSE 的方式,而不仅仅是简单地“我们使用它是因为它很容易区分”(尽管这在某种程度上是正确的)。
如果你开始将此推广到更复杂的推理任务,你就可以开始对 MSE 如何运作有真正的直觉了。例如,考虑用多项式拟合一组(x,y)点。你可以想象在曲线周围的 y 方向上上下下,我们有突出页面的高斯 pdf。现在,您可以将使用 MSE 的梯度下降视为在 y 方向上上下调整一组高斯函数,以最大化每个单独 x 值的可能性,并且整个问题已经简化为一个迭代鼠标重量的示例,其中我们正在计算如何放置 x 的每个值的正态分布的平均值。这种直觉无缝地转化为许多 x 值(即一个 x 向量)的情况。
现在想象有多个 y 输出。然后,你试图为每个可能的 x 找到一个多元高斯分布的最佳平均向量。
总结想法
当我第一次在最大似然估计的背景下通读涵盖“线性回归精简版”(没有 y 截距的线性回归)的 CS109 课堂笔记时,我没有意识到它可以带来一些关于我已经使用和熟悉了相当长时间(MSE)的事物的直觉和见解。重温它们,再读一遍,认真思考,结果是一次颇有收获的经历。关于它的写作也填补了我理解上的一些漏洞。我建议至少为你感兴趣的课程做一些这样的事情;这会让你更加欣赏这个主题。
此外,这个小小的探索让我对人工智能和深度学习的技术有了更好的理解。许多现有的技术起初看起来像是任意构造的,但如果你深入研究概率论,就会发现它们都来自相同的核心思想。因此,我认为学习这些基本概念是必要的:它帮助你以一种更加基础的方式思考 ML,它甚至可能帮助你想出你自己的新的有趣的技术/算法!
AI 到底在哪里?
人工智能校准和安全
交互式网络可视化突出了全球有益和有害的人工智能案例
艾到底在哪里?工具 —作者图片
“一种算法如何阻止黑人患者的肾移植”——《连线》杂志
“荷兰正在成为一个预测性的治安热点”——VICE
“一个月,50 万次面部扫描:中国如何利用人工智能描绘少数民族”——《纽约时报》
随着人工智能的使用在我们的社会中变得越来越普遍,这些令人震惊的标题也是如此。当我们看到一个爆炸性的标题时,我们不应该只关注人工智能系统是如何设计或开发的。相反,当我们接收数据、定义用例或开始冲刺时,负责任的人工智能应该是我们的第一个想法。在分析谷歌趋势后,AI Global 的团队发现了人工智能和负责任的人工智能之间的报告和搜索差异。
谷歌关于负责任的人工智能、道德人工智能、人工智能、坏人工智能和好人工智能的全球网络搜索趋势
我们在负责任和有道德的人工智能上看到的唯一搜索峰值与《纽约时报》等重大新闻相关:我们所知的隐私的终结2020 年 2 月 10 日。即使这样,这些山峰也不是人工智能搜索的地方。为了负责任地开发和应用人工智能,我们必须寻找和了解设计不良系统的后果。
“AI 到底在哪里?”Map 是一个交互式网络可视化工具,探索世界各地人工智能的故事,以确定趋势并开始讨论更值得信赖和负责任的系统。在地图上,你可以按照从医疗服务到执法的领域进行过滤,设置年份范围,并按照人工智能是有益还是有害的分类进行过滤。
按域名、年份、有益和有害案例过滤 —图片由作者提供
AI 在哪里有害
虽然地图上布满了彩色的点,但重要的是不要忽略单个数据点。在我们的数据集中,
在英格兰,有不公平的情况,40%的 A-level 成绩被降级,因为一种算法被用来评估学生的表现。
有一个系统的种族主义的例子,如迈克尔·奥利弗谁被错误地指控犯有盗窃罪,因为在密歇根州的面部识别系统。
有证据表明反馈回路被打破了,比如 Tik Tok 在中国制造了基于种族的过滤泡沫。
如果不以负责任的方式设计和管理,人工智能系统可能会有偏见,不安全,在某些情况下(通常是无意中)侵犯人权。
AI 在哪里帮过
我们也对 AI 充满希望。我们已经看到了人工智能如何增强和促进我们日常生活和社会的早期实例。也有例子表明,人们已经纠正或摆脱了有害的人工智能系统。我们已经看到人工智能创造了艺术、音乐,甚至检测出无症状的新冠肺炎。
我们的人工智能过程已经被贴上了有害/有益的标签
我们知道,这些案例中的许多可能会落入有益或有害的灰色地带。例如,不同的文化视角可能会给案例贴上不同的标签。我们的地图目前被工作组用来讨论这些案例如何影响负责任的系统中的信任。此外,AI Global 正在内部和外部讨论谁能决定什么是有益的和有害的。我们希望,当我们在这个生态系统中导航时,这些标签可以成为关于负责任的人工智能实践的对话的起点。
通过强调这些案例和更多案例,我们希望揭示人工智能在各个领域的分支及其在现实世界中的后果。我们邀请您通过点击一个点/星来探索我们的地图,了解每个故事的更多信息。
我们正在学习和成长,所以如果您有任何反馈或问题,请联系我们。非常感谢我的梦之队:AI Global 的 Shrivu Shankar、Ameya Deshmukh、Colin Philips、Lucinda Nguyen、Amaya Mali 和 Ashley Casovan。感谢 Doreen Lorenzo 的早期反馈,感谢 Jennifer Aue (Sukis) ,她是我的第一位人工智能设计教授,激发了我对这一领域的兴趣,并鼓励我在 Medium 上写关于人工智能伦理的文章:)
智能城市传感器预测客流量
利用空间数据分析了解和预测澳大利亚墨尔本的行人交通。
我有建筑设计和城市规划的背景,一直对应用数据来改善我们的城市和建筑环境很感兴趣。像全球许多城市一样,墨尔本的目标是在未来几十年内成为智能城市,而数据正在推动这一目标的实现。数据分析声称是智能城市的未来,因此有许多实质性的数据集可供公众免费使用。在我第一次深入研究城市数据时,我使用了墨尔本市提供的几个地理空间数据集来了解行人的行走模式。
项目目标
对于决定开店地点的企业来说,客流量和行人活动是一个需要考虑的重要因素。繁华地区的商店和餐馆可能会吸引更多的顾客和注意力。考虑到这个客户群,我使用的主要数据集是每小时统计有多少人通过城市人行道下的不同传感器。
通过查看传感器计数,可以观察到步行交通的总体趋势。然而,我也想了解是什么把更多或更少的人带到了特定的地区。是否可以根据附近的建筑物或城市特征来预测行人流量?从城市规划的角度来看,关于城市中哪些因素会增加或减少行人流量的信息将有助于预测新开发项目对附近区域的影响。
为了确定某些因素是否会影响行人数量,我在分析中加入了其他几个地理空间数据集。本文将介绍这个项目的主要步骤,但是完整的代码可以在我的 Github 库上找到。
数据收集和清理
如前所述,墨尔本市提供了许多有价值且干净的数据集。幸运的是,只需要做最少的数据清理工作,但是下面我概述了我使用的数据集以及在建模之前我是如何组织数据的。
每小时人行道传感器计数
我的主要数据集是人行道传感器计数,它具有以下特征:每个传感器的位置坐标,一个传感器 ID 号,每小时记录的日期时间,以及每小时计数值。下面是整个城市所有传感器位置的可视化 Tableau 地图。
墨尔本所有的人行道传感器,通过 Tableau 上的位置坐标映射。
数据从 2009 年至今,每月更新。当 2009 年开始收集数据时,只有 18 个传感器,现在有 65 个,所以在过去十年中增加了许多传感器。在数据清理过程中,我发现许多传感器都有错误的记录,因为计数会在几周或几个月内突然降到零。今年年中还增加了新的传感器。为了保持一致性,我创建了一个函数来生成传感器的年度列表,每次至少有 12 个月的完整记录。由于前两年(2009 年和 2010 年)的记录不太稳定,2020 年的记录还不到整整 12 个月,传感器的范围被更改为 2011 年至 2019 年。
附近城市特征
为了更好地了解不同传感器附近的城市特征,我包含了来自该城市的几个地理空间数据集。这些被包括在内,以测试传感器附近的特征与该区域接收到的客流量之间是否存在相关性。这些数据集包括年度建筑数据、 **自行车码头位置&容量、地标&兴趣点以及城市街道照明。**这些单独的数据集中的每一个都包括位置坐标和一些关于特征的信息。
本次分析中包含的城市特征数据集之一是墨尔本的街道设施和基础设施。
传感器趋势
为了获得传感器趋势的概述,我创建了一个热图来了解每个传感器繁忙的日子和月份。这是两个传感器的热图,它们从 2011 年到 2018 年有一致的数据。
传感器 2 的热图,它看起来在 12 月的星期五最繁忙。一周中没有太多的人流量,因此该传感器最有可能位于娱乐或休闲区。
传感器 9 的热图,它在工作日几乎完全处于繁忙状态,表明它可能位于商业区。从 2016 年到 2017 年,客流量也有明显增加。还要注意两个传感器之间的规模差异,即使在最繁忙的情况下,传感器 9 也没有传感器 2 那么多的行人流量。
绘制位置特征
产生传感器气泡
为了将所有基于位置的数据集与它们最接近的传感器结合起来,我利用 GeoPandas Python 库在每个传感器周围创建了 100 米的半径。半径保持较小,因此它只包括直接影响传感器上的脚步的元素。下面是我在 follow 中创建的地图,上面标有传感器的周围半径。要了解更多关于在 lyum 中开发地图的信息,请点击查看源代码。
每个传感器周围 100 米半径的叶子图。
绘制附近的特征
然后,再次使用 GeoPandas,我开发了一个函数来检查位置数据集中的每一项(建筑物、自行车、照明等。)来查看坐标是否在任何传感器的半径内。如果该点位于传感器的半径范围内,则坐标和要素信息会添加到传感器列表中。一旦在所有位置数据集中找到了 100 米半径内的所有要素,我就创建了一个函数来在 foylus 中绘制这些信息。
以下是传感器 2 和 9 及其附近所有要素的地图。通过这种视觉,我们可以看到传感器 100 米半径范围内的所有城市元素。街道照明是珊瑚色,地标是紫色,建筑是浅蓝色,街道基础设施是灰色。可以在深蓝色圆圈的中心看到传感器。
传感器 2 的所有位置特征都在传感器 100 米半径范围内。
传感器 9,其所有位置特征都在传感器 100 米半径内。
基于位置特征预测每日客流量的回归方法
既然我们可以看到哪些要素在每个传感器的 100 米范围内,建模就可以开始了。对于建模的第一阶段,我想做一个相对简单的线性回归,看看是否有可能仅根据附近的位置特征来预测每个传感器的每日客流量。该模型的特征是半径内每种特征的数量和传感器 ID,并预测日平均客流量。
数据框的一个片段。总共有 60 多列详细说明了传感器半径内每个邻近要素的数量。
由于位置要素的数量在一年内没有变化,因此我不期望模型能够准确预测每天的变化和趋势。然而,我认为这将是有趣的,看看哪些功能增加或减少了客流量。训练和测试数据采用随机 80/20 分割,所有年份混合到每组中。
模型结果:线性回归
-训练分数:0.7751
-测试分数:0.7749
-简历得分:0.7747
-根均方误差:224.592
所有分数都在 0.77 以上,这个模型在第一次尝试中表现得相对较好。分析特征的重要性以了解哪些特征增加和减少了客流量是很有趣的。然而,该模型在用于预测未知数据时表现不佳。例如,如果训练数据仅包含 2011 年至 2017 年的信息,而测试数据仅包含 2018 年的信息,则模型的得分会大幅下降。
特征重要性
特点是减少的客流量
令人惊讶的是,传感器半径内的零售点数量越多,实际上对客流量产生了负面影响。其他有趣的特点是减少了人流量,有更多的礼拜场所,更大的平均建筑楼层,和更多的停车位置。
特点是增加客流量
更多的座位和医院对传感器接收的客流量有积极的影响,还有一些城市基础设施,如花坛和护林。这些也许是最令人惊讶的,因为这些是我们在城市中漫步时不一定会注意的特征。
实际与预测
这种模型的主要缺点是,它每天为每个传感器预测相同的值。由于特征在一年内没有变化,该模型无法将每日趋势考虑在内。这使得该模型在预测未来客流量时表现不佳。
此图显示了线性回归模型预测的数据与实际每日客流量之间的差异。垂直线表明该模型每天预测每个传感器的相同计数,并且不针对每天的变化和趋势进行调整。
在用相同的特征调整这个模型之后,通过使用具有 GridSearchCV 的决策树回归器,CV 分数将提高到. 828。然而,用实际与预测的图表说明的相同问题仍然存在。仅使用和位置特征的模型只能变得如此精确,因为它没有考虑每天的变化,也不能预测未来的交通。
预测未来客流量
为了开发一个可以预测未来客流量的模型,我将之前回归模型中使用的位置特征与更多基于日期的信息相结合。除了半径中不同位置要素的数量之外,月、日、年和星期几的信息也作为要素包含在内。此外,我还包括了一年前或两年前(如果前一年没有有效数据的话)那天的计数。通过这些功能,训练和测试数据根据年份进行拆分,因此模型是根据 2011-2017 年的数据训练的,而测试数据是 2018 年的。
在调整参数和测试几种不同的模型类型后,该模型产生了迄今为止最高的分数,并能够以 90%的准确率预测每个传感器的 2018 年每日客流量。
模型结果: Ada Boost 回归器
-训练分数:0.9994
-测试分数:0.9032
-简历得分:0.8744
-根均方误差:158.7632
特征重要性
对该模型预测影响最大的特征是基于日期的信息和过去一年的数据。这表明每个传感器都有一个有助于预测的年度趋势。还有几个基于位置的因素对预测相对重要,如篮球架、安全岛护柱的数量、平均楼层数和自行车护栏的数量。
对预测影响最大的特征
实际与预测
该模型的预测更加细致入微,能够预测每个传感器的不同日计数。因此,该模型更加准确,并且在预测值和实际值之间存在更强的线性趋势。有几个强异常值,其中模型预测值比实际值高或低得多,可以进一步调查这些点,以更好地了解是什么影响了这些变化。
从模型中生成的实际每日计数与预测每日计数
结论
*那么,人们在墨尔本四处走动会产生什么影响呢?*从这些模型中,我们了解了城市的哪些特征会吸引更多的行人,哪些特征会减少游客,以及哪些特征有助于预测未来的趋势。
第一个模型显示,一个有更多座位、花坛、医院和社区使用建筑的区域会有更多的人流量。有更多零售店、宗教场所和烧烤的地方会减少平均每天去那里的人数。如果商业或城市规划者的目标是预测未来趋势,他们会想使用第二种模型。该模型表明,过去一年的数据和特定日期的信息将是估计未来客流量的最强预测因素。然而,一些城市基础设施元素,如篮球架、护柱的数量以及周围建筑的平均楼层数,也可以提供更准确的预测。
这个项目是一次很好的学习经历,让我更好地理解了地理空间数据科学——这是一个我将继续探索的主题。总的来说,我对目前为止发现的结果很满意,并渴望在未来继续这个项目。我想进一步探讨一些想法来改进我的模型:
- 返回分析每小时的行人计数数据,而不是每天的平均值,以获得更精确的趋势
- 包括城市的更多位置特征
- 包括季节性信息,例如城市事件、公共假日、体育赛事等。
- 基于位置特征对传感器进行聚类,以便可以预测没有前一年数据的新传感器的客流量
感谢您的阅读,如果您有任何建议或想法,请随时通过 LinkedIn :)联系我
AI 和平战略在哪里?
对国家人工智能战略症结的简短思考
在 1 月 29 日这一天,我已经阅读了欧洲所有的国家战略,至少是那些已经出版的,以及大多数拥有人工智能计划的大国的国家战略。与此同时,我看到了各种关于人工智能主题的指数,这些指数衡量了各种因素。我发现,战略中所缺少的东西,与书面文件中所陈述的内容,或政治家们在发布后添加的内容一样有趣。
在 2020 年,我注意到大多数战略*(除了中国、法国、印度和葡萄牙)*中有一个重要的缺失,那就是对生态的关注,以及对 2019 年历史性变化的关注——街头抗议气候危机的儿童。
在大多数衡量人工智能进步的标准中,美元符号滚动,科学论文大量涌现,他们关注基础设施的需求。当一家公司击败另一个游戏时,我们会庆祝,无论是:危险、国际象棋、围棋、英雄联盟还是任何其他可以想象的智力活动。
尽管必须指出的是,在欧洲的大多数国家战略中(大多数由商业、贸易、数字或创新部门制定),国防并没有明确和占主导地位,但它在某种程度上隐约出现在表面之下,以及在民族国家在讨论中提出的观点中。毕竟,在所谓的“AI 双头垄断”中,主导辩论的是美国和中国——如果美国这么做,中国会怎么做,等等。然后欧洲等等。
在人工智能的讨论中,自主武器的话题引人注目。
在我的祖国挪威,当然也有军队招募网络精英的情况。由于我在这个领域的其他地方从事机器学习,我显然是促销活动的目标。
作为机器学习工程师加入挪威的“智能单位”
作为一个例子,这里也有对自动驾驶汽车的测试,以及对自动武器(或简单地说,带有机器学习组件的武器)的投资,这是我们确定无疑的。这是自主防御车辆“Tor”在高草丛中的测试之旅。
对于国防工业来说,采用新技术并探索如何利用新技术更好地保卫国家是非常明智的。人们也很容易想到生命损失会更少。
尽管如此,在我的头脑中没有任何清晰的战略,我看到过和平的谈论。
关于人工智能话题的讨论通常会转向人工智能军备竞赛,特别是当一个反乌托邦式的未来观点出现时。
圣诞节期间,我读了一本斯图尔特·拉塞尔写的书。本书人类兼容:AI 和控制的问题。这是我极力推荐的一本书。
图为上述书籍的封面,可在此处找到。
这本书提出了几个支持和反对人工智能控制方法的论点,这些论点经常被人工智能社区的不同研究人员争论,这是一个真正发人深省的阅读。
我不会通过列出清单来破坏这本书,但是我可以说,以目前的进展来控制人工智能不是一个零和游戏,而是一个合作的努力。他将此与国际上遏制人类基因组编辑风险行为的努力进行了比较(遗憾的是,随着 CRISPR 和廉价 DNA 试剂盒的出现,这种风险行为再次出现)。
人类面临的潜在生存威胁的问题当然是一个合作的问题。这一点对大多数人来说应该是显而易见的。
挪威有着试图理解和平的悠久传统,特别是与奥斯陆(PRIO)的和平研究所合作。因此,在该研究所有这样一个专注于人工智能的项目可能并不奇怪。
人工智能(AI)在军事规划中发挥着越来越大的作用。这个项目将提供一个伦理…
www.prio.org](https://www.prio.org/News/Item/?x=2491)
这个项目处于研究阶段,也有政策倡议。
我当然希望看到这个项目取得良好的进展,因为当结果是:
- 它没有发生或;
- 我们降低了某事发生的可能性。
我想这就是为什么它如此困难和重要。
另一个很好的例子是马克斯·泰格马克(Max Tegmark)和其他人,他们成立了未来生命研究所(Future of Life Institute),专注于存在风险,特别是:人工智能、生物技术、核能和气候。
科技赋予生命前所未有的繁荣潜力…
futureoflife.org](https://futureoflife.org/)
然而,写在导言中的问题仍然存在。
为什么我们没有将和平视为国家人工智能战略的明确组成部分?和平实际上是缺失的。
我天真地在谷歌上搜索“欧洲人工智能和平战略”,得到了大量这样的信息。希望这只是一个糟糕的谷歌搜索案例。
在相对较短的时间范围内(也许 20-50 年,也许 100 年),可以在生存层面上威胁到我们人类的技术当然值得考虑,作为共同努力防止迫在眉睫的灾难的领域。
你会希望,我也会希望,满怀希望——随着气候危机和人工智能的出现,各国将更加致力于和平与合作,而不是军备竞赛。
我们可以将人工智能作为一种工具,在缓解、适应和恢复方面进行合作,而不是进行军备竞赛。
然而,国家人工智能战略有一个和平问题,因为它根本不存在于概述和出版的文件中。
总结
我的鼓励当然是我们应该在未来的 AI 战略中把这个话题提上日程。伦理是一个开始,然而,如果人工智能被用于好的方面,我们可以更明确地表达我们的雄心。如果人工智能是用来做好事的,至少要表达出和平的意图和适当的措施,以确保这种投资与人工智能发展的快速增长一样多,这种发展扩散了迄今为止的国家战略讨论。为什么不把和平作为政策重点?
这里是#500daysofAI,您正在阅读的是第 239 条。500 天来,我每天都在写一篇关于或与人工智能相关的新文章。我目前 100 天 200-300 的重点是人工智能的国家和国际战略。
数据在哪里?
更多信息请在推特上关注我:https://twitter.com/faviovaz
或者如何丰富数据集并自动创建新要素。
插图作者:伊泽尔·巴斯克斯
O 当你在处理一个新的数据集时,最困难的事情之一是发现预测你的目标的最重要的特征,同时,在那里你可以找到新的信息来源,可以提高你对数据和模型的理解。
在本文中,我将向您展示如何在没有任何编程技能的情况下做到这一点。是的,这听起来很奇怪,但是请原谅我。在以后的文章中,我将探索可以帮助您做到这一点的其他编程库,并看看哪种方法会产生更好的结果。
我们将用一个示例数据集来做这件事。我们将使用美国西雅图金县的房屋销售数据集。您可以在此找到关于数据的所有信息:
用回归法预测房价
www.kaggle.com](https://www.kaggle.com/harlfoxem/housesalesprediction)
数据集的想法是根据不同的特征来预测房子的价格。在我向您展示如何进行数据丰富之前,让我们用 python 加载数据以获得一些相关信息。下面你可以看到一个简单的笔记本:
需要注意的是,我并没有为数据集做整个 EDA,这只是为了获得基本信息。我将要展示的内容并没有消除您必须遵循的数据科学流程,只是为了丰富您的数据并获得更多相关信息。
好了,现在是时候了。
我们将通过一个名为 Explorium 的系统来实现这一目标。前阵子发现这个软件,一直用到现在。他们将自己的产品描述为:
Explorium 正在推动数据科学领域的一种新范式——公司可以根据他们需要的数据,而不是他们拥有的数据来建立模型。发现唯一一个专注于机器学习的高级数据的端到端数据科学平台。
因此,这是一个端到端的平台,您可以在其中构建和部署模型,但我们将在其他文章中探讨这一点。您可以在这里要求一个演示来复制我在本文中所做的事情:
[## 请求演示探索
本网站使用 cookies 来改善您浏览网站的体验。在这些饼干中…
www.explorium.ai](https://www.explorium.ai/request-a-demo/)
我要做一个循序渐进的教程。如果你有任何问题,请在下面的评论区告诉我:)。
创建项目:
当你可以访问这个应用程序时,你要做的第一件事就是创建一个项目。
然后将项目命名为:
加载数据
下一步是将数据载入系统。有几种方法可以做到这一点,比如:
- 当地的
- S3
- 神谕
- Teradata
- 关系型数据库
- Mssql
- Postgres
- 红移
- 储备
- 谷歌大查询
- 谷歌存储
我将从我的本地计算机加载它。几秒钟后,您应该会看到以下屏幕:
如您所见,底部有一个非常基本但有用的数据探索工具。您可以获得一些关于您的数据的基本统计数据。
如你所见:
我们有 21 列和 21613 行,与我们在 Python 中看到的一致。
数据引擎
现在是开始魔法的时候了。在 Explorium 中,您有一个称为“引擎”的东西,在那里软件将根据您的数据创建新的要素,并根据列及其内容获得新的数据集。
这是我们将要做的事情(摘自网站):
https://www.explorium.ai/data-enrichment/
https://www.explorium.ai/data-enrichment/
【https://www.explorium.ai/feature-discovery/
系统还可以做更多的事情,正如我提到的,我们将在其他文章中对此进行探讨。我们继续。
我们现在必须设定,我们试图预测什么。这更多是针对软件的机器学习部分,但也是继续的必要条件:
我们现在必须按下播放按钮:
现在我们等着。
然后我们再等一会儿。这可能需要几分钟。系统正在使用您的信息从成千上万的数据集中提取其他数据。
如你所知,大约 5 分钟后,系统检测到 30 个有用的数据集和大约 890 个特征。如果你不想等待更多的时间,你可以停止引擎,但我建议你等到最后。
洞察力
几分钟后,您应该会看到类似这样的内容:
让我把那一页翻给你听。在顶部,我们看到内部数据(以及从数据集创建的一些新要素)的得分®为 87.46,相当不错,而外部数据的得分为 89.52,稍好一些。这并不奇怪,但这确实是事实。
在左侧部分,您可以看到它发现了 30 个有用的数据集,并且与您的数据相匹配。在中间,您可以看到它从内部和外部数据创建的所有不同的特征,最后,在右边部分,您可以看到一些 ML 模型的结果。您会看到最好的模型是使用 XGBoost 创建的,RMSE 为 118.5K,MAE 为 66.3K
我们现在不打算关注模型。只有数据。在中间部分,您可以获得预测价格的最佳 50 个特征:
如果您单击此处,然后单击下载所选功能:
你将下载最好的 50 个功能来预测价格。这里很重要的一点是,价格不会在那里,所以如果你想在外部使用新数据,我们将需要追加它。让我们在 pandas 中加载数据并查看它:
正如您看到的,列的名称非常明确,但是我们可以用 Python 和 Pandas 轻松地改变它,所以不要担心。现在回到 Explorium,在 Insights 选项卡中,您可以获得功能重要性:
在这里你可以看到变量对建模有多重要以及它们来自哪里。如您所见,其中一些来自原始数据集,一些来自外部数据集,此外,我们的数据中还有一些现有列的 K-Neighbors。这对离线建模非常有帮助。
对了!!您也可以直接下载外部数据集:
从他们那里得到完整的侧写。
结论
丰富和改进您的数据现在变得非常简单。正如我之前提到的,将来我会将结果与 Explorium 和一些 Python 库进行比较,请继续关注。
我们可以看到,这个过程非常简单和直观,如果您不需要建模,您可以保留新数据并自己工作。我可以向你保证,大部分工作都在发现阶段,数据清理和特性工程,建模很容易,编码也越来越简单。
如果您将这种类型的软件与对业务的良好理解和有效的数据科学方法相结合,您将更快地震撼数据科学世界。
感谢阅读!如果你想了解我的文章,请在 Medium 和 Twitter 上关注我:
Favio Vázquez 的最新推文(@FavioVaz)。数据科学家。物理学家和计算工程师。我有一个…
twitter.com](https://twitter.com/faviovaz)
你的数据科学团队在哪里?
组织结构的重要性
近年来,许多公司开始拥有数据科学团队,我们看到的数据团队从小型创业公司的几个人到大型公司的数百人团队不等。这不是一篇问“你的数据科学团队在哪里?”让你相信拥有一个是有用的(为此你可以阅读这个)。这是一篇质疑“您将数据科学团队具体安排在哪里?”以及这是否有意义。
为什么组织结构很重要?
在讨论数据科学团队的定位之前,让我们先来看看组织结构的概念。尽管扁平化和最小化的结构越来越多,但我们都知道,在实践中,一旦公司达到一定规模,无论管理层是否明确指出,我们都会在某种结构中工作。组织结构很重要,因为它通过安排汇报路线、规划沟通流程为每个人提供指导,并使人们能够组织起来。值得强调的是,虽然组织结构与等级制度有些关联,但两者并不一定相同。我逐渐认识到,当人们说他们喜欢一个扁平的结构时,他们通常意味着他们喜欢一个在决策中没有等级之分的环境。毕竟,如果没有某种适当的结构来促进这一目标的实现,很难让一大群人朝着一个公司的目标进行自我协调。
组织结构是决定一家公司能否有效实现其目标的关键。这是其运营的一个重要部分,因为它限制了人们在其角色、团队和报告关系中的行为。我们很可能会听到类似“这不是我们团队的责任”或“我们不能这样做,因为其他团队在照看它”,有时这些对于确保团队保持专注是有意义的,但有时正是这种武断的结构阻止了我们做正确的事情。即使有一个超级明星团队,你也需要一个整体结构来让他们合作并交付优秀的结果。
Esther Jiao 在 Unsplash 上拍照
那么你应该把你的数据科学团队放在哪里呢?
谈到组织结构,有许多不同的思想流派,每一派都有自己的优点和缺点。这里的关键是,在为您的数据科学团队建立正确的结构时,要了解您正在获得哪些好处,以及需要缓解哪些问题。在高层次上,传统上我们对组织结构进行分类,一端是职能,另一端是部门。职能结构意味着团队由其专业来定义,例如,当我们有一个财务团队,一个营销团队和一个工程团队。部门结构意味着团队根据其市场和产品进行分组,例如基于地理位置的团队,或基于特定产品类别的团队,这些团队包括来自不同专业的人员。通常,职能结构有助于提高效率,因为它集中了专业知识,而部门结构可以对市场做出快速反应,因为它们更接近客户,并且拥有无需跨部门支持即可做出反应的所有人员。然而,正如英特尔管理层传奇人物安迪·格罗夫在他的著作《高产出管理》中所建议的那样,达到足够规模的组织将汇聚成一个矩阵结构,在这个矩阵结构中,团队由不同的部门组成,并有一个职能监督。尽管这可能会导致双重报告关系的开销,但这是唯一可行的结构,可以鼓励部门团队的敏捷性,同时保持总体职能团队的效率水平。最近,我们看到了跨职能团队结构的兴起,这是由于采用了敏捷交付方法,团队完全自给自足,并遵循敏捷框架处理自己的积压工作。这些是实践中常见的许多结构中的几个,它们都呈现不同的优点和挑战。
集中式数据科学团队
对于现有职能结构的组织,组建数据科学团队最合理的方式是创建一个集中化的团队。它可以是一个独立的团队,也可以放在一个更大的团队(如技术或产品团队)之下,但从本质上讲,这个团队将只由数据角色组成。该团队将充当内部职能部门,支持不同团队的数据需求。
这种方法有几个主要好处,
- 单一团队意味着基础项目,如基础设施、治理流程和最佳实践,可以以集中的方式建立,这将提高团队的整体效率。
- 该团队可以灵活地支持多个业务部门,尤其是当一个业务部门无法独自证明全职员工人数的合理性时。这鼓励较小的团队尽可能地利用数据。
- 职能报告线意味着数据科学家将向同一领域的人报告,这意味着职业发展更容易管理。
然而,这种结构也存在一些挑战,
- 严重依赖不同的团队来识别利用数据的机会,并能够有效地与集中的团队沟通他们试图解决的问题。
- 由于人们没有长期融入团队,对于数据科学家来说,积累关于领域和数据的深入知识是一项挑战。随着人们逐个项目地工作,长期解决方案可能不会被优先考虑,因为项目时间表将简单地超出结构所能容纳的范围。
- 资源(人员)分配成为一项重要的开销,因为不同的团队有相互竞争的优先级,并且保护人员的过程变得政治化和耗时。
嵌入式数据科学家
另一方面,使用嵌入式模型的公司会让每个业务部门雇佣自己的数据角色。这鼓励了自主性和专业化,因为每个部门团队都可以根据他们的具体要求进行招聘。通常,这种设置中的数据角色关注的范围更窄,因为与服务于业务所有不同部分的数据团队相比,单个团队的范围更小。
这种模式有一些优点,
- 数据科学家与团队一起直接解决这个问题。这鼓励长期的解决方案和所有权,因为环境促进和鼓励这种深度。
- 它还使数据科学家能够专注于领域内的数据问题。
- 自主性使数据科学家能够以更敏捷的方式工作,并能够在其他团队最少监督的情况下调整他们认为合适的工作
但这也带来了以下挑战,
- 由于不同的团队有不同的优先级和时间表,部门决策鼓励孤岛的发展。这使得任何跨部门的倡议都非常困难,因为这种结构不适应这种类型的合作,因此大规模的内部问题不太可能在这种情况下得到解决。
- 不一致的过程和实践将会出现,因为每个团队都有他们自己的工作方式和标准。缺乏正式的沟通渠道也将使共享现有知识和最佳做法变得更加困难。
- 由于数据科学家将向可能来自不同背景的部门领导汇报工作,因此长期职业发展可能具有挑战性,因为鉴于领导不一定熟悉数据科学领域的发展途径,长期职业发展需要个人对自己的进步承担更多责任。
《黑客帝国》(电影名)
当然,上面的两个例子与其说是实际的,不如说是原型的,因为大多数组织都介于这两个定义明确的模型之间。这就是矩阵式组织适合的地方,它提供了一个覆盖部门团队的职能结构。这种模式建立了沟通渠道,弥补了纯部门结构的不足。功能覆盖是可以共享知识和应用标准的地方。它还创建了一个可以执行大型跨部门项目的机制。虽然这在理论上是理想的,但由于双重报告关系和两个结构之间的利益冲突,额外的一层管理起来可能相当复杂。就像结合不同想法的解决方案一样,这可以很容易地将前两个模型的问题结合起来,而不是将两个世界的优点结合在一起。为了让矩阵组织为数据科学团队服务,我们需要一个强大的数据科学领导团队来推动职能部门的卓越表现,还需要了解让数据科学团队参与这些职能活动的长期价值的部门领导。他们将需要共同努力,确保他们的整体愿景保持一致,以最大限度地减少两个报告线之间的紧张关系。
跨职能团队
还有一种新的结构正迅速受到欢迎,尤其是在科技行业,这种结构专注于一个完全自给自足的小型跨职能团队。这是一个类似于部门结构的概念,但是更进一步,更加关注灵活性和独立性。这里的关键区别是授权小团队做出自己的决定,这缩短了业务提案和批准流程的通常周期,希望获得速度优势,使团队能够尽快对市场需求做出反应,而没有不必要的监督。这可能是从具有层级结构的大公司结构到现在创建尽可能多自治的小团队的矫枉过正。也有像全息照相术和其他模式的变体,试图通过将尽可能多的权力推给在现场执行的人来实现相同的目标。这是一个有趣的转变,因为它鼓励将问题分解成更小的部分,并且关注迭代测试和改进。因此,一方面,它与数据科学完美契合,因为数据科学是关于学习和实验的。但另一方面,它也带来了同样的挑战,即大规模的问题无法在这个框架下轻松解决,人们最终试图将一个大圆钉(基础问题)装进一个小方孔(部门解决方案)。公司试图解决这一问题的方法之一是,通过让不同的团队完全拥有他们共同问题的一部分,并标准化团队之间的沟通渠道,来彻底消除大规模问题。使用这种方法,我们看到团队拥有独立于其他团队的自己的基础设施,只要他们能够为其他团队提供一致的方式来与他们协作。这可以通过一组通用的预定义应用编程接口(API)或发布数据目录供其他团队利用的形式来实现。这与 DevOps 的理念和微服务架构的理念密切相关,devo PS 的理念是“您构建它,您运行它”,而微服务架构的理念是将整体问题分解为可以独立解决的小问题。技术公司在这方面有优势,因为这些是软件开发概念,而更传统的公司可能会在实践中与这种模式斗争。
在安置数据科学团队时,最重要的是什么?
没有安置数据科学团队的最佳方式,每种结构都不可避免地有其优点和缺点。很多时候,解决方案失败不是因为团队不称职,或者数据不正确,或者方法错误,而是因为环境甚至没有给团队成功的机会。我们经常认为我们正在工作的结构是理所当然的,因为它似乎太难改变,但最重要的是我们要把结构搞对。我们需要认识到数据科学团队的复杂性和独特性,并对现有结构进行调整,以确保环境有利于团队,而不是不利于团队。只要很好地理解和减轻与 are 相关的挑战,最终采用哪种结构并不重要。对于那些有能力改变环境的人来说,你有责任为团队建立正确的结构,并带领他们走向成功。所以回到最初的问题,你的数据团队在哪里?
如果您喜欢我的内容,请在 https://jchoi.solutions/subscribe注册更多内容
哪里最容易找到数据科学的工作?不是你想的那样!
新冠肺炎对生活的几乎所有方面都产生了影响,包括人们的工作,也包括广泛的 IT 领域(以及我们最感兴趣的领域——数据科学领域)。
为了帮助同行业的同事找工作,我决定对 LinkedIn 数据做一个小分析,并回答如下问题:
- 哪些国家拥有最大的数据科学劳动力?
- 哪些国家拥有最大的数据科学就业市场(空缺职位数量)?
- 哪些国家的人均数据科学专家数量最多?
最后,在哪里最容易找到数据科学工作(根据空缺职位数量和员工数量的比例)?
这项研究是在 LinkedIn Jobs & People data 上进行的,涵盖了数据科学和类似领域(数据科学家、数据分析师、数据工程师、数据科学经理、大数据专家)至少有两个职位空缺的所有国家。
在我们对结果过于兴奋之前——让我们记住一件事:分析只在 LinkedIn 数据上进行。该网站本身在世界各地的受欢迎程度并不相同,因此在 LinkedIn 受欢迎程度较低的国家,大多数工作可以在其他网站上发布,专家注册和分享其个人资料的动力较小,因此我们可能会错过一些数据。
来源:Linkedin
然而,LinkedIn 仍然是最受欢迎的以就业为导向的在线服务,所以我们仍然可以捕捉到一些有趣的见解!
1。人均科学家数量最多
先说数据科学职业在全球的普及程度。哪些国家的人均数据科学家数量最多?每一个数据专业人员有多少人?
数据职业似乎在来自小型发达经济体(和美国)的人群中最受欢迎——爱尔兰、新加坡、瑞士、美国、卢森堡。
2。科学家总数最多
哪些国家拥有最大的数据科学劳动力?
这里没有惊喜。主要是最大的经济体(主要是英语圈)——美国、印度、英国、加拿大和法国。其中一些是大多数技术工人移居的国家。
3。最大作业量
事情越来越有趣了。
在哪些国家,该领域的空缺职位数量最多?
与上一篇相似——世界上一些最大的经济体:美国、印度、德国、英国、法国。
4。每位科学家的最大工作量
你可能最感兴趣的一个。世界上哪里(或者可能是哪里)最容易找到数据工作?不是你想的那样!
答案是欧洲&东南亚的一些国家——葡萄牙、白俄罗斯、罗马尼亚、菲律宾、德国。
在葡萄牙,每份工作只有 6 名数据专业人员。白俄罗斯和罗马尼亚有 8 起,菲律宾有 9 起,德国有 10 起。
在其他一些国家,每份工作只有 11-12 名专业人士,这些国家包括:新加坡、日本、波兰、南非和哥斯达黎加。
为什么是这些国家?
一些解释可能是,目前像葡萄牙、白俄罗斯、罗马尼亚、菲律宾或波兰这样的国家拥有蓬勃发展的 IT 部门,这是因为公司决定将分支机构外包或转移到劳动力成本更低、劳动力受教育程度更高的国家。
你有更好的解释吗?在评论中分享!🎉
这对你意味着什么?这些国家可能值得研究!
然而,请记住,即使就业市场竞争不那么激烈,也并不意味着你会更容易找到工作——可能仍然存在当地法规(工作许可证)和要求(懂当地语言)。工资也可能很低,导致对他们的需求减少。
如果你对数据或代码(Python 和 Bokeh)感兴趣,你可以在这里找到:
[## 主 m-kortas/DS-playground 的 DS-playground/datascience jobs _ analysis . ipynb
深度学习、机器学习、NLP 和可视化-DS-playground/datascience jobs _ analysis . ipynb at main…
github.com](https://github.com/m-kortas/DS-playground/blob/main/visualisation/Linkedin_analysis/DataScienceJobs_analysis.ipynb)
机器学习遇到密码学
通过机器学习解决带噪声的密码相关学习奇偶校验问题
当你读到这里的时候,很可能你已经知道一些关于机器学习的事情。你知道机器学习算法通常会接受一堆样本,每个样本包含固定数量的特征,并最终输出一个预测。
你可能听说过(但没有深入研究)的是密码学领域。这是一个神秘的话题,涉及到安全、密码和隐藏的东西。也许你甚至听说过 AES 或 RSA ,它们是加密数据的算法。
但是不要担心,即使您以前从未接触过密码学,您也能够理解,因为我将从入门的角度来解释一切。
在这篇文章中,我想把这两个领域结合起来。我将向您介绍一个易于理解但难以解决的用于构建密码算法的问题——所谓的带噪声的学习奇偶校验问题,简称 LPN 。LPN 中的“L”应该已经给你的机器学习敲响了警钟,因为这个问题可以被视为一个常规的机器学习问题!
但首先,让我们看看 LPN 问题在加密设置中自然出现在哪里,以及如何定义它。之后,我们将使用机器学习来解决 LPN 问题。
动机
假设您拥有一家酒店,并且您想要管理对客人房间的访问,即每个客人应该只能进入他们自己的房间。有道理,对吧?
现在,传统上你可以使用普通的物理钥匙。缺点是,人们有时会丢失钥匙,这意味着您的业务会有很大的成本,因为您必须更换受影响的门上的锁。
因此,您决定部署智能卡,特别是带有 RFID(射频识别)芯片的卡,以及相应的锁。由于你必须提供许多门,并且你想省钱,你选择非常弱的 RFID 芯片,即计算能力递减的芯片,甚至可能没有自己的电源。
苏珊·普兰克在皮克斯贝拍摄的照片。
你的系统应该是这样工作的:每把锁和每张卡都存储了一个密钥,一个二进制向量,比如 s= (1,0,1,0),实际上要长得多。如果你把你的卡放在一把锁旁边,这把锁就像一个阅读器一样扫描卡的密钥。在这种情况下,芯片被称为标签。
线索:如果卡和门的秘密钥匙匹配,门就会打开。
完美!但是怎么做呢?嗯,一个简单的方法是把你的卡放在锁旁边,锁告诉卡上的芯片把它的密钥发送给锁。然后,锁检查两个密钥是否相等,如果相等,则开门。
这是有意义的,因为如果您没有正确的卡,即您芯片上的密钥与门锁中的密钥不同,门将无法打开。
问题是
当客人想要进入他们的房间时,这种解决方案的麻烦就开始了:一个坏人,通常在密码学中被称为攻击者,可能坐在走廊上,显然只是无辜地在他们的笔记本上打字。攻击者实际做的是 嗅探*RFID 流量,*即读取锁和客人芯片之间的通信。如果芯片直接发送密钥,攻击者将看到它,存储它,伪造一个包含这个密钥的卡,然后将能够进入房间。
一个典型的黑客在工作,这一次没有滑雪面具。纳赫尔·阿卜杜勒·哈迪在 Unsplash 上拍摄的照片。
所以,这是个坏主意。只有在世界上没有坏人的情况下(极不可能)才有效。相反,我们必须武装自己,为我们的客人提高安全性。想法是这样的:
芯片必须以某种方式向锁证明它拥有正确的密钥,而不泄露它。
我听到你尖叫: 这就是加密的作用! 你说的没错。攻击者只能在嗅探工具中看到垃圾,而无法重建密钥。但可悲的是,RFID 芯片对于加密任何东西来说都太弱了,因为你想省钱,记得吗?可悲的是,现实世界中的大公司也是如此。这种芯片几乎没有计算能力,存储空间也只能勉强容纳密钥。因此,我们需要另一种更轻量级的解决方案。
一种方法是使用类似于 Hopper 和 Blum 的 HB 协议的加密协议。这个协议使得攻击者很难提取密钥。
照片由 Goh Rhy Yan 在 Unsplash 上拍摄
我要介绍的 vanilla HB 协议还有其他漏洞,不应该在实际中使用。我用它只是因为它容易解释。为了现实世界的安全,应该使用该协议或其他安全协议的更安全的扩展。
血红蛋白协议
所以,你有一个阅读器R(锁)和一个标签T(你的芯片)。 T 现在想要向 R 证明它拥有相同的密钥**而不泄露它。这是通过 R 反复询问 T 只有具有正确密钥的标签才能回答的问题来实现的。到目前为止,我们已经看到单个问题“你的秘密密钥是什么?”是不安全的,因为这已经暴露了太多的信息。相反,在 HB 协议中 T 被要求一次只透露一小部分秘密,直到 R 能够确定 T 拥有正确的秘密密钥。**
假设 R 和 T 的密钥实际上都是同一个 s =(1,0,1,0)。现在 R 向 T 发送一个随机二进制向量 a (例如 a = (1,0,1,1)),并期望 T 用标量积 b = *< a,s >,*对其进行响应,即
在这个例子中。我们称这个为为挑战。记住,我们在这里处理的是位算术,所以“+”实际上是一个 XOR。乘法和实数乘法是一样的。或者对数学家来说:我们在域 GF(2)或𝔽₂中计算,这个域有两个元素。
异或就像整数的普通加法,只是 1+1=0。
R 可以自己计算标量积(它知道 a 和 s )并检查 T 的答案。如果 T 的答案是相同的,那么 R 可以更加确信 T 确实拥有相同的密钥。为了增加信心,这个游戏要重复几次。
例如,如果 T 没有正确的密钥,那么在足够多的回合之后,它很可能不会成功,因为单个响应的正确概率只有 0.5。因此,例如,在 10 轮之后,成功认证的机会仅为 1/1024,小于 0,1% 。
这听起来好多了吧?T 现在并没有一口气透露它的秘密,相反,它通过回答挑战给了 R 一些信息。**但可悲的是,这也是完全没有安全感的。**攻击者仍然可以写下 R 和 T 之间的完整通信,然后轻松求解线性方程组来恢复 s 。这是通过以下方式完成的:假设攻击者已经为挑战/响应对写下了以下内容:
攻击者也知道
其中 A 是包含 aᵢ 行和bbᵢ行的矩阵。在我们的例子中:
攻击者必须解决的线性方程组。
因此,解决这个系统为的产生的秘密。如果 s 大得多,即 1024 位长,这也可以通过高斯消除容易地完成。顺便说一下解决方法是 s = (1,0,1,0)。😎
噪声问题下的学习奇偶校验
有一个非常小但是非常重要的调整来防止我们的攻击者: T 只是在它的响应中添加了一些随机的伯努利噪声。它不是将 < a,s发送回 R,而是掷一枚概率为 p 为 1,否则为 0 的硬币 e,并将a,s > +e 发送回阅读器。换句话说,标签以概率 1- p 将 < a,s > 发送回 R ,并以概率 p 将响应位从 0 翻转到 1 或从 1 翻转到 0 。我们假设p<0.5。
这并不能而不是阻止攻击者嗅探 R 和 T 之间的通信,并做笔记*,*当然,但他们现在必须解决以下问题:
**这个符号表示方程组的每个方程只有概率 1- p 才是正确的。更正式地说,你可以把它写成 As+e=b,其中 e 是噪声向量,每个分量(独立地)以概率 p 为 1,以概率 1-p为 0
因此,攻击者必须在 GF(2)上解一个嘈杂的方程组。对于一个恒定的错误率 p,这个问题——带噪声的学习奇偶校验(LPN)问题——被认为对于足够长的密钥长度是不可行的。如果攻击者可以获得任意多个方程,这也是正确的。
即使添加了这些错误, R 也可以完成确定 T 是否知道 s 的工作。如果 T 具有正确的 *s,大约 1- p 响应的一小部分将是正确的。*这意味着如果 p = 0.25,HB 协议运行 1000 次迭代, T 应该给大约 750 个正确响应。
如果 T 没有正确的 s ,它将给出大约 0.5 个正确答案的分数,即1000 个回合中的 500 个回合协议运行。这允许 R 决定 T 是否有正确的秘密,并且这个协议对我们的用例仍然有意义。
通过机器学习求解 LPN
现在让我们开始有趣的部分。我们已经确定,解决 LPN 问题意味着,给定一个随机二进制矩阵 A 和一个二进制向量 b=As+e ,恢复 s.
**重要观察:**我们可以把矩阵 A 的每一行 aᵢ 现在作为一个样本,把向量 b 中对应的值 bᵢ= < aᵢ,s > +eᵢ 作为标签。
使用秘密长度为 4 和六个捕获的通信的例子,我们可以看到矩阵 A 的每一行包括四个特征,并且 b 中的条目是相应的标签。我们的数据集大小为 6。
正如在机器学习中使用的正常数据集所发现的,标签 bᵢ 实际上类似于特征向量 aᵢ 和固定秘密向量 *s(一些基本事实)*的标量积,但是添加了误差项。但是,当我们抛出一个机器学习算法来预测标签时,我们如何才能获得秘密呢?
好吧,如果我们能很好地学习问题*,*,我们就能为标签生成好的预测(标积;地面真相)为每个特征向量 aᵢ 我们喜欢。如果我们放入向量 a =(1,0,0,0),那么我们会得到一个很好的猜测
第一位的s!对向量(0,1,0,0),(0,0,1,0)和
(0,0,0,1)做同样的操作,我们就有了密钥的所有位。
因此,我们可以使用机器学习来解决 LPN 问题。
评论
LPN 问题是一个非常通用的问题,您也可以使用它来构建加密、基于身份的加密、用户认证、不经意传输、消息认证码,以及可能更多的构造。此外,与因式分解问题不同,LPN 问题无法使用量子计算机轻松解决。与它的轻量级配对,它是构建后量子安全算法的一个很好的候选者。所以,不用担心,如果 RSA,这种基于大数分解的算法,在量子计算机面前消亡了。;)
关于 LPN 问题的更多信息和更好的数学定义,请参考我的论文[2]。
实验
让我们首先定义一个 *LPN oracle,*即一个我们可以在实例化时用一个密钥和一个错误级别 p 来填充的类,这给了我们想要的那么多样本。
这可以使用以下代码轻松完成:
import numpy as np
class LPNOracle:
def __init__(self, secret, error_rate):
self.secret = secret
self.dimension = len(secret)
self.error_rate = error_rate
def sample(self, n_amount):
# Create random matrix.
A = np.random.randint(0, 2, size=(n_amount, self.dimension))
# Add Bernoulli errors.
e = np.random.binomial(1, self.error_rate, n_amount)
# Compute the labels.
b = np.mod(A @ self.secret + e, 2)
return A, b
我们现在可以用长度为 16 的随机秘密和 p = 0.125 来实例化这个 oracle。
p = 0.125
dim = 16
s = np.random.randint(0, 2, dim)
lpn = LPNOracle(s, p)
我们现在可以从lpn
开始取样:
lpn.sample(3)
# My output:
# (array([[1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1],
# [1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0],
# [1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0]]),
# array([1, 1, 1], dtype=int32))
这里我们采样了 3 个数据点。现在,让我们试着用决策树找到的。当然,您也可以尝试逻辑回归、伯努利朴素贝叶斯和您选择的任何其他分类器。
from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier()
# Get 100000 samples.
A, b = lpn.sample(100000)
# Fit the tree.
dt.fit(A, b)
# Predict all canonical unit vectors (1, 0, 0, ..., 0), (0, 1, 0 ,0, ..., 0), ..., (0, 0, ..., 0, 1).
s_candidate = dt.predict(np.eye(dim))
# Check if the candidate solution is correct.
if np.mod(A @ s_candidate + b, 2).sum() < 14000:
print(s_candidate, s)
else:
print('Wrong candidate. Try again!')
学习算法可能无法捕捉基本事实并学习另一个函数。在这种情况下,向量的所谓汉明权重相当高(对于我们长度为 100000 的向量来说大约为 50000)*。*这对应于标签 T 具有错误密钥并且可以正确回答大约一半挑战的情况。如果 s _candidate = *s,*汉明重量将在 0.125 * 100000 = 12500 左右。
在这个例子中,阈值为 14000 是在识别正确的秘密和不输出错误的候选解之间的一个很好的折衷。你可以在[2,23 页]中找到如何得到这个界限。
结论
我们已经定义了 LPN 问题,并了解了当试图破解加密 HB 协议时它是如何出现的。然后我们用一个简单的决策树解决了一个小问题。
**但旅程才刚刚开始:**我们可以用其他/更好的算法(深度学习,有人吗?)或巧妙的花招来
- 获得更高的成功率,
- 使用更少的样本和
- 能够解决更高维度的问题。
关于求解 LPN 的非机器学习算法的列表和解释,请查看我的论文[2]。还有,如果你想出名,比如试着求解一个秘密长度为 512,p=0.125 的实例。这个 LPN 实例目前未被破坏,用于一些现实世界的密码系统。祝你好运!;)
参考
[1] N. Hopper 和 M. Blum,安全人类识别协议 (2001),密码学与信息安全理论与应用国际会议,Springer
[2] R. Kübler,学习奇偶与噪声问题的时间记忆权衡 (2018),学位论文(波鸿鲁尔大学)
我希望你今天学到了新的、有趣的、有用的东西。感谢阅读!
作为最后一点,如果你
- 想支持我多写点机器学习和
- 无论如何,计划获得一个中等订阅,
为什么不做 通过这个环节 ?这将对我帮助很大!😊
说白了,给你的价格不变,但是大约一半的订阅费直接归我。
非常感谢,如果你考虑支持我的话!
有问题就在 LinkedIn 上写我!
停车点到底在哪里?
利用急流寻找更准确的步行距离
这个形象怎么了?
在之前的故事中,我们探索了 NVIDIA RAPIDS package 的 cuSpatial 和 cuGraph 库,并使用它们来查找到西雅图太空针附近最近停车点的步行距离。这是在融合数据科学的约翰·默里的大力帮助下才有可能实现的,他友好地提供了一张金县道路图,以十字路口列表(带有地理坐标)和连接十字路口与计算长度(以码为单位)的边列表的形式。
然而,快速浏览一下上面的地图,很快就会发现我们之前提出的相对简单的方法存在一个问题:从最近的十字路口到停车点的距离是一条直线(直线)。在这个故事中,我们将看看如何解决这个问题。
《当乌鸦飞》与《当人们工作》的对比
我们如何解决上述问题?让我们更接近真实步行距离的一种方法是在地图上(为每个停车点)找到一个停车点,该停车点的位置垂直于道路本身,如下图所示。
蓝线显示当前的解决方案。正如你所看到的,我们正在建筑物和十字路口上空飞行,这是正常人通常做不到的。然而,橙色线显示了一种更现实的方法,即一个人沿着道路走到选定的停车位置。
因此,我们需要向我们的图中添加更多的节点和边:每个停车位置一个,以使到最近道路的距离最小化,即,位于连接两个节点的线上的节点,并且当连接到停车计时器的位置时,这样的线是垂直的。
让我们做一些数学!
给定 3 个点,找出两条线的交点是小学时的一个简单问题,所以下面只是一个快速复习。
我们寻找新节点位置的方法。
给定平面上的两个点,我们可以通过获取这两个点之间的纬度差并除以它们的经度差,快速找到连接两个节点(道路交叉口)的黑线的斜率 a :
a =(lat _ pt _ 1-lat _ pt _ 2)/(lon _ pt _ 1-lon _ pt _ 2)
垂直线的斜率就是 a 的负倒数:
a _ vertical =-1/a
同样简单的是找到黑线的常数 b ,因为我们已经知道了斜率:
b=lat_pt_1-alon_pt_1*
当然,我们可以用另一个点得到同样的结果。给定垂直线的斜率和停车点的位置—我们现在可以快速地做同样的事情来找到b _ vertical。
由于交叉点处的点将具有相同的纬度,无论我们使用什么等式(它毕竟是一个交叉点),我们可以将这些等式设置为彼此相等,以找到交叉点的经度:
a * lon _ intersection+b = a _ vertical * lon _ intersection+b _ vertical
快速的代数变换,我们可以清楚地看到 lon_intersection 点:
lon _ intersection =(b _ vertical-b)/(a-a _ vertical)
找到纬度现在是微不足道的,因为我们可以使用任何一个方程来得到它。
来做点编码吧!
现在我们有了方法,让我们把它转换成一个 RAPIDS 内核。
上述内核中的点 x 和 y 是描绘道路的两点,点REF是停车点。注意:如果你不熟悉定义 RAPIDS 内核,我在之前的两篇文章中已经提到了:我应该停在哪里?和我该往哪里走?所以我就不在这里讨论了。
在我们上面的计算中,我们没有解决两种特殊情况:当道路完全沿着南北或东西走向时。在前一种情况下(南北对齐),投影点的经度是任一点的经度,而纬度将是停车位置的纬度。在后一种情况下(东西走向),解决方案将是相反的:我们取任一点的纬度,经度将是停车点的纬度。
我们现在可以迭代所有的停车位置。首先,我们需要将经度和纬度添加到 road_graph_data 数据帧中;作为复习,这个数据帧只包含一对节点和它们之间的距离。我们将从道路节点数据帧中获取这些数据。
计算停车位置和 road_graph_data 中的所有点之间的距离是没有意义的,因此我们将节点列表划分为距离正在处理的停车节点大约 2000 英尺以内的节点。
现在我们可以找到交点了。
因为我们正在处理 2000 英尺以内的节点,所以我们需要检查该点是否位于两个节点之间。我们通过检查从交点到每个点的哈弗线距离之和小于或等于这两个节点之间的实际长度来做到这一点。
为了找到最佳拟合,我们选择距离停车点距离最小的点,并将该节点添加到节点列表中。
最后,我们还添加了连接停车位置和找到的交叉点的边。
处理~1500 个停车咪表位置只用了 3 分 20 秒(大王县有 12.7 万多个道路节点!)上的英伟达泰坦 RTX 。
成功了吗?!
使用与我们在之前的故事中提出的相同的 cuGraph 方法,我们现在可以找到更可靠的方法来遍历我们的图表并找到太空针附近最近的停车位置!
我们应该在哪里寻找可居住的行星?
和很多人一样,我从小就迷上了天文学和太空探索。最有趣的可能性之一是其他恒星周围的世界,并且可以居住(或有人居住!)世界更是如此。在发现任何系外行星之前,我们可以推测其他恒星系统的性质,但我们只有我们的太阳系来观察和检查我们的理论。我们很自然地认为,其他拥有潜在宜居行星的恒星系统看起来会像我们的一样——大型气体巨行星在较大的轨道上,较小的岩石行星靠近恒星。然而,事实并非如此。
随着 51 Pegasi b 的发现,我们了解到在其他类似太阳的恒星周围有行星,这些恒星系统的排列方式与我们的不同。进一步的系外行星发现进一步证实了这一点,包括一些具有潜在宜居世界的恒星系统。一个这样的例子是开普勒-69(如下所示),它有一颗靠近恒星运行的大型气态行星,以及一颗在较大轨道上的较小的潜在宜居行星——这种安排与太阳系非常不同
我们如何整理这些数据来发现适合居住的星球呢?我们已经知道,可居住的行星需要主序星不太热也不太大,但即使有这些要求,许多恒星也符合要求。由于搜寻系外行星的资源有限,任何缩小搜索范围的方法都会有所帮助。也许我们可以超越恒星的要求,利用我们所知道的已经发现的恒星系统来预测可居住的行星可能在哪里。一种方法可能是使用机器学习来尝试更好地预测哪些恒星将拥有可居住的行星。
考虑到这一点,我建立了一个梯度增强模型,根据恒星和其他行星来预测恒星系统是否有可居住的行星。作为输入,我使用了每颗恒星的不可居住行星的质量、半径和轨道大小,以及恒星的温度、半径和质量。只有大约 4%的多行星恒星系统有可居住的行星,所以猜测没有恒星有可居住的行星的基线,虽然没有帮助,但确实提出了一个需要克服的挑战。当然,我们的目标是改进恒星数据,所以我也只使用这些数据构建了一个类似的模型。因此,我们可以看到行星数据是否改善了预测。
我的两个模型都是成功的(它们在准确性和 ROC-AUC 得分方面都超过了基线,精确度和召回率在下面详述)。此外,正如我所希望的,行星模型打败了只有恒星的模型。作为进一步的验证,我将太阳系包括在测试集中,去掉了地球(就像其他系统的潜在可居住行星一样),以查看模型是否可以正确预测太阳及其其他 7 颗行星中有一颗可居住的行星。令人高兴的是,行星模型预测我们的太阳有一颗可居住的行星!不幸的是,纯恒星模型认为我们的太阳只有 40%的机会拥有可居住的恒星。
评估模型
stellar 模型的召回率为 33%,正确找到了三分之一的目标系统,精确度为 50%,假阳性和真阳性的数量相等。行星模型的召回率为 50%,找到了一半的可居住系统,精确度为 75%,三次正确预测中只有一次误报。当然,基线的召回率为 0——没有识别出任何潜在的可居住的恒星系统,但也没有假阳性。
梯度推进模型给了我们概率和分类,所以我们可以看看一颗恒星有可居住世界的概率。随着检测方法的改进或更多的资源被分配给搜索,这可能是有用的。我们可以检查的候选人越多,召回就越重要,精确度就越不重要——假阳性越多,假阴性越少,这是一种可以接受的权衡。只接受 5%的可能性会让我们在两个模型中都得到 100%的回忆分数,行星模型再次比只有恒星的模型给出了更好的精确度——24%比 20%。由于潜在的宜居行星很少出现,所以在精确度和召回率之间存在权衡也就不足为奇了,但这确实向我们展示了模型的行为符合我们的意愿——不太可能的预测包括更多的假阳性,但也捕捉到了所有的目标恒星。
用 Shapley 值看引擎盖下
绘制 Shapley 值可以帮助我们了解模型使用什么特征来进行预测,以及这是否符合直觉。下面是狼 1061 的沙普利力图:
这是我们太阳系的沙普利力图
我们可以看到,虽然恒星的特征主导了预测,但行星的特征也起了作用。特别是,我们的太阳尤其受到木星和金星轨道的帮助。这与我们对恒星系统知识的预期大致相符。我们可以通过 Shapley force summary 在整个测试集上看到相同的效果:
再次,恒星特征占主导地位,但我们可以看到行星肯定也有影响。
结论
这些模型表明,在评估一颗恒星拥有可居住行星的可能性时,纳入来自已发现行星的数据是有价值的。这种模型目前面临的最大挑战是数据的不完整状态。许多团队已经使用各种方法和仪器发现了系外行星,并不是所有团队都为每个发现的行星提供相同的数据。这加剧了已经很小的样本。
同样值得考虑的是,现有的系外行星样本被我们探测它们的能力扭曲了。例如,更小、更冷的恒星可能有更靠近轨道运行的可居住行星,并且靠近轨道运行的行星更容易被探测到。因此,我们在相对较小的冷恒星周围发现更多可居住行星的事实可能并不反映它们的真实分布。
数据、方法、参考资料、链接
系外行星数据来自美国宇航局系外行星档案馆
可居住性数据来自可居住系外行星目录,这是位于阿雷西博的波多黎各大学行星可居住性实验室的一个项目
建模是用 python 和 scikit-learn 和 XGBoost 完成的
我的 python 笔记本可以在我的 GitHub repo 中找到
您应该在哪里部署您的模型?
AWS 是部署的终极目标吗,或者还有更多故事?
(图片由作者提供)
您已经完成了清理数据的工作。您已经设计了功能,销毁了丢失的值,并创建了一个非常适合预测您的目标的模型。您终于准备好将这个模型投入生产了,但是您必须部署您的模型的选项数量太多了。虽然我们非常幸运地生活在一个云计算已经在机器学习市场占据了很大一个领域的时代,但这也有一个缺点,即所有的选项往往很难将你的决定缩小到哪一个最适合你的模型和你的个人情况。
另一篇关于这个主题的文章是关于部署的概述,作者是 neptune.ai ,如果你想学习更多关于部署 API 的知识,这是一个很好的资源!以下是一个链接:
近年来,大数据和机器学习已经被大多数主要行业采用,大多数初创公司都在…
海王星. ai](https://neptune.ai/blog/model-deployment-strategies)
虽然 Amazon Web Services (AWS)对于大多数应用程序来说当然是一个很好的选择,但它也相当昂贵,并且对于许多相当基本的终端来说根本不需要。另一方面,像 Heroku 这样的自动化服务使托管模型变得非常容易,甚至是免费的,但也使端点可用性的范围相对有限。在端点部署领域中,所有这些伟大的选项相互平衡,哪一个是适用于不同情况的最佳选项?
选项 1: AWS
毫无疑问,就性价比而言,AWS 几乎完全击败了其他所有服务。这也是为什么很多工作都把 AWS 经验作为就业的要求。对于许多企业应用程序来说,AWS 是一个近乎完美的工具,因为它允许使用跨大规模不同服务器的计算和成本对实例进行分组。
虽然 AWS 对于需要大量计算能力的模型来说是一个很好的解决方案,但肯定可以说需要在性价比的某个点上划一条线。AWS 可能很快变得相当昂贵,如果您计划使用大量计算而回报很少,这可能不是最佳选择。如果你不可能在计算上赚回你的钱,那么它首先就不值得托管。对于一些长期使用强度大,但不一定需要立即供电的应用,可能需要一个更经济的选择。最重要的是,AWS 是出了名的难以使用。根据我的经验,我遇到过在 AWS 仪表板中找不到选项的情况,或者实际上被 AWS 阻止通过 SSH 做某些事情,这确实令人沮丧。
选项 2: Linode
如果你像我一样每天都使用 Linux,知道如何使用 NGINX 和 Apache,并且了解如何运行 Unix 命令行,那么 Linode 很可能是你的最佳选择。Linode 的优势不仅在于价格低廉,而且类似于 AWS,具有极强的可扩展性。在服务器上执行特定操作需要更多内存?Linode 允许你选择单独的部件用于你的服务器,这样你的内存问题就解决了。下面是我写的一篇文章,它更深入地介绍了 Linode 的优势:
由 Christopher Aker 创建的虚拟私有服务器托管服务 Linode 是最健壮、最具扩展性的…
towardsdatascience.com](/linode-might-be-the-best-deployment-solution-ad8991282c32)
Linode 的伟大之处在于,它不是为做这件事或那件事而构建的。虽然这意味着 Linode 服务器是难以置信的动态和免费的,但这也意味着它可能比您可能拥有的其他一些选项要复杂一些。使用 Linode 服务器,你需要做“Docker 的事情”,设置网络服务器和类似的事情。如果您不准备这样做,那么 Linode 可能不是您个人的最佳选择,不管它是否适合您要部署的模型。幸运的是,我已经发表了很多关于如何设置 NGINX 服务器并将 Gunicorn3 部署到产品中的文章,比如这篇:
应用程序部署通常会带来意想不到的后果和错误。部署可以是制定或…
towardsdatascience.com](/deploying-flask-with-gunicorn-3-9eaacd0f6eea)
Linode 是介于 AWS 这样管理复杂的东西和 Heroku 这样管理极其简单的东西之间的中间地带。虽然它可能无法提供与 AWS 相同的原始性能或完美的连接,但它以简单的固定速率运行,您可以根据需要进行扩展。
选项 3: Heroku
您在哪里部署您的模型是一个问题,这个问题的答案不仅取决于您寻求用您的模型完成什么,还取决于您自己的能力。如果您是初学者,刚刚开始管理虚拟环境,Heroku 是一个很好的选择,可以让您在一定程度上熟悉部署过程。Heroku 是一项服务,它将为您的服务建立一个独特的虚拟环境,并自动部署这些服务,从所述环境中加载您的依赖项。
尽管这很方便,Heroku 在向免费用户要钱之前只给他们三次部署。Heroku 应用程序的另一个问题是,默认情况下,它是嵌入 Heroku 系统的,这给了你很小的灵活性来添加任何东西或扩展你的服务。例如,自动训练自己的模型在 Heroku 平台上很难实现。
选项№4:自己部署!
如果你有能力,或者只是真的能够应用自己,也许有一台旧电脑躺在周围,绝对没有什么可以阻止你自己托管你的端点!虽然自托管也有缺点,如降低网速和电费,但也有一些非常真实和令人信服的优点,你可能想在完全放弃这个想法之前考虑一下。托管自己的服务器的最大优势是您可以控制相关的硬件。虽然这在某种程度上是不利的,因为这可能意味着相当高的启动成本,但这也意味着您可以根据自己的意愿自由升级所有组件。
拥有对服务器做任何你需要做的事情的自由,本地访问它,甚至无头访问都是一个很大的优势。有时候,安装一个闪存驱动器来传输一个大文件可能比安全地复制它更方便。拥有自己的物理服务器的优势就像手机本身拥有更多存储空间的优势,而不是云存储;没有中间人,你是你的服务器的唯一所有者。如果运行服务器是你可能想要追求的,我在这里写了一篇关于如何做的教程:
如何设置本地私有服务器并在其上部署端点。
towardsdatascience.com](/how-to-host-your-own-python-models-dc820081c320)
当然,除了这四个部署选项之外,还有很多其他选项,我认为这是一个通用服务器主机的很好的概述,您可能会发现它们能够全面部署端点。对我个人来说,我喜欢在尽可能少的限制下工作,而且我对 Linux 相当在行。因此,我会更多地考虑 Linode 和自部署选项。您选择的选项将完全取决于您的模型的用途、工作方式、需求以及您作为开发人员的开发操作技能。我还要感谢您阅读这篇文章。如果您碰巧在 9 月 1 日—9 月 2 日阅读这篇文章,我想演示一个自托管 HTTP 服务器,它只在那两天开放,所以我希望您喜欢我的惊喜!
这里有一个链接给那些在桌面上的人:
http://172.223.154.77:8000/desktop.html
这里有一个移动用户的链接!:
【http://172.223.154.77:8000/mobile/mobile.html 号
从哪里开始您的数据科学项目
数据预处理解码,适合初学者。
现在,我们已经了解了一些数据科学的基础知识,重要的是,您需要将理论知识融入到初级项目中,以提高您的技能。
任何数据科学项目的第一步都是数据预处理。你从各种来源获得的原始数据并不是一种可以直接应用算法的形式。它需要被清理,丢失的数据需要被处理,数据需要被转换以便算法可以应用于它。
我将讨论只包含分类数据和数字数据的简单数据集。
米卡·鲍梅斯特在 Unsplash 上的照片
我们需要找到一个数据集来处理。我会列出一些你可以查阅的资源
- 【https://www.kaggle.com/datasets
- https://catalog.data.gov/dataset
- https://datasetsearch.research.google.com/
- https://archive.ics.uci.edu/ml/index.php
- https://data.gov.in/
除了这些可用的数据集,人们还可以通过从网上抓取数据来制作自己的数据集。python 有内置的库来帮助你完成这个过程。
手里有了数据,打开自己喜欢的工作环境(我用的是 Jupyter 笔记本),从导入库开始。
首先,我们将导入Pandas*,它有助于高效地组织和操作数据,在进行数据分析时非常有用。接下来,我们导入NumPy,这有助于操作数字数据。添加matplotlib . py plot用于绘制简单图形。*
使用这些库的一个简单方法是在导入时为它们保留一个快捷方式。
例如,在导入时,如果你写了“import matplotlib.pyplot as plt ”,你可以在将来简单地使用这个库作为“plt”。
现在,让我们最终将数据集放到我们的工作环境中。我们将把我们的数据作为数据帧来访问。DataFrame 是 Pandas 的一个对象,你可以将 DataFrame 可视化为一个电子表格。
假设您希望将数据帧命名为 df1,这样就可以将数据集加载到 df1 上,如下所示:
df1 = pandas . read _ CSV(<数据路径>)
这里“read_csv”就是读。csv 文件,可以用“read_excel”来读取。xls 文件。同样,熊猫为你提供了阅读工具。html,。json,。sql 文件。
所以这只是介绍性的部分,我们并没有对我们的数据做任何修改。现在我们开始有趣的部分。
当你开始观察你的数据时()运行“df1.isnull()。sum()"快速浏览数据中缺失的记录)您首先会注意到并非所有的数据属性都是完整的。你会在很多地方看到“南”。这是你丢失的数据。您处理的任何数据总是会有缺失值。有一些技巧可以解决这个问题。
最简单的方法是**删除包含任何缺失值的行。**您通常会处理包含数千个元组的数据集,因此删除几百个应该不会有什么不同,对吧?
" df1.dropna() "将删除包含任何缺失值的所有行。
但是,如果您删除的行代表了关于数据的一些重要信息,该怎么办呢?所以我们尽量避免删除任何条目。
仅当缺失值占数据的 1%以下时,才限制删除行。
我们采用的另一种方法是填充缺失的值。一种方法是使用 sklearn 库的*估算器类。python 中的 Scikit Learn 或 sklearn 库包含许多用于机器学习和统计建模的有用工具。这允许您用现有值的*平均值(众数/中值)来填充缺失值。
使用“可以实现类似的事情。fillna() "函数。“fillna()”还允许您分别通过“bfill”和“ffill”参数用之前或之后的值填充缺失值。
我提到过我们将处理分类和数字数据。
各种机器学习算法要求输入和输出是数字。
我们将从 sklearn.preprocessing 导入 LabelEncoder 类。这将非常快速地为每个分类变量分配一个数字。
假设你有 4 个不同的变量-绿色,黄色,蓝色和红色。因此,使用上述方法,您的代码将把这些变量分别映射到 0、1、2 和 3。
使用 LabelEncoder 有一个限制——当你将颜色设置为模型中的一个变量时,模型会认为黄色(1)比绿色(0)更重要。
它将根据分配给变量的数量赋予它们权重。
当我们的分类变量类似于小、中、大,因为小
因此,对于显示出一些优先级的变量,LabelEncoder 工作得很好。
为了解决属性颜色的问题,我们将引入虚拟变量。在虚拟变量中,每个分类变量都有一列。每列只有两个值- 0 或 1。
为属性“颜色”引入虚拟变量
当您创建虚拟变量并将它们输入到模型中时,您可以确保这些变量中的每一个都具有同等的重要性。这可以通过使用 sklearn.preprocessing 中的 OneHotEncoder 类来实现。
既然我们已经完成了大部分预处理,我们可以继续将数据分成训练和测试数据集。
一个一般的经验法则是保留 15-20%的数据用于测试,其余的用于训练。
测试你的最终模型以了解你的模型是好是坏是很重要的,不要在你训练它的相同数据上测试你的模型也是很重要的。我们又要拯救 sklearn 图书馆了。sklearn.cross_validation 的 train_test_split 类将生成现有数据集的两个随机子集。
在应用合适的算法之前,我们要做的最后一件事是特征缩放。大多数算法,如 K-means、SVM、线性回归、逻辑回归等,对属性的尺度非常敏感,也就是说,它们要求所有数据都在同一尺度上。许多基于距离的模型使用欧几里德距离,如果属性在不同的尺度上,那么其中一个属性将倾向于支配距离。即使适当的算法不是基于距离,缩放也有助于算法更快地收敛。我想在这里补充一点,基于树的算法受特征缩放的影响不大。
因此,有两种方法可以将所有属性归入同一等级- 规范化和标准化
归一化使用一个非常简单的公式将数据从 0 扩展到 1:
这可以通过从 sklearn.preprocessing 导入 MinMaxScalar 类来实现。
在标准化中,我们使用属性的平均值和标准差来衡量我们的数据。
缩放数据的平均值为 0,标准差为 1。结果数据没有特定的限制范围。
为了标准化,从 sklearn.preprocessing 导入 StandardScaler 类。
建议在进行要素缩放之前分割数据。您可以在训练数据上安装缩放器,并使用它来转换测试数据。
有了这个,你的数据就可以用来建立模型了。记得要彻底练习预处理,这个阶段需要很多时间。
如果您有任何建议或问题,可以在这里联系我。
去哪里找机器学习的数据
高质量的数据是构建有用的机器学习模型的关键
布拉格图书馆,里面储存了大量的数据——图片来自 Pixabay
机器学习模型从数据中学习它们的行为。因此,找到正确的数据是将机器学习构建到您的产品中的一大部分工作。
你需要多少数据取决于你在做什么和你的起点。有像迁移学习这样的技术可以减少你需要的数据量。或者,对于某些任务,可以使用预先训练好的模型。尽管如此,如果您想要构建一些不仅仅是概念验证的东西,那么您最终将需要自己的数据来完成这些工作。
这些数据必须代表机器学习任务,其收集是偏见在蔓延的地方之一。构建多维平衡的数据集需要细心和关注。用于训练语音识别系统的数据必须表示不同的噪声环境、多个扬声器、口音、麦克风、谈话主题、谈话风格等方面。其中一些方面,如背景噪音,同样影响大多数用户。但是有些方面,比如口音,对特定的用户群体有着巨大的影响。不过,有时候,数据中的偏见比数据集的组成更深。例如,从网上抓取的文本会产生一个嵌入了许多社会刻板印象的数据集,因为这些刻板印象存在于网上的文本中,无法被删除。
为了构建成功的机器学习模型,获取数据是设计和构建整个系统的关键部分。除了寻找对任务有效的数据,您还必须权衡成本、上市时间和必须实施的数据处理流程。每种数据源都有自己的优缺点,最终您可能会使用以下数据源的数据组合。
公共数据集
第一个也是最容易看的地方是公开可用的数据集。有许多不同的数据集,为许多不同的任务创建,在像 Kaggle 、 UCI 数据集储存库、&、谷歌数据集搜索这样的地方进行索引和描述。对于语音技术, OpenSLR 和 LDC 有可用数据列表。通常,公开可用的数据集拥有非商业许可,或者您需要购买数据集才能将其用于商业用途。
ImageNet ,是一个著名的计算机视觉数据集(拥有非商业许可)。这是一个由数百万张图片组成的大集合,上面标有图片所描绘的物体。这一组因成为计算机视觉中深度学习的转折点而闻名。在 ImageNet 出现之前,数据集要小得多。跨研究人员使用大型共享数据集意味着深度学习的有效性可以清楚地显示出来。
综合数据
根据您试图解决的任务,有多种方法可以创建合成数据。为了将人们对智能说话者的口头请求分类,我们可以创建一个简短的语法,让我们建议人们可能如何询问天气:
(can you)? (tell|give) me the (weather in|forecast for) CITY (please)?
这里的’*?*表示可选单词, | 表示选择。有了城市列表来填充城市标记,我们就可以快速、轻松地生成用户可能询问天气的许多不同示例,例如:
tell me the weather in London please
can you give me the forecast for Cambridge
give me the weather in Bristol please
can you tell me the weather in Southampton please
另一种生成合成数据的流行方法是使用 GANs 。这些是生成模型,通常用于生成高质量的图像和视频。
一旦你有了一个如何生成合成数据的模型,就可以很便宜&很容易地生成大量你有基本事实的数据。这对需要大量数据的机器学习模型来说是有益的。
合成数据有它的缺点。它通常不像真实世界那样真实,也可能不符合真实用户表现出的行为。使用上面的语法,我们可以将可选的“你能不能添加到我们一半的合成生成的例子中,但是也许在现实生活中,我们的用户中没有人会说“你能不能”。
数据扩充
数据扩充是一种通过以不同方式复制和转换数据来增加数据量的方法。
建立一个对嘈杂环境具有鲁棒性的语音识别系统的一个成功方法是收集一个干净音频的数据集,然后通过添加不同种类的噪声来扩充它,以给出一个嘈杂音频的数据集。没有必要重新转录嘈杂版本的音频,因为我们知道转录是一样的干净的版本。可以添加多种类型的噪声,如多路重合噪声或汽车噪声,以创建多个不同的副本。其他用于音频的数据增强技术包括 VTLP ,它模仿使声道变长变短,在音频中给出更低和更高的频率,以及改变回放速度。
数据增强也广泛应用于图像处理。这里,变换的类型是不同的——几何变换、颜色偏移、加性噪声、混合多个图像等。但是效果是一样的——创建不同于原始数据的附加训练数据,但不需要重新标记。
数据收集
另一种选择是开展有针对性的数据收集工作,并雇佣人员来创建您需要的数据。也许你让众包工人与你的对话系统对话,或者你雇佣专业翻译来翻译文本,作为机器学习系统的基础。数据收集工作可能会很昂贵,但是(假设参与者有动力正确参与并且不作弊)可以产生真实的、质量相当好的数据。
在设计您的数据收集工作时必须小心谨慎,以确保您有广泛的参与者,并且您不会通过您给出的指令影响您获得的数据。此外,付费与你的系统互动的人不会像你的最终客户一样行事。一个与你的订票系统对话并获得报酬的众包工作者不一定会像一个真正想订票的顾客那样与系统对话。
您已经拥有的数据
您的组织可能已经拥有合适的数据来用于训练机器学习模型。也许您有大量的内部文本文档可以直接用于语言建模。或者投资一些努力来标记这些文档,这意味着它们可以用作自然语言处理任务的数据集,如命名实体识别(NER),它从文本中提取实体(如名称、位置、地点等)。).你已经拥有的数据的优势在于,标注现有数据可能比收集新数据更便宜。
生产数据
也许与您的 ML 模型最匹配的数据源,一旦它被部署,就是您从与之交互的客户那里获得的数据。这些数据是最真实的,没有来自合成来源的假象。如果你的产品被广泛使用,你可以看到比有针对性的数据收集更广泛的用户范围。
然而,世界变化很快。当您能够使用生产数据时,它可能已经有点过时了。在快速发展的领域尤其如此,比如现场新闻广播的字幕。新的主题和事件来得快去得也快,以至于您无法将关于它们的数据整合到您的模型中。如果你学习了上周新闻的语言,你可能不一定擅长模仿下周的语言。
过度适应过去是过度依赖生产数据的一个风险。另一个风险是过度适应当前的用户和功能。如果你刚刚推出你的产品,而你的用户是早期采用者并且熟悉这项技术,那么他们使用它的方式可能与后来采用者的方式不同。让你的模型过于偏向于理解早期采用者如何交互,实际上可能会降低后期采用者的性能。
生产数据也是更可能来自客户的数据源,因此受数据处理法律的约束,如欧洲的 GDPR。
虽然收集和标记生产数据的成本可能很高,但它通常有助于提高系统性能。由于这个原因,它通常是生产机器学习模型的主要数据源,尽管可能与上述其他一些数据源结合使用,以提供额外的健壮性。
我在语音、语言& AI 技术做顾问,你可以雇佣我!如果你的组织使用语音技术,AI &机器学习,请 取得联系 。
如何开始学习强化学习(RL)
在这些工具成为行业标准之前,学会实现它们。
去追它。凯文·Ku 从派克斯拍摄的照片。
建立和反思。有很多强化学习的资源,但是它们并不总是容易融入到你自己的项目中。构建自己的项目。让代码成为你自己的,这就是知道 强化学习的的人和知道如何* 强化学习的人之间的区别。*
这篇文章展示了学习如何在学习中胜任是易处理的,它提供了足够的资源来建立一个完整的知识。
我会说我在机器人学习(机器人+强化学习)方面很有能力。我很荣幸在我的博士学位上被推到这一步,但是你也可以。主题是可重复和有效的。
实践中学习
我们学习计算机科学的新技能来制作东西。将想法编写成代码是创造价值的地方(除了少数理论教授)。这个帖子的关键在于你需要 找到你的问题空间 。
在本文的最后有一个长长的资源列表,可以学习 RL 理论,但是随着 AI 方法的广泛应用,你必须选择哪里。这归结为三个动机的叠加:
- 你喜欢解决的问题。
- 具有全球影响的问题。
- 能让你获得工作和稳定的问题。
为 RL 决定一个问题空间,在那里你喜欢你正在做的事情,它会做一些事情来帮助这个世界,希望其他人会明白并给你一个更大的平台来做出改变。
一个模拟机器人手臂任务的例子——称为 Reacher3d。使用 Mujoco 和健身房。
我建造了什么?我和机器人一起工作。我希望机器人在任何地方都能做许多简单的工作。他们可以帮我们搬家具、开车、送箱子等等。所有这些都将在 T2 十年内实现。十年后,这看起来像学习低级运动控制器。学习机器人动力学和控制的核心库在这里找到。(大部分的研究在发表之前还在私人进行。)
通过写作或思考建立基础和深度
我已经在 Medium 上写了大约 20 篇帖子,这是对任何教育项目的惊人赞美。是时候反思你构建了什么,以及它如何融入一个更大的画面。这是确保其他人能够理解你的结果的时候。我遇到的最好的研究生都有一个共同的弱点——无法清晰地分解他们的想法。作为一名大四研究生,我专注于让我的工作持续下去,并在我完成学位后得到重用。
阅读媒体上内森·兰伯特的作品。学习者、非职业运动员、瑜伽师和机器人学习研究@加州大学伯克利分校…
medium.com](https://medium.com/@natolambert)
研究论文、博客帖子等都是写作形式,是你头脑和自我的永久娱乐。很少有东西能让个人在职业生涯结束后继续发挥作用,但高质量的写作可能是我们目前最容易获得的工具。
迄今为止我在 RL 上写的帖子。这是一个奇妙的主题,永远有更多的东西需要探索。
学习 PyTorch
PyTorch 正在机器学习研究领域占据主导地位,因为强化学习很年轻,所以它主要是研究。你可以在这里找到统计数据。PyTorch 非常流畅,所以不要担心在学习它的过程中陷入困境,它可能会发生。
概念工具
课程
- 优势:由该地区最聪明、最有前途的人教授。非常现代,非常有技术含量,很好的项目。
- 缺点:对新人来说,这可能是一个挑战。需要很强的 python 技能。
- 其他点评:我是 2019 年上的这门课。会推荐。
[## CS 285
加州大学伯克利分校的 CS 285 讲座:周一/周三上午 10-11:30,苏打厅,306 室讲座将被流式传输和录制。的…
rail.eecs.berkeley.edu](http://rail.eecs.berkeley.edu/deeprlcourse/)
大卫·西尔弗在 UCL 的讲座:
- 优势:理论背景牛逼。
- 缺点:可能开始变得有点过时。自 2015 年以来,RL 发生了很多变化——主要是软演员评论家超级有效,而基于模型的 RL 获得了更多关注。
- 其他评论:这些是我第一次看的讲座。我会在开始时推荐它们,因为它们非常有理论基础。没有太多的技术细节打断主题。
编辑描述
www.davidsilver.uk](https://www.davidsilver.uk/teaching/)
书
- 优势:教科书有很大的深度,例子,和上下文。这可以补充 RL 中的任何学习路径。
- 缺点:我不认识只看课本就能掌握一门学科的人。
- 其他评论:下面有一个很棒的 Python 代码伴侣,我也包括在内。
从亚马逊购买勘误表和注释完整的 Pdf 格式,无边距代码解决方案—发送您的解决方案一章,获得…
incompleteideas.net](http://incompleteideas.net/book/the-book-2nd.html) [## 疼痛/强化学习-介绍
如果你对代码有任何困惑或想报告一个错误,请打开一个问题,而不是直接给我发电子邮件…
github.com](https://github.com/ShangtongZhang/reinforcement-learning-an-introduction)
罗素:人工智能——一种现代方法
- 优点:给出了使 RL 在更多自动化领域有用的背景。
- 缺点:RL 的尖端细节范围非常有限。
- 其他评论:它反映了我在加州大学伯克利分校教授的课程,CS 188。
人工智能领域的顶级教科书。在超过 125 个国家的 1400 多所大学中使用。第 22 名最…
aima.cs.berkeley.edu](http://aima.cs.berkeley.edu/)
代码库
技术公司支持
OpenAI Spinning Up:这是我的最爱之一。它将彻底的理论阐述与编码教程结合在一起。它也是相当新的。这是一个研究新算法以及代码与其前身有何不同的伟大工具。
编辑描述
spinningup.openai.com](https://spinningup.openai.com/en/latest/)
Deepmind 在 Tensorflow 中的 RL 积木:我发现的新工具。这对于构建实用的系统非常有用,因为它抽象出了 RL 代理的各个部分。它为状态空间的 q-learning 提供了可调用的 python 对象。
TRFL(发音为“truffle”)是一个构建在 TensorFlow 之上的库,它为……提供了几个有用的构建块
github.com](https://github.com/deepmind/trfl/)
研究报告
有些人正在为业余项目制作惊人的工具。我用过 rlkit ,但是很难区分它们。现在入门的推荐 PyTorch,下面有些用 Tensorflow。这是一个巨大的区别因素,但这取决于你来决定。从部署机器学习系统的其他领域的经验来看,Tensorflow 也可能更适用于你。
PyTorch 中实现的强化学习框架和算法。实现的算法:斜配合加固…
github.com](https://github.com/vitchyr/rlkit) [## Denny britz/强化学习
这个库为流行的强化学习算法提供代码、练习和解决方案。这些意味着…
github.com](https://github.com/dennybritz/reinforcement-learning) [## MorvanZhou/张量流强化学习
在这些强化学习教程中,它涵盖了从基本的强化学习算法到高级算法开发…
github.com](https://github.com/MorvanZhou/Reinforcement-learning-with-tensorflow)
如果你需要官方认证
有两个最大的 MOOCs 教授的课程:Coursera 和 Udacity。这些在申请工作和首轮筛选“相关经验”时会有所帮助不过,我绝对认为来自加州大学伯克利分校的最新材料会给你带来更令人兴奋的教育。
掌握强化学习的概念。实施完整的 RL 解决方案,并了解如何将人工智能工具应用于…
www.coursera.org](https://www.coursera.org/specializations/reinforcement-learning) [## 强化学习
免费课程由佐治亚理工学院提供,编号为 CS 8803。关于本课程的免费课程,如果你需要,你应该选修本课程
www.udacity.com](https://www.udacity.com/course/reinforcement-learning–ud600) [## 自动化大众化
一个关于机器人和人工智能的博客,让它们对每个人都有益,以及即将到来的自动化浪潮…
robotic.substack.com](https://robotic.substack.com/)
像这样?请在https://robotic.substack.com/订阅我关于机器人、自动化和人工智能的直接通讯。
快去追!
柏林去哪里游泳!
使用熊猫和 Matplotlib 探索柏林哪个区最适合户外游泳者。
我喜欢游泳!尤其是户外。在柏林的夏天,没有什么比去美丽的湖泊或河流中凉快一下更让我喜欢的了。这是我特别欣赏的一件事,因为在我的家乡苏格兰,这种情况很少发生。尽管那里有许多美丽的湖泊和河流,但在一年中的大部分时间里,只有最勇敢的人才会不穿潜水服跳入水中!
考虑到这一点,我决定看看柏林的哪个地区最适合人们居住,如果户外游泳是他们的首要任务的话。由于我是一个非常酷的人,我选择在 Python 中使用流行且强大的数据分析包来研究这个问题。
我在这里的目的是提供一个初学者友好的指南,使用 pandas 和 Matplotlib 中一些基本但强大的功能——创建数据框架。groupby(),。merge()加上其他几个——帮助人们开始数据分析。希望我可以用我的代码示例来说明我是如何操作我的示例数据的,读者可以根据他们自己的需要和项目来使用它。反正就是这么计划的!感谢所有的反馈。
对于任何数据分析项目,第一步都是找到一些数据。谢天谢地,柏林政府有一个开放数据网站,在那里你可以找到各种有趣的(老实说,不太有趣的)数据集进行研究。其中,我们找到了这个的浴场列表,正是我们要找的。谢谢,柏林开放数据!
让我们开始数据分析吧!你可以在 Github 这里跟随笔记本,或者你可以在 Binder 这里运行它,不需要安装任何东西。
首先,让我们导入将要使用的库,并导入数据本身。
import pandas as pd
import numpy as np
import matplotlib.pyplot as pltbad = pd.read_csv('badestellen.csv', sep=';')display(bad)
请注意,我使用的是 Jupyter 笔记本,所以我在这里使用的是display
而不是print
,这提供了一个更有吸引力、更易于导航的输出。这是给你的小费!
这给了我们这样的输出:
那是一些好看的数据!
数据框bad
有 39 行(每一行代表一个不同的浴场)和 23 列(每一列都有与该浴场相关的不同属性)。这应该能给我们一些线索。
现在将是一个很好的时机来提及一些限制我们一般分析的东西。该数据集仅包括城市中的“官方”浴场。按照德国的标准,柏林人相当不守规矩,一般来说,他们也很可能找到并利用“非官方”的浴场——事实上,如果你在夏天四处看看,你会发现人们基本上在任何看起来不错的地方游泳(也有一些看起来不好的地方)。
然而,我将假设任何特定地区的官方和非官方浴场的数量将高度相关,因为它们都是由一个潜在变量驱动的。你能猜到我在想哪个变量吗?
如果你猜中了“该地区的水体数量”,那么你就中奖了(没有奖金)!我认为这是一个相当安全的假设,至少对我们的目的来说是这样,但是在进行任何数据分析时,检查您的假设是否合理,或者是否有一些隐藏的偏见或系统错误潜入您的数据,这总是至关重要的。没有一个数据集是完美的,无论如何,我们经常不得不使用它,但是如果我们能够尽可能意识到我们的数据在哪些方面是不完美的,我们的工作总是会得到改进。好了,哲学结束——回到洗澡的地方!
现在使用 Matplotlib,我们可以很容易地查看城市周围的浴场分布。
plt.hist(bad['bezirk'], rwidth=0.8, bins=np.arange(9)-0.5)plt.xticks(rotation=90)
plt.style.use('seaborn')plt.show()
这给了我们这样的输出:
每个地区浴场的绝对分布
我用了几个小技巧让它比默认的输出更加漂亮。rwidth=0.8
术语将条形的宽度减少到 80%,而不是默认的 100%,这为条形之间提供了一些空间。这使得图表(至少在我看来)更具可读性。bins=np.arange(number of columns + 1) — 0.5
将条形置于 x 轴刻度的中心,这也让输出看起来更好一些。请注意,您需要将(9)
更改为您拥有的列数+ 1,以使其适用于您的图表。
plt.xticks(rotation=90)
将标签旋转 90 度,这样它们就不只是一大堆重叠的文本了。如果你喜欢更活泼的角度,你可以尝试 45 度。最后,plt.style.use('seaborn')
利用了 Matplotlib 已有的样式表(示例此处为),它允许您使用一行代码来更改绘图上的多个表示功能,并且不费吹灰之力就能获得更加个性化的外观!
Matplotlib 非常灵活,但这种灵活性意味着另一方面,如果您希望它做某件特定的事情,您通常需要明确地告诉它该做什么。它受欢迎的一个好处是,你的问题的答案通常只需要一次谷歌搜索。文档总体上是广泛而清晰的,提供了示例,堆栈溢出是咳咳 溢出,有问有答。总的来说,我发现 Python 社区非常受欢迎,如果你有问题或者想做什么,很有可能其他人也想做同样的事情,并在网上的某个地方询问过。在任何级别的编程或一般的数据分析中,谷歌都是你的朋友。
让我们来看看我们美丽的直方图,在我们费尽周折创建它之后。我们可以看到,柏林的 12 个区中,有 8 个区有官方的浴场。Lichtenberg,Mitte 和 Pankow 各有一个,Treptow-kpe nick 以 11 个遥遥领先。从地图上看,这是有道理的——特雷普托-科佩尼克是最大的地区,一眼望去,似乎是最蓝的。
这是我们最基本的分析。只需几个步骤,我们就从 CSV 文件中的原始数据创建了一个熊猫数据框架,并创建了一个可视化,清晰地显示了该数据中的一些有意义的信息。但是我们可以更进一步!
也许知道有多少人住在不同的地区会很有趣,这样我们就可以控制这些地区的人口。也许特雷普托-科佩尼克是人口最稠密的地区,这就是为什么它有最多的海水浴场?或者也许这就是最大的原因?在控制其他变量(如人口和面积)的情况下,对数据进行更多的处理和分析可以让我们回答这些问题。
令人高兴的是,pandas 通过其强大的数据分析功能和核心功能数据框架让这一切变得简单。
为此,我们需要创建一个数据帧,其中包含我们在直方图中显示的信息。我们可以使用来做到这一点。groupby() 还有一点想象力!
stellen_pro_bezirk = pd.DataFrame({'Number_of_Badestellen': bad['bezirk'].groupby(bad['bezirk']).count()}, columns=['Number_of_Badestellen'])display(stellen_pro_bezirk)
这给了我们:
当我们把它绘制成柱状图时,我们会得到:
与之前的图完全相同,除了格式上的变化,因为第一个是直方图,第二个是条形图。我们可能会在处理 Matplotlib 格式时分心,但是我们想要做的只是确认这个数据帧包含了它应该包含的信息。
回到创建这个数据帧的代码行。这太激烈了!事实上,这可能是我们将在这个分析中看到的最复杂的一行代码,所以让我们来分解它。
我们用的是 pd。DataFrame() 创建一个数据帧。该函数可以将 Python 字典作为输入,其中使用键作为列名,使用值作为列数据。我鼓励你通读文档,以便对此有一个坚实的理解。在我们的例子中,我们使用字典
{'Number_of_Badestellen': bad['bezirk'].groupby(bad['bezirk']).count()}
作为我们数据框架的来源。键'Number_of_Badestellen'
只是列标题,这里的主要动作是字典中值端的术语:bad['bezirk'].groupby(bad['bezirk']).count()
这里,我们简单地取原始数据帧的“bezirk”列,按同一列的值分组,并应用。count() 聚合器告诉我们每个值在该列中出现了多少次。例如,“夏洛滕堡-威尔默斯多夫”在数据帧bad
的列bezirk
中出现了 4 次。这将为值“Charlottenburg-Wilmersdorf”创建一个具有相应值“4”的行。不错!
现在,这些数据被表示为一个数据框架,我们准备好获取并整合一些进一步的数据来回答我们的问题。这是事情真正开始的地方!
人口控制
柏林是一个不断增长的大城市,截至 2018 年 12 月,总人口为 3748148 人(我从哪里得到这个数字的?别走开——一切很快就会揭晓!).就我们的目的而言,最好能找到地区一级的人口。这些信息可以从维基百科、获得,但是我们能相信吗?虽然维基百科总的来说比它的名声让你相信的要更准确,但尽可能从原始来源获取信息总是一个好习惯。我们的数据分析技能自己动手也是很好的练习。
我们再次求助于 daten.berlin.de 获取一些数据。快速搜索发现可用的最新数据来自 2018 年 12 月——让我们看看它是否能给我们提供我们正在寻找的信息。
einwohner = pd.read_csv('EWR201812E_Matrix.csv', sep=';')
display(einwohner.head(10))
这给了我们:
这个数据帧有 447 行和 51 列,因此值得花点时间来理解这里的数据是什么,以及它与我们想要做的事情有什么关系。令人欣慰的是,柏林-勃兰登堡统计局(该数据集的创建者,柏林-勃兰登堡统计局)提供了一份补充指南来澄清问题。
我们只是想找出柏林每个区的居民总数。查阅我们的指南,我们可以确定我们主要感兴趣的列是‘BEZ’(代表 Bezirk —区,这里以数字给出)和‘E _ E’(代表 Einwohner insgesamt —总居民)。我们这里有 447 个数据点,比我们的 12 个区还多,但这是可以理解的,因为柏林-勃兰登堡统计局收集和提供的数据比这更精细。通过几行代码,我们可以从这些数据中提取我们想要的信息。
首先,我们创建一个新的 DataFrame,只包含我们感兴趣的列。我们可以在熊猫身上使用很容易地做到这一点。iloc[] :
# Let's slice our dataframe using .iloc[]
einwohner_edited = einwohner.iloc[:,[2,7]]
这给了我们一个 447 行 2 列的数据帧。我们可以使用很容易地按地区汇总数字。groupby() 与链接。sum() 。这将把每一行的“总居民”列E_E
中的值加在一起,并且在BEZ
列中具有唯一值。这将为我们提供每个地区的居民总数,这正是我们要寻找的。
einwohner_sum = einwohner_edited.groupby('BEZ').sum()
display(einwohner_sum)
可以更漂亮,但是数据摆在那里!
不错!现在我们有了各区的总人口。然而,地区只是作为数字给出的。我们怎么知道哪个区是哪个区?嗯,经过一些研究,原来柏林的每个行政区都被分配了一个号码,我们在柏林-勃兰登堡统计局的朋友们总是用这个号码,在其他官方场合也是如此。很高兴知道!
我们可以创建一个包含地区名称的 Python 列表,并将它作为一列添加到我们的新数据帧中,同时给它一些更有意义的列名,如下所示:
bezirke = ['Mitte', 'Friedrichshain-Kreuzberg', 'Pankow', 'Charlottenburg-Wilmersdorf', 'Spandau', 'Steglitz-Zehlendorf', 'Tempelhof-Schöneberg', 'Neukölln', 'Treptow-Köpenick', 'Marzahn-Hellersdorf', 'Lichtenberg', 'Reinickendorf'] einwohner_sum['Bezirk'] = bezirke
einwohner_sum.columns = ['Population', 'Bezirk']
display(einwohner_sum)
😘👌
至此,我们已经将柏林-勃兰登堡统计局的官方统计数据简化为一个简单的数据框架,其中包含了我们感兴趣的数据。现在是时候将我们的数据框架连接在一起了,这样我们就可以继续回答我们的问题了——柏林哪个区的人均洗浴场所最多?
熊猫又来了。我们可以使用 pd,只用一行代码非常简单地做到这一点。 merge(),像这样:
pop_and_badestellen = pd.merge(stellen_pro_bezirk, einwohner_sum, left_on='bezirk', right_on='Bezirk')display(pop_and_badestellen)
这产生了:
太美了
刚刚到底发生了什么?我们使用非常强大的 pd.merge() 函数将两个数据帧stellen_pro_bezirk
和einwohner_sum
合并成一个闪亮的新数据帧。要做到这一点,我们需要告诉熊猫合并哪些列(即在哪些列中寻找匹配),这就是这里的参数left_on='bezirk', right_on='Bezirk'
所做的。如果我们的专栏有相同的名字(当我们命名它们为 tbh 时,这是一个非常聪明的做法),那么我们可以只使用on='Bezirk'
,但是 pandas 足够灵活,可以给我们提供选择。
与 pd.merge() 的默认合并被称为‘内部连接’——这意味着只有匹配的行才会被返回。这就是为什么尽管einwohner_sum
有 12 行,我们最终在新的数据帧pop_and_badestellen
中有 8 行。当我们使用内部连接时,“bezirk”和“Bezirk”不匹配的行将被删除。在我们的例子中,这正是我们想要的行为,但是如果我们想要一个外部连接(其中所有的行都被保留,缺失的值用空值填充(pandas 中的 NaN)),我们可以通过使用参数how='outer'
很容易地实现。
好了,现在我们已经合并了我们的数据框架,让我们继续前进,并开始控制人口!我们可以用一些非常简单的数学来做这个:
pop_and_badestellen['badestellen_pro_einwohner'] = pop_and_badestellen['Number_of_Badestellen'] / pop_and_badestellen['Population']
这里,我们在 DataFrame ( badestellen_pro_einwohner
)中创建了一个新列,这是将每个地区的浴场数量除以那里的人口数的简单结果。我告诉过你数学很简单!现在我们可以绘制这个新列,看看我们能学到什么。
plt.bar(data=pop_and_badestellen, x='Bezirk', height='badestellen_pro_einwohner')
plt.xticks(rotation=90)plt.show()
这给了我们:
漂亮!所以我们可以看到,当我们控制人口时,结果大致相同。trep tow-KP enick 仍然处于领先地位,人均浴场数量最多,Reinickendorf 仍然位居第二,其他排名基本符合我们之前绘制的绝对数字。
这也许不像控制人口完全颠覆了早期的结果那样令人兴奋,但是这对于我们的分析是非常有用的信息。我们可以看到,如果我们从绝对数量的角度来考虑沐浴点的数量,或者如果我们从人均沐浴点的数量来看,我们的数据显示了类似的情况。如果我们要根据我们的分析提出建议(相信我,我们会的!)那么这个加强了那些。
按区域控制
我们的下一步是考虑每个地区的面积。特雷普托-科佩尼克是该市最大的区,所以也许这就是那里有这么多海水浴场的原因。让我们做一些进一步的分析,看看我们能发现什么。
我们的第一步是获取每个地区的数据。我再次从我们在柏林-勃兰登堡的统计局的老朋友那里得到了这个消息。我们可以做一些奇特的事情,如保存为 CSV 或 Excel 文件,并使用熊猫()导入它。read_csv() 和。read_excel() 将是这种情况下的首选武器),如果我们的数据集更大,那么这肯定是明智的选择。然而,我们只有 12 个条目,所以我们可以简单地编写一个 Python 列表(与我们的数据帧中的数据顺序相同),并将其作为新列添加到我们的einwohner_sum
数据帧的副本中,如下所示:
area = [3947, 2041, 10306, 6472, 9187, 10256, 5303, 4493, 16842, 6178, 5212, 8931][einwohner_area = einwohner_sum](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.copy.html).copy()
einwohner_area['Fläche'] = areadisplay(einwohner_area)
有必要使用。copy() 方法,如果我们想创建一个新的 DataFrame 对象(所谓的“深度复制”)。如果我们只使用einwohner_area = einwohner_sum
,任何后续的更改都会影响两个数据帧,因为它们都是对 Python 中一个对象的引用。这相当复杂,但是你可以阅读更多关于它的内容来更好地理解这在 Python 中是如何工作的。
然后,我们只需添加一个新列“flche”(在德语中是“area”的意思),这就是我们的新列表。嘣!
然后,如果您阅读了本文的前一部分,我们将遵循一个非常熟悉的过程(如果您没有,您在这里做什么?回去读吧!太棒了!).
# merge the DataFrames
area_and_badestellen = pd.merge(stellen_pro_bezirk, einwohner_area, left_on='bezirk', right_on='Bezirk')# create a new column
area_and_badestellen['badestellen_pro_km'] = area_and_badestellen['Number_of_Badestellen'] / area_and_badestellen['Fläche']display(area_and_badestellen)
是不是很可爱?
现在我们有了看到结果所需的所有信息,但是我们只需要再做一步就可以像以前一样把它变成一个漂亮的图表。
area_and_badestellen.sort_values(by='badestellen_pro_km', inplace=True) # sorting for purely aesthetic reasonsplt.bar(data=area_and_badestellen, x='Bezirk', height='badestellen_pro_km')
plt.xticks(rotation=90)plt.show()
这给了我们:
有意思!
在这里查看我们的结果,我们可以看到,如果您只是对该地区浴场的纯粹集中感兴趣,那么 Reinickendorf 就是您应该去的地方。根据这一指标,上届冠军特雷普托-科佩尼克(Treptow-kpenick)已经退居第三位——仍然表现强劲,但不再是第一名。
将它整合在一起
那么我们学到了什么?嗯,主要是说,如果你想在附近拥有最多的游泳场所,以及最少的人使用它们,那么特雷普托-科佩尼克就是你要去的地方!然而,柏林有一个非常好的公共交通系统,所以仅仅因为这个地区拥有最高的人均浴场率,并不意味着你将拥有整个地方。
如果你对纯粹的集中浴场更感兴趣(也许你想在一天内参观几个?),那么 Reinickendorf 就是适合你的地方。然而,总的来说,从这一分析中,我们可以有把握地向一个正在寻找新住处的假想的人提出建议,他最关心的是附近有许多洗澡的地方。他们应该搬到特雷普托-科普尼克。那里真好!
这说明了任何数据分析项目的关键点。你可以做出最漂亮的可视化效果,或者以最奇特、最复杂的方式操纵数据,但最终要让你的分析有意义、有用,你需要拥有你正在分析的领域的领域知识,或者与拥有这种知识的人合作。这有助于你避免尴尬的误解,也有助于你获得有益的见解,实际上为你的听众带来好处,不管他们是谁。
我希望这篇文章能帮助您了解我们如何通过 pandas 和 Matplotlib 库使用 Python 轻松而强大地操作数据。我们在这里使用的技术都是您可以在未来的数据分析项目中反复使用的。
非常感谢您抽出时间和我一起探讨这个话题。和往常一样,我非常欢迎你的反馈——你可以在 Twitter 上联系我,地址是@craigdoedata,让我知道我该如何更有效地完成这项分析。我仍然在学习,我也想知道你的秘密,所以请与我分享。
再说一遍,整个 Jupyter 笔记本和相关文件都可以在我的 Github 页面和活页夹上找到,我鼓励你使用它们。
下次见!
更像这样?访问craigdoedata . de