Я только начинаю с ML, поэтому я буду признателен за любым советом. Данные сильно несбалансированы (~ 96% нормального и ~ 4% мошенничества).
Первая проблема - потребление памяти
файл обучения составляет 32 ГБ, но даже при чтении всего 1 миллиона строк я получаю Ошибка распределения памяти: < /p>
xgboost.core.XGBoostError: bad_malloc: Failed to allocate 25547999900 bytes.
< /code>
Вторая проблема - плохое качество прогнозирования
Я тренируюсь на строках 100 тыс., Но независимо от того, как я настраиваю XGBOOST, модель едва обнаруживает случаи мошенничества. < /p>
Каковы лучшие методы балансировки класса для XGBOOST в таком сценарии? Как мне справиться с набором данных таким большим? Что бы вы порекомендовали изменить?
Введите описание изображения здесь < /p>
df = pd.read_csv('train.csv', nrows=100000)
df.drop(['transaction_id', 'card_holder_first_name', 'card_holder_last_name', 'is_verified', 'browser', 'browser_version',
'operating_system', 'operating_system_version', 'card_id', 'ip_address', 'merchant_customer_id', 'merchant_id', 'user_agent',
'merchant_customer_last_name', 'merchant_customer_first_name', 'merchant_customer_phone', 'merchant_customer_email', 'bin','device',
'traffic_source', 'transaction_source', 'merchant_city', 'merchant_shop_id', 'merchant_shop_name', 'order_number'],
axis=1, inplace=True)
df['bank'].replace(' ', '_', regex=True, inplace=True)
df['created_at'] = pd.to_datetime(df['created_at'])
df['seconds_since_midnight'] = df['created_at'].dt.hour * 3600 + df['created_at'].dt.minute * 60 + df['created_at'].dt.second
df['day_of_week'] = df['created_at'].dt.weekday
df.drop('created_at', axis=1, inplace=True)
df.loc[pd.isna(df['merchant_language']), 'merchant_language'] = 'unknown'
df.loc[pd.isna(df['payment_type']), 'payment_type'] = 0
X = df.drop('is_fraud', axis=1).copy()
y = df['is_fraud'].copy()
X_encoded = pd.get_dummies(X, columns=['merchant_country',
'transaction_type',
'merchant_language',
'platform',
'ip_country',
'bank',
'cardbrand',
'cardcountry',
'cardtype',
'payment_type'])
X_train, X_test, y_train, y_test = train_test_split(X_encoded, y, random_state=42, stratify=y)
clf_xgb = xgb.XGBClassifier(
objective="binary:logistic",
seed=42,
eval_metric="aucpr",
early_stopping_rounds=10,
max_depth=6,
subsample=0.8,
colsample_bytree=0.8
)
clf_xgb.fit(
X_train,
y_train,
eval_set=[(X_test, y_test)],
verbose=True
)
disp = ConfusionMatrixDisplay.from_estimator(
clf_xgb,
X_test,
y_test,
display_labels=["Not fraudsters", "Fraud"],
cmap="Blues"
)
disp.plot(values_format='d')
plt.show()
< /code>
Я новичок в ML, поэтому я еще не пробовал много методов. Я экспериментировал с различными параметрами XGBOOST и уменьшил размер набора данных, чтобы соответствовать памяти, но модель все еще изо всех сил пытается обнаружить случаи мошенничества. Я не уверен, что лучше всего подходит для обработки такого большого и несбалансированного набора данных, поэтому я бы признателен за любые советы.
Подробнее здесь: https://stackoverflow.com/questions/794 ... -detection
Как тренировать XGBOOST на большом наборе данных и улучшить обнаружение мошенничества? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как обеспечить 100% точность случайного леса для моей модели обнаружения мошенничества?
Anonymous » » в форуме Python - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-