Подтвердить что ты не робот

Как найти распределение вероятности и параметры для реальных данных? (Python 3)

У меня есть набор данных из sklearn, и я построил распределение данных load_diabetes.target (т.е. значения регрессии, которые load_diabetes.data используется для прогнозирования).

Я использовал это, потому что он имеет наименьшее количество переменных/атрибутов регрессии sklearn.datasets.

Использование Python 3, Как я могу получить тип дистрибутива и параметры дистрибутива, которые наиболее близки?

Все, что я знаю, значения target все положительные и искаженные (positve skew/right skew)., Есть ли способ в Python предоставить несколько дистрибутивов, а затем лучше всего подходит для данных/вектора target? ИЛИ, чтобы на самом деле предложить соответствие, основанное на данных, которые были даны? Это было бы полезно для людей, имеющих теоретические статистические знания, но мало опыта применения его к "реальным данным".

Bonus Имеет ли смысл использовать этот тип подхода, чтобы выяснить, что будет с вашим задним распределением с "реальными данными"? Если нет, почему бы и нет?

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()

введите описание изображения здесь

4b9b3361

Ответ 1

Насколько я знаю, нет автоматического способа получения типа распределения и параметров выборки (так как вывод о распределении выборки является статистической проблемой сам по себе).

На мой взгляд, лучшее, что вы можете сделать, это:

(для каждого атрибута)

  • Попытайтесь поместить каждый атрибут в достаточно большой список возможных распределений (например, см. Установка эмпирического распределения на теоретические с помощью Scipy (Python)? для примера с Scipy)

  • Оцените все свои приемы и выберите лучший. Это можно сделать, выполнив тест Колмогорова-Смирнова между вашим образцом и каждым из распределений подгонки (у вас есть реализация в Scipy, снова) и выберите тот, который минимизирует D, тестовую статистику (также известную как разность между образец и подгонка).

Бонус: это будет иметь смысл - поскольку вы будете создавать модель для каждой из переменных, поскольку вы выбираете подходящую для каждого из них, хотя доброта вашего прогноза будет зависеть от качества ваших данных и распределений, которые вы используются для подгонки. В конце концов, вы строите модель.

Ответ 2

Вы можете использовать этот код для соответствия (в соответствии с максимальным правдоподобием) разных распределений с вашими данными:

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 the parameters of your distribution, scale, location

Вы можете увидеть образец фрагмента о том, как использовать полученные здесь параметры: Подключить эмпирическое распределение к теоретическим с помощью Scipy (Python)?

Затем вы можете выбрать распределение с наилучшей вероятностью ведения журнала (есть также другие критерии для соответствия "лучшему" распределению, такие как байесовская задняя вероятность, значения AIC, BIC или BICc...).

Для вашего бонусного вопроса, я думаю, нет общего ответа. Если ваш набор данных значителен и получен в тех же условиях, что и реальные словарные данные, вы можете это сделать.

Ответ 3

Используйте этот подход

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]