Работа с крайне несбалансированным и плохо коррелированным набором данных - PullRequest
0 голосов
/ 17 ноября 2018

Я работаю со сложным набором данных, так как классы сильно разбалансированы и крайне некоррелированы. Набор имеет 96 000 значений, из которых менее 200 равны 1 с.

Я испробовал несколько методов, и с каждым из них точность и точность всегда были высокими, однако только несколько (менее 5) значений классифицируются как 1. Интересно, есть ли способ заставить машину классифицировать больше 1с. Если бы я мог правильно классифицировать только 25% времени, это был бы отличный результат.

Я пытался использовать параметр 'class weight' в произвольном лесу, но это, похоже, не влияет на результат.

import numpy as np
import pandas as pd
import sklearn as sklearn
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_pickle('/Users/shellyganga/Downloads/ola.pickle')

print(df.describe())

#filtering the df to improve results
df = df[(df['trip_duration'] > 5) & (df['Smooth_Driving_Score'] < 99)]

print(df.describe())


maxVal = 1
df.unsafe = df['unsafe'].where(df['unsafe'] <= maxVal, maxVal)

df.drop(df.columns[0], axis=1, inplace=True)
df.drop(df.columns[-2], axis=1, inplace=True)

#setting features and labels
labels = np.array(df['unsafe'])
features= df.drop('unsafe', axis = 1)

# Saving feature names for later use
feature_list = list(features.columns)

# Convert to numpy array
features = np.array(features)

from sklearn.model_selection import train_test_split

# 30% examples in test data
train, test, train_labels, test_labels = train_test_split(features, labels,
                                                          stratify = labels,
                                                          test_size = 0.4,
                                                          random_state = 12)

from sklearn.ensemble import RandomForestClassifier

# Create the model with 100 trees
model = RandomForestClassifier(n_estimators=100,
                               random_state=12,
                               max_features = 'sqrt',
                               n_jobs=-1, verbose = 1, class_weight={0:1, 1:1})

# Fit on training data
model.fit(train, train_labels)
predictions = model.predict(test)


print(np.mean(predictions))
print(predictions.shape)


from sklearn.metrics import classification_report
print(classification_report(test_labels, predictions)

Выход:

     precision    recall  f1-score   support

          0       1.00      1.00      1.00     38300
          1       1.00      0.01      0.02        90

avg / total       1.00      1.00      1.00     38390

Я пытался использовать {class_weight = 'balanced'} и дал другой результат, но у меня проблемы с его пониманием.

   micro avg       1.00      1.00      1.00     38390
   macro avg       1.00      0.51      0.51     38390
weighted avg       1.00      1.00      1.00     38390

Откуда я знаю, сколько положительных результатов он предсказал?

1 Ответ

0 голосов
/ 23 мая 2019

Эту степень дисбаланса обычно довольно трудно обойти, особенно если у вас много функций (из-за проклятия размерности).Если не будет четкой границы между двумя классами, будет трудно идентифицировать класс меньшинства из класса подавляющего большинства.Как предположили Люк и Такратис, как классный вес, так и избыточная выборка / недостаточная выборка являются хорошими подходами, которые вы должны попробовать.Кроме того, я бы также предложил использовать соответствующую метрику стоимости.Например, если ложные срабатывания более желательны, чем ложные отрицания, попытайтесь максимизировать повторный вызов вместо точности или точности.Я также рекомендовал бы комбинацию этих подходов.Итак, допустим,

  1. Переоценка класса меньшинства до 1000 строк.Попробуйте SMOTE во время передискретизации.
  2. Недопоставьте класс меньшинства в 5000-10000 строк.
  3. Применение весов классов для создания сбалансированных наборов.
  4. Оцените свою метрику стоимости на тестовом наборе и меняйте вышеуказанные числа, пока метрика не будет максимизирована.

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

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