Могу ли я узнать, как правильно обращаться с несбалансированным набором данных? - PullRequest
0 голосов
/ 07 апреля 2020

Я новичок в DataScience, и здесь, чтобы прояснить некоторые сомнения. У меня есть набор данных, который разбалансирован с 3 классами, в основном называется 1,2,3. «2» составляют большинство (56,89%), «1» - 9,6% и «3» - 33,4%. Могу ли я узнать, какова правильная процедура обработки несбалансированных наборов данных, и надеяться получить в итоге более высокую точность прогнозирования.

Прямо сейчас, что я делаю, это

1) Разделите наборы данных до 70:30 (поезд / тест)

2) используйте SMOTE, чтобы сделать его сбалансированным

3) Попытка использовать выбор функций, чтобы найти наиболее важную функцию и повторно преобразовать ее в новый набор поездов для тестирование. Но он столкнулся с ошибкой.

Мой ноутбук Jupyter столкнулся с ошибкой после 3-го шага, MemoryError: не удалось выделить 14680064 байта. Могу ли я знать, почему тоже? Большое спасибо, любой совет или помощь приветствуются!

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Пожалуйста, не используйте точность в мультиклассовой задаче.

Решение зависит от того, чего вы действительно хотите. Является ли этот класс меньшинства таким же важным, как и у большинства.

Об обработке. Одна вещь, которую вы можете сделать, это сбалансировать ваш набор данных во время обучения, сократив пространство выборки классов большинства до эквивалента классов меньшинства, если эти точки данных слишком малы, то, возможно, вы можете сделать двухуровневый классификатор. О создании искусственных точек данных (SMOTE). Иногда это может работать, а может и нет, зависит проблема от проблемы, поэтому укажите свою проблему. Вычислите и предоставьте PRFS для лучшего понимания того, чего вы действительно хотите достичь.

Об ошибке памяти у вас есть некоторые переменные, которые запрашивают больше, чем может обработать ваша система, и под этим я подразумеваю, что система резервирует некоторое дополнительное пространство, и вы выходите далеко за пределы этого или самого приятного фактора, с которым мы все сталкиваемся в науке о данных это «Проклятие размерности».

0 голосов
/ 07 апреля 2020

Вот пример общего примера c, который вы должны рассмотреть.

import pandas as pd
import numpy as np

# Read dataset
df = pd.read_csv('balance-scale.data', 
                 names=['balance', 'var1', 'var2', 'var3', 'var4'])

# Display example observations
df.head()

df['balance'].value_counts()
# R    288
# L    288
# B     49
# Name: balance, dtype: int64

# Transform into binary classification
df['balance'] = [1 if b=='B' else 0 for b in df.balance]

df['balance'].value_counts()
# 0    576
# 1     49
# Name: balance, dtype: int64
# About 8% were balanced

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# Next, we'll fit a very simple model using default settings for everything.
# Separate input features (X) and target variable (y)
y = df.balance
X = df.drop('balance', axis=1)

# Train model
clf_0 = LogisticRegression().fit(X, y)

# Predict on training set
pred_y_0 = clf_0.predict(X)

# How's the accuracy?
print( accuracy_score(pred_y_0, y) )
# 0.9216

# So our model has 92% overall accuracy, but is it because it's predicting only 1 class?
# Should we be excited?
print( np.unique( pred_y_0 ) )
# [0]

# at this point, we need to use RESAMPLING!
from sklearn.utils import resample
# Separate majority and minority classes
# upsample the miniority class
df_majority = df[df.balance==0]
df_minority = df[df.balance==1]

# Upsample minority class
df_minority_upsampled = resample(df_minority, 
                                 replace=True,     # sample with replacement
                                 n_samples=576,    # to match majority class
                                 random_state=123) # reproducible results

# Combine majority class with upsampled minority class
df_upsampled = pd.concat([df_majority, df_minority_upsampled])

# Display new class counts
df_upsampled.balance.value_counts()
# 1    576
# 0    576
# Name: balance, dtype: int64

# Separate input features (X) and target variable (y)
y = df_upsampled.balance
X = df_upsampled.drop('balance', axis=1)

# Train model
clf_1 = LogisticRegression().fit(X, y)

# Predict on training set
pred_y_1 = clf_1.predict(X)

# Is our model still predicting just one class?
print( np.unique( pred_y_1 ) )
# [0 1]

# How's our accuracy?
print( accuracy_score(y, pred_y_1) )
# 0.513888888889

# Great, now the model is no longer predicting just one class. While the accuracy also # took a nosedive, it's now more meaningful as a performance metric.

# now we need to downsample the majority class
# Separate majority and minority classes
df_majority = df[df.balance==0]
df_minority = df[df.balance==1]

# Downsample majority class
df_majority_downsampled = resample(df_majority, 
                                 replace=False,    # sample without replacement
                                 n_samples=49,     # to match minority class
                                 random_state=123) # reproducible results

# Combine minority class with downsampled majority class
df_downsampled = pd.concat([df_majority_downsampled, df_minority])

# Display new class counts
df_downsampled.balance.value_counts()
# 1    49
# 0    49
# Name: balance, dtype: int64

# Separate input features (X) and target variable (y)
y = df_downsampled.balance
X = df_downsampled.drop('balance', axis=1)

# Train model
clf_2 = LogisticRegression().fit(X, y)

# Predict on training set
pred_y_2 = clf_2.predict(X)

# Is our model still predicting just one class?
print( np.unique( pred_y_2 ) )
# [0 1]

# How's our accuracy?
print( accuracy_score(y, pred_y_2) )
# 0.581632653061

Всегда помните, что Random Forest al go может достаточно хорошо обрабатывать несбалансированные наборы данных, так что, возможно, это все, что вам нужно ! Я обычно начинаю каждый эксперимент со Random Forest. Если это даст результаты, которые я получу, я закончу. Не нужно охотиться и клевать для лучшего аль go во вселенной. Вы можете легко автоматизировать процесс тестирования десятков алгоритмов на любом заданном наборе данных.

# Separate input features (X) and target variable (y)
y = df.balance
X = df.drop('balance', axis=1)

# Train model
clf_4 = RandomForestClassifier()
clf_4.fit(X, y)

# Predict on training set
pred_y_4 = clf_4.predict(X)

# Is our model still predicting just one class?
print( np.unique( pred_y_4 ) )
# [0 1]

# How's our accuracy?
print( accuracy_score(y, pred_y_4) )
# 0.9744

# What about AUROC?
prob_y_4 = clf_4.predict_proba(X)
prob_y_4 = [p[1] for p in prob_y_4]
print( roc_auc_score(y, prob_y_4) )
# 0.999078798186

Ссылка:

https://elitedatascience.com/imbalanced-classes

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