Напоминание плохо определено и установлено на 0,0 из-за отсутствия истинных образцов

Я пытаюсь проверить свои данные с помощью Kfold.

def printing_kfold_score(X,y):
fold = KFold(5,shuffle=False)
recall_accs=[]

for train_index, test_index in fold.split(X):
    X_train, X_test = X.iloc[train_index,:], X.iloc[test_index,:]
    y_train, y_test = y.iloc[train_index,:], y.iloc[test_index,:]

    # Call the logistic regression model with a certain C parameter
    lr = LogisticRegression(C = 0.01, penalty = 'l1',solver = 'liblinear')
    # Use the training data to fit the model. In this case, we use the portion of the fold to train the model
    lr.fit(X_train, y_train.values.ravel())

    # Predict values using the test indices in the training data
    y_pred_undersample = lr.predict(X_test)

    # Calculate the recall score and append it to a list for recall scores representing the current c_parameter
    recall_acc = recall_score(y_test,y_pred_undersample)
    recall_accs.append(recall_acc)
print(np.mean(recall_accs))

printing_kfold_score(X_undersample,y_undersample)

X_undersample - это фрейм данных (984,29)

y_undersample - это фрейм данных (984,1)

Я получаю следующее предупреждение:

0.5349321454470113
C:\Users\sudha\Anaconda3\lib\site-packages\sklearn\metrics\_classification.py:1272: UndefinedMetricWarning: Recall is ill-defined and being set to 0.0 due to no true samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, msg_start, len(result))
C:\Users\sudha\Anaconda3\lib\site-packages\sklearn\metrics\_classification.py:1272: UndefinedMetricWarning: Recall is ill-defined and being set to 0.0 due to no true samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, msg_start, len(result))

Почему я получаю это предупреждение, мои данные идеально сбалансированы (50/50), это предупреждение и низкая оценка отзыва не ожидалась. Можете ли вы сказать мне, что я делаю не так?

Я попытался распечатать форму значения и значение x_test и y_test.

   x_train shape (788, 29) 
   x_test shape (196, 29) 
   y_train shape (788, 1) 
   y_test shape (196, 1) 

 x_test      V1        V2        V3  ...       V27       V28     normAmount
    541  -2.312227  1.951992 -1.609851  ...  0.261145 -0.143276   -0.353229
    623  -3.043541 -3.157307  1.088463  ... -0.252773  0.035764    1.761758
    4920 -2.303350  1.759247 -0.359745  ...  0.039566 -0.153029    0.606031

y_test         Class
38042       0
170554      0
16019       0

Это из-за первого столбца, который представляет индекс?

Спасибо.


person AMIT BISHT    schedule 14.04.2020    source источник
comment
Я не могу получить желаемый результат бесполезен; в чем конкретно ваша проблема и ваш вопрос?   -  person desertnaut    schedule 14.04.2020
comment
Где именно (какой командой)? Пожалуйста, отредактируйте и обновите вопрос, указав полную трассировку ошибки.   -  person desertnaut    schedule 15.04.2020
comment
Это может быть y_test, в одной из ваших складок, не имеет положительных случаев - особенно с выборкой всего 984 записей. Хотя, если зависимая переменная действительно сбалансирована 50 на 50, это может быть маловероятным.   -  person blacksite    schedule 16.04.2020
comment
@blacksite, я обновил вопрос своим шлейфом и тестовой формой. также я распечатал значения y_test и x_test. Это из-за первого столбца моего df, который является значением индекса?   -  person AMIT BISHT    schedule 17.04.2020
comment
@AMITBISHT, это же модель бинарной классификации, верно? Возможно, я неправильно понимаю, но y_test в вашем DataFrame кажется индексом, где Class кажется (хотя здесь мы видим только 0) двоичным. Можете ли вы предоставить количество каждого значения по классам для прогнозируемых и фактических векторов классов?   -  person blacksite    schedule 17.04.2020
comment
@blacksite, привет, это бинарная классификация .y_pred_undersample [0 1 1 1 0 1 0 0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 1 1 1 1 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 1 1 0 0 0 0 0 1 1 1 0 1 1 0 1 1 1 0 0 1 0 1 1 0 0 1 0 1 0 1 1 1 0 0 1 1 0 0 0 0 0 1 0 1 1 0 1 1 1 0 1 0 0 0 0 0 1 0 0 1 1] и y_test меняются, иногда все 0, иногда 1 и т. д.   -  person AMIT BISHT    schedule 18.04.2020
comment
@blacksite, тоже пробовал с kfold = 2. И я получил ошибку ниже, и я думаю, что вы правы. ValueError: This solver needs samples of at least 2 classes in the data, but the data contains only one class: 0   -  person AMIT BISHT    schedule 18.04.2020


Ответы (1)


Вы описали проблему в своем комментарии:

y_test меняется - иногда все 0, иногда 1 и т. Д.

Фактически вот что происходит:

>>> from sklearn.metrics import *
>>> recall_score([0,0], [1,0])

UndefinedMetricWarning: Напоминание плохо определено и установлено на 0,0 из-за отсутствия истинных образцов. Используйте параметр zero_division для управления этим поведением. _warn_prf (среднее, модификатор, msg_start, len (результат))

Вы должны принять меры, чтобы y_test всегда были доступны положительные и отрицательные образцы, чтобы вы могли более точно оценить эффективность вашего классификатора.

person blacksite    schedule 19.04.2020
comment
Я устранил ошибку, просто включил shuffle = True в функции fold (). Но до сих пор неясно, как это влияет на KFold, потому что мой тестовый набор всегда различается по складке. - person AMIT BISHT; 23.04.2020