Wie trainiere ich Xgboost auf einem großen Datensatz und verbessert die Betrugserkennung?Python

Python-Programme
Anonymous
 Wie trainiere ich Xgboost auf einem großen Datensatz und verbessert die Betrugserkennung?

Post by Anonymous »

Ich fange gerade erst mit ML an, also würde ich mich über einen Rat freuen. Die Daten sind stark unausgewogen (~ 96% Normal gegenüber ~ 4% betrügerisch). Speicherzuweisungsfehler: < /p>
xgboost.core.XGBoostError: bad_malloc: Failed to allocate 25547999900 bytes.
< /code>
Zweites Problem - Schlechte Vorhersagequalität
Ich trainiere auf 100K -Zeilen, aber egal wie ich XGBOOST stimmte, das Modell erkennt kaum Betrugsfälle. < /p>
Was sind die besten Klassenausgleichstechniken für Xgboost in einem solchen Szenario? Wie soll ich mit einem so großen Datensatz umgehen? Was würden Sie empfehlen, sich zu ändern?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>
Ich bin neu bei ML, also habe ich noch nicht viele Techniken ausprobiert. Ich habe mit verschiedenen XGBOOST -Parametern experimentiert und die Datensatzgröße so reduziert, dass sie in den Speicher passen, aber das Modell hat immer noch Schwierigkeiten, Betrugsfälle zu erkennen. Ich bin mir nicht sicher, was der beste Ansatz für den Umgang mit einem so großen und unausgeglichenen Datensatz ist, daher würde ich mich über einen Rat freuen.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post