web-dev-qa-db-fra.com

Comment trouver la distribution de probabilité et les paramètres pour des données réelles? (Python 3)

J'ai un jeu de données de sklearn et j'ai tracé la distribution du load_diabetes.target données (c'est-à-dire les valeurs de la régression que load_diabetes.data sont utilisés pour prédire).

Je l'ai utilisé car il contient le moins de variables/attributs de la régression sklearn.datasets.

Utilisation de Python 3, Comment puis-je obtenir le type de distribution et les paramètres de la distribution à laquelle cela ressemble le plus?

Tout ce que je sais, c'est que les valeurs target sont toutes positives et asymétriques (positve skew/right skew). . . Existe-t-il un moyen dans Python pour fournir quelques distributions, puis obtenir le meilleur ajustement pour les données/le vecteur target? OU, pour suggérer réellement un ajustement basé sur les données qui sont Ce serait vraiment très utile pour les personnes qui ont des connaissances statistiques théoriques mais peu d'expérience pour les appliquer à des "données réelles".

Bonus Serait-il judicieux d'utiliser ce type d'approche pour déterminer quelle serait votre distribution postérieure avec des "données réelles"? Si non, pourquoi pas?

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

À ma connaissance, il n'existe aucun moyen automatique d'obtenir le type de distribution et les paramètres d'un échantillon (comme inférant la distribution d'un échantillon est un problème statistique en soi).

À mon avis, le mieux que vous puissiez faire est de:

(pour chaque attribut)

  • Essayez d'adapter chaque attribut à une liste raisonnablement grande de distributions possibles (par exemple, voir Ajustement de la distribution empirique aux distributions théoriques avec Scipy (Python)? pour un exemple avec Scipy)

  • Évaluez tous vos ajustements et choisissez le meilleur. Cela peut être fait en effectuant un test de Kolmogorov-Smirnov entre votre échantillon et chacune des distributions de l'ajustement (vous avez à nouveau une implémentation dans Scipy), et en choisissant celle qui minimise D, la statistique de test (alias la différence entre le échantillon et l'ajustement).

Bonus: il serait logique - car vous construirez un modèle sur chacune des variables que vous choisissez un ajustement pour chacune - bien que la qualité de votre prédiction dépende de la qualité de vos données et des distributions que vous utilisez pour raccord. Vous construisez un modèle, après tout.

17
carrdelling

Vous pouvez utiliser ce code pour ajuster (selon la probabilité maximale) différentes distributions avec vos données:

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

Vous pouvez voir un exemple d'extrait sur la façon d'utiliser les paramètres obtenus ici: Ajuster la distribution empirique aux théoriques avec Scipy (Python)?

Ensuite, vous pouvez choisir la distribution avec la meilleure vraisemblance logarithmique (il existe également d'autres critères pour correspondre à la "meilleure" distribution, tels que la probabilité postérieure bayésienne, Valeurs AIC, BIC ou BICc, ...).

Pour votre question bonus, il n'y a, je pense, aucune réponse générique. Si votre ensemble de données est significatif et obtenu dans les mêmes conditions que les vraies données Word, vous pouvez le faire.

11

Utilisez cette approche

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