TowardsDataScience 博客中文翻译 2019(三百八十九)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

用海报预测电影收入

原文:https://towardsdatascience.com/predict-movie-earnings-with-posters-786e9fd82bdc?source=collection_archive---------29-----------------------

用电影海报确定电影的类型和收益

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

如果你有一部夏季大片或一部短片,抓住观众注意力和兴趣的最佳方式是什么?两个最突出的方法是显而易见的:海报和预告片。

电影海报传达了电影的基本信息,如片名、主题、人物、演员以及电影制作人。电影海报可以告知观众他们正在观看的电影类型,因此,如果给定一张电影海报,机器学习模型可以识别电影的类型吗?

电影海报是促销的重要来源,优秀的海报设计有利于吸引尽可能多的观众。我们想知道,如果给我们一张电影海报,我们能否预测这部电影的票房是否会很好?

在本文中,我们将探讨数据准备和使用卷积神经网络来构建机器学习模型来回答这些问题。

资料组

我们从电影数据库(TMDb) 中收集了 45466 个电影元数据。我们可以从 TMDb 获得各种各样的属性,但是对于这个实验,我们只对以下字段感兴趣,1)标题,2)类型,3)海报,4)受欢迎程度,5)预算,6)收入。

由于一部电影可以分为多种类型,我们将只选择每部电影的第一种类型,因此每部电影只能有一种类型。在这个实验中,我们打算预测一部电影是否会在票房上取得好成绩,我们将使用收入/预算比率,定义为如果该值大于 1,则电影正在赚钱;否则,就不是。

以下是熊猫数据框中加载的样本数据集:

数据分析和过滤

我们不会马上下载所有 45466 张图片。相反,我们会做一些分析,筛选出那些有数据问题的,并选择电影海报列表进行下载。

首先,我们将删除那些缺少信息的内容:

  • 删除所有非字母数字字符后的空白标题
  • 没有流派
  • 没有海报网址
  • 没有预算
  • 没有收入

过滤掉不需要的数据后,有 40727 部电影。以下是各类型电影的数量分布:

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

对于我们的类型预测任务,我们想要预测 10 个类别。因此,我们将选择前 10 个流派,并删除其余的。

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

因此,我们根据受欢迎程度选择了每个类型中最受欢迎的 1000 部电影。这些是我们将要下载的电影海报,10 种类型的 10,000 张图片。

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

下载电影海报

从上面显示的数据框来看, poster_path 是文件的名称。为了获得玩具总动员海报的图片 URL,我们将http://image.tmdb.org/t/p/w185/追加到海报 URL 以获得:http://image . tmdb . org/t/p/w185//rhirbceo 9 lr 4 veexuwcc 2 wartg . jpg

我们可以用请求库下载所有的图像。我建议在每次图像下载之间增加 1 秒钟的延迟。这段代码用于将图像下载并保存到相应的流派文件夹中,以预测电影的流派:

图像处理

为了利用预先训练的模型,我们首先需要将我们的矩形海报转换成正方形。此外,为了减少计算成本,图像尺寸被调整为 224 乘 224。我们确定了 4 种图像处理方法来满足这些要求:

  • PIL 图书馆调整大小
  • 居中裁剪库调整大小
  • 填料
  • 随机裁剪和调整大小

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

方法 1: PIL 图书馆调整大小

使用 PIL 图书馆调整图像大小为 224x224。

from PIL import Imageimage = Image.open(PATHOFIMAGE)
image = image.resize((224, 224), Image.BILINEAR)
image.save(NEWPATH)

调整大小后处理过的图像变形如下:

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

方法 2:居中裁剪

我们将使用 PyTorch 的火炬视觉转换图像。

do_transforms = transforms.Compose([
        transforms.CenterCrop(input_size),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406],
                             [0.229, 0.224, 0.225])
])dataset = datasets.ImageFolder(PATH, transform=do_transforms)

处理后的图像导致图像的顶部和底部都被裁剪。

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

方法 3:填充

由于大多数电影海报都是纵向的,我们决定在左右两边添加黑色填充。这将避免原始海报图像的任何扭曲和裁剪。因为黑色填充在 RGB 中为零,所以它对我们的卷积神经网络的影响最小。

from skimage.transform import resizedef resize_image_to_square(img, side, pad_cval=0, dtype=np.float64):    
    h, w, ch = img.shape
    if h == w:
        padded = img.copy()
    elif h > w:
        padded = np.full((h, h, ch), pad_cval, dtype=dtype)
        l = int(h / 2 - w / 2)
        r = l + w
        padded[:, l:r, :] = img.copy()
    else:
        padded = np.full((w, w, ch), pad_cval, dtype=dtype)
        l = int(w / 2 - h / 2)
        r = l + h
        padded[l:r, :, :] = img.copy()resized_img = resize(padded, output_shape=(side, side))
    return resized_img

应用填充后的处理图像:

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

方法 4:随机裁剪和调整大小

我们将使用 PyTorch 的火炬视觉转换图像。

do_transforms = transforms.Compose([
        transforms.RandomCrop((280,280), padding=None, pad_if_needed=True, fill=0, padding_mode='constant'),
        transforms.Resize(input_size, interpolation=2),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406],
                             [0.229, 0.224, 0.225])
])dataset = datasets.ImageFolder(PATH, transform=do_transforms)

经过随机裁剪和调整后的处理图像。

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

图像处理结果

为了测量图像处理方法的准确性,我们使用预训练的 ResNet18 来执行分类。我们将分为喜剧和恐怖两种类型,因为它们的海报总体上明显不同。为了确保我们的比较是公平的,我们做了以下工作:

  • 用于训练的同一套电影和用于验证的同一套电影
  • 设置种子编号
  • 从 PyTorch 的火炬视觉载入预训练的 ResNet18

不同图像处理方法的模型精度如下:

  • PIL 图书馆的大小约为 80%
  • 中心裁剪库大小调整约为 80%
  • 填充率约为 85%
  • 随机裁剪和调整大小约为 85%

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

随机裁剪和调整大小方法在模型精度和处理速度方面表现最佳。在卷积神经网络中,图像中对象的位置无关紧要。

我们能通过海报来辨别电影的类型吗?

在我们的预处理步骤中,我们可以实现大约 85%的分类准确率,分为两类:喜剧恐怖。我们选择喜剧恐怖是因为这两种类型的海报截然不同。喜剧一般颜色较亮,而恐怖相比之下可能较暗。

以下是我们的一些测试案例,这些案例是模型看不到的:

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

有趣的是,该模型可以学习和区分这两种类型。这位模特很可能会拿起有骷髅头图案的海报,并将海报与恐怖电影联系起来。第四张图片显示并非所有白色背景的海报都是喜剧电影,并且模型预测是正确的。

然而,由于并非所有类型都遵循电影海报设计的一般要求,这些海报可能会导致模特误读设计。随后,模型可能会将这些电影错误地分类到相反的类型中。以下是一些电影海报的例子,它们偏离了与各自类型相关的一般设计。

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

第一个图像包含许多白色区域,通常看起来令人愉快,而第二个图像包含大面积的黑色区域,这导致海报看起来很暗,尽管有卡通设计和字体。这些布局误导了模型,从而导致了错误的预测。

10 种类型之间的模型识别

在我们的数据集中,我们有 10 个流派;每种类型包含 1000 张电影海报。执行 80/20 分割来训练和验证模型。我们使用了 8000 张图像进行训练,2000 张图像进行验证(不用于训练)。

我们利用预训练的 ResNet18 模型的权重来训练一个模型,以根据电影的海报对电影的类型进行分类。这些是训练过程中的精确度和损耗。

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

验证准确率约为 32%。我们的模型可以在训练集上学习和过拟合,但不能在验证数据集上推广。

前 3 名的准确率约为 65%。这让我们思考,是什么导致了所有的错误分类?我们如何进一步提高它的准确性?下面是一个热图,显示了前 1 名模型的所有错误分类:

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

我们意识到这个模型很难区分恐怖片和惊悚片《T21》的海报。如果你仔细想想,即使对我们人类来说也是如此,我们可能无法区分恐怖片和惊悚片。

同样的结果也可以在喜剧和浪漫中观察到,因为这两种类型的海报都采用了更轻松的基调,并且包含了人类和微笑的面孔。

我们可以通过海报来判断这部电影是否会在票房上赚钱吗?

由于海报是一部电影的营销工具,我们想知道一部电影海报是否能吸引更多的观众。一个模型能识别出一种特定类型的海报在票房上是否更好吗?

在我们的实验中,我们通过电影的收入与预算比率来定义电影的表现。预算较高的电影需要更高的收入才能收支平衡。比例越高,电影做的越好。

我们用收入与预算比率创建了两个类别,“做得好”和“做得不好”。比率为 1 及以上的电影“做得好”,否则归类为“没做好”。

预训练结果 18

是啊!我们预先训练的 ResNet18 模型可以正确识别一部电影是否有赚钱的潜力,准确率约为 68%。

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

我们能做得比这更好吗?我可以换一个更深入的实验,但不会很有趣,所以这里有一些我们尝试过的其他实验。

卷积神经网络用于图像分类的技巧包

Tong He et al. 的一篇论文建议通过在下采样块中接收更多信息来改善 ResNet 调整。

作者使用这些调整将 ResNet50 模型 top-1 在 ImageNet 上的准确率从 75.3%提高到 79.29%

Mish 激活函数

Mish 是一个上无界、下有界、光滑、非单调的激活函数。

Mish 激活函数的正范围与最流行的激活函数 ReLu 非常相似。被限制在下面导致了正则化效应。负范围保留了小的负输入,这改善了表现性和渐变流动。阅读更多关于米什的文章,作者是迪甘塔·米斯拉。

数据扩充

最近,模型精度的提高归功于通过数据扩充产生了更多的数据;这显著增加了可用于训练的数据的多样性。

from torchvision import transformsimage_transforms = {
    # Train uses data augmentation
    'train':
    transforms.Compose([
        transforms.RandomResizedCrop(size=256, scale=(0.8, 1.0)),
        transforms.RandomRotation(degrees=15),
        transforms.ColorJitter(),
        transforms.RandomHorizontalFlip(),
        transforms.CenterCrop(size=224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406],
                             [0.229, 0.224, 0.225])
    ]),
    # Validation does not use augmentation
    'validate':
    transforms.Compose([
        transforms.Resize(size=256),
        transforms.CenterCrop(size=224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406],
                             [0.229, 0.224, 0.225])
    ]),
}

自制深宽网

这是受推荐系统的宽&深模型的启发,通过将预训练的 ResNet 与预训练的宽 ResNet 相结合。

首先,我们加载预训练的 ResNet 和预训练的 wide-ResNet,并移除最后的完全连接层以进行 ImageNet 分类。然后,我们将来自输入的 3×3 卷积、批量归一化和 ReLu 附加到两个 ResNet。最后,我们连接来自两个 ResNet 的输出,然后添加另一个 3×3 卷积和用于分类的全连接层。

各种实验的分类结果

以下是我们的结果:

米什可以得到 3%的改善,因为正则化效果,从而更好地概括了看不见的。我会给这个激活更多的探索在未来。

数据增强也有 3%的改进,事实上,我有点惊讶数据增强会在这个问题上有所改进。

结论

仅凭一张电影海报,预测一部电影的收入和受欢迎程度可能是一项艰巨的任务。这个问题甚至对分销公司和投资者来说也是如此,他们有数百名专家和分析师为他们工作,以确保他们的投资不会白费,并获得丰厚的回报。我们模型的引入和发展可能会在未来帮助这些分析师和公司做出更详细和合理的预测。

根据进一步的实验,为了获得更准确的读数,深入研究更深的 ResNet 模型可能会提高性能。然而,在我们的实验中,我们应用了 Mish 激活和来自研究论文的各种调整;因此,返回的结果是有希望的,是一条值得进一步探索的道路。

训练 AI 模型是成功的一半;值得注意的是,真实世界的数据是“肮脏的”和“未经提炼的”;这意味着并不是所有的数据都是准确和真实的。为了让机器学习发挥作用,我们必须首先很好地理解我们的数据,并理解我们的模型要成功需要什么。

[## 数据科学家:21 世纪最肮脏的工作

40%的吸尘器,40%的看门人,20%的算命师。

towardsdatascience.com](/data-scientist-the-dirtiest-job-of-the-21st-century-7f0c8215e845) [## 用海报预测电影收入

用电影海报确定电影的类型和收益

towardsdatascience.com](/predict-movie-earnings-with-posters-786e9fd82bdc) 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以 50%的准确率预测足球比赛

原文:https://towardsdatascience.com/predict-soccer-matches-with-50-accuracy-a24cc8078877?source=collection_archive---------12-----------------------

如何在 Python 中使用泊松分布进行足球预测

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

在过去的几年里,博彩和博彩游戏变得更加流行。你可以通过电脑或智能手机随时随地下注。因此,很多人试图预测体育赛事的结果并不奇怪。足球有一个巨大的市场,你可以在足球比赛中出现的几乎每一个事件上下注,比如进球、球员、卡片、角球等等。最常见的赌注叫做 1x2。你试着预测主队会赢(1),平局(x)还是客队会赢(2)。不信任章鱼保罗等动物的人正在寻找更复杂的统计方法。我想和你分享一个非常基本的方法。我们将更深入地了解泊松分布以及它在 Python 中的用法。关于基本的统计概念,请看这里的和这里的。在接下来的部分中,我将使用大卫·希恩在他的精彩博客中发表的部分代码。我将更深入地探讨细节,并在更广泛的样本上回顾该模型,以回答该模型有多成功的问题。一如既往,我不会包括我使用的任何代码,但你可以在 Github 上找到它。

获取一些数据

在我们创建模型、预测结果并检查其正确性之前,我们需要一些数据。那么让我们看看最后一个英超赛季:

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

20 支球队在 PL 中比赛,因此我们删除最后 10 行,并尝试预测最后一个比赛日的结果。

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

对于足球迷来说,这个结果并不奇怪。主队平均比客队进更多的球。

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

一支球队在单场比赛中的最高进球数是 6 个。基本上,我们现在已经有了泊松分布所需的所有参数。第一步,我们可以预测主队进 1 球的概率,例如:

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

主队进 1 球的几率是 32.6%。让我们想象一下 0 到 6 之间的目标值,以及主客场的目标值:

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

条形图显示了 2018/19 赛季的实际进球数量。这些线条显示了我们的泊松计算值,它们似乎非常符合实际分布。

预测一场英超比赛

现在我们已经学习了泊松分布的基本概念。但是我们如何预测一场比赛的进球数呢?答案是泊松回归:

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

我们将关注这种回归的主要方面。观察次数为 740 次(20 支球队 37 个比赛日)。在第一行中,我们看到一个名为“Intercept”的条目。这是基准比率,所有其他估计都是相对于它的。利物浦的团队系数是 0.1849,这意味着利物浦比一般球队进更多的球。系数越低,球队平均射门次数越少。切尔西的对手系数是-0.2537。切尔西的进球数比一般球队少。系数越低,球队平均进球越少。最后一排“主场 0.2526”是主场优势的表达:主场球队平均进球多。
为了计算利物浦的预计进球数,我们使用以下公式:

exp(Intercept+Coefficients)

因此,让我们填写 a)利物浦和 b)切尔西的公式:

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

请注意,我们只为利物浦添加了“主场”系数(0.2526)。预测将是 2:1,所以我们预计利物浦会赢。现在,让我们将我们的预测与上一个比赛日进行比较。

测试最后一个比赛日

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

好吧,我们预测了一半比赛日是正确的,一半比赛日是错误的。对于这样一个简单的模型,这并不坏,或者你认为呢?但我们只是预测了一场比赛,这是最后一个比赛日,一般来说不太容易预测。一些球队无法改变他们在积分榜上的位置,因此他们没有什么可失去的,这导致了他们的表现变弱。下一步,我们看看欧洲排名前五的联赛(关于欧足联系数)并挑选一个更大的样本。我们预测每个联赛的最后 10 个比赛日。

测试 5 个欧洲顶级联赛的最后 10 个比赛日

我们可以很容易地使用相同的代码和以前一样,并运行它为 5 而不是 1 联赛。正如我们之前所做的,我们在训练数据集中删除了最近 10 个比赛日:

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

在上图中,你看到了我们已经预料到的情况。最后两个比赛日的预测更糟糕。但总的来说,这条线大部分时间都在 5 点左右,这意味着特定比赛日的比赛有一半是预测正确的。总之,我们已经正确预测了 48.2%的比赛日。你可以看到标题是点击诱饵;).

结论

我们看到,通过使用简单的泊松回归,我们几乎可以正确预测 50%的匹配。它可以很容易地与 Python 一起使用,并允许有效的计算。它还可以快速扩展。您可以扩展代码来预测 a)其他联赛或 b)更多比赛的比赛。如果你想在这个模型上更进一步,你可以检查团队的形式,时间加权或者低估或高估结果的正确性。我希望你喜欢阅读!

如果您喜欢中级和高级数据科学,并且还没有注册,请随时使用我的推荐链接加入社区。

使用机器学习预测 2018-19 年 NBA 最有价值球员

原文:https://towardsdatascience.com/predicting-2018-19-nbas-most-valuable-player-using-machine-learning-512e577032e3?source=collection_archive---------18-----------------------

ML 模特对今年 NBA 最有价值球员有什么评价?

我们已经深入到季后赛了,但是投票结果还没有公布,这给了我一个想法去预测 MVP 的结果。

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

Photo by Kenny Eliason on Unsplash

收集数据

我在 basketball-reference 上找到了从 1968 年到 1969 年的每个赛季的数据,但我只使用了 1980 年到 1981 年的数据,这是媒体投票的第一个赛季,在此之前投票是由球员进行的。这是一个关于 2015-16 赛季数据的例子

这也是第一次,也是迄今为止唯一一次,一个球员被一致投票选为 MVP(每个投票者都给他第一名的选票)。

除了上表中的数据,我还搜集了一些不可用的玩家资料,例如,BPM,PER,TS%等数据。

刮刀的代码可以在这里找到。

但是我鼓励你避免再次抓取它,因为数据已经被获取,并且可以在我的 GitHub repoKaggle 中找到。

定义问题

有了这些数据,我将定义将要解决的问题。因为这是一个排序的任务,所以没有现成的算法可以解决这个问题。我将尝试通过回归问题来简化这个问题。

我们任务的目标值将是前面表格中的 Share 列。这个数字总是在 0 和 1 之间,代表每个玩家在投票中赢得的点数。

由于数据的结构方式,我们基本上是在试图模拟媒体将如何投票给本赛季的球员。当然,回归对于解决这样的问题是很棒的,但是这里的问题在于数据,因为它很不平衡。在奖励份额值的直方图上,您可以看到一半以上的示例位于 0.0 和 0.2 之间,这可能会给模型带来问题。

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

Image by Author

功能和功能选择

在我开始训练和验证模型之前,我将解释我将使用什么作为特征和一些简单的特征选择过程。

pts_per_g,ast_per_g,trb_per_g,stl_per_g,blk_per_g 是简单的 stats。场均得分,助攻,篮板,抢断,盖帽。 mp_per_g 代表每场比赛的分钟数, win_pct 代表球队的胜率(一个赛季有 82 场比赛,所以这个值代表 games_won 除以 games_total)。

fga, fg3afta 分别是投篮命中率,三分球命中率,罚球命中率, fg_pctfg3_pctft_pct 分别代表投篮命中率,三分球命中率,罚球命中率。

现在我们来看一些高级统计数据。

PER 代表玩家效率等级,基本上是所有正面和负面简单统计的计算。

BPM 代表框加减,是评估球员素质和对球队贡献的高级统计。根据,与相比,它需要更多的团队属性。

TS_PCT 代表真实投篮命中率,计算相当简单(实际上也包含在上面的统计中)。公式如下:

PTS / (2 * (FGA + 0.44 * FTA)) * 100

USG_PCT 是使用率百分比的缩写,是对球员在球场上使用的团队比赛的估计。计算可以在这里找到

而且最后 WSWS_per_48 代表赢股和每 48 分钟赢股。该统计试图将团队的成功划分到团队的个人成员身上。

特征选择

现在,即使在我对这些统计数据的简短描述中,您也可以看到它们是相似的,这就是为什么我继续进行几个简单的特征选择过程,以消除那些不能带来大量信息的特征。

第一个是使用互信息找出变量之间的依赖关系,这是使用 sklearn 的特征选择包完成的。

ws: 0.2884
per: 0.2811
ws_per_48: 0.2592
bpm: 0.2013
pts_per_g: 0.1482
usg_pct: 0.1053
win_pct: 0.0973
fta: 0.0948
ts_pct: 0.0872
fga: 0.0871
trb_per_g: 0.0695
mp_per_g: 0.0668
fg3a: 0.0355
ft_pct: 0.0311
ast_per_g: 0.0279
stl_per_g: 0.0139
fg_pct: 0.0089
blk_per_g: 0.0066
fg3_pct: 0.0000

然后,我使用随机森林回归,我拟合随机森林的实例,并找到该模型最重要的特征。

ws: 0.3911
win_pct: 0.1326
per: 0.0938
bpm: 0.0537
ws_per_48: 0.0428
fga: 0.0368
usg_pct: 0.0310
ft_pct: 0.0263
ast_per_g: 0.0253
mp_per_g: 0.0251
fg_pct: 0.0231
fta: 0.0213
pts_per_g: 0.0183
fg3_pct: 0.0159
ts_pct: 0.0155
trb_per_g: 0.0153
blk_per_g: 0.0118
stl_per_g: 0.0103
fg3a: 0.0101

最后,我找到了特征之间的关联矩阵。这对我帮助最大,因为我有一个很好的方法来可视化哪些特征非常相关,从而带来重复的信息,这在某些情况下对模型没有帮助。

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

Image by Author

在上一个图像中,您可以查看数据集中所有要素之间的相关性。之后,我去除了那些高度相关的或者基本上代表同一事物的特征,或者可以用一些标量乘法来表示的特征。

有了以上描述的几个步骤和我在上面描述的统计定义,我决定将特征简化为这些最终特征:

ts_pct
bpm
mp_per_g
pts_per_g
trb_per_g
ast_per_g
stl_per_g
blk_per_g
ws
win_pct

虽然它们之间仍然有一些关联,但我仍然决定使用这些功能,因为它们看起来最适合使用。我试着用所有的特性运行一个实验,结果导致了更慢的训练时间和更差的结果,这意味着这个特性选择是有意义的。

培训和验证

除了用于验证的一个季节之外,我使用所有季节的训练数据来进行交叉验证。我以这种方式训练每个模型,并平均每个赛季的结果。

我使用的指标是回归的均方误差,因为我想得到媒体投票的准确表示。但我也对结果进行了排序,并衡量了排名的准确性,我将此作为一个辅助指标。

对于回归,我使用了以下模型:

  • 线性回归
  • 里脊回归
  • 梯度推进回归器
  • 随机森林回归量
  • 连续的血管反应

我以上述方式对常规和多项式特征(多项式次数为 2 和 3)进行了实验。在训练期间,我对 0 和 1 之间的数据进行了缩放和不缩放的实验,结果没有显示出太大的差异。

通过梯度推进回归器获得最佳结果,该模型保持前 6 位(一些模型具有不同的参数或不同次数的多项式)。

完整的结果可以在我的 GitHub 库上看到,它们也放在三个文件中,分别叫做 reg_results_mse_sorted.txt,reg_results_sorted_top_1.txt,reg _ results _ sorted _ top _ 5 . txt

2018-19 赛季预测

最后,以下是对这一季的预测。首先,我将展示几个回归模型的结果,这些模型在所有验证分割中均方误差最好。

梯度推进回归器

该模型具有 50 个估计器和 0.1 的学习率,并且特征具有二次多项式特征。

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

Image by Author

梯度推进回归器的其他变化也有类似的结果,哈登排在第一位。此外,markdown 到 pdf 的转换器很笨拙,而且字母之间有间隔(我在 markdown 中创建了表格并转换为 pdf,然后将该表格的截图放在这里,我承认这是一个粗略的过程)。

随机森林回归量

具有 50 个估计量的模型,其中特征具有仅具有交互作用的三次多项式。

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

Image by Author

但是对于稍微不同的参数,例如 100 个估计量和仅具有交互作用的二次多项式特征,结果稍微不同。

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

Image by Author

山脉

岭是一种正则化的线性回归。值为 10 的 Alpha 和二次多项式特征显示为最佳结果。

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

Image by Author

线性回归

现在我也使用了正态线性回归,虽然这个模型的 MSE 非常好,但是结果却很有趣。

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

Image by Author

由于没有正则化,该模型可能在某些特征上过度拟合,并给出了这些结果。这是德怀特·鲍威尔和德安德鲁·乔丹唯一出现在前 5 名的地方,所以它们被排除在你将在下一节看到的图表之外。

支持向量回归

这是用于回归的支持向量机的变体。以下是模型的结果,其中 C=100伽马=0.001

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

Image by Author

此外,由于所有这些模型都是回归模型,它们当然可能会超过这些值,超过最大值 1.0。这并不理想,但由于我们对排名最感兴趣,我们可以接受。

平均 2018-19 年预测

在下图中,您可以看到根据按 MSE 指标排序的前 50 名模型,前 10 名玩家的平均得分。

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

Image by Author

哈登和詹尼斯之间非常接近,但哈登略有优势。在他们之后,Jokic 占据了第三的位置,尽管他没有进入最佳模特预测的前五名。而在那之后,其他所有分数都比较接近,实际上,会比那个小很多。

结论

在这篇文章的最后,我想祝贺詹姆斯·哈登,2018-19 赛季 NBA 最有价值球员!哈登被我训练和测试的大多数模型预测为 MVP(包括顶级模型,具有各种不同参数的梯度推进回归器),当一个人花一点时间看他的统计数据时,他应该是合乎逻辑的,然而詹尼斯也有一个惊人的赛季,在我看来,媒体可能会更偏向于他。

未来的工作

我认为这篇文章和我目前所做的所有工作只是触及了表面,我认为为了获得数据,可以进行更多的特征工程和搜集工作。

我认为,如果能够获得整个球队和整个赛季的平均数据,将会有很大收获。因为用它可以实现更好的数据标准化。此外,你可以查看谁在他们的团队中表现最突出,换句话说,谁携带他们最多(像今年的詹姆斯·哈登)。我也想这么做,但现在我不得不划清界限。

最后的话

我在我的 GitHub 资源库上传了完整的笔记本,它做了这篇文章中描述的所有事情,这里有一个到它的直接链接

这里还有一个直接链接到我的 GitHub 知识库,里面有很多关于篮球和数据科学的东西。

我也上传了数据集到 Kaggle,这里有一个链接到 Kaggle 数据集

用最大似然法预测房价。网

原文:https://towardsdatascience.com/predicting-a-house-price-using-ml-net-6555ff3caeb?source=collection_archive---------25-----------------------

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

Photo by todd kent on Unsplash

ML。Net 是一个开源的跨平台机器学习框架。NET 开发人员。Python(例程是用 C++编写的)通常用于开发许多 ML 库,例如 TensorFlow,当您需要在上紧密集成 ML 组件时,这会增加额外的步骤和障碍。Net 平台。ML.Net 提供了一套很棒的工具,让你可以使用。你可以找到更多关于 ML 的信息。网这里

针对 ML 1.4.0 更新

ML。NET 允许你开发一系列的 ML 系统

  • 预测/回归
  • 问题分类
  • 预测性维护
  • 图像分类
  • 情感分析
  • 推荐系统
  • 集群系统

ML。NET 为机器学习提供了一个开发者友好的 API,支持典型的 ML 工作流:

  • 加载不同类型的数据(测试、IEnumerable、二进制、拼花、文件集)
  • 转换数据特征选择、归一化、改变模式、类别编码、处理缺失数据
  • 为你的问题选择一个合适的算法(线性,提升树,SVM,K-Means)。
  • 培训(培训和评估模型)
  • 评估模型
  • 部署和运行(使用训练好的模型)

使用 ML.NET 框架的一个显著优势是,它允许用户快速试验不同的学习算法,更改特征集、训练和测试数据集的大小,以获得针对其问题的最佳结果。实验避免了一个常见的问题,即团队花费大量时间收集不必要的数据,并产生性能不佳的模型。

学习管道

ML。NET 将用于数据准备和模型定型的转换合并到一个管道中,然后将这些转换应用于定型数据和用于在模型中进行预测的输入数据。

讨论 ML 的时候。NET 中,重要的是要认识到使用:

  • 转换器—这些转换器转换和处理数据,并产生数据作为输出。
  • 评估者——获取数据并提供一个转换器或模型,例如在训练时
  • 预测-这使用单行或一组要素并预测结果。

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

我们将在简单的回归样本中看到这些是如何发挥作用的。

房价样本

了解功能如何适应数据准备的典型工作流,使用测试数据集和使用模型来训练模型和评估适合度。我研究了如何实现一个简单的回归应用程序,在给定大约 800 套房屋销售的一组简单特性的情况下,预测房屋的销售价格。在示例中,我们将看一看多元线性回归的监督学习问题。监督学习任务用于从一组特征中预测标签的值。在这种情况下,我们希望使用一个或多个特征来预测房屋的销售价格(标签)。

重点是让一个小样本启动并运行,然后可以用它来试验特性和训练算法的选择。你可以在这里找到这篇文章的代码

我们将使用一组销售数据来训练该模型,以便在给定一组超过 800 套房屋销售的特征的情况下预测房屋的销售价格。虽然样本数据具有各种各样的特征,但是开发有用系统的一个关键方面是理解所用特征的选择会影响模型。

开始之前

你可以找到一个 10 分钟教程,它将带你完成安装和先决条件——或者只使用以下步骤。

您需要安装 Visual Studio 16.6 或更高版本。安装了 NET Core 你就可以到达那里这里

开始建设。你只需要下载并安装就可以了。NET SDK

通过在命令提示符下运行以下命令来安装 ML.Net 软件包

dotnet add package Microsoft.ML --version 1.4.0

数据类

我们的第一项工作是定义一个数据类,在加载我们的。房屋数据的 csv 文件。需要注意的重要部分是[LoadColumn()]属性;这些允许我们将字段与输入中的不同列相关联。它为我们提供了一种简单的方法来适应我们可以处理的数据集的变化。当用户想要预测房子的价格时,他们使用数据类来给出特征。请注意,在定型模型时,我们不需要使用类中的所有字段。

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

培训和保存模型

CreateHousePriceModelUsingPipeline(…)方法在创建用于预测房价的模型时做了大部分有趣的工作。

代码片段显示了您可以如何:

  • 从. csv 文件中读取数据
  • 选择训练算法
  • 选择训练时要使用的功能
  • 处理字符串特征
  • 创建一个管道来处理数据和训练模型

在这些类型的问题中,您通常需要归一化入站数据,考虑特征房间和卧室,房间的值范围通常大于卧室,我们归一化它们以对拟合具有相同的影响,并加快(取决于教练)拟合时间。我们使用的训练器会自动对特性进行规范化,尽管如果你自己需要的话,框架会提供工具来支持规范化。

类似地,根据所用特征的数量(如果模型过度拟合),我们将正则化应用于训练器——这基本上保留了所有特征,但为每个特征参数添加了权重以减少影响。在示例中,培训师将处理规范化;或者,您可以在创建培训师时进行规范化调整。

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

估价

训练后,我们需要使用测试数据评估我们的模型,这将表明预测结果和实际结果之间的误差大小。减少误差将是对相对小的数据集进行迭代过程的一部分,以确定最佳的特征组合。ML 支持不同的方法。NET 我们使用交叉验证来估计从一次运行到另一次运行的模型质量的方差,这也消除了提取单独的测试集进行评估的需要。我们显示质量度量来评估和获得模型的准确性度量

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

我们将看看 R 平方指标:

  • R 平方 —提供拟合优度的度量,因为线性回归模型将在 0 - > 1 之间,越接近 1 越好。

您可以在这里找到可用的指标的描述

“按原样”运行代码会产生 0.77 的 R 平方,我们希望对此进行改进。第一步是开始试验特性选择,也许从减少特性列表开始之后,我们有了更清晰的理解,然后考虑获取更广泛的数据。

保存模型以备后用

存储用于预测房价的模型很简单

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

加载和预测房屋销售价格

一旦您调整了功能并评估了不同的培训,您就可以使用该模型来预测销售价格。我认为这是 ML.NET 框架的闪光点,因为我们可以在。Net 来支持使用该模型的不同方式。

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

对于这种类型的 ML 应用程序,典型的用途是创建一个简单的 REST 服务,在部署到 Windows Azure 的 docker 容器中运行。一个用 javascript 编写的 web 应用程序使用该服务,让人们快速了解房子应该卖多少钱。

使用。Net Core 我们可以在不同的硬件平台上运行后端,Visual Studio 2019、2017 使健壮服务的创建、部署和管理变得快速而简单。

在 GitHub 中找到代码:

GitHub

原载于 2019 年 2 月 21 日junwin . github . io

预测服务员的小费

原文:https://towardsdatascience.com/predicting-a-waiters-tips-1990342a0d02?source=collection_archive---------20-----------------------

fast.ai《程序员实用深度学习》第四课

在 fast.ai 的“程序员实用深度学习”第四课中,我们发现了如何使用深度学习和协同过滤来解决表格数据问题。正如我在 fast.ai 讲座上经常做的那样,我将讲座从头到尾看了一遍,然后在浏览笔记本时又看了一遍,必要时暂停一下。当我完成后,我想确保我可以用不同的数据集复制这个过程,我选择了乔·杨的 Kaggle 数据集“ A Waiter’s Tips ”。有了这个数据集,我们想建立一个模型来预测餐馆服务员的小费金额。

我从下载数据集并解压它开始,检查丢失的值(没有!),然后将 tips.csv 文件上传到工作目录中的“data”文件夹。

from fastai.tabular import *之后,我需要编辑笔记本以使路径指向正确的位置,因为笔记本默认路径指向讲座中使用的数据集。我的数据在‘data’文件夹中,所以我相应地设置了路径,并告诉它将数据存储在熊猫DataFrame中:

path = Path(‘data’)
df = pd.read_csv(path/’tips.csv’)

然后,我设置列名、因变量和预处理函数。因为我想根据其他因素来预测小费金额,所以我将tip设置为因变量,并且因为可以从简短的可能性列表中选择一周的sexsmokerday,所以我将这些设置为“分类”变量。total_billsize只是数字,所以它们是“连续”变量。我必须思考一分钟关于一天的time,虽然:“时间”感觉像是一个连续的概念,但看着数据,我看到“时间”被定义为“午餐”或“晚餐”那就绝对的。

笔记本附带了预处理函数FillMissingCategorifyNormalize,我暂时保留它们。

dep_var = 'tip'
cat_names = ['sex', 'smoker', 'day', 'time']
cont_names = ['total_bill', 'size']
procs = [FillMissing, Categorify, Normalize]

(这位加州女孩惊讶地看到“吸烟者”被列为餐馆顾客的一个可能属性)

接下来,我需要为我的测试集选择一个大小。我们通常为测试集留出 20%的数据,因此由于我的数据集有 244 个元素,我将测试集设置为使用从 196 到 244 的索引范围。

test = TabularList.from_df(df.iloc[196:244].copy(), path=path, cat_names=cat_names, cont_names=cont_names)

然后是时候使用 fastai 库的 Datablock API 来创建我的databunch:

data = (TabularList.from_df(df, path=path, cat_names=cat_names,    cont_names=cont_names, procs=procs)
 .split_by_idx(list(range(196,244)))
 .label_from_df(cols=dep_var)
 .add_test(test)
 .databunch())

我检查出一批数据:

data.show_batch(rows=10)

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

total_billsize经常有负值?我不认为餐馆付钱给任何顾客在那里吃饭,所以这一定是调用Normalize预处理的结果。我查看了文档,没有发现Normalize实际上做了什么,所以我返回到详细的课堂笔记,发现了这个:

"Normalize:提前做一个归一化,就是取连续变量,减去它们的均值,除以它们的标准差。"好吧,那么这就和统计学中的 z 分数一样,所以低于平均值的值为负是有道理的。

我声明我的学习器,告诉 API 它将是一个表格学习器(例如,与卷积神经网络学习器相反),并保留讲座中使用的参数:

learn = tabular_learner(data, layers=[200,100], metrics=accuracy)

然后我运行learn.fit,得到一个错误:

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

看起来accuracy函数中的“参数#2”是targs,但是对我来说不清楚我需要如何修复它。我用谷歌搜索了这个错误,发现了一个关于它的帖子。所以没错,targs是“参数#2”,我需要自己做accuracy函数。当我创建一个学习者时,调用了accuracy函数,所以我在其上创建了一个新的单元格,并定义了一个新的精度函数,称为accuracy_long,它与原来的accuracy函数相同,除了第四行的.long()之外:

def accuracy_1ong(input:Tensor, targs:Tensor)->Rank0Tensor:
    n = targs.shape[0]
    input = input.argmax(dim=-1).view(n,-1)
    targs = targs.view(n,-1).long()
    return (input==targs).float().mean()

…并按顺序运行两个单元。如果我们没有得到另一个错误,那就没什么意思了,对吗?

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

我就像“我也定义了它!看到了吗,就在上面?”

几个小时的谷歌搜索和思考,我甚至不能定义一个函数,以后肯定会放弃编码 仔细看看我在上面输入的内容。accuracy_long中的“l”是一个“1”。酷,酷。

我冷冷地盯着电脑看了很久,然后继续重新创建我的学习者并运行learn.fit(1, 1e-2)。看看我的准确率!这与我希望自己的准确率有很大关系,因为它们是完全相反的。🙄

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

由于这个数据集是预先清理过的,上面有一颗樱桃,并且被设计用来准确预测我试图用它来预测的东西,看起来我的准确率应该很高,而不是非常糟糕。所以我在想,是不是不小心把某个地方的一些逻辑颠倒了,把代码梳理了一遍。不过,我什么也没找到。

嗯。我觉得不可能是这个,但是我会尽量不把数据归一化?不,没有改善。

与第 2 课笔记本不同,第 4 课笔记本并不通过拟合几个时期的一个周期来开始学习,也不运行学习率查找器或混淆矩阵。我自己把这些放进去。

我创建并运行五个新单元:learn.fit_one_cycle(4)learn.save(‘stage-1’)learn.unfreeze()learn.lr_find()learn.recorder.plot()。这是学习率图表:

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

从图表来看,改变学习率似乎对我没有帮助。

我已经没有主意了,所以我求助于 fast.ai 论坛。一名成员建议尝试第 6 课中使用的 RMSE(均方根误差)技术,所以我现在暂停一下,在第 6 课结束后再试一次。

查看 GitHub 上的代码!

关于此主题的其他帖子:

第一课:fast . ai 入门

第二课:对孕检结果进行分类

第二课(续):深度学习能比鸽子表现更好吗?

第三课:一万种行不通的方法

第五课:但是泡菜去哪里了?

第六课:每个人都想成为一只猫

我是加州大学东湾分校的数学讲师,也是一名有抱负的数据科学家。在 LinkedIn 上和我联系,或者在 Twitter 上和我打招呼。

Python 中的数据清理:Airbnb 数据清理示例

原文:https://towardsdatascience.com/predicting-airbnb-prices-with-deep-learning-part-1-how-to-clean-up-airbnb-data-a5d58e299f6c?source=collection_archive---------14-----------------------

Python 中如何处理杂乱的位置和文本数据

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

Source: airbnbeazy.com

项目背景

Airbnb 让我着迷。我之前在一家 Airbnb 物业管理公司工作了一年半,担任负责定价、收入和分析的团队主管。我发现特别有趣的一件事是如何计算出网站上的一个列表的价格。尽管“这是曼彻斯特的一套两居室”会让你走得相当远,但实际上有很多因素可以影响房源的价格。

作为利用深度学习预测 Airbnb 价格的更大项目的一部分,我发现自己被抛回了房地产数据的黑暗世界。地理空间数据可能非常复杂和混乱,用户输入的地理空间数据更是如此。这篇文章将解释我是如何为我的项目寻找和准备数据的,包括一些关于处理英国地理数据(它出奇的复杂)和从长文本字符串中提取相关信息的想法。

数据集

这个项目使用的数据集来自Insideairbnb.com,这是一个反 Airbnb 的游说团体,从全球多个城市搜集 Airbnb 房源、评论和日历数据。该数据集是在 2019 年 4 月 9 日抓取的,包含了当天该网站上所有伦敦 Airbnb 房源的信息(约 80,000)。

清理和准备数据

关于数据清理的全部令人兴奋的细节(披露:兴奋程度可能有所不同),请随时查看我的 GitHub repo 。为了简洁起见,我将讨论可能感兴趣的数据预处理的三个特定领域。

未包含的功能(但我希望包含)

原始数据集包含 106 个要素,包括许多不同描述字段的文本列,您可以在 Airbnb 列表中填写这些字段。由于时间限制,我没有在这个模型中做任何自然语言处理(NLP ),所以所有这些功能都被删除了。然而,该模型未来发展的一个有趣途径是用 NLP 来增强它——可能用于情感分析,或寻找关键词,或某种奇特的 Word2Vec 类型的情况,寻找相似的列表描述,并使用它来帮助根据相似的列表猜测价格。

未来工作的另一个潜在方向可能包括审查。Insideairbnb.com 还抓取评论,这些评论可以与带有列表 id 的列表匹配。虽然大多数客人倾向于给大多数列表高评级,但更多细微的评级可能来自评论本身。

处理伦敦的地理信息(TLDR:伦敦的地图没有考虑到数据科学家)

英国的邮政编码复杂而混乱。它们可以有不同的长度,由字母和数字以不同的顺序组成。邮政编码的前半部分称为输出码或邮政编码区,指的是如下所示的区域:

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

London postcode districts. Source: https://en.wikipedia.org/wiki/London_postal_district

让事情变得更复杂的是,伦敦的主要地理分区是 32 个区加上伦敦金融城(由于 12 世纪英国历史的一些怪癖,严格来说是一个公司而不是一个区),这与邮政编码区不一致(因为这太容易了,对吗?):

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

London postcode districts (red), layered over London boroughs (black lines). Source: https://en.wikipedia.org/wiki/London_postal_district

也没有什么简单的方法可以在更小的粒度上对伦敦地区进行分类。事实上,对于什么是“内伦敦”,人们甚至还没有达成一致:

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

What even is London? Source: https://en.wikipedia.org/wiki/Inner_London

更糟糕的是,Airbnb 允许主机在自由文本输入框中输入邮政编码,排除了邮政编码部分的任何简单分离,并允许主机写各种无意义的内容(我最喜欢的只是“不”这个词)。

最后,在抛弃了一堆关于邮政编码的正则表达式实验之后,我决定使用行政区作为地理单位。位置对于 Airbnb 房源来说非常重要,所以我对不得不使用 borough 并不十分满意。它不是在一个特别精细的层次上,也不总是能很好地表达一处房产是在伦敦市中心还是在偏远地区——这对价格有很大的影响。例如,著名的夏德摩天大楼在南华克,但杜尔威治也是如此,地铁甚至没有到达那里(免责声明:杜尔威治其实很可爱,但可能不太为伦敦的游客所知)。

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

Both in Southwark, but possibly with different Airbnb prices? Left: the Shard (source: https://www.visitbritainshop.com/world/the-view-from-the-shard/). Right: Dulwich high street (source: https://de.wikipedia.org/wiki/Dulwich_(London)).

为了获得更精细的结果,我也尝试使用纬度和经度而不是行政区——但正如未来的博客文章所显示的,这并不完全成功。

便利设施(如此多的便利设施)

在 Insiderairbnb.com 的数据集中,设施被存储为一大块文本,下面是一个例子:

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

为了弄清楚各种选项是什么以及哪些列表包含这些选项,我首先制作了一个包含所有便利设施值的巨大字符串,稍微整理了一下,用逗号分隔出各个便利设施,并创建了一组结果列表(幸运的是,数据集足够小,允许这样做,但我需要一种更有效的方法来处理更大的数据集):

这里列出了所有可能拥有的便利设施:

 '24-hour check-in',
 'Accessible-height bed',
 'Accessible-height toilet',
 'Air conditioning',
 'Air purifier',
 'Alfresco bathtub',
 'Amazon Echo',
 'Apple TV',
 'BBQ grill',
 'Baby bath',
 'Baby monitor',
 'Babysitter recommendations',
 'Balcony',
 'Bath towel',
 'Bathroom essentials',
 'Bathtub',
 'Bathtub with bath chair',
 'Beach essentials',
 'Beach view',
 'Beachfront',
 'Bed linens',
 'Bedroom comforts',
 'Bidet',
 'Body soap',
 'Breakfast',
 'Breakfast bar',
 'Breakfast table',
 'Building staff',
 'Buzzer/wireless intercom',
 'Cable TV',
 'Carbon monoxide detector',
 'Cat(s)',
 'Ceiling fan',
 'Ceiling hoist',
 'Central air conditioning',
 'Changing table',
 "Chef's kitchen",
 'Children’s books and toys',
 'Children’s dinnerware',
 'Cleaning before checkout',
 'Coffee maker',
 'Convection oven',
 'Cooking basics',
 'Crib',
 'DVD player',
 'Day bed',
 'Dining area',
 'Disabled parking spot',
 'Dishes and silverware',
 'Dishwasher',
 'Dog(s)',
 'Doorman',
 'Double oven',
 'Dryer',
 'EV charger',
 'Electric profiling bed',
 'Elevator',
 'En suite bathroom',
 'Espresso machine',
 'Essentials',
 'Ethernet connection',
 'Exercise equipment',
 'Extra pillows and blankets',
 'Family/kid friendly',
 'Fax machine',
 'Fire extinguisher',
 'Fire pit',
 'Fireplace guards',
 'Firm mattress',
 'First aid kit',
 'Fixed grab bars for shower',
 'Fixed grab bars for toilet',
 'Flat path to front door',
 'Formal dining area',
 'Free parking on premises',
 'Free street parking',
 'Full kitchen',
 'Game console',
 'Garden or backyard',
 'Gas oven',
 'Ground floor access',
 'Gym',
 'HBO GO',
 'Hair dryer',
 'Hammock',
 'Handheld shower head',
 'Hangers',
 'Heat lamps',
 'Heated floors',
 'Heated towel rack',
 'Heating',
 'High chair',
 'High-resolution computer monitor',
 'Host greets you',
 'Hot tub',
 'Hot water',
 'Hot water kettle',
 'Indoor fireplace',
 'Internet',
 'Iron',
 'Ironing Board',
 'Jetted tub',
 'Keypad',
 'Kitchen',
 'Kitchenette',
 'Lake access',
 'Laptop friendly workspace',
 'Lock on bedroom door',
 'Lockbox',
 'Long term stays allowed',
 'Luggage dropoff allowed',
 'Memory foam mattress',
 'Microwave',
 'Mini fridge',
 'Mobile hoist',
 'Mountain view',
 'Mudroom',
 'Murphy bed',
 'Netflix',
 'Office',
 'Other',
 'Other pet(s)',
 'Outdoor kitchen',
 'Outdoor parking',
 'Outdoor seating',
 'Outlet covers',
 'Oven',
 'Pack ’n Play/travel crib',
 'Paid parking off premises',
 'Paid parking on premises',
 'Patio or balcony',
 'Pets allowed',
 'Pets live on this property',
 'Pillow-top mattress',
 'Pocket wifi',
 'Pool',
 'Pool cover',
 'Pool with pool hoist',
 'Printer',
 'Private bathroom',
 'Private entrance',
 'Private gym',
 'Private hot tub',
 'Private living room',
 'Private pool',
 'Projector and screen',
 'Propane barbeque',
 'Rain shower',
 'Refrigerator',
 'Roll-in shower',
 'Room-darkening shades',
 'Safe',
 'Safety card',
 'Sauna',
 'Security system',
 'Self check-in',
 'Shampoo',
 'Shared gym',
 'Shared hot tub',
 'Shared pool',
 'Shower chair',
 'Single level home',
 'Ski-in/Ski-out',
 'Smart TV',
 'Smart lock',
 'Smoke detector',
 'Smoking allowed',
 'Soaking tub',
 'Sound system',
 'Stair gates',
 'Stand alone steam shower',
 'Standing valet',
 'Steam oven',
 'Step-free access',
 'Stove',
 'Suitable for events',
 'Sun loungers',
 'TV',
 'Table corner guards',
 'Tennis court',
 'Terrace',
 'Toilet paper',
 'Touchless faucets',
 'Walk-in shower',
 'Warming drawer',
 'Washer',
 'Washer / Dryer',
 'Waterfront',
 'Well-lit path to entrance',
 'Wheelchair accessible',
 'Wide clearance to bed',
 'Wide clearance to shower',
 'Wide doorway',
 'Wide entryway',
 'Wide hallway clearance',
 'Wifi',
 'Window guards',
 'Wine cooler',
 'toilet',

在上面的列表中,有些设施比其他设施更重要(例如,阳台比传真机更容易涨价),有些设施可能相当不常见(例如,“电动仿形床”)。基于之前的行业经验,以及对顾客认为哪些设施更重要的进一步研究,我们选择了一些更重要的设施。然后根据数据的稀疏程度从最终模型中选择这些数据。例如,如果事实证明几乎所有的房产都有/没有特定的舒适设施,那么这个特性在区分房源或解释价格差异时就没什么用了。

关于这一点的复杂代码可以在 GitHub 上找到,但这是最后一部分,我删除了超过 90%的列表中有或没有特定便利设施的列:

这些是我最终保留下来的便利设施:

  • 阳台
  • 被单和枕套
  • 早餐
  • 电视
  • 咖啡机
  • 基本烹饪设备
  • 白色家电(特别是洗衣机、烘干机和/或洗碗机)
  • 儿童友好型
  • 停车
  • 户外空间
  • 受到主人的欢迎
  • 互联网
  • 允许长期停留
  • 允许携带宠物
  • 私人入口
  • 安全或安保系统
  • 自助入住

摘要

在这些(和许多其他)清理和预处理步骤之后,Airbnb 处于合适的形式,可以开始探索和建模,你可以在我的下一篇关于数据探索的文章和我写的另一篇关于建立预测模型的文章中了解更多信息。

如果你觉得这篇文章有趣或有帮助,请通过鼓掌和/或评论的方式让我知道,你可以关注我,以便在未来的文章中得到通知。感谢阅读!

探索伦敦 Airbnb 价格:哪些因素影响价格?

原文:https://towardsdatascience.com/predicting-airbnb-prices-with-deep-learning-part-2-how-to-improve-your-nightly-price-50ea8bc2bd29?source=collection_archive---------11-----------------------

分析 Airbnb 数据有助于提高你的房源收入

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

Source: plumguide.com

项目目标和背景

Airbnb 是一个房屋共享平台,允许房主和租户(房东)将他们的房产(房源)放在网上,这样客人就可以付费入住。房东为他们的房源设定自己的价格,尽管 Airbnb 和其他网站提供一些一般性的指导,但目前没有免费和准确的服务来帮助房东使用广泛的数据点为他们的房产定价。

在 Airbnb 上获得正确的定价非常重要,尤其是在伦敦这样竞争激烈的大城市。我最近进行了一个项目,利用机器学习和深度学习来预测伦敦 Airbnb 房产的价格。我已经在之前的一篇文章中探索了 Airbnb 数据的准备和清理,在未来的一篇文章中,我将和 T2 一起探索建模。但这篇文章是关于探索列表数据,提取有趣和有用的见解,以帮助主机最大化他们的收入。

额外背景:我之前在一家 Airbnb 物业管理公司工作了一年半,担任负责定价、收入和分析的团队主管。因此,在这个项目过程中所做的决定是由这个行业领域的专业知识决定的。

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

数据集

这个项目使用的数据集来自 Insideairbnb.com,这是一个反 Airbnb 的游说团体,从全球多个城市搜集 Airbnb 房源、评论和日历数据。该数据集是在 2019 年 4 月 9 日抓取的,包含了当天该网站上所有伦敦 Airbnb 房源的信息(约 80,000)。伦敦行政区边界的 GeoJSON 文件也从同一网站下载。

这些数据相当混乱,而且有一些局限性。主要的一点是,它只包括广告价格(有时称为“标签”价格)。标价是向潜在客人宣传的每晚总价格,而不是之前客人每晚支付的实际平均金额。主机可以将广告价格设置为任意数量,并且对 Airbnb 不太有经验的主机通常将这些价格设置为非常低(例如 0)或非常高(例如 10,000)的数量。

尽管如此,这个数据集仍然可以用作概念验证。一个更准确的版本可以使用客人支付的实际平均每晚费用的数据来构建,例如从像 AirDNA 这样的网站收集和出售更高质量的 Airbnb 数据。

探索数据以获得洞察力

位置,位置,位置

问题:伦敦哪些地区的 Airbnb 房产最多,哪些最贵?

回答:威斯敏斯特(城市西部)的 Airbnb 房产最多,其次是 Tower Hamlets(城市东部)。伦敦内城区的房源明显比外城区多。

然而,价格模式略有不同。肯辛顿和切尔西(威斯敏斯特以西)是最昂贵的地区。这是一个众所周知的生活成本高的地区,有些地方的房价是世界上最高的。虽然内伦敦通常比外伦敦更贵,但也有一些更贵的房源沿着泰晤士河分散到城市的西部(那里有一些非常美丽的地区)。

伦敦市中心的房源很少(因为这里的住宅物业相对较少),但结果是价格非常昂贵。

我是怎么发现的?我在做这个项目的时候发现了一个有趣的叫做 GeoPandas 的库。它基本上是用于地理空间数据的 Pandas,允许您将区域边界添加为矢量(或多边形或 shapefiles ),作为数据帧中的新列。如果你想看的话,产生这个的代码在我的 GitHub repo 里。

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

评估竞争

问题:最常见的物业和房型有哪些?

回答:大约 70%的房产是公寓。其余的是房子或更不常见的财产类型(如“床和早餐”或“蒙古包”)。

大约 55%的房源是整栋房屋(也就是说,你自己租了整栋房子)。其余的大部分都是私人房间(也就是说,你租了一间卧室,可能还有一间浴室,但房子里还有其他人)。不到 1%是合住房间(即您与业主或其他客人合住一个房间)。

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

随着时间的变化

问题:房东在伦敦 Airbnb 上挂牌出售房产有多久了?

回答:目前 Airbnb 上最古老的伦敦房源是在 2008 年 8 月首次在网站上列出的。从 2011 年起,上市数量开始大幅增加。然而,自 2015 年以来,新主机(目前在该网站上市的主机)数量的增长一直在下降,当时英国政府出台了一项法律,规定每年出租短期住宅超过 90 晚为非法。

高度的季节性是显而易见的,夏季是明显的高峰,人们在网上出售房产,以利用暑假期间游客数量的增加。

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

下面两张图片显示了加入网站的(当前在线)主机数量的分解时间序列,以及获得首次审核的(当前在线)列表数量。这是使用 statsmodels 库中的seasonal_decompose 函数完成的。它将时间序列分解为总体趋势、季节性(这在旅游业中很重要)和剩余的无法解释的残差。后者可能是由多种因素造成的。例如,2015 年加入 Airbnb 的主机数量达到高峰,这可能是对政府立法的回应,因为现有主机可能已经创建了新帐户,以便重新列出他们的属性,并绕过 90 天的限制。

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

Decomposed time series

越多越热闹

问题:伦敦 Airbnb 房源的入住人数分布如何,这对价格有何影响?

回答:最常见的物业设置是两个人睡在一个卧室的一张床上,带一个卫生间。不足为奇的是,容纳更多人的酒店会获得更高的夜间房价,大约 10 人后收益递减。

正如我在这个项目的建模部分发现的那样,价格的最大预测因素是一处房产能容纳的人数。

所以,可能是时候买那个沙发床了。

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

宾客心 Airbnb

问题:评论的分布是什么样的?

回答:人们喜欢他们的航空站。对于每个审核类别(准确性、清洁度、入住、沟通、位置、价值和总体),大多数已审核的列表都获得了该类别的 10/10 评分(或总体 95-100/100)。所以,最好确定你属于这一类。8 分或 8 分以下的评分相对较少。客人似乎对沟通、入住和准确性最为肯定。

大约四分之一的名单还没有被审查。这些大多是尚未完成入住的酒店,其中许多可能是“不活跃”的酒店,即那些虽然列在网站上,但没有任何预订日期的酒店。

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

您的客人会喜欢的便利设施(以及您的酒店可能讨厌的设施)

问题:哪些便利设施是常见的,哪些会提高 Airbnb 房源的价格?

答:设施可以分为四大类:

不常见,但拥有它的房产具有更高的中值价格:

  • 阳台
  • 被单和枕套
  • 咖啡机
  • 基本烹饪设备
  • 电梯
  • 儿童友好型
  • 户外空间
  • 允许长期停留
  • 私人入口
  • 安全或安保系统
  • 自助入住

大部分房产都有,有了它的房产有更高的中位数价格:

  • 电视
  • 洗衣机、烘干机和/或洗碗机

大部分楼盘都有,有和没有的楼盘价格没有大的区别:

  • 互联网

不常见,拥有它的房产价格中位数较低:

  • 早餐(可能因为这些是住宿加早餐,因此是单人间而不是整个家庭)
  • 停车(大概是因为这些不太可能是中心物业)
  • 受到主持人的问候(出人意料!)
  • 允许携带宠物

由此得出的结论是,主办者可以做一些事情来尝试提高他们的列表价格。然而,并不总是存在简单的因果关系,例如,有停车位可能会提高你的价格,但有停车位的房源平均来说更便宜,因为它们不太可能位于伦敦市中心,而且位置是比停车位更重要的因素。

以下是一些重要提示:

  • 确保你拥有竞争对手也拥有的必需品,例如互联网、电视和白色家电(洗衣机、烘干机和/或洗碗机)。
  • 如果可以的话,增加一些额外的东西,让你的房产脱颖而出,获得更高的价格。例如,你可以买一台咖啡机,允许自助入住和长期入住,让你的酒店对儿童友好。
  • 不要养宠物,因为宠物会给你的酒店带来额外的损耗,这可能会损害酒店的财务表现(更不用说会吓跑那些可能喜欢无烟酒店的客人)。

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

不值得额外的努力

问题:当超级主持人值得吗?而且值得被验证吗?(经常出现的两个问题)

两个问题的答案都是:不尽然。

大约 15%的主机是超级主机。这需要满足四个标准:

  1. 每年至少接待 10 次住宿
  2. 快速回应客人,保持 90%或更高的回应率
  3. 至少有 80%的五星评价
  4. 不要取消已确认的预订

然而,这似乎并没有提高他们的 Airbnb 房源每晚的中值价格,因此它是否值得是有争议的(从纯粹的财务角度来看)。

大约 35%的主机经过验证,例如通过提供 ID 和验证您的电话号码和电子邮件地址。然而,有趣的是,尽管人们可能期望由验证过的主机所要求的额外信任会导致更高的夜间价格,但是在具有验证过的和未验证过的主机的列表的中间夜间价格之间没有可辨别的差异。

然而,除了经济原因之外,出于其他原因(比如善良的人),这些可能仍然是值得做的事情。

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

摘要

上面的探索性分析强调了一些有趣的趋势和模式,以及一些可以提高 Airbnb 房源价格的因素。在的另一篇文章中,我将详细介绍我如何使用这些数据建立一个模型来预测 Airbnb 的价格。我希望你至少发现了一些有用的(如果你是 Airbnb 的主人)和/或有趣的(如果你像我一样是个数据迷)!

如果你觉得这篇文章有趣或有帮助,请通过鼓掌和/或评论的方式让我知道,你可以关注我,以便在未来的文章中得到通知。感谢阅读!

用机器学习和深度学习预测 Airbnb 价格

原文:https://towardsdatascience.com/predicting-airbnb-prices-with-machine-learning-and-deep-learning-f46d44afb8a6?source=collection_archive---------11-----------------------

XGBoost 实验和调整神经网络

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

Source: plumguide.com

项目目标和背景

Airbnb 是一个房屋共享平台,允许房主和租户(房东)将他们的房产(房源)放在网上,这样客人就可以付费入住。主办方应该为他们的列表设定自己的价格。虽然 Airbnb 和其他网站提供了一些一般性的指导,但目前还没有免费和准确的服务来帮助房东利用广泛的数据点为他们的房产定价。

付费的第三方定价软件是可用的,但通常你需要输入你自己的预期平均每夜价格(“底价”),算法将根据一周中的某一天、季节性、日期的远近以及其他因素,围绕该底价改变每天的价格。

Airbnb 的定价很重要,尤其是在伦敦这样的大城市,那里竞争激烈,即使价格上的微小差异也会造成很大差异。这也是一件很难做到正确的事情——价格太高,没有人会预订。价格太低,你会错过很多潜在的收入。

这个项目旨在解决这个问题,通过使用机器学习和深度学习来预测伦敦房产的基础价格。我在之前的帖子中已经探索了 Airbnb 数据的准备和清理,并进行了一些探索性数据分析。这篇文章是关于创建模型来预测 Airbnb 价格的。

数据集

这个项目使用的数据集来自 Insideairbnb.com,这是一个反 Airbnb 的游说团体,从全球多个城市搜集 Airbnb 房源、评论和日历数据。该数据集是在 2019 年 4 月 9 日抓取的,包含了当天该网站上所有伦敦 Airbnb 房源的信息(约 80,000)。

这些数据相当混乱,而且有一些局限性。主要的一点是,它只包括广告价格(有时称为“标签”价格)。标价是向潜在客人宣传的每晚总价格,而不是之前客人每晚支付的实际平均金额。主人可以将广告价格设置为任意值。

尽管如此,这个数据集仍然可以用作概念验证。一个更准确的版本可以使用客人支付的实际平均每晚费用的数据来构建,例如从像 AirDNA 这样的网站收集和出售更高质量的 Airbnb 数据。

清理和删除共线列后,模型中的特征为:

  • 该物业容纳的人数
  • 浴室的数量
  • 物业类型(如公寓)和房间类型(如整个住宅)
  • 财产的位置(在自治市的层面上(在之前的帖子中进一步讨论),或者在纬度和经度的层面上的一个模型中——在下面进一步讨论)
  • 保证金、清洁费和额外人员费
  • 最短和最长住宿时间
  • 未来 90 天内可预订的天数
  • 评论总数
  • 审查每个类别的评级(准确性、清洁度、入住、沟通、位置、价值和总体)
  • 自第一次和最近一次审核以来的时间
  • 取消政策的类型
  • 酒店是否可即时预订
  • 是否有各种各样的便利设施(在之前的帖子中有更深入的讨论,但包括电视、咖啡机、阳台、互联网和停车场等项目,无论该物业是否适合儿童入住,是否允许自助入住或允许宠物入住,等等)
  • 主机响应时间和速率
  • 主机是否是超级主机(质量的标志,需要满足各种条件)或其身份是否经过验证(例如,通过验证政府 ID、电话号码和电子邮件地址)
  • 主持人总共负责多少个列表
  • 主持人在 Airbnb 上挂牌多少天了

构建机器学习模型

出于篇幅的考虑,我将在这里跳过数据准备阶段,但是如果你感兴趣,可以在我的 GitHub repo 中找到这个项目的所有代码。总之,在清理数据、检查多重共线性和移除共线特征后,除非另有说明,否则使用 sklearn 的StandardScaler()对数据进行标准化。使用pd.get_dummies()对分类特征进行一次性编码。以 0.2 的测试规模执行了训练测试分割。

虽然我热衷于实验深度学习模型进行价格预测,但我首先构建了一个香草(未调优)XGBoost 机器学习模型(具体来说就是xgb.XGBRegressor())。这是为了提供一个基线水平的准确性,也是为了衡量特征的重要性(众所周知,一旦你进入深度学习领域,这是很难的)。XGBoost 可能会使用机器学习模型提供最佳的可实现精度(除了超参数调整带来的可能的小精度增加),因为它具有卓越的性能和在 Kaggle 比赛中观察到的普遍出色性。

因为这是一项回归任务,所以选择的评估指标是均方误差(MSE)。我还对精确度感兴趣,所以我也查看了每个生产模型的 r 平方值。

下面是我用来拟合和评估模型的代码:

结果:

Training MSE: 0.1576
Validation MSE: 0.159

Training r2: 0.7321
Validation r2: 0.7274

对于一个未经调整的模型来说还不错。现在谈谈特性的重要性:

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

十大最重要的功能是:

  • 该房产可容纳多少人
  • 清洁费
  • 主机有多少其他列表(以及它们是否是多列表主机)
  • 未来 90 天中有多少天可以预订
  • 额外每人的费用
  • 评论的数量
  • 浴室的数量
  • 保证金
  • 如果房产在威斯敏斯特
  • 最短住宿时间

毫不奇怪,最重要的特征是酒店能容纳多少人,因为这是你首先用来搜索酒店的主要因素之一。与位置和评论相关的功能位列前十也不足为奇。

或许更令人惊讶的是第三个最重要的功能与主人在 Airbnb 上管理的其他房源数量有关,而不是房源本身。然而,这并不意味着管理更多物业的主机将导致房源获得更高的价格(尽管这确实是关系的方向)。首先,数据似乎被一些非常大的房地产管理公司扭曲了。其次,这种关系是与广告设定的价格,而不是实际达到的价格,这表明,如果有什么更有经验的主人往往会设定(而不一定达到)更高的价格。第三,我们不能必然地暗示因果关系——这可能是更有经验的多清单主机倾向于采取更昂贵的财产(这确实是一些情况,例如一个罚款停留)。

同样值得注意的是,其他三种费用类型——清洁费、保安费和额外人员费——都在十大费用清单中。很可能当主人为每晚住宿设定较高的价格时,他们也可能将其他价格设定得较高,反之亦然。

构建深度学习模型

接下来,我决定用神经网络(NN)进行实验,看看我是否能提高 XGBoost 模型的分数。我从一个具有密集连接层的相对较浅的三层 NN 开始,对隐藏层使用 relu 激活函数,对输出层使用线性激活函数(因为它正用于回归任务)。损失函数是均方误差(同样,因为这是用于回归)。

这是我的代码:

这是总结和想象:

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

为了在评估多种方法时节省时间,我构建了一个方便的函数来打印测试集和训练集的 MSE 和 r 平方结果,并为测试集和训练集生成每个时期的损失线图以及预测值与实际值的散点图:

结果如下:

Training MSE: 0.0331
Validation MSE: 0.2163

Training r2: 0.9438
Validation r2: 0.6292

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

与 XGBoost 模型相比,神经网络的性能更差。过度拟合似乎也是一个问题,从训练和测试 MSE 和 r 平方结果之间的差异,以及线图中训练和测试损失之间的差异,以及散点图中值更接近线的事实可以看出。

然后,我迭代了该模型的各种其他版本,以尝试消除过度拟合并提高准确性。尽管精确度有所不同,但其他版本都消除了过度拟合。我尝试的调整是:

  • 添加第四层和第五层——第四层提高了精确度,但第五层没有帮助。
  • 使用 L1 正则化——这被证明是对精确度的最大提升。
  • 在 30%和 50%的辍学率下使用辍学正规化——50%被证明是一个可怕的想法,并显著增加了 MSE。30%表现更好,但不如 L1 正则化。
  • 使用随机梯度下降(SGD)优化器而不是 Adam——这表现稍差。
  • 改变批量大小——这没有太大的区别。
  • 为更多的时期训练——这对一些模型有一点帮助,但大多数模型无论如何都相当快地最小化了损失函数。
  • 删除大部分评论评级列——一个类别中的高评论评级与其他类别高度相关,因此我尝试删除除总体评级之外的所有评论评级。然后,我使用这个新的截断数据集来训练之前性能最高的模型架构(使用 L1 正则化和 Adam 优化器)。其性能基本相同,但少了 18 列,因此在选择将哪个模型投入生产时,它将是首选模型,因为它需要的数据更少,计算成本也更低。
  • 使用纬度和经度而不是区——同样,这个调整后的数据集与我迄今为止提出的最佳模型架构一起使用。这个表现稍差。
  • MinMaxScaler()代替StandardScaler()。这也表现的略差。

最后,最好的神经网络是具有 L1 正则化和 Adam 优化器的四层模型,去掉了额外的审查列:

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

My best performing neural network architecture

结果:

Training MSE: 0.1708
Validation MSE: 0.1689

Training r2: 0.7096
Validation r2: 0.7105

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

I still haven’t gotten to the bottom of why the NN is unable to predict values for the log-transformed price lower than about 3.1, but I’m pretty sure it’s something to do with the use of regularization

然而,即使是这种模型架构的性能也不如 XGBoost 模型。总的来说,XGBoost 模型是首选模型,因为它的性能比最好的神经网络稍好,并且计算成本更低。通过超参数调整,它可能会得到进一步的改进。

结论

这是深度学习对于预测来说根本不必要的情况之一,机器学习模型表现得一样好。

然而,即使在表现最好的模型中,该模型也只能解释 73%的价格变化。剩下的 27%可能由数据中不存在的特征组成。这种无法解释的差异很大一部分可能是由于列表照片的变化造成的。Airbnb 上的房产照片在鼓励客人预订方面非常重要,因此预计也会对价格产生重大影响——更好的照片(主要是质量更好的房产和家具,但也包括质量更好的摄影)等于更高的价格。

未来工作的潜在方向

  • 找到将图像质量纳入模型的方法,例如通过使用卷积神经网络的输出来评估图像质量,作为定价模型的输入。
  • 使用质量更好/更准确的数据,包括每晚支付的实际平均价格。
  • 包括更广泛的地理区域,例如英国的其他地方或世界上的其他主要城市。
  • 用列表描述和/或评论的自然语言处理(NLP)来增强模型,例如用于情感分析或寻找关键词。
  • 除了预测基价之外,还可以创建一个序列模型,使用季节性和入住率数据来计算每日价格,这将允许创建实际定价软件。
  • 通过删除当时不为人知的功能,例如其他费用、可用性和评论,更具体地针对新房源定制模型,以帮助主办方设定新房产的价格。

我希望你觉得这篇文章有趣和/或有帮助。感谢阅读!

利用机器学习和位置数据预测 Airbnb 价格

原文:https://towardsdatascience.com/predicting-airbnb-prices-with-machine-learning-and-location-data-5c1e033d0a5a?source=collection_archive---------2-----------------------

使用苏格兰爱丁堡市数据的案例研究

关键词:Airbnb、爱丁堡、城市、数据科学、熊猫、geopandas、地理空间、foursquare、地图、matplotlib、建模、邻居、网络、numpy、foursquare API、规划、python、城市规划、数据可视化

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

Photo by Paul Fiedler on Unsplash

作为 IBM 数据科学专业证书 的一部分,我们可以尝试一下我们自己的数据科学顶点,在那里我们可以体验像数据科学家一样解决问题和回答问题的感觉。对于我的任务,**我决定做另一个项目,研究 Airbnb 价格与其决定因素之间的关系。是的,有几个很酷的,像劳拉·刘易斯这里。如果没有阅读和理解她的(和她的代码),我就不可能完成我的工作,所以恭喜你!然而,由于我对交通研究很感兴趣,我添加了一点地理空间分析,通过研究位置特征作为可能的预测因素。**这篇文章解释了一些项目背景、数据收集、清理和预处理、建模和快速总结。

  1. 项目背景及目标
  2. 数据
  3. 数据清理和探索
  4. 位置特征
  5. 建立模型
  6. 改进模型
  7. 结论和建议

对于完整笔记本全部代码,可以在我的 Github 上查看回购。

项目背景和目标

如果出于某种原因你还不知道,Airbnb 是一个短期房屋和公寓租赁的互联网市场。举例来说,它允许你在外出时出租(列出)你的房子一周,或者出租你的空卧室。Airbnb 房东面临的一个挑战是确定最佳的每夜租金价格。在许多地区,租房者(房东)都有很好的房源可供选择,他们可以根据价格、房间数量、房间类型等标准进行筛选。由于 Airbnb 是一个市场,主机可以收取的费用最终取决于市场价格。Airbnb 上的搜索体验是这样的:

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

Airbnb Edinburgh home page at https://www.airbnb.co.uk/s/Edinburgh–United-Kingdom/all?set_bev_on_new_domain=1571135536%2B1HjOBOK%2FivIgihM

虽然 Airbnb 为主机提供了一般的指导,但没有容易获得的方法来确定出租空间的最佳价格。有第三方软件可用,但价格昂贵(关于可用软件的示例,请点击此处)。

一种方法可以是找到一些与将要出租的地方相似的列表,平均列出的价格,并将我们的价格设置为计算出的平均价格。但是市场是动态的,所以我们希望经常更新价格,这种方法可能会变得繁琐。

另一个问题?我们可能会错过我们的列表相对于周围列表的竞争优势,比如它离杂货店、酒吧和其他额外服务有多近,或者甚至是我的照片相比有多棒。

因此,这个项目使用了几个列表功能来尝试和预测价格,并增加了一个基于空间的预测器:房产与某些场馆的距离。这使得该模型可以对诸如住在酒吧、酒吧或超市附近等事物进行隐性定价。

数据

Airbnb 不向公众发布任何数据,但 Airbnb 内部一个名为的独立小组 从 Airbnb 网站收集并汇编了许多城市房源的公开信息。为了这个项目,我使用了他们在 2019 年 7 月 21 日在苏格兰爱丁堡市收集的数据集。它包含了当天网站上所有爱丁堡 Airbnb 房源的信息(超过 14,000 个)。

数据有一定的局限性。最值得注意的一点是,它刮的是广告价格,而不是以前的客户支付的实际价格。更精确的数据可以在像 AirDNA 这样的网站上付费获得。

数据集中的每一行都是 Airbnb 网站中特定城市的可用租赁清单(观察)。这些列描述了每个列表的不同特征(特性)。

该项目将研究的一些更重要的功能如下:

  • 租赁可以容纳的客人数量
  • bedrooms:租金中包含的卧室数量
  • bathrooms:租金中包含的浴室数量
  • beds:租金中包含的床位数
  • price:每晚租金
  • minimum_nights:租赁期间客人可入住的最少天数
  • maximum_nights:租赁期间客人可入住的最大天数
  • number_of_reviews:之前客人留下的评论数量

为了对 Airbnb 租金价格和某些场馆附近的物业之间的空间关系进行建模,我使用了 Foursquare API 来访问该市的场馆,街道网络可通过 OpenStreepMap (OSM) 获得。

数据清理和探索

简而言之,原始数据集包含 14014 个 Airbnb 列表和 106 个功能,但我删除了一大堆功能。例如,其中一些是自由文本变量,如酒店的主机描述和所有书面评论。为了包含这些数据,我必须做一些自然语言处理,但不幸的是,我不能。所以这些功能都被删除了。此外,一些列只包含一个类别,所以它们也被删除了。大多数列表不提供体验功能,所以这也是不可能的。

一个完整的一步一步的这一节,我如何和为什么我这样做是在笔记本上的我的 github这份报告没有所有的代码。

还有一个有趣的探索性数据分析。“没有夏洛克”的发现之一是,进入市场的上市公司有明显的季节性。

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

Clear seasonality in the middle of the year

每年年中(夏季)左右都有一个主机加入的高峰,最低点是每年的年初和年末。8 月,在爱丁堡边缘艺术节期间,房间租金价格大幅上涨。这是一个非常受欢迎的活动,由于每年参加的人数众多,许多出租的房产将被占用。爱丁堡全年有许多其他活动,主要集中在 4 月和 12 月之间。这几个月有世界级的艺术家在表演。

在这一年的其余时间里,爱丁堡作为文化之都的地位是独一无二的,不仅仅是苏格兰,还有英国。对住宿和旅游有稳定的需求,因为爱丁堡是仅次于伦敦的商业之都。

就价格随时间的变化而言,爱丁堡 Airbnb 房源的每晚平均价格在过去 10 年中略有上升。但房地产价格的高端已经增加了很多,导致平均价格比中位数有更大的增长。2010 年的平均价格为 107.33 英镑,中位数为 115.0 英镑,而 2018 年(上一个完整数据年度)的平均价格为 104.55 英镑,中位数为 79.0 英镑。基本上,昂贵的住宿业主很快发现了使用 Airbnb 的好处(主要是更少的税收和更少的责任,但那是另一个故事了)。

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

Outliers have been increasing over time

位置特征

**现在是酷的东西(对我来说)。**寻找住宿时,靠近某些旅游区很重要。但是,知道你将有一个杂货店或超市在一个步行距离可以加分。很多租房者喜欢这样的事实,当你有了 Airbnb 而不是酒店房间时,你可以自己做饭(并节省一些)。

因此,靠近某些场所,如餐馆、咖啡馆和商店可以帮助我们预测价格。

Airbnb 的许多房源都集中在爱丁堡的老城区,这与游客的巨大吸引力相符,尤其是在一年一度的边缘节日期间。

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

Most Airbnb listings in Edinburgh are near the Old Town area

价格的分布也反映出最贵的房源位于老城区。

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

Price spatial distribution

为了获得特定场馆的信息,我使用爱丁堡街区的经纬度,通过 Foursquare 的 API 下载了每个街区的场馆列表。

纬度和经度来自 geojson 文件形式的公开的街区列表。我本来可以从原始 Airbnb 列表数据集中检索纬度和经度,但是我已经在使用这个文件,所以我决定只使用它。后来,我把它们按邻域合并。

首先,我必须加载地理数据:

map_df是一个地理数据框架。为了检索每个街区的场馆,我从地理系列中的点对象提取了纬度和经度或xy。以下代码将xy作为原始map_df中单独的 GeoDataFrame 列返回。

然后,我们创建 API 请求 url,发出 GET 请求,并提取我们附近的每个场馆的信息。下面这个非常有用的函数是在数据科学课程中提供给我们的。它遍历所有的街区来检索我们想要的数据:

现在,我们在每个邻域上运行上述函数,并创建一个名为edinburgh_venues的新数据帧。

一旦我们有了这个,我们就可以看看每个街区周围的不同场地。首先,有 182 个独特的场馆类别。不过,那里很乱。因此,我清理了检索到的数据,将这些行按邻域分组,并取每一类的平均值和出现频率。

这帮助我找到了每个街区最常见的 5 个场所:

并将其保存到熊猫数据帧中,以便查看并决定对哪些场馆感兴趣:

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

Five most common venues per neighbourhood (first five rows)

仔细查看数据,很明显最常见的场所是酒店酒吧杂货店/超市咖啡馆/咖啡店,其次是酒吧汽车站印度餐馆。餐馆被分成子类别。所以我把它们归为一个大的类别:餐馆。我认为附近有酒店不太可能影响价格,因为 Airbnb 的房源应该属于不同的短期租赁类别。与酒店相比,它们提供了完全不同的好处。所以我没有考虑那一类场馆。

有了这些数据,我开始测量我们一直在谈论的离场馆的距离。我们通过分析可达性来做到这一点。

可达性是到达目的地的容易程度。是运输中一个非常重要的概念,有大量的文献可用。无障碍环境塑造了人们获得机会和发挥其作为人的全部潜力的能力。这就是为什么可达性指标被大量用作空间和交通不平等的替代指标。

为了简单起见,对于这个项目,我通过测量访问场地或从 Foursquare 下载的兴趣点(POIs) 来测量可访问性。酒吧、餐馆、咖啡馆和超市/杂货店是我们的兴趣点(441 个兴趣点的数据集)。

为了帮助进行可访问性分析, Pandana 是 Python 库的首选。Pandana 是一个方便的图形库,允许将 Pandas 数据帧传递到一个网络图中,该网络图将图形级分析映射到底层 C 操作。所有这些都是说,它比传统的基于 Python 的图形要快得多。

为了开始分析,我们必须使用爱丁堡的位置数据从 OSM API 获取街道网络数据(边界框)。

运行代码后,从 OSM 下载一个有 51,553 个节点的网络。当我们将其保存到 HDF5 时,您会注意到某些节点被排除在外。这在优化网络以使其仅包含经验证的节点时非常有用。我使用了low_connectivity_nodes()方法来识别那些可能没有连接到更大网络的节点,并排除它们。

最后,我们计算 poi 的可访问性:

生成的数据框如下所示:

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

Network distance from the node to each of the 10 POIs

还有什么更好的方式来理解所有这些数字是关于什么的,而不是一些漂亮的可视化(没有它们,什么是地理空间分析?).首先,让我们看看到任何类型的最近 POI 的距离,因为我对场馆之间的可访问性差异不感兴趣:

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

我们可以看到,在一些区域,人们必须步行 500 米以上才能到达最近的便利设施,而爱丁堡的老城区平均步行距离不到 100 米。

该地图以米为单位显示了从每个网络节点到最近的餐馆、酒吧、咖啡馆、酒吧和杂货店的步行距离。但是,一个更好的无障碍指标可能是可以使用大量的便利设施。所以我没有画最近的,而是画了第五近的便利设施的可达性:

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

这一次更加引人注目的是,爱丁堡的老城区和市中心区域具有更好的可达性。

对于这个项目,我假设进入餐馆、商店、咖啡馆、酒吧和酒馆对 Airbnb 用户来说很重要。因此,我对所有兴趣点进行了同等加权,并使用到第五个最近场馆的距离作为可达性的复合度量。与只画出到最近地点的距离相比,这能更清楚地显示出哪些社区最适合步行。

以下代码将距离设置为第五个最近的便利设施,作为可达性的复合度量:

这就是了。已创建位置要素,然后将其添加到数据集进行建模。

构建模型

这里发生了很多数据准备,当然是在回购上。我不会涉及任何细节,但总的来说,我清理了数据,检查了多重共线性并处理了有问题的要素,对数据进行了对数转换,这有助于使price更正态分布,热编码分类要素,并使用StandardScaler()将其标准化。最后,我将数据分成训练测试。

使用了两种模型:

  • 一个空间特征价格模型 (OLS 回归),带有来自 Scikit-Learn 库的LinearRegression
  • 梯度增强方法,带有 XGBoost 库中的XGBRegressor

使用的评估指标是均方误差(损失)和 r 平方(准确性)。

我选择运行 Hedonic 模型回归,因为它们常用于房地产评估和房地产经济学。理想情况下,应进行拉格朗日乘数检验以验证因变量中是否存在空间滞后,因此空间滞后模型是估计空间 HPM 的首选模型(使用 Pysal 进行空间回归,参见本文)。然而,为了这个项目的目的,我只使用一个传统的 OLS 模型进行特征价格估计,它包括空间和位置特征,但没有考虑空间依赖性的空间滞后。

因此,第一个解释变量是列表特征(accommodatesbathrooms等),第二组基于空间和位置特征的解释变量是Score,这是我们通过 Pandana 计算的到第五个最近场馆的网络距离;和Neighbourhood归属,如果列表属于指定的邻域,则为1,否则为0

这是我为空间特征价格模型编写的代码:

和结果:

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

因此,这些特征解释了目标变量中大约 51%的方差。解释mean_squared_error值比 r 平方值更直观。作为方差的平方根, RMSE 可以解释为未解释方差的标准偏差,并且具有与响应变量相同单位的有用属性。但是在这种情况下,响应变量是经过对数转换的,所以解释不是以原始单位进行的,而更像是百分比偏差。RMSE 值越低表示拟合度越好。RMSE 可以很好地衡量该模型预测市场反应的准确程度。我们可以用散点图直观地看到这种关系:

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

Actual vs Predicted Price for Spatial Hedonic Regression Model

我还尝试使用山脊正则化来减少不太重要的特征的影响。岭正则化是缩小不太重要的特征的回归系数的过程。它采用参数α,该参数控制正则化的强度。

我通过循环几个不同的 alpha 值进行了实验,看看这如何改变结果。

这是我得到的:

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

是的……没发生什么。随着 alpha 值的增加,RMSE 值和 r 值几乎相同,这意味着使用岭回归模型时,模型预测并没有显著提高。

继续讨论梯度增强决策树模型。

XGBoost(eXtremeGradientBoosting)是一个针对速度和性能而设计的梯度提升决策树的实现。是一种非常流行的算法,最近一直主导着结构化数据的应用机器学习。

与 Hedonic 回归相比,该模型预计将提供最佳的可实现准确性和特征重要性的度量。确实如此。

以下是 XGBoost 模型的代码:

结果是:

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

使用此模型,这些特征解释了目标变量中大约 65%的方差,并且具有比 SHP 回归模型更小的 RMSE。

除了其卓越的性能,使用决策树方法(如梯度提升)的好处是,它们可以从训练好的预测模型中自动提供特征重要性的估计值。有关如何在提升决策树中计算特征重要性的更多详细信息,请查看 StackOverflow 中的答案。

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

XGBoost Model Feature importance

如您所见,在这个 XGBoost 回归模型中,许多特性的特性重要性为 0。

十大最重要的功能是:

  1. 是否出租整个公寓room_type_Entire home/apt
  2. 酒店可容纳多少人(accommodates)
  3. 财产的类型(property_type_Other)
  4. 浴室的数量(bathrooms
  5. 未来 90 天内有多少天可以预订(availability_90)
  6. 评论的数量(number_of_reviews)
  7. 取消政策是温和的(cancellation_policy_moderate)
  8. 主持人还有多少其他列表(host_listings_count)
  9. 最少住宿天数(minimum_nights)
  10. 最大住宿天数(maximum_nights)

预测价格的最重要的特征是租赁的是整个公寓。好像差了很多。有道理。如果报价是整个公寓/房子,要价会更高。第二是物业容纳多少人,也有道理。当你寻找一个地方时,这是你首先要找的东西。

有趣的是,定位功能并不在前十名。与前 3 个特征相比,属于某个街区和Score(可达性指标)的重要性相对较低。不过,Review_Scores_Location_9/10差点进了前十。相当有趣。

价格似乎受到先前租户对该位置的积极评价的影响,而不是该物业相对于主要兴趣点的实际可达性。

这也可能是因为爱丁堡是一个适合步行的小城市,交通便利。因此,在到达主要旅游景点和设施时,位置可能不是一个主要问题。

改进模型

XGBoost 模型生成的 feature importances 图显示,许多评论列的重要性相对较低。所以,我放弃了。然后我再次运行模型,只是没有那些列。

结果如下:

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

和岭回归的尝试一样,这里也没有发生什么。没有额外的回顾列,空间享乐回归和 XGBoost 的表现几乎完全相同。

结论和建议

如果我们要选择一个模型来预测价格,那么它应该是不带评论列的 XGBoost。它比两种空间享乐回归模型都表现得更好,与第一个 XGBoost 模型一样好,但计算成本更低。尽管如此,它只能预测 66%的价格变化。也就是说我们还有剩余的 34.44%无法解释。

一堆没有包括在内的不同变量可以解释剩余的方差。

例如,考虑到客户对列表的评论在确定价格中的重要性,更好地理解评论很可能会改进预测。人们可以使用情绪分析。可以为每个列表属性的每个评论分配介于-1(非常负面的情绪)和 1(非常正面的情绪)之间的分数。然后,对与该列表相关的所有评论进行平均,最终得分可以作为一个新特征包含在模型中(见此处的示例)。

我们也可以将图像质量作为一个特征。通过使用对 Airbnb 面板数据集进行深度学习和监督学习分析的差异差异,研究人员发现,拥有经过验证的照片(由 Airbnb 的摄影师拍摄)的单位平均每年会产生额外的收入(见此处)。

我仍然认为可访问性起着重要的作用,尽管这一次不是很清楚。我使用 OSM 步行网络进行可达性分析,但是使用多模态图网络会是理想的选择。这样,我就可以从整个交通网络的角度来衡量可达性,而不仅仅是从步行性的角度。也许特性的重要性在列表中会更高。

仅此而已。这是一个非常有趣的项目。

如果你设法看完了整本书,并且正在阅读这篇文章,感谢你的时间!非常感谢任何反馈。

预测飞机滑行时间

原文:https://towardsdatascience.com/predicting-aircraft-taxi-time-6c4eaa402d77?source=collection_archive---------24-----------------------

线性回归方法

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

Photo by Josue Isai Ramos Figueroa on Unsplash

如果你以前从一个繁忙的机场坐过飞机,很有可能你经历了一次滑行时间延迟。每个人都在飞机上,飞机甚至已经离开了登机口,然而起飞还需要相当长的时间。

背景

定义滑行时间的一个简单方法是飞机在机场表面运动的时间。对于这个项目的范围,我只关注出发滑行时间(或滑行时间),这是飞机离开航站楼登机口和实际从机场起飞之间的时间。典型地,整个过程由 ATC(空中交通管制)监督,飞行员被给予离开登机口、起飞等许可。

太好了!我们定义了什么是出租车时间,但为什么它真的很重要?

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

Fuel Consumption Statistics from International Civil Aviation Organization (ICAO)

快速浏览一下上面国际民航组织提供的一些信息就会发现,一架典型的波音 777 飞机仅滑行一项就要消耗 23.3 千克/分钟(或 6.15 加仑/分钟)的燃油。滑行时间平均为 15 分钟,仅仅滑行到起飞点就要消耗大约 92 加仑的燃料!

虽然不同类型的飞机会有不同的消耗率,但能够优化机场地面运动和减少滑行时间将使航空公司节省大量燃料成本,并减少二氧化碳排放,从而改善客户体验。

我的方法

因为许多航班数据是基于航空公司的内部或主观数据,所以我选择比较排名前四的航空公司在滑行时间速度方面的表现,并重点关注天气模式如何影响滑行时间。所以我的目标可以浓缩成以下几个问题:

  1. 不同航空公司的出租车时间不同吗?
  2. 机场的天气状况对滑行时间有显著影响吗?如果有,影响有多大?
  3. 是否有可能预测滑行时间以改进跑道排序?

数据

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

对于这个项目的范围,我选择在 2018 年的 4 个不同月份(1 月、4 月、6 月、10 月)只关注 10 个机场,以尝试解释季节性。我还将我的航空公司限制在前四名(西南航空、美国航空、达美航空、联合航空),因为它们在国内航班市场中占了很大一部分。我使用 Selenium 自动化了从运输局的航空页面下载航班统计数据的过程,并利用 BeautifulSoup 收集相应日期和机场的天气数据。

探索性数据分析

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

快速浏览上面的柱状图可以发现,像 JFK 机场和旧金山机场这样极其繁忙的机场往往有更长的滑行时间。这是意料之中的,因为通过这些机场的航空交通量比 STL 等机场高得多,但这些初始假设通过数据验证仍然很重要。

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

一个有趣的观察是,西南方往往有最快的滑行时间。这是相当令人惊讶的,因为这是一个明显的区别,从其他航空公司,尽管我的研究,这是很难确定的原因。

我只考虑了西南航空公司不飞往像 JFK 这样的机场,但它仍然是最快的航空公司。

浏览一些航空论坛发现,即使是空中交通管制员也知道西南航空公司的出租车比其他航空公司快,但不知道为什么。一个可能的原因是,西南航空公司只使用波音 737,与其他航空公司使用的一些较大的飞机相比,波音 737 较小,因此更容易驾驶。这可能是在以后的项目中值得研究的东西。

气压

一开始令我困惑的一个显著关系是平均气压和滑行时间之间的正相关关系。

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

尽管我进行了研究,但我无法为压力和出租车时间之间的这种正相关找到合理的解释。然而,数据中的气压计数图显示,不同的机场往往有不同的平均气压读数,如下图所示。因此,压力和滑行时间之间的这种相关性被证明是飞机从哪个机场起飞的代理。

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

造型

对于实际的建模,我选择坚持使用线性回归作为基线,同时在必要时使用 lasso 和 ridge 回归来提高模型性能。我使用平均绝对误差作为我的评估标准,因为我对我的预测与实际滑行时间的差距更感兴趣。结果如下:

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

如你所见,平均时间大约是 3.5 分钟。这意味着平均而言,模型的预测将与实际滑行时间相差约 3.5 分钟。此外,正则化没有产生巨大的影响,多项式特征的线性回归具有最佳性能,可能是因为这将允许航空公司和机场之间的交互。例如,一个多项式要素将是 JFK 德尔塔(机场航空公司),这可能是一个更好的预测德尔塔在 JFK 的出租车时间的要素,如果要素只是德尔塔。然而,即使这样也只减少了大约 10 秒的 MAE。

不过需要注意的一点是,这个模型打破了线性回归的一个假设——同方差。这可以从下面的残差图中看出:

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

如你所见,在上面的残差图中存在异方差。与剩余误差达到 15 分钟的较短时间相比,该模型在预测较长的滑行时间方面表现稍好。当我们考虑出租车时间的问题时,这实际上是有意义的。在短暂的滑行时间内,一个简单的差异,如飞行员驾驶的速度,可能会导致数据的差异,而我们的模型不具备处理这种情况的能力。而在更长的滑行时间里,可能有其他因素造成。比如这个数据中的一个特征就是*NAS 中的延误(分钟)*基本上是全国航空系统的延误。这种类型的延误会导致较长的滑行时间,因此,这一特征可能是模型预测较长滑行时间优于较短滑行时间的重要原因。

结论

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

从这个回归模型,我们可以得出结论,繁忙的机场和上午的航班往往有较长的滑行时间。虽然这种趋势是合理的,也是可以猜测的,但用数据来验证它是很重要的。此外,该模型能够更复杂地衡量每个机场,以确定飞机的滑行时间。

虽然西南航空公司在滑行时间指标上占主导地位的原因仍不清楚,但确定其他可能影响停机坪延误的因素是值得研究的。

感谢您的阅读!

项目资源库可以在这里找到

参考

[## 详细的统计数据

政府交通财务统计

www.transtats.bts.gov](https://www.transtats.bts.gov/ONTIME/Departures.aspx) [## 加州旧金山天气历史|地下天气

编辑描述

www.wunderground.com](https://www.wunderground.com/history/monthly/us/ca/san-francisco/KSFO/date/2019-1)

使用机器学习预测破产

原文:https://towardsdatascience.com/predicting-bankruptcy-f4611afe8d2c?source=collection_archive---------18-----------------------

维克拉姆·迪瓦塔&迪瓦希什·迪曼

2008 年的经济危机引发了一场关于市场可持续性以及可用于预测市场可持续性的工具的讨论。为了避免未来发生这样的灾难性事件,对更好的预测模型的需求变得显而易见。公司和企业的破产在多个方面影响金融市场,因此通过监控多个变量来预测公司破产的需求变得更加重要。更好地理解破产和预测破产的能力将会影响全球贷款机构的盈利能力

作为一项分类工作,数据分析师有太多的选择。著名统计学家乔治·博克斯(George Box)曾经说过,“所有的模型都是错的,但有些是有用的”(维基百科,自由百科,2019)。考虑到这一点,我们承担了构建不同的监督机器学习算法的任务,并对每个模型进行了比较分析,以确定哪些模型更适合预测经济破产

我们遵循的分析流程概述如下:

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

关于数据集

本次练习使用的数据集是波兰公司在 5 年研究期内的破产状况,可从这里下载:【https://goo.gl/e2Px2y。它包含 43405 个观察值,分布在 5 个子集(每年一个),每个观察值有 64 个财务比率。这里有一个 URL ,其中提供了属性的名称(感谢 Harsha Danda 找到了这个链接)。一些公司在研究期间破产(用“1”表示),而其他公司幸存下来(用“0”表示)。研究期间每年的总结如下。

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

性能指标

经过适当的输入和预处理后,数据以 70:30 的比例分成训练数据集和测试数据集。分类器建立在训练数据上,并且它们的性能使用训练和测试数据集的混淆矩阵来测量,如下所示:

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

其中 TP =真阳性的数量,
TN =真阴性的数量,
FP =假阳性的数量,
FN =假阴性的数量。

这些可用于计算以下指标:

观察次数,n = TN+FP+FN+TP
错误数= FP+FN
错误分类(错误率)= FP+FN / n
敏感度(真阳性)= TP / FN+TP
假阳性= FP / TN+FP
特异性(真阴性)= TN / TN+FP
精度= TP / FP+TP
患病率= FN+TP / n
准确度= TN+TP

由于我们感兴趣的是将公司分类为可能破产(或不破产),上述比率可以解释如下:

错误分类(错误率):分类器出错的频率有多高?
敏感性(真阳性):当一家公司实际上“破产”时,分类器正确预测结果的频率是多少?
误报:当一家公司实际上“没有 _ 破产”时,分类器出错的频率是多少?
特异性(真阴性):假设一家公司“没有破产”,那么分类器有多准确?
精度:当分类器预测“破产”时,它的正确率是多少?
普遍性:数据集中“破产”实际上发生的频率有多高?
准确性:总体而言,分类器正确的频率如何?

构建模型

使用 R 和 Python 为这个练习构建了不同的机器学习算法。可以在这里找到运行代码的视频:https://youtu.be/OWbuOza_Gao

逻辑回归
感知器作为分类器
深度神经网络分类器(具有不同的大小和深度)
Fischer 线性判别分析
K 最近邻分类器(具有不同的 K 值)
朴素贝叶斯分类器
决策树(具有不同的桶大小阈值)
袋装决策树
随机森林(具有不同的树大小)
梯度推进
支持向量机(具有不同的核)

有些算法是用不同的初始化构建的,为了找到最佳的初始化,记录了每种算法的性能。例如,对于 K-最近邻,尝试了从 1 到 19 的不同 K 值。下面以从红到绿的颜色编码显示了每个人的表现,红色表示“差”,绿色表示“好”:

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

我们看到,随着 k 的增加,错误率(以及准确性)降低,然后又开始增加。灵敏度随着 k 的增加而增加,而特异性随着 k 的增加而降低。

类似地,我们为随机森林尝试了不同数量的树,范围从 50–500,跳跃 50:

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

该模型在有 200 棵树的情况下表现最佳。

模型比较

我们制作了一个所有模型的对比图。基于所使用的超参数以及为测量性能而选择的度量标准,可以看出这些模型表现不同。下面给出了关于训练数据的度量的概述。

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

测试数据的指标概述如下:

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

一些发现

数据集有大量的“0”(没有破产的公司),很少的“1”(破产的公司)。因此,大多数模型给出了很高的精确度,但是在预测“1”时表现很差。由于任务是预测破产,我们认为我们必须把重点放在敏感性(真正的积极)作为比较模型的相关措施。

我们发现,集成模型如梯度推进和袋装决策树在训练和测试数据集上表现最好,甚至优于神经网络算法。他们的计算速度也很快,只需几分钟就能完成训练并得分。表现最差的模型是朴素贝叶斯模型,它导致了大量的错误和较差的敏感性得分。

后续步骤

合理的下一步是探索为什么朴素贝叶斯表现如此之差,以及不同的打包和提升模型以进一步提高模型的性能。可以考虑的另一种方法是仅对前 30 个主要成分运行上述模型,因为它们可以解释 97%以上的数据变化,如下所示。

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

如果您在电脑上试用了这些模型,请与我们分享您的结果!你可以在 LinkedIn 上找到我们。

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

Photo by Karol D from Pexels

参考

英国马卡姆(2014 年 3 月 25 日)。混淆矩阵术语简单指南。检索 2019 年 2 月 7 日,来自数据学校:https://www . Data School . io/simple-guide-to-focus-matrix-terminals/

Géron,A. (2019,1 1)。第一章。人工神经网络导论。检索 26 2019,来自神经网络与深度学习:https://www . oreilly . com/library/view/Neural-networks-and/9781492037354/ch01 . html

扁平图标。(2019, 1 1).每月一包。检索到 2019 年 2 月 7 日,来自平面图标:https://www.flaticon.com

未知。(-, — -).算法特点。检索 22019 年 6 月,来自 r studio PUBS:http://r studio-pubs-static . S3 . amazonaws . com/4239 _ fcb 292 ade 17648 b 097 a 9806 FBE 026 e 74 . html

郭,法律顾问(未注明)。*基于 Yelp 数据集预测餐厅的评分和受欢迎程度。*斯坦福大学经济系 CS 229 机器学习期末项目。

马切伊·zięba,S. K. (2016)。*集成提升树与合成特征生成在破产预测中的应用。*弗罗茨瓦夫科技大学,计算机科学系,运筹学系,计算机科学与管理学院,弗罗茨瓦夫。

维基百科,免费的百科全书。(2019, 2 5).所有型号都是错的。(T. F. Wikipedia,制作人)检索 2019 年 7 月 2 日,来自维基百科,免费百科:【https://en.wikipedia.org/wiki/All_models_are_wrongT2

用细胞神经网络预测电池寿命

原文:https://towardsdatascience.com/predicting-battery-lifetime-with-cnns-c5e1faeecc8f?source=collection_archive---------1-----------------------

使用 TensorFlow 2 分析序列数据

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

Photo from Fancycrave

本文由汉尼斯·克诺布洛赫、阿德姆·弗伦克和温迪·张撰写。
你可以在 GitHub 上找到这个项目的源代码:

[## DSR-18/电池寿命长

用 TensorFlow 2 预测总电池循环寿命。我们将发表一篇描述这个项目的博客文章…

github.com](https://github.com/dsr-18/long-live-the-battery)

锂离子电池为我们生活中的几乎所有电子设备供电,包括手机和笔记本电脑。它们是可再生能源和电动汽车的核心。多年来,公司一直试图预测电池在耗尽之前可以持续多少次充电。更好的预测将有助于更准确的质量评估和改善长期规划。

但这很难,因为每种电池的老化程度都不一样,这取决于电池的使用和制造过程中的条件。Kristen A. Severson 等人最近发表的一篇名为容量退化前电池循环寿命的数据驱动预测的论文,声称通过“综合实验数据和人工智能”找到了解决这一问题的关键。尽管他们的结果领先于传统方法,但该团队更关注他们在电气工程领域的知识,而不是机器学习部分。

好消息是:研究人员已经公开了同类最大的数据集!虽然数据集仅限于在实验室环境下对新电池的测量,但它仍然是同类中最全面的。我们使用了更复杂的机器学习方法来建立一个更通用、更准确的模型来预测电池寿命(在这些情况下)。在这里你可以看到它的行动:www.ion-age.org/example。要完全理解这个模型的作用,请继续阅读!

这篇文章从头到尾描述了我们的研究过程。此外,我们还描述了我们的工作流程和工具,为初级数据科学家的项目提供灵感。

我们试图预测什么?

该论文的作者专注于全新的电池,并预测了它们的寿命。这令人印象深刻,但如果你想诊断一个已经在使用的电池,你就不走运了。相反,我们希望预测任何电池的剩余循环寿命,不管是旧的还是新的。

另一个警告是预测所需的数据量。研究人员使用第一次和第一百次充电循环的数据进行预测。我们的目标是通过仅 20 个连续充电周期的测量获得准确的结果,使该模型更适用于现实世界。除此之外,了解电池的当前年龄也很有用。

这使我们得出以下问题定义:

在有限数量的充电周期内,给定测量值,一个电池单元经历了多少个周期,在它损坏之前将持续多少个周期?

让我们通过步骤建立一个模型,并预测这一点!

了解数据

原始论文的作者组装了 124 个锂离子电池来测量来自的数据。每个电池根据许多预定策略中的一个进行充电和放电,直到电池达到其原始容量的 80%(这意味着电池对于正常使用来说已经变得太不可靠,并且被认为是“坏的”)。达到这种状态之前的循环次数(完全充电,然后完全放电)称为电池循环寿命,这是我们的目标之一。在我们的数据集中,这个数字从 150 到 2300 不等。

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

Cycle life of the battery cells in the dataset. Most cells lasted around 500 charging cycles before they were considered broken.

每个单元的数据以嵌套结构的形式呈现,有些特征每个周期只测量一次,有些则测量多次。在一个完整的周期中,我们对容量、温度、电压和电流进行了一千多次测量,但对电池内阻或总周期时间等其他指标只有一次标量测量。

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

The data consists of 124 battery cells, each has gone through a variable number of charging cycles, and for each cycle we have measurements over time and scalar measurements.

由于大部分测量是在实验控制的充电策略(因电池而异)期间进行的,因此我们将数据裁剪到放电周期(所有电池都具有可比性)。这使我们进入下一步…

处理数据

原始测量数据可能非常嘈杂。测量之间的距离并不总是相等的,本应单调减少的数据会意外增加,有时硬件会关闭并在随机时间点继续测量。因此,在将数据输入模型之前,我们要特别注意数据是否干净,格式是否正确。

我们去除有时间间隙、小异常值或其他不一致的周期。我们发现平滑噪声的一个特别有用的东西是 savitzky golay 滤波器。这帮助我们恢复了一些在实验中有测量问题的数据样本。

数据中的另一个问题是时间。不同的充电政策意味着一些循环比其他循环完成得更快,充电和温度的时间测量值无法进行比较。相反,我们以与原始论文相似的方式对数据进行了重新采样:

  1. 以放电时的电压范围为基准,而不是时间!
    对于该电池型号,3.6V 和 2.0V 始终对应完全充电和放电。这个范围保持不变,即使时间不变。
  2. 在电压上插入电荷和温度。
  3. 以 1000 个等距电压步长对电荷和温度进行重新采样。

搞定了。现在所有的测量对于每个单元和周期都有相同的长度,但是我们仍然有一些 1000 步的特征,而其他的仅仅是标量。当数组特征和标量特征同时输入到我们的模型中时,我们如何避免形状不匹配?一种解决方案是在不同的入口点将数据输入到模型中,并在以后将所有的数据整合在一起。当我们详细讨论模型时,这一招会变得更加清晰。我们还需要做一件事。

为了能够检测趋势,我们将多个连续的充电周期作为输入。我们称这些周期组为窗口。整个窗口应该总是只有一个目标,但是每个周期都有一个“当前周期”和“剩余周期”值。这就是为什么我们将上一个周期的值定义为整个窗口的目标。

让我们最终进入(更)有趣的部分!

建立框架

在我们深入研究数据和创建酷模型之前,我们需要考虑我们的设置。我们想从头到尾使用 TensorFlow 2.0,以从集成的功能中受益,如 tensorboard数据集 API超参数调整

在选择了框架之后,我们决定了应该在什么平台上运行我们的培训工作。我们没有让自己的笔记本电脑过热,而是使用了谷歌云的人工智能平台。人工智能平台允许我们同时运行几个培训任务,轻松标记它们并监控过程。

这需要一些设置。这可能要花相当多的时间才能第一次做好,所以我们不会在本文中深入讨论所有的细节。这里有一个总结:

  1. 创建一个帐户并在你的机器上安装 google cloud sdk
  2. 将您的数据上传到谷歌云桶
  3. 编写一个运行作业的中央 python 脚本(加载数据、加载模型、训练模型、保存结果)
  4. 确保你的项目和文件夹结构是为 AI 平台正确设置的

现在,我们能够从命令行启动一项培训工作,并可以随时修改几乎所有内容。通过在命令后添加一个标志,我们可以调整诸如时期数、批量大小、重排、检查点保存,甚至可以轻松地在模型架构之间切换。这让我们能够快速迭代,测试不同的理论,并消耗大量(免费)积分。

开发模型

我们用 tf 建立了我们的模型。使用功能 API 的 Keras。我们在不同的入口点将数组和标量特征输入到模型中,因此在将它们组合在一起之前,我们可以对它们做不同的事情。

我们将每个窗口中的阵列特征沿着它们的短边连接起来,使它们成为具有形状(窗口大小、长度、特征数量)的 3D 矩阵。然后,我们可以使用 MaxPooling 将这个矩阵通过三个 Conv2D 层,从中提取相关信息,同时保持窗口的顺序性质。Conv2D 作用于“特征数量”维度,就好像这些是图像中颜色通道的数量。这是因为阵列特征都共享相同的电压范围,因此高度相关(就像图像中的 RGB 通道一样)。卷积后,我们将数据展平为 1D 数组。

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

The data entering the model is split into array features and scalar features. Both are processed separately before they’re concatenated and sent through a fully connected dense network to produce two outputs.

我们在窗口方向上以类似的方式连接标量特征,以产生具有形状(窗口大小、特征数量)的数组,然后通过具有一个 MaxPooling 的两个 Conv1D 层,最后将其展平。

我们现在有两个带有特性映射的平面阵列,我们可以很容易地将它们放在一起,并将其输入到一个完全连接的密集网络中,以产生我们的结果。

训练和调整模型

在我们建立了模型之后,是时候训练它了。我们编写了一个脚本,在一个简单的命令行界面中调用 GCP API,因此当您在项目的主目录中时,在云中启动培训工作变得非常容易:

./train.sh

例如,如果我们想要修改训练时期的数量和每个窗口的样本数量,我们的脚本将允许我们使用简单的标志来完成此操作:

./train.sh -e 70 -w 10

在训练期间,我们跟踪了训练(橙色)和验证(蓝色)集的三个指标:当前周期以及剩余周期的损失和平均绝对误差(MAE)。几分钟后,我们可以在 TensorBoard 中查看结果。让我们看看损失是什么样的:

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

Loss measured in Mean Squared Error for the first training run over 68 epochs. Orange is the train loss, blue the validation loss.

它正朝着正确的方向发展,但是我们对培训和确认损失之间的差距并不满意。为了缩小这个差距,辍学是一个流行的工具,所以我们把它添加到模型中。我们还需要调整我们的超参数,这就是为什么我们在不同的设置上使用 gridsearch。为了跟踪这些设置,我们使用了 hparams 模块,它来自 TensorFlow 2.0,可以在 tensorboard.plugins 中找到。现在我们可以比较不同的运行,并选择最佳的参数。

由于“当前”和“剩余周期”的正确预测应该总是大于零,所以我们尝试将 ReLU 作为输出层的激活函数,以在训练过程中减少模型的搜索空间。此外,我们的模型严重依赖 CNN,所以我们也尝试了不同的内核大小。最后,我们测试了两种不同的学习速率,并测量了设置的当前周期和剩余周期的 MAE。

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

Results of a gridsearch, displayed in TensorBoard. Each colored line represents one parameter setup.

使用我们从超参数调整中获得的最佳模型设置,并通过将训练历元数设置为 1000,我们最终得到了当前周期为 90 MAE、剩余周期为 115 MAE 的模型:

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

Loss measured in Mean Squared Error for the final training run over 1000 epochs, displayed with a smoothing factor of around 0.6.

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

Mean Absolute Error, Current Cycle for the final training run over 1000 epochs, displayed with a smoothing factor of around 0.6.

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

Mean Absolute Error, Remaining Cycles for the final training run over 1000 epochs, displayed with a smoothing factor of around 0.6.

它仍然不完美,但我们对我们心目中的应用程序的结果非常满意(我们终于有一些食物来庆祝了!).

做预测

当我们查看我们的最佳设置的训练曲线时,我们可以看到,最低的损失不是在训练结束时,而是在训练的四分之三左右。我们如何使用当时的模型进行预测?我们必须实现检查点,允许我们在训练期间的特定时间恢复保存的模型。

一旦我们有了一个模型,我们就可以用 TensorFlow 服务或 Flask 之类的 web 框架来服务它。当时,谷歌云平台不支持 TF2 服务,所以我们决定完全在 Flask 中构建应用程序,并将其托管在 AWS EC2 实例上。

你可以在这里再次看到结果:【www.ion-age.org/example】T2

加载随机样本文件后,您可以预览我们将要预测的数据,您会发现我们的两个线性特征和三个标量特征。点击预测按钮会生成一个图表,显示我们的两个目标:当前和剩余周期。

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

Screenshot from www.ion-age.org

就是这样!这就是给定适当的测量数据,可以准确预测任何锂离子电池的年龄和预期寿命的算法所需的全部内容。

如果您有任何建议或问题,或者您发现了一个 bug,请随时留下您的评论。我们很乐意回答问题!

我们在柏林为期三个月的数据科学训练营数据科学务虚会期间创建了这个项目。

预测美国城市的“骑行能力”

原文:https://towardsdatascience.com/predicting-bikeability-in-u-s-cities-67da4ff8376?source=collection_archive---------20-----------------------

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

根据联合国的统计,超过一半的世界人口居住在城市。随着全球贫困率持续下降,人们变得更加富裕,道路上的私人车辆数量激增。这两种现象意味着更严重的交通拥堵,这反过来又加剧了导致气候变化的温室气体排放。替代的“绿色”交通方式,即步行、踏板车和自行车,可以改善城市流动性并帮助城市实现减排目标,但并非所有城市都同样有利于这些方式。正是在这种背景下,我开发了一个数据科学项目,来预测美国各地城市的“可骑性”,并探索哪些城市特征决定了“可骑性”。

我使用 OLS 回归技术来预测目标值,城市自行车得分,范围从 0(糟糕的骑行条件)到 100(完美的骑行条件)。我的模型的特征包括一个城市的公共交通得分、人口、人口密度、商业密度、天气、人均 GDP 和当地税率。数据来源包括 Walk Score、美国气候数据、INRIX、城市实验室和税收基金会。

第一部分:数据争论

该项目开始于大多数数据科学项目:获取和清理数据!在从上述来源收集和清理数据之后,我需要将分散的信息连接起来。令人头疼的一个主要原因是同一个城市不同的命名习惯(例如,华盛顿特区和华盛顿 DC)。我对所有数据集运行了以下函数,以确保具有多种命名约定(或拼写错误)的城市在数据集之间是一致的。

def fix_cities(df):
    df.loc[df['city'] == 'Nashville', 'city'] = 'Nashville-Davidson'
    df.loc[df['city'] == 'Louisville', 'city'] = 'Louisville-Jefferson'
    df.loc[df['city'] == 'Lexington', 'city'] = 'Lexington-Fayette'    
    df.loc[df['city'] == 'OklahomaCity', 'city'] = 'Oklahoma City'
    df.loc[df['city'] == 'Salt LakeCity', 'city'] = 'Salt Lake City'
    df.loc[df['city'] == 'SanFrancisco', 'city'] = 'San Francisco'
    df.loc[df['city'] == 'VirginiaBeach', 'city'] = 'Virginia Beach'
    df.loc[df['city'] == 'Washington,D.C.', 'city'] = 'Washington, D.C.'
    df.loc[df['city'] == 'Washington Dc', 'city'] = 'Washington, D.C.'
    df.loc[df['city'] == 'Washington', 'city'] = 'Washington, D.C.'
    df.loc[df['city'] == 'New York', 'city'] = 'New York City'

接下来,由于在不同的州有一些同名的城市,我需要在城市和州的组合上连接数据帧。然而,一些数据集包括完整的州名,而其他数据集只包括两个字母的缩写。我创建了一个字典来将州名映射到州缩写。

states_abbrev = {'Alaska': 'AK', 'Alabama': 'AL', 'Arkansas': 'AR', 'Arizona': 'AZ','California': 'CA', 'Colorado': 'CO', 'Connecticut': 'CT','District of Columbia': 'DC','Delaware': 'DE','Florida': 'FL','Georgia': 'GA','Hawaii': 'HI','Iowa': 'IA', 'Idaho': 'ID', 'Illinois': 'IL', 'Indiana': 'IN','Kansas': 'KS', 'Kentucky': 'KY', 'Louisiana': 'LA', 'Massachusetts': 'MA','Maryland': 'MD', 'Maine': 'ME', 'Michigan': 'MI', 'Minnesota': 'MN', 'Missouri': 'MO', 'Mississippi': 'MS', 'Montana': 'MT', 'North Carolina': 'NC','North Dakota': 'ND', 'Nebraska': 'NE', 'New Hampshire': 'NH', 'New Jersey': 'NJ','New Mexico': 'NM', 'Nevada': 'NV', 'New York': 'NY', 'Ohio': 'OH',
'Oklahoma': 'OK', 'Oregon': 'OR', 'Pennsylvania': 'PA', 'Puerto Rico': 'PR','Rhode Island': 'RI', 'South Carolina': 'SC', 'South Dakota': 'SD', 'Tennessee': 'TN','Texas': 'TX', 'Utah': 'UT', 'Virginia': 'VA', 'Vermont': 'VT','Washington': 'WA', 'Wisconsin': 'WI', 'West Virginia': 'WV', 'Wyoming': 'WY'}

我之前已经“腌制”了每个单独的数据帧,所以我的下一步是读取每个腌制,确保城市名称和州是一致的,并按城市和州合并数据帧。当我准备开始探索性数据分析(EDA)和特性工程时,这给了我一个主数据集以备后用。

%pylab inline
%config InlineBackend.figure_formats = ['retina']import pandas as pd
import seaborn as snsdf = pd.read_pickle('city_traffic.pkl')
df['city'] = df['city'].str.lower()
df['state'] = df['state'].str.strip()
df['city'] = df['city'].str.strip()
fix_cities(df)files = ['city_busdensity.pkl','city_percip.pkl','city_poulations.pkl',
         'city_taxes.pkl','city_temp.pkl','city_walkscore.pkl']for file in files:
    df_pkl = pd.read_pickle(file)
    if 'city' in df_pkl.columns:
        df_pkl['city'] = df_pkl['city'].str.strip() 
        df_pkl['city'] = df_pkl['city'].str.lower() 
    if 'state_long' in df_pkl.columns:
        df_pkl['state'] = df_pkl['state_long'].map(states_abbrev) #Get state abreviation for these
    df_pkl['state'] = df_pkl['state'].str.strip()
    fix_cities(df)
    if 'state' in df_pkl.columns:
        df = pd.merge(df, df_pkl, on = ['city','state'], how = 'outer')
        print(file,'success')
    else:
        print(file, 'no state column')df.to_pickle('city_data.pkl')

第二部分:EDA 和特征工程

我加载回我的腌数据帧,并丢弃除了我的目标值(bike_score)和感兴趣的特性之外的所有内容。

df = pd.read_pickle('city_data.pkl')df = df[['bike_score','walk_score','transit_score',
         'congestion', 'bus_density','pop_density', 'population', 
         'gdp_per_cap',  'state_tax', 'city_tax', 'total_tax',
         'avg_percip',  'avg_temp']]

接下来,我创建了 pairplots 来查看我的变量的分布,以及我的数据框架内的二元关系。

sns.pairplot(df, height=1.2, aspect=1.5);

虽然大多数要素看起来呈正态分布,但人口、人口密度(“pop_density”)和商业密度(“bus_density”)是明显的例外,我想知道它们是否会受益于对数变换。

log_vars = ['population','pop_density','bus_density']
for v in log_vars:
    df['log_'+v] = log(df[v])

我绘制了这三个特征在对数变换前后的直方图。代码和图形如下所示。

f, axes = plt.subplots(3, 2)
f.subplots_adjust(hspace = 0.5)
sns.distplot(df.population, ax=axes[0][0], kde=False, bins='auto')
sns.distplot(df.log_population, ax=axes[0][1], kde=False, bins='auto')
sns.distplot(df.pop_density, ax=axes[1][0], kde=False, bins='auto')
sns.distplot(df.log_pop_density, ax=axes[1][1], kde=False, bins='auto')
sns.distplot(df.bus_density, ax=axes[2][0], kde=False, bins='auto')
sns.distplot(df.log_bus_density, ax=axes[2][1], kde=False, bins='auto')for i in range(0,3):
    for j in range(0,2):
        axes[i][j].set_xticks([])
        axes[i][j].set_yticks([])

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

Histograms of select features, before and after log transformation

从直方图中可以看出,在对数变换之后,总体分布看起来更为正态分布。另一方面,人口和商业密度似乎仍未呈正态分布。相反,这些要素似乎具有较大的异常值(例如,纽约市),导致它们向右倾斜。尽管如此,经过对数变换后,变换后的密度要素和目标值之间的关系似乎更加线性,因此我决定将它们保留下来,看看它们实际上是否显著。

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

Bike score as a function of urban population density and log urban population density

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

Bike score as a function of urban business density and log urban business density

接下来,我研究了要素之间的相关性,以解释任何共线性。

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

Heatmap of feature correlations

corrs = {}
cols = list(df.iloc[:,1:].columns)
for x in cols:
    cols = [w for w in cols if w != x]
    for w in cols:
        corrs[(x, w)] = df[x].corr(df[w])
results = [(x, v.round(2)) for x, v in corrs.items() if corrs[x] > 0.5]results = sorted(results, key=lambda x: x[1], reverse=True)
results

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

Correlations for pairs of features

前三个相关性是预期的(变量的对数应该与变量本身高度相关)。Total tax 就是城市和州的税收之和,所以我选择 total_taxes 作为包含在模型中的税收特性。相关性在 0.52 和 0.56 之间的底部四对特征是值得关注的,所以我为它们创建了交互项。

interact = [x[0] for x in results[4:]]
interacts = []
for i in range(len(interact)):    
    col1 = interact[i][0]
    col2 = interact[i][1]
    col_interact = col1+'_x_'+col2
    interacts.append(col_interact)
    df[col_interact] = df[col1]*df[col2]

接下来,我检查了各种要素组合的方差膨胀因子,以确保最终要素之间的任何共线性都很低。足够幸运的是,我所有的 VIF 都低于“神奇数字”3。

from statsmodels.stats.outliers_influence import variance_inflation_factordf['constant'] = 1
X = df[['congestion', 'population', 'gdp_per_cap', 'walk_score_x_transit_score','total_tax', 'avg_percip', 'avg_temp', 'log_population','bus_density_x_pop_density', 'constant']]
vif = pd.Series([variance_inflation_factor(X.values, i) for i in range(X.shape[1])],index=X.columns)
vif.sort_values(ascending = False)

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

Variance inflation factors of model features

在我的数据为分析做好准备之后,我在继续进行 hpyer 参数调整和模型选择之前,对这个版本的数据帧进行了处理。

df.to_pickle('regression_data.pkl')

第三部分:超参数调整和模型选择

最后,我准备创建我的模型,看看哪些特征决定了一个城市的“骑行能力”!

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression, Lasso, LassoCV, Ridge, RidgeCV
from sklearn.metrics import r2_score 
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.pipeline import Pipeline
from sklearn.metrics import mean_absolute_error as mae
from sklearn.model_selection import cross_val_score, cross_val_predict
from sklearn.model_selection import GridSearchCVdf = pd.read_pickle('regression_data.pkl')

首先,我将“y”定义为我的目标变量(bike_score),将“X”定义为城市特征矩阵。

y = df['bike_score']
X = df[['constant','congestion', 'transit_score', 'gdp_per_cap','total_tax', 'avg_percip', 'avg_temp', 'log_population','bus_density_x_pop_density']]

接下来,我将数据分成训练集和测试集。我用 80%的数据训练我的模型,保留 20%用于测试。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,random_state = 88)

a .线性回归

我首先在 5 组交叉验证数据上拟合了一个“普通”线性回归模型(这意味着我的五分之一的数据总是被保留下来评分)。我得到了所有验证折叠的平均绝对误差(MAE)接近 8。

lr=LinearRegression()scores = cross_val_score(lr, X_train, y_train, cv = 5, scoring='neg_mean_absolute_error')
print (np.mean(scores)*(-1))

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

b .岭正规化

知道我的要素之间存在大量的多重共线性后,我接下来拟合了一个岭回归,它在我的(标准化)要素上添加了多重共线性的惩罚。

std_scale = StandardScaler()
X_train_scaled = std_scale.fit_transform(X_train)
X_test_scaled = std_scale.transform(X_test)ridge = Ridge(random_state=88)

我使用 scikit learn 的 GridSearchCV 来寻找使五个交叉验证折叠的平均绝对误差最小化的 alpha 参数。

grid_r1 = {'alpha': np.array([100,75,50,25,10,1,0.1,0.01,0.001,0.0001,0])}
ridge_grid = GridSearchCV(ridge, grid_r1, cv=5, scoring='neg_mean_absolute_error')
ridge_grid.fit(X_train_scaled, y_train)print("tuned hpyerparameters :(best parameters)", ridge_grid.best_params_)
print("MAE score :",-1*(ridge_grid.best_score_))

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

最好的 alpha 是 100,这给出了训练集的五个折叠的平均 MAE 为 7.5——比“香草”线性回归略有改善。

c .拉索正规化

套索正则化会对多重共线性造成不利影响,并且仅保留系数非零的重要要素。考虑到这一点,我决定将“厨房水槽”特性加入到这个模型中。同样,我的第一步是使用 GridsearchCV 来确定最佳 alpha 参数。alpha 值为 1.0 时,MAE 值为 6.6,与岭模型相比,这已经是一个显著的改进。

y = df['bike_score']
XL = df.drop(['bike_score','constant'], axis=1)X_train, X_test, y_train, y_test = train_test_split(XL, y, test_size=0.2, random_state = 88)std_scale = StandardScaler()
X_train_scaled = std_scale.fit_transform(X_train)
X_test_scaled = std_scale.transform(X_test)grid_l1 = {'alpha':  np.array([100,75,50,25,10,1,0.1,0.01,0.001,0.0001,0])}
lasso = Lasso(random_state=88)
lasso_grid = GridSearchCV(lasso, grid_l1, cv=5, scoring='neg_mean_absolute_error')
lasso_grid.fit(X_train_scaled, y_train)print("tuned hpyerparameters :(best parameters) ",lasso_grid.best_params_)
print("MAE score :",-1*(lasso_grid.best_score_))

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

正如我上面提到的,lasso 正则化倾向于将几个特征系数取零,只保留一组精选的重要特征。事实上,只有步行得分、步行得分/交通得分相互作用、拥堵和平均降水量返回非零系数。我决定在最终模型中保留除 walk score 之外的所有内容(以考虑 walk_score 和 walk_score*transit_score 之间的多重共线性)。

coefficients = sorted(list(zip(X_test.columns, lm.coef_.round(2))), key=lambda x: x[1], reverse=True)
coefficients

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

Feature coefficients with lasso regularization

下面是我的最终模型的代码,它对训练数据中的三个重要特征(步行分数/交通分数交互、拥堵和平均降水量)进行了 alpha 1.0 的 Lasso 回归拟合。最后,我使用该模型来预测测试集中的自行车分数(还记得我放在一边的 20%的数据吗?).测试数据的平均误差(模型预测值和实际目标值之间的平均绝对误差)为 6.3,这意味着我的模型能够预测城市自行车得分,平均与实际得分相差 6.3 分。

y = df['bike_score']
XL2 = df[['walk_score_x_transit_score','congestion','avg_percip']]X_train, X_test, y_train, y_test = train_test_split(XL2, y, test_size=0.2, random_state = 88)std_scale = StandardScaler()
X_train_scaled = std_scale.fit_transform(X_train)
X_test_scaled = std_scale.transform(X_test)lasso = Lasso(random_state=88, alpha=1.0, fit_intercept=True)lm2 = lasso.fit(X_train_scaled, y_train)
y_pred = lm2.predict(X_test_scaled)
mae(y_pred, y_test)

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

结果

根据模型系数,更“适合骑自行车”的城市是那些有替代交通方式(公共交通和步行)先例、更拥堵(更有动力寻找替代私家车的方式)和更少降水(雨/雪)的城市。根据 lasso 模型,当地税率、商业密度和人口密度等特征对一个城市的“骑行能力”没有影响。

coefficients = sorted(list(zip(X_test.columns, lm2.coef_.round(2))), key=lambda x: x[1], reverse=True)
coefficients

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

Feature coefficients, final regression model with lasso regularization

我的模型的低 R 平方和调整后的 R 平方表明,我选择的特征不能解释一个城市骑行能力的大部分差异。下一步将收集可能解释骑行性的其他要素,例如与自行车相关的基础设施的质量和整体山地。

def r2_adj(X,Y,r_squared):
    adjusted_r_squared = 1 - (1-r_squared)*(len(y)-1)/(len(y)- X.shape[1]-1)
    return(adjusted_r_squared)r2 = lm2.score(X_test_scaled, y_test)
r2a = r2_adj(X_test_scaled, y_test, r2)
print('R-squared', r2.round(2), 'Adjusted r-squared', r2a.round(2))

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

一旦我能够完善模型,并通过额外的功能选择和功能工程进一步减少 MAE,未来的工作将是纳入 walkscore.com 目前不提供自行车分数的国际城市。随着全球城市化进程的加快和气候变化的威胁日益逼近,城市必须找到减少私家车拥堵和排放的方法。自行车和踏板车共享计划有助于这一努力,我希望这个项目将阐明那些决定实施这些计划的可行先决条件的因素。

我一直在努力改进我的工作,所以欢迎提出建议!请随时在评论中提供反馈。

我尝试了深度学习模型来预测比特币价格

原文:https://towardsdatascience.com/predicting-bitcoin-prices-with-deep-learning-438bc3cf9a6f?source=collection_archive---------2-----------------------

利用神经网络预测加密货币价格

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

Photo by André François McKenzie on Unsplash

点击下方查看之前的文章使用机器学习研究比特币价格:

[## 我试图用机器学习来预测比特币的价格

利用时间序列模型预测加密货币价格

towardsdatascience.com](/predicting-prices-of-bitcoin-with-machine-learning-3e83bb4dd35f)

不久前,我们深入研究了机器学习模型的使用,以预测比特币的未来价格。在那里,我们使用了两个时间序列模型来预测比特币价格在未来几天或几周内的走向。就训练和使模型适应比特币的历史价格数据而言,这相当简单。但是,如果除了机器学习之外还有其他方法来预测时间序列数据呢?

这个问题的答案是…

深度学习

深度学习是机器学习的一个子集,但两者之间的关键区别在于,深度学习使用神经网络,赋予机器自我训练的能力。机器学习需要用户或工程师设置参数的算法来训练机器。换句话说,机器学习比深度学习需要更多的动手调整和修复。深度学习能够进行所有的调整和自我修复,而不需要用户/工程师的任何手动干预。他们需要调整或创建的主要东西是神经网络本身,它有自己的一套障碍。

但是深度学习比机器学习好吗?

这完全取决于问题。在某些情况下,传统的机器学习模型要比复杂的神经网络好得多。我们发现的一个这样的例子是用于分类的表格数据的训练和拟合。在这种情况下,与传统分类算法的结果相比,神经网络的训练时间明显更长,但表现水平较低或相当。但是时间序列数据呢?

这正是我们今天要做的!我们将根据比特币的历史价格数据,创建并运行我们自己的、相对简单的神经网络。然后,我们将能够看到神经网络是否优于传统的 SARIMAX,甚至是我们之前实现的脸书先知时间序列模型。

当我们演练创建神经网络的过程时,我们将解释必要的概念以更好地理解代码。期望在最后看到一个 Github 链接,展示神经网络的全部源代码。

在这里注册一个中级会员,可以无限制地访问和支持像我这样的内容!在你的支持下,我赚了一小部分会费。谢谢!

我们开始吧

首先,我们需要安装必要的库,以便创建我们的神经网络(您可能需要 安装 Tensorflow Keras )。接下来我们加载包含比特币历史价格数据的 CSV 文件,可以从 雅虎财经 下载。价格数据的另一个选项是使用金融数据 API,如 EOD 历史数据 。注册是免费的,你可以获得大量的金融数据。披露:我通过上面的链接从任何购买中赚取一小笔佣金。

然后,我们将做一些数据预处理,以便我们观察到的价格是“收盘价格,并且指数采用日期时间格式。最后,为了提高性能,我们将使用 scikit-learn 的 MinMaxScaler()来缩放数据。

Note: we are only selecting the last 1,000 days of Bitcoin prices because those days are the most representative of the current Cryptocurrency market.

助手功能

对于下一部分,我们将需要创建一些辅助函数,这将使我们能够适当和有效地运行神经网络。

visualize_training_results()—绘制我们的神经网络的精确度和损失。这允许我们检查我们的神经网络的训练进度/结果。

split_sequence() —创建两个数组: Xy 。这些变量分别是我们的神经网络的输入输出变量。输入是回顾的周期数,而输出是未来的周期数。简单地说,输入周期用于计算出导致输出周期的模式和序列。它们都可以是任何数量,但是如果输入周期的数量大于输出周期的数量可能是有益的。

layer_maker() —为我们的神经网络创建指定数量的隐藏层(如有必要,还可删除层)。这项功能构成了我们网络的主体。这个功能的重要性将在后面解释。

准备/分割数据

我们的下一步是在我们的比特币价格数据上实现我们的split_sequence()功能。

的周期数可以是我们选择的任意数。但是为了这个例子,我们将选择回顾价格历史的 30 天来预测下一个 10 天。但是,这并不意味着我们只回顾最近的 30 天来计算接下来的 10 天,总共只有 40 天。这意味着对于我们选择的 1,000 天中的每一天,前 30 天用于确定任何导致下 10 天的模式或序列。这些值用于训练神经网络,以便我们可以预测或预测从今天起未来 10 天的比特币价格。

神经网络

既然我们已经准备好了数据,我们可以进入有趣的部分——构建神经网络。我们的神经网络将使用来自 Keras 库的简单 序列 模型来创建。从那里,我们将通过在我们的模型中实现 LSTM (长期短期记忆)层来使用一个称为递归神经网络的特定神经网络。

递归神经网络— LSTM

递归神经网络( RNN )是一种神经网络,长短期记忆( LSTM )网络是一种 RNN。我们使用 RNN,而不是普通的神经网络,如多层感知器( MLP )网络,因为 rnn 最适合用于序列数据,如我们的比特币历史价格数据。如果你想了解更多关于 RNNs 和 LSTMs 的信息,点击 这里

创造我们的循环神经网络

万事俱备,我们可以开始为比特币价格数据构建神经网络了:

首先,我们实例化了顺序模型和一个激活函数,该函数贯穿神经网络中的各层。经过大量实验,最佳激活函数被证明是“ softsign 或“ tanh”。“这可能是因为这两个函数的范围都是从-1 到 1,并且比范围从 0 到 1 的激活函数更好地处理来自输入的负值和正值。

输入层

我们网络中的第一层将是输入层,只需调用model.add()就可以添加到网络中。在.add()方法中,我们有:

  • LSTM 层创造了我们的 RNN。
  • 作为第一个参数的节点数(这里设置为 25 )。
  • activation是我们之前设置为变量的激活函数。
  • return_sequence被设置为,因此 LSTM 层之间的每个序列包含适当的尺寸。
  • input_shape被设定为输入和特性的数量。这样做是为了让网络知道预期的形状。

隐藏层

对于下一个项目,我们可以开始在神经网络中创建我们的隐藏层。为了避免多次输入model.add(),我们将使用我们的layer_maker()功能。这就创建了一个简单的“ for ”循环,它具有一个指定的范围,可以根据我们的需要生成任意多的层。它还可以选择添加漏失层,这对正则化很重要。如果你不熟悉正则化这个术语,只知道它是我们神经网络中防止过拟合的一种方法。过度拟合,简单来说,发生在一个模型在预测新的观察值时表现不佳,在我们的情况下,预测未来的比特币价格。

接下来,我们用一个没有设置为真的return_sequence的最终隐藏层来完成隐藏层。这样做是为了使最终隐藏层的尺寸可以顺利地传递到输出层,而不会出现错误。

输出图层和模型汇总

上面代码片段中的下两项包含最后一层和我们刚刚创建的神经网络的摘要。最后一层或输出层不是 LSTM 层,而是一个正常的、密集连接的神经网络层,如果我们使用标准的非递归神经网络,就会经常使用它。该层包含我们希望预测的周期/天数作为其节点数。模型摘要显示有关创建的神经网络的基本信息。

编译模型

在我们继续训练我们的神经网络之前,我们必须用首选的规范来编译它:

  • optimizer是我们训练神经网络所需的优化算法(点击此处查看不同优化算法的完整概述)。
  • loss是我们在模型中衡量误差的方式。通常,我们希望损耗尽可能接近零(参见此处了解不同损耗函数的更多信息)。
  • metrics是我们衡量模型/神经网络性能的方式(单击此处了解有关不同指标的更多信息)。

尝试不同的参数

当创建神经网络模型时,为了找到最佳的参数组合,大量的实验是必要的。当谈到模型最终将如何执行时,节点和层的数量尤其重要。没有神奇的数字,两者都需要自己的理想数字,必须通过反复试验才能发现。

几乎你为任何新数据集创建的每一个神经网络都必须由它们自己唯一的一组参数组成。由于这个实验过程,我们的结果可能会因所用数据集的不同而大相径庭。

拟合/训练神经网络

一切准备就绪,万事俱备,我们终于可以开始拟合/训练我们的神经网络了!我们可以通过编写一行代码来实现这一点:

res = model.fit(X, y, epochs=800, batch_size=32, validation_split=0.1)

一旦我们运行这个代码,我们的神经网络将开始对我们的比特币价格数据进行训练。根据我们拥有的资源,培训时间可能需要几个小时。那些硬件规格更好的公司可能会比我们获得更好的结果。同时,当 NN 在训练时,我们可以解释model.fit()方法中的参数:

  • X, y是我们分配的包含比特币历史价格数据的变量。
  • epochs是 NN 在整个数据集上训练的次数,包含批次数。
  • batch_size是模型在更新其自身参数之前将从中工作的训练集中的样本数。
  • validation_split是在一个时期结束时,为评估数据的损失和指标而搁置的数据集的百分比。

可视化我们模型的性能

一旦我们完成了模型的训练,我们就可以通过使用visualize_training_results()函数来可视化我们的训练结果。运行以下代码行将显示我们的模型在多个时期的性能。

visualize_training_results(res)

这将为我们提供以下可视化效果…

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

这些可视化显示了训练验证设置的损失准确度。为了查看我们的 NN 是否训练良好,我们将希望看到验证和训练集的损失和准确性随着历元数的增加而收敛。否则,如果我们两组的损失和精确度彼此偏离,那么我们的神经网络可能有过度拟合的迹象。这可以通过引入一些脱落层,减少历元数,改变层数等方法解决。我们的神经网络训练中的这一步可能需要额外的试验和调整,以便观察训练和验证集的收敛性。

验证我们的神经网络

一旦训练完成,我们对损失和准确性的融合感到满意。我们需要根据实际数据测试我们的模型,看看它的表现如何。我们可以通过简单地可视化神经网络预测的比特币价格,并用比特币的实际价值来绘制它们。

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

Here we observe the Actual Bitcoin prices from the last 10 days and our NN’s predicted values starting from 10 days ago.

说到准确预测价格,我们的模型有好几次都不尽如人意。虽然,趋势和潜在价格目标可能提供一些价值。例如:

在第 0 天,您从模型的预测中观察到价格将在第 10 天达到 7,700 美元。但是,实际上,价格比第六天的价格略高。

从这个例子中,该信息可以向比特币交易者提供潜在的投资时机和机会。

使用我们的 RNN 进行预测

当我们最终对验证我们预测的比特币价值感到满意时,我们就可以进入神经网络中最有用的部分——预测比特币的未来价格!为了预测未来 10 天的比特币价格,我们所要做的就是在我们的model.predict()方法中输入过去 30 天的价格。

使用下面的代码,我们可以打印出未来 10 天的价格,并为这些预测绘制图表,以获得更好的可解释性。

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

太棒了。我们现在有了未来 10 天的比特币价格。然而,这些数字是可靠的吗?绝对不行!就像我们以前的时间序列模型一样,这个神经网络也可以给我们未来价格的大致趋势。如果他们错了,那也是意料之中的事,因为没有人和机器能够正确预测未来。我们只能希望看到它可能去哪里,使用神经网络可能比盲目猜测更好。

结束语

这个新创建的基于比特币历史价格数据的神经网络能够成功地为我们提供未来 10 天的预测。你如何处理这些信息完全取决于你 但是你应该知道这仍然是一个相对简单的神经网络。可以做更多的工作来提高我们的神经网络的性能,但是为了时间和简单起见,我们决定只讨论创建 r NN 的基础知识。

现在,根据你花了多少时间来训练和调整神经网络,你的结果可能会有所不同。请随意试验代码并测试不同的方法来改进神经网络。一些想法可能是将技术指标作为另一组输入变量,或者尝试不同类型的 RNN。深度学习有太多的可能性和途径可以探索,每天都有新的前景出现。所以,请留意新的发现,希望你喜欢并学到了一两件关于建立神经网络的事情!

资源:

[## 马克桑 93/BTC-预报员

此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…

github.com](https://github.com/marcosan93/BTC-Forecaster) [## 我试图用机器学习来预测比特币的价格

利用时间序列模型预测加密货币价格

towardsdatascience.com](/predicting-prices-of-bitcoin-with-machine-learning-3e83bb4dd35f) [## 如何开发用于时间序列预测的 LSTM 模型

长短期记忆网络,简称 LSTMs,可用于时间序列预测。有很多种…

machinelearningmastery.com](https://machinelearningmastery.com/how-to-develop-lstm-models-for-time-series-forecasting/)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值