如何用带有 Keras 的 CNN 预测一个图像?
图片里有什么?
如何预测图像的类型?
确定图像包含什么对象有以下六个步骤?
- 加载图像。
- 将其调整为预定义的大小,如 224 x 224 像素。
- 将像素值缩放到范围[0,255]。
- 选择预先训练的模型。
- 运行预先训练的模型。
- 显示结果。
如何预测图像的类型
使用 Keras 实施解决方案
要求
安装 TensorFlow 和 Keras。
pip install tensorflow
设置您的环境
首先,我们设置环境。
# TensorFlow and tf.kerasimport tensorflow as tf
from tensorflow.keras.applications.resnet50 import preprocess_input, decode_predictions
from tensorflow.keras.preprocessing import image# Helper libraries
import numpy as np
import matplotlib.pyplot as plprint(tf.__version__)
加载图像
然后,我们加载并尝试显示我们想要预测的图像。
img_path = "./samples/dog_1100x628.jpg"plt.imshow(img)
plt.show()
它展示了一只维兹拉狗,那么我们的模型如何预测这个图像呢?
调整图像大小
请记住,在将任何图像输入 Keras 之前,我们需要将其转换为标准格式,因为预先训练的模型希望输入具有特定的大小。在这种情况下,我们需要将图像的大小调整为 224 x 224 像素。
img = image.load_img(img_path, target_size=(224, 224))
第二是大多数深度学习模型期望一批图像作为输入。在这种情况下,我们创建一批一个图像。
img_array = image.img_to_array(img)
img_batch = np.expand_dims(img_array, axis=0)
将像素值缩放到一致的范围
第三,当数据在一个一致的范围内时,模型表现良好。在这种情况下,图像像素值的范围是从 0 到 255。因此,如果我们在输入图像上运行 Keras 的preprocess_input()
函数,就会将每个像素标准化到一个标准范围。
img_preprocessed = preprocess_input(img_batch)
选择预先训练的模型
这里,我们将使用一个名为 ResNet-50 的 CNN 网络。
model = tf.keras.applications.resnet50.ResNet50()
运行预先训练的模型
prediction = model.predict(img_preprocessed)
显示结果
Keras 还提供了decode_predictions
函数,它告诉我们图像中包含的每一类对象的概率。
print(decode_predictions(prediction, top=3)[0])
下面是运行这个程序时的输出。
[(‘n02099601’, ‘golden_retriever’, 0.75317645),
(‘n02100583’, ‘vizsla’, 0.061531797),
(‘n02099267’, ‘flat-coated_retriever’, 0.04048888)]
该图像的预测类别是各种类型的狗。
三种狗
完整的源代码完成。
很简单,对吧?
参考
https://github . com/house cricket/how _ to _ predict _ an _ image _ with _ keras
如何预测 Sparkify 中的搅拌
使用 Spark 预测哪些用户有可能因取消服务而流失
简介
parkify 是一种流行的数字音乐服务,类似于由 Udacity 创建的 Spotify 或 Pandora。该项目的目标是预测哪些用户有被取消服务的风险。如果我们能在这些用户离开之前识别出他们,我们就能为他们提供折扣或激励。
用户可以做的不同页面动作是,例如,播放一首歌、喜欢一首歌、不喜欢一首歌、登录、注销、添加朋友或者在最坏的情况下取消服务。我们所知道的关于用户的信息是 id、名字和姓氏、性别、他们是否登录、他们是否是付费用户、他们的位置、他们注册的时间戳以及用户使用的浏览器。我们对他们正在听的歌曲的了解是艺术家的名字和歌曲的长度。
作者在 Sparkify data 上的图片
第一部分:用户故事示例
让我们以单个用户为例来更好地理解用户可以做的交互。让我们研究一下来自北卡罗来纳州罗利的用户 id 2 Natalee Charles 的三个操作。
Row(artist=None, auth='Logged In', firstName='Natalee', gender='F', **itemInSession=1**, lastName='Charles', length=None, level='paid', location='Raleigh, NC', method='GET', **page='Home'**, sessionId=1928, song=None, status=200, userAgent='"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36"', userId='2', timestamp='2018-11-21 18:04:37', registration_timestamp='2018-09-13 02:49:30'),Row(**artist='Octopus Project'**, auth='Logged In', firstName='Natalee', gender='F', **itemInSession=2**, lastName='Charles', **length=184.42404**, level='paid', location='Raleigh, NC', method='PUT', **page='NextSong'**, sessionId=1928, **song='What They Found'**, status=200, userAgent='"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36"', userId='2', timestamp='2018-11-21 18:04:45', registration_timestamp='2018-09-13 02:49:30'),Row(**artist='Carla Bruni'**, auth='Logged In', firstName='Natalee', gender='F', **itemInSession=3**, lastName='Charles', length=123.48036, level='paid', location='Raleigh, NC', method='PUT', page='NextSong', sessionId=1928, song="l'antilope", status=200, userAgent='"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36"', userId='2', timestamp='2018-11-21 18:07:49', registration_timestamp='2018-09-13 02:49:30'),...Row(artist=None, auth='Logged In', firstName='Natalee', gender='F', itemInSession=106, lastName='Charles', length=None, level='paid', location='Raleigh, NC', method='PUT', **page='Add Friend'**, sessionId=1928, song=None, status=307, userAgent='"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36"', userId='2', timestamp='2018-11-21 23:30:04', registration_timestamp='2018-09-13 02:49:30')
第一个动作是会话中的第一个动作:访问主页。第二个动作是听一首歌,这允许我们收集关于歌曲本身的信息:艺术家、歌曲和长度。第三个动作是听一首不同的歌(卡拉·布鲁尼:l’antilope)。整个会话的最后一个操作是添加一个朋友。
第二部分:识别特征
用于搅动的用户的定义是提交取消确认的用户。我们需要找到代表两种用户类型之间巨大差异的特征:一个用户频繁使用,一个用户不频繁使用。困难在于,数据中包含的搅动数(233290)比非搅动数(44864)多得多,这意味着,尽管数据不平衡,我们也必须找到具有可比性的特征。
作者图片
第一个想法是按会话比较项目,因为会话的持续时间不受用户数量的影响,只受会话中项目数量的影响。音乐服务平台最重要的项目是歌曲的播放。这导致决定比较两种用户类型之间的下一首歌曲的数量。恶心的人最多听 708 首歌,而不恶心的人最多听 992 首。流失用户平均听了 70 首歌,非流失用户平均听了 105 首。这是一个很好的特性,因为我们已经看到了这两种用户类型的很多差异。
作者图片
第二个想法是检查两种用户类型之间的比例差异。数据中已经有用户类型定义,级别(免费/付费用户)。我们想研究搅动和非搅动的比例分布是否不同。我们可以看到,非用户的付费用户比例高于用户,而用户的免费用户比例也高于用户。这也是一个很棒的特性,因为在这种情况下,免费用户比付费用户更容易流失。
第三部分:建模
我们使用逻辑回归来寻找预测搅拌的最佳模型。因为我们有一个二元决策,所以我们使用 BinaryClassificationEvaluator 来评估结果。由于被搅动的用户是一个相当小的子集,我们使用 f1 分数(结合准确度)作为优化的指标。我们使用三种不同的输入类型来测试,例如,在训练之前对数据进行加权是否会提高 f1 分数。另一个测试是删除重复项。
基于三种不同输入数据类型的作者图像
在第一轮中,通过所有数据和加权数据获得最佳精度和 f 值。他们都取得了同样的结果。但是唯一的数据集实现了标签 1 的最佳 f 值。
**All data**
Accuracy: 0.9023548583351629
F-measure: 0.8560382799176114
F-measure by label:
label 0: 0.9486714367527147
label 1: 0.0**Weighted data**
Accuracy: 0.9023548583351629
F-measure: 0.8560382799176114
F-measure by label:
label 0: 0.9486714367527147
label 1: 0.0**Unique data**
Accuracy: 0.6666666666666666
F-measure: 0.5859374999999999
F-measure by label:
label 0: 0.7906666666666665
label 1: 0.18229166666666666
在第二轮中,我们使用基于阈值的 f 得分的最大值的最佳阈值。总准确度和 f 值下降,但标签 1 的 f 值上升。最好的 f 1 测量(标签 1)是由唯一的数据集实现的,而最好的总精度和 f 测量是由另外两个数据集实现的。
**All data**
Accuracy: 0.7611244603498374
F-measure: 0.7955698747928712
F-measure by label:
label 0: 0.8594335689341074
label 1: 0.20539494445808643**Weighted data**
Accuracy: 0.7611244603498374
F-measure: 0.7955698747928712
F-measure by label:
label 0: 0.8594335689341074
label 1: 0.20539494445808643**Unique data** Accuracy: 0.5859872611464968
F-measure: 0.5914187270302529
label 0: 0.6044624746450304
label 1: 0.5657015590200445
最后一轮(参数调整)使用不同的参数来优化平均指标。在参数调整后,独特数据集预测 317 个预期标签 1 值中的 597 个,在测试数据上的准确度为 0.5754,而所有数据集预测 73990 个预期标签 1 值中的 134437 个,在测试数据上的准确度为 0.7786。
**All data** Average Metric Max: 0.5703188574707733
Average Metric Min: 0.5
Accuracy on test data: 0.7786
Total count of Label 1 prediction: 134437
Total count of Label 1 expectations: 73990**Unique data** Average Metric Max: 0.6750815894510674
Average Metric Min: 0.5
Accuracy on test data: 0.5754
Total count of Label 1 prediction: 597
Total count of Label 1 expectations: 317
结论
作者根据 1.0 =搅动的最佳预测制作的图片
最好的模型是使用我们选择的特征的所有数据的模型。总精度和 f 值低于其他测试模型,但它提供了标签 1 值的最佳预测,这是该模型的主要用例。
通过使用其他算法,例如随机森林分类器或梯度增强树分类器,可以进行进一步的改进。另一个改进的来源可能是更多的特征,这些特征改进了最终模型的预测。
要了解这个项目的更多信息,请点击这里查看我的 Github 的链接。
如何在 Spark 上使用机器学习模型预测客户流失?
使用 Spark 探索您的大数据,这是一种初学者方法。
Oleg Gratilo 在 Unsplash 上拍摄的照片
如果你以前处理过机器学习模型,你就会知道处理庞大数据集时的感受。在某些时候,我们都意识到了这一障碍,并选择使用较小部分的数据,从数据分析和训练模型开始。
介绍
大数据非常模糊,但我们都同意,每当我们感觉到笔记本电脑或机器的计算能力受到限制时,由于数据集的巨大规模,我们会将其视为大数据问题。而且,让我们面对现实吧,像 pandas 这样的 python 数据分析库,由于其本地内存限制和性能问题,在处理大型数据集时有其自身的局限性。
商业理解
Sparkify 是一个虚构的音乐流媒体服务,就像 Spotify 或 Pandora 一样,我将使用 Sparkify 流失预测作为问题陈述来详细解释这篇文章。我将在这个项目中使用 PySpark。
注 : Sparkify 数据集由 Udacity 数据科学家纳米学位项目提供,本文是我的顶点项目的一部分。
数据理解
我在本地机器上用 Udacity 提供的小型 Sparkify 数据集开始进行探索性数据分析。
*# loading dataset*
df = spark.read.json("mini_sparkify_event_data.json")*# columns in dataset*
df.printSchema()root
|-- artist: string (nullable = true)
|-- auth: string (nullable = true)
|-- firstName: string (nullable = true)
|-- gender: string (nullable = true)
|-- itemInSession: long (nullable = true)
|-- lastName: string (nullable = true)
|-- length: double (nullable = true)
|-- level: string (nullable = true)
|-- location: string (nullable = true)
|-- method: string (nullable = true)
|-- page: string (nullable = true)
|-- registration: long (nullable = true)
|-- sessionId: long (nullable = true)
|-- song: string (nullable = true)
|-- status: long (nullable = true)
|-- ts: long (nullable = true)
|-- userAgent: string (nullable = true)
|-- userId: string (nullable = true)*# Number of Rows*
df.count()286500# *showing types of events in dataset or pages a user might visit while using the Sparkify app.*df.select("page").dropDuplicates().show()+--------------------+
| page|
+--------------------+
| Cancel|
| Submit Downgrade|
| Thumbs Down|
| Home|
| Downgrade|
| Roll Advert|
| Logout|
| Save Settings|
|Cancellation Conf...|
| About|
| Settings|
| Add to Playlist|
| Add Friend|
| NextSong|
| Thumbs Up|
| Help|
| Upgrade|
| Error|
| Submit Upgrade|
+--------------------+
数据准备
在数据准备期间,我处理了一些数据挑战,比如缺失值、数据清理、输入分类变量以及确定一个目标变量来预测流失的客户。
为了准确预测流失的客户,我们需要他们的 userId 信息,因此通过删除 userId 为 null 或空的所有行来清理数据。
添加一个目标变量为*。如果用户访问了“ 取消确认 ”页面,则*列的值为 1,否则为 0。**
数据可视化
让我们通过可视化方式更深入地了解 Sparkify 客户。
****
按流失类型划分的总客户分布
基于服务水平的总客户分布
Sparkify 有两种服务,一种是免费的广告服务,另一种是付费服务。我们的目标是在付费客户停止使用该应用程序之前识别他们。
下面的事件代表了一组非常重要的特征来预测被搅动的顾客。
总事件分布
特征工程
是时候选择重要的特征来训练我们的机器学习模型了。
****['gender', 'level', 'page', 'userId', 'Churn']****
页面的 列将进一步划分为它的事件。
**df.groupBy(["userId", "Churn", "gender", "level"]).count().show()+------+-----+------+-----+-----+
|userId|Churn|gender|level|count|
+------+-----+------+-----+-----+
|200008| 0| 1| 1| 1988|
| 93| 0| 0| 0| 566|
|100013| 1| 1| 0| 303|
| 91| 0| 0| 1| 2862|
| 4| 0| 0| 0| 141|
|300021| 0| 1| 1| 4650|
|100019| 1| 0| 0| 89|
|100021| 1| 0| 0| 319|
| 140| 0| 1| 1| 5662|
| 73| 1| 1| 0| 16|
| 59| 0| 0| 1| 693|
|200025| 0| 0| 0| 597|
| 41| 0| 1| 1| 2220|
| 37| 0| 0| 0| 79|
| 54| 1| 1| 1| 2859|
| 69| 0| 1| 0| 39|
|200024| 1| 0| 0| 342|
|300005| 0| 1| 0| 64|
| 27| 0| 0| 0| 291|
| 101| 1| 0| 0| 76|
+------+-----+------+-----+-----+
only showing top 20 rowsEvent_list = [(row['page']) for row in df.select('page').dropDuplicates().collect()]
for event in Event_list:
df_temp = df.filter(df.page==event).groupBy(df.userId).count()
df_temp = df_temp.withColumnRenamed('count', event)
df_sparkify = df_sparkify.join(df_temp, 'userId', how='left')**
将 页面 事件分发到自己的类别中作为一列后,dataframe 看起来是这样的。
**df_sparkify.printSchema()root
|-- userId: integer (nullable = true)
|-- Churn: integer (nullable = true)
|-- gender: integer (nullable = true)
|-- level: integer (nullable = true)
|-- count: long (nullable = false)
|-- Cancel: long (nullable = true)
|-- Submit Downgrade: long (nullable = true)
|-- Thumbs Down: long (nullable = true)
|-- Home: long (nullable = true)
|-- Downgrade: long (nullable = true)
|-- Roll Advert: long (nullable = true)
|-- Logout: long (nullable = true)
|-- Save Settings: long (nullable = true)
|-- Cancellation Confirmation: long (nullable = true)
|-- About: long (nullable = true)
|-- Settings: long (nullable = true)
|-- Add to Playlist: long (nullable = true)
|-- Add Friend: long (nullable = true)
|-- NextSong: long (nullable = true)
|-- Thumbs Up: long (nullable = true)
|-- Help: long (nullable = true)
|-- Upgrade: long (nullable = true)
|-- Error: long (nullable = true)
|-- Submit Upgrade: long (nullable = true)**
相关性—热图
注意 : Dataframe 可能看起来与全数据集不同,在 AWS Spark 上运行。
将所有列字符串值更改为数字形式后,dataframe 就可以进行建模了。
注:为了防止 数据在建模过程中泄露 ,删除了“取消”和“取消确认”栏。
建模
AWS Spark MLlib 库支持很多有监督和无监督的机器学习算法。我使用了决策树分类器、随机森林分类器和梯度推进分类器来训练三个模型,并在选择获胜模型之前比较结果。
列车测试分割
**# spliting in 70% training and 30% testing settrain_data,test_data = final_data.randomSplit([0.7,0.3])**
分类器
**# Using three classifiers before finalizing best performerdtc=DecisionTreeClassifier(labelCol='Churn',featuresCol='features')
rfc=RandomForestClassifier(labelCol='Churn',featuresCol='features', numTrees=300)
gbt=GBTClassifier(labelCol='Churn',featuresCol='features')# fit the models
dtc_model = dtc.fit(train_data)
rfc_model = rfc.fit(train_data)
gbt_model = gbt.fit(train_data)# transform the models
dtc_predictions = dtc_model.transform(test_data)
rfc_predictions = rfc_model.transform(test_data)
gbt_predictions = gbt_model.transform(test_data)**
评估指标
在 pySpark 中,我们可以不打印混淆矩阵,而是要用multiclassacrificationevaluator来评估 准确度 和 f1_score 。我们也可以使用 BinaryClassificationEvaluator 来计算ROC 曲线下的面积和 Precision-Recall 下的面积。
**# calculating accuracy
acc_evaluator = MulticlassClassificationEvaluator(labelCol="Churn",predictionCol="prediction",metricName="accuracy")# calculating f1 score
f1_evaluator = MulticlassClassificationEvaluator(labelCol="Churn",predictionCol="prediction", metricName="f1")areaUnderROC = BinaryClassificationEvaluator(labelCol='Churn',metricName='areaUnderROC')areaUnderPR = BinaryClassificationEvaluator(labelCol='Churn',metricName='areaUnderPR')dtc_acc = acc_evaluator.evaluate(dtc_predictions)
rfc_acc = acc_evaluator.evaluate(rfc_predictions)
gbt_acc = acc_evaluator.evaluate(gbt_predictions)dtc_f1 = f1_evaluator.evaluate(dtc_predictions)
rfc_f1 = f1_evaluator.evaluate(rfc_predictions)
gbt_f1 = f1_evaluator.evaluate(gbt_predictions)dtc_auc = areaUnderROC.evaluate(dtc_predictions)
rfc_auc = areaUnderROC.evaluate(rfc_predictions)
gbt_auc = areaUnderROC.evaluate(gbt_predictions)dtc_aupr = areaUnderPR.evaluate(dtc_predictions)
rfc_aupr = areaUnderPR.evaluate(rfc_predictions)
gbt_aupr = areaUnderPR.evaluate(gbt_predictions)**
比较所有模型的评估
结果
预测和防止客户流失对每个公司来说都意味着巨大的额外潜在利益来源。我们的目标从一开始就是识别那些 Sparkify 客户。
在不同评价指标上比较所有模型后,梯度提升表现优于其他两个。您可以看到梯度增强算法的 f1 值为 0.90,而随机森林的 f1 值为 0.79。
我相信一个模型有更高的回忆分数用于积极的客户流失分类。用 Lehman 的话来说,选择一个能够预测较少假阴性(类别为 1 但预测为 0 的情况)而不是假阳性(类别为 0 但预测为 1 的情况)的模型,以成功识别流失客户。
我将选择梯度推进分类器作为我现在的最终模型。
部署
作为我未来的工作,我将在 AWS Spark Cluster 上运行这段代码。但是,我现在不会在任何地方部署这个模型。
未来作品
- 在未来,我可以尝试将整个数据集分离成每月或每周的数据,并预测下个月或下个星期的客户。
- 我可以通过结合两种或更多种算法来使用更先进的机器学习技术,以提高整体预测率。
- 我可以在 AWS 集群上运行这个来查看模型性能,并使用交叉验证来获得更好的 f1 分数。
附注:在我的数据科学项目中,我总是试图遵循 CRISP-DM 方法。
本文是 Udacity 数据科学家纳米学位项目的一部分。要查看更多关于此分析的内容,请在此处 查看我的 Github 可用链接 。
用随机森林模型估计国际足联球员的价值
米奇·罗森在 Unsplash 上的照片
背景:
每年,EA Sports 都会根据每位国际足联球员目前的状态发布其评级。为了确保数据库中的每个球员都得到适当的评级,EA Sports 会在在线赛季的实时数据库中更新整个赛季的球员评级。
对于数据科学家和足球迷(恰好是我自己)来说,这是一个很好的数据资源。每个国际足联的球员都被赋予了一个分数,包括运球、速度、加速度等等。更重要的是,它为每个球员提供了市场价值和工资。因此,我有兴趣看看我是否可以应用机器学习技术来发现模式,识别和排列特征的重要性,并预测未来新玩家的价值。
虽然球员的价值和工资可能是真实的,但每个属性的评级都是主观的,来自 EA Sports,该公司推广自己的视频游戏 FIFA 2020。尽管有这样的免责声明,但这仍然是一个值得探索的有趣实践。完整的代码可以在这里找到。
数据收集:
所有数据来自 fifaindex.com。使用 BeautifulSoup,我通过迭代获得每个玩家的 ID,然后循环进入每个玩家的页面,收集这些属性的评级。数据被用作下一步的输出。
数据探索:
与任何数据科学项目一样,我必须清理数据,例如删除“”并将字符串转换为数值。由于大多数属性是针对场上球员的,所以我缩小了范围,排除了那些守门员。同时,我创建了几个我认为更相关的新的派生属性。例如,身体质量指数可能是一个比体重或身高更好的指标。
在所有数据清理之后,数据集中有 17,286 名球员。每个玩家都有自己的价值和 39 个属性。目标是创建一个模型来预测基于这些属性的价值。
接下来,我探索了球员的价值与一些属性如速度、敏捷等之间的关系。他们中的许多人都表现出了很强的人际关系。我还检查了那些分类特征,比如“首选位置”,看看它是否对价值有影响(确实有)。
plt.bar(df['Acceleration '], df['Value '])
plt.show()
加速度与数值
plt.bar(df['Preferred Positions '], df['Value '])
plt.show()
位置与价值
对于这些属性,直方图是检查数据是否遵循正态分布的好方法。还检查了相关性。通过颜色编码,可以非常直观地显示哪些属性是正相关/负相关的。
df['Dribbling '].plot(kind='hist', bins=20)
plt.show()
运球直方图
corr = df.corr(method ='pearson')
corr.style.background_gradient(cmap='coolwarm').set_properties(**{'font-size': '0pt'})
特征相关性(仅部分显示)
建立模型:
为了便于说明,我删除了“工资”和“交易”,它们可以用于单独的练习。作为例行工作的一部分,数据被分成训练和测试两部分。
X, y = df.drop(['Value ','Wage ','Deal'], axis=1), df['Value ']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
因为我们的属性包括数值和分类数据,所以引入了两种类型的数据转换(MinMaxScaler 和 OneHotEncoder)。MinMaxScaler 本质上是将不同尺度的数值数据转换成从 0 到 1 的特征范围。OneHotEncoder 用于将分类数据转换为虚拟变量数组。使用 ColumnTransformer,我在一个步骤中转换了所有输入数据,以便进行后续的模型构建。
numerical_ix = X_train.select_dtypes(include=['int64', 'float64']).columns
categorical_ix = X_train.select_dtypes(include=['object', 'bool']).columns
t = [('cat', ce.OneHotEncoder(use_cat_names=True), categorical_ix), ('num', MinMaxScaler(), numerical_ix)]
col_transform = ColumnTransformer(transformers=t)
为了得到更准确的模型,我应用 KFold 作为交叉估值,将训练数据随机拆分 X 次,分别运行。
cv = KFold(n_splits=5, shuffle=True, random_state=0)
我使用了 RandomForestRegressor 来开发模型。给定几十个参数组合,我为迭代创建 grid_param,然后引入 GridSearchCV 来运行整个过程。这种迭代将使用一系列不同的参数进行模型拟合,在 5 重交叉验证的基础上,自动找到最佳值。
grid_param = {
"m__n_estimators" : [100, 300, 500],
"m__max_features" : ["auto", "sqrt", "log2"],
"m__min_samples_split" : [2,4,8],
"m__bootstrap": [True, False],
}gd_sr = GridSearchCV(pipeline,
param_grid=grid_param,
scoring='r2',
cv=cv,
n_jobs=3)
一旦最佳模型符合数据,我就将它应用于测试数据。通过比较预测值和真实测试值,我能够得到准确性分数。结果相当令人满意,相关系数为 0.91。
y_pred = gd_sr.predict(X_test)
from sklearn.metrics import r2_score
test_score = r2_score(y_test, y_pred)
print(test_score)
然后,我进一步检查了特征的重要性,令人惊讶的是,最重要的特征是“反应”,它的价值远远高于任何其他特征,如“冲刺速度”和“击球力量”,我之前怀疑这些特征的重要性很高。另一个最重要的特征是“年龄”,这与国际足联球员的价值呈负相关。这是理所当然但可悲的事实😊。
feature_importance = gd_sr.best_estimator_.named_steps['m'].feature_importances_
output = pd.DataFrame(list(zip(feature_name,feature_importance)))
output.columns = ['feature_name','feature_importance']
output.sort_values(by='feature_importance', ascending=False)
顶级功能
我尝试了第二个模型梯度推进回归树,另一个健壮的回归模型。同样的交叉估价程序也已实施。结果甚至更好,r 接近 0.94。与随机森林相似,最重要的特征也是“反应”,其他顶级特征也相似。
结论:
就像典型的数据科学项目一样,我经历了数据收集、可视化探索、特征转换、交叉估值、参数搜索、模型拟合和测试的过程。最后,我认为参数合适的梯度推进模型是预测国际足联球员价值的最佳模型。
目前,这种模式是所有人的混合体。同时,为不同位置的球员探索和开发不同的模式是值得的。对进攻球员来说,诸如“滑铲”等属性的评分并不像防守球员那样重要。按位置划分球员将有助于建立一个更加精确的模型。
房产经纪如何预测美国家庭收入?
一个 ML 框架,以潜在买家为目标,并在新冠肺炎驱动的住房危机中促进低成本住房选择
蒂埃拉·马洛卡在 Unsplash 上拍摄的照片
一个 框架 利用数据解决现实世界的商业问题…
思维能力
哈佛大学住房研究联合中心最近的一份报告谈到了美国高成本租金的强劲增长是如何与低成本住房的急剧下降同时发生的。它还谈到了住房不稳定性的增加,其中,2018 年,收入在 3 万美元至 44,999 美元之间的租房者每月剩余 2,010 美元用于非住房支出——比 2001 年每月减少近 9%,或一年内总共减少 2,300 美元。
在新冠肺炎·疫情之后,根据布鲁金斯学会的数据,形势已经恶化,
甚至在新冠肺炎疫情之前,数百万美国人就缺乏稳定、负担得起的住房。现在,这场危机凸显了安全网中这一关键缺口的社会和经济成本。居住在质量差、拥挤或不稳定的住房中的人——或者根本没有家的人——无法按照公共卫生指令安全地“就地避难”因此,他们感染这种病毒以及其他慢性疾病的风险要大得多。
因此,考虑到人们不像以前那样有强大的购买力,利用新时代的数据分析不仅可以帮助普通美国人,还可以帮助房地产经纪公司应对未售出房屋的令人难以置信的挑战,这变得非常重要。
测量和实验——一个 ML 框架
收入是最重要的变量,有助于决定他或她能买得起哪种房地产。这种买方水平的信息可以很容易地从 UCI 的人口普查收入数据集中得到。这个数据可以很容易地替换为经纪公司可能获得的最新收入数据。ML 框架将在 Google Colab 上实现,包括以下要点:
- **业务简介:**房地产经纪公司
- **问题类型:**未售出房产
- **工作单位:**住房单位
- **价值指标:**房屋销售收入
- **目标:**锁定潜在买家
- 数据来源: UCI 人口普查数据(存储在 AWS S3 )
- **唯一标识符:**公民个人
- **客观问题:**预测收入是否 50K 美元
- 信号:收入,年龄,职业,国籍,工作级别,婚姻状况,教育,种族,性别
使用的算法:
由于我们需要预测收入是> 50K 还是≤50K,这是一个二元分类问题。因此,我们将使用以下机器学习算法:
- 逻辑回归
- SVM
- 决策图表
- 随机森林
在此之后,我们需要按照网格搜索微调超参数,以便模型理解这种关系,并能够预测此人的收入是否超过 5 万美元。收到的高 AUC 分数证实所选模型工作正常。
图一。分析中使用的 ML 算法的训练分数
为什么选择谷歌合作实验室?
Colaboratory,简称“Colab ”,允许您在浏览器中编写和执行 Python,使用
- 不需要配置
- 免费访问 GPU
- 轻松分享
在我们的业务用例中,它将允许经纪公司充分利用流行的 Python 库来分析和可视化数据。
为什么选择亚马逊 S3?
亚马逊简单存储服务(亚马逊 S3)是一种对象存储服务,提供行业领先的可扩展性、数据可用性、安全性和性能。这意味着各种规模和行业的客户都可以使用它来存储和保护各种使用情形下的任意数量的数据,例如网站、移动应用程序、备份和恢复、归档、企业应用程序、物联网设备和大数据分析。
在我们的业务用例中,亚马逊 S3 将为房地产公司提供易于使用的管理功能,以组织数据和配置微调的访问控制,从而满足特定的业务、组织和法规遵从性需求。
沟通
从分析中可以得出以下关键业务见解:
- 大多数人收入不到 50K
- 受过高等教育的人收入超过 5 万
- 男性的收入比女性高
- 更多的已婚人士收入超过 5 万英镑
- 目标人群收入低于 5 万英镑,可选择低价住房
未来范围
诸如信用历史、储蓄或流动债务等其他参数也可以包括在内,以更全面地了解个人的购买力和负债。
结论
本文的目的是提供一个框架,从构思- >测量- >实验- >沟通,说明如何使用数据科学工具和机器学习来解决现实世界的业务问题,尤其是在一个受到疫情打击的世界正在应对各种挑战的时候,其中之一是美国的住房危机,以及为面临高失业风险的人提供负担得起的住房选项的需要。
如何准备用于字符识别和分割的自定义数据集?
详细说明
本文是对泰卢固文字识别研究的一部分。它的重点是为字符识别创建一个自定义数据集,不用担心,你可以用它来为“对象识别”和“分割”任务创建你自己的数据集。
我们开始吧,
目录
- 简介
- 所需工具
- 创建数据集
介绍
字符识别用于识别来自不同来源的字符,如阅读邮政地址、银行支票、表格、招牌等。它广泛应用于银行、教育、国防、信息技术等领域,不胜枚举。
我们将开发一个包含泰卢固语的前 6 个元音的数据集。这是一张泰卢固语元音的图片,带有发音和辅助符号。“创建数据集的过程与此类似,因此您可以使用它来创建自己的数据集”。
泰卢固语是印度第四大通用语言,有 8110 万人使用。它由 60 个符号组成,16 个元音,3 个元音修饰语,41 个辅音。这项研究将继续开发泰卢固语的 OCR 系统。
所需工具
我们将使用 python 编程语言来创建用于字符识别和分割的数据集。使用的工具/包是:
- 标签 4.2.10
- 数字版本 1.17.2
- 枕头 5.3.0
- OpenCV 4.0.0.21
创建数据集
开源平台上有很多数据集可用,比如 Kaggle 、 Google Datasets 。你可以使用 Adrian Rosebrock 的这些信息丰富的博客来自动收集图像。
[## 如何(快速)建立深度学习图像数据集——PyImageSearch
我小时候是个超级口袋妖怪迷。我收集了交易卡,玩了游戏机,看了…
www.pyimagesearch.com](https://www.pyimagesearch.com/2018/04/09/how-to-quickly-build-a-deep-learning-image-dataset/) [## 如何使用 Google Images 创建深度学习数据集- PyImageSearch
PyImageSearch 读者 José提问:嗨,Adrian,感谢你将计算机视觉的深度学习与 Python 结合在一起…
www.pyimagesearch.com](https://www.pyimagesearch.com/2017/12/04/how-to-create-a-deep-learning-dataset-using-google-images/)
1。收集数据
桑德拉·格鲁内瓦尔德在 Unsplash 上的照片
收集数据以创建定制数据集成为一项劳动密集型任务,直到数据/图像不可用,因为泰卢固语字符图像不广泛可用,所以我手动收集图像。将采集到的图像预处理成 400×400 的形状。
您可以使用下面的代码来实现这个目的,它采用两个参数 path 到要处理的图像的文件夹,并采用一个空的文件夹名来存储预处理后的图像。
我已经收集了将近 200 张图片,其中每张图片至少有泰卢固语前 6 个元音中的一个。以下是收集的几个数据示例。
收集数据中的少量图片—作者提供的图片
2.标签数据
因为我们正在创建用于字符识别和分割的数据集,所以我们需要标记已经收集的每个图像中的数据。为了完成这项任务,我们将使用 LabelMe ,这是一个应用程序来标记图像。您可以通过在命令提示符下键入 labelme 来启动应用程序。
LabelMe 应用程序界面—作者图片
以下是标记图像的步骤:
- ‘打开目录’—打开包含预处理图像的目录。
- 在左窗格中选择“创建多边形”,在图像中的角色周围画一个边界框,并分别标记它们,最后保存。
- 选择“下一张图像”并继续步骤 2,直到所有图像都被标记。
- 为每个图像创建一个 Javascript 对象符号(JSON)文件,该文件包含图像的信息,例如文件名、边界框坐标、图像的高度和宽度以及每个边界框的标签等
完成上述步骤后,下面显示了一个样本图片。
标签后的样本图像—作者提供的图像
如上图所示标记图像后创建的 JSON 文件如下所示:
要使用任何识别和分割算法,如掩蔽递归神经网络(MaskRNN),您只需查看一次(YOLO)。需要上下文中的公共对象(COCO)格式的 JSON 文件来训练所提到的算法。
因为我们有单独的 JSON 文件 w.r.t 图像,所以我们需要组合并制作一个 COCO 格式的注释 JSON 文件。下面的代码可以满足这个目的,因为它只需要两个参数,即图像和 JSON 文件的目录路径和保存结果 JSON 文件的输出路径。
下图显示了标记数据后的几幅样本图像。
作者图片
最终想法和未来范围
- 本文有助于为识别和分段任务创建自定义数据集。
- 此外,我们可以使用这种类型的数据集为泰卢固语字符开发字符识别和分割系统。
参考
使用 Python Labelme 的图像多边形注释是一个图形图像注释工具,灵感来自于…
pypi.org](https://pypi.org/project/labelme/) [## COCO -上下文中的常见对象
编辑描述
cocodataset.org](http://cocodataset.org/#home)
你应该如何准备数据科学面试?
应对数据科学面试所需的技能
资料来源:eurada via 启动倡议
数据科学是 21 世纪要求最高、报酬最高的技术之一,也需要大量的技能,需要大量的努力和规划。
在本文中,我们将讨论在数据科学面试中表现出色的人应该注重哪些技能。
常见的数据科学问题
对你做过的“数据科学”项目的完整描述
通过解释你参与过的一个项目开始你与面试官的对话,你可以从一个小故事开始,讲述你是如何考虑参与这个项目的,你关注的问题,数据的来源,你在数据集中使用的参数,解释在参与这个项目时出现的一些异常结果,你使用的机器学习模型以及使数据分析变得容易的统计技巧。
现在准备好你应该为面试准备的其他技能。
基于概率的情景问题
概率是每个数据科学项目背后的主要关键之一,所有面试官都希望了解候选人处理概率问题的能力以及他们遵循的基本方法。面试官可能试图检查候选人是否有能力为一个特定的问题考虑所有的情况。
结构化查询语言(SQL)
面试官可能会给你一些数据集字段及其数据类型,并给你一个 SQL 查询来从中提取一些特定的元素。面试官可能试图检查候选人是否有能力为一个特定的问题考虑所有的情况。
编程知识
编程知识对于数据科学面试是非常必要的,因为它证明了你编写代码解决问题的能力。主要来说,数据科学问题是使用 Python 或 R 来解决的,所以选择任何一种你觉得舒服的语言(Python/R ),并尝试以非常简化的方式处理给定的问题。
机器学习的应用和解释
在准备数据科学家职位时,一个人应该对所有机器学习模型有深刻的理解,并学会如何用手工制作的图表解释模型,模型的目的,以及它对特定活动或任务的优势和劣势。一些主要的机器学习算法是线性回归、逻辑回归、随机森林、朴素贝叶斯、决策树、支持向量机等。
统计术语的含义
概率和统计在从数据集中提取重要信息以及深入了解统计术语(如标准差、假设的 p 值、相关性、协方差等)方面发挥着重要作用。,也是使用它们时的条件。
设计问题
数据科学是一个广阔的领域,在我们周围有很多应用,所以如果面试官想测试你的知识而不是技术技能,他/她可能会为你提供任何周围问题的示例,并要求你使用你的数据科学技能设计一个解决方案。例如,一个今天下雨的场景,它背后的主要特征是什么,一个可以用来预测某一天是否下雨的机器学习模型。
行为问题
问行为问题是为了检查你如何处理现实生活中的问题,这可以作为一个机会,用一些独特的答案给面试官留下深刻印象,并使他/她与其他受访者相比对你没有什么偏见。
下面是一些行为问题的例子:
工作中的动力是什么?
你认为这一领域最紧迫的问题是什么?
你最大的优点/缺点是什么?为什么你认为你会喜欢这个领域?
描述一次你和一个性格与你截然不同的人一起工作的经历。告诉我你承受巨大压力的一次经历。当时是什么情况,你是怎么熬过来的?
告诉我一个你管理的长期项目。你是如何保持组织有序并确保一切按计划进行的?
希望这篇文章能帮助你准备数据科学面试,获得你梦想中的工作。 万事如意!
如何准备 AI
当人工超级智能迫使我们失去平衡时,永生的生存指南。
人工智能的出现
人工智能还没有到来,它已经来了。已经有文章和书籍将人工智能拟人化,列出其失败模式,并证明人类将努力应对与新范式相关的错综复杂的道德和伦理问题。有些因揭示了人类尚未面对的社会问题而受到称赞;其他人则因未经请求和未经支持的散布恐惧而受到批评。
这些参考文献在很大程度上涵盖了人工通用智能(AGI)领域,指的是一种能够在各种环境下执行高阶心理功能的机器,如人类。关于我们什么时候能在社会上看到 AGI,专家们有不同的观点——但是有一个普遍的共识,那就是这不是一个是否的问题,而是什么时候的问题。
与此同时,人工狭义智能(ANI)——指的是机器或算法可以完成的专门任务——就在这里,而且非常好。它可以像人类一样完成一些任务(比如区分小狗和松饼)和一些比人类更好的任务(比如下棋)。
为什么这很重要?
- **认知含义:**每个人都需要花费数年时间来发展理解松饼概念所必需的知觉、感觉和认知技能,从多个角度观看松饼时感知松饼,并在看到松饼时检索相关单词“muffin”。然而,一旦建立了图像分类器,该算法可以通过一次软件更新立即在数千台机器上实施——人类需要几年才能获得的东西,机器可以在几分钟内完成。
- 经济影响:失业被认为是一系列行业中 ANI 的重要影响,包括娱乐和新闻媒体、战争、法律、体育、交通和金融市场。近年来,人工智能研究人员、企业家和政策制定者提出了多种解决方案来对抗与人工智能发展相关的外部性,从普遍基本收入到全州监管。
AGI 是最聪明的人工智能吗?
否——引入超级智能。
雷·库兹韦尔提出了智能爆炸的概念——人工智能变得足够聪明以改善自己。一个基于软件的 AGI 将进入一个自我改进循环的递归回路,导致一个甚至超过人类智能的智能爆炸——超级智能(ASI)
如何准备 AI
这篇文章旨在提供一个指南,告诉你可以部署哪些策略来为 AI 时代做好准备。
理解与人工狭义智能、人工广义智能和人工超智能相关的风险。这包括:
- 理解当前机器学习算法的范围,以及它们如何改变经济和扰乱行业。
- 辨别由无监督学习算法产生的人类无法理解的相关性
3.理解算法偏差是如何发生的:
- 不具代表性的训练数据可能会产生算法偏差
例如,从训练数据集中没有足够多的深色皮肤的人的训练数据集中,导致面部识别系统不能识别少数民族
- 算法偏差可能由有偏差的训练数据引起
例如,通过使用书写数据的语料库来改进算法——在一项研究中,句子“男人对于医生来说,就像女人对于……”由预测性 NLP 算法用“护士”来完成。
围绕新技术发布后的伦理和道德含义展开对话
个人、企业家、公司和政策制定者都有责任围绕新技术范式展开富有成效的、批判性的辩论。这将导致公众意识到当前技术的范围,防止类似真相的案例发生——一个假设人类灭绝的思想实验,由最初被编程为书写机器的东西引发。
在公司拥有的 ani 层面,个人可以通过了解他们的数据如何被收集(例如:当你访问网站时的 cookies)、使用(例如:定向广告)、存储(例如:Snapchat 在其服务器上存储数据),以及在各个层面有偏见的(例如:有偏见的训练数据,导致服务无法在边缘情况下工作)来最好地准备自己。)
在 ASI 的层次上,人类可以被解释为生命平衡木上的另一个物种,它的绊网正在接近;ASI 的出现可能将我们推向灭绝或永生。广受赞誉的人工智能研究员尼克·博斯特罗姆提出了一个平衡木模型的概念。所有物种突然出现,在平衡木上摇摇晃晃,然后陷入灭绝——博斯特罗姆称灭绝为吸引状态。
除了灭绝,还有另一个吸引子——状态——永生。因此,吸引子状态由物种灭绝和物种永生组成。到目前为止,所有的物种最终都灭绝了——但是有可能一个物种会掉到平衡木的另一边,变成永生
绊网是指一个物种存在的阈值。对于一个物种来说,撞上绊网是一个巨大的变革性事件,就像一个世界性的疫情或小行星。或者人工超级智能。
哲学家认为 ASI 可能是人类的绊网,让我们要么走向灭绝,要么走向永生。因此,在更大的范围内,人工智能是否会对人类产生积极影响,这是一个与我们的生存问题密不可分的问题。
在这段不确定时期,个人最大的财富是知识。这包括理解人工智能的各种理论,意识到与人工智能发展相关的挑战和风险,以及合理化结合人工智能、生物技术和纳米技术等各种快速发展领域的创新可能带来的潜在结果。
作为创新者,我们应该意识到资本主义的激励结构,这种结构以牺牲人性为代价,促进创新,奖励对快速发展技术的投资。对于 ASI 这样的高影响力技术,我们应该专注于稳定的开发,在每个阶段测试功能,以避免智能爆炸,而不是快速移动的破坏。
作为个人和人类,我们有权游说为追求 AGI 的公司和研究机构设立“检查站”级别的政策——对创新、研究和开发实践透明的公司有潜在的财政利益——从而激励人工智能技术的规范发展,并在全球范围内校准进展水平。
作为分析师,如何赢得案例研究面试
咨询案例研究 101
案例研究面试准备终极指南
Clem Onojeghuo 在 Unsplash 拍摄的照片
作为数据分析师或数据科学家,我们不仅需要知道概率和统计、机器学习算法、编码,最重要的是,我们需要知道如何使用这些技术来解决任何业务问题。大多数情况下,你将有 30-45 分钟的时间与一位数据科学家或招聘经理面谈,在面谈中,你将回答一个可能与组织日常工作相关的多方面业务问题。
当我第一次开始准备案例研究面试时,我不知道有不同类型的案例研究。成为案例研究专家的最快方法是了解解决不同类型案例研究的所有框架。案例研究面试可以帮助面试官评估候选人是否适合这个职位。有时,他们甚至会问你一个他们实际遇到的问题。了解面试官在寻找什么可以帮助你更好地准备你的回答。
他们在面试中寻找什么?
📌逻辑和可操作的思维过程
▶️:面试官关心你的思维过程,以及你如何得到解决方案。如果你能够在没有任何框架的情况下得到答案,面试官可能会认为这只是你的幸运日,下次你就不能解决问题了。
📌适应性
▶️:有时候,如果你走错了方向,面试官可能会问你一些问题来帮助你回到正轨。如果这发生在你的面试中,你很可能错过了他们认为重要的东西。
📌信心
▶️:求职面试时紧张是正常的。但是,作为一个分析师,你自己都不相信自己,别人怎么会相信你呢?
📌清晰通信
▶️:作为一名分析师,分析数据和解释结果的能力非常重要。根据您的公司,一些分析师确实需要向利益相关者展示他们的分析。
如何总能得到他们想要的答案
📣结构
他们想知道你是否能采取系统的方法来解决问题,并且你能清楚地描述它。例如,他们可能会问你:“这个月活跃用户账户增加了 xx%,你能告诉我们是怎么回事吗?”
要回答这类问题,你不必马上准备好答案。最重要的是你的思维过程。不要马上告诉他们你的任何猜测或假设。用一个框架来回答。向他们提问,表明你了解这个行业。
📣综合性
他们想知道你的回答是否涵盖了问题的所有方面。例如,他们可能会给你一个情况,并问你一些问题,如“看起来怎么样”、“当前的问题是什么”、“我们如何改进”等。
有许多方法可以回答这类问题。得到完美答案的关键是要简洁,并在最后提供一个推荐。假设营销副总裁问你“看起来怎么样?”在 2 分钟内,您可以通过陈述当前的目标是什么、我们目前所处的位置、我们距离公司的目标有多远、我们下一步计划做什么来达到目标(建议)以及我们需要多长时间才能达到目标来回答这个问题。
📣可行性
他们想看看你的回答是否实用,是否能切实可行。要更精准;尽可能使用数字。
我注意到很多分析师经常忘记用数字来支持他们的观点。如果你想让经理知道根据你的计算不可能达到特定的目标,你应该用你的分析数据来证明为什么会这样。使用数字可以帮助你的建议更有说服力和可靠性。
📣观众
有时,他们可能会要求你对不同的人(你的经理、CEO 等)回答一个模糊的问题,比如“看起来怎么样”。).这类似于当招聘人员问,“告诉我关于你自己的情况”,你不想认真对待你所做项目的本质,因为你的招聘人员可能会失去兴趣。另一方面,招聘经理可能希望你多谈谈你过去的项目。
这也适用于案例研究面试。知道谁是你的观众是非常重要的。如果你和销售副总裁交谈,他或她可能更关心顾客的数量。相反,如果你与营销副总裁交谈,他或她可能不像销售副总裁那样关心潜在客户的数量,相反,他们可能关心如何提高回复率和转化率。
什么是完美的框架
- 澄清问题
- 分解问题
- 解决每一块
- 将它们整合到最终结果中
这给了你一个如何得到完美解决方案的总体思路。然而,对于每种类型的案例研究问题,我们可以有一个不同的框架。
案例研究类型
案例研究有几种类型。以下是案例研究面试问题的主要类型:
- 损益
- 进入新市场
- 增长和销售增长
- 市场规模估计
损益
面试官喜欢问案例研究问题的原因之一是,咨询师经常需要帮助客户解决一个模糊的问题,而不知道从哪里开始。客户陈述了他们面临的盈利/亏损问题,他们希望你能帮助他们找出发生这种情况的原因。一个典型的情况是,一家公司在过去几年中相对盈利,但最近利润突然下降。他们应该怎么做?
你可以把这个问题分成两部分——收入和成本。我们知道利润等于收入减去成本。如果利润下降而成本保持不变,那么收入就是问题。我们需要考虑如何增加收入。如果是反过来,那么我们就需要想出一个降低成本的方案,比如削减产量和劳动力成本。
进入新市场
向新市场扩张是发展业务的有效途径。因此,一些客户可能会问顾问,进入一个新市场是否是个好主意。
在回答是或否之前,你应该问一些澄清性的问题,以更多地了解客户的公司。
以下是一些你可以问的澄清性问题:
- 公司的目标是什么?它符合我们的整体战略吗?
- 我们需要增加投资吗?(分销渠道、生产、新员工…)
- 现在和未来的市场是什么样的?(新兴?成熟?下降)
- 客户群会与现有的不同吗?
- 竞争对手是谁?他们的市场份额有多大?
- 他们的产品和我们的有什么不同?
- 有进入/退出的障碍吗?
增长和销售增长
我希望有一种终极方法来增加所有公司的销售额。不幸的是,根据行业和市场规模的不同,发展公司和增加销售的方式会有所不同。
这里有一些公司可以尝试发展业务的方法:
⛳️调查公司和行业:我们需要知道行业是否在增长。如果有,公司可以投入多少资金来扩大公司规模?相对于行业/竞争对手,公司的发展如何?我们的价格与竞争对手一致吗?谁是我们的目标市场?
⛳️选择最合适的增长战略:一旦我们对公司及其行业有了更多的了解,我们就可以相应地推荐最合适的增长战略。例如,如果客户想收购一家完全不同行业的公司,这可能不值得,因为目标受众完全不同。
市场规模估计
作为一名分析师,做出合理估计的能力至关重要。你的面试官可能会问这样的问题:在美国每个月要吃掉多少平方英尺的比萨饼?
这是一个经典的猜测问题。回答这类问题的诀窍是将问题分成不同的部分,为了便于计算,将任何数字向上或向下取整,并解释你为什么要估计你正在估计的东西。我决定把问题分成 4 部分。
- 美国有多少人吃披萨?
让我们假设大约 2/3 的美国人都吃披萨。美国大约有 3.2 亿人口。然而,我们可以用 300 来简化计算,而不是用 2/3 乘以 320。现在我们知道美国有 2 亿人吃披萨。
2.普通美国人一个月吃多少比萨饼?
我们可以估计,平均来说,一个美国人每月吃一次披萨。假设人们通常每餐吃 3-4 片比萨饼,我们可以估计每人平均消费 4 片比萨饼。现在我们需要把比萨饼切片转换成平方英尺。
3.比萨饼切成平方英尺
如果一片比萨饼底长 4 英寸,长 5 英寸,那么面积就是 10 平方英寸(1/2 底高=45/2)。因为平均来说,一个人每月吃 4 片比萨饼,所以一个吃比萨饼的人每月的比萨饼面积是 40 平方英寸。乘以 2 亿人(美国吃比萨饼的人口),现在我们得到 80 亿(2 亿 40)平方英寸。最后,在将平方英寸转换成平方英尺(除以 144 →四舍五入到 100)后,现在我们每月可以得到大约 8000 万平方英尺的比萨饼。
方便的信息
事先了解一些方便的信息可以帮助我们更好地估计市场规模。以下是《破解 PM 面试一书中列举的一些随手可得的信息:
来自破解 PM 采访本的截图
最终提示
- 确保你理解了被问到的问题;如果你需要澄清问题,不要害怕提问。但是要记住!注意,试着总结面试官告诉你的话。
- 花时间思考问题,建立一个框架。例如,你可以谈论问题陈述,比如组织面临的问题是什么;然后你可以总结你提出的所有建议,并解释每一条建议。
- 陈述你的假设,但不要做出愚蠢的假设,比如某人表现得不够好。
- 熟能生巧!多读一些案例研究的例子,从中学习。
资源
以下是我用来准备案例研究面试的资源清单。
书
📚破解 PM 面试:如何获得技术领域的产品经理职位
📚第 10 点案例:完成案例面试准备
📚面试数学:超过 60 个问题和定量案例面试问题的解决方案
网站
我认为能够提出一个好的框架是成功进行案例面试的最重要的因素…
www.myconsultingcoach.com](https://www.myconsultingcoach.com/) [## 星状细胞
“StellarPeers 是一个由伟大的人组成的网络,我很高兴成为这个团体的一员。我真的很喜欢模拟面试…
stellarpeers.com](https://stellarpeers.com/)
播客
咨询公司在麦肯锡、波士顿咨询集团和贝恩公司内部为客户提供服务的成功率保持在 80%。这是最高的…
podcasts.apple.com](https://podcasts.apple.com/us/podcast/case-interview-preparation-management-consulting-strategy/id904509526)
油管(国外视频网站)
欣赏您喜爱的视频和音乐,上传原创内容,并在上与朋友、家人和全世界分享这些内容…
www.youtube.com](https://www.youtube.com/channel/UC-YKX7L2GNNA-IHrhMpwzWA)
如何为机器学习准备数据
预测泰坦尼克号上的幸存者
TL;博士 :这篇文章涵盖了泰坦尼克号沉船数据集的完整准备。
本帖是本书的一部分: 用 Python 动手做量子机器学习
作者弗兰克·齐克特的图片
泰坦尼克号的沉没是历史上最臭名昭著的海难之一。
1912 年 4 月 15 日,泰坦尼克号与冰山相撞后沉没。被认为是不沉的,没有足够的救生艇给船上的每个人。当晚 2224 名乘客和机组人员中有 1502 人死亡。
当然,722 名幸存者一定有一些运气。但是似乎某些人群比其他人群有更好的生存机会。
因此,泰坦尼克号的沉没也成为任何对机器学习感兴趣的人的著名起点。
如果你有一些机器学习的经验,你可能会知道 Kaggle 提供的传说中的泰坦尼克号 ML 比赛。
如果你还不知道 Kaggle,Kaggle 是世界上最大的数据科学社区之一。它提供了许多有趣的数据集,因此,它是一个开始的好地方。
要解决的问题很简单。使用机器学习创建一个模型,根据乘客数据,预测哪些乘客在泰坦尼克号沉船中幸存。
获取数据集
为了获得数据集,你需要创建一个 Kaggle 帐户(它是免费的)并加入竞争。即使 Kaggle 完全是关于竞争的,你也不需要通过上传你的解决方案来积极参与其中。
当你参加比赛时,你需要接受并遵守规则,这些规则规定了你每天可以提交多少份作品,最大团队规模,以及其他比赛的具体细节。
您可以在竞赛页面顶部的数据选项卡中找到竞赛数据。然后,向下滚动以找到文件列表。
数据中有三个文件:
train.csv
test.csv
gender_submission.csv
文件train.csv
包含泰坦尼克号乘客子集的数据。这个文件应该作为你的算法的基础,以了解一名乘客是否幸存。
文件test.csv
包含另一个乘客子集的数据。它决定了你的算法执行的有多好。
gender_submission.csv
文件是一个例子,它展示了如果您打算将预测提交给 Kaggle,您应该如何构建预测。因为我们在这里开始学习,还没有准备好竞争,我们将跳过这个文件。
下载文件train.csv
和test.csv
。
看数据
我们需要做的第一件事是加载数据。我们用熊猫来表示。它在机器学习社区中以数据处理而闻名。它提供了各种有用的功能,比如加载.csv
-文件的功能:read_csv
。
从 csv 文件加载数据
我们将数据加载到train
和test
中。这些是熊猫。
A DataFrame
将数据保存在带有标签的二维结构中。例如数据库表或电子表格。它提供了许多现成的有用属性和功能。
例如,DataFrame
的属性shape
提供了一个由两个整数组成的元组,表示行数和列数。
让我们来看看:
泰坦尼克号数据集的形状
train has 891 rows and 12 columns
test has 418 rows and 11 columns
我们可以看到我们有 891 个培训和 418 个测试条目。更有趣的是,train
数据集比test
数据集多一列。
DataFrame
的info()
方法显示了一些更详细的信息。看一下train
数据集。
train.info()
训练数据集的结构
info
方法返回列的列表:它们的索引、名称、有多少条目有实际值(不是null
)以及值的类型。
让我们也来看看test
数据集。
test.info()
测试数据集的结构
当比较这两个信息时,我们可以看到test
数据集遗漏了列Survived
,该列指示一名乘客是幸存还是死亡。
正如 Kaggle 指出的,他们使用test
数据集来评估提交的内容。如果他们提供了正确的答案,那就不再是什么竞赛了,不是吗?我们的任务是预测正确的标签。
由于我们不打算将我们的预测提交给 Kaggle,以获得对我们算法执行情况的评估,test
数据集对我们来说毫无用处。
因此,我们专注于train
数据集。
info
输出非常抽象。能看到一些实际数据不是很好吗?没问题。这就是head
方法的用途。
head
方法显示列标题和前五行。有了这个印象,我们再来过列。你也可以在 Kaggle 页面上看到解释。
train.head()
每一列代表我们数据的一个特征。PassengerId
是识别每一行的连续数字。Survived
是乘客是否幸存的指示器(0 =否,1 =是)。Pclass
是票类(1 = 1 号,2 = 2 号,3 = 3 号)。然后我们有不言自明的Name
、Sex
和Age
。
表示该乘客在泰坦尼克号上的兄弟姐妹或配偶的数量。Parch
表示泰坦尼克号上该乘客父母或子女的编号。
然后就是乘客付费的Fare
,号码Cabin
和登船港口(embarked
) (C =瑟堡,Q =皇后镇,S =南安普顿)。
数据准备和清理
我们的数据有不同的类型。有数字数据,如Age
、SibSp
、Parch
、Fare
。有分类数据。一些类别由数字表示(Survived
、Pclass
)。有些用文字表示(Sex
、Embarked
)。还有文字资料(Name
、Ticket
、Cabin
)。
这真是一团糟。为了一台电脑。此外,当再次查看train.info()
的结果时,您可以看到不同列的计数有所不同。虽然大多数列有 891 个值,但只有 714 个用于Age
,204 个用于Cabin
,889 个用于Embarked
。
在我们可以将数据输入任何机器学习算法之前,我们需要清理。
缺少值
大多数机器学习算法在缺失值的情况下效果不佳。有三种方法可以解决这个问题:
- 去掉相应的行(不考虑乘客)
- 去除整个列(去除所有乘客的整个特征)
- 填充缺失的值(例如,用零、平均值或中值)
应对缺失值
我们可以使用DataFrame
的dropna()
、drop()
和fillna()
方法轻松完成这些事情。一般来说,没有一个最佳选择。但是你要仔细考虑具体的语境。
只有两个乘客的出发港口我们不知道。这些占我们数据不到 1%。如果我们完全忽略这两个乘客,我们不会看到完全不同的结果。因此,我们用dropna
方法删除这些行(第 3 行)。
dropna
-方法将列("Embarked"
)作为命名参数subset
。此参数指定确定是否删除行(乘客)的列。如果这些列中至少有一个值缺失,该行将被删除。
关于Cabin
,情况有所不同。我们只有 991 名乘客中 204 人的信息。这是否足以从中得到任何信息是值得怀疑的。我们不知道为什么这些值会丢失。即使我们发现Cabin
与乘客的生存高度相关,我们也不知道这种相关性是否可以推广到所有乘客,或者是否存在选择偏差,这意味着我们知道Cabin
的事实取决于一些其他方面。
我们用方法drop
删除整个列。我们提供想要移除的列(Cabin
)作为定位参数。我们作为命名参数axis
提供的值1
指定我们想要移除整个列。
接下来我们知道 714 乘客的Age
。将我们不认识的所有乘客排除在考虑范围之外似乎不是一个选项,因为他们占了我们数据的大约 22%,相当重要的一部分。移除整个列似乎也不是一个好的选择。首先,我们知道大多数乘客的Age
,直觉表明Age
可能对某人的生存机会很重要。
我们用fillna
方法填充缺失的值(第 13 行)。因为我们只想填充Age
列中缺失的值,所以我们在该列上调用这个函数,而不是整个DataFrame
。我们提供想要设置的值作为参数。这是我们之前计算的所有乘客的平均年龄(第 12 行)。
太好了。我们现在有 889 行,10 列,不再有丢失的数据。
标识符
机器学习的目标是创建一个能够预测数据的算法。或者,就像我们之前说的:给一个东西贴上标签。虽然我们在构建算法时使用了已经标记的数据,但我们的目标是预测我们还不知道的标签。
我们没有告诉我们的算法它如何决定选择哪个标签。而是我们告诉算法,“这是数据,你自己算出来”。也就是说,一个精明的算法可能能够记住你提供给它的所有数据。这被称为过度拟合。结果是算法在已知数据上表现良好,但在未知数据上表现不佳。
如果我们的目标是只预测我们已经知道的标签,我们能做的最好的事情就是记住所有的乘客以及他们是否幸存。但是,如果我们想要创建一个即使在未知数据上也能表现良好的算法,我们需要防止记忆。
我们甚至还没有开始构建我们的算法。然而,我们为算法提供的基本功能会影响算法是否能够记忆数据。因为我们的数据中有潜在的标识符。
当查看数据集的前五个条目时,有三列看起来可疑:第PassengerId
、Name
和Ticket
。
PassengerId
是一个后续数字。数字有多大和有没有乘客生还应该没有联系。
乘客的名字或车票上的号码也不应该成为生存的决定性因素。相反,这些是识别单个乘客的数据。让我们验证这个假设。
让我们看看这些列中有多少唯一值。
列中的唯一值
There are 889 different (unique) PassengerIds in the data
There are 889 different (unique) names in the data
There are 680 different (unique) ticket numbers in the data
Name
和PassengerId
是完美的标识符。在我们的数据集中,889 行中的每一行都有一个唯一的值。
并且有 680 个不同的Ticket
号。Ticket
不是完美标识符的一个可能解释是家庭票。然而,基于这一数据的预测似乎支持记忆,而不是学习可转移的洞察力。
我们移除这些柱子。
删除识别数据
处理文本和分类属性
正如我们将在本书中看到的,所有的算法,包括经典算法和量子算法,都与数字有关。除了数字什么都没有。如果我们想使用文本数据,我们需要把它转换成数字。
Scikit-Learn 为此任务提供了一个名为LabelEncoder
的转换器。
将文本数据转换为数字
首先,我们导入LabelEncoder
(第 1 行)并初始化一个实例(第 2 行)。我们用文本数据(Sex
和Embarked
)遍历列(第 4 行)。对于每一列,我们需要fit
将列中的数据(第 5 行)编码,然后才能转换值(第 6 行)。
最后,让我们再看看我们的DataFrame
。可以看到,Sex
和Embarked
现在都是数字(int64
)。在我们的例子中,0
表示男性,1
表示女性乘客。但是当您再次运行转换时,您可能会产生不同的赋值。
特征缩放
机器学习算法只对数字起作用。此外,他们通常使用相同比例的数字。如果数字具有不同的标度,算法可能会认为标度越高的数字越重要。
尽管我们所有的数据都是数字,但还没有统一的比例。大多数列的值在0
和3
之间。但是Age
和Fare
的规模要大得多。
max
方法返回一列中的最大值。我们可以看到,年龄最大的乘客 80 岁,最高票价约 512。
最大值
The maximum age is 80.0
The maximum fare is 512.3292
处理不同比例数据的一种常用方法是最小-最大比例(也称为归一化)。这个过程会移动和重新调整值,使它们最终的范围从0
到1
。它从每个值中减去最小值,然后除以最大值减去最小值。
Scikit-Learn
为我们提供了MinMaxScaler
转换器来完成这项工作。
数据的标准化
The minimum value is 0.0 and the maximum value is 1.0
同样,我们首先导入转换器(第 1 行)并初始化它(第 3 行)。然后,我们fit
转换我们的数据(第 4 行)并转换它(第 5 行)。
因此,我们数据集中的所有数据都在0.0
和1.0
之间。
scaler 返回一个 Numpy 数组,而不是 Pandas 数据帧
培训和测试
我们已经提到了构建一个算法的目标,该算法不仅对已知数据表现良好,而且还能预测未知数据的标签。
这就是为什么将数据分为训练集和测试集非常重要。我们使用训练集来构建我们的算法。我们使用测试集来验证它的性能。
尽管 Kaggle 提供了一个测试集,但我们跳过了它,因为它没有包含Survived
列。每次我们想验证它的时候,我们都需要问 Kaggle。为了保持简单,并且能够自己进行验证,我们宁愿从 Kaggle 训练集中抽出一些行来进行测试。
分离一个test
集合相当简单。Scikit-learn 也为此提供了一个有用的方法。这是train_test_split
。
此外,我们需要将输入数据与我们想要预测的结果标签分离开来。
将输入从标签中分离出来,将训练从测试集中分离出来
We have 711 training and 178 testing rows There are 7 input columns
我们用 Python 数组索引将输入列与标签分开(第 3–4 行)。第一列(位置0
)包含我们想要预测的Survived
标志。其他列包含我们用作输入的数据。
train_test_split
将训练与测试数据集分开。参数test_size = 0.2
(= 20%)指定了我们希望测试集拥有的部分。
我们可以看到我们的训练数据集包含 711 个条目。因此,我们的测试集由 178 个条目组成。我们有 7 列输入和一列输出。
让我们保存我们准备好的数据,这样我们就可以在将来使用它,而不需要重复所有这些步骤。
将数据保存到文件系统
本帖是本书的一部分: 用 Python 动手做量子机器学习。
在这里免费获得前三章。
如何为机器学习模型准备数据
数据准备分步指南
由故事创建的数据向量—www.freepik.com
目录
- 介绍
- 什么是数据准备
- 探索性数据分析
- 数据预处理
- 数据分割
介绍
在我们进入这个话题之前,我想澄清一点,数据准备没有严格的流程。准备一组数据的方式很可能与准备另一组数据的方式不同。因此,本指南旨在提供一个总体指南,供您在准备任何特定数据集时参考。
在我们进入指南之前,我应该先回顾一下什么是数据准备…
什么是数据准备?
数据准备是机器学习生命周期中数据收集之后的步骤,它是清理和转换您收集的原始数据的过程。通过这样做,在对数据进行分析和建模时,您会轻松得多。
我将在本文中介绍数据准备的三个主要部分:
- 探索性数据分析
- 数据预处理
- 数据分割
1.探索性数据分析
探索性数据分析,简称 EDA,听起来就是探索你的数据。在这一步中,您只是简单地了解您正在处理的数据。在现实世界中,数据集不像 Kaggle 数据集那样干净或直观。
您对正在处理的数据探索和理解得越多,数据预处理就越容易。
以下是您在此步骤中应该考虑的事项列表:
特征和目标变量
确定什么是特征(输入)变量,什么是目标变量。不要担心确定什么是最终输入变量,但要确保你能识别这两种类型的变量。
数据类型
弄清楚你在处理什么类型的数据。它们是绝对的,数字的,还是都不是?这对于目标变量尤其重要,因为数据类型将缩小您可能想要使用的机器学习模型的范围。像 df.describe() 和 df.dtypes 这样的熊猫函数在这里很有用。
检查异常值
一个异常值是一个明显不同于其他观察值的数据点。在这一步中,您需要识别异常值,并尝试理解它们出现在数据中的原因。根据它们出现在数据中的原因,您可以决定将其从数据集中移除或保留。有几种方法可以识别异常值:
- Z 值/标准偏差:如果我们知道一个数据集中 99.7%的数据位于三个标准偏差之内,那么我们可以计算一个标准偏差的大小,乘以 3,并确定超出该范围的数据点。同样,我们可以计算给定点的 z 分数,如果它等于+/- 3,那么它就是异常值。注意:使用这种方法时需要考虑一些意外情况;数据必须是正态分布的,这不适用于小数据集,并且太多异常值的存在会影响 z 值。
- 四分位距(IQR) : IQR,用于构建箱线图的概念,也可用于识别异常值。IQR 等于第三个四分位数和第一个四分位数之差。然后,如果一个点小于 Q1-1.5 * IRQ 或大于 Q3 + 1.5*IQR,则可以确定该点是否为异常值。这达到大约 2.698 个标准偏差。
提问
毫无疑问,你很可能会对你正在处理的数据有疑问,尤其是对于你领域知识之外的数据集。例如,Kaggle 有一个关于 NFL 分析和伤病的比赛,我必须做一些研究,了解不同的位置是什么,以及他们的功能对团队有什么作用。
2.数据预处理
一旦您理解了您的数据,作为一名数据科学家,您的大部分时间都花在这一步上,即数据预处理。这是你花时间操纵数据,以便它可以被正确建模的时候。就像我之前说的,没有通用的方法来解决这个问题。然而,有一些重要的事情你应该考虑,我们将在下面讨论。
特征插补
特征插补是填补缺失值的过程。这很重要,因为当数据集中有缺失数据时,大多数机器学习模型都不起作用。
我想写这个指南的主要原因之一就是为了这个步骤。许多文章说你应该默认用平均值填充缺失值或者简单地删除行,而这不一定是真的。
理想情况下,您希望选择最有意义的方法—例如,如果您正在对人们的年龄和收入进行建模,那么一个 14 岁的孩子获得全国平均工资就没有意义。
总的来说,有几种方法可以处理缺失值:
- 单值插补:用列的平均值、中值或众数替换缺失值
- **多值插补:**对有缺失数据的要素进行建模,并用模型发现的内容输入缺失数据。
- **K-最近邻:**用另一个相似样本的值填充数据
- **删除该行:**这不是一种插补技术,但当样本量非常大时,如果你能负担得起,这种方法也是可行的。
- 其他包括:随机插补、移动窗口、最频繁等…
特征编码
特征编码是将值(即字符串)转化为数字的过程。这是因为机器学习模型要求所有值都是数字。
有几种方法可以解决这个问题:
- **标签编码:**标签编码只是将一个特征的非数值转换成数值,不管这个特征是不是序数。例如,如果名为 car_colour 的要素具有红色、绿色和蓝色的不同值,那么标注编码会将这些值分别转换为 1、2 和 3。使用这种方法时要小心,因为虽然有些 ML 模型能够理解编码,但有些却不能。
- 一热编码(又名。get_dummies): 一种热编码的工作原理是为给定特征的每个非数值创建一个二进制特征(1,0)。再次使用上面的例子,如果我们有一个名为 car_colour 的特征,那么一个热编码将创建三个名为 car_colour_red、car_colour_green、car_colour_blue 的特征,并且将有一个 1 或 0 来指示它是否存在。
特征标准化
当数值处于不同的尺度时,例如,以厘米为单位的身高和以磅为单位的体重,大多数机器学习算法都表现不佳。k-最近邻算法是不同比例的要素不能很好工作的主要例子。因此,规范化或标准化数据有助于解决这个问题。
- 特征标准化重新调整数值,使其在[0,1]/的范围内
- 特征标准化重新调整数据,使平均值为 0,标准差为 1。
特征工程
特征工程是将原始数据转化为更好地代表人们试图解决的潜在问题的特征的过程。这一步没有具体的方法,但你可以考虑以下几点:
- 转换日期时间变量以仅提取星期几、月份等…
- 为变量创建容器或桶。(例如,对于高度变量,可以有 100-149 厘米、150-199 厘米、200-249 厘米等。)
- 组合多个要素和/或值以创建一个新要素和/或值。例如,泰坦尼克号挑战最准确的模型之一设计了一个新的变量,称为“是女人还是孩子”,如果这个人是女人或孩子,这个变量为真,否则为假。
特征选择
接下来是要素选择,即选择数据集最相关/最有价值的要素。我喜欢使用一些方法来帮助您选择功能:
- **特性重要性:**像 random forests 或 XGBoost 这样的算法允许您确定哪些特性在预测目标变量的值时是最“重要”的。通过快速创建其中一个模型并进行特征重要性分析,您将了解哪些变量比其他变量更有用。
- 降维:最常见的降维技术之一,主成分分析(PCA)取大量特征,利用线性代数将其降维为较少的特征。
处理数据失衡
你要考虑的另一件事是数据不平衡。例如,如果一个类别有 5,000 个示例(例如,非欺诈性的),但另一个类别只有 50 个示例(例如,欺诈性的),那么您需要考虑以下几件事情之一:
- 收集更多的数据——这总是对你有利的,但是通常是不可能的或者太贵了。
- 您可以使用 scikit-learn-contrib Python 包对数据进行过采样或欠采样。
3.数据分割
最后是分割你的数据。我将给出一个非常通用的框架,你可以在这里使用,这是普遍同意的。
通常,您会希望将数据分成三组:
- 训练集(70–80%):这是模型学习的内容
- 验证集(10–15%):模型的超参数在这个集上进行调整
- 测试集(10–15%):最后,在此基础上评估模型的最终性能。如果你已经准备好了正确的数据,测试集的结果应该给出一个模型在真实世界中表现的很好的指示。
感谢阅读!
我希望你已经从中学到了一些东西。通过阅读本文,您现在应该对数据准备有了一个大致的了解。需要考虑的事情很多,但是有这样的资源提醒你总是有帮助的。
如果您遵循这些步骤并牢记这些事情,您一定会更好地准备您的数据,并且您最终能够开发一个更准确的模型!
特伦斯·申
- 查看 我的免费数据科学资源 每周都有新资料!
- 如果你喜欢这个, 跟我上媒 了解更多
- 我们连线上LinkedIn
如何预处理社交媒体数据和短信
因为我觉得很多人只是这样写🤦🏻♂️ (╯ □ )╯︵ ┻━┻
约纳斯·勒普在 Unsplash 上拍摄的照片
在社交媒体数据和文本消息上执行 NLP 任务的最大挑战之一是网络英语与标准英语有很大不同。在 Reddit 帖子、tweets、WhatsApp 消息等中,有俚语、首字母缩写词、缩写词、首字母缩写词、表情符号、标签、URL 以及其他一些不以标准英语出现的拼写错误。在深度学习的乌托邦中,我们将收集尽可能多的数据,并从头开始训练我们的模型和标记器,以弄清楚这些俚语和首字母缩写词等的含义。然而,在现实生活中,我们可能希望利用现有的预训练模型(及其相关的标记器),如 BERT。由于这些模型和它们的标记器通常是在英语维基百科和图书语料库数据上预先训练的,我们将需要首先预处理我们的互联网英语数据。另一方面,如果我们决定使用非深度学习方法,那么数据预处理就更加重要,因为它对特征工程有着巨大的影响。在本文中,我们将介绍一些专门针对互联网英语数据的数据预处理步骤,或者需要特别注意的步骤。
常见的 NLP 数据预处理步骤
在本节中,我们将讨论一些最常见的 NLP 数据预处理步骤。它们是如此普遍,以至于我们可能会认为这是理所当然的,并且不假思索地执行这些步骤。对于互联网英语数据,我们很可能仍然需要这些数据预处理步骤,但是需要进行适当的修改。
将文本转换为小写
对于情感分析这样的任务,字母大小写有时是一个有用的特性。下列句子
- “我已经通过了驾驶考试”
- “我已经通过了驾驶考试”
- “我已经通过了驾驶考试”
表现出作者不同程度的兴奋。然而,一旦我们将文本转换成小写,它们将变得无法区分。
建议:在我们将文本转换成小写字母之前,设计一些关于字母大小写的特性。
删除标点符号
标点符号和字母大小写一样,对于情感分析非常有用。一个简单的例子是使用连续的感叹号:
- “我已经通过了驾驶考试”
- “我已经通过了驾驶考试!!!!!!!!"
而且,在网络俚语中使用货币符号来表示贪婪和腐败也是相当常见的,比如“ micro$oft ”。
标点符号还能够通过表情符号传达不同的感情,例如:-)和(> _
建议:对不同标点符号的外观进行特征工程,尤其是连续的外观。对于表情符号,我们可以设计新的功能,或者通过使用字典用英语单词替换它们。比如我们可以把:-)换成“笑脸”。最后,互联网俚语将在下面的章节中讨论。
请注意,在对标签、URL 等进行预处理之后,也需要删除标点符号。
删除号码
数字在 NLP 中有一个非常有趣的作用。对于像回答问题这样的任务,数字是绝对重要的。对于命名实体识别,数字并不重要,除非它们是实体名称的一部分(例如 NBA 的76 人,电子竞技的 C9 和 G2 )。对于情感分析,数字通常是无关紧要的。
说了这么多,总有例外需要我们注意。 1984 出现在 politics subreddit 中的不仅仅是一个数字,1–7”传达了巴西球迷的负面情绪。
到目前为止,我们讨论的内容适用于网络英语和标准英语,但网络英语在俚语中的数字用法上有一个额外的复杂性,如“10q”和“2mr”。
建议:数字的用法多种多样,如何预处理没有固定的规则。预处理步骤将在很大程度上取决于数据集的性质和探索性数据分析的结果。俚语将在下一节讨论。
扩展缩写、首字母缩写、首字母缩写和俚语
扩展很容易,因为它只需要查字典。困难的部分是关于维护这本词典。对于网络俚语,我们可以通过像城市词典这样的网站或者仅仅是谷歌来获得它们的意思。然而,许多网络俚语是含有脏话和身体部位的夸张短语的首字母缩写。我们可能想在资料片中缓和一下。比如“lmfao”简单扩展为“笑”。
建议:探索性数据分析时,收集所有非标准英语单词的高频术语。为扩展这些术语创建一个字典,如果需要的话,淡化扩展短语的夸张和/或攻击性。
网络英语的数据预处理步骤
在这一节中,我们将介绍专为网络英语定制的新的数据预处理步骤。他们中的大多数人也为其他语言的网络版本工作。
URL、用户提及和标签
对于大多数任务,URL 是不相关的,可以简单地删除。然而,对于主题模型和主题分类,理解 URL 是关于什么的是至关重要的。合并这些信息的一个简单方法是用标题替换 URL。这可以通过首先执行 HTTP GET,然后解析 HTML 响应来完成。
同样的想法也适用于用户提及和标签。尽管如此,决定我们应该用什么文本来替换要困难得多,而且这个过程将需要大量的人工检查。以 Twitter 中的“@ManCity”为例。它的用户名是“Manchester City ”,但是为了更好地说明这个用户名称的性质,我们可能希望使用“Manchester City Football Club”。
表情符号
表情符号的预处理步骤与表情符号基本相同。例如,我们可以替换😀用“狞笑脸”。不同表情符号的含义可以在表情百科中找到
请注意,有时表情符号被用来代替英文字符。在这种情况下,表情符号的含义可以添加到句子的末尾。作为一个例子,“g⚽al”被转换为“目标足球”。
拼写错误
有不同类型的拼写错误,每一种都需要不同的预处理方法。
- 错别字:这是最简单的一个,因为我们只需要通过拼写检查库运行我们的文本。话虽如此,请记住,没有一个拼写检查库是完美的,我们应该随时准备添加额外的逻辑。
- 重复字符:像“goaaallllllllll”这样的重复字符对于情感分析很有用,值得进行一些特征工程。对于拼写纠正部分,请注意大多数拼写检查库利用了 Levenshtein 距离。因此,重复字符会影响拼写校正的性能。为了解决这个问题,我们可以首先使用正则表达式将重复字符的数量减少到 2(因为标准英语单词最多包含双字符)。然后我们可以应用我们的拼写检查库。
- 其他:用户有无数种方法可以用拼写错误写出有意义的消息,从“哈哈哈哈哈哈哈哈哈”到“G O A L”。一个切实可行的办法是通过探索性的数据分析,找出数据集中最常见的模式,只关注它们。
进一步阅读
- [1]采用深度学习方法处理互联网俚语。它在城市词典的内容上训练了一组单词嵌入,初步的评估结果看起来很有希望。
- tokenizer [2]上的 HuggingFace transformers 文档很好地介绍了这个主题。特别是,它为不同类型的标记器提供了许多示例和参考。如果我们想使用像 BERT 这样的预训练模型,我们必须了解如何预处理我们的数据,以便它能很好地与 BERT 记号化器一起工作。
参考
- 南 Wilson,W. Magdy,B. McGillivray,K. Garimella 和 G. Tyson。俚语自然语言处理应用的城市词典嵌入 (2020 年),LREC 2020 年
- 分词器摘要
如何展示:面向有抱负的分析师
数据科学/数据分析/教育
思考你在学校里没有学到的关于演讲的知识
在学习市场分析之前,作为一名市场营销专业的学生,演示占据了我所参与的课程的很大一部分。营销战略概述、推销和案例介绍都是我市场营销研究的重要部分。演讲是一项非常重要的技能,就我个人而言,在观众面前演讲从来没有问题。作为一名音乐家,我也在很多观众面前表演过。你会认为关于分析或建模的演示也是一样的,对吗?不幸的是,在专业领域并非如此。
今年夏天,我有机会做了两次关于分析主题的报告,一次是在我的部门面前,另一次是在管理团队面前。现在,虽然我还不是一个全职的专业分析师(希望很快!),这两个演示完全改变了我对分析演示的看法,以及如何接近它们。我想分享我对此的想法,并希望有助于提升你的演示!在这个故事中,我们将分三个阶段进行演示:研究、准备和演示。让我们开始吧!
免责声明:我不是全职的数据专家,我只是简单地转述我在暑期实习和个人实践中的经验。这并不是要告诉你你到底需要知道什么,而是从我的经历中给你一些实用的建议。高级技术信息请查看 走向数据科学 。如果你对一些帮助你演讲的建议感兴趣,请继续阅读!
第一阶段:研究
如果你正在展示某样东西,很有可能你已经得到了一个需要解决的商业问题。这可能是拉动销售数据、分析业绩,甚至是创建机器学习模型之类的事情。无论你遇到什么样的业务问题,在这个阶段,你都应该记住以下几点:
记录您的流程
根据你的听众是谁,你可能会被问到你是如何得出你的数字和结论的。如果你被问到这样的问题,保留一个“数字线索”,这样你就可以展示你的工作,这会给人一种专业和可信的感觉。能够以简洁的方式解释你是如何得到这些数字的,比结结巴巴地解释你是如何得到这些数字要走得更远。这一切都从记录您的流程开始!
创建项目计划
这更多的是一个工作流程/项目管理的话题,但是当涉及到演示的时候也是非常重要的。演示通常是项目的最后阶段之一,因此使用良好的项目管理实践将有助于您按时完成任务。创建一个项目计划,列出资源、工具和带有时间线的里程碑。根据我的经验,数据专业人员喜欢使用 CRISP-DM 和敏捷方法,但是,许多数据专业人员也根据自己的经验创建自己的工作流。无论你使用什么,确保你使用它,这样你就不会让时间从你的展示日溜走。
有应急计划
有些时候,你会对你的演讲有一个完整的计划。你知道你需要分析什么数据,从哪里得到你的数据,你的受众是谁。有时事情的发生会打乱你的计划。当我在做一个演示的时候,我计划在我工作的公司里调查一个人群。就在我准备寄出调查问卷之前,人力资源部门告诉我,这违反了数据保护政策,我不能寄出。我有一个应急计划来调查不同的人群,并能够得到批准,并继续按计划进行。如果我没有制定一个应急计划,我将会有一段更加困难的时间来组织我的演讲。
第二阶段:准备
在我的演示过程中,研究就是将数据转化为信息。在准备阶段,信息被搅拌成见解。理想情况下,你在研究阶段已经完成了你的探索性数据分析和数据清洗,现在你正在建模并得出结论。当您将信息转化为见解时,请记住以下一些想法:
了解你的受众
在准备和演示分析演示文稿时,了解您的受众是需要牢记的最重要的变量之一。商业智能总监理解你展示的信息和见解的方式与营销副总裁不同。永远要事先了解你的听众,因为听众应该是你演讲的核心。如果你还没有读过我之前的一个故事, 数据可视化受众和场景 ,一定要去看看,因为了解你的受众是那个故事的一个突出主题。
保持你的幻灯片简单
今年夏天,我学到的一个重要知识就是如何准备幻灯片。在许多大学,演示软件被认为是艺术。你的幻灯片应该有 50 张幻灯片,每张幻灯片上有两个段落,每张幻灯片上有 6 个可视化效果,对吗?大多数公司都没有。长度取决于你要展示的内容,但目标应该是尽可能使用最少的幻灯片和文字。应该使用可视化效果,但是它们应该占据单个幻灯片的大部分。我们都有过这样的经历,在演示中,我们看到了第一张包含大量内容的幻灯片,然后就一片空白。信息过载会让观众害怕,所以不要试图把它塞进一张幻灯片,而是用幻灯片作为支撑,而不仅仅是整个演示。因此,如果我在谈论销售业绩和提高下一季度销售额的方法,我可能会在一张幻灯片上展示数字,在下一张幻灯片上展示图表,在第三张幻灯片上展示见解。观众不只是想要一个演示,他们想要一个旅程。
“观众不仅仅想要一场演示,他们还想要一段旅程。”
练习真的有帮助
去年夏天,作为实习的一部分,我必须向高管团队和高级副总裁做一次演示。我和另外两个实习生在一个团队。作为一个团队,我们至少练习了 7 到 10 次演示。我将在另一个方面深入探讨这个问题,但是分析性的演示与销售或营销演示是完全不同的。你不能事后批评自己或推销你的数据。如果数字是正确的,那么你应该知道他们是正确的!当你站在一群人面前时,你的信誉和信心会受到威胁,因此,许多人(包括我自己)会自动说“可能”或“应该”。应该不惜一切代价避免这些,实践有助于这一点。有时间的话,练习你的演讲至少五到十次,这样你会对它有信心。如果你感到自信,你的观众也会如此。我们的工作是让我们的受众对我们的数据和见解充满信心,这样他们就能对自己可能直接影响公司的决策充满信心。
第三阶段:演示
现在你已经完成了你的研究并准备好了你的演示文稿,是时候实际演示了。虽然演示可能会令人望而生畏,但这里有一些提示在演示分析性主题时对我有所帮助:
避免填充词
避免使用“喜欢”、“嗯”、“我认为”、“我假设”等词语和短语。现在这是一件很难实施的事情,但是它会提升你的演讲。当你在演讲中紧张地说,“我认为明年的销售额会增加”,这会让你的听众质疑你的可信度。最有可能的是,根据你的数据,你会知道销售会增加还是减少,所以不要说,“我假设明年的销售会增加”,而是说“我预计明年的销售会增加”。这增加了一点自信,让你的观众对你的可信度有信心。
与屏幕互动
演示是一个旅程。如果你想让你的观众注意,你需要引导他们通过你的幻灯片。假设您有一个图表,显示了下一年的营销参与预测。与其坐在那里谈论这些预测,我建议你站起来,走到屏幕附近,在解释你的发现时,指着不同的数据点。这将有助于你的观众理解他们所看到的。如果你记得参观一所你自己一无所知的大学,那可能不是那么愉快。然而,如果你参观一所你一无所知的大学,并有一名导游帮助你,那可能是一次更愉快的经历。在新冠肺炎·疫情期间,这也适用。在 Zoom 或 Skype 会议中,您可以使用鼠标光标模拟亲自指向屏幕。
保持你的解释的相关性
演示时,领域知识和部门知识很重要。如果您正在向其他分析师和数据科学家演示,详细介绍您的回归模型或平均误差可能是可以接受的。如果你要向销售主管做演示,这可能不是正确的方向。例如,我在今年夏天的高管团队演示中使用线性回归作为工具,然后详细讨论了我如何设置回归或者我在 Python 中分配了什么变量,我讨论了变量之间的关系是多么重要。这又回到了了解你的听众,这是你可以在你的演讲中融入的最强有力的概念。
结论
我希望这些建议对你的演讲有所帮助!作为数据专业的学生和专业人士,我们的工作是充当我们世界的导游。与企业的其他部门相比,我们的工作非常独特和不同,但是我们的信息对企业的成功极其重要。把你对数据的热情带到你的演讲中,你的听众会注意到的!保重,注意安全!
看看我的其他一些故事吧!
联系我或接收更多内容,在 Twitter 上关注我@BMNAnalytics!
如何在 Python 中呈现多个变量之间的关系
Jonah Pettrich 在 Unsplash 上的照片
了解如何使用 Python 中的多元图表和绘图来呈现要素之间的关系
处理大型数据集时,了解要素之间的关系非常重要。这是数据分析的一大部分。这些关系可以是两个变量之间的关系,也可以是几个变量之间的关系。在本文中,我将讨论如何用一些简单的技巧来呈现多个变量之间的关系。我将使用 Python 的 Numpy、Pandas、Matplotlib 和 Seaborn 库。
首先,导入必要的包和数据集。
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
df = pd.read_csv("nhanes_2015_2016.csv")
这个数据集非常大。至少大到不能在这里截图。以下是该数据集中的列。
df.columns
#Output:
Index(['SEQN', 'ALQ101', 'ALQ110', 'ALQ130', 'SMQ020', 'RIAGENDR', 'RIDAGEYR', 'RIDRETH1', 'DMDCITZN', 'DMDEDUC2', 'DMDMARTL', 'DMDHHSIZ', 'WTINT2YR', 'SDMVPSU', 'SDMVSTRA', 'INDFMPIR', 'BPXSY1', 'BPXDI1', 'BPXSY2', 'BPXDI2', 'BMXWT', 'BMXHT', 'BMXBMI', 'BMXLEG', 'BMXARML', 'BMXARMC', 'BMXWAIST', 'HIQ210'], dtype='object')
现在,让我们用几列来缩小数据集。所以,在本文中更容易处理和展示。
df = df[['SMQ020', 'RIAGENDR', 'RIDAGEYR','DMDCITZN',
'DMDEDUC2', 'DMDMARTL', 'DMDHHSIZ','SDMVPSU',
'BPXSY1', 'BPXDI1', 'BPXSY2', 'BPXDI2', 'RIDRETH1']]
df.head()
您可能会觉得列名很奇怪。当我们继续使用它们时,我会继续解释。
- 在这个数据集中,我们有两个收缩压数据(’ BPXSY1 ‘,’ BPXSY2 ‘)和两个舒张压数据(’ BPXDI1 ‘,’ BPXDI2 ')。这两者之间是否有关系值得研究。观察第一次和第二次收缩压之间的关系。
为了找出两个变量之间的关系,散点图已经被使用了很长时间。这是看待两个变量之间关系的最流行、最基本、最容易理解的方式。
sns.regplot(x = "BPXSY1", y="BPXSY2", data=df, fit_reg = False, scatter_kws={"alpha": 0.2})
两个收缩压之间的关系是正线性的。在图中观察到许多重叠。
2.为了更好地了解收缩压和舒张压数据及其关系,可以制作一个联合图。Jointplot 同时显示数据的密度和两个变量的分布。
sns.jointplot(x = "BPXSY1", y="BPXSY2", data=df, kind = 'kde')
在该图中,它非常清楚地显示了最密集的区域是从 115 到 135。第一和第二收缩压分布都是右偏的。还有,他们两个都有一些离群值。
3.找出男性和女性人群中第一次和第二次收缩压之间的相关性是否不同。
df["RIAGENDRx"] = df.RIAGENDR.replace({1: "Male", 2: "Female"})
sns.FacetGrid(df, col = "RIAGENDRx").map(plt.scatter, "BPXSY1", "BPXSY2", alpha =0.6).add_legend()
这张图显示,两者的相关性都是正线性的。让我们更清楚地找出相关性。
print(df.loc[df.RIAGENDRx=="Female",["BPXSY1", "BPXSY2"]].dropna().corr())
print(df.loc[df.RIAGENDRx=="Male",["BPXSY1", "BPXSY2"]].dropna().corr())
从上面的两个相关图来看,女性人群中两个收缩压之间的相关性比男性高 1%。如果这些东西对你来说是新的,我鼓励你尝试理解两个舒张压或收缩压和舒张压之间的相关性。
4.人类的行为会随着许多不同的因素而改变,如性别、教育水平、种族、经济状况等等。在这个数据集中,我们还有种族(“RIDRETH1”)信息。检查种族和性别对收缩压之间关系的影响。
sns.FacetGrid(df, col="RIDRETH1", row="RIAGENDRx").map(plt.scatter, "BPXSY1", "BPXSY2", alpha = 0.5).add_legend()
随着种族和性别的不同,相关性似乎会有一点点变化,但通常会像以前一样保持正线性。
5.现在,关注数据集中的其他一些变量。找出教育和婚姻状况之间的关系。
“教育程度”列(“DM deduct 2”)和“婚姻状况”列都是分类的。首先,用有意义的字符串值替换数值。我们还需要去掉那些不会给图表增加有用信息的值。例如,教育栏有一些值“不知道”,婚姻状况栏有一些值“拒绝”。
df["DMDEDUC2x"] = df.DMDEDUC2.replace({1: "<9", 2: "9-11", 3: "HS/GED", 4: "Some college/AA", 5: "College", 7: "Refused", 9: "Don't know"})
df["DMDMARTLx"] = df.DMDMARTL.replace({1: "Married", 2: "Widowed", 3: "Divorced", 4: "Separated", 5: "Never married", 6: "Living w/partner", 77: "Refused"})
db = df.loc[(df.DMDEDUC2x != "Don't know") & (df.DMDMARTLx != "Refused"), :]
最后,我们得到了这个干净的数据框架,可以用于图表了。
x = pd.crosstab(db.DMDEDUC2x, db.DMDMARTLx)
x
这是结果。这些数字看起来很容易理解。但是一张人口比例的图表会是一个更合适的表述。我得到了基于婚姻状况的人口比例。
x.apply(lambda z: z/z.sum(), axis=1)
6.找出按种族(’ RIDRETH1 ')和教育水平划分的婚姻状况的人口比例。
首先,将“种族”列中的数值替换为有意义的字符串。我是从疾控中心网站找到这些字符串值的。
db.groupby(["RIDRETH1x", "DMDEDUC2x", "DMDMARTLx"]).size().unstack().fillna(0).apply(lambda x: x/x.sum(), axis=1)
7.观察受教育程度随年龄的差异。
在这里,教育水平是一个分类变量,年龄是一个连续变量。观察教育水平随年龄变化的一个好方法是做一个箱线图。
plt.figure(figsize=(12, 4))
a = sns.boxplot(db.DMDEDUC2x, db.RIDAGEYR)
该图显示,年轻人接受大学教育的比率较高。小提琴情节可能会提供一个更好的画面。
plt.figure(figsize=(12, 4))
a = sns.violinplot(db.DMDEDUC2x, db.RIDAGEYR)
所以,小提琴图显示了一个分布。受过大学教育最多的人在 30 岁左右。与此同时,大多数不到 9 年级的人,大约是 68 到 88 岁。
8.显示按性别分布和隔离的婚姻状况。
fig, ax = plt.subplots(figsize = (12,4))
ax = sns.violinplot(x= "DMDMARTLx", y="RIDAGEYR", hue="RIAGENDRx", data= db, scale="count", split=True, ax=ax)
这里,蓝色表示男性人口分布,橙色表示女性人口分布。只有“从未结过婚”和“与伴侣同居”这两个类别在男性和女性人口中的分布相似。其他类别在男性和女性人口中有显著差异。
以下是我在本文中使用的数据集:
在 GitHub 上创建一个帐户,为 rashida048/Datasets 开发做出贡献。
github.com](https://github.com/rashida048/Datasets/blob/master/nhanes_2015_2016.csv)
更多阅读:
顶级大学高质量免费课程的链接
towardsdatascience.com](/great-quality-free-courses-to-learn-machine-learning-and-deep-learning-1029048fd0fc) [## 数据宁滨与熊猫削减或 Qcut 方法
当你在寻找一个范围而不是一个确切的数值,一个等级而不是一个分数
towardsdatascience.com](/sort-and-segment-your-data-into-bins-to-get-sorted-ranges-pandas-cut-and-qcut-7785931bbfde) [## 学习使用 Python 的 Scikit_learn 库通过项目开发 KNN 分类器
适合机器学习新手
towardsdatascience.com](/clear-understanding-of-a-knn-classifier-with-a-project-for-the-beginners-865f56aaf58f) [## Numpy 完全指南
日常工作中需要的所有数字方法
towardsdatascience.com](/a-complete-guide-to-numpy-fb9235fb3e9d) [## Python 中从头开始的多项式回归
学习用一些简单的 python 代码从头开始实现多项式回归
towardsdatascience.com](/polynomial-regression-from-scratch-in-python-1f34a3a5f373) [## Python Matplotlib 的日常备忘单
完整的可视化课程
towardsdatascience.com](/your-everyday-cheatsheet-for-pythons-matplotlib-c03345ca390d) [## 练习数据科学技能和制作优秀投资组合所需的所有数据集
一些有趣的数据集提升你的技能和投资组合
towardsdatascience.com](/all-the-datasets-you-need-to-practice-data-science-skills-and-make-a-great-portfolio-857a348883b5)
如何在您的企业中防止数据篡改
数据防篡改越来越受到全球安全领导者和企业的关注。
在 Unsplash 上由 Balázs Kétyi 拍摄的照片
谁喜欢别人乱动自己的东西?我们从小就知道,我们的就是我们的,我们不希望别人乱动我们的东西。我们组织的数据也是如此。不要让攻击者破坏它!
组织最重要的资产之一就是这些数据,防止数据被篡改是企业的首要任务之一。
网络攻击每年都在大幅增加。
虽然组织正在解决这些安全问题,但数据真实性仍然是网络安全方面最关键的因素之一。因此,公司现在正在寻找方法来防止数据篡改,并在其组织中实施更好的安全性。
在我们深入研究防止数据篡改的最佳方法之前,让我们来看看它如何影响您的组织,以及为什么您应该关注它。
数据篡改有什么风险?
据英国国家医疗服务系统(NHS)称,他们在 WannaCry 勒索软件攻击中损失了1 亿美元。更令人不安的是,勒索软件等网络攻击往往涉及某种数据篡改。
攻击者插入恶意文件,这些文件会改变网络或系统的配置,修改用户凭据以获得对敏感数据的访问权限,或者篡改日志文件。
想象一下,如果攻击者渗透到您公司的网络中,修改您客户的数据,然后篡改日志文件来掩盖他们的踪迹。
过多久你才会意识到自己已经成为数据篡改的受害者?
您是否能够追踪到攻击者或保护您客户的数据?
攻击者越来越多地使用勒索软件,这是一种恶意软件攻击,黑客在攻击过程中加密组织的数据或系统,并要求赎金来释放解密密钥。
据 Coveware 报道,2019 年最后一个季度,赎金要求的平均金额增至 84116 美元。
虽然建议公司不要向攻击者支付赎金,但此类攻击通常会利用公司的敏感数据,并可能一下子威胁到他们的整个业务。数据篡改会给组织带来深远而严重的后果。
遏制数据篡改造成的损害的两个最重要的步骤是快速检测到您的数据已被修改或篡改,并维护与核心数据分开的数据的良好备份(这样它们就不会被篡改)。显然,企业必须保持警惕,以保护他们的数据免受篡改攻击。
让我们来看看您可以为防止数据篡改做些什么。
如何防止数据篡改?
随着企业定期处理大量数据,防止数据篡改变得十分必要。
以下是防止数据篡改的 5 种有效方法:
1.对静态数据和传输中的数据实施加密
未受保护的数据,无论是静态的还是传输中的,都会使组织容易受到数据篡改和其他网络攻击。保护静态数据和传输中数据的最有效方法之一是加密。
简而言之,数据加密是将数据从一种形式转换为另一种形式的过程,未经授权的用户无法解密。
数据加密如何防止数据篡改攻击?
例如,您将客户的信用卡详细信息存储在数据库中,因此通过加密静态数据,您实际上是将客户的敏感数据转换为加密格式,没有解密密钥就无法解码或读取。
虽然攻击者可能能够篡改加密数据,但他们无法以有意义的方式篡改数据。例如,他们不能改变从史蒂夫->乔到史蒂夫->攻击者的转移。
为了保护静态数据,您可以在存储敏感数据之前对其进行加密,或者对存储驱动器本身进行加密。对于传输中的加密数据,您可以使用加密连接,如 SSL、TLS、HTTPS、FTPS 等。
要进一步加强您的数据加密,请分配基于角色的控制,以确保只有授权用户才能访问加密数据。此外,您还可以实施多因素身份认证来提高安全性。
2.写入时复制文件系统
写时复制,通常被称为 COW,是一个用于在数据库服务器上维护即时快照的概念。它还有助于防止数据篡改。
每次修改数据库时,都会拍摄增量快照。安全团队可以通过监控快照和检查意外的文件系统快照来检测数据篡改。
许多数据库应用程序和操作系统(如 Linux、Unix)都有内置的快照功能。这使得企业很容易集成 COW 或任何其他类似的技术,并随时更新数据库修改。
COW 还有助于保护数据免受潜在的网络攻击,如基于勒索软件的加密攻击。因此,将文件系统恢复到攻击前的状态(数据处于原始状态)、恢复丢失的数据以及消除任何停机变得更加容易。
3.使用 HMACs 的数据完整性
基于哈希的消息认证码(HMAC)是一种消息认证码(MAC ),由加密哈希函数和加密密钥组成。
基本上,HMAC 是一种对消息/文件进行签名的方式,因此如果数据被篡改,很容易检测到,然后您就知道不要相信被篡改的数据。
HMAC 是如何防止数据篡改的?
当两方或多方通过安全文件传输协议交换数据时,数据会附带 HMACs,而不仅仅是普通的哈希。这项技术由共享密钥和散列函数组成。
对消息进行哈希处理,然后用共享密钥对其进行签名。共享密钥有助于交换方确保数据的真实性。因此,提供了一种方法来验证他们接收的数据和 HMAC 是否真的来自授权的、预期的发送者,并且消息没有被改变。
4.文件完整性监控(FIM)
文件完整性监控是一种强大的安全技术,可以保护业务数据和 IT 基础设施免受已知和未知威胁的侵害。FIM 是监控文件以检查是否有任何更改的过程。
这项技术如何帮助防止数据篡改?
它评估系统文件并生成一个加密校验和作为基线。然后,FIM 反复重新计算相同资源的校验和,将其与基线进行比较,如果检测到更改,它将生成安全警报。
FIM 系统通常会监控用户凭据、权限、身份、操作系统、配置文件、应用程序文件和加密密钥存储。
FIM 系统是资源密集型的,尤其是在处理大量数据和频繁变化的数据时。也就是说,监控更容易受到网络攻击的文件或机密文件至关重要,这样才能有效地投入资源。
5.WORM 系统(一次写入多次读取)
一写多读(WORM)系统指的是一种存储技术,其中数据一旦写入就不能被覆盖或修改。这项技术长期以来一直用于大型企业和政府机构的存档目的。
WORM 系统提供长期存储策略,确保用户不会意外或故意擦除或修改数据。这项技术提供了虚拟保护,防止数据被擦除。
即使在最好的情况下,破坏 WORM 系统上的数据也是很困难的,但是如果一个具有高度技术知识的专家可以不受限制地访问操作系统的最深层,并获得访问 WORM 驱动器的权限,那么破坏数据还是有可能的。
为了确保您的 WORM 系统得到很好的保护,请实施用户访问控制,例如最低权限模型,该模型只允许用户访问他们执行工作所需的内容。
外卖食品
数据篡改是一个新出现的网络安全问题,对一个组织来说可能是毁灭性的。
虽然数据篡改的影响因受损数据的业务价值而异,但它更有可能给企业带来严重损害。
防止数据篡改可以包括简单的安全措施,如数据加密,也可以包括一些措施,如使用文件完整性监控(FIM)系统来提高安全性。
最终,哪种解决方案最适合您来保护您的数据免受潜在威胁,这取决于您的组织需求。
我们可以帮助您运行安全审计,以确保您的组织免受数据篡改攻击,并帮助您实施一个可靠、强大的安全模型。
关于作者:
Steve Kosten 是 Cypress Data Defense 的首席安全顾问,也是“Java/JEE 中的 SANS DEV541 安全编码:开发可防御应用程序”课程的讲师。
如何使用 Big Query & Data Studio 在 Google Cloud 上处理和可视化财务数据
GCP 从业者从金融数据开始的教程
卢卡斯·布拉塞克在 Unsplash 上的照片
介绍
本文将向您展示使用 Google 云平台的 BigQuery 处理股票价格数据的一种方法,并使用 Google Data Studio 在处理后的数据上构建一个简单的仪表板。
学习这样做对于任何希望自动从股票价格洞察中发现结果,并且正在寻找一种高效快速的方法将整个过程存储在云平台上的人来说都是非常有用的。
这篇文章是上一篇文章的延续,或者说是“第二部分”,在上一篇文章中,我展示了如何使用 API 和 Google Cloud用 Python 自动收集金融数据。 如果您对这个工作流的上游数据导入和脚本自动化方面感兴趣,请随意阅读。如果没有,就跳过并继续阅读。
步骤 1:识别 BigQuery 的数据源
Google big query是 GoogleCloud 的数据仓库解决方案(众多解决方案中的一个),非常适合处理本教程中的关系数据。
在第 1 部分中,我展示了如何使用云函数将数据自动送入 BigQuery。在下一步中,您将使用相同的数据源(来自 S & P500 公司的每日股票价格数据,以及相关的映射表,这将允许我们使用一些分类变量来丰富数据)来构建简单的& neat 处理和数据可视化管道。
注意:下面的截图将取自我自己的 GCP 控制台(我已经将意大利语设置为默认语言)。我已经记录了每个带有解释的截图,这样每个人都可以用英语理解。
首先,一旦登录到 BigQuery 的编辑器,并且假设您已经设置了数据集,您可以通过简单地点击编辑器页面左侧的“Resources”选项卡来识别上传的数据源。
作者截图
这允许您立即获得数据集列表以及每个数据集中包含的表。
对于这个练习,我的数据仓库结构如下*(我将忽略上面截图中报告的 USA_SectorViews 表)😗
数据集:CSM
表格:
- sp components*:*标识标准普尔 500 成员公司完整列表的表格(来源:标准普尔 500 公司列表)
该表中的大多数列与上面的源链接中报告的完全相同,因此您可以直接使用该网页作为参考。
SPComponents 表中的快照
②。历史** : 包含从 2000 年到 2020 年 6 月所有标准普尔 500 指数成员公司每日股票价格信息的表格。
SPhistorical 表的快照,包含所有列出的列
步骤 2:计算股票指标,并在保存的 SQL 查询中合并分类变量
使用上面的两个表,让我们使用 BigQuery 的 SQL 编辑器处理数据,以导出一个包含股票价格指标和分类变量的综合表。
出于本示例的目的,最终输出表将以下列为特征:
时间戳 :每行和每只股票的日期键
符号 :每个 S & P500 公司的股票标识符
【GICS】***_ Sector:***列表示各公司所属的行业(医疗保健、消费等…)
***总部:***各事务所总部所在地
百分比 _ 每日 _ 回报: 每只股票的每日回报(基于收盘价)
MA_5_days: 股票前 5 天的移动平均线,期间的参照是当前行的日期。基于接近的价格。
MA_10_days: 股票前 10 天的移动平均线,其中期间的参照是当前行的日期。基于接近的价格。
MA_15_days: 股票前 15 天的移动平均线,期间参照为当前行的日期。基于接近的价格。
计算移动平均线的周期选择没有内在原因,只是为了走查而计算的。你绝对可以在网上了解更多关于均线的知识,因为有很多 有价值的教程 。
使用我们的两个表,您可以看到您有大多数列 (时间戳,【GICS】_ 扇区,总部)* 已经准备就绪。*
使用 历史 表中的收盘价格列,您可以计算剩余的列(Percentage_Daily_Returns 和股票在 5–10–15 天期间的移动平均值)。
首先,让我们计算一下每只股票的日收益率。股票回报的计算方法是任意两天的收盘价之差,用前一天收盘价的百分比表示。
*ROUND(((CAST(Close AS float64)-CAST(LAG(Close,1) OVER(PARTITION BY p.Symbol ORDER BY Timestamp) AS float64))/CAST(Close AS float64))*100,2) AS Percentage_Daily_Return*
您可以使用 LAG 函数来识别前一天的收盘*(仅针对每个股票代码,因为您不想根据不同的股票价格计算收益;因此使用OVER(PARTITION BY Symbol)),取其与当天的收盘之差,除以当天的收盘价格来计算收益。*
这是计算的本质。然后,您可以使用 CAST 函数将文本数据类型转换为浮点数,以便能够对数字进行加法和除法运算,而 ROUND 函数将返回两位小数。
如果你的数据类型已经是正确的,你可以避免使用 CAST 函数…)
股票在 5 天内的移动平均线计算如下:
*AVG(CAST(Close AS float64)) OVER (PARTITION BY p.Symbol ORDER BY Timestamp ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) AS MA_5day*
您可以使用 AVG 函数来计算每个不同符号的收盘价格的平均值,考虑由当天收盘和组成 5 天时间段的前 4 天组成的行窗口。
同样的逻辑在 10 天和 15 天内重复。
*AVG(CAST(Close AS float64)) OVER (PARTITION BY p.Symbol ORDER BY Timestamp ROWS BETWEEN 9 PRECEDING AND CURRENT ROW) AS MA_10daysAVG(CAST(Close AS float64)) OVER (PARTITION BY p.Symbol ORDER BY Timestamp ROWS BETWEEN 14 PRECEDING AND CURRENT ROW) AS MA_15days*
将所有内容放在一起,您将获得以下 SQL 查询:
作者截图
总之,该查询从 SPhistorical (别名为" p “)和 SPcomponent s 表(别名为” c ")中提取。使用相互的符号列作为键来连接这两个表。
我使用 SPhistorical 表作为两者之间的主要参考表。因此我定义了一个左连接,通过它我从 SPcomponents 带来我感兴趣的分类变量( GICS_Sector &总部)。
时间戳、符号、每日收盘均从 p 拉取。分类变量GICS _ 部门和总部从 c 中提取。在每日收盘时,将进行上述计算。
然后,该表按相关变量分组,并按符号和时间戳排序。您启动查询,等待 BigQuery 进行计算和执行,并在不久后获得结果。
作者截图
然后,您可以优化您的查询,计算新的指标,并尽可能多次地重新运行,以获得您想要的输出。另外,不要忘记通过点击“执行”按钮旁边的“保存查询”按钮,将您的查询保存为“已保存查询”。点击查看更多信息。
完成后,您就可以将查询结果用作 Data Studio 仪表板的数据源层了。
步骤 3:从 Data Studio 中,连接到保存的查询并将数据拖到仪表板上
选项 1:
你现在可以跳到你的数据工作室账户上,点击加号开始一个新的报告。
作者截图
在这里,您可以选择各种数据连接器:
作者截图
选择 BigQuery 后,您只需点击导入个性化查询并粘贴到我们在第 3 步构建的已保存查询中。完成后,点击添加。
作者截图
假设您已连接,数据将被提取,然后您将看到一个空白的报告视图,您可以从该视图开始构建您的仪表板。注意如何选择 BigQuery 作为我的数据源。
作者截图
选项 2:
在 BigQuery 内,你可以点击“探索数据”>“用 Data Studio 探索”。
作者截图
单击此处,将弹出一个 Data Studio 数据探索窗格,您将能够开始绘制和可视化数据。这对于进行快速分析和获得查询结果的直观感觉特别有用。
作者截图
第 4 步:使用 Google Data Studio 探索数据
在这一步,如果您的最终目标是构建一个完整的仪表板或可视化报告,您可能更喜欢选择选项 1。
我还会选择这个选项,以便在探索数据时获得更多的灵活性( space exploration 功能在撰写本文时仍处于测试版本)。
为了更深入地了解数据并概述 Data Studio 的功能,我将回答以下问题:
1)2020 年标准普尔 500 指数由哪些主要行业组成?
2)这些公司在地理上是如何分布的(就总部基地而言)?
*3)历史上 间谍 表现如何?
对于间谍来说,移动平均线的最新趋势如何?
*跟踪整个 S&P500 的指数基金。在第 1 部分中,除了每个 S & P500 个体成员之外,我还包括了间谍,我将在这里使用它
总的来说,Data Studio 相当简单地充当了一个直观的拖放界面,用户可以在不同的图表类型中进行选择,并根据自己处理的数据对它们进行样式/格式设置。
在 这个 链接,你还可以参考一个很棒的指南,它非常详细地说明了它们的整个界面。
现在让我们看看不同的图表类型如何帮助回答上述问题。
1)2020 年构成 S & P500 的主要行业板块有哪些?
为了解决第一个问题,饼图似乎是一个不错的选择。有关在 Data Studio 上向空白报告添加图表的详细信息,请参考本快速指南 e。
作者截图
S&P500 在各产业部门之间很平衡。按流行程度排列的前三名是工业、信息技术和金融,约占总数的 13-14%。
这些公司在地理上是如何分布的(就总部而言)?
作者截图
就总部所在地而言,正如所料,我们可以看到美国公司占主导地位,也有一些欧洲公司。使用地图时,您可以充分利用工具栏进行放大和缩小,进入全屏模式,以及整体调整地图视图。
*间谍 历史表现如何?
接下来,我用折线图绘制了这些年来的每日收盘图,以了解其趋势。
从长远来看,间谍的价值从 150 到 300+左右,稳定增长。
对于间谍来说,移动平均线的最新趋势如何?
然后我画出最近 5/10/15 日的移动平均线,看它们如何相互叠加。在为这三个指标选择了相似的时间尺度后,您可以看到,总体而言,它们倾向于非常紧密地相互跟踪,15 天周期的平均值显示了围绕总体趋势线的更多可变性。
计算移动平均线的周期选择没有内在原因,只是为了绘制而进行计算。你肯定可以在网上了解更多关于均线的知识,因为有很多 有价值的教程 。
将所有内容放在一起,您可以为您的报告添加标题,并获得类似于以下内容的内容:
作者截图
这允许您获得您感兴趣的数据和指标的完整快照。
正如您所看到的,Data Studio 使用起来非常简单,并且提供了很好的数据连接器和交互性。
后续步骤
您的工作流程正式建立。您可以保存所有的 BigQuery SQL 查询和 Data Studio 报告,并在新数据到来时刷新/扩展资源。
我希望给你看了一些有用的东西。你可以使用 GCP 的免费账户开始用你自己的数据构建你的谷歌云解决方案。
非常感谢您的阅读!
访问我的免费数据科学资源清单 这里
* [## 通过我的推荐链接加入 Medium-Edoardo Romani
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
edo-romani1.medium.com](https://edo-romani1.medium.com/membership)*
如何在 5 分钟内制作一个 DeepFake 视频
每个人都可以不用写一行代码就能制作 DeepFakes。
克里斯蒂安·格滕巴赫在 Unsplash 上拍摄的照片
你跳舞吗?你有没有最喜欢的舞者或表演者,你希望看到自己模仿他们的动作?现在你可以了!
想象一下你有一张全身照。只是一个静止的图像。然后你所需要的就是你最喜欢的舞者表演一些动作的独舞视频。现在没那么难了,因为抖音正在接管世界…
图像动画使用视频序列来驱动图片中对象的运动。在这个故事中,我们看到图像动画技术现在是多么的简单易用,以及你是如何制作出你能想到的任何东西。为此,我将相关出版物的源代码转换成一个简单的脚本,创建了一个任何人都可以用来生成 DeepFakes 的瘦包装器。有了源图像和正确的驾驶视频,一切皆有可能。
学习率是我每周给那些对 AI 和 MLOps 世界好奇的人发的简讯。你会在每周五收到我关于最新人工智能新闻、研究、回购和书籍的更新和想法。在这里订阅!
它是如何工作的
在这篇文章中,我们谈论一个新的出版物(2019),部分神经信息处理系统进展 32 (NIPS 2019) ,称为“图像动画的一阶运动模型”【1】。在这篇论文中,作者 Aliaksandr Siarohin、Stéphane Lathuilière、Sergey Tulyakov、Elisa Ricci 和 Nicu Sebe 提出了一种在给定驾驶视频的情况下对源图像进行动画制作的新方法,而无需关于要动画制作的对象的任何附加信息或注释。
在引擎盖下,他们使用一个经过训练的神经网络来重建视频,给定一个源帧(静止图像)和视频中运动的潜在表示,这是在训练过程中学习的。在测试时,该模型将一幅新的源图像和一段驾驶视频(例如一系列帧)作为输入,并根据这些帧中描述的运动预测源图像中的对象如何移动。
**该模型追踪动画中所有有趣的东西:头部运动、说话、眼球追踪甚至身体动作。**例如,让我们看看下面的 GIF:特朗普总统驾驶《权力的游戏》的演员像他一样说话和移动。
方法和途径
在创建我们自己的序列之前,让我们进一步探索这种方法。首先,训练数据集是大量视频的集合。在训练期间,作者从同一视频中提取帧对,并将它们馈送给模型。该模型试图通过某种方式学习这些对中的关键点以及如何表示它们之间的运动来重建视频。
图 1 —框架架构(A. Siarohin 等人,NeurIPS 2019)
为此,该框架包括两个模型:运动估计器和视频生成器。最初,**运动估计器试图学习视频中运动的潜在表示。**这被编码为特定于运动的关键点位移(其中关键点可以是眼睛或嘴的位置)和局部仿射变换。这种组合可以模拟更大的变换族,而不是仅使用关键点位移。模型的输出是双重的:一个密集的运动场和一个遮挡掩模。该遮罩定义了驾驶视频的哪些部分可以通过扭曲源图像来重建,以及哪些部分应该由上下文来推断,因为它们不存在于源图像中(例如,头部的后面)。例如,看看下面的时尚 GIF。每个模型的背面在源图片中不存在,因此,应该由模型来推断。
接下来,视频生成器将运动检测器的输出和源图像作为输入,并根据驱动视频将其动画化;它以类似于驾驶视频的方式扭曲源图像,并保留被遮挡的部分。图 1 描述了框架架构。
代码示例
本文的源代码在 GitHub 上。我所做的是创建一个简单的外壳脚本,一个薄的包装器,它利用源代码,每个人都可以很容易地使用它进行快速实验。
要使用它,首先,您需要安装模块。运行pip install deep-animator
在您的环境中安装库。那么,我们需要四样东西:
- 模型权重;当然,我们不希望从零开始训练模型。因此,我们需要权重来加载预训练的模型。
- 我们模型的 YAML 配置文件。
- 源图像;例如,这可以是一幅肖像。
- 一段驾驶视频;最好先下载一个面部清晰可见的视频。
为了快速获得一些结果并测试算法的性能,您可以使用这个源图像和这个驾驶视频。型号重量可在这里找到。下面给出了一个简单的 YAML 配置文件。打开一个文本编辑器,复制并粘贴以下行,并将其保存为conf.yml
。
model_params:
common_params:
num_kp: 10
num_channels: 3
estimate_jacobian: True
kp_detector_params:
temperature: 0.1
block_expansion: 32
max_features: 1024
scale_factor: 0.25
num_blocks: 5
generator_params:
block_expansion: 64
max_features: 512
num_down_blocks: 2
num_bottleneck_blocks: 6
estimate_occlusion_map: True
dense_motion_params:
block_expansion: 64
max_features: 1024
num_blocks: 5
scale_factor: 0.25
discriminator_params:
scales: [1]
block_expansion: 32
max_features: 512
num_blocks: 4
现在,我们已经准备好做一个模仿莱昂纳多·迪卡普里奥的雕像了!要获得结果,只需运行以下命令。
deep_animate <path_to_the_source_image> <path_to_the_driving_video> <path_to_yaml_conf> <path_to_model_weights>
例如,如果您已经将所有东西都下载到了同一个文件夹中,cd
到那个文件夹并运行:
deep_animate 00.png 00.mp4 conf.yml deep_animator_model.pth.tar
在我的 CPU 上,大约需要五分钟才能得到生成的视频。除非--dest
选项另有规定,否则该文件将保存在同一文件夹中。此外,您可以通过--device cuda
选项使用 GPU 加速。终于,我们准备好看到结果了。相当牛逼!
结论
在这个故事中,我们介绍了 A. Siarohin 等人所做的工作,以及如何使用它来不费吹灰之力获得巨大的成果。最后,我们用一个薄薄的包装纸deep-animator
制作了一个雕像。
虽然对这种技术有一些担忧,但它可以有各种各样的应用,也显示了如今制作假新闻是多么容易,提高了人们对它的认识。
学习率是我每周给那些对 AI 和 MLOps 世界好奇的人发的简讯。你会在每周五收到我关于最新人工智能新闻、研究、回购和书籍的更新和想法。在这里订阅!
关于作者
我叫迪米特里斯·波罗普洛斯,我是一名为阿里克托工作的机器学习工程师。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲央行、经合组织和宜家等主要客户设计和实施过人工智能和软件解决方案。
如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据运算的帖子,请关注我的 Medium 、 LinkedIn 或 Twitter 上的 @james2pl 。
所表达的观点仅代表我个人,并不代表我的雇主的观点或意见。此外,请访问我的网站上的资源页面,这里有很多好书和顶级课程,开始构建您自己的数据科学课程吧!
参考
[1] A. Siarohin,S. Lathuilière,S. Tulyakov,E. Ricci 和 N. Sebe,“图像动画的一阶运动模型”,神经信息处理系统会议(NeurIPS),2019 年 12 月。
如何在 Jupyter 环境下生成交互式 Matplotlib 图
使用所有使用 Matplotlib 的 Python 库创建交互式绘图/地图
用 Canva 创建的图像
Matplotlib 是非常强大的可视化库,是许多其他 python 库的默认后端,包括 Pandas、Geopandas 和 Seaborn 等等。
今天,有不同的选项来启用 Matplotlib 绘图的交互性。然而,新的本地 Matplotlib/Jupyter 交互小部件为所有使用 Matplotlib 的第三方包提供了更广泛的用途和好处。
这项技术建立在 Matplotlib 和 Widgets 之上,允许您在没有第三方库的情况下进行交互式绘图。唯一的要求是安装 Ipympl,所有的交互性扩展都可以在您的 Jupiter 笔记本环境中获得。
在本教程中,我将介绍一些使用 ipympl 的 Matplotlib 交互式数据可视化的用例及示例。我们将首先介绍 ipympl 的基础知识,它的画布和一些例子。
利用 Jupyter interactive widgets 框架, IPYMPL 在 Jupyter 笔记本和 JupyterLab 中启用 matplotlib 的交互特性。
Jupyter 实验室的 IPYMPL
要启用交互式可视化后端,您只需使用 Jupyter magic 命令:
%matplotlib widget
现在,让我们设想一个 matplotlib 图。我们首先用 Pandas 读取数据,并用 Matplotlib 创建散点图。
url =df = pd.read_csv(
“[https://raw.githubusercontent.com/plotly/datasets/master/tips.csv](https://raw.githubusercontent.com/plotly/datasets/master/tips.csv)”
)# Matplotlib Scatter Plot
plt.scatter(‘total_bill’, ‘tip’,data=df)
plt.xlabel(‘Total Bill’)
plt.ylabel(‘Tip’)
plt.show()
没有额外的代码,只使用简单的 matplotlib 代码,输出是一个交互式的绘图,您可以放大/缩小,平移并重置为原始视图。下面的 GIF 图像显示了 ipympl 可能的交互性。
使用 Ipympl 的 Maptlotlib 交互式绘图
此外,您还可以定制用户界面的可见性、画布页脚和画布大小。
fig.canvas.toolbar_visible = **False**
fig.canvas.header_visible = **False** fig.canvas.resizable = **True**
这些命令改变 Ipympl 和 Matplotlib 图的用户界面。按钮将从用户界面上消失,但您仍然可以使用这些功能。要恢复到通常的 matplotlib 图,可以内联调用 matplotlib:
%matplotlib inline
让我们转向与熊猫互动的情节。
互动熊猫情节
熊猫图建立在 Matplotlib 之上;因此,我们也可以使用 Ipympl 创建交互式熊猫情节。让我们用熊猫做一个简单的线图。
df.plot(kind=”line”)
瞧,我们有一个与熊猫互动的情节。这个线图很密集,有了这个交互功能,我们可以放大到特定的地方,与图进行交互。见下图 GIF。
互动熊猫情节与 Ipympl
请注意,熊猫已经有一些交互式后端选项,包括 Plotly 和 Bokeh。然而,这并没有扩展到构建在 Pandas 之上的其他库。Geopandas 就是这样一个库,多亏了 Ipympl,它获得了第一批交互式地图。
带有 Geopandas 的交互式地图
如果您在 Pandas 中使用过地理空间数据,那么您应该已经知道 Geopandas,它在地理空间数据科学领域得到了广泛的应用。带有 Geopandas 的交互式地图改变了游戏规则。虽然 pandas 有其他后端选项来使其情节互动,但这在 Geopandas 上是不可能的。
由于 Geopandas 也构建在 Maptlotlib 之上,因此 Ipympl 的交互式后端也扩展到了它。我们现在可以在 Geopandas 中拥有交互式地图,而无需使用任何其他第三方地理可视化库。
让我们看一个由 Ipympl 支持的 Geopandas 交互式地图的例子。我将首先使用 Pandas 读取数据,因为我们使用 CSV 文件并将其转换为 Geopandas 地理数据框架。
carshare = “[https://raw.githubusercontent.com/plotly/datasets/master/carshare.csv](https://raw.githubusercontent.com/plotly/datasets/master/carshare.csv)"
df_carshare = pd.read_csv(carshare)gdf = gpd.GeoDataFrame(df_carshare, geometry=gpd.points_from_xy(df_carshare.centroid_lon, df_carshare.centroid_lat), crs=”EPSG:4326")
我们现在可以使用 Geopandas 绘制任何地理空间数据。我们可以直接打电话。plot()以可视化地图。然而,在这个例子中,我还添加了一个用于上下文目的的底图。
import contextily as ctx
fig, ax = plt.subplots()
gdf.to_crs(epsg=3857).plot(ax=ax, color=”red”, edgecolor=”white”)
ctx.add_basemap(ax, url=ctx.providers.CartoDB.Positron)
plt.title(“Car Share”, fontsize=30, fontname=”Palatino Linotype”, color=”grey”)
ax.axis(“off”)
plt.show()
我们有一个互动地图,上面有 Geopandas。我们可以放大缩小和平移地图。太棒了。
使用 Ipympl 的交互式 Geopandas 地图
我每天都使用 Geoapndas,所以这是一个没有太多障碍的巨大补充。您仍然可以使用 Geopandas 并拥有交互式地图,而无需使用其他第三方包。
结论
在本教程中,我们介绍了一种使用 Ipympl 通过 Maptlotlib 启用交互式绘图的简单方便的方法。我们已经看到了如何使用 Matplotlib、Pandas 和 Geopandas 创建交互式绘图。
要使用 Ipympl 的交互功能,您可以使用 Conda/ pip 安装它:
conda install -c conda-forge ipympl
pip install ipympl
如果使用的是 jupyterLab,还需要安装 node js 和 Jupyter Lab 扩展管理器。
conda install -c conda-forge nodejsjupyter labextension install @jupyter-widgets/jupyterlab-manager
jupyter lab build