# Distributed Action-Rule Discovery Based on Attribute Correlation and Vertical Data Partitioning
## 4 Materials and Methods
### Methods for Distributed Action Rule Generation
#### 4.1.1 Vertical Partitioning Based on Attribute Correlation
Clusters split the flexible attributes, and the stable attributes remained the same throughout. Using the example above, if we had two separate clusters \(\{D,E\}\) and \(\{B,C,A\}\), we would generate action  
Figure 1: Illustration of the Vertical Partitioning based on Attribute Correlation Method. This method efficiently groups features based on their mutual correlations, optimizing the partitioning process for action rule discovery. rules with the flexible attributes \(\{D,E\}\), and then we would generate another set of separate action rules using the flexible attributes \(\{B,C,A\}\). The stable attributes, consequent, and remaining parameters would remain identical for both. This work utilized the Python library developed by [PERSON] and [PERSON] (see [37]) to generate action rules, implementing the rule-based strategy described by [PERSON] and [PERSON] [20]. We will refer to this action rule generation method as [PERSON]'s package. Additionally, further experiments have been conducted using an alternative method for action rule discovery to facilitate comparative analysis. The details of this secondary action rule generation method are outlined in Section 4.1.2 and will be referred to as the RSES-based method. Next, we concatenated the action rules by taking combinations of rules from each cluster. For each combination, we then checked its supporting objects and excluded any combinations that created action rules with a support of zero. Note that the stable attributes remained the same, but the flexible attributes differed across clusters. As an example, cluster one may have the rule:  
\[r_{1}=[(sex,male)\wedge(class,3\to 1)]\Rightarrow(survived,0\to 1) \tag{8}\]  
Cluster two may have:  
\[r_{2}=[(sex,male)\wedge(embarked,Southampton\to Cherbourg)]\Rightarrow(survived,0 \to 1) \tag{9}\]  
We would then try to form the combined rule:  
\[r_{3}=[(sex,male)\wedge(embarked,Southampton\to Cherbourg)\wedge(class,3\to 1)] \Rightarrow(survived,0\to 1) \tag{10}\]  
With this potential rule, we would then have to find the intersection of support sets for \(r_{1}\) and \(r_{2}\). If this intersection is empty, we cannot make \(r_{3}\), and it would be excluded from the final set of action rules. Otherwise, it is added to our set of action rules for this particular partition. To determine the optimal partition and the number of clusters to be used for rules extraction, we iterated through the newly created set of action rules for each cluster and evaluated its performance. Performance is evaluated using the _F-score_, defined by:  
\[F\text{-}score(R)=2*(\frac{precision*recall}{precision+recall}) \tag{11}\]  
Precision is defined by:  
\[Precision(R)=\frac{\sum\{conf(r_{i})*sup(r_{i}):i\in I\}}{\sum sup(r_{i}):i\in I} \tag{12}\]  
where \(conf(r_{i})\) is the confidence of rule \(i\), and \(sup(r_{i})\) is the support of rule \(i\). Recall, then, is defined by:  
\[Recall(R)=card[\cup\{D_{i}:i\in I\}]/card(D), \tag{13}\]  
where \(card[\cup\{D_{i}:i\in I\}]\) is the cardinality (number of elements) of \(\cup\{D_{i}:i\in I\}\). In other words, we found the percentage of all objects in \(D\) that are covered by \(R\), our set of action rules. This definition of recall also takes into account the overlapping of domains--we want any object in overlapping domains to only be counted once. The set of action rules with the highest _F-score_ determines the optimal partition of flexible attributes.