TowardsDataScience 博客中文翻译 2016~2018(二百二十九)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

预测员工流动率

原文:https://towardsdatascience.com/predicting-employee-turnover-7ab2b9ecf47e?source=collection_archive---------1-----------------------

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

介绍

员工流动率是指离开一个组织并被新员工取代的员工的百分比。对组织来说,这是非常昂贵的,费用包括但不限于:离职、空缺、招聘、培训和替换。平均来说,组织投资四周到三个月来培训新员工。如果新员工在第一年就决定离开,这项投资对公司来说将是一项损失。此外,由于定期更换的客户代表和/或的顾问,咨询公司等组织的客户满意度会下降,这将导致失去客户。

在本帖中,我们将研究来自 kaggle 的模拟人力资源数据,以构建一个分类器,帮助我们预测在给定某些属性的情况下,哪种员工更有可能离职。这种分类器将有助于组织预测雇员流动,并积极主动地帮助解决这种代价高昂的问题。我们将限制自己使用最常见的分类器:随机森林,梯度推进树,K-最近邻,逻辑回归和支持向量机。

数据有 14999 个例子(样本)。下面是每一种的功能和定义:

  • satisfaction_level:满意度{ 0–1 }。
  • last_evaluationTime:自上次绩效评估以来的时间(以年为单位)。
  • number_project:工作时完成的项目数。
  • average_montly_hours:工作场所每月平均工作时间。
  • time_spend_company:在公司工作的年数。
  • Work_accident:员工是否发生了工作场所事故。
  • left:员工是否离开了工作场所{0,1}。
  • promotion_last_5years:员工在过去五年中是否获得晋升。
  • 销售:员工工作的部门。
  • 工资:工资的相对水平{低、中、高}。

创建这篇文章的源代码可以在这里找到。

数据预处理

让我们看一下数据(检查是否有缺失值以及每个要素的数据类型):

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

Data oveview

因为没有缺失值,所以我们不必做任何插补。但是,需要一些数据预处理:

  1. 销售功能名称改为部门
  2. 薪金转换为有序分类特征,因为在低、中、高之间有内在的顺序。
  3. 部门特征创建虚拟特征,并删除第一个特征,以避免某些学习算法可能遇到的线性依赖性。

数据现在可以用于建模了。最终的特征数量现在是 17 个。

建模

让我们先来看看每一类的比例,看看我们处理的是平衡的还是不平衡的数据,因为每一类都有自己的一套工具在拟合分类器时使用。

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

Class counts

如图所示,我们有一个不平衡的数据集。因此,当我们在这样的数据集上拟合分类器时,在比较诸如 f1-scoreAUC(ROC 曲线下面积)等模型时,我们应该使用准确性以外的度量。此外,类不平衡通过隐式学习基于数据集中的多数类优化预测的模型,使决策规则偏向多数类,从而影响训练期间的学习算法。有三种方法可以处理这个问题:

  1. 对少数群体的错误预测给予更大的惩罚。
  2. 对少数类进行上采样或对多数类进行下采样。
  3. 生成合成训练示例。

尽管如此,没有明确的指南或最佳实践来处理这种情况。因此,我们必须尝试所有这些方法,看看哪种方法最适合手头的问题。我们将限制自己使用前两个,即,在分类器中使用class_weight为来自少数类的错误预测分配更大的惩罚,这允许我们这样做,并评估对训练数据的上采样/下采样,以查看哪一个给出更高的性能。

首先,使用 80/20 拆分将数据拆分为训练集和测试集;80%的数据将用于训练模型,20%用于测试模型的性能。第二,对少数类进行上采样,对多数类进行下采样。对于这个数据集,正类是少数类,负类是多数类。

原始形状:(11999,17) (11999,)
上采样形状:(18284,17) (18284,)
下采样形状:(5714,17) (5714,)

我认为我们不需要应用 PCA 之类的降维方法,因为:1)我们想知道每个特征在决定谁会离开与谁不会离开(推断)中的重要性。2)数据集的维数适当(17 个特征)。然而,很高兴看到需要多少主成分来解释数据中 90%、95%和 99%的变化。

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

PCA

看起来它需要 14、15 和 16 个主成分来分别捕捉数据中 90%、95%和 99%的变化。换句话说,这意味着数据已经在一个良好的空间中,因为特征值彼此非常接近,并进一步证明我们不需要压缩数据。

我们在构建分类器时将遵循的方法如下:

  1. 使用 scikit-learn 的make_pipeline构建一个处理所有步骤的管道,该管道有两个步骤:

I .将数据标准化,以加快收敛速度,并使所有特征具有相同的比例。

二。我们想要用来拟合模型的分类器(estimator)。

2.使用GridSearchCV通过 10 重交叉验证调整超参数。我们可以使用更快的RandomizedSearchCV,尤其是如果我们有两个以上的超参数,并且每个超参数的范围都很大时,它可能会优于GridSearchCV;然而,GridSearchCV将工作得很好,因为我们只有两个超参数和下降范围。

3.使用训练数据拟合模型。

4.使用测试数据为最佳估计量绘制混淆矩阵和 ROC 曲线。

随机森林、梯度推进树、K 近邻、逻辑回归和支持向量机重复上述步骤。接下来,选择交叉验证 f1 值最高的分类器。注意:一些超参数范围将由论文将机器学习应用于生物信息学问题的数据驱动建议指导。

随机森林

首先,我们将从使用未采样、上采样和下采样数据拟合随机森林分类器开始。其次,我们将使用交叉验证(CV) f1 得分评估每种方法,并选择 CV f1 得分最高的方法。最后,我们将使用该方法来拟合其余的分类器。

我们将调整的唯一超参数是:

  • max_feature:每次分割随机考虑多少个特征。这将有助于避免在每次分割时挑选很少的强特征,并让其他特征有机会做出贡献。因此,预测的相关性将会降低,每棵树的方差将会减少。
  • min_samples_leaf:每次拆分要有多少个实例才能成为最终叶节点。

随机森林是一个集合模型,有多棵树(n_estimators)。最终预测将是所有估计者预测的加权平均值(回归)或模式(分类)。注意:大量的树不会导致过度拟合。

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

Random Forest hyperparameter tuning results

上采样产生了最高的 CV f1 值,为 99.8%。因此,我们将使用上采样数据来拟合其余的分类器。新数据现在有 18,284 个例子:50%属于积极类,50%属于消极类。

让我们使用上面调整的最佳超参数,用向上采样的数据重新调整随机森林,并使用测试数据绘制混淆矩阵和 ROC 曲线。

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

Random Forest

梯度推进树

梯度增强树与随机森林相同,除了:

  • 它从小树开始,并通过考虑成年树的残差从成年树开始学习。
  • 更多的树会导致过度拟合;与随机森林相对。

因此,我们可以把每一棵树都看作一个弱学习者。除了max_featuresn_estimators之外,我们要调整的另外两个超参数是:

  • learning_rate:速率树学习,越慢越好。
  • max_depth:每次树生长时的分裂次数,限制了每棵树的节点数。

让我们使用测试数据拟合 GB 分类器并绘制混淆矩阵和 ROC 曲线。

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

Gradient Boosting Trees hyperparameter tuning results

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

Gradient Boosting Trees

k-最近邻

KNN 被称为懒惰学习算法,因为它不学习也不适合任何参数。它从训练数据中提取最接近我们感兴趣的点的n_neighbors点来预测它的类别,并将邻近点的类别的模式(多数投票)作为它的类别。我们要调整的两个超参数是:

  • n_neighbors:用于预测的邻居数量。
  • weights:根据以下条件为邻居分配多少权重:
  • “均匀”:所有相邻点的权重相同。
  • “距离”:使用预测中使用的每个相邻点的欧几里德距离的倒数。

让我们拟合 KNN 分类器,并绘制混淆矩阵和 ROC 曲线。

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

K-Nearest Neighbors hyperparameter tuning results

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

K-Nearest Neighbors

逻辑回归

对于逻辑回归,我们将调整三个超参数:

  • penalty:正则化类型,L2 或 L1 正则化。
  • C:参数λ正则化的反面。C 越高,正则化程度越低。我们将使用覆盖非正则化到完全正则化之间的整个范围的值,其中模型是示例标签的模式。
  • fit_intercept:是否包含拦截。

我们不会使用任何非线性,如多项式特征。

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

Logistic Regression hyperparameter tuning results

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

Logistic Regression

支持向量机(SVM)

SVM 调整其超参数的计算成本非常高,原因有二:

  1. 对于大数据集,它变得非常慢。
  2. 它有大量的超参数需要优化,这需要在 CPU 上花费很长时间来优化。

因此,我们将使用我们之前提到的论文中推荐的超参数值,该论文显示在 Penn Machine Learning Benchmark 165 数据集上产生最佳性能。我们通常希望调整的超参数有:

  • Cgammakerneldegreecoef0

10 倍 CV f1 分为:96.38%

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

Support Vector Machine

结论

最后,让我们打印出到目前为止我们训练的所有分类器的测试准确率,并绘制 ROC 曲线。然后我们将挑选 ROC 曲线下面积最大的分类器。

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

Comparing ROC curves for all classifiers

尽管随机森林和梯度增强树具有几乎相等的 AUC,但随机森林具有更高的准确率和 f1 值,分别为 99.27%和 99.44%。因此,我们有把握地说,随机森林优于其余的分类器。让我们看看随机森林分类器的特征重要性。

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

Random Forest feature importance

看起来最重要的五个特征是:

  • 满意度 _ 级别
  • 时间 _ 花费 _ 公司
  • 平均每月小时数
  • 数字 _ 项目
  • lats _ 评估

带回家的信息如下:

  • 在处理不平衡类时,精度不是模型评估的好方法。AUC 和 f1 分数是我们可以使用的指标示例。
  • 上采样/下采样、数据合成和使用平衡的类权重是尝试提高不平衡类数据集的分类器精度的好策略。
  • GridSearchCV帮助调整每个学习算法的超参数。RandomizedSearchCV更快,可能会超过GridSearchCV,尤其是当我们有两个以上的超参数需要优化时。
  • 主成分分析(PCA)并不总是被推荐,特别是如果数据在一个好的特征空间中,并且它们的特征值彼此非常接近。
  • 正如所料,在大多数情况下,集成模型优于其他学习算法。

原载于 2017 年 12 月 11 日imaddabbura . github . io

预测未来农药样品结果,促进智能农药使用

原文:https://towardsdatascience.com/predicting-future-pesticide-sample-results-to-promote-intelligent-pesticide-use-66badaa0baa1?source=collection_archive---------2-----------------------

DeepFarm 概述

DeepFarm 是一家科技初创公司,正在寻求将深度学习应用于精准农业,以获得可操作的见解。这些见解将来自广泛的领域,包括水和能源使用、杂草控制、运营成本以及我们今天的主题——农药使用。在更大的范围内,DeepFarm 正在寻求发展成为一个端到端的系统,负责自动收集、处理、可视化和实现数据驱动的结果。

问题陈述

建立一个分类器,能够最好地预测给定食品样品中农药残留的实验室结果,以促进高效和安全的农药使用。

项目目标

在完成手头的问题时,我还想测试这个特定数据集的各种算法(传统的和高级的)的准确性和效率,并比较每个算法的业务用例。

数据

该项目使用的数据由美国农业部(USDA)采购,作为其农药数据计划的一部分,并发布到 Kaggle(链接如下)。该数据库(仅 2015 年,2013–2014 年也可用)包括约 230 万份实验室样本,总数据量为 89MB。我们的分类器的基线是 98.31%,因为所有样品中只有 1.69%被归类为农药残留超过可接受的阈值。尽管改善的幅度很小,但 1.69%的结果是大约 40,000 个样本超过了农药的可接受阈值,可能会对消费者造成健康后果。对这一基线的任何改进都会导致成百上千的样本被正确识别。

数据链接:https://www . ka ggle . com/usdeptofag/pesticide-DATA-program-2015

型号选择

对于传统模型,我选择使用逻辑回归和随机森林。这些代表了传统模型谱的极端,并将为与高级深度学习模型进行比较提供完整的基础。对于深度学习 3 层模型,我在隐藏层使用了 1024 个节点,dropout 为 0.5,ReLU 激活。

实施

逻辑回归和随机森林模型都使用 SciKit-Learn,神经网络是使用 TensorFlow 后端和 Keras 前端包装器构建的。

结果

正如我们从下面的幻灯片中看到的,随着模型复杂性的增加,准确性也在增加。然而,这种准确性是以时间为代价的,这一因素应由利益相关者根据具体情况进行评估。逻辑回归模型是我们的模型中最简单的,同时表现得相当好,并提供了最易于人类阅读的输出和对系数的访问。随机森林增加了额外的复杂性,输出只有树,但有增加我们的模型准确性的优势。我们的前馈神经网络与我们的随机森林具有相同的精度,但是我相信随着额外的数据和处理能力,这个结果可以增加到甚至更精确。

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

Model Results

从枪支法预测枪支死亡率:生命与自由之间的平衡是可以衡量的

原文:https://towardsdatascience.com/predicting-gun-death-rate-from-gun-laws-d96041c14198?source=collection_archive---------6-----------------------

当美国政府成立时,生命、自由和追求幸福被视为天赋人权。美国枪支法平衡了限制个人自由和保护个人生命。

以下是无可争议的:1。枪支法限制个人自由。枪支法拯救生命。没有理由浪费精力争论这些事实。相反,问题是,美国人将选择在哪里找到生命和自由之间的平衡,因为这是一个选择。

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

All data, code, and notes to replicate this analysis can be found on my GitHub repo

撇开游说者对枪支政策或枪支政策对犯罪的影响不谈,各州已经选择通过枪支法,这些法律代表了生命与自由连续统一体中的一系列观点。这里总结的分析不是一种观点,而是对一组复杂的相互作用的、可测量的因素和结果的描述,使用数学算法进行梳理。(按州和年份分类的枪支死亡率和枪支法计数)……中的数字…数字(增加或减少预测死亡率的枪支法律类别以及增加或减少多少)。

结果是一个横向树,描绘了预测的平均年枪支死亡率,这取决于它们在一个类别中拥有的法律数量。树中的每一个分割线都显示了一些法律子类如何增加或减少与枪支相关的死亡人数。从树的左侧开始,每 100,000 名州居民的平均枪支死亡率预测为 11.2,但对于在允许类别内有 4-8 项法律的州,它下降到 7.3。对于有 0-3 个许可法的州,比率增加到 12.7…等等。

特别及时的是年龄限制是否重要的问题。在某些情况下,有更多年龄限制的州(如州枪支法律项目码本所定义的)预计死亡率会低得多。具体来说,在有更多许可法但没有指纹法的州,通过实施更多年龄限制,死亡率预计将减半(4.3 比 9.7,最右边从上往下数第二和第三个框)。

数据:

波斯顿大学州枪支法律项目维护着一个数据库,其中记录了 1991 年至 2017 年间 133 个州枪支法律条款的状况,根据对枪支暴力的预期影响,由他们的法律研究团队分为 14 个类别和 49 个子类别。这是一个公开可用的资源,你也可以通过他们的交互式地图图表进行探索。我下载了他们按州和年份划分的有无枪支法律条款的数据集。

疾控中心的基本死因数据库按地区和年份对死亡证明死因进行了细分。我下载了每个州/年每 100,000 居民的原始死亡率,火器是死亡原因。这包括任何因枪支造成的死亡,无论是否意外,是否自残,是否与犯罪有关,但没有关于枪支类型、性别、年龄或情况的数据。

正如州枪支法项目警告的那样,由于枪支法本身不太可能是枪支死亡率的唯一决定因素,我进行了同样的分析,包括每个州/年的失业率,然后是每个州/年的加权人口密度,这两者都没有显著改变结果。在重复分析中,可能有其他因素(按州/年)可以提供信息,例如与枪支法更多或更少的州的接近程度。

总结平衡自由与生活的量化效果:

基于递归分割和回归树(RPART)分析,发现 49 个枪支法子类中的 10 个显著预测了州枪支死亡率的下降与上升,平均误差率为每 100,000 人 1.76 例死亡。预测的年平均死亡率是 11.2。从那里树分成两部分:上部和下部。

上半部分显示,在拥有 4-8 项许可法律(由州枪支法律项目码本定义)的州,该比率从 11.2 降至 7.3。其中,也有指纹法的州的比率预计会下降到 4.8;否则就涨到 9.0 了。如果没有指纹法,在 6-7 个年龄限制法的情况下,预测的比率从 9.0 下降到 4.3,但在 0-5 个年龄限制法的情况下,预测的比率增加到 9.7。

该树的下半部分从拥有 0-3 项许可法律的州开始,平均每年预计枪支死亡率为 12.7。对于有 2-8 个存储法则的州,这个比率可以降低到 9.5,否则,这个比率会增加到 13.3。预计在暴力轻罪子类别中有 1-3 项(任何)法律的州,这一数字将从 13.3 降至 10.6;如果没有,预测的比率将增加到 14.0。

再向右下方移动,在 2-3 个枪支贩运法律之间,这些州的预测比率从 14.0 下降到 10.8,但是对于 0-1 个枪支贩运法律的州,预测比率增加到 14.7。在家庭暴力限制令子类别中保留 4-11 项法律会将预测比率从 14.7 一直降低到 9.1,但如果这些州有 0-3 项这样的法律,比率会增加到 15.2。如果先占权子类别中有 2-3 项法律,这些州的预测比率将从 15.2 下降到 11.4,但如果有 0-1 项法律,预测比率将上升到 15.3。如果这些州在背景调查子类别中有 2-4 项法律,这一比率预计会稍微降低到 15.1,但如果有 0-1 项这样的法律,这一比率会上升到 17.6。对于那些有大量背景调查法律的州,预测的枪支死亡率在有 1-3 个(任何)经销商许可子类别法律的情况下从 15.1 下降到 13.6,在没有法律的情况下上升到 15.5。

以上三段是信息图存在的理由。向上滚动并查看树可能会更好。或者可以这样压缩:1 .枪支法限制个人自由。枪支法拯救生命。

感谢您的阅读。

我欢迎建设性的反馈。“鼓掌”表示赞同,在 FB、Twitter、Linkedin、Reddit 或任何地方分享,或者如果你有具体的回应或问题,请在这里给我发消息。我也有兴趣听听你想在未来的帖子中涉及哪些主题。如果您想要用于数据争论、特性工程和分析的数据和 R 代码,请派生或下载我的关联 GitHub 资源库。如果有人在添加可能影响结果的额外州/年变量后重复分析,那就太好了。如果有,请告诉我。

阅读更多关于我的作品【jenny-listman.netlify.com】。欢迎随时通过 Twitter@ jblistmanLinkedIn联系我。

数据和分析说明:

  1. 复制这一分析的所有数据、代码和注释都可以在我的 GitHub repo 上找到。去吧!
  2. 从州枪支项目下载了 1991 年至 2017 年美国各州 133 项枪支法律的存在或不存在:https://www.statefirearmlaws.org/table.html
  3. 法律的代码本及其类别、子类和解释可从国家火器法律项目的网站上下载:https://www.statefirearmlaws.org/download-codebook.html
  4. 美国疾病预防控制中心按州/年分列的死因火器数据下载自:https://wonder.cdc.gov/ucd-icd10.html使用过滤标准:州、年、受伤原因=火器。或者从我的 GitHub repo 下载吧。
  5. 使用 R 统计计算语言中的 rpart 包,输入变量包括由州枪支法项目编码的 49 个子类别中每一个子类别每年的法律总数,输出变量是每年每个州的年度原始枪支死亡率。输入变量被缩放,因为法律类别的大小变化很大。数据被分成训练集和测试集。通常,这是通过随机选择 20%的数据作为测试集,80%的数据作为训练集来完成的。然而,对于这个数据集,很可能存在给定年份的跨州相关性和给定年份的跨年相关性,或者每个小范围年份内的年间相关性。因此,数据集按奇数年或偶数年分成两组,每一组都按州进行了平衡,并消除了年初/近年的偏差。用典型的 20/80 随机分割完成的重复分析给出了令人难以置信的相似结果。
  6. 虽然我最终没有使用每年每个州的失业率或加权人口密度,但在我的 GitHub repo 中有数据集。我花时间获取它们,并把它们整理成整齐的格式,其他人可能会想要使用它们。2016 年各州失业数据来自美国劳工部,劳工统计局。截至 2015 年的失业率数据来自爱荷华州立大学,爱荷华社区指标计划下的“附加数据:下载 Excel 中的历史年度系列(1980-当前)”。他们已经汇编了美国劳工部那几年的数据,所以我不必这么做。加权人口密度数据是利用丹·戈尔茨坦在《决策科学新闻》的这篇文章中的代码获得的。

用机器学习预测视频游戏点击率

原文:https://towardsdatascience.com/predicting-hit-video-games-with-ml-1341bd9b86b0?source=collection_archive---------1-----------------------

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

Original image: http://kotaku.com

在这个项目中,我分析了 8K 视频游戏的销售数据,确定了与点击率(销量超过 100 万台的游戏)最相关的变量,并实现了一个预测模型来区分赢家和输家。奖金:2016 年有哪些游戏还能成为热门?

1.数据探索和分析

中值销售额(百万单位)与评论家得分

以下四幅热图显示了游戏销售如何根据评论家的评分而变化,这些评分分为六个评分组。此外,每个热图还根据以下特征之一进一步细分数据:流派、开发者、发行商和平台(按外观顺序)。

在每个热图下,我们确定了游戏销售最好的类别。这是为好的好的、好的游戏而做的,这些游戏分别由得分在 70、80 和 90 分的游戏定义。

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

  • 最畅销的游戏类型:赛车、动作
  • **好的*游戏卖得最好的流派:***平台、动作/射击
  • **流派哪里好的游戏卖得最好:**格斗,杂项

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

  • 谁的游戏卖得最好:任天堂,艺电
  • **开发商谁的游戏卖得最好:**任天堂,Namco
  • 谁的游戏卖得最好?

解读:在 伟大的 得分栏(最后),任天堂每场游戏的中值销售额(以百万台计)最高,为 460 万台。有趣的是,任天堂在 好的 好的 得分栏中也拥有最高的每场游戏中值销售额。

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

  • **销售优秀游戏最好的发行商:**微软游戏工作室,华纳兄弟互动娱乐公司
  • **卖游戏最好的发行商:**任天堂/华纳兄弟互动娱乐
  • **卖 okay 游戏最好的发行商:**任天堂,微软游戏工作室

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

  • 伟大的游戏卖得最好的平台: PS,X360
  • 好游戏卖得最好的平台: PS3,XOne
  • 游戏卖得最好的平台: PS3,X360

有趣的是,整个 PlayStation 产品线中的游戏销售似乎对高评论家分数非常敏感,特别是当中等分数范围的销售看起来与其他主机相当时(或至少表现出较窄的差距)。

数据集中的最高值

(按平台、开发商、发行商和流派)

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

数据集中游戏最多的平台

  1. PS2
  2. PS3

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

数据集中游戏最多的开发商:

  1. 育碧
  2. 艺电体育
  3. EA 加拿大

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

数据集中游戏最多的发行商:

  1. 电子艺术
  2. 动视
  3. 纳木错万代运动会

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

数据集中游戏最多的流派:

  1. 行动
  2. 运动
  3. 混杂的

数据集相关性

(用于数值和分类变量)

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

最强相关性:

  • 评论家评分与全球销售额之比 : 我们将在接下来的两个部分中进一步探讨这一点。
  • 发布到平台的年份 : 这很有意义,因为新平台会定期发布。

注意:分类栏(平台、流派、发行商)按照游戏数量的顺序转换为数字,如前一节所示。他们与全球销售的轻微负相关可以解释为“ID 号越高,则[平台、流派、发行商]越小,因此销售数字也就略低”。

评论家得分与全球销售额

(针对数据集中的所有年份)

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

有点乱,对吧?

我们将继续使用垃圾箱来更好地感受这种关系…

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

For years ≥ 2014

这种关系现在看起来清晰多了。有趣的是,斜率在 80 年代变得更陡。似乎一旦一个视频游戏获得了很高的批评分数,每增加一分都会产生更大的影响。例如,在 2014 年至 2016 年的子集里,评论家分数增加 8 分,似乎对 65 分起的销售额有大约 25 万英镑的积极影响,但对 77 分起的销售额有大约 100 万英镑的积极影响。 去大了还是回家吧?

将销量超过 100 万台的产品定义为热门产品

这将是我们预测模型中的目标,在这里我们将预测一个游戏是否会成功。目标是二进制的:如果命中则为 1,否则为 0。

以下是使用 5%样本的评论家分数和 VG 点击率之间的关系:

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

正如所料,点击率似乎大多出现在高评论分数附近,而非点击率在分数上可能有所不同,但在高分范围内开始失去存在(正如 70 年代附近的变陡回归曲线所解释的)。

2.预测模型

(用于预测给定游戏达到 100 万台或更高销量的可能性,称为“热门”游戏。分类方法被应用于从非命中中分离命中。)

生成特征和训练/测试分割

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

用 RFC 和 LR 测试预测精度

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

分级功能性能

**Feature ranking (top 10):**1\.  **Critic_Score** (0.323090)
2\.  **Year_of_Release** (0.158740)
3\.  **Publisher_Nintendo** (0.030405)
4\.  **Genre_Action** (0.024856)
5\.  **Publisher_Activision** (0.018035)
6\.  **Genre_Sports** (0.016918)
7\.  **Publisher_Electronic** Arts (0.016917)
8\.  **Genre_Shooter** (0.015722)
9\.  **Platform_PS3** (0.015634)
10\. **Publisher_Ubisoft** (0.014164)

3.2016 年哪些电子游戏还能成为热门?

最有可能成为热门的视频游戏:

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

最不可能成为热门的视频游戏:

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

Kaggle 笔记本(Python)可以在这里找到并随时在TwitterLinkedIn上找我。

如果你喜欢读这篇文章,如果你点击“推荐”按钮和/或分享它,我会很感激。

预测爱荷华州埃姆斯的房价

原文:https://towardsdatascience.com/predicting-home-prices-in-ames-iowa-3a247e6c9639?source=collection_archive---------5-----------------------

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

回归、正则化、残差和特征选择

Kaggle 最近在爱荷华州的 Ames 举办了一场旨在预测房价的比赛。你可以在这里了解更多信息。

在我的分析中,我避开了卡格尔关于预测销售价格的问题。相反,我想确定哪些功能最能增加房屋价值。这些数据包括地块大小、地块形状、邻居和其他你无法改变的房子特征。后半部分是关于某些方面的质量和状况。这些质量变量反映了房子中你可以在出售前翻新的部分(车库、厨房、整体)。

我问自己:房子的哪一部分可以改进,从而最大程度地提高价格?

我把这个问题分成三个部分:

  1. 固定的特征,如地段大小、房子的平方英尺和邻居,能在多大程度上解释销售价格。
  2. 在剩下的误差中,包含测量翻新的特征能解释多少呢?
  3. 在这些质量特征中,哪一个最能解释错误,哪一个最能提高销售价格?

这个分析的所有代码都可以在我的 GitHub repo 中找到

探索性数据分析

和所有好的项目一样,我探索了数据的特性。首先,销售价格。

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

该分布不完全是正态分布,但对于我们的模型来说,它足够接近了。与左侧相比,尾部继续向右侧延伸(显然不会有售价低于 0 美元的房屋)。这些高销售价格异常值将会在以后的分析中引起问题。

街区的平均价格显示了从上到下的明显差异。作为一个固定的模型,这是第一个模型中最重要的特征之一。

固定特征模型

使用线性回归,我发现固定特征解释了销售价格变化的 82%。不算太坏。然而,绘制实际销售价格与预测销售价格的对比图显示,非常昂贵的房屋的销售价格一贯高估。

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

这里的残差是实际价格和预测价格之间的差额。残差越大,模型就离正确预测越远。这里使用的线性模型试图减少所有数据点的残差。

再往深里看,也许我们并不需要所有这些功能。有可能其中一些只是噪音。

正则化是一种减少或消除不重要特征的影响并向模型中添加小误差项的方法。我执行了一个套索正则化方法,发现 10 个最有影响力的特征中有 7 个是邻域变量(每个邻域都有一个虚拟变量)。

在所有特征中,“邻居”是不可能改变的。对于我的第二个模型,我研究了翻新如何进一步解释销售价格

翻新模型

对于第二个模型,我包含了所有可以通过家庭装修来修复的特性。仅用这些模型,我发现它们解释了 74%的销售价格。同样,规则化表明虚拟变量“屋顶材料”和“厨房质量”变量解释了最大的差异。

然而,仔细观察“屋顶材料”的价值计数显示,只有 6 个家庭有木瓦,使得这个变量在最终分析中没有用,因为很少有家庭有木瓦。“厨房质量”值更多地分布在一般、典型/一般、良好和优秀之间。

组合模型

要了解“厨房质量”如何解释固定特征模型的误差,只需将该变量代入即可。模型的 R 平方从 0.82 增加到 0.85。换句话说,“厨房质量”解释了基于固定特征的模型中 19%的误差。

结论

“厨房质量”变量的贝塔系数(又名系数)显示了翻新会增加多少销售价格。与普通厨房相比,提升一个质量等级将会提高售价:

  • 优秀:65,884.53 美元
  • 好:17898.30 美元
  • 典型/平均 1,878.90 美元

当然,这个项目没有考虑装修的成本。如果你能以低于上面列出的价格升级一个不错的厨房,你会在销售谈判中得到更多。

欢迎评论和提问。所有代码和一些 powerpoint 幻灯片都可以在我的 GutHub repo 这里获得。

预测医院病床的可用性(部分。1)

原文:https://towardsdatascience.com/predicting-hospital-bed-availability-part-1-81d75649a18c?source=collection_archive---------5-----------------------

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

“MacBook Pro near black stethoscope and brown clipboard” by rawpixel on Unsplash

我们是塞利姆·阿姆鲁尼和 T2,目前是哥伦比亚大学运筹学的学生。如果您有任何问题,请随时通过电子邮件(塞利姆 / 蒂博)或我们的 LinkedIn ( 塞利姆·阿姆鲁尼 / 蒂博·杜普雷)账户与我们联系。

在这个 Medium 系列中,我们将于 2018 年夏天在 NYU 朗格健康展示我们作为研究实习生的工作。

本文(部分。1)将着重于问题的一般陈述和医院流程的描述。

部分。2 将关注用于预测医院入住率的模型。所以,这里我们进入项目的核心!

实习概述

“预测未来 72 小时内医院床位的可用性…”

医院病床占用率的容量规划、预测和优化是一个热门领域。目标提升操作流程提高效率****保健行业。一些医院,如辛辛那提儿童医院和耶鲁纽黑文医院,由于容量规划已经改善了他们的运营系统。****

作为世界大城市纽约的一家医院,纽约医疗中心经历了几次床位短缺。这些情况非常烦人这就是为什么提前预测床位占用然后使用这些预测优化患者安置是一个有趣且有用的问题。****

我们的目标是预测未来 72 小时(每天)的床位可用性。
随着数据的到来,模型必须重新校准:我们不知道今天会发生什么,但明天我们就会知道发生了什么,所以模型必须不断地用更新的数据重新拟合它的预测。****

综合换乘中心

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

“white airplane in sky above body of water” by kazuend on Unsplash

“医院控制塔”

综合转运中心 (CTC)是一个由十几个成员组成的团队,管理 整个 NYU 朗格健康的所有患者流动活动。它与领导和员工以及跨学科团队合作,管理 NYU 朗格健康中心内部和内部的转移。
CTC 比作医院的
【控制塔】。这个团队每天都在做着一项惊人的工作,以确保 NYU 所有床位设施的完善 管理。****

医院组织

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

Tisch Hospital

NYU 兰贡拥有 200 个地点,其中 6 个护理住院病人。本项目的范围仅限于的 3 个住院单位: Tisch 医院、 Kimmel 馆&hassen feld儿童医院。
在进一步深入之前,我们首先需要定义一个
护理单元(NU)** 。阿奴是医院的一个**物理细分。每个 NU 对应一个护士台。****

我们的项目粒度处于 NU 级别:我们需要预测每个 NU 内的可用性。

项目范围统计在 562 床位左右,分布在 21 个 NU 中,每个 NU 又根据护理级别的不同细分为 3 级:(从最低到最高)急性,阶梯式&重症监护。因此,患者可以根据他们的服务和他们需要的护理级别进行分配。通常,有三至四个 NUs 可用,安置旨在提高医院的运作效率。

医院病人流量

为了预测床位需求,重要的是了解医院的患者流量**。首先我们需要创建一个简单的方案来了解某个患者可以处于哪种状态。这个方案可以很容易地用数学建模,并用历史数据进行调整。**

下图说明了我们为研究选择的医院的简化机制。真实的图表更复杂,但在我们的项目范围内,所引起的变化可以忽略不计。

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

Diagram of the patients flow

入口两种 **种患者**:预约**(在医院预约的,主要是手术)和非预约**(主要是急诊)。这些病人在医院员工看过之后,可以占用一张病床,也可以不占用一张病床,成为住院病人,直到出院。由于该项目的目标是预测床位的可用性,没有占用床位的患者不在考虑范围内。****

为了估计未来床位的可用性,我们需要区分以下情况:

  • 当前住院患者:我们可以访问住院患者的当前快照,基于此数据,我们希望为每位住院患者分配特定的住院时间(LoS)。
  • 即将安排的:我们可以查看下一次手术的时间表。我们有一些关于这些“预定”病人的信息。根据该时间表,我们将尝试调整预定住院病人的数量,并为他们分配一个服务点。
  • 即将到来的计划外的:这些病人天生就是随机的。根据历史数据,我们将尝试对急诊室即将到来的患者进行抽样调查。通过这些模拟,我们希望调整非预定住院病人的数量,并为他们分配一个服务点。

模型框架

投入

使用了四个数据集来源:

  • 当前普查:是拉出来的那一刻医院所有住院病人的快照。
  • 流量:这是最近两个月流量的数据集,对历史数据进行统计很有用。
  • 或时间表:这是一个时间表,我们可以访问 15 天内即将到来的手术,我们可以访问护理强度、药物类型和手术时间。NU 尚未分配。
  • 安置矩阵:这是一个由 CTC 团队经常更新的矩阵,将特定类型的药物和护理级别与 NU 相关联。

输出

输出是小的表格用于每个护理单元分成三个 不同的 来源:“预定的”、“非预定的”和“当前住院病人”,可以很容易地汇总。表格的列分隔六个时隙。每个时间段代表 12 个小时(主要是上午和下午)。时间线从今天凌晨 0:00 开始,到明天中午 12:00 结束。表格中的行分隔了每个时间段 NU 中的入院、出院和患者总数(来自所考虑的来源)。

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

Example of an output for the unit xxx, sourced with the unscheduled patients (the name of the unit is masked for non-disclosure agreement)

汇总三个来源

为了有一个特定 NU 的接下来 72 小时的预测,忽略来源,我们只需对来自三个来源的求和。如果我们想要完整位置(Tisch 医院、Kimmel Pavillon 或 Hassenfeld 儿童医院)的预测,我们只需对相应 NU 的表求和。****

结论

瞧啊。在第一部分中,您有机会了解了医院、CTC 组织和管理以及对我们模型的介绍。在接下来的文章中,我们将更深入地研究模型的每个部分,使用单词距离使程序对人类输入具有鲁棒性,模拟未安排的患者,构建图形用户界面以及我们改进工具的思考。

请跟随我们并保持关注…

预测医院病床的可用性(部分。2)

原文:https://towardsdatascience.com/predicting-hospital-bed-availability-part-2-4ebf1c037df1?source=collection_archive---------5-----------------------

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

“woman showing man laptop” by rawpixel on Unsplash

我们是塞利姆·阿姆鲁尼和 T2,目前是哥伦比亚大学运筹学的学生。如果您有任何问题,请随时通过电子邮件(塞利姆 / 蒂博)或我们的 LinkedIn ( 塞利姆·阿姆鲁尼 / 蒂博·杜普雷)账户与我们联系。

在这个 Medium 系列中,我们将于 2018 年夏天在 NYU 朗格健康展示我们作为研究实习生的工作。

部分。1 是关于问题的一般陈述和医院流程的描述。

本文(部分。2)将集中于用于预测医院占用率的模型。所以,这里我们进入项目的核心!

住院病人模型

初步的

住院病人已经进入 NYU 朗格医疗机构。正如他们已经承认的那样,唯一的目标预测他们的出院日期。然后,通过合计每个 NU 内的出院人数,我们可以检索 NU 内的患者人数。

每天预测患者的剩余 LoS 是多少

可以实施两种方法来预测患者的出院情况。首先,我们可以尝试直接预测患者入院时的损失(例如:3 天、4 天……)。然而,患者的出院是非常不可预测的,并且估计的出院日期在患者护理过程中会改变几次。事实上,患者的身体反应是不确定的,没有人确切知道患者将停留多久,未来的治疗将是什么,等等。因此,第二种方法是每天预测患者的剩余 LoS** 是什么。这是我们采取的方法。**

同样,预测****排放日期既可以看作是回归也可以看作是分类问题。

由于 CTC 团队要求的粒度,我们选择了分类方法。

回归问题中,目标是预测在医院的正确剩余时间量。然而,由于 CTC 团队要求的粒度,我们选择了分类方法。事实上,从运营的角度来看,重要的是了解医院每天的入住情况,但他们并不关心出院的确切时间。在与团队进行了几次审查后,除了当天,我们意识到他们需要知道的一个重要信息放电是否会在中午(下午 12:00)之前发生。事实上,在中午之前知道一张床是否是排放物** (DBN)使得团队能够在下午直接重新确定这张床的属性。这样,就不会出现病人在夜间入住的床位不足的情况。这就是为什么我们把回归问题变成了分类问题。我们将时间分成 7 个 12 小时的时间段,从**“0–12 小时”“+72 小时”。例如,如果患者属于“24–36h”类别,这意味着他的剩余 LoS 在 24 到 36 小时之间。这样,预测医院住院人数的问题就变成了一个监督七类分类问题**。**

使用的功能

用于这项任务的数据集是当前的人口普查。这是医院的快照,有大约 200 个特征。但是,由于过去数据中未来数据的数据泄漏(患者的过去数据被最后的条目覆盖),我们无法使用这些功能。有希望的是,在与 it 团队的几次会议后,由于他们惊人的工作,我们开始每天四次捕获和存储当前的人口普查数据集。因此,我们希望能够在今后的工作中尝试和检验我们的方法。

乍一看,因为我们无法访问历史数据,所以我们只能为我们的住院病人模型使用一个特性:医生给出的估计出院数据。事实上,医生在其每日患者巡视期间更新患者的估计出院日期。

数据的处理

给定医生估计的出院日期和当前时间,我们可以计算患者的剩余住院时间。然后,知道了病人将停留的剩余时间,我们可以将每个病人归属于它所属的类别。最后一步是在每个 NU 内计算属于每个类别的患者数量,以便了解出院人数。

结果

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

Scatter Plot of the Actual vs. Expected Remaining LoS

实际剩余 LoS 与预期剩余 LoS 的散点图显示了医生预测的**低效率。**基于这种观察,我们试图开发一种监督学习分类算法。

预定模型

放置矩阵

安置矩阵为 NU 指定一种医疗类型和一个护理级别。

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

First rows of the Placement Matrix (details have been blurred for non-disclosure agreement)

我们可以看到在某些情况下有 NU ( 1),2) …)的列表。这描述了 NU 填充的顺序,如果“1”已满,则将患者放在“2”中,以此类推。我们还可以观察到,有时根据外科医生的团队或一天的类型(工作日、周末或假日),位置会发生变化。

我们必须解读原始文本…

格式不是以为是机器使用而是被人类雇员使用。我们不得不解读原始文本。有时,同一 NU 的名称会有些不同。我们需要找到一种方法来解决这些困难,我们不能为特定的布局矩阵编码一个简单的映射。事实上,布局矩阵经常变化,我们需要执行一个算法 对这些变化具有鲁棒性。

…使用单词距离…将 ch1 转换为 ch2 所需的最少数量的基本运算

我们决定列出 NU 的未更改名称,然后使用单词距离将放置矩阵建议的 NU 与列表中距离最小的 NU 相关联。为此,我们使用了以下距离:设 ch1ch2 为两个字符链。 ch1ch2 标注为 D(ch1,ch2) 的距离是ch1 转换为 ch2 所需的ch1 的最小基本运算次数。有三种基本操作:****

  • 互换两个角色(1)(例如:狗→上帝)
  • 插入一个字符(2)(例如:上帝→黄金)
  • 删除一个字符(3)(例如:黄金→旧)

例如D(“”、“手套”)= 5:

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

How to calculate the distance between ”dog” and “glove”

这个距离的灵感来自于著名的莱文斯坦距离。我们增加了操作互换。在我们的例子中,字符链实际上是句子。如果两个句子中的单词相似但顺序不同,则互换具有灵活性。我们可以注意到距离验证了距离的最广泛的数学定义:

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

Definition of a distance

结果非常令人满意,没有一个 NU 的名字被错误地映射。

承认

一旦我们能够正确处理位置矩阵,承认是简单的。我们选择了这样的假设,即患者 在其手术之后的时间段进入 他的 NU。我们做这个选择是为了考虑手术的长度和在 PACU 的时间。例如,如果患者被安排在明天下午,因此在时间段“36-48 小时”,我们将假设他将在时间段“48-60 小时”到达他的 NU。

排放

由于我们还没有关于该患者的任何其他信息(他还没有住院),我们不能以令人满意的准确性影响他。根据他的《怒》,我们可以根据史料
下图给出了每个单位患者的平均损失:

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

The average LoS for each unit (details have been blurred for non-disclosure agreement)

非计划模型

对于计划外的患者,我们需要使用历史数据对急诊室中的到达者进行采样。

承认

原理很简单,在关于病人出院的数据中,我们可以推导出每天的平均到达人数,考虑到一周中的某一天- 季节性。下图给出了这种特殊季节性的精确值。由于一年中的一段时间(有一些高峰,尤其是在夏季或冬季)造成的季节性应该被直接考虑在内。事实上,我们只考虑了过去两个月的出院数据。因此统计使得只考虑当年的当前 期间

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

Day-of-the-week-seasonality for the unscheduled arrivals

我们需要模拟今天、明天和后天

一旦我们对这些天进行了统计,我们就知道今天、明天和后天我们需要模拟多少计划外的患者。我们甚至更精确:我们考虑是上午还是下午来正确地填充我们的时间段。
然后,如果我们知道我们必须对特定时间段内的" n “非预定到达进行采样,我们也可以分配给这个” n "不同的患者和 NU。我们利用历史数据完成了这项任务,下图说明了非计划到达的 NU 份额。基于这种分布,我们可以很容易地对计划外患者进行抽样(这只是一种多项分布)。我们使用这个模型来填充急诊室到达的输入。

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

The distribution of the NU concerning the unscheduled arrivals (details have been blurred for non-disclosure agreement)

排放

正如我们对预约患者所做的那样,我们对非预约患者的 LoS 进行了抽样。然后我们可以推导出不定期到达的出院日期。

现在,CTC 团队已经将软件全部设置好了…

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

Graphic interface we made in order to facilitate the use for non-technical people

结论

瞧啊。在第二部分中,您有机会深入了解我们为项目构建的模型。在接下来的文章中,我们将进入更奇妙、更吸引人的数学领域来改进这个模型。

请跟随我们并保持关注…

入院时预测住院时间

原文:https://towardsdatascience.com/predicting-hospital-length-of-stay-at-time-of-admission-55dfdfe69598?source=collection_archive---------4-----------------------

探索一个重要的医疗保健绩效指标

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

Photo by Hush Naidoo on Unsplash

项目概述

预测分析是医疗保健领域日益重要的工具,因为现代机器学习(ML)方法可以使用大量可用数据来预测患者的个体结果。例如,ML 预测可以帮助医疗保健提供者确定疾病的可能性,帮助诊断,推荐治疗方法,以及预测未来健康。在这个项目中,我选择关注医疗保健的物流指标,医院住院时间 (LOS)。LOS 定义为入院到出院之间的时间,以天为单位。

美国医疗系统每年至少花费3775 亿美元,最近的医疗保险立法规范了手术费用的支付,不管病人在医院呆了多少天。这激励医院在入院时识别具有高 LOS 风险的患者。一旦确定,具有高 LOS 风险的患者可以优化他们的治疗计划,以最小化 LOS 并降低获得医院获得性疾病(如葡萄球菌感染)的机会。另一个好处是事先了解 LOS 可以帮助后勤工作,如房间和床位分配计划。

问题陈述

这个项目的目标是建立一个模型,预测每个病人入院时的住院时间。

我最初的想法是,使用随机森林或梯度树增强集成方法会产生最好的结果。其原因是集成方法结合了多种学习算法,以获得比单一算法更好的预测性能,并经常用于 Kaggle 竞赛。然而,第一步是找到合适的数据集。

作为寻找数据的起点,我的直觉是,数据集应该理想地包括诸如患者的诊断类别(例如,心脏病、分娩、受伤/中毒等)的特征。)、年龄、性别、婚姻状况和种族。在搜索了一个有用的医疗数据库后,我最终选择了 MIT MIMIC-III 数据库,因为它拥有大量的信息。模拟描述如下:

MIMIC 是由麻省理工学院计算生理学实验室开发的一个公开可用的数据集,包含与大约 40,000 名重症监护患者相关的去身份健康数据。它包括人口统计,生命体征,实验室检查,药物治疗,等等。

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

顺便提一下,进入 MIMIC 需要参加的研究道德与合规培训课程,并填写的研究申请表。我发现的唯一明显的缺点是数据库不包括儿科信息(2-13 岁)。

为了预测医院服务水平,需要将模拟数据分为因变量(在本例中为住院时间)和自变量(特征),作为模型的输入。由于 LOS 不是一个分类变量,而是一个连续变量(以天为单位),因此将使用回归模型进行预测。很可能(事实证明是这样的)数据需要大量的清理和特征工程,才能与学习模型兼容。对于这个项目,我使用了 Python 的 Pandasscikit-learn 库。

韵律学

该项目的预期结果是开发一个模型,该模型在预测医院损失方面优于中位数和平均损失的行业标准。中值损失简单来说就是过去入院的中值损失。类似地,医疗保健中第二个常用的指标是平均值,或平均 LOS。为了衡量性能,我将使用均方根误差(RMSE)将预测模型与中值和平均 LOS 进行比较。RMSE 是一种常用的度量模型预测值和观测值之间差异的方法,分数越低表示精确度越高。例如,一个完美的预测模型的 RMSE 应该为 0。这项工作的 RMSE 方程如下所示,其中(n)是住院记录的数量,(y-hat)是预测的服务水平,(y)是实际的服务水平。

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

最终目标是开发一种预测模型,该模型的 RMSE 低于平均模型或中值模型。

有许多回归模型可用于预测 LOS。为了确定这项工作的最佳回归模型(将被评估的模型子集),将使用 R2 (R 平方)评分。R2 是对模型拟合度的度量。换句话说,它是因变量中方差的比例,可以从自变量中预测出来。R2 定义为以下等式,其中( y_i )是观察数据点,( ŷ )是观察数据的平均值,( f_i )是预测模型值。

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

最佳可能的 R2 分数是 1.0,负值意味着它比常数模型差,在这种情况下是平均值或中值。

数据探索和特征工程

在多次重复查看 MIMIC 数据库中各种表格的内容后,我最终选择了以下表格,并使用 Pandas 将它们加载到 DataFrames 中: *ADMISSIONS.csv、PATIENTS.csv、DIAGNOSES _ ICD.csv、*和 ICUSTAYS.csv.

入院表给出了 SUBJECT_ID(唯一的患者标识符)、HADM_ID(住院 ID)、ADMITTIME(入院日期/时间)、DISCHTIME(出院时间)、DEATHTIME 等信息。该表有 58,976 个入院事件和 46,520 个不同的患者,这似乎是进行预测模型研究的合理数据量。首先,我通过获取每一行的入院和出院时间之间的差异创建了一个住院时间列。我选择删除有负损失的行,因为这些是患者在入院前死亡的情况。此外,我发现 9.8%的入院事件导致了死亡,因此我删除了这些事件,因为它们不包含在典型的 LOS 指标中。就天数而言,服务水平的分布是右偏的,中位数为 10.13 天,中位数为 6.56 天,最大值为 295 天。

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

对于录取种族栏,有 30 多个类别可以很容易地减少到下面显示的五个。有趣的是,亚洲类别具有最低的数据集中位数 LOS。

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

对于宗教,我把名单缩减为三类得不到(录取 13%】宗教(录取 66%),或者不指定(录取 20%)。无法获得的组具有最低的中值 LOS。

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

入院人数减少到四类:急症、新生儿、急诊、择期新生儿的平均 LOS 最低,而紧急护理类别的平均 LOS 最高。选择性招生有一个更紧密的分布,有利于较低的损失,这是有道理的,因为这种情况的严重性通常是时间不太关键。

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

这个数据集有一个有趣的见解,表明自费(通常意味着免费)入院比其他保险类别的 LOS 短得多。医疗保险和医疗补助占据最高的中位 LOS 位置,这可能与这些系统中患者的年龄有关。

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

患者表提供了不确定的出生日期和性别信息。因为模拟数据集不提供真实的出生日期来保护患者的身份,所以我需要使用以下解码器来设计年龄特征:患者的年龄由他们出生的“出生日期”和他们第一次入院的日期之间的差异给出。考虑到这一点,我合并了患者入院数据帧,并使用 pandas‘group by’来提取每个患者的首次入院时间。

df[[‘SUBJECT_ID ‘,’ ADMITTIME’]]。groupby('SUBJECT_ID ')。最小()。重置索引()

在计算了出院时间和第一次入院时间之间的差异后,我可以看看患者的年龄分布。需要注意的是,89 岁以上的患者在 MIMIC 中被归入同一年龄组。

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

尽管新生儿患者数据包含在模拟数据集中,但儿科年龄不包含在内。为了给年龄分布图增加一个维度,我观察了 LOS 与年龄的关系。该图突出了新生儿和> 89 岁老人的模拟组,其中从 20 岁到 80 岁的住院人数不断增加。由于年龄极值的数据分布类似离散,我决定将所有年龄转换成类别新生儿、年轻成人、中年、老年人,以便在预测模型中使用。

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

诊断 _ICD 表在特征工程方面提供了最大的挑战。该表由患者和入院 id 以及 ICD9 代码组成,描述如下(来源):

国际疾病分类,临床修改(ICD-9-CM)是由美国国家卫生统计中心(NCHS)创建的改编,用于分配与美国住院病人、门诊病人和医生办公室使用相关的诊断和程序代码。

我本可以为每个代码创建虚拟变量,但是在这种情况下没有意义。在模拟数据集中使用了 6,984 个独特的代码,对患者进行了 651,047 次 ICD-9 诊断,因为大多数患者被诊断患有不止一种疾病。查看表格,您可以看到 ICD9_CODE 列代码采用了可变字符长度的方法。

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

经过一番调查,我发现真正的代码语法是三位数字后跟一组子类别的小数。例如,第一行的代码是 403.01,属于循环系统的疾病范围,而. 01 值进一步指定了高血压慢性肾脏及相关疾病*。此外,我注意到 ICD-9 有 17 个主要类别,所以我决定将每个入场的唯一代码分类到这些类别中。我的推理是,将 ICD-9 代码从 6984 个减少到 17 个会使 ML 模型更容易理解。此外,我不希望任何 ICD-9 代码只有一个单一的损失目标行,因为这将使培训/测试复杂化。最后,我将排序 ICD-9 代码转换为入院-ICD9 矩阵,对每个入院的诊断进行分组,并将新列与 HADM_ID(入院 ID)上的主入院数据帧合并。您可以看到每一行(入院)都包含多个诊断,这是应该的。*

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

Part of the admission-ICD9 category matrix

查看每个 ICD-9 超级类别的中值 LOS,可以看到妊娠皮肤诊断代码组之间令人印象深刻的差异。正如后面将要显示的,诊断类别是预测 LOS 的最重要的特征。

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

数据预处理

即使在完成了 age 和 ICD-9 的特征工程之后,在将数据用于预测模型之前,仍有一些遗留问题需要整理。首先,我确保没有导致死亡的入院是被清理数据集的一部分。我删除了所有未使用的列,并验证了数据中不存在 nan。对于入院类型保险类型、宗教、种族、年龄、婚姻状况列,我执行了 Pandas get_dummies 命令,将这些分类变量转换成虚拟变量/指示变量。最终的数据帧大小产生 48 个特征列和 1 个目标列,条目计数为 53,104。

预测模型

为了实现预测模型,我使用 sci kit-learntrain _ test _ split函数将 LOS 目标变量和特征以 80:20 的比例分成训练集和测试集。

X_train,X_test,y_train,y _ test = train _ test _ split(features,
LOS,test_size = .20)

使用训练集,我使用默认设置拟合了五个不同的回归模型(来自 scikit-learn 库),然后比较了测试集上的 R2 分数。GradientBoostingRegressor 以大约 37%的 R2 分数赢得了测试集,所以我决定专注于改进这个特定的模型。由于 RandomForestRegressor 过去的成功,我尝试了该模型的参数,但从未超过 GradientBoostingRegressor 的分数。

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

为了改进 GradientBoostingRegressor 模型,我使用了 scikit-learn 的 GridSearchCV 函数来测试各种参数排列,如 n_estimatorsmax_depthloss 。GridSearchCV 的最佳估计结果是 n_estimators =200, max_depth =4,以及 loss =ls。这导致了一个小的改进,测试集的 R2 分数大约为 39%。

结果

在查看 RMSE 基准之前,我想调查在使用梯度推进回归模型预测住院时间时,什么特征是最重要的。与产前问题相关的诊断具有最高的特征重要性系数,其次是呼吸伤害。正如我前面提到的,ICD-9 诊断类别是迄今为止最重要的特征。事实上,在前 20 大特色中,只有急诊入院类型、性别医疗补助保险显示出诊断组之外的重要性。

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

在指标部分,我说明了 RMSE 将用于比较预测模型与行业标准的平均和中值 LOS 指标。与常数平均值或中值模型相比,梯度推进模型 RMSE 要好 24%以上(百分比差异)。

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

虽然 RMSE 的趋势很有希望,但我也想从其他一些角度来评估这个模型。下图取自测试集中的前 20 个录取,并直接比较实际、预测(梯度推进模型)、平均值和中值 LOS 值。这给出了预测模型的更复杂的情况;在某些情况下,它预测得很好,但在其他情况下就不那么好了。然而,基于 RMSE 评分,预测模型通常仍将比使用中值或平均 LOS 更准确。

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

我想看这个模型的最后一种方式是,绘制测试集中准确预测的比例与允许误差的比例。其他研究将一个 LOS 预测视为正确如果它落在一定的误差范围内。因此,随着误差容限的增加,所有模型的准确预测的比例也应该增加。梯度推进预测模型在高达 50%的误差范围内比其他常数模型表现得更好。

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

结论

MIMIC 数据库提供了与医疗入院相关的惊人的深度和细节,这使我能够创建一个医院住院时间预测模型,该模型考虑了许多有趣的输入特征。这项工作最令人惊讶的方面是,在预测住院时间时,患者的 ICD-9 诊断如何发挥比年龄更重要的作用。到目前为止,这个项目最具挑战性的方面是将 ICD-9 诊断转化为更实用和更易解释的超级范畴的特征工程。然而,这也是未来改进的最明显的领域。鉴于诊断具有如此强的特征重要性,对主要的 ICD-9 分类进行额外的细分是否会产生更好的预测模型是值得评估的。我的理论是,只要数据集中有足够的入院记录来支持合理的诊断模型训练,通过这种优化,预测模型将变得更准确(更低的 RMSE)。

这个项目的 GitHub 库可以从这里获得一个 Jupyter 笔记本,它详细描述了这篇文章中探索的所有部分。

MIMIC-III,一个免费的重症监护数据库。Johnson AEW,Pollard TJ,Shen L,Lehman L,Feng M,Ghassemi M,Moody B,Szolovits P,LA 和 Mark RG。科学数据(2016)。DOI:10.1038/sdata . 2016.35。来自:http://www.nature.com/articles/sdata201635

使用 Scikit-Learn 使用机器学习预测糖尿病患者的再入院

原文:https://towardsdatascience.com/predicting-hospital-readmission-for-patients-with-diabetes-using-scikit-learn-a2e359b15f0?source=collection_archive---------4-----------------------

让我们使用机器学习来识别有再次入院风险的患者!

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

介绍

随着医疗保健系统转向基于价值的护理,CMS 创建了许多项目来提高患者的护理质量。其中一个项目叫做“减少医院再入院项目”( HRRP ),该项目减少对再入院率高于平均水平的医院的报销。对于那些目前在该计划下受到处罚的医院,一个解决方案是制定干预措施,为再入院风险增加的患者提供额外的帮助。但是我们如何识别这些病人呢?我们可以使用数据科学中的预测模型来帮助确定患者的优先顺序。

一个住院和再住院风险增加的患者群体是糖尿病患者。在美国,糖尿病是一种影响大约十分之一患者的医学疾病。根据奥斯特林等人的研究,糖尿病患者住院的几率几乎是普通人群的两倍(奥斯特林等人 2017 )。因此,在本文中,我将重点预测糖尿病患者的再入院。

在这个项目中,我将演示如何使用以下步骤在 Python 中建立一个预测再入院的模型

  • 数据探索
  • 特征工程
  • 构建培训/验证/测试样本
  • 型号选择
  • 模型评估

你可以跟随我的 github(【https://github.com/andrewwlong/diabetes_readmission】)上提供的 Jupyter 笔记本。

项目定义

预测糖尿病患者是否会在 30 天内再次入院。

数据探索

这个项目中使用的数据最初来自 UCI 机器学习知识库(链接)。该数据包括 1999 年至 2008 年间美国 130 家医院超过 100000 例住院的糖尿病患者。

在这个项目中,我们将利用 Python 来构建预测模型。让我们从加载数据和研究一些列开始。

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

简而言之,浏览数据列,我们可以看到有一些标识列、一些数字列和一些分类(自由文本)列。下面将更详细地描述这些列。

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

有些缺失的数据用问号(?).我们将在特性工程部分处理这个问题。

这里最重要的一栏是readmitted,它告诉我们患者是在 30 天内住院、超过 30 天还是没有再次入院。

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

另一个重要的列是discharge_disposition_id,它告诉我们病人住院后去了哪里。如果我们查看 UCI 提供的 IDs_mapping.csv,我们可以看到 11,13,14,19,20,21 与死亡或临终关怀有关。我们应该从预测模型中移除这些样本,因为它们不能被重新接纳。

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

现在让我们为二元分类定义一个输出变量。在这里,我们将尝试预测患者是否有可能在出院后 30 天内再次入院。

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

让我们定义一个函数来计算 30 天内再次入院人口的患病率。

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

大约 11%的人口再次住院。这代表了一个不平衡的分类问题,所以我们将在下面解决这个问题。

从对列的进一步分析中,我们可以看到分类(非数字)和数字数据的混合。有几件事需要指出,

  • encounter_id 和 patient_nbr:这些只是标识符,不是有用的变量
  • 年龄和体重:在这个数据集中是分类的
  • 入院 _ 类型 _id,出院 _ 处置 _id,入院 _ 来源 _id:在这里是数字,但都是 id(见 IDs_mapping)。它们应该被认为是绝对的。
  • examide 和 citoglipton 只有 1 个值,所以我们不会使用这些变量
  • diag1、diag2、diag3 是分类的,有很多值。我们将不会使用这些作为这个项目的一部分,但你可以分组这些 ICD 代码,以减少维度。我们将使用 number _ diagnoses 来获取一些信息。
  • medical _ speciality 有许多分类变量,因此我们在制作特征时应该考虑这一点。

特征工程

在本节中,我们将为预测模型创建特征。对于每个部分,我们将向数据帧添加新的变量,然后跟踪我们希望使用数据帧的哪些列作为预测模型特征的一部分。我们将把这一部分分解成数字特征、分类特征和额外特征。

在这个数据集中,缺失的数字被打上了问号。让我们用一个 nan 表示来代替它。

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

数字特征

最容易使用的特征类型是数字特征。这些特征不需要任何修改。我们将使用的数字列如下所示

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

让我们检查一下数字数据中是否有缺失值。

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

分类特征

我们要创建的下一类特征是分类变量。分类变量是非数字数据,如种族和性别。要将这些非数字数据转换为变量,最简单的方法是使用一种称为 one-hot encoding 的技术,下面将对此进行解释。

我们将处理的第一组分类数据是这些列:

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

在我们的分类特征中,racepayer_codemedical_specialty有缺失数据。由于这些是分类数据,最好的办法是使用“fillna”函数为 unknown 添加另一个分类类型。。

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

注意medical_specialty 没有包含在上面的列表中,因为我们需要多做一个处理步骤。在我们开始一键编码之前,让我们先研究一下医学专业。

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

我们可以看到,其中大多数是未知的,而且数量下降得相当快。我们不想增加 73 个新变量,因为其中一些只有很少的样本。作为替代,我们可以创建一个只有 11 个选项的新变量(前 10 个专业,然后是另一个类别)。显然,还有其他的分桶选项,但这是减少可能类别数量的最简单的方法之一。

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

为了将我们的分类特征转换成数字,我们将使用一种称为一次性编码的技术。在一次性编码中,您为该列中的每个唯一值创建一个新列。如果样本具有唯一值,则该列的值为 1,否则为 0。例如,对于列 race,我们将创建新列(“race_Caucasian”、“race_AfricanAmerican”等)。如果患者的种族是高加索人,则患者在“种族 _ 高加索人”栏下得到 1,在其余种族栏下得到 0。要创建这些一次性编码列,我们可以使用 pandas 提供的get_dummies功能。

现在的问题是,如果我们为每个唯一值创建一列,我们就有了相关的列。换句话说,一列中的值可以通过查看其余列计算出来。例如,如果样本不是非洲裔美国人、亚洲人、加拿大人、西班牙人或其他人,那么它必须是 UNK 人。为了处理这个问题,我们可以使用drop_first选项,它将删除每一列的第一个分类值。

get_dummies 功能不适用于数字数据。为了欺骗get_dummies,我们可以将 3 个 ID 类型的数字数据转换成字符串,然后它将正常工作。

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

现在我们准备好制作我们所有的分类特征

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

要将独热编码列添加到数据帧中,我们可以使用concat 函数。确保使用 axis = 1 来表示添加列。

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

让我们保存分类数据的列名来跟踪它们。

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

额外功能

我们想要制作的最后两个专栏是ageweight。通常,您会认为这些是数字数据,但它们在该数据集中是分类的,如下所示。

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

一种选择是创建如上所示的分类数据。由于这些值有一个自然的顺序,将它们转换成有序的数字数据可能更有意义。另一个例子,当你想这样做的时候,可能是 t 恤的尺寸(小号,中号,大号)。先说年龄。

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

让我们将这些映射到 0 到 90 乘 10s 的数值数据。

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

现在我们来看看重量。请注意,此功能不经常填写。

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

让我们创建一个变量来表示是否填写了权重,而不是像上面那样创建一个序数特征。不管值是多少,变量的存在都可能是预测性的。

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

让我们也跟踪这些额外的列。

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

特征工程:概述

通过这个过程,我们为机器学习模型创建了 143 个特征。这些功能的细分如下

  • 8 个数字特征
  • 133 个分类特征
  • 2 个额外功能

让我们创建一个只有特性和OUTPUT_LABEL的新数据帧。

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

构建培训/验证/测试样本

到目前为止,我们已经研究了我们的数据,并根据分类数据创建了特征。现在是我们拆分数据的时候了。分割数据背后的想法是,这样你就可以衡量你的模型在看不见的数据上做得有多好。我们分成三个部分:
—训练样本:这些样本用于训练模型
—验证样本:这些样本来自训练数据,用于决定如何改进模型
—测试样本:这些样本来自所有决策,用于衡量模型

的综合性能。在这个项目中,我们将分成 70%的训练、15%的验证和 15%的测试。

我喜欢做的第一件事是使用sample打乱样本,以防出现某种顺序(例如,所有阳性样本都在顶部)。这里的n是样品的数量。random_state只是被指定,所以该项目是可复制的。在你自己的项目中,你不一定需要random_state

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

我们可以再次使用sample提取 30%的数据(使用frac)用于验证/测试分割。重要的是,验证和测试来自相似的发行版,这种技术是实现这一点的一种方式。

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

现在使用 50%的分数分为测试和验证。

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

注意.drop只是删除了df_test中的行,以获取不属于样本的行。我们可以用同样的方法获得训练数据。

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

在这一点上,让我们检查一下 30 天内住院的组的百分比。这就是所谓的流行。理想情况下,这三组人群的患病率相似。

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

每个群体的患病率大致相同。

此时,您可能会说,将训练数据放入预测模型中,然后查看结果。然而,如果我们这样做,我们可能会得到一个 89%准确的模型。太好了!干得好!但是,等等,我们从来没有捕捉到任何重新接纳(回忆= 0%)。怎么会这样?

现在的情况是,我们有一个不平衡的数据集,其中负样本比正样本多得多,因此模型可能会将所有样本都指定为负样本。

通常情况下,最好以某种方式平衡数据,给积极的一面更多的权重。通常使用 3 种策略

  • 对更占优势的类别进行二次抽样:使用底片的随机子集
  • 对不平衡类进行过采样:多次使用相同的正样本
  • 创建合成阳性数据

通常,如果只有少数几个阳性病例,您会希望使用后两种方法。因为我们有几千个阳性病例,所以让我们使用子样本方法。这里,我们将创建一个 50%正面和 50%负面的平衡训练数据集。也可以玩玩这个比例,看能不能得到一个提升。

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

大多数机器学习包喜欢使用输入矩阵 X 和输出向量 y,所以让我们创建它们:

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

当变量大小不同时(0–100,vs 0–1000000),一些机器学习模型会有问题。为了解决这个问题,我们可以扩展数据。在这里,我们将使用 scikit-learn 的标准定标器,该定标器去除了平均值并按单位方差进行定标。在这里,我将使用所有的训练数据创建一个缩放器,但如果你愿意,你也可以使用平衡的。

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

我们将需要这个 scaler 来处理测试数据,所以让我们使用一个名为pickle的包来保存它。

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

现在我们可以转换我们的数据矩阵

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

我们还不会转换测试矩阵,所以在完成模型选择之前,我们不会考虑性能。

型号选择

哇!为模特做准备有这么多工作。在数据科学中,这总是正确的。您花费 80–90%的时间清理和准备数据。

在本节中,我们将训练一些机器学习模型,并使用一些技术来优化它们。然后,我们将根据验证集的性能选择最佳模型。

我们将利用以下函数来评估模型的性能。关于这些性能指标的讨论,请参阅我以前的文章

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

因为我们平衡了训练数据,所以让我们将阈值设置为 0.5,以将预测样本标记为阳性。

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

模型选择:基线模型

在本节中,我们将首先使用默认超参数比较以下 7 个机器学习模型的性能:

  • k-最近邻
  • 逻辑回归
  • 随机梯度下降
  • 朴素贝叶斯
  • 决策图表
  • 随机森林
  • 梯度推进分类器

k 最近邻(KNN)

KNN 是最简单的机器学习模型之一。对于给定的样本点,该模型查看 K 个最接近的数据点,并通过计算阳性标签的数量除以 K 来确定概率。该模型易于实施和理解,但缺点是对 K 敏感,如果训练样本的数量很大,则需要很长时间来评估。我们可以使用 scikit-learn 中的以下代码来拟合 KNN。

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

我们可以用下面的代码来评估性能

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

为简洁起见,我们将从剩余模型中排除评估,仅显示以下汇总结果。

逻辑回归

逻辑回归是一种传统的机器学习模型,适合正负样本之间的线性决策边界。这个线性函数然后通过一个 sigmoid 函数来计算正类的概率。当要素可以线性分离时,逻辑回归是一个很好的模型。逻辑回归的一个优势是模型是可解释的,即我们知道哪些特征对于预测积极或消极是重要的。需要考虑的一点是,建模对特征的缩放很敏感,所以这就是我们缩放上述特征的原因。我们可以使用 scikit-learn 中的以下代码来拟合逻辑回归。

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

随机梯度下降

随机梯度下降类似于逻辑回归。这两种方法都使用梯度下降来优化线性函数的系数。在逻辑回归中,每次迭代都使用所有数据样本,而在随机梯度下降中,只使用一小批样本。这允许随机梯度下降来加速训练。我们可以使用 scikit-learn 中的以下代码来拟合随机梯度下降。

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

朴素贝叶斯

朴素贝叶斯是机器学习中偶尔使用的另一种模型。在朴素贝叶斯中,我们利用贝叶斯规则来计算概率。这个模型的“幼稚”之处在于它假设所有的特性都是独立的(事实通常不是这样)。这对于自然语言处理模型来说效果很好,但是不管怎样,让我们在这里尝试一下。我们可以用下面的代码来拟合朴素贝叶斯。

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

决策图表

另一类流行的机器学习模型是基于树的方法。最简单的基于树的方法被称为决策树。本质上,在树形方法中,你利用游戏 20 问题背后的方法论来继续划分你的样本。在每个问题中,您询问样本是否有大于某个阈值的特定变量,然后分割样本。最终预测则是树的最后一片叶子(最终分裂)中阳性样本的分数。这种方法背后的机器学习是要找出在每次分裂时使用哪个变量和哪个阈值。基于树的方法的一个优点是,它们没有关于数据结构的假设,并且如果给定足够的树深度,能够拾取非线性效应。我们可以使用下面的代码来拟合决策树。

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

随机森林

决策树的一个缺点是,通过记忆训练数据,它们很容易过度拟合。因此,随机森林被创建来减少过度适应。在随机森林模型中,会创建多棵树,并对结果进行汇总。通过使用一组随机样本和每棵树中随机数量的特征,对森林中的树进行去相关。在大多数情况下,随机森林比决策树工作得更好,因为它们更容易归纳。为了适应随机森林,我们可以使用下面的代码。

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

梯度推进分类器

另一种改进决策树的方法是使用一种叫做 boosting 的技术。在这种方法中,您创建了一组浅树,试图改善先前训练的树的错误。一种使用这种技术与梯度下降算法(以控制学习速率)相结合的模型被称为梯度提升分类器。为了拟合梯度提升分类器,我们可以使用下面的代码。

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

基线模型分析

让我们用所有基线模型的结果制作一个数据框架,并用一个名为seaborn的包来绘制结果。在这个项目中,我们将利用 ROC 曲线下面积(AUC)来评估最佳模型。对于挑选最佳模型来说,这是一个很好的数据科学性能指标,因为它捕捉了真阳性和假阳性之间的权衡,并且不需要选择阈值。

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

正如我们所看到的,大多数模型(除了朴素贝叶斯)在验证集上具有相似的性能。正如训练和验证之间的落差所指出的,存在一些过度拟合。让我们看看是否可以使用更多的技术来提高这种性能。

模型选择:学习曲线

我们可以通过绘制学习曲线来诊断模型的表现。在本节中,我们将利用来自 scikit-learn 的网站的学习曲线代码,对绘制 AUC 而不是精确度做了一点小小的改变。

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

在随机森林的情况下,我们可以看到训练和验证分数相似,但它们的 AUC 分数都很低。这被称为高偏差,是不适应的标志。

根据学习曲线,我们可以采用一些策略来改进模型

高偏差:
-增加新特性
-增加模型复杂度
-减少正则化
-改变模型架构

高方差:
-添加更多样本
-添加正则化
-减少特征数量
-降低模型复杂度
-添加更好的特征
-改变模型架构

这些策略的灵感来自吴恩达的 Coursera class 转述这里的和吴恩达的机器学习向往教材

模型选择:特征重要性

改进模型的一个途径是了解哪些特性对模型是重要的。这通常只能在更简单的模型中进行研究,如逻辑回归或随机森林。这种分析可以在几个方面有所帮助:

—激发新的特性想法→有助于高偏差和高方差
—获得用于减少特性的顶级特性列表→有助于高方差
—指出管道中的错误→有助于模型的健壮性

我们可以使用下面的逻辑回归来获得特征重要性

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

我们可以查看前 50 个正系数和前 50 个负系数来获得一些见解。

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

查看这些图后,您可能会受到启发,获得一些与最重要的功能相关的新数据。例如,在这两个模型中,最重要的特征是number_inpatient,它是去年住院病人的就诊次数。这意味着,如果患者在去年去过医院,他们更有可能再次住院。这可能会激发你获得(如果你有的话)更多关于他们之前录取的数据。另一个例子是discharge_disposition_id_22,用于患者出院到康复机构的情况。对你的公司来说,你可以研究出院到康复机构的规则,并添加与这些规则相关的功能。因为大多数数据分析师/数据科学家不具备深厚的领域知识。我可能会把其中的一些特征带给其他专家(如医生),并询问他们关于药物的问题。

在高方差的情况下,一种策略是减少变量的数量以最小化过度拟合。在此分析之后,您可以使用前 N 个积极和消极特征或前 N 个重要的随机森林特征。您可能需要调整 N,以便您的性能不会急剧下降。例如,只使用顶级特性可能会大大降低性能。另一种可以用来减少变量数量的策略叫做 PCA(主成分分析)。scikit 中也实现了这一点——感兴趣的话可以学习一下。

我想提到的最后一点是,特性重要性图也可能指出您的预测模型中的错误。也许,你在清理过程中有一些数据泄露。数据泄露可以被认为是在训练中偶然包含了某种东西,从而允许机器学习算法进行人工作弊的过程。例如,我根据医生的出院记录建立了一个模型(见 TDS 文章此处)。当我对最重要的词进行同样的分析时,我发现预测某人不会被重新录取的第一个词是“过期”。这让我意识到自己犯了一个错误,忘记排除当前医院就诊中死亡的患者。从我的错误中吸取教训,我排除了与死亡/临终关怀相关的出院代码。合并数据集时也会发生类似的情况。也许当您合并数据集时,其中一个类的某些变量以 nan 结束。上面的分析将帮助你抓住其中的一些情况。

模型选择:超参数调整

我们应该研究的下一件事是超参数调整。超参数调整本质上是您在建立机器学习模型时做出的设计决策。例如,你的随机森林的最大深度是多少?这些超参数中的每一个都可以被优化以改进模型。

在本节中,我们将只优化随机梯度下降、随机森林和梯度增强分类器的超参数。我们不会优化 KNN,因为它需要一段时间来训练。我们不会优化逻辑回归,因为它的表现类似于随机梯度下降。我们不会优化决策树,因为它们往往会过度拟合,性能不如随机森林和梯度推进分类器。

超参数调整的一种技术称为网格搜索,在网格搜索中,您可以在一个值网格上测试所有可能的组合。这是非常计算密集型的。另一种选择是随机测试它们的排列。scikit-learn 中也实现了这种称为随机搜索的技术。这一部分的大部分内容是基于威廉·科尔森的博客文章。我强烈建议跟随他走向数据科学。他写高质量的文章。

让我们在一些随机森林超参数上创建一个网格。

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

要使用 RandomizedSearchCV 函数,我们需要对一组超参数进行评分或评估。这里我们将使用 AUC。

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

RandomizedSearchCV的三个重要参数是

  • 得分=用于挑选最佳模型的评估指标
  • n_iter =不同组合的数量
  • cv =交叉验证分裂的数量

增加最后两项会增加运行时间,但会减少过度拟合的机会。请注意,变量的数量和网格大小也会影响运行时间。交叉验证是一种多次拆分数据以获得更好的性能指标评估的技术。为了这个项目的目的,我们将限制到 2 CV,以减少时间。

我们可以用下面的代码来适应我们的随机搜索随机森林。

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

让我们分析一下最佳模型相对于基线模型的性能。

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

类似地,我们可以优化随机梯度下降和梯度提升分类器的性能。

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

我们可以汇总结果,并与验证集上的基线模型进行比较。

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

我们可以看到,超参数调整改进了模型,但不是很多。这很可能是因为我们有一个高偏差的情况。如果我们有高的方差,更多的改进将被期待。

模型选择:最佳分类器

这里,我们将选择梯度推进分类器,因为它在验证集上具有最佳 AUC。您不会希望每次运行新的预测时都训练您的最佳分类器。因此,我们需要保存分类器。我们将使用包pickle

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

模型评估

现在我们已经选择了我们的最佳模型(优化的梯度推进分类器)。让我们评估一下测试集的性能。

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

最终评价如表所示

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

我们还可以为 3 个数据集创建 ROC 曲线,如下所示

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

结论

通过这个项目,我们创建了一个机器学习模型,能够预测 30 天内再次入院风险最高的糖尿病患者。最佳模型是具有优化超参数的梯度推进分类器。该模型能够捕捉到 58%的再入院率,比随机选择患者要好 1.5 倍。总的来说,我相信许多医疗保健数据科学家正在研究医院再入院的预测模型。如果你是这种情况,我很乐意与你联系(在 Linkedin )并分享经验。欢迎在下面的评论中留下任何反馈或问题。

参考

奥斯特林、威科夫、恰尔科夫斯基、派、崔、巴尔、吉安昌达尼(2017)。临床糖尿病和内分泌学中的“糖尿病和 30 天再入院率之间的关系”。3:1

使用用户搜索参数预测酒店预订

原文:https://towardsdatascience.com/predicting-hotel-bookings-with-user-search-parameters-8c570ab24805?source=collection_archive---------7-----------------------

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

Photo credit: Pixabay

一家酒店市场数据和基准公司 STR 和谷歌发布了一份报告显示,跟踪酒店搜索结果可以对酒店预订量进行可靠的估计。因此,我们今天的目标是尝试建立一个机器学习模型,根据用户的搜索和与该用户事件相关的其他属性来预测用户事件的结果(预订或只是点击)。

数据

数据是公开的,可以从 Kaggle 下载。我们只使用训练集。下表提供了数据集的模式。

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

Figure 1

import datetime
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inlinefrom sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix  
from sklearn.metrics import accuracy_scoredf = pd.read_csv('train.csv.gz', sep=',').dropna()
df = df.sample(frac=0.01, random_state=99)

为了能够在本地处理,我们将使用 1%的数据。之后我们还有大量的 241179 条记录。

df.shape

(241179,24)

count_classes = pd.value_counts(df['is_booking'], sort = True).sort_index()
count_classes.plot(kind = 'bar')
plt.title("Booking or Not booking")
plt.xlabel("Class")
plt.ylabel("Frequency")

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

Figure 2

很明显我们的数据很不平衡。我们将不得不处理它。

特征工程

该过程包括创建新列,如年、月、计划时间和酒店住宿。然后移除我们不再需要的柱子。

df["date_time"] = pd.to_datetime(df["date_time"]) 
df["year"] = df["date_time"].dt.year  
df["month"] = df["date_time"].dt.monthdf['srch_ci']=pd.to_datetime(df['srch_ci'],infer_datetime_format = True,errors='coerce')
df['srch_co']=pd.to_datetime(df['srch_co'],infer_datetime_format = True,errors='coerce')df['plan_time'] = ((df['srch_ci']-df['date_time'])/np.timedelta64(1,'D')).astype(float)
df['hotel_nights']=((df['srch_co']-df['srch_ci'])/np.timedelta64(1,'D')).astype(float)cols_to_drop = ['date_time', 'srch_ci', 'srch_co', 'user_id']
df.drop(cols_to_drop, axis=1, inplace=True)

使用热图绘制关联矩阵,以探索特征之间的关联。

correlation = df.corr()
plt.figure(figsize=(18, 18))
sns.heatmap(correlation, vmax=1, square=True,annot=True,cmap='viridis')plt.title('Correlation between different fearures')

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

Figure 3

我们看不到任何两个变量有非常密切的关联。

不平衡数据的处理

我将使用欠采样方法来创建重采样数据帧。

booking_indices = df[df.is_booking == 1].index
random_indices = np.random.choice(booking_indices, len(df.loc[df.is_booking == 1]), replace=False)
booking_sample = df.loc[random_indices]not_booking = df[df.is_booking == 0].index
random_indices = np.random.choice(not_booking, sum(df['is_booking']), replace=False)
not_booking_sample = df.loc[random_indices]df_new = pd.concat([not_booking_sample, booking_sample], axis=0)print("Percentage of not booking clicks: ", len(df_new[df_new.is_booking == 0])/len(df_new))
print("Percentage of booking clicks: ", len(df_new[df_new.is_booking == 1])/len(df_new))
print("Total number of records in resampled data: ", len(df_new))

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

Figure 4

混洗重新采样的数据帧

df_new = df_new.sample(frac=1).reset_index(drop=True)

为新数据帧分配特征和标签

X = df_new.loc[:, df_new.columns != 'is_booking']
y = df_new.loc[:, df_new.columns == 'is_booking']

PCA

主成分分析(PCA)是一种统计技术,通过选择捕捉关于数据集的最大信息的最重要特征,将高维数据转换为低维数据。我们希望主成分分析能帮助我们找出方差最大的成分。

标准化数据集

scaler = StandardScaler()
X=scaler.fit_transform(X)
X

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

Figure 5

应用五氯苯甲醚。我们的数据中有 23 个特征

pca = PCA(n_components=23)
pca.fit(X)

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

Figure 6

计算特征值

var=np.cumsum(np.round(pca.explained_variance_ratio_, decimals=3)*100)
var

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

Figure 7

在上面的数组中,我们看到第一个特征解释了数据集内 9.6%的方差,而前两个特征解释了 17.8%,依此类推。如果我们使用所有的特征,我们就可以获得数据集中 100%的方差,因此我们可以通过实现一个额外的特征来获得一些方差。没有任何突出的特征。

分类选择

plt.ylabel('% Variance Explained')
plt.xlabel('# of Features')
plt.title('PCA Analysis')
plt.style.context('seaborn-whitegrid')plt.plot(var)

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

Figure 8

根据上面的图,很明显我们应该保留所有的 23 个特征。

训练、预测和绩效评估

随机森林分类器

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)pca = PCA()  
X_train = pca.fit_transform(X_train)  
X_test = pca.transform(X_test)classifier = RandomForestClassifier(max_depth=2, random_state=0)  
classifier.fit(X_train, y_train)y_pred = classifier.predict(X_test)cm = confusion_matrix(y_test, y_pred)  
print(cm)  
print('Accuracy', accuracy_score(y_test, y_pred))

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

Figure 9

逻辑回归

from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import PipelineX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)
pca = PCA(n_components=23)
logReg = LogisticRegression()pipe = Pipeline([('pca', pca), ('logistic', logReg)])
pipe.fit(X_train, y_train)
y_pred = pipe.predict(X_test)cm = confusion_matrix(y_test, y_pred)  
print(cm)  
print('Accuracy', accuracy_score(y_test, y_pred))

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

Figure 10

我们可以通过彻底的网格搜索将结果提高到 70%。但是在本地运行需要很长时间。我不会在这里尝试。

正如你所看到的,从我们现有的数据来预测酒店预订并不是一件容易的事情。我们需要更多的功能,如平均每日房价,用户以前的预订历史,是否有特别促销,酒店在线评论等等。

机器学习前的数据收集入门!

源代码可以在 Github 上找到。享受这周剩下的时光吧!

使用高级回归技术预测房价

原文:https://towardsdatascience.com/predicting-housing-prices-using-advanced-regression-techniques-8dba539f9abe?source=collection_archive---------1-----------------------

我最近在 General Assembly 完成了数据科学沉浸式计划,这是一个为期 12 周的培训计划,旨在深入了解数据科学世界,重点提高从大型数据集分析、预测和传达数据驱动的事实的技能。在接下来的几周里,我将分享我在课程中参与的项目,借此机会回顾我的工作,并与那些希望进入该领域的人分享我的经验。

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

任务

这个项目的目标是使用 EDA、可视化、数据清理、预处理和线性模型来预测给定房屋特征的房屋价格,并解释您的线性模型以找出哪些特征为房屋增值。数据最初取自 Kaggle。

来自 Kaggle:

让购房者描述他们梦想中的房子,他们可能不会从地下室天花板的高度或靠近东西向铁路开始。但是这个游乐场竞赛的数据集证明,影响价格谈判的远不止卧室的数量或白色尖桩栅栏。

有 79 个解释变量描述了(几乎)爱荷华州埃姆斯住宅的各个方面,这场比赛要求你预测每栋房屋的最终价格。

背景

Ames Housing 数据集由 Dean De Cock 编制,用于数据科学教育。对于寻找经常被引用的波士顿住房数据集的现代化和扩展版本的数据科学家来说,这是一个令人难以置信的替代方案。

探索性数据分析

与任何数据练习一样,我们从一些探索性的数据分析开始。

数字变量

有 36 个相关的数字特征。MSSubClass“确定销售中涉及的住宅类型”,编码为数字,但实际上是一个分类变量。

共有 36 个数字特征,属于以下类型:

  • 平方英尺:表示某些特征的平方英尺,即1stFlrSF(首层平方英尺)和GarageArea(以平方英尺为单位的车库大小)。
  • 时间:与时间相关的变量,如房屋何时建造或出售。
  • 房间和元素:表示元素的数据,如“有多少个浴室?”
  • 条件和质量:主观变量从 1 到 10。

大多数与公寓实际物理空间相关的变量都是正偏的——这是有道理的,因为除了非常富有的人,人们往往住在更小的房子/公寓里。

销售价格也有类似的正偏态分布——我假设与公寓实际尺寸相关的变量对销售价格有很大的影响。

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

Histograms of all relevant numeric variables.

许多功能与销售价格没有很大关系,例如“销售年份”。然而,一些变量,如整体质量和地段面积与销售价格高度相关。

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

Scatter plots of numerical variables vs. sale price

分类变量

与数字特征类似,还有一系列分类特征。虽然许多看起来销售价格随类别而变化,但也有许多并非如此。让我们确定几个影响价值的特征。一些因素包括是否有中央空调、邻居、外部质量和分区。

在不同的类别中,也有价格相差不大的特点,包括屋顶风格和土地坡度。

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

Bar charts of all categorical variables vs. sale price

过程

对数据有了更好的理解后,我们现在能够浏览并对数据进行一些分析。

预处理

为了在数据上运行我们的模型,我必须转换许多变量。采取了以下预处理步骤:

  • 去除异常值:采用 1.5 * IQR 去除异常值的经典 Tukey 方法去除了太多的数据。因此,我删除了 3 * IQR 之外的值。
  • 填充 NaN 值:许多变量都有需要处理的 NaN 值。这些值是根据最有意义的内容填充的。例如,Alley的 NaN 值用一个字符串填充(“No Alley”),而GarageYrBuilt的 NaN 值用中间值填充,以防止数据失真。
  • 为分类变量创建虚拟变量。
  • 将数据分为训练集和测试集
  • 缩放数据

模型

是时候建立一些模型了!我们首先使用线性回归模型对缩放数据和非缩放数据创建了一些基准。然后,我们使用三个正则化线性回归模型准备了一系列拟合。我们适合的模型有:

  • 原始数据的简单岭回归
  • 针对原始数据的简单套索回归
  • 原始数据的简单弹性网络回归
  • 针对定标数据的简单岭回归
  • 针对缩放数据的简单套索回归
  • 针对缩放数据的简单弹性网络回归

然后,我们为每个正则化的线性模型导入交叉验证模型。

结果和结论

我们表现最佳的车型是:

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

Top performing models. Score is the R2 score of each test.

结论

用粘土瓦给房子盖屋顶去除了大部分价值。有趣的是,靠近公园或其他户外设施也会降低房子的价值。另一方面,也有一些社区增加了价值。这种情况下最有价值的特征是GrLivArea

正则化模型在该数据集上表现良好。关于偏差/方差权衡的说明:根据高斯-马尔可夫定理,普通最小二乘法(OLS)拟合的模型是所有可能估计量中偏差最小的估计量。换句话说,它比所有可能的模型都更符合它所看到的数据。

然而,对于它没有见过的数据,它不一定表现得很好。正则化模型通过限制贝塔的大小来惩罚模型的复杂性。其结果是,该模型比 OLS 模型引入了更多的偏差,但在统计上变得更加稳定和不变。换句话说,它防止我们过度拟合,并且能够更好地推广到新数据。

预测爱荷华州的酒类销售

原文:https://towardsdatascience.com/predicting-iowa-liquor-sales-787f5d471edb?source=collection_archive---------3-----------------------

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

爱荷华州在其网站上提供了许多数据集,其中一个包含了该州从 2015 年 1 月到 2016 年 3 月所有酒类商店的交易。有了这些信息,我的目标是分析数据并建立一个线性回归模型来预测 2016 年剩余时间的销售额。为了更好地理解数据,每一行或每一个观察都描述了某一天某一特定商店销售了多少单位的某种商品。还包括附加信息,例如商店编号、城市、邮政编码和商店所在的县、商品描述、商品的酒类、瓶子的大小、售出的瓶子数量、瓶子的零售价格、收入等。

在提供的数据集中有很多缺失的数据,所以我寻找处理这些缺失值的方法。其中大多数都在 county 列中,所以我根据在其他观察中找到的所有唯一的市县对,通过将城市映射到相应的县,为这些观察分配了正确的县。我发现了解每个商店属于哪个县很有价值,因为按县划分销售额是汇总数据的好方法。在进一步分析数据后,我注意到销售数字有很大的季节性。

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

上图直观地展示了 2015 年整个州的酒类销售额逐月大幅波动的情况。就这一点对预测 2016 年销售的价值而言,可以有把握地假设 2016 年的销售将遵循类似的趋势。因此,我决定预测 2016 年最后三个季度销售额的最佳方法是建立一个模型,描述 2015 年第一季度销售额和 2016 年第一季度销售额之间的关系,然后使用 2015 年第二至第四季度的销售额来预测 2016 年第二至第四季度的销售额。从那时起,我必须决定是要对每个商店还是每个县进行销售预测。

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

我绘制了 2015 年第一季度销售额与 2015 年第一季度销售额在商店和县两个层面的对比图。正如您从上面的回归图中看到的,两个时间段的县销售额密切相关,而商店级别的销售数字则有很大的差异。此外,在研究数据时,我注意到在整个 15 个月中有许多商店关闭和开业,这可能会提供不准确的预测。因此,我使用按县汇总的销售数字来构建我的模型。为了详细说明该模型到底在做什么,计算机开发了一个等式来表示 2015 年第一季度销售额和 2016 年第一季度销售额之间的关系。然后,为了进行预测,我们输入每个县第 2-4 季度的销售额,模型使用它开发的公式返回每个县 2016 年的预测。

我将数据分为一个训练集和一个测试集,并能够仅使用训练集成功构建一个线性回归模型,该训练集占县销售数据集的 70%。该模型的结果预测 2016 年全年总销售额将增长约 3.62%,这是有道理的,因为我们看到 2015 年至 2016 年第 1 季度的销售额有所增长。当在测试集上测试时,该模型获得了 0.9938 的准确度分数。这个数字代表实际值和预测值之间的均方误差或 R 平方值。一个完美的模型应该有 1 分,所以我的模型表现得非常好!

我对我的模型的结果非常满意。我考虑过不仅仅使用销售数字来生成预测,例如总售出升数或总售出瓶数,但是由于这些特性与销售高度相关,我决定不使用它们以避免多重共线性。还有,我做了一个假设,销量是未来销量最好的预测指标!

预测贷款偿还

原文:https://towardsdatascience.com/predicting-loan-repayment-5df4e0023e92?source=collection_archive---------3-----------------------

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

介绍

借贷行业最关键的两个问题是:1)借款人的风险有多大?2)考虑到借款人的风险,我们是否应该借给他/她?第一个问题的答案决定了借款人的利率。利率衡量借款人的风险,即借款人风险越大,利率越高。考虑到利率,我们可以确定借款人是否有资格获得贷款。

投资者(贷款人)向借款人提供贷款,以换取带息还款的承诺。这意味着只有当借款人还清贷款时,贷款人才能获利(利息)。但是,如果他/她不偿还贷款,那么贷款人就赔钱了。

我们将使用来自 LendingClub.com 的公开数据。该数据涵盖了 2007 年 5 月至 2010 年 2 月期间该平台资助的 9,578 笔贷款。我们为每个借款人提供利率。因此,我们将通过预测借款人是否会在到期日偿还贷款来间接回答第二个问题。通过这个练习,我们将阐述三个建模概念:

  • 如何处理丢失的值。
  • 用于不平衡分类问题的技术。
  • 说明如何使用两种方法建立一个集合模型:混合和堆叠,这很可能会提高我们的性能。

以下是数据集中每个特征的简短描述:

  • credit_policy :如果客户符合 LendingClub.com 的信用核保标准,则为 1,否则为 0。
  • 用途:借款用途,如:信用卡、债务合并等。
  • int_rate :贷款的利率(比例)。
  • 分期付款:如果贷款有资金,借款人所欠的每月分期付款($)。
  • log_annual_inc :借款人年收入的自然对数。
  • dti :借款人的债务收入比。
  • fico :借款人的 fico 信用评分。
  • days_with_cr_line :借款人拥有信用额度的天数。
  • 循环余额:借款人的循环余额。
  • revolu _ util:借款人的循环额度使用率。
  • inq_last_6mths :借款人最近 6 个月被债权人查询的次数。
  • de inq _ 2 yers:在过去的 2 年中,借款人逾期还款超过 30 天的次数。
  • pub_rec :借款人的贬损公开记录数。
  • not _ fully _ payed:表示贷款是否没有全部偿还(借款人违约或借款人被认为不可能偿还)。

让我们加载数据并检查:

  • 每个特征的数据类型
  • 如果我们有缺失的值
  • 如果我们有不平衡的数据

创建这个帖子的源代码可以在这里找到。

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

Figure 1: Data types/missing values

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

Figure 2: Class counts

Positive examples = 1533
Negative examples = 8045
Proportion of positive to negative examples = 19.06%

看起来我们只有一个分类特征(“目的”)。此外,六个要素有缺失值(标注中没有缺失值)。此外,数据集如预期的那样非常不平衡,正面例子(“未全额支付”)只有 19%。在下一节中,我们将在概述集成方法之后解释如何处理所有这些方法。

建模

集成方法可以定义为将几个不同的模型(基础学习器)组合成最终模型(元学习器)以减少泛化误差。它依赖于这样一个假设,即每个模型都将着眼于数据的不同方面,从而获取部分事实。将独立训练的表现良好的模型组合起来,将比单个模型捕捉到更多的事实。因此,这将导致更准确的预测和更低的泛化误差。

  • 当我们添加更多的模型时,集合模型的性能几乎总是得到改善。
  • 尝试组合尽可能不同的模型。这将降低模型之间的相关性,这将提高集合模型的性能,从而显著优于最佳模型。在所有模型完全相关的最坏情况下,集成将具有与最佳模型相同的性能,如果一些模型非常差,有时甚至更低。因此,选择尽可能好的模型。

Different 集合方法以 different 方式构建模型的集合。以下是最常见的方法:

  • 混合:平均所有模型的预测。
  • 打包:在不同的数据集上建立不同的模型,然后从所有模型中获得多数票。给定原始数据集,我们使用替换进行采样,以获得与原始数据集相同的大小。因此,每个数据集平均将包括 2/3 的原始数据,其余 1/3 将是重复的。由于每个模型都将建立在不同的数据集上,因此可以将其视为不同的模型。随机森林通过减少每次分割时挑选强特征的可能性来改进默认的装袋树。换句话说,它将每次分割时可用的特征数量从 n 个特征减少到例如 n/2log(n) 个特征。这将减少相关性–>减少方差。
  • 推进:按顺序构建模型。这意味着每个模型都要学习前一个模型的残差。输出将是由学习率λ加权的每个单个模型的所有输出。它通过从先前树(模型)的残差中顺序学习来减少由 bagging 导致的偏差。
  • 堆叠:构建被称为基础学习者的 k 模型。然后将模型拟合到基础学习器的输出,以预测最终输出。

由于我们将使用随机 Fores (bagging)和梯度推进(Boosting)分类器作为集成模型中的基础学习器,因此我们将仅说明平均和堆叠集成方法。因此,建模部件将由三部分组成:

  • 应对价值观缺失的策略。
  • 处理不平衡数据集的策略。
  • 建立集合模型。

在继续之前,以下数据预处理步骤将适用于所有模型:

  1. 从特性“目的”创建虚拟变量,因为它是名义(非序数)分类变量。这也是一个很好的做法,放弃第一个,以避免产生的特征之间的线性依赖,因为一些算法可能会与这个问题作斗争。
  2. 将数据分为训练集(70%)和测试集(30%)。训练集将用于拟合模型,测试集将用于评估最佳模型,以获得泛化误差的估计。我们将使用 10 重交叉验证,而不是设置验证来调整超参数和评估不同的模型,因为这是对泛化误差更可靠的估计。
  3. 将数据标准化。我们将使用RobustScaler,这样标准化将更少受到异常值的影响,即更健壮。它将数据集中在中间值周围,并使用四分位距(IQR) 对其进行缩放。这一步将作为转换器包含在每个模型的管道中,因此我们不会单独进行。
# Create dummy variables from the feature purpose
df = pd.get_dummies(df, columns=["purpose"], drop_first=True)

应对价值观缺失的策略

现实世界的数据集几乎总是有缺失值。例如,这可能是由于用户没有填写表单的某些部分,或者在将数据发送给您之前收集和清理数据时发生了一些转换。有时缺失值是有信息的,并不是随机生成的。因此,添加二进制要素来检查每个有缺失值的要素的每一行中是否有缺失值是一种很好的做法。在我们的例子中,六个特征有缺失值,所以我们将添加六个二进制特征,每个特征一个。例如,“log_annual_inc”要素缺少值,因此我们将添加一个采用值∈ {0,1}的要素“is_log_annual_inc_missing”。好的一面是缺失值只存在于预测值中,而不存在于标注中。以下是处理缺失值的一些最常见的策略:

  • 只需删除所有缺少值的示例。如果缺失值与数据集的大小相比非常小,并且缺失值是随机的,则通常会这样做。换句话说,添加的二进制特征并没有改进模型。这种策略的一个缺点是,当测试数据在预测中有缺失值时,模型会抛出错误。
  • 分别使用每个要素的平均值估算缺失值。
  • 分别使用每个要素的中值来估算缺失值。
  • 使用链式方程多元插补(小鼠)。鼠标的主要缺点是我们不能在 sklearn 管道中将其用作转换器,并且在输入缺失值时需要使用完整的数据集。这意味着会有数据泄露的风险,因为我们同时使用训练集和测试集来估算缺失值。以下步骤解释了鼠标的工作原理:
  1. 第一步:分别使用每个特征的平均值来估算缺失值。

2.第二步:对于每个具有缺失值的特征,我们将所有其他特征作为预测值(包括具有缺失值的特征),并尝试使用例如线性回归来预测该特征的值。预测值将替换该要素的旧值。我们对所有具有缺失值的要素都执行此操作,即每个要素将被用作一次目标变量来预测其值,其余时间用作预测其他要素值的预测值。因此,一旦我们运行模型 k k k次来预测具有缺失值的 k k k要素,就会完成一次完整的循环(迭代)。对于我们的数据集,每次迭代将运行 6 次线性回归来预测 6 个特征。

3.第三步:重复第二步,直到预测之间没有太大的变化。

  • 使用 K-最近邻估算缺失值。我们计算数据集中所有示例(不包括缺失值)之间的距离,并取每个缺失值的 k 个最近邻的平均值。sklearn 中还没有实现它,计算它的效率很低,因为我们必须遍历所有的例子来计算距离。因此,我们将在本文中跳过这一策略。

为了评估每种策略,我们将使用随机森林分类器,其超参数值由数据驱动建议指导,用于将机器学习应用于生物信息学问题

让我们首先为缺失值创建二元要素,然后为上面讨论的每个策略准备数据。接下来,我们将使用训练数据计算所有模型的 10 重交叉验证 AUC 分数。

Original data shapes: ((7662, 24), (1916, 24))
After dropping NAs: ((7611, 18), (1905, 18))
MICE data shapes: ((7662, 24), (1916, 24))Baseline model's average AUC: 0.651 
Mean imputation model's average AUC: 0.651
Median imputation model's average AUC: 0.651
MICE imputation model's average AUC: 0.656

让我们绘制特征重要性图,以检查添加的二元特征是否为模型添加了任何东西。

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

Figure 3: Random Forest feature importance

在 10 倍交叉验证 AUC 分数的指导下,看起来所有策略都有可比较的结果,缺失值是随机产生的。此外,当绘制来自随机森林分类器的特征重要性时,添加的六个二元特征没有显示出重要性。因此,可以安全地丢弃这些特征,并在管道中使用中值插补方法作为转换器。

# Drop generated binary features
X_train = X_train[:, :-6]
X_test = X_test[:, :-6]

处理不平衡数据集的策略

大多数现实应用中的分类问题都有不平衡的数据集。换句话说,正面例子(少数阶级)比负面例子(多数阶级)少得多。我们可以看到,在垃圾邮件检测,广告点击,贷款审批等。在我们的例子中,正面例子(没有完全付款的人)只占全部例子的 19%。因此,对于不同的模型,准确度不再是性能的良好度量,因为如果我们简单地预测所有的例子都属于负类,我们达到 81%的准确度。不平衡数据集的更好指标是AUC(ROC 曲线下的面积)和 f1 分数。但是,这还不够,因为类不平衡会在训练期间影响学习算法,通过隐式学习基于数据集中的多数类优化预测的模型,使决策规则偏向多数类。因此,我们将探索不同的方法来克服阶级不平衡的问题。

  • 欠采样:通过使正例数和反例数相等,对有或无替换的多数类进行欠采样。欠采样的缺点之一是它忽略了很大一部分具有有价值信息的训练数据。在我们的例子中,它将丢失大约 6500 个例子。但是,训练起来很快。
  • 过采样:通过使正例与反例的数量相等,用或 w/o 替换对少数类进行过采样。我们将使用这种策略从训练数据集中添加大约 6500 个样本。这比欠采样的计算量大得多。此外,由于重复的例子,它更适合修剪。
  • EasyEnsemble:从多数类中采样几个子集,在每个采样数据的基础上构建一个分类器,并组合所有分类器的输出。更多细节可以在这里找到。
  • 合成少数过采样技术(SMOTE):它对少数类进行过采样,但使用合成样本。它在特征空间而不是数据空间上操作。它是这样工作的:
  1. 计算所有少数样本的 k-最近邻。
  2. 随机选择 1-k 之间的数字
  3. 对于每个功能:

a.计算少数样本与其随机选择的相邻样本之间的差异(来自上一步)。

b.将差值乘以 0 到 1 之间的随机数。

c.将获得的特征添加到合成的样本属性中。

4.重复以上步骤,直到我们得到所需的合成样本数。更多信息可以在这里找到。

还有其他一些方法,比如EditedNearestNeighborsCondensedNearestNeighbors,我们不会在这篇文章中讨论,而且在实践中也很少用到。

在大多数应用中,错误分类少数类(假阴性)比错误分类多数类(假阳性)的代价要大得多。在贷款的情况下,向更有可能无法全额还贷的高风险借款人贷款而损失资金,比错过向值得信任的借款人(风险较低)贷款的机会要昂贵得多。因此,我们可以使用class_weight来改变损失函数中误分类正例的权重。此外,我们可以使用不同的分界点将示例分配给各个类。默认情况下,0.5 是截止值;然而,在贷款等应用中,我们更经常看到截止值小于 0.5。注意,改变缺省值 0.5 会降低整体准确性,但是可以提高预测正/负样本的准确性。

我们将使用我们在缺失值部分中使用的相同的随机森林分类器,评估上述所有方法以及没有重采样的原始模型作为基线模型。

Original model's average AUC: 0.652 
Under-sampled model's average AUC: 0.656 
Over-sampled model's average AUC: 0.651 
EasyEnsemble model's average AUC: 0.665 
SMOTE model's average AUC: 0.641

EasyEnsemble 方法具有最高的 10 倍 CV,平均 AUC = 0.665。

构建集合模型

我们将使用三种不同的模型作为基础学习者来构建集合模型:

  • 梯度推进
  • 支持向量分类器
  • 随机森林

集合模型将使用两种不同的方法构建:

  • 混合(平均)集合模型。使基础学习者适应训练数据,然后在测试时,对所有基础学习者生成的预测进行平均。使用来自 sk 的 VotingClassifier 了解:
  1. 使所有基础学习者适应训练数据
  2. 在测试时,使用所有基础学习者来预测测试数据,然后取所有预测的平均值。
  • 堆叠集成模型:使基础学习者适合训练数据。接下来,使用那些经过训练的基础学习者来生成元学习者使用的预测(元特征)(假设我们只有一层基础学习者)。有几种不同的训练堆叠集合模型的方法:
  1. 使基础学习者适应所有训练数据,然后使用用于适应这些学习者的相同训练数据来生成预测。这种方法对过拟合更为有效,因为元学习者会给记忆训练数据更好的基础学习者更多的权重,即元学习者不会产生好的结果,并且会过拟合。
  2. 将训练数据分成 2 到 3 个不同的部分,用于训练、验证和生成预测。这是一种次优的方法,因为保留的集合通常具有较高的方差,不同的分割会产生不同的结果,并且学习算法需要训练的数据较少。
  3. 使用 k 倍交叉验证,将数据分成 k 倍。我们将基础学习者拟合到(k -1)折叠,并使用拟合的模型来生成保持折叠的预测。我们重复该过程,直到我们生成所有 k 倍的预测。完成后,让基础学员适应完整的培训数据。这种方法更可靠,并且给记忆数据的模型更小的权重。因此,它可以更好地概括未来的数据。

我们将使用逻辑回归作为堆叠模型的元学习器。注意,我们可以使用 k-folds 交叉验证来验证和调整元学习者的超参数。我们不会调整任何基础学习者或元学习者的超参数;然而,我们将使用宾夕法尼亚州基准测试论文推荐的一些值。此外,我们不会在训练中使用 EasyEnsemble,因为经过一些实验后,它不会将 Ensemble 模型的 AUC 平均提高超过 2%,并且它在计算上非常昂贵。在实践中,如果模型在计算上变得更加复杂,我们有时愿意放弃小的改进。因此,我们将使用RandomUnderSampler。此外,我们将估算缺失值并预先标准化数据,以便缩短集合模型的代码并允许避免使用Pipeline。此外,我们将使用测试数据绘制 ROC 和 PR 曲线,并评估所有模型的性能。

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

Figure 4: ROC and PR curves

从上面的图表可以看出,堆叠系综模型并没有提高性能。一个主要原因是基础学习者高度相关,尤其是随机森林梯度增强(参见下面的相关矩阵)。

# Plot the correlation between base learners probs_df = pd.DataFrame(meta_features, columns=["xgb", "svm", "rf"]) corrmat(probs_df.corr(), inflate=True);

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

Figure 5: Correlation matrix

此外,对于假阴性比假阳性昂贵得多的分类问题,我们可能希望有一个高召回率而不是高精确度的模型。下面是混淆矩阵:

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

Figure 6: Confusion matrix

让我们最后检查部分依赖图,看看最重要的特征是什么,以及它们与借款人是否最有可能在数据成熟前全额支付贷款的关系。为了便于阅读,我们将只列出前 8 个特征。请注意,部分图基于梯度推进模型。

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

Figure 7: Partial dependence plots

正如我们所料,年收入较低和 FICO 分数较低的借款人不太可能全额偿还贷款;然而,利率较低(风险较高)和分期付款较少的借款人更有可能全额支付贷款。

结论

现实世界中的大多数分类问题都是不平衡的。此外,几乎所有数据集都有缺失值。在这篇文章中,我们讨论了处理缺失值和不平衡数据集的策略。我们还探索了在 sklearn 中构建合奏的不同方式。以下是一些要点:

  • 对于在任何情况下使用哪种算法,没有明确的指南。适用于某些数据集的方法不一定适用于其他数据集。因此,总是使用交叉验证来评估方法,以获得可靠的估计。
  • 有时我们可能愿意放弃对模型的一些改进,如果这会增加复杂性,远远超过对评估度量改进的百分比变化。
  • 在一些分类问题中,假阴性假阳性要昂贵得多。因此,我们可以减少分界点,以减少假阴性。
  • 当构建集成模型时,尝试使用尽可能不同的好模型来减少基础学习者之间的相关性。我们可以通过添加密集神经网络和一些其他类型的基本学习器以及向堆叠模型添加更多层来增强我们的堆叠集成模型。
  • EasyEnsemble 通常比任何其他重采样方法执行得更好。
  • 缺失值有时会给模型添加比我们预期更多的信息。一种捕获方法是为每个具有缺失值的要素添加二进制要素,以检查每个示例是否缺失。

原载于 2018 年 3 月 15 日imaddabbura . github . io

用机器学习预测逻辑的歌词

原文:https://towardsdatascience.com/predicting-logics-lyrics-with-machine-learning-9e42aff63730?source=collection_archive---------2-----------------------

从中学开始,当我第一次听到他的歌曲“我所做的一切”时,逻辑就对我的生活产生了显著的影响。这首歌所属的混音带,年轻的辛纳特拉,单枪匹马地让我成为了各种形式的嘻哈音乐的粉丝,向我介绍了我以前从未想过要听的新旧风格。我可以把那个项目中的每一首歌都与初中和高中时的一种特殊感觉或时刻联系起来,无论那是一段无比快乐的时光还是可怕的悲伤。因此,我从来没有遇到过我不喜欢的诗歌或歌曲,所以当我在 5 月份参加的数据科学课上被分配到这个项目时,我立即知道我应该关注哪个音乐家。

与我得到的任何其他编码实验室相比,这个实验室对我来说是最有趣和令人兴奋的,所以我认为写它会很有趣!我将遍历我编写的 Python 代码,然后讨论这个实现的一些优点和缺点,以及将来如何改进它。当然,还要特别感谢加州理工大学分校的 Dennis Sun 教授,感谢他提供了出色的解决方案和帮助,并为探索数据科学分配了如此出色的实验室!

不过,在我们开始之前,明智的做法是 访问此网页快速了解马尔可夫链及其工作原理——这对理解如何处理这个问题至关重要。简单来说,如果我们将天气建模为马尔可夫链,预测明天的天气将只取决于今天的条件。

构建算法

这个实现的关键是创建一个二元模型 马尔可夫链来表示英语。更具体地说,我们的链将是一个 dictionary 对象,其中每个键都是一个惟一的元组,由一个单词及其后面的单词组成。使用二元模型而不是单个单词(unigrams)允许我们提高生成的行的准确性和可读性,因为它定义了我们的模型,使得句子中的下一个单词是基于前两个单词预测的,而不仅仅是前一个单词(稍后有更多细节)。

获取数据

真正的第一步是收集我们将要分析的所有歌词。为了做到这一点,我在网上搜集了 Logic 每首歌的歌词链接,然后浏览每个链接,收集所有相关的文本。最终结果是一个列表,其中每个元素都是一个字符串,包含一首歌的所有歌词。

Web scraping Logic’s lyrics.

每个网页的 URL 只在尾部的页码上有所不同,所以我可以轻松地使用第一个for循环遍历两个页面。我制作的soup变量是来自[BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/bs4/doc/)库的一个对象;它使得从网站上解析和提取数据变得异常简单。在requests库的帮助下,我能够将每个网页的完整 HTML 代码传递给soup。页面上的第一个表格包含了我们需要的所有链接,以便获得每首逻辑歌曲的歌词,所以我使用了另一个for循环来遍历表格中的每一行;因为 HTML 中的超链接由ahref标记表示,所以我能够搜索这些标记来找到每个链接并将其附加到一个links列表中。下一组for循环用于迭代我刚刚获得的每一个links,以获取每首歌曲中的每一段文本,最终让我将每一组song_text添加到一个综合的lyrics列表中。我不得不使用time.sleep函数来确保我不会因为太快发出大量请求而被阻止或禁止。

创建链

终于到了挖掘并开始构建我们的马尔可夫链的时候了。我们编写了一个函数,它遍历 Logic 的所有歌词中的每个单词,以便通过检查两个单词的每个序列并创建每个序列后面的所有单词的列表来生成模型。为了更有效、更实用的遍历,我们使用"<START>""<END>""<N>"标签分别表示歌曲的开始、结束和换行符。

Training our Markov Chain.

这个train_markov_chain函数接收我们之前创建的lyrics列表。我们用键(None, "<START>")初始化我们的chain来标记一首歌曲的开始。你可能已经猜到了,我们从None关键词开始,因为在一首歌的第一个词之前没有任何词。遍历每首歌曲,我们用自定义标签替换歌曲文本中的所有换行符,然后创建一个last_2变量来跟踪迭代过程中遇到的当前/最近的键。然后,for歌曲歌词中的每一个word,我们通过将word连接到当前调来将它插入到我们的链中,然后更新当前调以反映我们正在移动到下一个word的事实。如果这个新键在链中还不存在,我们可以简单地用一个空列表来创建它,以反映它以前没有被见过的事实。一旦歌曲中的最后一首word被处理完,我们就加上一个“<END>”标签,然后继续我们集合中的下一首歌曲。

预测歌词

一旦我们构建并返回了表示马尔可夫链的字典,我们就可以进入算法的最后一部分:生成预测的歌词。从(None, "<START>")键(我们链中的第一个键)开始,我们随机抽样列表中与该键相关的一个单词,然后移动我们当前正在检查的键,以说明我们刚刚抽样的单词。我们继续这个过程,直到最后遇到"<END>"标签。

Predicting new Logic lyrics.

因此,在将所有这些代码放在一起之后,我们可以print(generate_new_lyrics(chain))在控制台中显示我们预测的歌词。如果你想自己运行所有这些代码,你可以查看我的 GitHub 库来访问 Python 文件和 Jupyter 笔记本。

然而,需要注意的是,因为我使用简单的随机抽样来创建新的歌词,所以我也随机选择了我实际接收到的输出。有少数情况下,我收到的输出少于一行,甚至只有一个单词,但大多数时候,算法打印出了大量的预测歌词。尽管如此,在搜索了我从该算法的多次运行中收到的输出后,我得到了一些非常好的歌词,从原始的妙语到彻头彻尾的滑稽讽刺。下面你会发现我最喜欢的几个,我相信所有这些都非常符合 Logic 的风格(除了一些有趣和/或怪异的,我觉得有义务包括在内)。

“在她爱抽烟的日子里,是的,她渐渐消失了”

“所以我对这种景象直喘粗气,黑夜是我的分工”

“我会告诉他们如何行动,我会站起来,然后在后面”

“赞美黑耶稣,现在他们叫警察了,看在我是道具的份上”

“我很清楚他生来就有热量,岩石比混凝土更坚固”

“宝贝女儿我能找到人性吗?”

“把我的一切都丢到街上,更别说热了”

“这位先生最好知道联邦调查局在窃听”

“我的生活不属于我,我需要你来拯救我”

“每个人都在寻找街道,更不用说热”

"我会一直说唱你们所有人?我离开是有原因的

“哦,我的,我的,我的,感觉这邪恶的氛围”

“但我乘公共汽车离开我的问题,上帝帮助我解决它们”

“现在我祈祷有人来拯救我,不管你相信什么是对的”

“你会失去一切,就像一个该死的国王”

“卒往往在没有拨号音的情况下继续”

“是啊,知道吗?我会让死去的总统代表我

“我所过的生活,只是一个门面”

“她不想再哭了,穷困潦倒,不知天高地厚”

“我看到自己在卢浮宫,我知道我的心在捉弄我”

“我觉得我在扼杀我的梦想,生命在消逝”

“为什么没人想说我会说唱”

“就像魔术师在路边胡言乱语”

“我工作室里的朋友,我在公路上漫步”

“这说唱是另一天,另一本书”

“我见过好人,他们能像其他人一样下雨”

“我知道从哪里开始杀人”

“哟,我会保留所有这些新的剩余残渣”

“相信我,女孩,我不会生气,如果你听到不同的人说谎”

“人们认为他们和他一样高,他们还没准备好喝更多的酒”

“任何和我一起骑车的人现在都想这样”

分析我们的结果:优势和劣势

通过观察我们的 bigram 实现和 unigram 实现的许多输出,我们可以得出一些重要的结论:

  1. 我们模型的预测是准确的,但经常被重复利用。值得注意的是,我们预测的许多台词与 Logic 实际编写的台词几乎相同,即一首诗/歌中的半句台词与另一首诗/歌中的半句台词相结合。这是可以预料的,因为使用二元模型在预测的单词中产生较少的可变性,这是由于基于前两个单词而不是最近的一个单词进行预测,导致来自相同逻辑歌词的三个或更多单词的序列。简单地说,用双字代替单个单词增加了可读性和与逻辑风格的相似性,但降低了创造性。
  2. ***我们的型号速度较慢,产出较少。*unigram 模型运行速度更快,因为表示其马尔可夫链的 dictionary 对象的键要少得多。我们的模型有更多的键,因为它必须处理两个单词的元组。此外,正如我前面提到的,有时我收到的输出很少甚至没有,而且通常比我从 unigram 实现中收到的要少。这可以归因于当前两个单词的基础上,下一个单词的可能性较少。

那么,我们该何去何从呢?我们强调了实施的优势和劣势;我们如何减轻这些缺点并使我们的模型变得更好?识别限制我们建立的模型的中心马尔可夫假设是发现优秀设计的关键。

找到更好的方法

用马尔可夫链对情况建模需要假设情况本身满足一个关键陈述:对下一个状态的预测只取决于当前状态的状态,而不是情况历史的其余部分。例如,使用马尔可夫链预测明天的天气需要得出这样的结论,即过去两周或更长时间的天气对明天的情况没有影响——我想我们都同意这听起来很牵强。因此,即使使用二元模型帮助我们降低了模型中这一假设的重要性,它的影响仍然普遍存在,削弱了我们的结果。我们需要找到一种替代模型的方法,至少可以减少假设。

一个递归神经网络是我们可以使用的替代的一个例子。虽然我不会在这里详细介绍 rnn,主要是因为我自己仍然只是对它们进行了初步的了解,但我将提供一些简要的说明。rnn 的两个关键特征是,它们不假设所有输入都是相互独立的,并且它们能够保存它们所处理的内容的历史,这两个特征对于改进我们的模型都是必要的。关于 rnn 如何工作以及如何实现它们的更多信息,请查看维基百科页面以及本教程;我将从这两者中学习,最终更新我的代码以获得更好的预测。

如果你已经做到了这一步,感谢你阅读并一瞥我对机器学习日益增长的兴趣!数据科学作为一个整体已经有如此多的迷人和创造性的应用。随着我在更多项目中的工作和作为一名开发人员的不断进步,我期待着进一步探索许多细微差别和错综复杂的细节。毕竟,正如罗辑曾经写的(以及他之前的保罗·布兰特),当月球上有脚印时,天空怎么可能是极限?

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

Philadelphia, June 2013

特别感谢我的姐姐 Kelsi Kamin 在我写这篇文章的时候给了我动力和建设性的反馈!

预测 MLB 比赛的上座率

原文:https://towardsdatascience.com/predicting-mlb-game-attendance-c36cdc1b8de6?source=collection_archive---------5-----------------------

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

Minute Maid Park, Houston, TX

每支 MLB 球队在大约六个月的时间里每个赛季打 162 场比赛,这意味着在整个赛季中,我们很可能会看到球迷的上座率有相当大的差异。我决定看看历史比赛数据,看看哪些因素可能在球迷投票率中发挥作用,然后根据我的发现建立一个模型来预测给定比赛的上座率。当试图想象什么会影响出席率时,我想到了一些事情。第一个对我来说很明显,那就是谁在比赛,但更具体地说,主队是谁。不同的球迷群体有不同的倾向,这意味着这些球队的上座率将有不同的分布。除此之外,我还想象了许多其他因素对上座率的影响,比如球队在和谁比赛,球队在那个赛季表现如何,他们比赛的体育场的容量,一年中的时间,以及比赛在一周中的哪一天进行。

我通过刮 baseball-reference.com 收集了 1990 年到 2016 年所有 MLB 游戏的游戏数据。棒球参考有很多关于每场比赛的重要信息,例如球队在赛季中该点的记录,以及他们的连胜记录,分区排名,他们落后多少场比赛,是晚上的比赛还是白天的比赛等等。在收集数据时,我设计了一些我认为可能与出勤率相关的特征,例如球队的总体胜率、他们十场比赛的胜率、球队每场比赛的平均得分次数,以及过去五场比赛中允许的平均得分次数。Baseball-reference.com 也有每个球队的赛季总结数据,其中有有趣的信息,如该赛季球队的经理,球队的最佳球员(通过战争衡量),以及球队球员的平均年龄(按击球手和投手细分)。

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

当我探索数字变量时,不出所料,我发现一个团队的表现与出勤率直接相关。这些变量包括胜率、比赛场次和分区排名,虽然它们显示出是球迷投票率的预测因素,但上座率仍有很大的差异,如上图所示。查看分类变量,一年中的时间和一周中的日期显示了粉丝出席率的不同分布。正如你在下图中看到的,游戏通常在周末和夏季更受欢迎,这并不令人吃惊。

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

我分析了赛季总结数据,看看是否有其他变量对出勤率有影响,我对我的发现感到非常惊讶。数据显示,球队击球手/投手的平均年龄与出勤率之间有很强的正相关关系。因此,随着球队击球手平均年龄的增加,每年的出勤率也会增加。我们可以想象一下,如果一支球队由已经在联盟呆了很长时间的球员组成,或者更好的是,在那个特定的球队呆了很长时间,那么球迷可能会喜欢那些球员,这可能会鼓励他们去看更多的比赛。平均年龄也与胜率正相关,这可能是另一个解释。

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

有了这些知识,我继续构建模型来预测出席率。我决定包括我所有的变量,我建立了一个随机森林回归模型,以及一个梯度推进回归模型。最终,梯度推进模型表现最佳,实现了 0.833 的 R 平方值,这表示实际出席值与拟合的回归线有多接近。下面是我的模型的特征重要性的视觉效果——是粉丝出席率的最大预测因素的前 15 个变量。与球队表现相关的变量,不出所料地出现在这里,比如每场比赛的得分,胜率,以及比赛的回报。总场次代表了一个球队赛季进行到什么程度。令我惊讶的是,团队变量并没有比原来更强的预测力。

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

Feature Importances

总之,我对我的结果感到满意,并发现这个项目非常有趣。我认为,如果建模过程是为每个团队单独完成的,它可以产生更准确的结果。至于将这些结果应用到现实世界的场景中,我相信一个团队可能会发现这些预测对于制定有效的营销或促销策略非常有用。我做了一些关于比较 MLB 粉丝基础的进一步分析,但是我必须把它留到我的下一篇文章中。

和往常一样,为了让我的分析更深入,这里有一个到我的 jupyter 笔记本的链接。我希望你喜欢这篇文章!

在 TensorFlow 中使用深度学习预测分子活性

原文:https://towardsdatascience.com/predicting-molecular-activity-using-deep-learning-in-tensorflow-f55b6f8457f9?source=collection_archive---------1-----------------------

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

我在 STEM 领域有丰富的背景,在过去几年里,我看到了使用机器学习来解决具有挑战性的科学问题的热潮。但是,无论是 STEM 领域还是机器学习领域,都比较难有精深的知识。例如,如果你是一名材料科学家或生物化学家,你可能会花大部分时间思考如何设计实验和如何收集数据。你听到现在每个人都在谈论机器学习,觉得它真的很酷。但是,你并不知道以你的理科背景,如何潜入这个新兴的领域。这篇文章来了。它将提供一个全面的演示,通过 TensorFlow 库使用深度学习来解决默克分子活性 Kaggle 挑战

1。 问题描述

预测新化合物的活性是制药公司在开发新药时遇到的真正挑战。在药物发现过程中,标准的做法是扫描一个大的化合物库,以测试它们对预期靶分子和外周非靶分子的生物活性。希望化合物具有高度特异性,以便具有高效能并使副作用最小化,也就是说,它应该对靶分子具有高活性,而对非靶分子表现出低活性或无活性。这个过程可能非常耗时且昂贵。因此,希望定量预测化合物与靶分子和非靶分子之间的这种生物活性。这种预测可以帮助确定实验的优先次序,减少需要进行的实验工作。事实上,这种预测被称为定量结构-活性关系(QSAR) ,在制药行业中非常常用。

QSAR 方法具有以下特点:

1)制药环境中的数据集通常包含大量化合物。例如,在这次默克数据挑战中,每个目标都针对 20,000 多种化合物进行了测试。

2)每种化合物通常由一系列特征或指纹描述符来表示。这些指纹通常描述分子的内容、化学和分子拓扑,并由特征向量编码。例如,内容和化学可以包括碳和氮原子的数量、氢键供体和受体、电荷、极性和非极性原子以及官能团(酮、羧酸等)的描述符。拓扑包括特定半径内哪些原子与哪些其他原子键合(即分子图的子图)。Kaggle 上描述的 Merck challenge 没有给出所使用的特定指纹,只有作为原始数据的特征向量。

3)每组化合物可能涉及总数数千个指纹描述符。因此,描述每个化合物的向量是稀疏的,只有一小部分是非零的。

4)这些描述符并不都是独立的。根据化合物的结构,不同的描述符之间可能存在很强的相关性。

2。 客观&数据

本次默克数据挑战的目标是,根据化合物化学结构产生的数字描述符,确定预测化合物针对特定分子的生物活性的最佳统计技术。

默克公司提供的数据基于 15 种目标分子和每个目标的 10,000 多种化合物。对于每个目标分子,每一行数据对应于一种化合物,并包含从该化合物的化学结构衍生的描述符。目标分子和每种化合物之间的活性在训练数据中提供,并且是测试数据中预测的目标。

3。 评估指标

将使用 15 个数据集的平均相关系数 R^2 来评估活动预测。对于每个数据集,

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

其中 x 为已知活性, x 为已知活性的平均值, y 为预测活性, y 为预测活性的平均值, Ns 为数据集 s 中的分子数。

4。 方法和解决方案

鉴于目标变量 activity 是连续的,每个数据集包含数万个条目,这是一个回归问题,我将使用 Python 中的 TensorFlow 库构建一个神经网络(NN)来进行预测。在这项工作中,成本函数被定义为均方误差或 MSE。

以下是本工作中所考虑因素的总结:

4.1 每个目标分子或所有目标分子的一个模型

理论上,合并所有 15 个分子的数据并训练通用模型将是理想的,因为将使用大得多的训练数据,并且模型可能表现得更好。然而,在这个特殊的问题中,这 15 个目标分子在结构和活性上可能彼此非常不同。因此,一个靶分子的数据如何对另一个分子的训练模型有用,这不是直接直观的。考虑到计算能力的限制,每个目标分子的一个模型可能是优选的。或者,我们可以训练一个好的模型,并将其应用于所有 15 个数据集。 作为展示,在这项工作中,只训练和优化第一个目标分子的模型。

4.2 数据预处理

4.2.1 目标

训练数据具有 37k 个条目,其中超过 20k 个具有相同的活动值 4.30,其余的在 4.30 和 8.5 之间(图 1)。

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

Figure 1. Histogram of activity values in the training data for molecule 1.

这是因为在数据收集过程中设置了一个阈值。例如,由于实验限制,任何低于 4.30 的数据都不会被收集或映射到 4.30。因此,大部分目标数据被截断,并且 NN 可能存在预测输出为单个值的问题。尝试以下预处理步骤:

1)没有预处理

2)删除目标值为 4.30 的所有条目

3)随机移除所有条目的 90%,目标值为 4.30

其中,1)似乎给出了最高和最一致的 R^2 值,可能与将最大量的输入数据输入到神经网络有关(图 2)。因此,不对目标 y 进行预处理。然而,优化器显然在数据集上遇到了困难,我将在 4.3.5 节中谈到这一点。

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

Figure 2. R^2 value for 8 runs of the same neural network with the full training dataset or partial dataset with all entries with a target value of 4.30 removed.

4.2.2 特征数量

每个条目有 9491 个特征,并且大多数特征向量有大量的零。尝试以下预处理步骤,以便移除琐碎信息并加速模型的训练过程:

1)没有预处理

2)过滤掉方差低于阈值的特征。例如,5e-4 的阈值将移除 3.31%的特征。

3)使用主维度减少(PCA)来减少维度(例如,减少到 6000 而不是 9491 个特征)

结果是 1)和 2)给出了可比较的 R^2,而 3)给出了较低的 R^2 值。因此,在以下结果中,不会对特征进行预处理。

4.2.3 描述符

所有描述符都是非负整数。描述符转换的选项有:

1)无转换

2)对数变换,即 y = log(x + 1)

3)二元变换,即如果 x > 0,y = 1,否则 y = 0。

图 3 示出了对于上述三个不同的处理步骤,成本函数如何随着时期数而变化。很明显,描述符 x 的二进制或对数变换将把成本函数降低到 0.2 以下,并且随着历元数的增加振荡更少。值得一提的是,高于 0.2 的成本函数通常意味着 R^2 接近于 0。

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

Figure 3. Change of cost function with increasing epoch number for three different x preprocessing.

使用描述符 x 的对数和二进制变换来获得可比较的 R^2 值(大约 0.6)。因此,描述符 x 的对数变换用于训练过程的剩余部分。

4.3 神经网络的参数

4.3.1 神经网络的架构

每个神经网络至少有三层:输入、隐藏和输出。对于输入,只有一个输入层,其神经元数量由训练集的形状唯一确定。对于这个问题中的回归,神经网络只有一个输出层,并且只有一个节点和一次函数作为它的激活函数。

确定隐藏层的数量至关重要。虽然一个隐藏层对于大多数问题是好的,但是具有一个隐藏层的 NN 给出大约为 0 的 R^2 值或无意义的值 NAN,因为所有预测的目标值完全相同。在不优化超参数的情况下,将隐藏层的数量增加到两个可以得到大约 0.56 的 R^2。因此,优选具有两个隐藏层的 NN。

至于每个隐藏层中神经元的数量,最常见的经验法则是“隐藏层的最佳大小通常介于输入层的大小和输出层的大小之间”。图 4 在多次训练试验中比较了在隐藏层中具有不同节点数的 4 个不同 NN 的 R^2 值。在第一和第二隐层中分别具有 5 和 2 个节点的神经网络与其他三个具有更多节点的神经网络具有相似的最大 R^2 值(~ 0.6),但是它有三次试验具有低得多的 R^2,这表明具有少量节点的神经网络的不稳定性。在第一和第二隐藏层中具有 50 和 25 个节点的 NN 在 8 次试验中显示出最一致的结果,平均 R^2 为 0.568,标准偏差为 0.027。第一和第二隐层节点数分别为 100 和 50 的最大 NN 在 8 次试验中也表现出不一致性,1 次无意义 R^2 和 1 次 R^2 接近 0。这可能是因为 300 个历元不足以让较大的 NN 持续达到其全局最小值。事实上,神经网络越大,它需要运行的时期就越多,以获得持续的像样的 R^2.理想情况下,我们希望在计算能力允许的情况下运行一个神经网络,直到我们看到优化器收敛到一个解。

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

Figure 4. R^2 value in different trials for NN with 2 hidden layers and different node numbers ((5, 2), (10, 5), (50, 25), (100, 50) for the first and second hidden layer respectively.) 300 epochs are run for each NN.

4.3.2 激活功能

激活函数的实际作用是使神经网络能够模拟复杂的非线性函数。如果没有非线性激活函数,神经网络将等同于线性函数。在这个特殊的问题中,ReLu 和 Sigmoid 被尝试作为激活函数。ReLu 比 Sigmoid 性能更好,用于所有隐藏层。当使用 Sigmoid 激活函数时,成本函数确实不收敛。这可能是因为 Sigmoid 激活函数将所有输出限制在 0 和 1 之间,从而抑制了 NN 对该特定问题的训练能力。

线性激活用于输出层,这是为回归问题训练 NN 的常见做法。

4.3.3 学习率

神经网络的输出对梯度下降的初始学习速率非常敏感。我以 0.05 的学习率开始,并注意到成本函数要么发散,要么迅速超过最大浮点数,给出 NaN。降低学习率会降低成本函数,然而,成本函数容易陷入局部最小值(例如,24.085、22.220、14.683)。只有当学习率下降到 0.001 时,我才开始看到超过 0.1 的成本和 R^2 值的一致输出。因此,学习率保持在 0.001。

4.3.4 权重和偏差

考虑到成本函数很容易陷入局部最小值,从优化的权重和偏差开始也很重要。我们优化的权重和偏差是来自截断正态分布的随机值,平均值为 0,标准差为 1。[-2,2]之外的值将被删除并重新选取—这一步对于获得一致的结果非常重要。

4.3.5 优化器

Adam 优化器被证明是最好的优化器。最初使用的是随机梯度下降,但是大多数时候成本函数会陷入局部最小值(例如 0.45)。降低学习率和增加动力并没有多大帮助。在将优化器切换到 Adam(自适应矩估计)优化器之后,成本函数开始下降到小于 1,并且收敛。Adam optimizer 为每个参数计算自适应学习率,并保持过去梯度的指数衰减平均值。它通常是输入数据为稀疏矩阵的神经网络的首选优化器。

然而,代价函数(MSE)仍然会陷入局部最小值。例如,图 5 示出了成本函数和 R^2 值随着具有两个隐藏层(分别具有 1000 和 500 个节点)的神经网络的时期数的增加而变化。在时期 865,成本从低于 0.2 到高于 0.4 进行了一个小跳跃,进入一个尖锐的局部极小值,并且再也没有恢复。R^2 后来真的很糟糕,而在公元 865 年之前它要好得多。成本函数前景可能包含许多非常尖锐的局部最小值,因为我们经常看到训练试验在 R^2 差的情况下被困在 0.4-0.5 MSE 左右(参见图 4 中的一些示例)。这种跳跃现象在所有模拟中都是随机发生的,很难控制。因此,对于每个优化的模型,我通常会运行多次,以获得一致的结果。

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

Figure 5. Change of cost function and R^2 value with epoch number. The NN has 2 hidden layers with 1000 and 500 nodes respectively. All other parameters of the NN is optimized as shown in this report.

4.3.6 辍学

在神经网络中,放弃是防止过度拟合的常用策略。优化结果是在隐藏层中随机丢弃 25%的神经节点而在输出层中没有丢弃的情况下实现的。

5。 总结

总之,给出最高 R^2 值的优化神经网络具有以下特征:

  • 所有训练数据和所有描述符都是在没有任何过滤过程的情况下使用的。
  • 描述符 x 的对数变换和目标 y 的无预处理。
  • 神经网络有两个隐藏层。第一和第二隐藏层分别具有 50 和 25 个神经元。
  • ReLu 用作所有隐藏层的激活功能。线性激活函数用于输出层。
  • 学习率保持在 0.001。
  • 权重和偏差是截断正态分布的随机值,平均值为 0,标准差为 1。[-2,2]之外的值将被删除并重新选取。
  • 使用了 Adam 优化器。
  • 所有隐藏层使用 25%的丢失率,输出层不使用丢失率。
  • 批量大小为 300,纪元编号为 900。

测试数据(从训练数据中分离出 20%)的最高 R^2 值是 0.568 +/- 0.027。Kaggle 领导委员会显示,所有 15 个分子的最高平均 R^2 分数为 0.494。与那个结果相比,从神经网络得到的 R^2 值是适当的和令人满意的。

请查看这个 GitHub 库,获取所有代码和补充信息。如果您有任何问题,请随时留言或联系我。

预测莫斯科房价

原文:https://towardsdatascience.com/predicting-moscow-home-prices-5b1e82438214?source=collection_archive---------2-----------------------

俄罗斯最大的银行俄罗斯储蓄银行(Sberbank)强调,需要准确预测房价,以便投资者、购房者和开发商在签署租约或进行投资时能够更加放心。在 2014 年欧盟、美国、加拿大和澳大利亚实施制裁后,他们对预测分析的呼吁尤其合理。此后,俄罗斯卢布大幅下跌,金融危机仍在持续。这给严格根据家庭特征进行预测带来了挑战,因此 Sberbank 纳入了大量宏观经济数据。现在,让我们深入研究数据。

作为我的 EDA 的一部分,在每个都有 293 个变量的训练和测试数据集中,几个问题立即变得明显。就缺失数据而言,我可以生成一个条形图,其中包括每个特性缺失数据的百分比。51 个要素缺少值。百分比最高的是每区医院床位、建造年份、最大楼层和材料。

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

在深入了解 EDA 之前,我还应该注意,训练数据得出的平均房价是₽ 7,123,035.00,标准差是₽ 4,708,111。

我确实遇到了一些数据质量问题。有一年被列为 2005 年至 2009 年,所以我把它改为 2007 年的中间值。我以为 4965 年应该是 1965 年。有一个称为 condition 的分类值,它是不言自明的,从 1 到 4 对属性进行评级(1 是最差的,4 是最好的)。有一个值是 33,所以我把它改成了 3。

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

在生成室内功能热图后,全平方米、生活平方米和地板对价格的影响最大,其中每个都以平方米为单位,而生活平方米是不包括阳台、门廊等的总平方米。在 37 例中,生活平方英尺大于全平方英尺。面积和价格之间的相关性如下所示(离群值省略)。

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

当我查看房价中值时,发现 2015 年早期出现了显著的繁荣。对我来说,这似乎没有意义,需要一些背景研究。显然,莫斯科的房地产价格与世界商品市场上的石油直接相关。因此,销售增长在 2015 年停止,市场走向破产。见下文。

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

就何时购买而言,房价往往在 3 月和 5 月最高,11 月最低。

很明显,条件等级为 4 的房子卖得最多。

现在让我们按楼层来看房价。

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

存在适度的正相关。

还有一个功能叫做 max floor。我观察了一下,看看建筑的高度是否会影响价格,但影响并不明显。我注意到的是有超过 1000 个错误,其中单元的楼层大于最大楼层。奇怪!

接下来是一些人口统计数据——我查看了人口密度,看看房价是否随着人口密度的增加而上涨(确实如此),以及哪些地区的交易最频繁

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

现在让我们来看看是否靠近一所大学、一个体育目标(从体育场到篮球场等不同的事物)或克里姆林宫很重要。

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

作为我的 EDA 的最后一个组成部分,我想看看基础设施的特性。水处理的邻近性是唯一一个对价格有轻微积极影响的特征,这意味着你离得越远,你的房屋价值就越高。这是一张热图。

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

在看了所有的数据后,我决定进行一些特征工程。我通过从建造日期中减去年份创造了“建造年代”。我想看看一些定量指标,比如居住面积与总面积的比率,以及厨房面积与总面积的比率。接下来,我想看看大楼的楼层数与大楼的楼层数之比。最后我想看看这个单元离顶楼有几层。

我使用 RSME 作为评估指标运行 XG Boost。这给了我每一个属性的预测。下面你可以看到原分布两套并列。(请记住,科学符号使测试价格分布看起来比实际小得多)

测试价格分布

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

预测分布

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

预测 MS 入院

原文:https://towardsdatascience.com/predicting-ms-admission-afbad9c5c599?source=collection_archive---------3-----------------------

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

Credits: Pexels

快到录取季节了,我有几个朋友正处于恐慌状态,等待他们申请的大学的电话。这让我想到——我们如何预测一个学生是否会被录取?选择的参数是什么?可以用数学表达吗?所有这些问题开始出现,所以我决定解决这个问题,并帮助我的朋友平静他的神经。
(这是我写的第一个技术教程,所以请对我宽容些)。

为了解决这个问题,我将带你通过我称之为
“数据科学管道”。给定任何问题陈述,遵循这条管道,这样你的方法就结构化了。

  1. 定义问题-

写下问题陈述,理解你试图解决的问题。在这种情况下,我们的目标是预测学生是否会被录取。这意味着,这是一个二元分类问题。

2。生成您自己的假设-

接下来,列出你认为会影响我们目标的所有事情,即。列出与我们的目标特性相关的所有可能的特性。
在我们的案例中,我们被问到这个问题— 影响学生录取的因素有哪些? 拿一张纸,写下自己的假设。我花了一些时间,想出了以下特点

  • GRE 成绩
    -托福成绩
    -目的陈述(SOP)
    -推荐信(LOR)
    -学习成绩(GPA)
    -课外活动(体育、奥数等…)
    -杰出成就
    -项目和研究
    确保你写下至少 10-20 个问题陈述。这有助于我们更深入地理解我们试图解决的问题,并促使我们超越现有的数据集进行思考。

3。获取数据集-

下一步是获取数据。我们使用加州大学洛杉矶分校的假设数据进行研究生招生。你可以点击下载数据集。现在你可以用给定的数据集来映射你的假设。查看可以添加或修改多少要素来提高数据集的质量。将每个特征识别为
(a)连续变量或(b)分类变量

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

(Source: Stack Exchange)

4。数据清理-

大多数时候,数据集会有很多异常,比如缺失值、异常值等等。在进入下一步之前,一定要对数据进行预处理。
--缺失值处理: 您可以使用均值插补(对于连续变量)或模式插补(对于分类变量)

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

  • 异常值处理: 异常值异常值是随机样本中与其他值存在异常距离的观察值。

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

有四种方法来处理它——删除观察值、估算、创建箱和分别处理。
-**-特征工程:-**组合、添加、删除、分割、缩放特征以增加模型的精度

5。探索性数据分析(EDA) -

现在是我们动手的时候了。让我们探索数据并理解给定的特征。
该数据集有一个名为admit的二元响应(结果,相关)变量。有三个预测变量:gregparank。我们将变量gregpa视为连续变量。变量rank取值 1 到 4。排名 1 的机构声望最高,排名 4 的机构声望最低。

EDA 帮助我们清楚地了解我们的功能。它还帮助我们捕捉数据点的任何趋势或季节性。
在我们的案例中,我们可以看到 GRE 分数和 GPA 越高,被录取的机会就越大。

6。
预测建模-这是一个二元分类问题。输出只有两种可能,要么是(1) 要么否(0)。有很多分类算法,那么我们如何知道哪一个是最好的呢?我们没有。这是需要经验和专业知识的。不过,别担心,我们还有工作要做。我们可以将多种算法应用到我们的数据点上,然后评估模型。这样我们可以选择误差最小的最佳模型。首先,让我们导入所有必要的库

from matplotlib import pyplot
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC

我们将使用交叉验证作为评估指标,我们将把数据集分为训练和测试两部分。

**#Step 1: Convert Dataframe into matrix**
dataArray = dataset.values**#Step 2: Splitting Input features & Output Variabl**es
X = dataArray[:,1:4]
y = dataArray[:,0:1]**#Step 3: Splitting training & testing**
validation_size = 0.10
seed = 9
X_train, X_test, Y_train, Y_test = train_test_split(X,y,test_size=validation_size, random_state = seed)print(X_train.shape)
print(X_test.shape)
print(Y_train.shape)
print(Y_test.shape)

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

接下来,我们将对我们的训练数据应用以下机器学习算法
-逻辑回归(LR)
-线性判别分析(LDA)

  • K 最近邻(KNN)
    -决策树(CART)
    -随机森林(RF)
    -高斯朴素贝叶斯(NB)
    -支持向量机(SVM)
    初始化最大数量的特征和数量的树。
num_trees = 200
max_features = 3
models = []
models.append(('LR', LogisticRegression()))
models.append(('LDA', LinearDiscriminantAnalysis()))
models.append(('KNN', KNeighborsClassifier()))
models.append(('CART', DecisionTreeClassifier()))
models.append(('RF', RandomForestClassifier(n_estimators=num_trees, max_features=max_features)))
models.append(('NB', GaussianNB()))
models.append(('SVM', SVC()))**#Fit Models and Evaulate**results = []
names = []
scoring = 'accuracy'**#Cross Validation**
for name, model in models:
 kfold = KFold(n_splits = 10, random_state=7)
 cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring = scoring)
 results.append(cv_results)
 names.append(name)
 msg = "%s: %f (%f)" % (name,cv_results.mean(), cv_results.std())
 print(msg)

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

我们在这里所做的是在我们的数据点上运行所有 7 种算法,并尝试对其进行评估。如你所见,LR 和 LDA 表现最好。我们也可以实现一个比较图

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

现在,我们已经将 ML 算法应用到我们的数据集上。接下来,我们必须使用最佳算法创建一个预测模型。
为了简单起见,我打算选 LR。

**#Step 1 - Create prediction model**
model = LogisticRegression()**#Step 2 - Fit model**
model.fit(X_train, Y_train)**#Step 3 - Predictions** 
predictions = model.predict(X_test)**#Step 4 - Check Accuracy**
print("Model --- LogisticRegression")
print("Accuracy: {} ".format(accuracy_score(Y_test,predictions) * 100))
print(classification_report(Y_test, predictions))

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

我喜欢制造情节。所以让我们再做一个;)

**#plotting confusion matrix on heatmap**
cm = confusion_matrix(Y_test, predictions)
sns.heatmap(cm, annot=True, xticklabels=['reject','admit'], yticklabels=['reject','admit'])
plt.figure(figsize=(3,3))
plt.show()

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

恭喜你!您制作了我们自己的预测模型,准确率为 77.5
(对初学者来说一点也不差)
您可以尝试通过安装不同的分类算法或进行一点点特征工程来提高这个分数。
最好的方法是使用集成方法,但那是其他教程的内容。

但是等等…
我们怎么知道这行得通呢?
是的,完全正确吗?我们已经走了这么远,怎么能不让我们的模型做出一些预测呢!

**#Making predictions on some new data
#Like a boss**
new_data = [(720,4,1), (300,2,3) , (400,3,4) ]**#Convert to numpy array**
new_array = np.asarray(new_data)**#Output Labels**
labels=["reject","admit"]**#Let's make some kickass predictions**
prediction=model.predict(new_array)#G**et number of test cases used**
no_of_test_cases, cols = new_array.shapefor i in range(no_of_test_cases):
 print("Status of Student with GRE scores = {}, GPA grade = {}, Rank = {} will be ----- {}".format(new_data[i][0],new_data[i][1],new_data[i][2], labels[int(prediction[i])]))

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

仅此而已。我们自己的预测模型可以决定你朋友的未来(事实上不可以)
但是我们的模型绝对可以预测他/她是否会被录取!

DSW 背后的动机

我从一年前开始学习和研究数据科学。在此期间,我做了大量的问题陈述。但问题是,有时数据集非常有趣,但有时却不是。你必须关心你试图解决的问题,只有这样你才能做好工作。

所以找一个你想解决的问题,用数据来解决它。

你可以在 Github 上找到本教程的代码

我将每周写下一些很棒的教程,所以如果你是那种只能通过做来学习的人,请在这里关注我的 出版物。

也可以在 LinkedIn 上联系。

我希望你有一个富有成效的一周。

在那之前,继续 hustling!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值