Как найти распределение вероятности и параметры для реальных данных? (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()
![введите описание изображения здесь]()
Ответы
Ответ 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]