Как занижать выборку большинства класса с помощью pyspark - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь решить данные, как показано ниже, но я не понял, используя groupy и udf, а также обнаружил, что udf не может вернуть dataframe.

Есть ли способ, который мог бы реализовать это с помощью sparkили другой метод может обрабатывать несбалансированные данные

ratio = 3
def balance_classes(grp):
    picked = grp.loc[grp.editorsSelection == True]
    n = round(picked.shape[0]*ratio)
    if n:        
        try:
            not_picked = grp.loc[grp.editorsSelection == False].sample(n)
        except: # In case, fewer than n comments with `editorsSelection == False`
            not_picked = grp.loc[grp.editorsSelection == False]
        balanced_grp = pd.concat([picked, not_picked])
        return balanced_grp
    else: # If no editor's pick for an article, dicard all comments from that article
        return None 

comments = comments.groupby('articleID').apply(balance_classes).reset_index(drop=True)

1 Ответ

0 голосов
/ 31 декабря 2018

Я обычно использую эту логику для подвыборки:

def resample(base_features,ratio,class_field,base_class):
    pos = base_features.filter(col(class_field)==base_class)
    neg = base_features.filter(col(class_field)!=base_class)
    total_pos = pos.count()
    total_neg = neg.count()
    fraction=float(total_pos*ratio)/float(total_neg)
    sampled = neg.sample(False,fraction)
    return sampled.union(pos)

base_feature - это искровой фрейм данных, который имеет особенности.Соотношение - это желаемое соотношение между положительными и отрицательными значениями. class_field - это имя столбца, который содержит классы, а base_class - это идентификатор класса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...