Как обеспечить 100% точность случайного леса для моей модели обнаружения мошенничества?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как обеспечить 100% точность случайного леса для моей модели обнаружения мошенничества?

Сообщение Anonymous »

Этот набор данных был взят из 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»