138 lines
4.0 KiB
Python
138 lines
4.0 KiB
Python
|
|
import pytest
|
||
|
|
from src.features import (
|
||
|
|
TransactionFeatures, EvaluationResult, ExplanationResult,
|
||
|
|
ActionPlan, DecisionResult, ModelMetrics, TrainingResult,
|
||
|
|
TransactionClass, ConfidenceLevel, Priority,
|
||
|
|
FeatureContribution, Action
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
def test_transaction_features():
|
||
|
|
features = TransactionFeatures(
|
||
|
|
time=0.0,
|
||
|
|
v1=-1.36, v2=-0.07, v3=2.54, v4=1.38, v5=-0.34,
|
||
|
|
v6=0.46, v7=0.24, v8=0.10, v9=0.36, v10=0.09,
|
||
|
|
v11=-0.55, v12=-0.62, v13=-0.99, v14=-0.31, v15=1.47,
|
||
|
|
v16=-0.47, v17=0.21, v18=0.03, v19=0.40, v20=0.25,
|
||
|
|
v21=-0.02, v22=0.28, v23=-0.11, v24=0.07, v25=0.13,
|
||
|
|
v26=-0.19, v27=0.13, v28=-0.02, amount=149.62
|
||
|
|
)
|
||
|
|
assert features.time == 0.0
|
||
|
|
assert features.amount == 149.62
|
||
|
|
assert len(features.to_array()) == 30
|
||
|
|
|
||
|
|
|
||
|
|
def test_evaluation_result():
|
||
|
|
result = EvaluationResult(
|
||
|
|
predicted_class=1,
|
||
|
|
class_name=TransactionClass.FRAUD,
|
||
|
|
fraud_probability=0.95,
|
||
|
|
normal_probability=0.05,
|
||
|
|
confidence=ConfidenceLevel.HIGH
|
||
|
|
)
|
||
|
|
assert result.predicted_class == 1
|
||
|
|
assert result.class_name == TransactionClass.FRAUD
|
||
|
|
assert result.fraud_probability == 0.95
|
||
|
|
assert result.confidence == ConfidenceLevel.HIGH
|
||
|
|
|
||
|
|
|
||
|
|
def test_feature_contribution():
|
||
|
|
contribution = FeatureContribution(
|
||
|
|
feature_name="V14",
|
||
|
|
value=-0.99,
|
||
|
|
importance=0.15,
|
||
|
|
contribution=-0.15,
|
||
|
|
impact="负"
|
||
|
|
)
|
||
|
|
assert contribution.feature_name == "V14"
|
||
|
|
assert contribution.value == -0.99
|
||
|
|
assert contribution.importance == 0.15
|
||
|
|
assert contribution.impact == "负"
|
||
|
|
|
||
|
|
|
||
|
|
def test_explanation_result():
|
||
|
|
explanation = ExplanationResult(
|
||
|
|
model_type="RandomForestClassifier",
|
||
|
|
predicted_class=TransactionClass.FRAUD,
|
||
|
|
key_features=[],
|
||
|
|
overall_explanation="测试解释"
|
||
|
|
)
|
||
|
|
assert explanation.model_type == "RandomForestClassifier"
|
||
|
|
assert explanation.predicted_class == TransactionClass.FRAUD
|
||
|
|
|
||
|
|
|
||
|
|
def test_action():
|
||
|
|
action = Action(
|
||
|
|
priority=Priority.URGENT,
|
||
|
|
action="冻结账户",
|
||
|
|
reason="检测到欺诈"
|
||
|
|
)
|
||
|
|
assert action.priority == Priority.URGENT
|
||
|
|
assert action.action == "冻结账户"
|
||
|
|
|
||
|
|
|
||
|
|
def test_action_plan():
|
||
|
|
plan = ActionPlan(
|
||
|
|
predicted_class=TransactionClass.FRAUD,
|
||
|
|
confidence=ConfidenceLevel.HIGH,
|
||
|
|
actions=[]
|
||
|
|
)
|
||
|
|
assert plan.predicted_class == TransactionClass.FRAUD
|
||
|
|
assert plan.confidence == ConfidenceLevel.HIGH
|
||
|
|
|
||
|
|
|
||
|
|
def test_decision_result():
|
||
|
|
result = DecisionResult(
|
||
|
|
evaluation=EvaluationResult(
|
||
|
|
predicted_class=1,
|
||
|
|
class_name=TransactionClass.FRAUD,
|
||
|
|
fraud_probability=0.95,
|
||
|
|
normal_probability=0.05,
|
||
|
|
confidence=ConfidenceLevel.HIGH
|
||
|
|
),
|
||
|
|
explanation=ExplanationResult(
|
||
|
|
model_type="RandomForestClassifier",
|
||
|
|
predicted_class=TransactionClass.FRAUD,
|
||
|
|
key_features=[],
|
||
|
|
overall_explanation="测试"
|
||
|
|
),
|
||
|
|
action_plan=ActionPlan(
|
||
|
|
predicted_class=TransactionClass.FRAUD,
|
||
|
|
confidence=ConfidenceLevel.HIGH,
|
||
|
|
actions=[]
|
||
|
|
),
|
||
|
|
timestamp="2026-01-15"
|
||
|
|
)
|
||
|
|
assert result.evaluation.predicted_class == 1
|
||
|
|
assert result.explanation.model_type == "RandomForestClassifier"
|
||
|
|
assert result.action_plan.predicted_class == TransactionClass.FRAUD
|
||
|
|
|
||
|
|
|
||
|
|
def test_model_metrics():
|
||
|
|
metrics = ModelMetrics(
|
||
|
|
accuracy=0.95,
|
||
|
|
precision=0.90,
|
||
|
|
recall=0.85,
|
||
|
|
f1_score=0.87,
|
||
|
|
pr_auc=0.92
|
||
|
|
)
|
||
|
|
assert metrics.accuracy == 0.95
|
||
|
|
assert metrics.precision == 0.90
|
||
|
|
assert metrics.pr_auc == 0.92
|
||
|
|
|
||
|
|
|
||
|
|
def test_training_result():
|
||
|
|
result = TrainingResult(
|
||
|
|
model_name="random_forest",
|
||
|
|
metrics=ModelMetrics(
|
||
|
|
accuracy=0.95,
|
||
|
|
precision=0.90,
|
||
|
|
recall=0.85,
|
||
|
|
f1_score=0.87,
|
||
|
|
pr_auc=0.92
|
||
|
|
),
|
||
|
|
confusion_matrix=[[100, 5], [10, 85]]
|
||
|
|
)
|
||
|
|
assert result.model_name == "random_forest"
|
||
|
|
assert result.metrics.accuracy == 0.95
|