混合效应随机林

merf的Python项目详细描述


混合效应随机森林

CircleCI

此存储库包含混合效果随机林(merf)算法的纯python实现。它可以被开箱即用来拟合merf模型并用它进行预测。 在thisblogpost中阅读更多关于merf的信息。

MERF模型

merf模型是:

y_i=f(x_i)+z_i*b_i+e_i

b_i~n(0,d)

e_i~n(0,r_i)

对于每个集群,总共n个集群中的i个集群。

在上面:

  • y_i——第一类反应的(n_i x 1)向量,在训练时给出。
  • x_i——与y_i相关的(n_i x p)固定效应协变量。这些是在训练时给出的。
  • z_i——与y_i相关的(n_i x q)随机效应协变量。这些是在训练时给出的。
  • E_i——第一类错误的(n_i x 1)向量。这是未知的。
  • 我是群集ID。这是在训练时提供的。

merf中的学习参数为:

  • f()——这是一个随机森林,它模拟了从固定效应协变量到响应的潜在非线性映射。这在所有集群中都很常见。
  • d——这是正态分布的协方差,从中可以得出每个b_i。这在所有集群中都很常见。
  • sigma^2——E_i的方差,假设为白色。这在所有集群中都很常见。

注意,merf模型的一个关键假设是随机效应是linear。虽然,这在某些方面是有限的,但它对许多问题仍然有广泛的用处。总比完全不模拟随机效应要好。

本文中实现的算法由ahlem hajjem、francois bellavance和denis larocque开发,并发表在一篇论文here中。非常感谢ahlem和denis提供了r引用并帮助调试此代码。请注意,已发表的论文在sigma^2的更新公式中有一个小错误,在这里的源代码中进行了更正。

使用代码

merf代码是在scikit学习估计器之后建模的。要使用,您可以实例化一个merf对象(无论是否指定参数——默认值是合理的)。然后使用训练数据拟合模型。拟合后,您可以根据数据预测响应,可以是来自已知(训练集中的群集)或新(训练集中没有群集)群集。

例如:

> from merf import MERF
> merf = MERF()
> merf.fit(X_train, Z_train, clusters_train, y_train)
> y_hat = merf.predict(X_test, Z_test, clusters_test)

注意到训练是缓慢的,因为潜在期望最大化(EM)算法需要许多调用随机森林拟合方法。这就是说,如果广义对数似然(gll)停止显著改善,这个implemtataion将提前终止em算法。

在当前的实现中,固定效果学习者是一个随机的前向学习者,但理论上em算法可以用于任何学习者。我们希望将来的版本也能像梯度增强树甚至深层神经网络一样。

浏览源代码

\src目录包含所有源代码:

  • merf.py是包含merf类的键模块。它是在包级别导入的。
  • tests.py包含一些简单的单元测试。
  • utils.py包含一个类,用于生成可用于测试merf准确性的合成数据。实现的进程与此paper中的相同。

\notebooks目录包含一些有用的笔记本,向您展示如何使用代码和评估merf性能。实现的大多数技术与本文中的技术相同paper

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
部署在kubernetes上时,微服务中服务间通信中的java连接超时问题   java Nway合并对2G字符串文件进行排序   java如何使用FlexJson按特定顺序序列化对象和属性   如何在java布尔方法中导入文本文件   swing需要帮助在我的Java GUI中实现用户输入的侦听器   java如何读取枚举中Spring Messagesource的内容?   每个Ajaxcall上(之前和之后)的java Javascript   java compareTo(Comparable)方法对于Comparable类型未定义   带换行符的java Bash输入重定向   使用Spring授权标记检查用户是否登录时发生java错误?   使用大尺寸(100000)数组执行快速排序时出现Java StackOverflower错误   java forEach迭代器标记   Java ClassNotFound异常,Maven依赖项作为JAR   java将HQL转换为SQL查询   java正在将片段列表发送到FragmentPagerAdapter   java onActivityResult应该调用super。onActivityResult   java如果我导入一个超类,我也需要导入它的子类吗?   java是否可以通过openid协议对aadhar进行身份验证