Как повысить точность, не снижая количество повторных вызовов в несбалансированном наборе данных? - PullRequest
1 голос
/ 27 марта 2019

Я должен использовать дерево решений для двоичной классификации по несбалансированному набору данных (50000: 0, 1000: 1).Чтобы получить хороший результат (0,92), я использовал функцию RandomOversampling, найденную в модуле Imblearn, и обрезку с параметром max_depth.Проблема в том, что точность очень низкая (0,44), у меня слишком много ложных срабатываний.

Я пытался обучить определенный классификатор для работы с пограничными экземплярами, которые генерируют ложные срабатывания.Сначала я разбил набор данных в обучающих и тестовых наборах (80% -20%).Затем я разделил поезд на наборы train2 и test2 (66%, 33%).Я использовал dtc (# 1), чтобы предсказать test2, и я взял только случаи, предсказанные как истинные.Затем я обучил dtc (# 2) всем этим данным с целью создания классификатора, способного различать пограничные случаи.Я использовал dtc (# 3), обученный на первом наборе поездов с избыточной дискретизацией, чтобы предсказать официальный набор испытаний, и получил Recall = 0,92 и Precision = 0,44.Наконец, я использовал dtc (# 2) только для данных, которые dtc (# 3) предсказали как истинные, с надеждой отличить TP от FP, но это не слишком хорошо работает.Я получил Rec = 0,79 и Prec = 0,69.

x_train, X_test, y_train, Y_test =train_test_split(df2.drop('k',axis=1), df2['k'], test_size=test_size, random_state=0.2)
x_res, y_res=ros.fit_resample(x_train,y_train)

df_to_trick=df2.iloc[x_train.index.tolist(),:]
#....split in 0.33-0.66, trained and tested
confusion_matrix(y_test,predicted1) #dtc1
array([[13282,   266],
       [   18,   289]])

#training #dtc2 only on (266+289) datas

confusion_matrix(Y_test,predicted3) #dtc3 on official test set
array([[9950,  294],
       [  20,  232]])

confusion_matrix(true,predicted4)#here i used dtc2 on (294+232) datas
array([[204,  90],
       [ 34, 198]])

Я должен выбрать между dtc3 (Recall = 0,92, Prec = 0,44) или всем сервеллотическим процессом с (Recall = 0,79, Prec = 0,69).У вас есть идеи по улучшению этих показателей?Моя цель около (0,8 / 0,9).

1 Ответ

0 голосов
/ 27 марта 2019

Имейте в виду, что точность и отзыв основаны на выбранном вами пороге (т. Е. В sklearn порог по умолчанию равен 0,5 - любой класс с вероятностью предсказания> 0,5 классифицируется как положительный), и что всегда будет торговля между предпочтением точности над отзывом. ...

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

Приведенный ниже код может помочь вам визуализировать, как меняется ваша точность и отзыв, когда вы перемещаете порог принятия решения:

def plot_precision_recall_vs_threshold(precisions, recalls, thresholds):
    plt.figure(figsize=(8, 8))
    plt.title("Precision and Recall Scores as a function of the decision threshold")
    plt.plot(thresholds, precisions[:-1], "b--", label="Precision")
    plt.plot(thresholds, recalls[:-1], "g-", label="Recall")
    plt.ylabel("Score")
    plt.xlabel("Decision Threshold")
    plt.legend(loc='best')

Другие предложения по улучшению производительности вашей модели - либо использовать альтернативные методы предварительной обработки - SMOTE вместо случайной избыточной выборки, либо выбрать более сложный классификатор (случайный forrest / ансамбль деревьев или подход повышения, повышение ADA или повышение на основе градиента)

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