이번 포스팅에서는 PM4Py로 Token-based replay Confromance Checking을 하는 방법에 대해 알아보겠다.
*Token-based replay conformance checking이 무엇인지 모른다면 다음 포스팅을 참고하도록 한다.
Token-based Replay Conformance Checking이란?
Token-based Replay Conformance Checking이란 말 그대로 토큰을 이용하여 이를 프로세스 모델에 replay하면서 모델의 conformance를 checking하는 것을 말한다. 이번 포스팅에서는 token-based conformance check..
process-mining.tistory.com
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를 이용하여 모델의 성능을 판단할 수 있을 것이다.
최근댓글