Data scienceWill it be shared?
Will people share a video more than its creator’s usual? Predicted from the video alone, before it’s posted.
Breakout or not? Video 1 of 3
A video breaks out when its share rate (shares per 1,000 views) is at least twice its creator’s usual. Every number in this project is a video against its own creator.
Every video against its creator’s usual: 143,489 videos, 231 creators
The video’s share rate as a multiple of its creator’s usual, on a log scale
A made-up video
2,400,000 views, 10,400 shares
Its creator usually gets 2 shares per 1,000 views.
The question
Shares per 1,000 views, the share rate, is the number creators watch: a share hands a video to someone new. A creator or an agency choosing which draft to post, and a platform choosing which new upload to show more widely, both have to judge a video before any count exists.
I asked whether that can be done from the video itself: its length, what it says and shows, and how its creator has been doing lately. Not its raw shares, which mostly say how big the channel is, but how it does against its own creator’s usual.
The data
- The videos
- 143,489 TikTok videos from 231 creators, with their public counts, collected for my own content platform: creators I chose, not a random sample of TikTok. Each has at least 1,000 views and was at least 14 days old when counted.
- The target
- Lift: the video’s share rate against the median of its creator’s last 30 videos, on a log scale, so 0 is “as usual”. A breakout is at least twice the usual: 24.5% of the videos.
- The test
- The newest videos, posted 1 April 2026 to 18 September 2026, opened once after every choice was frozen: 12,455 from 138 creators the model trained on, 9,285 from 81 it never saw.
Errors are the mean distance from the true lift in log10: on the test, “as usual” misses by 0.3752 for creators the model trained on, a factor of 2.37 either way. Every interval is 95%, from 2,000 draws of creators, not videos: one creator’s videos are not independent. The videos, captions and frames are their creators’ work and stay on my disk; this page shows aggregates over at least 5 creators.
What I found
Six things the data showed, and what each changed in how the model is built.
1. Who made it matters more than the video
The typical creator in the top tenth gets 14.6 shares per 1,000 views; in the bottom tenth, 0.37: 40× apart. Who made a video explains 38% of the variance in its log share rate.
What it changed
The target is lift, each video against its own creator’s recent usual, so a model can’t score by recognising big sharers. And creators the model trained on are reported apart from creators it never saw.
Each tenth of the 245 creators: its typical share rate
0.370.701.11.62.22.93.45.38.114.612345678910Tenths of creators, lowest to highest; shares per 1,000 views on a log scale
2. The yardstick moved 4.7×
The same 113 creators, each compared with themselves, were shared 4.7× as often in 2026 as in 2022, and 96% of them rose. Against each creator’s whole past, up to 41% of a year’s videos look like breakouts (chapter 2 above).
What it changed
The usual is the median of the creator’s last 30 videos, not their lifetime; the splits are by time; and the test is the newest videos, the period with the highest rates.
The library’s median share rate by year, shares per 1,000 views
1.50.90.80.71.61.63.23.6’192019’202020’212021’222022’232023’242024’252025’262026On a log scale. Every year holds at least 29 creators’ videos.
3. The data remembers its winners
My platform keeps each channel’s top clips by share rate and retires the rest. Of the videos whose clip it kept, 39.0% broke out; of those it retired, 17.8%. Whether a clip’s file still exists cuts the validation error by 0.0191, more than the final model’s 0.0159, without looking at the video.
What it changed
No file column is ever a feature, every frame comes out of the platform’s own poster code, and every model is checked for spotting kept clips: at the same lift, none of them rates a kept clip higher.
Breakouts, by whether the platform kept the clip - Clip kept39.0%
- Every video24.5%
- Clip retired17.8%
4. A first frame knows whose video it is, and adds nothing
From the first frame alone, a linear probe names the creator of a later video 64.7% of the time (top five: 88.2%), against 9.2% for always guessing the biggest creator. Lift is already measured against the creator, so that is worth nothing here: on top of the metadata and the words, the frame changes the test error by +0.0004 [−0.0002, +0.0009].
What it changed
Nothing was fine-tuned, no second GPU was rented, and the final model reads no pixels.
Naming the creator from a first frame, 13,645 validation frames, 148 creators to choose from - Right first guess64.7%
- In the top five88.2%
- Biggest creator9.2%
5. What a video says carries most of it, and recent form the rest
On the test, the words add +0.0098 [+0.0062, +0.0133] to the metadata, and the creator’s recent form adds +0.0054 [+0.0027, +0.0086] on top of both, for creators the model never saw too. Alone, recent form missed the baselines’ bar; next to the words the stack trusts it almost fully (0.94, the words 1.02). The metadata adds +0.0005 [+0.0000, +0.0011], by a hair, and not for unseen creators.
What it changed
The final model stacks what the video says with how the creator has been doing. Of the two, only the words are the creator’s to change before posting.
What each part adds on the test, for creators it trained on and creators it never saw
- Metadata, over “as usual” · trained on+0.0005 [+0.0000, +0.0011]
- Metadata, over “as usual” · never saw+0.0003 [−0.0002, +0.0009]
- The words, over metadata · trained on+0.0098 [+0.0062, +0.0133]
- The words, over metadata · never saw+0.0064 [+0.0029, +0.0100]
- Recent form, over both · trained on+0.0054 [+0.0027, +0.0086]
- Recent form, over both · never saw+0.0056 [+0.0025, +0.0088]
- The first frame, over metadata and words · trained on+0.0004 [−0.0002, +0.0009]
- The first frame, over metadata and words · never saw+0.0004 [−0.0006, +0.0014]
- The final model, over “as usual” · trained on+0.0157 [+0.0109, +0.0210]
- The final model, over “as usual” · never saw+0.0123 [+0.0069, +0.0181]
Gain in the error, log10, with its 95% interval; a filled dot clears 0
6. Share prompts lift it, ads pull it down
In the counted-words model, a caption’s “send” goes with a share rate +13% above the creator’s usual, “bestie” and “friend” likewise; an “ad” in the caption with −27%, the largest effect of all, and borrowed formats (duets, challenges, trends, filters) with less too. Associations inside these creators’ videos, not causes.
What it changed
Meaning beat counted words, so sentence embeddings replaced them, and a larger encoder replaced the small one. Chapter 4 runs the small one on your own hook.
What a word does to the predicted share rate, in the counted-words model - ib (“inspired by”) · caption, 24 creators+15.4%
- netflix · caption, 20 creators+15.0%
- movies · caption, 25 creators+12.8%
- send · caption, 44 creators+12.8%
- bestie · on-screen text, 34 creators+12.3%
- friend · on-screen text, 84 creators+11.3%
- bestie · caption, 34 creators+11.1%
- dancing · caption, 30 creators+10.4%
- send · on-screen text, 46 creators+9.5%
- rain · caption, 22 creators+9.2%
- this to · caption, 40 creators+8.5%
- ad · caption, 36 creators−27.2%
- duet with · caption, 53 creators−17.8%
- shoes · caption, 31 creators−17.1%
- code · caption, 26 creators−16.6%
- duet · caption, 57 creators−15.9%
- filter · caption, 37 creators−13.6%
- ai · caption, 26 creators−13.1%
- podcast · caption, 21 creators−12.8%
- filter · on-screen text, 27 creators−12.1%
- challenge · caption, 43 creators−11.6%
- trend · on-screen text, 33 creators−11.2%
The strongest of 39,481 terms each way, each used by at least 20 creators. 2 more are Serbian words, which mark a language rather than a subject, and are left out here.
Where it works, and where it doesn’t
On the test, for creators it trained on, the gain holds across video lengths and creator sizes. It is smallest for the smallest creators and for videos with neither speech nor text on screen, where the words have nothing to read.
Creator size (median views before the test)
- under 23k · 35 creators2.9%
- 23k to 99k · 34 creators4.9%
- 99k to 508k · 34 creators5.2%
- over 508k · 35 creators4.9%
Gain over “as usual”, log10, with its 95% interval; the share of the error it removes
Video length
- under 10 s · 100 creators4.4%
- 10 to 20 s · 121 creators4.0%
- 20 to 40 s · 123 creators4.1%
- 40 to 60 s · 103 creators4.0%
- over 60 s · 24 creators6.3%
Gain over “as usual”, log10, with its 95% interval; the share of the error it removes
Talking or not
- talking · 138 creators4.4%
- text on screen, no speech · 94 creators3.7%
- neither · 77 creators1.3%
Gain over “as usual”, log10, with its 95% interval; the share of the error it removes
Earlier videos in the library
- under 100 · 14 creators7.6%
- 100 to 300 · 29 creators1.9%
- 300 to 1,000 · 64 creators3.1%
- 1,000 or more · 43 creators5.1%
Gain over “as usual”, log10, with its 95% interval; the share of the error it removes
What I built
In Python, in stages, each one having to beat the one before on the same videos, with every setting chosen on validation and the test opened once, at the end.
1. The target and the splits
Lift: a video’s log share rate minus the median of its creator’s last 30 videos posted at least 14 days earlier, so every rate in it had settled when the video went up. Split by time, the newest videos kept for the test, and some creators held out entirely.
2. Baselines
“As usual” (zero lift), the creator’s recent form, their drift, and the video’s metadata in ridge and in boosted trees, every gain with a 95% interval from a paired bootstrap that draws creators, not videos.
3. The words
Seven text fields per video: the caption, the speech and its hook, body and payoff, the on-screen text, a scene description. As counted words that at least 20 creators use, and as sentence embeddings.
4. The picture, and a larger encoder
On one rented GPU: SigLIP 2 on each video’s first frame, and Qwen3-Embedding-4B on the text. Every frame went through the platform’s own poster code, so no model could tell a kept clip from a retired one by its compression.
5. The stack, and one test
Least squares over each part’s out-of-fold predictions, in folds by creator: the words weigh 1.02, recent form 0.94, the metadata 0.61. Every choice was frozen in a file, with a fingerprint of each model’s validation predictions, before the test was opened.
6. This page
One command writes its data from the report and from aggregates over at least 5 creators, and scans it for any creator’s name, video id or words. The hook model runs in your browser.
The result in plain words
- Error smaller than “as usual”, creators it trained on
- 4.2%
- smaller error than “as usual”, for creators the model trained on.
- 0.3752 to 0.3595 log10 · +0.0157 [+0.0109, +0.0210]
- Error smaller than “as usual”, creators it never saw
- 3.3%
- for creators it never saw.
- 0.3774 to 0.3650 log10 · +0.0123 [+0.0069, +0.0181]
- Breakouts among each creator’s top tenth by the model
- 43.5%
- of each creator’s top tenth by the model broke out.
- a random pick: 25.3%
From a video’s length, what it says and how its creator has been doing, the model predicts how it will do against its creator’s usual better than “as usual” does, on the newest videos and for creators it never saw. Small as an error, useful as a ranking: of the videos it ranks highest for each creator, far more break out.
Still small: the typical miss goes from a factor of 2.37 to 2.29. How a video does against its own creator’s usual is mostly not predictable before it is posted; the part that is comes from what it says and from the creator’s recent run. The first frame, which knows whose video it is, adds nothing.
What I’d do next
Call videos before they’re posted
Score new videos the day they go up, and check each call 14 days later, once its rate has settled: a live scoreboard of the model against “as usual”.
Test the words, not just read them
The words are associations inside these creators’ videos. Two hooks on the same video, shown to different viewers, would say whether changing a hook changes shares.
Train the text encoder on lift
The encoders here were frozen, with ridge on top. Fine-tuned on lift, the words’ part may carry more, scored on videos posted after this test, since this one is spent.
Links
- The code on GitHub (opens in a new tab) · the target, the models, the test and the export this page reads
- Every result (opens in a new tab) · as the test’s notebook wrote them, with every interval
- The notebooks (opens in a new tab) · one per stage, each cell explained
The hook model’s encoder is BAAI’s bge-small-en-v1.5, in Xenova’s ONNX copy, loaded from Hugging Face when you ask for it.