住宅手頃な価格のデータセットのPythonのベイズ回帰分析

 私はベイズ枠組みの中で回帰直線的pymc3の使い方を勉強したいと思います。知識への高校からのデータを推定するためによります。 

 

 何ベイズのルール? 

  要するに、私たちは、世界の知識の証拠を持っているし、世界の状態を教えために組み合わせることを知っている必要があります。

これは一例です。そのような稀な疾患があると仮定すると、病気に感染したすべての1万人を無作為化したためにものがあります。言い換えれば、あなたがこの病気に苦しんでの0.01%のチャンスがあります。幸いなことに、正確にこの病気を持つ人々の99%が同定された試験はないに病気があるかもしれない、それはまた、正確にあなたの99%がこの疾患に罹患していないと述べたことができます。あなたは正のテスト結果に参加しました。あなたは心配する必要がありますか?

さて、論理的にそれについて考えてみましょう。私たちは、この病気に万人に一人があることを知っています。万人がいるとします。彼らは、疾患のない9999人ですが、人の1%が陽性の結果が得られます。そのため、実際にこの疾患に罹患している一人だけ、そして約101人はポジティブな結果を得た場合でも。101ポイントの唯一の本当のチャンスが肯定された場合でも、この手段は、疾患(または約1%の確率)に苦しみます。

 数学的記述:

それは非常にシンプルに見えます。実際に、それは簡単です。式は、確率分布の唯一のいくつかの知識が必要です。しかし、実際には、右の分母は、通常、私たちは本当に重い積分計算の多くを計算する必要がありますを意味します。したがって、ベイズ統計は、長年にわたって放棄されました。ある意味で、それは確率論のうち、当然です。我々は数字の多くを計算するための唯一の良いものを持っている場合、この問題が解決することができます。

コンピュータは確かに非常に迅速に計算します。実際には、私がこの記事を書き、私の不器用な古いラップトップは、私たちが復帰しようとしているように、ベイズなどいくつかの良いベイズ統計を作ることができます。

 

コード

これは、ベイズ回帰を必要な知識です。通常、我々は、このリターンを考えます:

eは正規分布の誤差です。 

 

 したがって、我々はそれを前提としています。

そして、先験的:

我々はデータXとYを持っているのであれば、あなたはベイズ線形回帰を実行することができます。 

 コード 

 したがって、データは、私たちが使用したい設定「である  アメリカの住宅調査: 2013 住宅手頃な価格データ」データセット。 

我们感兴趣的是住房负担如何随着年龄而变化。AGE1包含户主的年龄。BURDEN是一个变量,它告诉我们住房费用相对于收入有多大。为简单起见,我们仅关注这两个变量。我们想知道的是,随着年龄的增长,住房负担会变得更容易吗?特别是,我们想知道斜率系数是否为负,并且由于我们处于贝叶斯框架中,因此该概率为负的概率是多少?

因此,让我们从一些先决条件开始,我们将导入所需的库和数据。我们还将进行一些数据清理。

import pandas as pd
import pymc3
import matplotlib.pyplot as plt

df=pd.read_csv('/home/ryan/Documents/thads2013n.txt',sep=',')
df=df[df['BURDEN']>0]
df=df[df['AGE1']>0]

好吧,这很简单。现在,让我们构建上面讨论的模型。让我们做一个散点图,看看数据是什么样子。

plt.scatter(df['AGE1'],df['BURDEN'])
plt.show()

结果如下:

数据看起来住房负担天文数字很高,很容易超过收入的10倍。

现在,我们不必为此担心太多。这是构建和运行模型的代码:


pm.traceplot(trace)
plt.show()

看起来与我们上面的模型完全一样,不同之处在于我们还有一个正态分布的截距额外的beta。最后一行是实际为我们运行模型的内容。现在我们的模型已经训练好了,我们可以继续做一些推论工作了。继续运行,然后在运行时执行其他操作。在较旧的笔记本电脑(例如我的笔记本电脑)上,这可能需要花费大量时间。通常,您将需要在GPU上的云中进行这些计算。在笔记本电脑上运行花了47分钟。完成运行后,会看到类似以下内容:

 

 

可以看到,我们有斜率和截距的后验分布以及回归的标准偏差。

但是就像我一开始就想知道的那样,住房负担会随着年龄的增长而减少吗?我的想法是,也许是的。随着人们的建立,他们的住房成本将相对于收入下降。这将等于年龄变量的负斜率系数。运行以下代码,则可以找出斜率系数为负的确切概率。

 
print(np.mean([1 if obj<0 else 0 for obj in trace['x']]))

,该系数为负的概率约为13.8%。

 

发布了445 篇原创文章 · 获赞 246 · 访问量 97万+

おすすめ

転載: blog.csdn.net/qq_19600291/article/details/104040027