Генерация недостающих значений в наборе данных на основе распределения ZIPF
В настоящее время я хочу наблюдать, как пропущенные значения влияют на мой набор данных. Я заменяю точку данных (10, 20, 90 %) на отсутствующие значения и наблюдаю за влиянием. Эта функция ниже предназначена для замены определенного процента данных на отсутствующий.
def dropout(df, percent):
# create df copy
mat = df.copy()
# number of values to replace
prop = int(mat.size * percent)
# indices to mask
mask = random.sample(range(mat.size), prop)
# replace with NaN
np.put(mat, mask, [np.NaN]*len(mask))
return mat
Мой вопрос: я хочу заменить отсутствующие значения на основе zipf distirbution/power low/long tail. Например, у меня есть набор данных, который содержит 10 столбцов (5 столбцов категориальных данных и 5 столбцов числовых данных). Я хочу заменить некоторые точки данных на 5 столбцов, категориальных на основе закона zipf, столбцы с левой стороны имеют больше отсутствующих, чем с правой стороны.
Я использовал Python для выполнения этой задачи.
Я видел руководство Scipy по распространению zipf по этой ссылке: https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.random.zipf.html, но все же это мне не очень помогает.
1 ответ
Распределения Zipf - это семейство распределений от 0 до бесконечности, в то время как вы хотите удалить значения только из 5 дискретных столбцов, поэтому для этого вам придется принимать произвольные решения. Вот один из способов:
- Выберите параметр для вашего дистрибутива Zipf, например a = 2, как в примере, приведенном на странице документации SciPy.
- Глядя на график, приведенный на той же странице, вы можете решить усечь до 10, то есть, если появляется какое-либо значение выборки, превышающее 10, вы просто отбрасываете его.
- Затем вы можете просто сопоставить оставшийся домен от 0 до 10 линейно с вашими пятью категориальными столбцами: любое значение от 0 до 2 соответствует первому столбцу и так далее.
Таким образом, вы итеративно выбираете отдельные значения из вашего дистрибутива Zipf, используя функцию SciPy. Для каждого значения выборки вы удаляете одну точку данных в столбце, которому соответствует значение (см. 3.), пока вы не достигнете желаемого общего процента пропущенных значений.