Stay Ahead, Stay ONMINE

Why Random Forest Needs to Be This Random

“Random Forest = many trees + averaging = better.” If you’ve read even one ensemble methods tutorial, this sentence is familiar to the point of nausea. And even following the most basic data science tutorials, anyone will understand that this is not wrong. What it is, on the other hand, is just dangerously incomplete, because if that were the whole story, the model would just be called “Bagged Trees,” and we would have stopped there. We would take bootstrap samples, train trees, average them, done. No need for the word “Random” in the name at all.But that’s not what happened. When Breiman designed Random Forest in 2001, he deliberately added a second layer of randomness: at every split, every tree only gets to see a random subset of the available features; not all of them but only a random slice.Why? If variance were the only problem, and bagging already reduces it through averaging, what does this extra, seemingly restrictive constraint add? Why deliberately make your trees “more blind”? Why hide existing information from your model that might prove to be significant?The answer hides in one word that practitioners throw around constantly but rarely unpack mathematically: correlation. Specifically, correlation between the predictions of the trees themselves. And once you see the math behind it, the whole design of Random Forest stops looking like a collection of arbitrary hyperparameters and starts looking like a single, elegant argument against a very specific enemy: correlated errors, which averaging alone can never fully eliminate, and which are exactly what stand between bagging and the algorithm’s real potential.That’s what this article is about: why bagging alone has a hard ceiling, what is this ceiling, and how feature subsampling is the mathematically necessary move to break through it.Bias-Variance, a Fast RefresherBefore we deep dive into the trees lets do a quick recap on how prediction error can be decomposed into three pieces:Error = Bias² + Variance + Irreducible NoiseBias: how wrong your model is on average, systematically. A model too simple for the underlying structure (say, a linear model on nonlinear data) will consistently miss the same way. This is underfitting.Variance: how much your model’s predictions swing if you retrain it on a different sample from the same distribution. A model too flexible (a fully grown decision tree) will fit the noise in whatever data it sees, and change dramatically with a slightly different training set. This is overfitting.A single, unconstrained decision tree sits at one extreme of this spectrum: low bias, high variance. It can represent almost any decision boundary (low bias), but it’s wildly sensitive to which exact rows ended up in its training set (high variance), resulting in a situation where if you swap a handful of data points you can get a structurally different tree.This is precisely why decision trees are the ideal raw material for bagging. Bagging’s whole mechanism of averaging many models, is a variance-reduction tool. It does almost nothing for bias. So it makes sense to pair it with a base learner that already has low bias and just needs its variance tamed, rather than, say, bagging a bunch of linear models where bias is the actual problem and averaging won’t touch it.Keep this pairing in mind — bagging attacks variance, not bias — because it’s the assumption the rest of the article stress-tests. The question we’re about to ask is: does bagging actually deliver on that promise fully, or only partially?The Mathematical Core: Discussing the variance computationSuppose you have n predictors and think of each one as a random variable X1,X2,…,XnX_1, X_2, …, X_nX1​,X2​,…,Xn​. In our case XiX_iXi​ is the prediction of tree iii at some fixed test point xxx. The randomness in XiX_iXi​ comes from the fact that tree iii is trained on a random bootstrap sample. If you re-ran the whole training procedure, you would get a slightly different tree, and therefore a slightly different prediction at xxx.Assume, for now, an idealized case:Each XiX_iXi​, has the same variance: Var(Xi)=σ2Var(X_i) = σ^2Var(Xi​)=σ2 for all iii.The XiX_iXi​ are mutually independent.We can form the ensemble prediction by averaging:Xˉ=1n∑i=1nXidisplaystylebar{X} = frac{1}{n}sum_{i=1}^{n}X_iXˉ=n1​i=1∑n​Xi​Deriving the variance of the averageThis is a direct application of how variance propagates through a sum of independent variables. For any two random variables:Var(aX+bY)=a2Var(X)+b2Var(Y)+2ab Cov(X,Y)Var(aX + bY) = a^2Var(X) + b^2Var(Y) + 2ab Cov(X,Y)Var(aX+bY)=a2Var(X)+b2Var(Y)+2ab Cov(X,Y)If XXX and YYY are independent, Covariance will be zero and the cross-term vanishes. Generalizing to nnn independent variables, each scaled by 1/n1/n1/n:Var(Xˉ)=Var(1n∑i=1nXi)=1n2∑i=1nVar(Xi)=σ2nVar(bar{X}) = Varleft( displaystyle frac{1}{n}sum_{i=1}^{n}X_i right) = displaystyle frac{1}{n^2}sum_{i=1}^{n}Var(X_i)= frac{σ^2}{n}Var(Xˉ)=Var(n1​i=1∑n​Xi​)=n21​i=1∑n​Var(Xi​)=nσ2​That’s it. That’s the whole derivation. No cross-terms survive because independence kills every covariance term in the expansion.What this says, physicallyAs n→∞nto inftyn→∞, Var(Xˉ)→0Var(bar{X}) to 0Var(Xˉ)→0. The ensemble’s variance can be driven arbitrarily close to zero, no floor, no limit just by adding more independent trees. This is the exact same logic as averaging nnn independent noisy measurements of a physical quantity: each measurement has its own instrument noise σσσ, but if the noise sources are truly independent (uncorrelated), the standard error of the mean shrinks as σ/ndisplaystyle σ/sqrt{n}σ/n​. Same square-root law, same origin: independence lets fluctuations cancel rather than accumulate.The key idea behind bagging is that, under the assumption of independent trees, averaging more and more trees continuously reduces the ensemble variance, eventually driving it arbitrarily close to zero.The catchAs said before this derivation rests on one assumption that is almost never actually true in Random Forests: independence. The trees are not independent. They’re trained on bootstrap samples drawn from the same underlying dataset, using the same features, often finding the same dominant splits near the top of the tree. That shared structure means Cov(Xi,Xj)≠0Cov(X_i , X_j) neq 0Cov(Xi​,Xj​)=0 and the moment covariance is nonzero, that cross-term we made vanish above comes roaring back into the formula.That’s exactly what the next section confronts head-on: what happens to Var(Xˉ)Var(bar{X})Var(Xˉ) when we drop the independence assumption and let the trees be correlated as they should be in any honest situation of every real Random Forest implementation.The Twist: Trees Are Never Truly IndependentLet’s drop the independence assumption and see what actually happens.Go back to the raw definition of the variance of a sum, without assuming independence this time:Var(Xˉ)=Var(1n∑i=1nXi)=1n2Var(∑i=1nXi)Var(bar{X}) = Varleft( displaystyle frac{1}{n}sum_{i=1}^{n}X_i right) = displaystyle frac{1}{n^2}Varleft( sum_{i=1}^{n}X_i right)Var(Xˉ)=Var(n1​i=1∑n​Xi​)=n21​Var(i=1∑n​Xi​)The variance of a sum, in full generality, expands into a double sum over all pairs (i,j)(i,j)(i,j):Var(∑i=1nXi)=∑i=1n∑j=1nCov(Xi,Xj)displaystyle Varleft( sum_{i=1}^{n}X_i right) = sum_{i=1}^{n}sum_{j=1}^{n}Cov(X_i, X_j)Var(i=1∑n​Xi​)=i=1∑n​j=1∑n​Cov(Xi​,Xj​)Split this double sum into two pieces: the diagonal terms where i=ji=ji=j, and the off-diagonal terms where i≠ji neq ji=j. When i=j,Cov(Xi,Xi)=Var(Xi)=σ2i=j, Cov(X_i,X_i)=Var(X_i)=σ^2i=j,Cov(Xi​,Xi​)=Var(Xi​)=σ2. There are nnn such terms.When i≠ji neq ji=j, each term is Cov(Xi,Xj)Cov(X_i,X_j)Cov(Xi​,Xj​), and there are n2−n=n(n−1)n^2-n=n(n-1)n2−n=n(n−1) such off-diagonal terms.Var(∑i=1nXi)=nσ2⏟diagonal+∑i≠jCov(Xi,Xj)⏟off−diagonaldisplaystyle Varleft( sum_{i=1}^{n}X_i right) = underbrace{nσ^2}_{diagonal} + underbrace{sum_{ineq j}^{}Cov(X_i, X_j)}_{off-diagonal}Var(i=1∑n​Xi​)=diagonalnσ2​​+off−diagonali=j∑​Cov(Xi​,Xj​)​​This is exactly where the earlier derivation cut a corner: independence forced every off-diagonal term to zero. We no longer get to assume that.Introducing ρNow define the (average) pairwise correlation between any two distinct trees:ρ=Corr(Xi,Xj)=Cov(Xi,Xj)σ2⇒Cov(Xi,Xj)=ρσ2ρ = Corr(X_i,X_j)= displaystylefrac{Cov(X_i,X_j)}{σ^2} Rightarrow \ Cov(X_i,X_j) = ρσ^2ρ=Corr(Xi​,Xj​)=σ2Cov(Xi​,Xj​)​⇒Cov(Xi​,Xj​)=ρσ2This is a simplifying assumption — a “mean-field” treatment, exactly like assuming a uniform pairwise interaction instead of tracking every individual pair separately. In reality, some tree pairs are more correlated than others (two trees that both got heavy weight on the same influential outlier row, say), but treating ρ as a single average captures the aggregate effect cleanly, and it’s a very standard move (this is essentially the same simplification Breiman himself used in the original Random Forest paper).With this substitution, the off-diagonal sum becomes:∑i≠jCov(Xi,Xj)=n(n−1)ρσ2displaystylesum_{ineq j}^{}Cov(X_i,X_j) = n(n-1)ρσ^2i=j∑​Cov(Xi​,Xj​)=n(n−1)ρσ2Putting it together we conclude that:Var(Xˉ)=1n2[nσ2+n(n−1)ρσ2]Var(bar{X})= frac{1}{n^2}left[ nσ^2 + n(n-1)ρσ^2 right]Var(Xˉ)=n21​[nσ2+n(n−1)ρσ2]and from the above point the math is pretty simple to derive the final expression for Var(Xˉ)Var(bar{X})Var(Xˉ):Var(Xˉ)=ρσ2+(1−ρ)σ2nVar(bar{X}) = ρσ^2 +displaystyle frac{(1-ρ)σ^2}{n}Var(Xˉ)=ρσ2+n(1−ρ)σ2​Sanity check: setting ρ=0ρ=0ρ=0 the first term vanishes entirely, and you’re left with σ2/nσ^2/nσ2/n which is exactly the independent case we ended up with before when we assumed tree independency. Good, the general formula correctly reduces to the special case. Lets now examine the limit; does it collapse correctly at the boundary?lim⁡n→∞[ρσ2+(1−ρ)σ2n]=ρσ2displaystylelim_{n to infty } left[ ρσ^2 +displaystyle frac{(1-ρ)σ^2}{n} right] = ρσ^2n→∞lim​[ρσ2+n(1−ρ)σ2​]=ρσ2The second term that carries all the benefit of averaging, and includes nnn vanishes exactly as before. But the first term ρσ2ρσ^2ρσ2, has no nnn in it at all. It was never going to vanish, no matter how large nnn gets.The consequenceYou could add as many trees as you want; tens or hundreds or even millions of them. Still the variance of your ensemble can never drop below ρσ2ρσ^2ρσ2. This is a hard floor, set entirely by how correlated your trees are, not by how many of them you have. Adding more trees only ever attacks the second term. It has zero leverage over the first.This is the mathematical fact that the entire design of Random Forest is built to confront. Next section asks where this ρρρ actually comes from in a real forest — but the diagnosis itself, the existence of this floor, doesn’t depend on any mechanism. It falls straight out of the algebra of correlated averaging, the same way it would for correlated noise in any measurement ensemble.Why ρ Exists, and How Random Forest Breaks ItWe’ve shown that if trees are correlated, averaging can’t save you as variance floors at ρσ2ρσ^2ρσ2. So where does that correlation actually come from?The causeEvery tree sees a different bootstrap sample, but the same underlying dataset. If one feature is a strong predictor (say, “price of a product”), it will win the best-split test at the root of nearly every tree, almost regardless of which rows got sampled because it’s structurally the strongest signal in the data and not an artifact of any particular sample. So trees end up with similar top-level structure, make similar errors in the same regions, and their predictions move together. Bootstrap sampling shuffles rows, but it doesn’t touch which feature dominates leading it to decorrelate noise and not signal.The Random Forest fixRandom Forest attacks this directly: at every single split, each tree is only allowed to consider a random subset of features (typically pdisplaystylesqrt{p}p​​ out of ppp). When the dominant feature isn’t in that subset, the tree is forced to split on something else. Different trees end up built around different features at different points, which breaks the shared structure and because of it, ρρρ drops.That is the whole idea. Bagging randomizes the training rows, which reduces the variance of each individual tree. Random Forest goes one step further by also randomizing the features at every split. This reduces the correlation ρρρ between tree predictions, and it is ρρρ rather than the number of trees nnn that limits how much the ensemble variance can be reducedThe Experiment — What We’re Actually TestingTheory is convincing, but nothing beats seeing the numbers move. So we set up a controlled comparison: build the exact scenario the theory describes, then measure ρ,σ2ρ, σ^2ρ,σ2, and Var(mean) directly, instead of just asserting them.The setup (code at the end of the article)We generate a synthetic population with 30 features, where two features are deliberately made dominant (they carry most of the true predictive signal) while the rest range from weakly informative to pure noise. This mirrors a realistic dataset: a few strong drivers, a handful of secondary ones, and a lot of clutter. It’s exactly the kind of structure that should push plain bagged trees toward high correlation, since every tree has every incentive to split on the same dominant features first.The key methodological choiceThis is where the earlier discussion about conditional vs. unconditional correlation actually matters for the experiment design, not just for the theory. If we trained many trees on bootstrap samples of one fixed training set, we’d be measuring conditional correlation and as we worked out, that correlation is exactly zero for independently-drawn bootstrap samples, no matter how much those samples overlap in content. That’s a mathematical fact, not a subtlety we can sidestep.Breiman’s ρρρ is unconditional: it treats the training set itself as a random draw from the population. So to measure it honestly, each independent “trial” of our experiment has to include a fresh training set, drawn anew from the population, not just fresh bootstrap indices from the same fixed set. All the trees within one trial share that one training-set draw — and that shared draw is the actual, real source of correlation between them.What we do, step by stepRun many independent trials (400 in our case). In each trial: draw a brand-new training set from the population, then train a large batch of trees on bootstrap resamples of it.Do this twice; once where every tree considers all 30 features at every split (plain bagging), and once where every tree only considers a random subset of features at every split (Random Forest, roughly 30≈5–6sqrt{30} ≈ 5–630​≈5–6 features per split). Everything else (the training set draws, the bootstrap sampling, the tree depth) is kept identical between the two, so the only thing that differs is that one design choice.At a fixed set of test points, record every tree’s prediction, in every trial.What we measure from that dataρ: how similarly two different trees behave, at the same test point, across independent trials. Basically, if we reran the whole experiment, would tree A and tree B tend to move together?σ²: how much a single tree’s prediction, at a fixed test point, varies across independent trials.Var(mean) vs. n: for a growing number of trees n, how much does the ensemble’s averaged prediction vary across independent trials?If the theory holds, the third quantity should trace out exactly ρσ2+(1−ρ)σ2/nρσ^2 + (1-ρ)σ^2/nρσ2+(1−ρ)σ2/n falling steeply at first, then flattening out at a floor set by ρρρ, and not by nnn.The ResultsHere’s what came out of running the experiment described above (400 independent trials, up to 120 trees per ensemble):Correlation and individual-tree variance-ρ (correlation)σ2σ^2σ2 (individual tree variance)floor = ρσ2ρσ^2ρσ2Plain bagging0.1369.891.34Random Forest0.04317.420.76Two things jump out immediately.First, ρ drops by roughly 3.2x once feature subsampling is introduced (0.136 → 0.043). Hiding the dominant features from most splits genuinely breaks the shared structure between trees. Rather than repeatedly building nearly identical trees around the same few informative variables, Random Forest encourages diverse tree structures. This diversity reduces the tendency of trees to make the same prediction errors, leading to a much lower inter-tree correlation.Second, and less obvious: Random Forest’s individual trees are actually worse. σ² is roughly double for RF (17.42 vs 9.89); a single Random Forest tree, on its own, is a noisier predictor than a single bagged tree. This makes sense: restricting each split to ~5–6 out of 30 features sometimes forces the tree away from the best available split, making that one tree more erratic. Feature subsampling isn’t a free lunch at the level of a single tree — it’s a trade: individual quality for reduced correlation.Third and more importantly, the asymptotic variance floor ρσ2ρσ^2ρσ2 decreases from 1.34 to 0.76. This demonstrates the key principle behind Random Forest: improving ensemble performance does not require stronger individual trees, but rather a collection of sufficiently accurate trees whose prediction errors are less correlated. Consequently, adding more trees yields a lower limiting ensemble variance than plain bagging.Ensemble variance vs. number of treesn (trees)Bagging: empiricalBagging: theoryRF: empiricalRF: theory19.899.8917.4217.4282.422.412.882.84181.851.821.681.68351.611.591.221.23701.491.460.960.991201.441.410.850.89Two patterns worth sitting with:The theory column and the empirical column track each other closely, all the way through. This isn’t guaranteed — the formula Var(Xˉ)=ρσ2+(1−ρ)σ2nVar(bar{X}) = ρσ^2 +displaystyle frac{(1-ρ)σ^2}{n}Var(Xˉ)=ρσ2+n(1−ρ)σ2​ is a mean-field approximation (a single averaged ρ standing in for many individual pairwise correlations), and it had every opportunity to diverge from what actually happened. It didn’t. The theoretical floor stopped being a symbolic derivation and became a number we can point to and say: this is where it plateaus, and we predicted it.The crossover At n=1, Random Forest starts behind as its lone tree is nearly twice as noisy as bagging’s lone tree (17.42 vs 9.89). But by around n=18, RF has already caught up and overtaken bagging (1.68 vs 1.85). By n=120, RF is sitting at roughly 59% of bagging’s variance (0.85 vs 1.44), despite starting from individually worse building blocks.That crossover is the entire article compressed into one sentence. Averaging alone can’t rescue plain bagging — no matter how many bagged trees you add, you’re stuck above ρσ2≈ρσ² ≈ρσ2≈ 1.34. Random Forest starts from a worse position per tree, but because it decorrelates the ensemble, it keeps improving well past the point where bagging has already flattened out ending up in a completely different neighborhood.All the above can be compressed in the following illustrated image generated by the code in the appendix.The Subtle Point: Worse Trees, Better ForestIt’s worth pausing on something that previous sections numbers already showed, because it’s the detail that surprises people who have used Random Forest for years without digging into why it works: a single Random Forest tree is a strictly worse predictor than a single bagged tree, and yet the Random Forest ensemble ends up strictly better.This isn’t a contradiction but the entire point, once you separate two things that are easy to conflate:Individual quality (how good is one tree, on its own): bagging wins here. σ² = 9.89 for bagging vs 17.42 for RF. Clearly, a bagged tree, seeing all 30 features at every split, simply makes better individual decisions.Ensemble quality (how good is the average of many trees): RF wins here, and not narrowly as at n=120, RF’s ensemble variance is 0.85 vs bagging’s 1.44, roughly 41% lower.The mechanism connecting these is entirely about ρρρ, not σ2σ^2σ2. Feature subsampling doesn’t make trees better — if anything, it makes each one a bit worse, since it’s occasionally forced away from the strongest available split. What it buys is independence between the mistakes different trees make. And because the ensemble variance formula weights ρρρ so heavily (recall: ρρρ survives untouched as n→∞nto inftyn→∞, while σ2σ^2σ2’s contribution shrinks toward zero), a small sacrifice in individual quality can purchase a much larger reduction in shared error.This is a genuinely counter-intuitive trade for anyone used to thinking “better base learner → better ensemble.” For Random Forest specifically, the opposite can hold: a slightly worse base learner, if it’s less correlated with its peers, produces a meaningfully better ensemble. It’s the same logic behind why a portfolio of mediocre, uncorrelated bets can outperform a portfolio of excellent, highly correlated ones; diversification has real value, and it can outweigh individual quality once you’re combining many things.Practical Takeaway: max_features Isn’t a DetailIf there’s one parameter in sklearn.ensemble.RandomForestRegressor (or RandomForestClassifier) that gets set once to ‘sqrt’ and never touched again, it’s max_features. The results above suggest that’s often leaving something on the table.The tradeoff, made concretemax_features controls exactly the quantity this whole article has been about: how many features each split can see, which directly trades off σ2σ²σ2 against ρρρ.Too high (close to, or equal to, all features — i.e. plain bagging): every tree gravitates toward the same dominant features, and you hit the floor early. Adding more trees past that point burns compute for essentially nothing.Too low (e.g. 1 feature per split): trees become so restricted they’re barely better than random guessing at each split, and the floor, while lower in ρρρ terms, can end up higher in absolute Var(mean) terms because σ2σ²σ2 has grown faster than ρρρ shrank.Somewhere between these two extremes is a sweet spot — and where it sits depends on the data, specifically on how many features are genuinely dominant versus how many carry real, if secondary, signal.The one-line mental model to carry forwardmax_features isn’t a randomness dial you set and forget — it’s the lever that decides where your forest sits on the σ2−ρσ² – ρσ2−ρ tradeoff. Tune it the way you would tune any bias-variance knob: by checking what it does to your actual validation error, not by trusting the default because it’s the default.AppendixHere you can find the code I built and used for the analysis. Feel free to execute and reproduce my results or experiment with different parameters. (Estimated time of run ~ 7 mins)”””Bagging vs Random Forest: measuring rho (tree correlation) and thevariance floor Var(mean) = rho*sigma^2 + (1-rho)*sigma^2/n.KEY METHODOLOGICAL POINT:With a FIXED training set, if each tree’s bootstrap sample is drawnindependently, tree predictions are mathematically INDEPENDENT (rho = 0exactly) — this follows from a basic probability fact: if A and B areindependent random variables, then g(A) and h(B) are independent for anyfunctions g, h, even g = h. This holds no matter how nonlinear ordiscontinuous the tree-fitting function is, and despite the fact thatany two bootstrap samples will typically overlap heavily in content –overlap in realized values does not imply statistical dependence.The correlation rho in Breiman’s formula is UNCONDITIONAL: it requiresthe training set itself to be random (drawn from the population) acrossrepeats. All trees in a repeat share that one training-set draw, which isthe actual common source of dependence. So each independent “repeat” ofthis experiment must redraw the training set fresh, not just thebootstrap indices.”””import numpy as npfrom sklearn.tree import DecisionTreeRegressorimport matplotlib.pyplot as pltimport timeRNG_GLOBAL = np.random.default_rng(0)# —————————————————————–# Data-generating process: a couple of DOMINANT features, several# weaker informative features, and pure noise features.# —————————————————————–N_TRAIN = 400N_FEATURES = 30TRUE_COEF = np.zeros(N_FEATURES)TRUE_COEF[0] = 4.0TRUE_COEF[1] = 2.5TRUE_COEF[2:8] = 0.5NOISE_SCALE = 1.5X_PROBE = RNG_GLOBAL.normal(size=(25, N_FEATURES)) # fixed evaluation pointsdef run_repeats(max_features, R, n_max, seed0, max_depth=5): “””R independent repeats. Each repeat: draw a FRESH training set from the population, then train n_max trees on bootstrap resamples of it (with the given max_features policy). Returns predictions at the fixed probe points, shape (R, n_max, n_probe). “”” preds = np.empty((R, n_max, X_PROBE.shape[0])) for r in range(R): rng = np.random.default_rng(seed0 + r) X_train = rng.normal(size=(N_TRAIN, N_FEATURES)) y_train = X_train @ TRUE_COEF + rng.normal(scale=NOISE_SCALE, size=N_TRAIN) for t in range(n_max): idx = rng.integers(0, N_TRAIN, size=N_TRAIN) # bootstrap rows Xb, yb = X_train[idx], y_train[idx] tree = DecisionTreeRegressor( max_features=max_features, # None = bagging, ‘sqrt’ = RF max_depth=max_depth, random_state=rng.integers(0, 1_000_000), ) tree.fit(Xb, yb) preds[r, t, :] = tree.predict(X_PROBE) return predsdef pairwise_rho(preds, n_slots=10): “””Average pairwise correlation between distinct tree ‘slots’, across independent repeats, at fixed test points (unconditional rho, per Breiman’s definition). “”” slots = preds[:, :n_slots, :] rhos = [] for k in range(slots.shape[2]): mat = slots[:, :, k] corr = np.corrcoef(mat, rowvar=False) off = corr.sum() – np.trace(corr) n_pairs = n_slots * (n_slots – 1) rhos.append(off / n_pairs) return float(np.nanmean(rhos))def individual_tree_variance(preds): return float(preds[:, 0, :].var(axis=0).mean())def empirical_var_of_mean(preds, n_values): out = [] for n in n_values: cum_mean = preds[:, :n, :].mean(axis=1) # (R, n_probe) var_per_point = cum_mean.var(axis=0) out.append(float(var_per_point.mean())) return np.array(out)# —————————————————————–# Run the experiment# —————————————————————–R = 400 # independent repeats (reduce to ~100 for a faster run)N_MAX = 120 # max ensemble size probedN_VALUES = np.array([1, 2, 3, 5, 8, 12, 18, 25, 35, 50, 70, 90, 120])t0 = time.time()preds_bag = run_repeats(max_features=None, R=R, n_max=N_MAX, seed0=10_000)t1 = time.time()print(f”Bagging: {t1-t0:.1f}s”)preds_rf = run_repeats(max_features=”sqrt”, R=R, n_max=N_MAX, seed0=50_000)t2 = time.time()print(f”RF: {t2-t1:.1f}s”)rho_bag = pairwise_rho(preds_bag)rho_rf = pairwise_rho(preds_rf)sigma2_bag = individual_tree_variance(preds_bag)sigma2_rf = individual_tree_variance(preds_rf)floor_bag = rho_bag * sigma2_bagfloor_rf = rho_rf * sigma2_rfvar_bag = empirical_var_of_mean(preds_bag, N_VALUES)var_rf = empirical_var_of_mean(preds_rf, N_VALUES)print(f”nrho: bagging={rho_bag:.4f} RF={rho_rf:.4f}”)print(f”sigma^2: bagging={sigma2_bag:.3f} RF={sigma2_rf:.3f}”)print(f”floor: bagging={floor_bag:.3f} RF={floor_rf:.3f}”)print(f”n{‘n’: >5} {‘bag_emp’: >10} {‘bag_theory’: >11} {‘rf_emp’: >10} {‘rf_theory’: >11}”)for n, vb, vr in zip(N_VALUES, var_bag, var_rf): tb = rho_bag * sigma2_bag + (1 – rho_bag) * sigma2_bag / n tr = rho_rf * sigma2_rf + (1 – rho_rf) * sigma2_rf / n print(f”{n: >5} {vb: >10.3f} {tb: >11.3f} {vr: >10.3f} {tr: >11.3f}”)# —————————————————————–# Plot# —————————————————————–fig, ax = plt.subplots(figsize=(9, 6))n_smooth = np.linspace(1, N_VALUES.max(), 300)theory_bag = rho_bag*sigma2_bag + (1-rho_bag)*sigma2_bag/n_smooththeory_rf = rho_rf*sigma2_rf + (1-rho_rf)*sigma2_rf/n_smoothax.plot(N_VALUES, var_bag, “o”, color=”#d62728″, label=”Plain bagging (empirical)”, markersize=6, zorder=5)ax.plot(n_smooth, theory_bag, “–“, color=”#d62728″, alpha=0.6, label=f”Bagging theory (rho={rho_bag:.3f})”)ax.axhline(floor_bag, color=”#d62728″, linestyle=”:”, alpha=0.5, linewidth=1.5)ax.plot(N_VALUES, var_rf, “s”, color=”#1f77b4″, label=”Random Forest (empirical)”, markersize=6, zorder=5)ax.plot(n_smooth, theory_rf, “–“, color=”#1f77b4″, alpha=0.6, label=f”RF theory (rho={rho_rf:.3f})”)ax.axhline(floor_rf, color=”#1f77b4″, linestyle=”:”, alpha=0.5, linewidth=1.5)ax.text(N_VALUES.max()*0.65, floor_bag+0.05, f”bagging floor = rho*sigma^2 = {floor_bag:.2f}”, color=”#d62728″, fontsize=9)ax.text(N_VALUES.max()*0.65, floor_rf+0.05, f”RF floor = rho*sigma^2 = {floor_rf:.2f}”, color=”#1f77b4″, fontsize=9)ax.set_xlabel(“Number of trees (n)”, fontsize=12)ax.set_ylabel(“Var(ensemble mean prediction)”, fontsize=12)ax.set_title(“Bagging plateaus early; Random Forest keeps improvingn” “(empirical points vs. theoretical Var(mean) = rho*sigma^2 + (1-rho)*sigma^2/n)”, fontsize=12)ax.legend(fontsize=9, loc=”upper right”)ax.set_ylim(bottom=0)ax.grid(alpha=0.3)plt.tight_layout()plt.show()References:Breiman, L. (2001). Random Forests. Machine Learning, 45(1), 5–32.

“Random Forest = many trees + averaging = better.” If you’ve read even one ensemble methods tutorial, this sentence is familiar to the point of nausea. And even following the most basic data science tutorials, anyone will understand that this is not wrong. What it is, on the other hand, is just dangerously incomplete, because if that were the whole story, the model would just be called “Bagged Trees,” and we would have stopped there. We would take bootstrap samples, train trees, average them, done. No need for the word “Random” in the name at all.

But that’s not what happened. When Breiman designed Random Forest in 2001, he deliberately added a second layer of randomness: at every split, every tree only gets to see a random subset of the available features; not all of them but only a random slice.

Why? If variance were the only problem, and bagging already reduces it through averaging, what does this extra, seemingly restrictive constraint add? Why deliberately make your trees “more blind”? Why hide existing information from your model that might prove to be significant?

The answer hides in one word that practitioners throw around constantly but rarely unpack mathematically: correlation. Specifically, correlation between the predictions of the trees themselves. And once you see the math behind it, the whole design of Random Forest stops looking like a collection of arbitrary hyperparameters and starts looking like a single, elegant argument against a very specific enemy: correlated errors, which averaging alone can never fully eliminate, and which are exactly what stand between bagging and the algorithm’s real potential.

That’s what this article is about: why bagging alone has a hard ceiling, what is this ceiling, and how feature subsampling is the mathematically necessary move to break through it.

Bias-Variance, a Fast Refresher

Before we deep dive into the trees lets do a quick recap on how prediction error can be decomposed into three pieces:

Error = Bias² + Variance + Irreducible Noise

  • Bias: how wrong your model is on average, systematically. A model too simple for the underlying structure (say, a linear model on nonlinear data) will consistently miss the same way. This is underfitting.

  • Variance: how much your model’s predictions swing if you retrain it on a different sample from the same distribution. A model too flexible (a fully grown decision tree) will fit the noise in whatever data it sees, and change dramatically with a slightly different training set. This is overfitting.

A single, unconstrained decision tree sits at one extreme of this spectrum: low bias, high variance. It can represent almost any decision boundary (low bias), but it’s wildly sensitive to which exact rows ended up in its training set (high variance), resulting in a situation where if you swap a handful of data points you can get a structurally different tree.

This is precisely why decision trees are the ideal raw material for bagging. Bagging’s whole mechanism of averaging many models, is a variance-reduction tool. It does almost nothing for bias. So it makes sense to pair it with a base learner that already has low bias and just needs its variance tamed, rather than, say, bagging a bunch of linear models where bias is the actual problem and averaging won’t touch it.

Keep this pairing in mind — bagging attacks variance, not bias — because it’s the assumption the rest of the article stress-tests. The question we’re about to ask is: does bagging actually deliver on that promise fully, or only partially?

The Mathematical Core: Discussing the variance computation

Suppose you have n predictors and think of each one as a random variable X1,X2,…,XnX_1, X_2, …, X_n. In our case XiX_i is the prediction of tree ii at some fixed test point xx. The randomness in XiX_i comes from the fact that tree ii is trained on a random bootstrap sample. If you re-ran the whole training procedure, you would get a slightly different tree, and therefore a slightly different prediction at xx.

Assume, for now, an idealized case:

  • Each XiX_i, has the same variance: Var(Xi)=σ2Var(X_i) = σ^2 for all ii.

  • The XiX_i are mutually independent.

We can form the ensemble prediction by averaging:

Xˉ=1n∑i=1nXidisplaystylebar{X} = frac{1}{n}sum_{i=1}^{n}X_i

Deriving the variance of the average

This is a direct application of how variance propagates through a sum of independent variables. For any two random variables:

Var(aX+bY)=a2Var(X)+b2Var(Y)+2ab Cov(X,Y)Var(aX + bY) = a^2Var(X) + b^2Var(Y) + 2ab Cov(X,Y)

If XX and YY are independent, Covariance will be zero and the cross-term vanishes. Generalizing to nn independent variables, each scaled by 1/n1/n:

Var(Xˉ)=Var(1n∑i=1nXi)=1n2∑i=1nVar(Xi)=σ2nVar(bar{X}) = Varleft( displaystyle frac{1}{n}sum_{i=1}^{n}X_i right) = displaystyle frac{1}{n^2}sum_{i=1}^{n}Var(X_i)= frac{σ^2}{n}

That’s it. That’s the whole derivation. No cross-terms survive because independence kills every covariance term in the expansion.

What this says, physically

As n→∞nto infty, Var(Xˉ)→0Var(bar{X}) to 0. The ensemble’s variance can be driven arbitrarily close to zero, no floor, no limit just by adding more independent trees. This is the exact same logic as averaging nn independent noisy measurements of a physical quantity: each measurement has its own instrument noise σσ, but if the noise sources are truly independent (uncorrelated), the standard error of the mean shrinks as σ/ndisplaystyle σ/sqrt{n}. Same square-root law, same origin: independence lets fluctuations cancel rather than accumulate.

The key idea behind bagging is that, under the assumption of independent trees, averaging more and more trees continuously reduces the ensemble variance, eventually driving it arbitrarily close to zero.

The catch

As said before this derivation rests on one assumption that is almost never actually true in Random Forests: independence. The trees are not independent. They’re trained on bootstrap samples drawn from the same underlying dataset, using the same features, often finding the same dominant splits near the top of the tree. That shared structure means Cov(Xi,Xj)≠0Cov(X_i , X_j) neq 0 and the moment covariance is nonzero, that cross-term we made vanish above comes roaring back into the formula.

That’s exactly what the next section confronts head-on: what happens to Var(Xˉ)Var(bar{X}) when we drop the independence assumption and let the trees be correlated as they should be in any honest situation of every real Random Forest implementation.

The Twist: Trees Are Never Truly Independent

Let’s drop the independence assumption and see what actually happens.

Go back to the raw definition of the variance of a sum, without assuming independence this time:

Var(Xˉ)=Var(1n∑i=1nXi)=1n2Var(∑i=1nXi)Var(bar{X}) = Varleft( displaystyle frac{1}{n}sum_{i=1}^{n}X_i right) = displaystyle frac{1}{n^2}Varleft( sum_{i=1}^{n}X_i right)

The variance of a sum, in full generality, expands into a double sum over all pairs (i,j)(i,j):

Var(∑i=1nXi)=∑i=1n∑j=1nCov(Xi,Xj)displaystyle Varleft( sum_{i=1}^{n}X_i right) = sum_{i=1}^{n}sum_{j=1}^{n}Cov(X_i, X_j)

Split this double sum into two pieces: the diagonal terms where i=ji=j, and the off-diagonal terms where i≠ji neq j.

When i=j,Cov(Xi,Xi)=Var(Xi)=σ2i=j, Cov(X_i,X_i)=Var(X_i)=σ^2. There are nn such terms.

When i≠ji neq j, each term is Cov(Xi,Xj)Cov(X_i,X_j), and there are n2−n=n(n−1)n^2-n=n(n-1) such off-diagonal terms.

Var(∑i=1nXi)=nσ2⏟diagonal+∑i≠jCov(Xi,Xj)⏟off−diagonaldisplaystyle Varleft( sum_{i=1}^{n}X_i right) = underbrace{nσ^2}_{diagonal} + underbrace{sum_{ineq j}^{}Cov(X_i, X_j)}_{off-diagonal}

This is exactly where the earlier derivation cut a corner: independence forced every off-diagonal term to zero. We no longer get to assume that.

Introducing ρ

Now define the (average) pairwise correlation between any two distinct trees:

ρ=Corr(Xi,Xj)=Cov(Xi,Xj)σ2⇒Cov(Xi,Xj)=ρσ2ρ = Corr(X_i,X_j)= displaystylefrac{Cov(X_i,X_j)}{σ^2} Rightarrow Cov(X_i,X_j) = ρσ^2

This is a simplifying assumption — a “mean-field” treatment, exactly like assuming a uniform pairwise interaction instead of tracking every individual pair separately. In reality, some tree pairs are more correlated than others (two trees that both got heavy weight on the same influential outlier row, say), but treating ρ as a single average captures the aggregate effect cleanly, and it’s a very standard move (this is essentially the same simplification Breiman himself used in the original Random Forest paper).

With this substitution, the off-diagonal sum becomes:

∑i≠jCov(Xi,Xj)=n(n−1)ρσ2displaystylesum_{ineq j}^{}Cov(X_i,X_j) = n(n-1)ρσ^2

Putting it together we conclude that:

Var(Xˉ)=1n2[nσ2+n(n−1)ρσ2]Var(bar{X})= frac{1}{n^2}left[ nσ^2 + n(n-1)ρσ^2 right]

and from the above point the math is pretty simple to derive the final expression for Var(Xˉ)Var(bar{X}):

Var(Xˉ)=ρσ2+(1−ρ)σ2nVar(bar{X}) = ρσ^2 +displaystyle frac{(1-ρ)σ^2}{n}

Sanity check: setting ρ=0ρ=0 the first term vanishes entirely, and you’re left with σ2/nσ^2/n which is exactly the independent case we ended up with before when we assumed tree independency. Good, the general formula correctly reduces to the special case. Lets now examine the limit; does it collapse correctly at the boundary?

lim⁡n→∞[ρσ2+(1−ρ)σ2n]=ρσ2displaystylelim_{n to infty } left[ ρσ^2 +displaystyle frac{(1-ρ)σ^2}{n} right] = ρσ^2

The second term that carries all the benefit of averaging, and includes nn vanishes exactly as before. But the first term ρσ2ρσ^2, has no nn in it at all. It was never going to vanish, no matter how large nn gets.

The consequence

You could add as many trees as you want; tens or hundreds or even millions of them. Still the variance of your ensemble can never drop below ρσ2ρσ^2. This is a hard floor, set entirely by how correlated your trees are, not by how many of them you have. Adding more trees only ever attacks the second term. It has zero leverage over the first.

This is the mathematical fact that the entire design of Random Forest is built to confront. Next section asks where this ρρ actually comes from in a real forest — but the diagnosis itself, the existence of this floor, doesn’t depend on any mechanism. It falls straight out of the algebra of correlated averaging, the same way it would for correlated noise in any measurement ensemble.

Why ρ Exists, and How Random Forest Breaks It

We’ve shown that if trees are correlated, averaging can’t save you as variance floors at ρσ2ρσ^2. So where does that correlation actually come from?

The cause

Every tree sees a different bootstrap sample, but the same underlying dataset. If one feature is a strong predictor (say, “price of a product”), it will win the best-split test at the root of nearly every tree, almost regardless of which rows got sampled because it’s structurally the strongest signal in the data and not an artifact of any particular sample. So trees end up with similar top-level structure, make similar errors in the same regions, and their predictions move together. Bootstrap sampling shuffles rows, but it doesn’t touch which feature dominates leading it to decorrelate noise and not signal.

The Random Forest fix

Random Forest attacks this directly: at every single split, each tree is only allowed to consider a random subset of features (typically pdisplaystylesqrt{p}​ out of pp). When the dominant feature isn’t in that subset, the tree is forced to split on something else. Different trees end up built around different features at different points, which breaks the shared structure and because of it, ρρ drops.

That is the whole idea. Bagging randomizes the training rows, which reduces the variance of each individual tree. Random Forest goes one step further by also randomizing the features at every split. This reduces the correlation ρρ between tree predictions, and it is ρρ rather than the number of trees nn that limits how much the ensemble variance can be reduced

The Experiment — What We’re Actually Testing

Theory is convincing, but nothing beats seeing the numbers move. So we set up a controlled comparison: build the exact scenario the theory describes, then measure ρ,σ2ρ, σ^2, and Var(mean) directly, instead of just asserting them.

The setup (code at the end of the article)

We generate a synthetic population with 30 features, where two features are deliberately made dominant (they carry most of the true predictive signal) while the rest range from weakly informative to pure noise. This mirrors a realistic dataset: a few strong drivers, a handful of secondary ones, and a lot of clutter. It’s exactly the kind of structure that should push plain bagged trees toward high correlation, since every tree has every incentive to split on the same dominant features first.

The key methodological choice

This is where the earlier discussion about conditional vs. unconditional correlation actually matters for the experiment design, not just for the theory. If we trained many trees on bootstrap samples of one fixed training set, we’d be measuring conditional correlation and as we worked out, that correlation is exactly zero for independently-drawn bootstrap samples, no matter how much those samples overlap in content. That’s a mathematical fact, not a subtlety we can sidestep.

Breiman’s ρρ is unconditional: it treats the training set itself as a random draw from the population. So to measure it honestly, each independent “trial” of our experiment has to include a fresh training set, drawn anew from the population, not just fresh bootstrap indices from the same fixed set. All the trees within one trial share that one training-set draw — and that shared draw is the actual, real source of correlation between them.

What we do, step by step

  1. Run many independent trials (400 in our case). In each trial: draw a brand-new training set from the population, then train a large batch of trees on bootstrap resamples of it.

  2. Do this twice; once where every tree considers all 30 features at every split (plain bagging), and once where every tree only considers a random subset of features at every split (Random Forest, roughly 30≈5–6sqrt{30} ≈ 5–6 features per split). Everything else (the training set draws, the bootstrap sampling, the tree depth) is kept identical between the two, so the only thing that differs is that one design choice.

  3. At a fixed set of test points, record every tree’s prediction, in every trial.

What we measure from that data

  • ρ: how similarly two different trees behave, at the same test point, across independent trials. Basically, if we reran the whole experiment, would tree A and tree B tend to move together?

  • σ²: how much a single tree’s prediction, at a fixed test point, varies across independent trials.

  • Var(mean) vs. n: for a growing number of trees n, how much does the ensemble’s averaged prediction vary across independent trials?

If the theory holds, the third quantity should trace out exactly ρσ2+(1−ρ)σ2/nρσ^2 + (1-ρ)σ^2/n falling steeply at first, then flattening out at a floor set by ρρ, and not by nn.

The Results

Here’s what came out of running the experiment described above (400 independent trials, up to 120 trees per ensemble):

Correlation and individual-tree variance

ρ (correlation)

σ2σ^2 (individual tree variance)

floor = ρσ2ρσ^2

Plain bagging

0.136

9.89

1.34

Random Forest

0.043

17.42

0.76

Two things jump out immediately.

First, ρ drops by roughly 3.2x once feature subsampling is introduced (0.1360.043). Hiding the dominant features from most splits genuinely breaks the shared structure between trees. Rather than repeatedly building nearly identical trees around the same few informative variables, Random Forest encourages diverse tree structures. This diversity reduces the tendency of trees to make the same prediction errors, leading to a much lower inter-tree correlation.

Second, and less obvious: Random Forest’s individual trees are actually worse. σ² is roughly double for RF (17.42 vs 9.89); a single Random Forest tree, on its own, is a noisier predictor than a single bagged tree. This makes sense: restricting each split to ~5–6 out of 30 features sometimes forces the tree away from the best available split, making that one tree more erratic. Feature subsampling isn’t a free lunch at the level of a single tree — it’s a trade: individual quality for reduced correlation.

Third and more importantly, the asymptotic variance floor ρσ2ρσ^2 decreases from 1.34 to 0.76. This demonstrates the key principle behind Random Forest: improving ensemble performance does not require stronger individual trees, but rather a collection of sufficiently accurate trees whose prediction errors are less correlated. Consequently, adding more trees yields a lower limiting ensemble variance than plain bagging.

Ensemble variance vs. number of trees

n (trees)

Bagging: empirical

Bagging: theory

RF: empirical

RF: theory

1

9.89

9.89

17.42

17.42

8

2.42

2.41

2.88

2.84

18

1.85

1.82

1.68

1.68

35

1.61

1.59

1.22

1.23

70

1.49

1.46

0.96

0.99

120

1.44

1.41

0.85

0.89

Two patterns worth sitting with:

  • The theory column and the empirical column track each other closely, all the way through.
    This isn’t guaranteed — the formula Var(Xˉ)=ρσ2+(1−ρ)σ2nVar(bar{X}) = ρσ^2 +displaystyle frac{(1-ρ)σ^2}{n} is a mean-field approximation (a single averaged ρ standing in for many individual pairwise correlations), and it had every opportunity to diverge from what actually happened. It didn’t. The theoretical floor stopped being a symbolic derivation and became a number we can point to and say: this is where it plateaus, and we predicted it.

  • The crossover
    At n=1, Random Forest starts behind as its lone tree is nearly twice as noisy as bagging’s lone tree (17.42 vs 9.89). But by around n=18, RF has already caught up and overtaken bagging (1.68 vs 1.85). By n=120, RF is sitting at roughly 59% of bagging’s variance (0.85 vs 1.44), despite starting from individually worse building blocks.

That crossover is the entire article compressed into one sentence. Averaging alone can’t rescue plain bagging — no matter how many bagged trees you add, you’re stuck above ρσ2≈ρσ² ≈ 1.34. Random Forest starts from a worse position per tree, but because it decorrelates the ensemble, it keeps improving well past the point where bagging has already flattened out ending up in a completely different neighborhood.

All the above can be compressed in the following illustrated image generated by the code in the appendix.

The Subtle Point: Worse Trees, Better Forest

It’s worth pausing on something that previous sections numbers already showed, because it’s the detail that surprises people who have used Random Forest for years without digging into why it works: a single Random Forest tree is a strictly worse predictor than a single bagged tree, and yet the Random Forest ensemble ends up strictly better.

This isn’t a contradiction but the entire point, once you separate two things that are easy to conflate:

  • Individual quality (how good is one tree, on its own): bagging wins here. σ² = 9.89 for bagging vs 17.42 for RF. Clearly, a bagged tree, seeing all 30 features at every split, simply makes better individual decisions.

  • Ensemble quality (how good is the average of many trees): RF wins here, and not narrowly as at n=120, RF’s ensemble variance is 0.85 vs bagging’s 1.44, roughly 41% lower.

The mechanism connecting these is entirely about ρρ, not σ2σ^2. Feature subsampling doesn’t make trees better — if anything, it makes each one a bit worse, since it’s occasionally forced away from the strongest available split. What it buys is independence between the mistakes different trees make. And because the ensemble variance formula weights ρρ so heavily (recall: ρρ survives untouched as n→∞nto infty, while σ2σ^2‘s contribution shrinks toward zero), a small sacrifice in individual quality can purchase a much larger reduction in shared error.

This is a genuinely counter-intuitive trade for anyone used to thinking “better base learner → better ensemble.” For Random Forest specifically, the opposite can hold: a slightly worse base learner, if it’s less correlated with its peers, produces a meaningfully better ensemble. It’s the same logic behind why a portfolio of mediocre, uncorrelated bets can outperform a portfolio of excellent, highly correlated ones; diversification has real value, and it can outweigh individual quality once you’re combining many things.

Practical Takeaway: max_features Isn’t a Detail

If there’s one parameter in sklearn.ensemble.RandomForestRegressor (or RandomForestClassifier) that gets set once to 'sqrt' and never touched again, it’s max_features. The results above suggest that’s often leaving something on the table.

The tradeoff, made concrete

max_features controls exactly the quantity this whole article has been about: how many features each split can see, which directly trades off σ2σ² against ρρ.

  • Too high (close to, or equal to, all features — i.e. plain bagging): every tree gravitates toward the same dominant features, and you hit the floor early. Adding more trees past that point burns compute for essentially nothing.

  • Too low (e.g. 1 feature per split): trees become so restricted they’re barely better than random guessing at each split, and the floor, while lower in ρρ terms, can end up higher in absolute Var(mean) terms because σ2σ² has grown faster than ρρ shrank.

Somewhere between these two extremes is a sweet spot — and where it sits depends on the data, specifically on how many features are genuinely dominant versus how many carry real, if secondary, signal.

The one-line mental model to carry forward

max_features isn’t a randomness dial you set and forget — it’s the lever that decides where your forest sits on the σ2−ρσ² – ρ tradeoff. Tune it the way you would tune any bias-variance knob: by checking what it does to your actual validation error, not by trusting the default because it’s the default.

Appendix

Here you can find the code I built and used for the analysis. Feel free to execute and reproduce my results or experiment with different parameters. (Estimated time of run ~ 7 mins)

"""Bagging vs Random Forest: measuring rho (tree correlation) and thevariance floor Var(mean) = rho*sigma^2 + (1-rho)*sigma^2/n.KEY METHODOLOGICAL POINT:With a FIXED training set, if each tree's bootstrap sample is drawnindependently, tree predictions are mathematically INDEPENDENT (rho = 0exactly) -- this follows from a basic probability fact: if A and B areindependent random variables, then g(A) and h(B) are independent for anyfunctions g, h, even g = h. This holds no matter how nonlinear ordiscontinuous the tree-fitting function is, and despite the fact thatany two bootstrap samples will typically overlap heavily in content --overlap in realized values does not imply statistical dependence.The correlation rho in Breiman's formula is UNCONDITIONAL: it requiresthe training set itself to be random (drawn from the population) acrossrepeats. All trees in a repeat share that one training-set draw, which isthe actual common source of dependence. So each independent "repeat" ofthis experiment must redraw the training set fresh, not just thebootstrap indices."""import numpy as npfrom sklearn.tree import DecisionTreeRegressorimport matplotlib.pyplot as pltimport timeRNG_GLOBAL = np.random.default_rng(0)# -----------------------------------------------------------------# Data-generating process: a couple of DOMINANT features, several# weaker informative features, and pure noise features.# -----------------------------------------------------------------N_TRAIN = 400N_FEATURES = 30TRUE_COEF = np.zeros(N_FEATURES)TRUE_COEF[0] = 4.0TRUE_COEF[1] = 2.5TRUE_COEF[2:8] = 0.5NOISE_SCALE = 1.5X_PROBE = RNG_GLOBAL.normal(size=(25, N_FEATURES))  # fixed evaluation pointsdef run_repeats(max_features, R, n_max, seed0, max_depth=5):    """R independent repeats. Each repeat: draw a FRESH training set from    the population, then train n_max trees on bootstrap resamples of it    (with the given max_features policy). Returns predictions at the    fixed probe points, shape (R, n_max, n_probe).    """    preds = np.empty((R, n_max, X_PROBE.shape[0]))    for r in range(R):        rng = np.random.default_rng(seed0 + r)        X_train = rng.normal(size=(N_TRAIN, N_FEATURES))        y_train = X_train @ TRUE_COEF + rng.normal(scale=NOISE_SCALE, size=N_TRAIN)        for t in range(n_max):            idx = rng.integers(0, N_TRAIN, size=N_TRAIN)  # bootstrap rows            Xb, yb = X_train[idx], y_train[idx]            tree = DecisionTreeRegressor(                max_features=max_features,   # None = bagging, 'sqrt' = RF                max_depth=max_depth,                random_state=rng.integers(0, 1_000_000),            )            tree.fit(Xb, yb)            preds[r, t, :] = tree.predict(X_PROBE)    return predsdef pairwise_rho(preds, n_slots=10):    """Average pairwise correlation between distinct tree 'slots', across    independent repeats, at fixed test points (unconditional rho, per    Breiman's definition).    """    slots = preds[:, :n_slots, :]    rhos = []    for k in range(slots.shape[2]):        mat = slots[:, :, k]        corr = np.corrcoef(mat, rowvar=False)        off = corr.sum() - np.trace(corr)        n_pairs = n_slots * (n_slots - 1)        rhos.append(off / n_pairs)    return float(np.nanmean(rhos))def individual_tree_variance(preds):    return float(preds[:, 0, :].var(axis=0).mean())def empirical_var_of_mean(preds, n_values):    out = []    for n in n_values:        cum_mean = preds[:, :n, :].mean(axis=1)   # (R, n_probe)        var_per_point = cum_mean.var(axis=0)        out.append(float(var_per_point.mean()))    return np.array(out)# -----------------------------------------------------------------# Run the experiment# -----------------------------------------------------------------R = 400            # independent repeats (reduce to ~100 for a faster run)N_MAX = 120         # max ensemble size probedN_VALUES = np.array([1, 2, 3, 5, 8, 12, 18, 25, 35, 50, 70, 90, 120])t0 = time.time()preds_bag = run_repeats(max_features=None, R=R, n_max=N_MAX, seed0=10_000)t1 = time.time()print(f"Bagging: {t1-t0:.1f}s")preds_rf = run_repeats(max_features="sqrt", R=R, n_max=N_MAX, seed0=50_000)t2 = time.time()print(f"RF: {t2-t1:.1f}s")rho_bag = pairwise_rho(preds_bag)rho_rf = pairwise_rho(preds_rf)sigma2_bag = individual_tree_variance(preds_bag)sigma2_rf = individual_tree_variance(preds_rf)floor_bag = rho_bag * sigma2_bagfloor_rf = rho_rf * sigma2_rfvar_bag = empirical_var_of_mean(preds_bag, N_VALUES)var_rf = empirical_var_of_mean(preds_rf, N_VALUES)print(f"nrho:        bagging={rho_bag:.4f}   RF={rho_rf:.4f}")print(f"sigma^2:    bagging={sigma2_bag:.3f}   RF={sigma2_rf:.3f}")print(f"floor:      bagging={floor_bag:.3f}   RF={floor_rf:.3f}")print(f"n{'n':>5} {'bag_emp':>10} {'bag_theory':>11} {'rf_emp':>10} {'rf_theory':>11}")for n, vb, vr in zip(N_VALUES, var_bag, var_rf):    tb = rho_bag * sigma2_bag + (1 - rho_bag) * sigma2_bag / n    tr = rho_rf * sigma2_rf + (1 - rho_rf) * sigma2_rf / n    print(f"{n:>5} {vb:>10.3f} {tb:>11.3f} {vr:>10.3f} {tr:>11.3f}")# -----------------------------------------------------------------# Plot# -----------------------------------------------------------------fig, ax = plt.subplots(figsize=(9, 6))n_smooth = np.linspace(1, N_VALUES.max(), 300)theory_bag = rho_bag*sigma2_bag + (1-rho_bag)*sigma2_bag/n_smooththeory_rf = rho_rf*sigma2_rf + (1-rho_rf)*sigma2_rf/n_smoothax.plot(N_VALUES, var_bag, "o", color="#d62728", label="Plain bagging (empirical)", markersize=6, zorder=5)ax.plot(n_smooth, theory_bag, "--", color="#d62728", alpha=0.6, label=f"Bagging theory (rho={rho_bag:.3f})")ax.axhline(floor_bag, color="#d62728", linestyle=":", alpha=0.5, linewidth=1.5)ax.plot(N_VALUES, var_rf, "s", color="#1f77b4", label="Random Forest (empirical)", markersize=6, zorder=5)ax.plot(n_smooth, theory_rf, "--", color="#1f77b4", alpha=0.6, label=f"RF theory (rho={rho_rf:.3f})")ax.axhline(floor_rf, color="#1f77b4", linestyle=":", alpha=0.5, linewidth=1.5)ax.text(N_VALUES.max()*0.65, floor_bag+0.05, f"bagging floor = rho*sigma^2 = {floor_bag:.2f}", color="#d62728", fontsize=9)ax.text(N_VALUES.max()*0.65, floor_rf+0.05, f"RF floor = rho*sigma^2 = {floor_rf:.2f}", color="#1f77b4", fontsize=9)ax.set_xlabel("Number of trees (n)", fontsize=12)ax.set_ylabel("Var(ensemble mean prediction)", fontsize=12)ax.set_title("Bagging plateaus early; Random Forest keeps improvingn"              "(empirical points vs. theoretical Var(mean) = rho*sigma^2 + (1-rho)*sigma^2/n)", fontsize=12)ax.legend(fontsize=9, loc="upper right")ax.set_ylim(bottom=0)ax.grid(alpha=0.3)plt.tight_layout()plt.show()

References:

Breiman, L. (2001). Random Forests. Machine Learning, 45(1), 5–32.

Shape
Shape
Stay Ahead

Explore More Insights

Stay ahead with more perspectives on cutting-edge power, infrastructure, energy,  bitcoin and AI solutions. Explore these articles to uncover strategies and insights shaping the future of industries.

Shape

Cisco bulks up its AI infrastructure portfolio with Supermicro’s liquid-cooled servers

“This expansion enables customers to easily manage complex, high-density AI clusters alongside non-AI workloads. Customers will also now be able to deploy rack-to-fabric liquid cooling, featuring Cisco liquid-cooled AI networking systems alongside Supermicro’s liquid-cooled servers. This unlocks trillion-parameter training and high-throughput inference use cases with platforms including Nvidia Vera Rubin NVL72 and Nvidia

Read More »

Taking your temperature from the inside

Oral and forehead thermometers may not accurately capture a person’s core body temperature, and the few ingestible temperature sensors on the market are so big they are hard to swallow and risk obstructing the GI tract. But MIT engineers created one that can send continuous temperature updates at a size

Read More »

Cisco taps Teleport for infrastructure identity management tech

Cisco is continuing to embed identity management capabilities deeper into its product portfolio by teaming with Teleport, a security vendor headquartered in Oakland, Calif., that’s focused on identity-based infrastructure access management. Cisco is investing in and partnering with Teleport as part of its efforts to bring infrastructure identity everywhere, Matt Caulfield,

Read More »

DOE and SBA Launch SBIC-E Initiative to Unleash Private Capital for American Innovation and Small Businesses

WASHINGTON—The U.S. Department of Energy (DOE) and the U.S. Small Business Administration (SBA) today signed a Memorandum of Agreement establishing the Small Business Investment Company-Energy (SBIC-E) Initiative, a new strategic partnership advancing President Trump’s commitment to supporting America’s small businesses, strengthening domestic manufacturing and supply chains, and ensuring the United States leads in the technologies critical to our national and economic security. The new SBIC-E Initiative brings together DOE’s scientific and technical expertise with SBA’s proven Small Business Investment Company (SBIC) Program, which currently has $58 billion in combined portfolio value. Since 1958, the SBIC Program has invested $147 billion in American small businesses, and since 1995, SBIC-backed businesses have created or supported 10.6 million jobs. “America’s small businesses drive American innovation and affordable, reliable energy access,” said U.S. Secretary of Energy Chris Wright. “By partnering with the Small Business Administration, the Energy Department is committing to invest its resources in American small businesses that will create jobs, strengthen our domestic manufacturing base, and unleash American energy production.” Through DOE’s Office of Technology Commercialization (OTC), the Department will identify strategic technology priorities, provide technical and commercialization expertise, and help engage the investment community. SBA, through its Office of Investment and Innovation, will administer the initiative and encourage the formation and growth of investment funds focused on those priorities. SBIC-E adds another tool to that effort by connecting innovators with private capital to help promising technologies grow, scale, and build here at home. “President Trump is establishing American energy dominance, ending the Green New Scam, and putting our nations’ producers and innovators back in control at the dawn of a new era of energy reliability and abundance,” said SBA Administrator Kelly Loeffler. “Through this partnership, the SBA and Department of Energy are strengthening access to capital in the private sector to

Read More »

Energy Department Announces $500 Million Award to Revitalize American Steelmaking

WASHINGTON—The U.S. Department of Energy (DOE) today announced a $500 million award to support a $1 billion investment at Cleveland-Cliffs’ Middletown Works facility in Middletown, Ohio. Vice President JD Vance and U.S. Energy Secretary Chris Wright visited Middletown Works today to highlight the Trump Administration’s commitment to American steelworkers and the resurgence of American manufacturing. The investment will modernize American steelmaking, protect 2,300 American jobs, and strengthen the domestic steel supply chain. The project advances President Trump’s commitment to put American workers first, bring investment back to American communities, and strengthen the industries critical to America’s economic and national security. Cleveland-Cliffs determined that the business case for the original project scope no longer made sense given customers’ unwillingness to pay a “green premium” for steel. Working with DOE, Cleveland-Cliffs identified a viable alternative that will upgrade and improve the efficiency of the existing coal-fired blast furnace while also capturing and commercializing co-product blast furnace gas (BFG). “President Trump is rebuilding America’s industrial base,” said Secretary Wright. “This investment puts American workers and American manufacturing first. It will modernize one of our nation’s critical steelmaking facilities, protect thousands of jobs, and strengthen our domestic steel production—keeping Ohio at the heart of American manufacturing and strengthening our national security.” The investment will modernize critical steelmaking operations at Middletown Works by rebuilding and upgrading the plant’s main coal-fired ironmaking furnace, deploying AI to optimize furnace operations and improve energy efficiency, and building an on-site facility to convert steel mill process gases into electricity. Follow-on investments will turn industrial byproducts into materials for concrete used in regional infrastructure. “This landmark investment at Middletown Works will secure a reliable domestic supply of high-purity steel while protecting thousands of quality jobs in Ohio,” said Assistant Secretary of Energy Audrey Robertson. “DOE is proud to partner with Cleveland-Cliffs to reduce America’s dependence on foreign products

Read More »

Energy Secretary Keeps Critical Generation Available in Mid-Atlantic

WASHINGTON—U.S. Secretary of Energy Chris Wright today issued an emergency order to address critical grid reliability issues facing the Mid-Atlantic region of the United States. The emergency order directs PJM Interconnection L.L.C. (PJM), in coordination with Constellation Energy Corporation, to ensure Units 3 and 4 of the Eddystone Generating Station in Pennsylvania remain available to operate and to employ economic dispatch to minimize costs for the American people. The units were originally slated to shut down on May 31, 2025. “The energy sources that perform when you need them most are the most valuable,” Secretary Wright said. “During recent Mid-Atlantic heat waves, coal, natural gas, and nuclear kept the lights and air conditioners on. President Trump and the Energy Department are committed to keeping critical generation available when demand is highest, reducing the risk of blackouts and ensuring Americans have affordable, reliable, and secure power—regardless of whether the wind is blowing or the sun is shining.” As outlined in DOE’s Resource Adequacy Report, power outages could increase by 100 times in 2030 if the U.S. continues to take reliable power offline. This order is in effect beginning on August 23, 2026, through November 20, 2026.                                                                                             ###

Read More »

Energy Department Announces $500 Million to Secure America’s Critical Mineral and Battery Supply Chains

WASHINGTON—The U.S. Department of Energy’s (DOE) Office of Critical Minerals and Energy Innovation (CMEI) today announced $500 million for seven selected projects to expand critical mineral and material processing, battery manufacturing, and recycling capacity in the United States. In accordance with President Trump’s Executive Order, Unleashing American Energy, the selected projects advance the President’s agenda to strengthen America’s domestic critical minerals and materials supply chains, reduce reliance on foreign sources, bolster national security, and advance American energy dominance. “For too long, America has depended on foreign actors for critical materials essential to modern life that underpin our economy, energy security, and national security,” said U.S. Secretary of Energy Chris Wright. “President Trump is reversing that dependence by securing our critical supply chains, unleashing American industry, and bringing critical materials production and processing back to the United States.” “DOE is taking decisive action to secure the critical supply chains necessary to power our nation,” said Assistant Secretary of Energy Audrey Robertson. “These projects underscore DOE’s commitment to driving innovation, reducing reliance on foreign sources, and promoting American energy dominance.” This is the third round of funding from DOE’s Battery Materials Processing and Battery Manufacturing and Recycling programs, which support battery materials processing, recycling, and manufacturing projects. These include demonstration projects, construction of commercial-scale facilities, and retrofitting or retooling existing facilities.  Critical minerals and materials are essential to American industry, energy production, and national security. Expanding domestic capacity will help ensure the resources America needs are processed, manufactured, and recycled in the United States.  Information on the selected projects is available here and here.

Read More »

bp lets Shah Deniz compression automation contract

bp has let a contract to Emerson to deliver automation technologies for the Shah Deniz Compression project offshore Azerbaijan. Emerson will provide integrated control and safety systems aimed at enhancing production, safety, and reliability on the new offshore compression platform. The contract includes systems to provide process control, safety shutdown, fire and gas detection, and power management. Together, these systems deliver real-time visibility and remote control of critical operations, Emerson said. The $2.9 billion Shah Deniz Compression project, which includes an electrically powered, normally unattended offshore production platform, is a next stage development of the Caspian Sea Shah Deniz field. Designed to access low-pressure gas reserves and maximize overall recovery, the platform will be equipped with four 11 Mw compressors and serve as the central compression hub for gas from the Shah Deniz Alpha and Bravo platforms. The platform will operate remotely from bp’s onshore Sangachal terminal 55 km south of Baku. The project is expected to enable about 50 billion cu m of additional gas and about 25 million bbl of condensate production and export. Construction is scheduled to be completed in 2029, with first gas compression expected from the Shah Deniz Alpha platform in 2029 and from the Shah Deniz Bravo platform in 2030. The agreement follows a previous automation contract bp signed with Emerson for the Azeri Central East and Shah Deniz Stage 2 developments. bp is operator at Shah Deniz (29.99%) with partners Lukoil (19.99%), TPAO (19%), Cenub Qaz Dehlizi (16.02%), NICO (10%), and MVM (5%).

Read More »

Federal court voids Texas GulfLink license over agency’s ‘serious procedural errors’

The ruling voids the license, halting all construction or progress. Sentinel Midstream declined comment on the ruling and would not answer questions about the status of construction. GulfLink, sited about 30 miles offshore Freeport, Tex., is designed to export up to 1 million b/d via Very Large Crude Carriers (VLCCs) to the government of Japan and Freeport Commodities. The project involves a 44-mile, 42-in. OD pipeline and was scheduled to begin operations around 2028. The estimated $2.1 billion investment was funded as part of a broader trade agreement between the US and Japan. The legal battle stems from a specific rule in the Deepwater Port Act of 1974 that dictates that the federal government can only permit one crude oil deepwater port, including any supporting infrastructure, within a single designated “application area.” Because the competing SPOT project’s pipeline route physically overlaps and intersects GulfLink’s lines, the plaintiff—Citizens for Clean Air & Clean Water in Brazoria County (Better Brazoria), represented by Earthjustice—successfully argued that MARAD violated the “one port” rule when issuing GulfLink’s license in February. The three-judge panel found that MARAD “improperly drew” the map designing the project’s official boundaries to exclude the pipelines and approved two overlapping projects in the same zone instead of only licensing one. The court wrote that the scope of the error made vacatur, not the less serious remand without vacatur, the appropriate remedy. Vacatur deems the license invalid and is used when the court finds “serious procedural errors” that cannot be easily explained or fixed with minor changes. Remand without vacatur sends the decision back to the agency for corrections but leaves the current license in place in the meantime. SPOT project status The $2.5-3-billion SPOT project, developed by Enterprise Products Partners in partnership with Enbridge Inc., also lies about 30 miles from Freeport. Designed to handle VLCCs,

Read More »

IBM unveils dual-architecture processor to run Arm-native apps on Z mainframes

“These caches have enormously low latency, and that is one of the key reasons and key engineering choices to support the performance and scalability of enterprise workloads, very data-intensive workloads like databases and transactions,” Jacobi said. “In addition, we have an on-chip data processing unit for IO acceleration and dedicated AI accelerators as well as accelerators for data compression, cryptography and data sorting.” One of the biggest takeaways from this processor announcement is that the enormous catalog of software already built for Arm becomes accessible on a mainframe without anyone having to port it first, notes Matt Kimball, senior datacenter analyst at Moor Insights & Strategy, in a research note about the news. Still, “this is a 2027 conversation, and with no date, supported software list, or Arm licensing treatment, the work now is inventory and scenario planning rather than financial modeling,” Kimball wrote.

Read More »

PJM’s New Data Center Power Equation

PJM Interconnection has now filed one of the most consequential proposed changes yet in the relationship between data centers and the electric grid. Rather than simply treating a new hyperscale or AI facility like any other customer whose demand will be backed through regional capacity procurement, PJM is proposing a framework under which the largest new loads would need to be supported by new capacity, have their needs covered through the Reliability Backstop Procurement, or face potential curtailment when the regional power system is short of supply. The approach has been developing since PJM launched its Critical Issue Fast Path process for large loads in 2025, but it became substantially more concrete in late July and August 2026. PJM filed its proposed Reliability Backstop Procurement with FERC on July 31 and began accepting applications that day for its FERC-approved Expedited Interconnection Track. On Aug. 13, PJM filed its proposed Interim Resource Adequacy Service, or IRAS, along with the Large Load Registry that would support it. The immediate numbers explain the urgency. PJM’s July 2026 capacity auction for the 2028/2029 delivery year procured 138,318 MW of unforced capacity through the centralized auction. Even after including Fixed Resource Requirement resources, however, PJM came up 6,831 MW short of its reliability requirement. The auction cleared at the FERC-approved $325/MW-day price cap. It was the second consecutive auction in which the PJM region failed to procure its full reliability requirement, something that had not happened before these two auctions. That gap is occurring while demand continues to accelerate. PJM’s 2026 long-term forecast projects summer peak demand growing at an average 3.6% annually over the next decade, compared with just 0.3% in the comparable forecast issued in 2021. Summer peak demand is projected to rise by nearly 66 GW over 10 years. Data centers are

Read More »

Zayo, NVIDIA Build the Long-Haul Backbone for Distributed AI

The data center industry’s increasingly power-first approach to site selection has created a follow-on question: Once the megawatts are found, is there enough network infrastructure to make the site useful at AI scale? Zayo and NVIDIA are putting real infrastructure behind that question. Zayo said it is working with NVIDIA to expand network capacity supporting AI factories across North America, including an 8,000-route-mile program targeting some of the fastest-growing AI corridors in the United States. The project encompasses six new long-haul routes along with overbuilds of existing network across 10 high-demand corridors. The announcement arrives as AI data center development moves beyond the largest established hubs toward markets where power and land may be more readily available, but fiber capacity cannot necessarily be taken for granted. That geography is increasingly important. NVIDIA has separately developed “scale-across” networking technology designed to allow AI infrastructure distributed among different buildings — or even data centers separated by hundreds of kilometers — to operate as a more unified computing environment. Put together, the developments suggest that networking is becoming inseparable from the AI factory buildout itself. Power may determine where the next generation of AI infrastructure can be built. Fiber will increasingly determine how effectively those sites can participate in the larger AI ecosystem. Fiber Follows the Power Zayo CEO Steve Smith said AI demand is changing both where network infrastructure is needed and how aggressively capacity must be deployed ahead of development. “AI is fundamentally reshaping where and how network infrastructure needs to be built across the U.S.,” Smith said. The company’s 8,000-mile program is more nuanced than that top-line number might suggest. Zayo disclosed in April that the expansion includes approximately 3,000 route miles across six new long-haul routes, plus more than 5,000 route miles of overbuilds across 10 existing corridors. Zayo

Read More »

Southern’s 17 GW Pipeline Puts AI Power Demand Into Utility Math

The headline number from Southern Company’s latest earnings report is hard to miss: electricity use by data centers across the utility’s system increased 55% in the second quarter compared with a year earlier. But the more consequential numbers may be the ones sitting behind it. Southern now has more than 1.2 GW of operating data center load, up by more than 500 MW from a year ago. At the same time, its electric utilities have signed contracts and large-load agreements totaling more than 17 GW by the mid-2030s, with another 8 GW in late-stage development and a prospective pipeline of large industrial and data center projects exceeding 75 GW. That leaves an enormous gap between the data center megawatts consuming electricity today and the load Southern has contractually positioned itself to serve during the next decade. For the data center industry, that gap may be the most important part of Southern’s second-quarter story. It offers a look at how utilities are beginning to convert the AI infrastructure boom from forecasts and campus announcements into contracts, generation procurement, transmission investment and eventually energized capacity. From Contracts to Megawatts Southern added roughly 6 GW of contracted large load during the quarter alone. Alabama Power signed three projects representing about 3 GW, while Georgia Power reached a 25-year agreement to serve OpenAI’s planned project in Effingham County near Savannah. That facility is expected to require approximately 3.2 GW and begin taking electric service in phases in 2028. The numbers nevertheless require an important distinction. Seventeen gigawatts contracted does not mean 17 GW will suddenly appear on Southern’s grid. Large data center campuses ramp gradually, often over several years, and Southern executives acknowledged that actual customer ramp schedules do not always match the assumptions made when projects are first approved. CEO Chris Womack said

Read More »

PORTS-Pike Takes Shape as an 8-GW AI Infrastructure Model

Back on March 31, 2026, we discussed we discussed SoftBank and SB Energy’s plans to redevelop the former Portsmouth Gaseous Diffusion Plant site near Piketon as a 10-GW artificial intelligence data center campus supported by almost an equal amount of new power generation. At the time, the plan called for as much as 10 GW of new generation, including 9.2 GW of natural gas capacity, along with approximately $4.2 billion of high-voltage transmission infrastructure developed with AEP Ohio. An initial 800-MW data center phase was targeted for service in 2028. The March story was notable because Pike County appeared to offer a preview of a new model for building hyperscale infrastructure: develop the generation, transmission and data center simultaneously rather than wait for an increasingly congested regional grid to deliver multiple gigawatts of capacity. Not to mention the reuse of a brownfield site with the encouragement of the federal government. Since then, almost every important part of the project has moved forward, and on August 17, the most consequential missing pieces fell into place. NVIDIA announced that it will become the exclusive AI compute infrastructure provider for the PORTS-Pike Technology Campus. OpenAI will be the data center customer, signing a 20-year lease with SB Energy for approximately 8 GW of IT capacity. NVIDIA will invest another $1.5 billion in SB Energy and provide credit support for the land, power and shell infrastructure behind an initial 4.25 GW of IT load, with an option covering approximately another 3.75 GW. The Securities and Exchange Commission filing accompanying the announcement makes the financial commitment even more significant. NVIDIA disclosed that its aggregate payment obligation associated with its initial commitment is capped at $105 billion. That is not a conventional capital commitment to spend $105 billion building the campus, nor is it simply a

Read More »

Nvidia scales back financing guarantee for OpenAI data center

Nvidia is scaling back a proposed financial guarantee tied to a massive OpenAI data center project in Ohio, reducing its initial commitment from as much as $250 billion to less than $120 billion, according to report in the Wall Street Journal. Earlier this month, Nvidia announced partnerships with major financial firms including Apollo Global Management, BlackRock, Blackstone, Brookfield Asset Management, Goldman Sachs and KKR, aimed at mobilizing more than $500 billion in capital for AI computing infrastructure. The change represents a significant restructuring of Nvidia’s role in financing the planned facility, which is being developed by SB Energy, a subsidiary of SoftBank. Under the revised arrangement, Nvidia would guarantee financing for the project’s first phase, representing roughly 5 gigawatts of capacity, or half of the total proposed capacity. Financing for the remaining capacity would be considered separately at a later stage.

Read More »

Microsoft will invest $80B in AI data centers in fiscal 2025

And Microsoft isn’t the only one that is ramping up its investments into AI-enabled data centers. Rival cloud service providers are all investing in either upgrading or opening new data centers to capture a larger chunk of business from developers and users of large language models (LLMs).  In a report published in October 2024, Bloomberg Intelligence estimated that demand for generative AI would push Microsoft, AWS, Google, Oracle, Meta, and Apple would between them devote $200 billion to capex in 2025, up from $110 billion in 2023. Microsoft is one of the biggest spenders, followed closely by Google and AWS, Bloomberg Intelligence said. Its estimate of Microsoft’s capital spending on AI, at $62.4 billion for calendar 2025, is lower than Smith’s claim that the company will invest $80 billion in the fiscal year to June 30, 2025. Both figures, though, are way higher than Microsoft’s 2020 capital expenditure of “just” $17.6 billion. The majority of the increased spending is tied to cloud services and the expansion of AI infrastructure needed to provide compute capacity for OpenAI workloads. Separately, last October Amazon CEO Andy Jassy said his company planned total capex spend of $75 billion in 2024 and even more in 2025, with much of it going to AWS, its cloud computing division.

Read More »

John Deere unveils more autonomous farm machines to address skill labor shortage

Join our daily and weekly newsletters for the latest updates and exclusive content on industry-leading AI coverage. Learn More Self-driving tractors might be the path to self-driving cars. John Deere has revealed a new line of autonomous machines and tech across agriculture, construction and commercial landscaping. The Moline, Illinois-based John Deere has been in business for 187 years, yet it’s been a regular as a non-tech company showing off technology at the big tech trade show in Las Vegas and is back at CES 2025 with more autonomous tractors and other vehicles. This is not something we usually cover, but John Deere has a lot of data that is interesting in the big picture of tech. The message from the company is that there aren’t enough skilled farm laborers to do the work that its customers need. It’s been a challenge for most of the last two decades, said Jahmy Hindman, CTO at John Deere, in a briefing. Much of the tech will come this fall and after that. He noted that the average farmer in the U.S. is over 58 and works 12 to 18 hours a day to grow food for us. And he said the American Farm Bureau Federation estimates there are roughly 2.4 million farm jobs that need to be filled annually; and the agricultural work force continues to shrink. (This is my hint to the anti-immigration crowd). John Deere’s autonomous 9RX Tractor. Farmers can oversee it using an app. While each of these industries experiences their own set of challenges, a commonality across all is skilled labor availability. In construction, about 80% percent of contractors struggle to find skilled labor. And in commercial landscaping, 86% of landscaping business owners can’t find labor to fill open positions, he said. “They have to figure out how to do

Read More »

2025 playbook for enterprise AI success, from agents to evals

Join our daily and weekly newsletters for the latest updates and exclusive content on industry-leading AI coverage. Learn More 2025 is poised to be a pivotal year for enterprise AI. The past year has seen rapid innovation, and this year will see the same. This has made it more critical than ever to revisit your AI strategy to stay competitive and create value for your customers. From scaling AI agents to optimizing costs, here are the five critical areas enterprises should prioritize for their AI strategy this year. 1. Agents: the next generation of automation AI agents are no longer theoretical. In 2025, they’re indispensable tools for enterprises looking to streamline operations and enhance customer interactions. Unlike traditional software, agents powered by large language models (LLMs) can make nuanced decisions, navigate complex multi-step tasks, and integrate seamlessly with tools and APIs. At the start of 2024, agents were not ready for prime time, making frustrating mistakes like hallucinating URLs. They started getting better as frontier large language models themselves improved. “Let me put it this way,” said Sam Witteveen, cofounder of Red Dragon, a company that develops agents for companies, and that recently reviewed the 48 agents it built last year. “Interestingly, the ones that we built at the start of the year, a lot of those worked way better at the end of the year just because the models got better.” Witteveen shared this in the video podcast we filmed to discuss these five big trends in detail. Models are getting better and hallucinating less, and they’re also being trained to do agentic tasks. Another feature that the model providers are researching is a way to use the LLM as a judge, and as models get cheaper (something we’ll cover below), companies can use three or more models to

Read More »

OpenAI’s red teaming innovations define new essentials for security leaders in the AI era

Join our daily and weekly newsletters for the latest updates and exclusive content on industry-leading AI coverage. Learn More OpenAI has taken a more aggressive approach to red teaming than its AI competitors, demonstrating its security teams’ advanced capabilities in two areas: multi-step reinforcement and external red teaming. OpenAI recently released two papers that set a new competitive standard for improving the quality, reliability and safety of AI models in these two techniques and more. The first paper, “OpenAI’s Approach to External Red Teaming for AI Models and Systems,” reports that specialized teams outside the company have proven effective in uncovering vulnerabilities that might otherwise have made it into a released model because in-house testing techniques may have missed them. In the second paper, “Diverse and Effective Red Teaming with Auto-Generated Rewards and Multi-Step Reinforcement Learning,” OpenAI introduces an automated framework that relies on iterative reinforcement learning to generate a broad spectrum of novel, wide-ranging attacks. Going all-in on red teaming pays practical, competitive dividends It’s encouraging to see competitive intensity in red teaming growing among AI companies. When Anthropic released its AI red team guidelines in June of last year, it joined AI providers including Google, Microsoft, Nvidia, OpenAI, and even the U.S.’s National Institute of Standards and Technology (NIST), which all had released red teaming frameworks. Investing heavily in red teaming yields tangible benefits for security leaders in any organization. OpenAI’s paper on external red teaming provides a detailed analysis of how the company strives to create specialized external teams that include cybersecurity and subject matter experts. The goal is to see if knowledgeable external teams can defeat models’ security perimeters and find gaps in their security, biases and controls that prompt-based testing couldn’t find. What makes OpenAI’s recent papers noteworthy is how well they define using human-in-the-middle

Read More »