728x90
이번 포스팅에서는 PM4Py로 Token-based replay Confromance Checking을 하는 방법에 대해 알아보겠다.
*Token-based replay conformance checking이 무엇인지 모른다면 다음 포스팅을 참고하도록 한다.
1. 우선, 분석할 XES 파일을 import하여 이를 log에 저장하고, Conformance Checking을 원하는 모델을 net에 저장해준다. 필자는 inductive miner를 선택했다.
import os
from pm4py.objects.log.importer.xes import factory as xes_importer
from pm4py.algo.discovery.inductive import factory as inductive_miner
log = xes_importer.import_log(os.path.join("input_data","running-example.xes")) #join 안에 원하는 파일의 경로
net, initial_marking, final_marking = inductive_miner.apply(log) #원하는 모델을 선택한다.
2. 해당 log와 net에 대해서 token based replay를 적용시킨다.
from pm4py.algo.conformance.tokenreplay import factory as token_replay
replay_result = token_replay.apply(log, net, initial_marking, final_marking)
3. 결과값을 보기 위해 다음 코드를 입력해준다.
for i in replay_result:
print(i)
4. 다음과 같은 결과가 나오면 성공이다.
{'trace_is_fit': True, 'trace_fitness': 1.0, 'activated_transitions': [register request, tauSplit_2, examine casually, check ticket, tauJoin_3, decide, reinitiate request, loop_1, tauSplit_2, examine thoroughly, check ticket, tauJoin_3, decide, skip_4, pay compensation], 'reached_marking': ['sink:1'], 'enabled_transitions_in_marking': set(), 'transitions_with_problems': [], 'missing_tokens': 0, 'consumed_tokens': 10, 'remaining_tokens': 0, 'produced_tokens': 10}
{'trace_is_fit': True, 'trace_fitness': 1.0, 'activated_transitions': [register request, tauSplit_2, check ticket, examine casually, tauJoin_3, decide, skip_4, pay compensation], 'reached_marking': ['sink:1'], 'enabled_transitions_in_marking': set(), 'transitions_with_problems': [], 'missing_tokens': 0, 'consumed_tokens': 6, 'remaining_tokens': 0, 'produced_tokens': 6}
{'trace_is_fit': True, 'trace_fitness': 1.0, 'activated_transitions': [register request, tauSplit_2, examine thoroughly, check ticket, tauJoin_3, decide, skip_4, reject request], 'reached_marking': ['sink:1'], 'enabled_transitions_in_marking': set(), 'transitions_with_problems': [], 'missing_tokens': 0, 'consumed_tokens': 6, 'remaining_tokens': 0, 'produced_tokens': 6}
{'trace_is_fit': True, 'trace_fitness': 1.0, 'activated_transitions': [register request, tauSplit_2, examine casually, check ticket, tauJoin_3, decide, skip_4, pay compensation], 'reached_marking': ['sink:1'], 'enabled_transitions_in_marking': set(), 'transitions_with_problems': [], 'missing_tokens': 0, 'consumed_tokens': 6, 'remaining_tokens': 0, 'produced_tokens': 6}
{'trace_is_fit': True, 'trace_fitness': 1.0, 'activated_transitions': [register request, tauSplit_2, examine casually, check ticket, tauJoin_3, decide, reinitiate request, loop_1, tauSplit_2, check ticket, examine casually, tauJoin_3, decide, reinitiate request, loop_1, tauSplit_2, examine casually, check ticket, tauJoin_3, decide, skip_4, reject request], 'reached_marking': ['sink:1'], 'enabled_transitions_in_marking': set(), 'transitions_with_problems': [], 'missing_tokens': 0, 'consumed_tokens': 14, 'remaining_tokens': 0, 'produced_tokens': 14}
{'trace_is_fit': True, 'trace_fitness': 1.0, 'activated_transitions': [register request, tauSplit_2, check ticket, examine thoroughly, tauJoin_3, decide, skip_4, reject request], 'reached_marking': ['sink:1'], 'enabled_transitions_in_marking': set(), 'transitions_with_problems': [], 'missing_tokens': 0, 'consumed_tokens': 6, 'remaining_tokens': 0, 'produced_tokens': 6}
이 결과값이 무엇을 뜻하는지 하나하나 살펴보겠다. 우선, 각 줄은 하나의 trace에 해당한다.
- trace_is_fit: 해당 trace가 model에 fit했는지를 표시한다. True이면 fitting, False이면 non-fitting이다.
- trace_fitness: 해당 trace가 model에 대해 가지는 token-based replay conformance checking 결과 fitness 값이다.
- activated_transitions: replay 동안 activate된 트랜지션의 목록이다.
- reached_marking: replay 마지막의 marking이다.
- enabled_transitions_in_marking: 마지막 marking에서 enable된 트랜지션의 목록이다.
5. 각 trace에 대한 fitness 값이 아닌 전체의 fitness 값을 보고 싶으면 다음 코드를 입력한다.
from pm4py.evaluation.replay_fitness import factory as replay_fitness_factory
log_fitness = replay_fitness_factory.evaluate(replay_result, variant="token_replay")
print(log_fitness)
6. 다음과 같은 결과값이 나오면 성공이다.
{'percFitTraces': 100.0, 'averageFitness': 1.0}
각 결과값은 다음과 같은 의미를 가지고 있다.
- percFitTraces: 모델에 대해 perfectly fitting하는 trace의 비율
- averageFitness: 전체 이벤트 로그의 평균 fitness 값
이번 포스팅에서는 pm4py를 이용하여 token-based replay conformance checking을 하는 법에 대해 알아보았다. 몇몇 툴들이 conformance checking은 다루지 않는 경우가 있는데, 그럴 때 pm4py를 이용하여 모델의 성능을 판단할 수 있을 것이다.
300x250
최근댓글