web-dev-qa-db-ja.com

実際のデータの確率分布とパラメーターを見つける方法(Python 3)

sklearnからのデータセットがあり、load_diabetes.targetデータの分布をプロットしました(つまり、load_diabetes.dataが予測に使用される回帰の値)。

回帰sklearn.datasetsの変数/属性の数が最も少ないため、これを使用しました。

Python 3、を使用して、これに最も近い分布の分布タイプとパラメーターを取得するにはどうすればよいですか?

targetの値はすべて正であり、歪んでいます(ポジスキュー/右スキュー)。 。 。 Pythonにいくつかの分布を提供し、target data/vectorに最適なフィットを得る方法はありますか?または、実際のデータに基づいてフィットを提案する方法はありますか?これは、理論的な統計知識は持っているが「実際のデータ」にそれを適用した経験がほとんどない人にとっては非常に有用でしょう。

ボーナスこのタイプのアプローチを使用して、「実際のデータ」で事後分布がどうなるかを理解するのは理にかなっていますか?いいえの場合、なぜですか?

from sklearn.datasets import load_diabetes
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import pandas as pd

#Get Data
data = load_diabetes()
X, y_ = data.data, data.target

#Organize Data
SR_y = pd.Series(y_, name="y_ (Target Vector Distribution)")

#Plot Data
fig, ax = plt.subplots()
sns.distplot(SR_y, bins=25, color="g", ax=ax)
plt.show()

enter image description here

21
O.rka

私の知る限り、サンプルの分布タイプとパラメーターを自動的に取得する方法はありません(inferringとして、サンプルの分布は統計的問題自体)。

私の意見では、できることは次のとおりです。

(属性ごと)

  • 可能な分布の合理的に大きなリストに各属性を合わせてみてください(例: Scipy(Python)で理論的分布に経験的分布を当てはめますか? Scipyの例を参照)

  • すべてのフィットを評価し、最適なものを選択します。これは、サンプルと近似の各分布の間でコルモゴロフ-スミルノフ検定を実行し(再びScipyに実装があります)、テスト統計量Dを最小化するものを選択することで実行できます(別名:サンプルとフィット)。

ボーナス:各変数に適合を選択する際に各変数でモデルを構築するので、それは理にかなっています-ただし、予測の良さはデータの品質と使用する分布に依存しますフィッティング。結局のところ、モデルを構築しています。

17
carrdelling

そのコードを使用して、データにさまざまな分布を(最尤に従って)適合させることができます。

import matplotlib.pyplot as plt
import scipy
import scipy.stats

dist_names = ['gamma', 'beta', 'rayleigh', 'norm', 'Pareto']

for dist_name in dist_names:
    dist = getattr(scipy.stats, dist_name)
    param = dist.fit(y)
    # here's the parameters of your distribution, scale, location

ここで取得したパラメーターの使用方法についてのサンプルスニペットを見ることができます。 Scipy(Python)を使用して理論的分布に経験的分布を適合させますか?

次に、対数尤度が最も高い分布を選択します(ベイジアン事後確率、AIC、BIC、 BICc値、...)。

ボーナスの質問については、一般的な答えはないと思います。データのセットが重要で、実際のWordデータと同じ条件下でを取得した場合、それを行うことができます。

11

このアプローチを使用する

import scipy.stats as st
def get_best_distribution(data):
    dist_names = ["norm", "exponweib", "weibull_max", "weibull_min", "Pareto", "genextreme"]
    dist_results = []
    params = {}
    for dist_name in dist_names:
        dist = getattr(st, dist_name)
        param = dist.fit(data)

        params[dist_name] = param
        # Applying the Kolmogorov-Smirnov test
        D, p = st.kstest(data, dist_name, args=param)
        print("p value for "+dist_name+" = "+str(p))
        dist_results.append((dist_name, p))

    # select the best fitted distribution
    best_dist, best_p = (max(dist_results, key=lambda item: item[1]))
    # store the name of the best fit and its p value

    print("Best fitting distribution: "+str(best_dist))
    print("Best p value: "+ str(best_p))
    print("Parameters for the best fit: "+ str(params[best_dist]))

    return best_dist, best_p, params[best_dist]
10
Pasindu Tennage