webentwicklung-frage-antwort-db.com.de

Wie finde ich Wahrscheinlichkeitsverteilung und Parameter für reale Daten? (Python 3)

Ich habe einen Datensatz von sklearn und habe die Verteilung des load_diabetes.target Daten (d. h. die Werte der Regression, die der load_diabetes.data dienen zur Vorhersage).

Ich habe dies verwendet, weil es die geringste Anzahl von Variablen/Attributen der Regression hat sklearn.datasets.

Verwenden von Python 3, Wie kann ich den Verteilungstyp und die Parameter der Verteilung ermitteln, die dieser am ähnlichsten sind?

Alles, was ich weiß, sind die target -Werte alle positiv und schief (positiver Versatz/rechter Versatz). . . Gibt es eine Möglichkeit, in Python ein paar Verteilungen bereitzustellen und dann die beste Anpassung für die target -Daten/-Vektoren zu erhalten? ODER eine Anpassung basierend auf den Daten vorzuschlagen, die vorhanden sind? Das wäre wirklich nützlich für Leute, die theoretisches statistisches Wissen haben, aber wenig Erfahrung damit haben, es auf "reale Daten" anzuwenden.

Bonus Wäre es sinnvoll, diese Art von Ansatz zu verwenden, um herauszufinden, wie Ihre posteriore Verteilung mit "echten Daten" aussehen würde? Wenn nein, warum nicht?

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

Meines Wissens gibt es keinen automatischen Weg, den Verteilungstyp und die Parameter einer Stichprobe zu ermitteln (da auf die Verteilung einer Stichprobe schließen lässt statistische Problem von selbst).

Meiner Meinung nach ist das Beste, was Sie tun können:

(für jedes Attribut)

  • Versuchen Sie, jedes Attribut an eine relativ große Liste möglicher Verteilungen anzupassen (siehe z. B. empirische Verteilung an theoretische mit Scipy (Python) anpassen? für ein Beispiel mit Scipy)

  • Bewerten Sie alle Ihre Passungen und wählen Sie die beste aus. Dies kann erreicht werden, indem ein Kolmogorov-Smirnov-Test zwischen Ihrer Stichprobe und jeder der Verteilungen der Anpassung durchgeführt wird (Sie haben wieder eine Implementierung in Scipy) und diejenige ausgewählt wird, die D, die Teststatistik, minimiert (auch bekannt als die Differenz zwischen Probe und die Passform).

Bonus: Es wäre sinnvoll - da Sie auf jeder Variablen ein Modell aufbauen, während Sie eine Anpassung für jede Variable auswählen -, obwohl die Güte Ihrer Vorhersage von der Qualität Ihrer Daten und den Verteilungen abhängen würde, für die Sie sie verwenden passend zu. Schließlich bauen Sie ein Modell.

17
carrdelling

Sie können diesen Code verwenden, um (entsprechend der maximalen Wahrscheinlichkeit) verschiedene Verteilungen mit Ihren Daten abzugleichen:

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

Sie können einen Beispielausschnitt über die Verwendung der hier erhaltenen Parameter sehen: Anpassen der empirischen Verteilung an die theoretischen mit Scipy (Python)?

Dann können Sie die Verteilung mit der besten Log-Wahrscheinlichkeit auswählen (es gibt auch andere Kriterien, die mit der "besten" Verteilung übereinstimmen, z. B. Bayesianische posteriore Wahrscheinlichkeit, AIC, BIC oder BICc-Werte, .. .).

Für deine Bonusfrage gibt es meiner Meinung nach keine generische Antwort. Wenn Ihre Datenmenge signifikant ist und unter den gleichen Bedingungen wie die tatsächlichen Word-Daten erhalten wird, können Sie dies tun.

11

Verwenden Sie diesen Ansatz

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