Этот набор данных был взят из Kaggle, чтобы разработать модель машинного обучения для обнаружения мошенничества для обучения/практики. выполнил очистку данных и объединил несколько наборов данных в файл Final_df. добавил кучу производных функций во время предварительной обработки, выполнил необходимое кодирование, масштабирование функций, удалил несколько столбцов и т. д. подготовил данные для разделения поезда/теста и использовал RandomForestClassifier для выполнения подгонки (X_train, y_train) и прогнозирования y_pred с последующим запуском отчета о классификации и матрица точности_score и путаницы.
Проблема в том, что я получаю точность, напоминание, f1_score все равно 1,00 и поддержку 200 для точность, макросреднее и взвешенное среднее. и матрица путаницы равна 200. Я не уверен, как мне решить эту проблему переобучения, поскольку набор данных содержит мошеннические транзакции?
Кроме того, при запуске print(roc_auc_score(y_test, rf_model. Predict_proba(X_test)[:, 1])) это дает
IndexError: index 1 is out of bounds for axis 1 with size 1
Я не понимаю, почему это происходит и как мне решить эту проблему.
вот код. Я не включил очистку данных и объединение/объединение таблиц, а все, от предварительной обработки данных до создания RF-модели. вот Final_df, с которым я работаю.
final_df.to_csv('FraudDetection_df.csv', index=False)
final_df['LastLogin'] = pd.to_datetime(final_df['LastLogin'], errors='coerce')
# Data Preprocessing
# applying label encoding
le = LabelEncoder()
final_df['CustomerID'] = le.fit_transform(final_df['CustomerID'])
final_df['MerchantID'] = le.fit_transform(final_df['MerchantID'])`
# calculating mean fraud rate per merchant
merchant_fraud_rate = final_df.groupby('MerchantName')['FraudIndicator'].mean()
# Map the fraud rate back to the original dataframe
final_df['MerchantRisk'] = final_df['MerchantName'].map(merchant_fraud_rate)
# calculating mean fraud rate per customer
customer_fraud_rate = final_df.groupby('Name')['FraudIndicator'].mean()
# Map the fraud rate back to the original dataframe
final_df['CustomerRisk'] = final_df['Name'].map(customer_fraud_rate)
# Applying StandardScaler
scaler = StandardScaler()
final_df[['TransactionAmount', 'AccountBalance']] = scaler.fit_transform(final_df[['TransactionAmount', 'AccountBalance']])
# Average transaction amount per customer
avg_transaction_amount = final_df.groupby('CustomerID')['TransactionAmount'].mean().reset_index()
avg_transaction_amount.rename(columns={'TransactionAmount': 'AvgTransactionAmount'}, inplace=True)
# Merge with original dataframe
final_df = pd.merge(final_df, avg_transaction_amount, on='CustomerID', how='left')
# Average transaction amount per merchant
avg_transaction_amount_merchant = final_df.groupby('MerchantID')['TransactionAmount'].mean().reset_index()
avg_transaction_amount_merchant.rename(columns={'TransactionAmount': 'AvgTransactionAmount_Merchant'}, inplace=True)
final_df = pd.merge(final_df, avg_transaction_amount_merchant, on='MerchantID', how='left')
# Calculate variance in transaction amounts per customer
transaction_variance = final_df.groupby('CustomerID')['TransactionAmount'].var().reset_index()
transaction_variance.rename(columns={'TransactionAmount': 'TransactionVariance'}, inplace=True)
# Merge with original dataframe
final_df = pd.merge(final_df, transaction_variance, on='CustomerID', how='left')
# Creating a flag for single-transaction customers
final_df['SingleTransactionFlag'] = final_df['TransactionVariance'].isna().astype(int)
# Replace NaN values in the variance column with 0
final_df['TransactionVariance'].fillna(0, inplace=True)
pd.set_option('display.max_columns',None)
final_df['AvgTransactionAmount_Customer'] = final_df.groupby('CustomerID')['TransactionAmount'].transform('mean')
final_df['AvgTransactionAmount_Merchant'] = final_df.groupby('MerchantName')['TransactionAmount'].transform('mean')
final_df['SpendingTrend'] = final_df.groupby('CustomerID')['TransactionAmount'].transform(lambda x: x.rolling(window=3, min_periods=1).mean())
category_risk = final_df.groupby('Category')['SuspiciousFlag'].mean()
final_df['CategoryRisk'] = final_df['Category'].map(category_risk)
# customer_frequency = final_df.groupby(['CustomerID', 'Dates'])['TransactionID'].count().reset_index()
threshold = final_df['TransactionAmount'].quantile(0.95)
final_df['LargeTransactionFlag'] = (final_df['TransactionAmount'] > threshold).astype(int)
final_df['RollingAverage'] = final_df.groupby('CustomerID')['TransactionAmount'].transform(
lambda x: x.rolling(window=5, min_periods=1).mean()
)
final_df['SpendingAnomaly'] = (final_df['TransactionAmount'] > 1.5 * final_df['RollingAverage']).astype(int)
final_df['SuspiciousActivityFlag'] = (
(final_df['TransactionAmount'] > final_df['TransactionAmount'].quantile(0.95)) |
(final_df['AnomalyScore'] > 0.8) |
final_df['LargeTransactionFlag'] |
final_df['SpendingAnomaly']
).astype(int)
final_df['TransactionAmountToBalanceRatio'] = final_df['TransactionAmount'] / final_df['AccountBalance']
final_df['HighRatioFlag'] = (final_df['TransactionAmountToBalanceRatio'] > 1).astype(int)
final_df['CombinedRiskScore'] = (
final_df['SuspiciousActivityFlag']
)
final_df['FinalFraudFlag'] = (final_df['CombinedRiskScore'] > 1).astype(int)
final_df.columns = [col.replace('TransactionID_x', 'TransactionID') for col in final_df.columns]
final_df.drop(columns=['MerchantName', 'Category', 'Location', 'Name', 'Address', 'Timestamp', 'LastLogin', 'Dates'], inplace=True)
scale_features = ['TransactionAmount','AccountBalance',
'TransactionAmountToBalanceRatio',
'SpendingTrend',
'RollingAverage',
'AvgTransactionAmount_Customer',
'AvgTransactionAmount_Merchant']
scaler = MinMaxScaler()
final_df[scale_features] = scaler.fit_transform(final_df[scale_features])
# print(final_df[scale_features].head())
# print(final_df.columns)
# print(final_df.dtypes)
X = final_df.drop(columns=['FinalFraudFlag'])
y = final_df['FinalFraudFlag']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
# Make predictions
y_pred = rf_model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")
print("\nClassification Report:")
print(classification_report(y_test, y_pred))
# Confusion Matrix
print("\nConfusion Matrix:")
print(confusion_matrix(y_test, y_pred))
# Evaluate the model
print("ROC AUC Score:", roc_auc_score(y_test, rf_model.predict_proba(X_test)[:, 1]))
Подробнее здесь: https://stackoverflow.com/questions/793 ... tion-model
Как обеспечить 100% точность случайного леса для моей модели обнаружения мошенничества? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как применить CalibratedClassifierCV при внешней проверке модели случайного леса
Anonymous » » в форуме Python - 0 Ответы
- 31 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как применить CalibratedClassifierCV к внешней проверке модели случайного леса?
Anonymous » » в форуме Python - 0 Ответы
- 29 Просмотры
-
Последнее сообщение Anonymous
-