Close Menu
    Trending
    • Creating AI that matters | MIT News
    • Scaling Recommender Transformers to a Billion Parameters
    • Hidden Gems in NumPy: 7 Functions Every Data Scientist Should Know
    • Is RAG Dead? The Rise of Context Engineering and Semantic Layers for Agentic AI
    • ChatGPT Gets More Personal. Is Society Ready for It?
    • Why the Future Is Human + Machine
    • Why AI Is Widening the Gap Between Top Talent and Everyone Else
    • Implementing the Fourier Transform Numerically in Python: A Step-by-Step Guide
    ProfitlyAI
    • Home
    • Latest News
    • AI Technology
    • Latest AI Innovations
    • AI Tools & Technologies
    • Artificial Intelligence
    ProfitlyAI
    Home » A Practical Starters’ Guide to Causal Structure Learning with Bayesian Methods in Python
    Artificial Intelligence

    A Practical Starters’ Guide to Causal Structure Learning with Bayesian Methods in Python

    ProfitlyAIBy ProfitlyAIJune 17, 2025No Comments30 Mins Read
    Share Facebook Twitter Pinterest LinkedIn Tumblr Reddit Telegram Email
    Share
    Facebook Twitter LinkedIn Pinterest Email


    throughout variables generally is a difficult however vital step for strategic actions. I’ll summarize the ideas of causal fashions when it comes to Bayesian probabilistic fashions, adopted by a hands-on tutorial to detect causal relationships utilizing Bayesian construction studying, Parameter studying, and additional look at utilizing inferences. I’ll use the sprinkler information set to conceptually clarify how constructions are discovered with the usage of the Python library bnlearn. After studying this weblog, you possibly can create causal networks and make inferences by yourself information set.


    This weblog comprises hands-on examples! This can assist you to be taught faster, perceive higher, and keep in mind longer. Seize a espresso and check out it out! Disclosure: I’m the creator of the Python packages bnlearn.


    Background.

    The usage of machine studying methods has turn into a regular toolkit to acquire helpful insights and make predictions in lots of areas, similar to illness prediction, suggestion methods, and pure language processing. Though good performances might be achieved, it is just not simple to extract causal relationships with, for instance, the goal variable. In different phrases, which variables do have direct causal impact on the goal variable? Such insights are vital to decide the driving elements that attain the conclusion, and as such, strategic actions might be taken. A department of machine studying is Bayesian probabilistic graphical fashions, additionally named Bayesian networks (BN), which can be utilized to find out such causal elements. Be aware that a variety of aliases exist for Bayesian graphical fashions, similar to: Bayesian networks, Bayesian perception networks, Bayes Web, causal probabilistic networks, and Affect diagrams.

    Let’s rehash some terminology earlier than we leap into the technical particulars of causal fashions. It is not uncommon to make use of the phrases “correlation” and “affiliation” interchangeably. However everyone knows that correlation or affiliation is just not causation. Or in different phrases, noticed relationships between two variables don’t essentially imply that one causes the opposite. Technically, correlation refers to a linear relationship between two variables, whereas affiliation refers to any relationship between two (or extra) variables. Causation, then again, signifies that one variable (usually known as the predictor variable or impartial variable) causes the opposite (usually known as the result variable or dependent variable) [1]. Within the subsequent two sections, I’ll briefly describe correlation and affiliation by instance within the subsequent part.


    Correlation.

    Pearson’s correlation is probably the most generally used correlation coefficient. It’s so widespread that it’s usually used synonymously with correlation. The power is denoted by r and measures the power of a linear relationship in a pattern on a standardized scale from -1 to 1. There are three attainable outcomes when utilizing correlation:

    • Optimistic correlation: a relationship between two variables during which each variables transfer in the identical course
    • Detrimental correlation: a relationship between two variables during which a rise in a single variable is related to a lower within the different, and
    • No correlation: when there isn’t any relationship between two variables.

    An instance of constructive correlation is demonstrated in Determine 1, the place the connection is seen between chocolate consumption and the variety of Nobel Laureates per nation [2].

    Determine 1: correlation between Chocolate consumption vs. Nobel Laureates

    The determine reveals that chocolate consumption might indicate a rise in Nobel Laureates. Or the opposite method round, a rise in Nobel laureates might likewise underlie a rise in chocolate consumption. Regardless of the sturdy correlation, it’s extra believable that unobserved variables similar to socioeconomic standing or high quality of the schooling system would possibly trigger a rise in each chocolate consumption and Nobel Laureates. Or in different phrases, it’s nonetheless unknown whether or not the connection is causal [2]. This doesn’t imply that correlation by itself is ineffective; it merely has a unique function [3]. Correlation by itself doesn’t indicate causation as a result of statistical relations don’t uniquely constrain causal relations. Within the subsequent part, we are going to dive into associations. Carry on studying!


    Affiliation.

    Once we speak about affiliation, we imply that sure values of 1 variable are likely to co-occur with sure values of the opposite variable. From a statistical viewpoint, there are a lot of measures of affiliation, such because the chi-square check, Fisher’s actual check, hypergeometric check, and so on. Affiliation measures are used when one or each variables are categorical, that’s, both nominal or ordinal. It ought to be famous that correlation is a technical time period, whereas the time period affiliation is just not, and due to this fact, there’s not all the time consensus concerning the which means in statistics. Because of this it’s all the time a superb follow to state the which means of the phrases you’re utilizing. Extra details about associations might be discovered at this GitHub repo: Hnet [5].

    To display the usage of associations, I’ll use the Hypergeometric check and quantify whether or not two variables are related within the predictive upkeep information set [9] (CC BY 4.0 licence). The predictive upkeep information set is a so-called mixed-type information set containing a mixture of steady, categorical, and binary variables. It captures operational information from machines, together with each sensor readings and failure occasions. The info set additionally data whether or not particular kinds of failures occurred, similar to instrument put on failure or warmth dissipation failure, represented as binary variables. See the desk under with particulars concerning the variables.

    The desk offers an summary of the variables within the predictive upkeep information set. There are various kinds of variables, identifiers, sensor readings, and goal variables (failure indicators). Every variable is characterised by its function, information sort, and a short description.

    One of the vital variables is machine failure and energy failure. We’d count on a robust affiliation between these two variables. Let me display the way to compute the affiliation between the 2. First, we have to set up the bnlearn library and cargo the information set.

    # Set up Python bnlearn package deal
    pip set up bnlearn
    import bnlearn
    import pandas as pd
    from scipy.stats import hypergeom
    
    # Load predictive upkeep information set
    df = bnlearn.import_example(information='predictive_maintenance')
    
    # print dataframe
    print(df)
    +-------+------------+------+------------------+----+-----+-----+-----+-----+
    |  UDI | Product ID  | Kind | Air temperature  | .. | HDF | PWF | OSF | RNF |
    +-------+------------+------+------------------+----+-----+-----+-----+-----+
    |    1 | M14860      |   M  | 298.1            | .. |   0 |   0 |   0 |   0 |
    |    2 | L47181      |   L  | 298.2            | .. |   0 |   0 |   0 |   0 |
    |    3 | L47182      |   L  | 298.1            | .. |   0 |   0 |   0 |   0 |
    |    4 | L47183      |   L  | 298.2            | .. |   0 |   0 |   0 |   0 |
    |    5 | L47184      |   L  | 298.2            | .. |   0 |   0 |   0 |   0 |
    | ...  | ...         | ...  | ...              | .. | ... | ... | ... | ... |
    | 9996 | M24855      |   M  | 298.8            | .. |   0 |   0 |   0 |   0 |
    | 9997 | H39410      |   H  | 298.9            | .. |   0 |   0 |   0 |   0 |
    | 9998 | M24857      |   M  | 299.0            | .. |   0 |   0 |   0 |   0 |
    | 9999 | H39412      |   H  | 299.0            | .. |   0 |   0 |   0 |   0 |
    |10000 | M24859      |   M  | 299.0            | .. |   0 |   0 |   0 |   0 |
    +-------+-------------+------+------------------+----+-----+-----+-----+-----+
    [10000 rows x 14 columns]

    Null speculation: There isn’t any affiliation between machine failure and energy failure (PWF).

    print(df[['Machine failure','PWF']])
    
    | Index | Machine failure | PWF |
    |-------|------------------|-----|
    | 0     | 0                | 0   |
    | 1     | 0                | 0   |
    | 2     | 0                | 0   |
    | 3     | 0                | 0   |
    | 4     | 0                | 0   |
    | ...   | ...              | ... |
    | 9995  | 0                | 0   |
    | 9996  | 0                | 0   |
    | 9997  | 0                | 0   |
    | 9998  | 0                | 0   |
    | 9999  | 0                | 0   |
    |-------|------------------|-----|
    
    # Whole variety of samples
    N=df.form[0]
    
    # Variety of success within the inhabitants
    Okay=sum(df['Machine failure']==1)
    
    # Pattern measurement/variety of attracts
    n=sum(df['PWF']==1)
    
    # Overlap between Energy failure and machine failure
    x=sum((df['PWF']==1) & (df['Machine failure']==1))
    
    print(x-1, N, n, Okay)
    # 94 10000 95 339
    
    # Compute
    P = hypergeom.sf(x, N, n, Okay)
    P = hypergeom.sf(94, 10000, 95, 339)
    
    print(P)
    # 1.669e-146

    The hypergeometric check makes use of the hypergeometric distribution to measure the statistical significance of a discrete likelihood distribution. On this instance, N is the inhabitants measurement (10000), Okay is the variety of profitable states within the inhabitants (339), n is the pattern measurement/variety of attracts (95), and x is the variety of successes (94).

    Equation 1: Take a look at the affiliation between machine failure and energy failure utilizing the Hypergeometric check.

    We will reject the null speculation underneath alpha=0.05, and due to this fact, we will talk about a statistically vital affiliation between machine failure and energy failure. Importantly, affiliation by itself doesn’t indicate causation. Strictly talking, this statistic additionally doesn’t inform us the course of impression. We have to distinguish between marginal associations and conditional associations. The latter is the important thing constructing block of causal inference. Now that now we have discovered about associations, we will proceed to causation within the subsequent part!


    Causation.

    Causation signifies that one (impartial) variable causes the opposite (dependent) variable and is formulated by Reichenbach (1956) as follows:

    If two random variables X and Y are statistically dependent (X/Y), then both (a) X causes Y, (b) Y causes X, or (c ) there exists a 3rd variable Z that causes each X and Y. Additional, X and Y turn into impartial given Z, i.e., X⊥Y∣Z.

    This definition is included in Bayesian graphical fashions. To elucidate this extra completely, let’s begin with the graph and visualize the statistical dependencies between the three variables described by Reichenbach (X, Y, Z) as proven in Determine 2. Nodes correspond to variables (X, Y, Z), and the directed edges (arrows) point out dependency relationships or conditional distributions.

    Determine 2: DAGs encode conditional independencies. (a, b, c) are Equivalence lessons. (a, b) Cascade, (c ) Widespread mum or dad, and (d) is a particular class with V-structure.

    4 graphs might be created: (a) and (b) are cascade, (c) widespread mum or dad, and (d) the V-structure. These 4 graphs type the idea for each Bayesian community.

    1. How can we inform what causes what?

    The conceptual concept to find out the course of causality, thus which node influences which node, is by holding one node fixed after which observing the impact. For example, let’s take DAG (a) in Determine 2, which describes that Z is brought on by X, and Y is brought on by Z. If we now preserve Z fixed, there shouldn’t be a change in Y if this mannequin is true. Each Bayesian community might be described by these 4 graphs, and with likelihood idea (see the part under) we will glue the elements collectively.

    Bayesian community is a cheerful marriage between likelihood and graph idea.

    It ought to be famous {that a} Bayesian community is a Directed Acyclic Graph (DAG), and DAGs are causal. Because of this the perimeters within the graph are directed and there’s no (suggestions) loop (acyclic).

    2. Likelihood idea.

    Likelihood idea, or extra particularly, Bayes’ theorem or Bayes Rule, varieties the fundament for Bayesian networks. The Bayes’ rule is used to replace mannequin info, and said mathematically as the next equation:

    Equation 2: Bayes’ rule.

    The equation consists of 4 elements;

    • The posterior likelihood is the likelihood that Z happens given X.
    • The conditional likelihood or chances are the likelihood of the proof on condition that the speculation is true. This may be derived from the information.
    • Our prior perception is the likelihood of the speculation earlier than observing the proof. This can be derived from the information or area data.
    • The marginal likelihood describes the likelihood of the brand new proof underneath all attainable hypotheses, which must be computed.

    If you wish to learn extra concerning the (factorized) likelihood distribution or extra particulars concerning the joint distribution for a Bayesian community, do that weblog [6].

    3. Bayesian Construction Studying to estimate the DAG.

    With construction studying, we wish to decide the construction of the graph that finest captures the causal dependencies between the variables within the information set. Or in different phrases:

    Construction studying is to find out the DAG that most closely fits the information.

    A naïve method to seek out the most effective DAG is by merely creating all attainable mixtures of the graph, i.e., by making tens, lots of, and even 1000’s of various DAGs till all mixtures are exhausted. Every DAG can then be scored on the match of the information. Lastly, the best-scoring DAG is returned. Within the case of variables X, Y, Z, one could make the graphs as proven in Determine 2 and some extra, as a result of it isn’t solely X>Z>Y (Determine 2a), but it surely can be Z>X>Y, and so on. The variables X, Y, Z might be boolean values (True or False), however may have a number of states. Within the latter case, the search area of DAGs turns into so-called super-exponential within the variety of variables that maximize the rating. Because of this an exhaustive search is virtually infeasible with a lot of nodes, and due to this fact, varied grasping methods have been proposed to browse DAG area. With optimization-based search approaches, it’s attainable to browse a bigger DAG area. Such approaches require a scoring operate and a search technique. A standard scoring operate is the posterior likelihood of the construction given the coaching information, just like the BIC or the BDeu.

    Construction studying for DAGs requires two elements: 1. scoring operate and a pair of. search technique.

    Earlier than we leap into the examples, it’s all the time good to know when to make use of which method. There are two broad approaches to go looking all through the DAG area and discover the best-fitting graph for the information.

    • Rating-based construction studying
    • Constraint-based construction studying

    Be aware {that a} native search technique makes incremental modifications aimed toward bettering the rating of the construction. A worldwide search algorithm like Markov chain Monte Carlo can keep away from getting trapped in native minima, however I cannot talk about that right here.

    4. Rating-based Construction Studying.

    Rating-based approaches have two most important elements:

    1. The search algorithm to optimize all through the search area of all attainable DAGs, similar to ExhaustiveSearch, Hillclimbsearch, Chow-Liu.
    2. The scoring operate signifies how effectively the Bayesian community matches the information. Generally used scoring features are Bayesian Dirichlet scores similar to BDeu or K2 and the Bayesian Data Criterion (BIC, additionally known as MDL).

    4 widespread score-based strategies are depicted under, however extra particulars concerning the Bayesian scoring strategies might be discovered right here [11].

    • ExhaustiveSearch, because the title implies, scores each attainable DAG and returns the best-scoring DAG. This search strategy is just enticing for very small networks and prohibits environment friendly native optimization algorithms to all the time discover the optimum construction. Thus, figuring out the best construction is commonly not tractable. However, heuristic search methods usually yield good outcomes if just a few nodes are concerned (learn: lower than 5 or so).
    • Hillclimbsearch is a heuristic search strategy that can be utilized if extra nodes are used. HillClimbSearch implements a grasping native search that begins from the DAG “begin” (default: disconnected DAG) and proceeds by iteratively performing single-edge manipulations that maximally improve the rating. The search terminates as soon as an area most is discovered.
    • Chow-Liu algorithm is a particular sort of tree-based strategy. The Chow-Liu algorithm finds the maximum-likelihood tree construction the place every node has at most one mum or dad. The complexity might be restricted by limiting to tree constructions.
    • Tree-augmented Naive Bayes (TAN) algorithm can also be a tree-based strategy that can be utilized to mannequin enormous information units involving a lot of uncertainties amongst its varied interdependent characteristic units [6].

    5. Constraint-based Construction Studying

    • Chi-square check. A distinct, however fairly simple strategy to assemble a DAG by figuring out independencies within the information set utilizing speculation checks, such because the chi2 check statistic. This strategy does depend on statistical checks and conditional hypotheses to be taught independence among the many variables within the mannequin. The P-value of the chi2 check is the likelihood of observing the computed chi2 statistic, given the null speculation that X and Y are impartial, given Z. This can be utilized to make impartial judgments, at a given stage of significance. An instance of a constraint-based strategy is the PC algorithm, which begins with a whole, totally related graph and removes edges based mostly on the outcomes of the checks if the nodes are impartial till a stopping criterion is achieved.

    The bnlearn library

    Just a few phrases concerning the bnlearn library that’s used for all of the analyses on this article. bnlearn is Python package deal for causal discovery by studying the graphical construction of Bayesian networks, parameter studying, inference, and sampling strategies. As a result of probabilistic graphical fashions might be troublesome to make use of, bnlearn for Python comprises the most-wanted pipelines. The important thing pipelines are:

    • Structure learning: Given the information, estimate a DAG that captures the dependencies between the variables.
    • Parameter learning: Given the information and DAG, estimate the (conditional) likelihood distributions of the person variables.
    • Inference: Given the discovered mannequin, decide the precise likelihood values to your queries.
    • Synthetic Data: Technology of artificial information.
    • Discretize Data: Discretize steady information units.

    On this article, I don’t point out artificial information, however if you wish to be taught extra about information era, learn this weblog right here:

    What advantages does bnlearn provide over different Bayesian evaluation implementations?

    • Comprises the most-wanted Bayesian pipelines.
    • Easy and intuitive in utilization.
    • Open-source with MIT Licence.
    • Documentation page and blogs.
    • +500 stars on Github with over 20K p/m downloads.

    Construction Studying.

    To be taught the basics of causal construction studying, we are going to begin with a small and intuitive instance. Suppose you’ve got a sprinkler system in your yard and for the final 1000 days, you measured 4 variables, every with two states: Rain (sure or no), Cloudy (sure or no), Sprinkler system (on or off), and Moist grass (true or false). Primarily based on these 4 variables and your conception of the true world, you could have an instinct of how the graph ought to seem like, proper? If not, it’s good that you simply learn this text as a result of with construction studying you’ll discover out!

    With bnlearn for Python it’s simple to find out the causal relationships with just a few traces of code.

    Within the instance under, we are going to import the bnlearn library for Python, and cargo the sprinkler information set. Then we will decide which DAG matches the information finest. Be aware that the sprinkler information set is instantly cleaned with out lacking values, and all values have the state 1 or 0.

    # Import bnlearn package deal
    import bnlearn as bn
    
    # Load sprinkler information set
    df = bn.import_example('sprinkler')
    
    # Print to display screen for illustration
    print(df)
    '''
    +----+----------+-------------+--------+-------------+
    |    |   Cloudy |   Sprinkler |   Rain |   Wet_Grass |
    +====+==========+=============+========+=============+
    |  0 |        0 |           0 |      0 |           0 |
    +----+----------+-------------+--------+-------------+
    |  1 |        1 |           0 |      1 |           1 |
    +----+----------+-------------+--------+-------------+
    |  2 |        0 |           1 |      0 |           1 |
    +----+----------+-------------+--------+-------------+
    | .. |        1 |           1 |      1 |           1 |
    +----+----------+-------------+--------+-------------+
    |999 |        1 |           1 |      1 |           1 |
    +----+----------+-------------+--------+-------------+
    '''
    
    # Be taught the DAG in information utilizing Bayesian construction studying:
    DAG = bn.structure_learning.match(df)
    
    # print adjacency matrix
    print(DAG['adjmat'])
    # goal     Cloudy  Sprinkler   Rain  Wet_Grass
    # supply                                        
    # Cloudy      False      False   True      False
    # Sprinkler    True      False  False       True
    # Rain        False      False  False       True
    # Wet_Grass   False      False  False      False
    
    # Plot in Python
    G = bn.plot(DAG)
    
    # Make interactive plot in HTML
    G = bn.plot(DAG, interactive=True)
    
    # Make PDF plot
    bn.plot_graphviz(mannequin)
    Determine 3: Instance of the most effective DAG for the Sprinkler system. It encodes the next logic: the likelihood that the grass is moist depends on Sprinkler and Rain. The likelihood that the sprinkler is on depends on Cloudy. The likelihood that it rains depends on Cloudy.

    That’s it! We have now the discovered construction as proven in Determine 3. The detected DAG consists of 4 nodes which might be related by way of edges, every edge signifies a causal relation. The state of Moist grass depends upon two nodes, Rain and Sprinkler. The state of Rain is conditioned by Cloudy, and individually, the state Sprinkler can also be conditioned by Cloudy. This DAG represents the (factorized) likelihood distribution, the place S is the random variable for sprinkler, R for the rain, G for the moist grass, and C for cloudy.

    By inspecting the graph, you shortly see that the one impartial variable within the mannequin is C. The opposite variables are conditioned on the likelihood of cloudy, rain, and/or the sprinkler. Typically, the joint distribution for a Bayesian Community is the product of the conditional chances for each node given its dad and mom:

    The default setting in bnlearn for construction studying is the hillclimbsearch methodology and BIC scoring. Notably, completely different strategies and scoring sorts might be specified. See the examples within the code block under of the assorted construction studying strategies and scoring sorts in bnlearn:

    # 'hc' or 'hillclimbsearch'
    model_hc_bic  = bn.structure_learning.match(df, methodtype='hc', scoretype='bic')
    model_hc_k2   = bn.structure_learning.match(df, methodtype='hc', scoretype='k2')
    model_hc_bdeu = bn.structure_learning.match(df, methodtype='hc', scoretype='bdeu')
    
    # 'ex' or 'exhaustivesearch'
    model_ex_bic  = bn.structure_learning.match(df, methodtype='ex', scoretype='bic')
    model_ex_k2   = bn.structure_learning.match(df, methodtype='ex', scoretype='k2')
    model_ex_bdeu = bn.structure_learning.match(df, methodtype='ex', scoretype='bdeu')
    
    # 'cs' or 'constraintsearch'
    model_cs_k2   = bn.structure_learning.match(df, methodtype='cs', scoretype='k2')
    model_cs_bdeu = bn.structure_learning.match(df, methodtype='cs', scoretype='bdeu')
    model_cs_bic  = bn.structure_learning.match(df, methodtype='cs', scoretype='bic')
    
    # 'cl' or 'chow-liu' (requires setting root_node parameter)
    model_cl      = bn.structure_learning.match(df, methodtype='cl', root_node='Wet_Grass')

    Though the detected DAG for the sprinkler information set is insightful and reveals the causal dependencies for the variables within the information set, it doesn’t help you ask every kind of questions, similar to:

    How possible is it to have moist grass given the sprinkler is off?

    How possible is it to have a wet day given the sprinkler is off and it's cloudy?

    Within the sprinkler information set, it could be evident what the result is due to your data concerning the world and logical considering. However after you have bigger, extra advanced graphs, it is probably not so evident anymore. With so-called inferences, we will reply “what-if-we-did-x” sort questions that will usually require managed experiments and express interventions to reply.

    To make inferences, we’d like two components: the DAG and Conditional Probabilistic Tables (CPTs). At this level, now we have the information saved within the information body (df), and now we have readily computed the DAG. The CPTs might be computed utilizing Parameter studying, and can describe the statistical relationship between every node and its dad and mom. Carry on studying within the subsequent part about parameter studying, and after that, we will begin making inferences.


    Parameter studying.

    Parameter studying is the duty of estimating the values of the Conditional Likelihood Tables (CPTs). The bnlearn library helps Parameter studying for discrete and steady nodes:

    • Most Chance Estimation is a pure estimate through the use of the relative frequencies with which the variable states have occurred. When estimating parameters for Bayesian networks, lack of knowledge is a frequent downside and the ML estimator has the issue of overfitting to the information. In different phrases, if the noticed information is just not consultant (or too small) for the underlying distribution, ML estimations might be extraordinarily far off. For example, if a variable has 3 dad and mom that may every take 10 states, then state counts will probably be finished individually for 10³ = 1000 mum or dad configurations. This may make MLE very fragile for studying Bayesian Community parameters. A method to mitigate MLE’s overfitting is Bayesian Parameter Estimation.
    • Bayesian Estimation begins with readily present prior CPTs, which specific our beliefs concerning the variables earlier than the information was noticed. These “priors” are then up to date utilizing the state counts from the noticed information. One can consider the priors as consisting of pseudo-state counts, that are added to the precise counts earlier than normalization. A quite simple prior is the so-called K2 prior, which merely provides “1” to the rely of each single state. A considerably extra good selection of prior is BDeu (Bayesian Dirichlet equal uniform prior).

    Parameter Studying on the Sprinkler Knowledge set.

    We are going to use the Sprinkler information set to be taught its parameters. The output of Parameter Studying is the Conditional Probabilistic Tables (CPTs). To be taught parameters, we’d like a Directed Acyclic Graph (DAG) and an information set with the identical variables. The thought is to attach the information set with the DAG. Within the earlier instance, we readily computed the DAG (Determine 3). You should use it on this instance or alternatively, you possibly can create your individual DAG based mostly in your data of the world! Within the instance, I’ll display the way to create your individual DAG, which might be based mostly on knowledgeable/area data.

    import bnlearn as bn
    
    # Load sprinkler information set
    df = bn.import_example('sprinkler')
    
    # The sides might be created utilizing the obtainable variables.
    print(df.columns)
    # ['Cloudy', 'Sprinkler', 'Rain', 'Wet_Grass']
    
    # Outline the causal dependencies based mostly in your knowledgeable/area data.
    # Left is the supply, and proper is the goal node.
    edges = [('Cloudy', 'Sprinkler'),
             ('Cloudy', 'Rain'),
             ('Sprinkler', 'Wet_Grass'),
             ('Rain', 'Wet_Grass')]
    
    # Create the DAG. If not CPTs are current, bnlearn will auto generate placeholders for the CPTs.
    DAG = bn.make_DAG(edges)
    
    # Plot the DAG. That is similar as proven in Determine 3
    bn.plot(DAG)
    
    # Parameter studying on the user-defined DAG and enter information utilizing maximumlikelihood
    mannequin = bn.parameter_learning.match(DAG, df, methodtype='ml')
    
    # Print the discovered CPDs
    bn.print_CPD(mannequin)
    
    """
    [bnlearn] >[Conditional Probability Table (CPT)] >[Node Sprinkler]:
    +--------------+--------------------+------------+
    | Cloudy       | Cloudy(0)          | Cloudy(1)  |
    +--------------+--------------------+------------+
    | Sprinkler(0) | 0.4610655737704918 | 0.91015625 |
    +--------------+--------------------+------------+
    | Sprinkler(1) | 0.5389344262295082 | 0.08984375 |
    +--------------+--------------------+------------+
    
    [bnlearn] >[Conditional Probability Table (CPT)] >[Node Rain]:
    +---------+---------------------+-------------+
    | Cloudy  | Cloudy(0)           | Cloudy(1)   |
    +---------+---------------------+-------------+
    | Rain(0) | 0.8073770491803278  | 0.177734375 |
    +---------+---------------------+-------------+
    | Rain(1) | 0.19262295081967212 | 0.822265625 |
    +---------+---------------------+-------------+
    
    [bnlearn] >[Conditional Probability Table (CPT)] >[Node Wet_Grass]:
    +--------------+--------------+-----+----------------------+
    | Rain         | Rain(0)      | ... | Rain(1)              |
    +--------------+--------------+-----+----------------------+
    | Sprinkler    | Sprinkler(0) | ... | Sprinkler(1)         |
    +--------------+--------------+-----+----------------------+
    | Wet_Grass(0) | 1.0          | ... | 0.023529411764705882 |
    +--------------+--------------+-----+----------------------+
    | Wet_Grass(1) | 0.0          | ... | 0.9764705882352941   |
    +--------------+--------------+-----+----------------------+
    
    [bnlearn] >[Conditional Probability Table (CPT)] >[Node Cloudy]:
    +-----------+-------+
    | Cloudy(0) | 0.488 |
    +-----------+-------+
    | Cloudy(1) | 0.512 |
    +-----------+-------+
    
    [bnlearn] >Independencies:
    (Rain ⟂ Sprinkler | Cloudy)
    (Sprinkler ⟂ Rain | Cloudy)
    (Wet_Grass ⟂ Cloudy | Rain, Sprinkler)
    (Cloudy ⟂ Wet_Grass | Rain, Sprinkler)
    [bnlearn] >Nodes: ['Cloudy', 'Sprinkler', 'Rain', 'Wet_Grass']
    [bnlearn] >Edges: [('Cloudy', 'Sprinkler'), ('Cloudy', 'Rain'), ('Sprinkler', 'Wet_Grass'), ('Rain', 'Wet_Grass')]
    """
    

    When you reached this level, you’ve got computed the CPTs based mostly on the DAG and the enter information set df utilizing Most Chance Estimation (MLE) (Determine 4). Be aware that the CPTs are included in Determine 4 for readability functions.

    Determine 4: CPTs are derived with Parameter studying utilizing Most Chance Estimation.

    Computing the CPTs manually utilizing MLE is simple; let me display this by instance by computing the CPTs manually for the nodes Cloudy and Rain.

    # Examples as an example the way to manually compute MLE for the node Cloudy and Rain:
    
    # Compute CPT for the Cloudy Node:
    # This node has no conditional dependencies and may simply be computed as following:
    
    # P(Cloudy=0)
    sum(df['Cloudy']==0) / df.form[0] # 0.488
    
    # P(Cloudy=1)
    sum(df['Cloudy']==1) / df.form[0] # 0.512
    
    # Compute CPT for the Rain Node:
    # This node has a conditional dependency from Cloudy and might be computed as following:
    
    # P(Rain=0 | Cloudy=0)
    sum( (df['Cloudy']==0) & (df['Rain']==0) ) / sum(df['Cloudy']==0) # 394/488 = 0.807377049
    
    # P(Rain=1 | Cloudy=0)
    sum( (df['Cloudy']==0) & (df['Rain']==1) ) / sum(df['Cloudy']==0) # 94/488  = 0.192622950
    
    # P(Rain=0 | Cloudy=1)
    sum( (df['Cloudy']==1) & (df['Rain']==0) ) / sum(df['Cloudy']==1) # 91/512  = 0.177734375
    
    # P(Rain=1 | Cloudy=1)
    sum( (df['Cloudy']==1) & (df['Rain']==1) ) / sum(df['Cloudy']==1) # 421/512 = 0.822265625

    Be aware that conditional dependencies might be based mostly on restricted information factors. For example, P(Rain=1|Cloudy=0) is predicated on 91 observations. If Rain had greater than two states and/or extra dependencies, this quantity would have been even decrease. Is extra information the answer? Possibly. Possibly not. Simply needless to say even when the full pattern measurement could be very giant, the truth that state counts are conditional for every mum or dad’s configuration may trigger fragmentation. Try the variations between the CPTs in comparison with the MLE strategy.

    # Parameter studying on the user-defined DAG and enter information utilizing Bayes
    model_bayes = bn.parameter_learning.match(DAG, df, methodtype='bayes')
    
    # Print the discovered CPDs
    bn.print_CPD(model_bayes)
    
    """
    [bnlearn] >Compute construction scores for mannequin comparability (larger is healthier).
    [bnlearn] >[Conditional Probability Table (CPT)] >[Node Sprinkler]:
    +--------------+--------------------+--------------------+
    | Cloudy       | Cloudy(0)          | Cloudy(1)          |
    +--------------+--------------------+--------------------+
    | Sprinkler(0) | 0.4807692307692308 | 0.7075098814229249 |
    +--------------+--------------------+--------------------+
    | Sprinkler(1) | 0.5192307692307693 | 0.2924901185770751 |
    +--------------+--------------------+--------------------+
    
    [bnlearn] >[Conditional Probability Table (CPT)] >[Node Rain]:
    +---------+--------------------+---------------------+
    | Cloudy  | Cloudy(0)          | Cloudy(1)           |
    +---------+--------------------+---------------------+
    | Rain(0) | 0.6518218623481782 | 0.33695652173913043 |
    +---------+--------------------+---------------------+
    | Rain(1) | 0.3481781376518219 | 0.6630434782608695  |
    +---------+--------------------+---------------------+
    
    [bnlearn] >[Conditional Probability Table (CPT)] >[Node Wet_Grass]:
    +--------------+--------------------+-----+---------------------+
    | Rain         | Rain(0)            | ... | Rain(1)             |
    +--------------+--------------------+-----+---------------------+
    | Sprinkler    | Sprinkler(0)       | ... | Sprinkler(1)        |
    +--------------+--------------------+-----+---------------------+
    | Wet_Grass(0) | 0.7553816046966731 | ... | 0.37910447761194027 |
    +--------------+--------------------+-----+---------------------+
    | Wet_Grass(1) | 0.2446183953033268 | ... | 0.6208955223880597  |
    +--------------+--------------------+-----+---------------------+
    
    [bnlearn] >[Conditional Probability Table (CPT)] >[Node Cloudy]:
    +-----------+-------+
    | Cloudy(0) | 0.494 |
    +-----------+-------+
    | Cloudy(1) | 0.506 |
    +-----------+-------+
    
    [bnlearn] >Independencies:
    (Rain ⟂ Sprinkler | Cloudy)
    (Sprinkler ⟂ Rain | Cloudy)
    (Wet_Grass ⟂ Cloudy | Rain, Sprinkler)
    (Cloudy ⟂ Wet_Grass | Rain, Sprinkler)
    [bnlearn] >Nodes: ['Cloudy', 'Sprinkler', 'Rain', 'Wet_Grass']
    [bnlearn] >Edges: [('Cloudy', 'Sprinkler'), ('Cloudy', 'Rain'), ('Sprinkler', 'Wet_Grass'), ('Rain', 'Wet_Grass')]
    """
    

    Inferences.

    Making inferences requires the Bayesian community to have two most important elements: A Directed Acyclic Graph (DAG) that describes the construction of the information and Conditional Likelihood Tables (CPT) that describe the statistical relationship between every node and its dad and mom. At this level, you’ve got the information set, you computed the DAG utilizing construction studying, and estimated the CPTs utilizing parameter studying. Now you can make inferences! For extra particulars about inferences, I like to recommend studying this weblog [11]:

    With inferences, we marginalize variables in a process that known as variable elimination. Variable elimination is an actual inference algorithm. It can be used to determine the state of the community that has most likelihood by merely exchanging the sums by max features. Its draw back is that for giant BNs, it could be computationally intractable. Approximate inference algorithms similar to Gibbs sampling or rejection sampling could be utilized in these circumstances [7]. See the code block under to make inferences and reply questions like:

    How possible is it to have moist grass on condition that the sprinkler is off?

    import bnlearn as bn
    
    # Load sprinkler information set
    df = bn.import_example('sprinkler')
    
    # Outline the causal dependencies based mostly in your knowledgeable/area data.
    # Left is the supply, and proper is the goal node.
    edges = [('Cloudy', 'Sprinkler'),
             ('Cloudy', 'Rain'),
             ('Sprinkler', 'Wet_Grass'),
             ('Rain', 'Wet_Grass')]
    
    # Create the DAG
    DAG = bn.make_DAG(edges)
    
    # Parameter studying on the user-defined DAG and enter information utilizing Bayes to estimate the CPTs
    mannequin = bn.parameter_learning.match(DAG, df, methodtype='bayes')
    bn.print_CPD(mannequin)
    
    q1 = bn.inference.match(mannequin, variables=['Wet_Grass'], proof={'Sprinkler':0})
    [bnlearn] >Variable Elimination.
    +----+-------------+----------+
    |    |   Wet_Grass |        p |
    +====+=============+==========+
    |  0 |           0 | 0.486917 |
    +----+-------------+----------+
    |  1 |           1 | 0.513083 |
    +----+-------------+----------+
    
    Abstract for variables: ['Wet_Grass']
    Given proof: Sprinkler=0
    
    Wet_Grass outcomes:
    - Wet_Grass: 0 (48.7%)
    - Wet_Grass: 1 (51.3%)

    The Reply to the query is: P(Wet_grass=1 | Sprinkler=0) = 0.51. Let’s strive one other one:

    How possible is it to have rain given sprinkler is off and it’s cloudy?

    
    q2 = bn.inference.match(mannequin, variables=['Rain'], proof={'Sprinkler':0, 'Cloudy':1})
    [bnlearn] >Variable Elimination.
    +----+--------+----------+
    |    |   Rain |        p |
    +====+========+==========+
    |  0 |      0 | 0.336957 |
    +----+--------+----------+
    |  1 |      1 | 0.663043 |
    +----+--------+----------+
    
    Abstract for variables: ['Rain']
    Given proof: Sprinkler=0, Cloudy=1
    
    Rain outcomes:
    - Rain: 0 (33.7%)
    - Rain: 1 (66.3%)

    The Reply to the query is: P(Rain=1 | Sprinkler=0, Cloudy=1) = 0.663. Inferences can be made for a number of variables; see the code block under.

    How possible is it to have rain and moist grass given sprinkler is on?

    # Inferences with two or extra variables can be made similar to:
    q3 = bn.inference.match(mannequin, variables=['Wet_Grass','Rain'], proof={'Sprinkler':1})
    [bnlearn] >Variable Elimination.
    +----+-------------+--------+----------+
    |    |   Wet_Grass |   Rain |        p |
    +====+=============+========+==========+
    |  0 |           0 |      0 | 0.181137 |
    +----+-------------+--------+----------+
    |  1 |           0 |      1 | 0.17567  |
    +----+-------------+--------+----------+
    |  2 |           1 |      0 | 0.355481 |
    +----+-------------+--------+----------+
    |  3 |           1 |      1 | 0.287712 |
    +----+-------------+--------+----------+
    
    Abstract for variables: ['Wet_Grass', 'Rain']
    Given proof: Sprinkler=1
    
    Wet_Grass outcomes:
    - Wet_Grass: 0 (35.7%)
    - Wet_Grass: 1 (64.3%)
    
    Rain outcomes:
    - Rain: 0 (53.7%)
    - Rain: 1 (46.3%)

    The Reply to the query is: P(Rain=1, Moist grass=1 | Sprinkler=1) = 0.287712.


    How do I do know my causal mannequin is correct?

    When you solely used information to compute the causal diagram, it’s arduous to totally confirm the validity and completeness of your causal diagram. Causal fashions are additionally fashions and completely different approaches (similar to scoring, and search strategies) will due to this fact lead to completely different output variations. Nonetheless, some options may also help to get extra belief within the causal community. For instance, it could be attainable to empirically check sure conditional independence or dependence relationships between units of variables. If they don’t seem to be within the information, it is a sign of the correctness of the causal mannequin [8]. Alternatively, prior knowledgeable data might be added, similar to a DAG or CPTs, to get extra belief within the mannequin when making inferences.


    Dialogue

    On this article, I touched on the ideas about why correlation or affiliation is just not causation and the way to go from information in direction of a causal mannequin utilizing construction studying. A abstract of some great benefits of Bayesian methods is that:

    1. The result of posterior likelihood distributions, or the graph, permits the consumer to make a judgment on the mannequin predictions as an alternative of getting a single worth as an end result.
    2. The chance to include area/knowledgeable data within the DAG and purpose with incomplete info and lacking information. That is attainable as a result of Bayes’ theorem is constructed on updating the prior time period with proof.
    3. It has a notion of modularity.
    4. A fancy system is constructed by combining easier elements.
    5. Graph idea offers intuitively extremely interacting units of variables.
    6. Likelihood idea offers the glue to mix the elements.

    A weak point then again of Bayesian networks is that discovering the optimum DAG is computationally costly since an exhaustive search over all of the attainable constructions have to be carried out. The restrict of nodes for exhaustive search can already be round 15 nodes, but in addition depends upon the variety of states. In case you’ve got a big information set with many nodes, chances are you’ll wish to think about different strategies and outline the scoring operate and search algorithm. For very giant information units, these with lots of or perhaps even 1000’s of variables, tree-based or constraint-based approaches are sometimes vital with the usage of black/whitelisting of variables. Such an strategy first determines the order after which finds the optimum BN construction for that ordering. Figuring out causality generally is a difficult process, however the bnlearn library is designed to deal with among the challenges! We have now come to the tip and I hope you loved and discovered so much studying this text!

    Be secure. Keep frosty.

    Cheers, E.


    This weblog additionally comprises hands-on examples! This can assist you to be taught faster, perceive higher, and keep in mind longer. Seize a espresso and check out it out! Disclosure: I’m the creator of the Python packages bnlearn.


    Software program

    Let’s join!

    References

    1. McLeod, S. A, Correlation definitions, examples & interpretation. Merely Psychology, 2018, January 14
    2. F. Dablander, An Introduction to Causal Inference, Department of Psychological Methods, College of Amsterdam, https://psyarxiv.com/b3fkw
    3. Brittany Davis, When Correlation is Better than Causation, Medium, 2021
    4. Paul Gingrich, Measures of association. Web page 766–795
    5. Taskesen E, Association ruled based networks using graphical Hypergeometric Networks. [Software]
    6. Branislav Holländer, Introduction to Probabilistic Graphical Models, Medium, 2020
    7. Harini Padmanaban, Comparative Analysis of Naive Analysis of Naive Bayes and Tes and Tree Augmented Naive augmented Naive Bayes Models, San Jose State College, 2014
    8. Huszar. F, ML beyond Curve Fitting: An Intro to Causal Inference and do-Calculus
    9. AI4I 2020 Predictive Maintenance Data set. (2020). UCI Machine Studying Repository. Licensed underneath a Creative Commons Attribution 4.0 International (CC BY 4.0).
    10. E. Perrier et al, Finding Optimal Bayesian Network Given a Super-Structure, Journal of Machine Studying Analysis 9 (2008) 2251–2286.
    11. Taskesen E, Prescriptive Modeling Unpacked: A Complete Guide to Intervention With Bayesian Modeling. June. 2025, In the direction of Knowledge Science (TDS)
    12. Taskesen E, How to Generate Synthetic Data: A Comprehensive Guide Using Bayesian Sampling and Univariate Distributions. Could. 2025, In the direction of Knowledge Science (TDS)



    Source link

    Share. Facebook Twitter Pinterest LinkedIn Tumblr Email
    Previous ArticleCelebrating an academic-industry collaboration to advance vehicle technology | MIT News
    Next Article Grad-CAM from Scratch with PyTorch Hooks
    ProfitlyAI
    • Website

    Related Posts

    Artificial Intelligence

    Creating AI that matters | MIT News

    October 21, 2025
    Artificial Intelligence

    Scaling Recommender Transformers to a Billion Parameters

    October 21, 2025
    Artificial Intelligence

    Hidden Gems in NumPy: 7 Functions Every Data Scientist Should Know

    October 21, 2025
    Add A Comment
    Leave A Reply Cancel Reply

    Top Posts

    Everything I Studied to Become a Machine Learning Engineer (No CS Background)

    August 27, 2025

    Building Fact-Checking Systems: Catching Repeating False Claims Before They Spread

    September 26, 2025

    Boost Your LLM Output and Design Smarter Prompts: Real Tricks from an AI Engineer’s Toolbox

    June 12, 2025

    Implementing the Coffee Machine Project in Python Using Object Oriented Programming

    September 15, 2025

    Temporal-Difference Learning and the Importance of Exploration: An Illustrated Guide

    October 2, 2025
    Categories
    • AI Technology
    • AI Tools & Technologies
    • Artificial Intelligence
    • Latest AI Innovations
    • Latest News
    Most Popular

    Claude AI integreras med Google Workspace

    April 16, 2025

    Simple Guide to Multi-Armed Bandits: A Key Concept Before Reinforcement Learning

    July 14, 2025

    Step-by-Step Guide to Build and Deploy an LLM-Powered Chat with Memory in Streamlit

    May 2, 2025
    Our Picks

    Creating AI that matters | MIT News

    October 21, 2025

    Scaling Recommender Transformers to a Billion Parameters

    October 21, 2025

    Hidden Gems in NumPy: 7 Functions Every Data Scientist Should Know

    October 21, 2025
    Categories
    • AI Technology
    • AI Tools & Technologies
    • Artificial Intelligence
    • Latest AI Innovations
    • Latest News
    • Privacy Policy
    • Disclaimer
    • Terms and Conditions
    • About us
    • Contact us
    Copyright © 2025 ProfitlyAI All Rights Reserved.

    Type above and press Enter to search. Press Esc to cancel.