pom commited on
Commit
036970a
·
1 Parent(s): bfa5d91

Add V7R tech crypto classifier

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ text_classifier.json filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -1,4 +1,62 @@
1
  ---
2
  license: mit
 
 
 
 
 
 
 
3
  ---
4
- this is a classification model that sorts tweets/profiles off the probability that it is tech/crypto related. this was a model created for a job that fell short. this is a tf-idf model, distilled from a transformer model that I also made. maybe ill upload that soon
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
  license: mit
3
+ tags:
4
+ - text-classification
5
+ - crypto
6
+ - technology
7
+ - twitter
8
+ - x
9
+ - fasttext-distillation
10
  ---
11
+ this is a classification model that sorts tweets/profiles off the probability that it is tech/crypto related. this was a model created for a job that fell short. this is a tf-idf model, distilled from a transformer model that I also made. maybe ill upload that soon
12
+
13
+ # Techpto Classifier
14
+
15
+ This repository contains a lightweight production classifier for detecting whether X/Twitter posts and profiles are crypto-related, tech-related, both, or neither.
16
+
17
+ ## Files
18
+
19
+ - `text_classifier.json`: Rust-compatible hashed logistic-regression classifier.
20
+ - `model_config.json`: labels, expected inputs, and recommended thresholds.
21
+ - `distill_metrics.json`: proxy evaluation metrics from distillation.
22
+ - `recommended_thresholds_distillation.json`: thresholds tuned against the V7 fastText teacher.
23
+ - `full_run_manifest.json`: counts and thresholds from the large full-corpus run.
24
+
25
+ ## Recommended Thresholds
26
+
27
+ The high-precision full-corpus run used:
28
+
29
+ ```json
30
+ {
31
+ "post_crypto": 0.85,
32
+ "post_tech": 0.90,
33
+ "profile_crypto": 0.90,
34
+ "profile_tech": 0.99
35
+ }
36
+ ```
37
+
38
+ The original distillation-tuned thresholds were:
39
+
40
+ ```json
41
+ {
42
+ "post_crypto": 0.58,
43
+ "post_tech": 0.44,
44
+ "profile_crypto": 0.34,
45
+ "profile_tech": 0.38
46
+ }
47
+ ```
48
+
49
+ ## Full-Corpus Run
50
+
51
+ Using the high-precision thresholds:
52
+
53
+ - Posts scanned: `928,484,069`
54
+ - Post matches: `7,728,133`
55
+ - Profiles scanned: `2,667,815,773`
56
+ - Profile matches: `7,915,096`
57
+
58
+ One corrupt post shard was skipped and is listed in `full_run_manifest.json`.
59
+
60
+ ## Notes
61
+
62
+ This is not a standard Transformers checkpoint. It is a compact hashed-feature linear classifier intended for very high-throughput local scanning. Metrics in `distill_metrics.json` are proxy metrics against teacher/weak labels rather than a final human-labeled benchmark.
distill_metrics.json ADDED
@@ -0,0 +1,390 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "note": "Rust-compatible hashed-logreg student distilled from V7 fastText. Metrics are proxy-only unless compared to human labels.",
3
+ "args": {
4
+ "data": "classified_v4_transformer_data_hardneg",
5
+ "teacher": "classified_v7_fasttext_v5b_120k\\model.bin",
6
+ "init_model": "classified_accuracy_v2\\text_classifier.json",
7
+ "output": "classified_v7r_fasttext_student_410k",
8
+ "train_sample": 0,
9
+ "eval_sample": 0,
10
+ "epochs": 3,
11
+ "learning_rate": 0.04,
12
+ "seed": 777,
13
+ "teacher_batch_size": 8192,
14
+ "crypto_threshold": 0.45,
15
+ "tech_threshold": 0.36
16
+ },
17
+ "teacher": {
18
+ "model": "classified_v7_fasttext_v5b_120k\\model.bin",
19
+ "thresholds": {
20
+ "crypto": 0.45,
21
+ "tech": 0.36
22
+ },
23
+ "train_seconds": 88.16688129999966,
24
+ "eval_seconds": 10.310907999999472
25
+ },
26
+ "student": {
27
+ "model_version": "hashed-logreg-v7-fasttext-student",
28
+ "train_rows": 410292,
29
+ "eval_rows": 50413,
30
+ "train_seconds": 13.258047600000282,
31
+ "default_thresholds": {
32
+ "post_crypto": 0.5,
33
+ "post_tech": 0.5,
34
+ "profile_crypto": 0.5,
35
+ "profile_tech": 0.5
36
+ },
37
+ "tuned_thresholds": {
38
+ "post_crypto": 0.58,
39
+ "post_tech": 0.44,
40
+ "profile_crypto": 0.34,
41
+ "profile_tech": 0.38
42
+ },
43
+ "threshold_report": {
44
+ "post_crypto": {
45
+ "threshold": 0.58,
46
+ "precision": 0.9671687073355727,
47
+ "recall": 0.980232813529541,
48
+ "fscore": 0.9736569402781566
49
+ },
50
+ "post_tech": {
51
+ "threshold": 0.44,
52
+ "precision": 0.9377788213195586,
53
+ "recall": 0.9484682973165519,
54
+ "fscore": 0.9430932703659975
55
+ },
56
+ "profile_crypto": {
57
+ "threshold": 0.34,
58
+ "precision": 0.9304776241959765,
59
+ "recall": 0.711490163248221,
60
+ "fscore": 0.806380833778094
61
+ },
62
+ "profile_tech": {
63
+ "threshold": 0.38,
64
+ "precision": 0.940460947503201,
65
+ "recall": 0.8883289659342875,
66
+ "fscore": 0.9136519125116617
67
+ }
68
+ }
69
+ },
70
+ "default_student_vs_teacher": {
71
+ "overall": {
72
+ "exact_match_accuracy": 0.9002836569932359,
73
+ "micro_precision": 0.9620242848993562,
74
+ "micro_recall": 0.8482431558525544,
75
+ "micro_f1": 0.9015579654803727,
76
+ "macro_precision": 0.9595827241171908,
77
+ "macro_recall": 0.8617410508785691,
78
+ "macro_f1": 0.9073573249366726,
79
+ "crypto": {
80
+ "precision": 0.9679515487981831,
81
+ "recall": 0.8221519665630693,
82
+ "f1": 0.8891142468055515,
83
+ "support": 18662
84
+ },
85
+ "tech": {
86
+ "precision": 0.9512138994361984,
87
+ "recall": 0.9013301351940689,
88
+ "f1": 0.9256004030677938,
89
+ "support": 9172
90
+ },
91
+ "pred_counts": {
92
+ "crypto": 15851,
93
+ "tech": 8691,
94
+ "negative": 26168
95
+ }
96
+ },
97
+ "posts_only": {
98
+ "exact_match_accuracy": 0.9610693606012073,
99
+ "micro_precision": 0.9562995333678986,
100
+ "micro_recall": 0.969512652999925,
101
+ "micro_f1": 0.9628607651577299,
102
+ "macro_precision": 0.9522663599218083,
103
+ "macro_recall": 0.9618777142458361,
104
+ "macro_f1": 0.9570222958759071,
105
+ "crypto": {
106
+ "precision": 0.9629789065863108,
107
+ "recall": 0.9826488029870415,
108
+ "f1": 0.9727144254810306,
109
+ "support": 9106
110
+ },
111
+ "tech": {
112
+ "precision": 0.9415538132573058,
113
+ "recall": 0.9411066255046308,
114
+ "f1": 0.9413301662707838,
115
+ "support": 4211
116
+ },
117
+ "pred_counts": {
118
+ "crypto": 9292,
119
+ "tech": 4209,
120
+ "negative": 11015
121
+ }
122
+ },
123
+ "profiles_only": {
124
+ "exact_match_accuracy": 0.8434886040979204,
125
+ "micro_precision": 0.9690245448781813,
126
+ "micro_recall": 0.7369980023420817,
127
+ "micro_f1": 0.8372329603255341,
128
+ "macro_precision": 0.9676408876174856,
129
+ "macro_recall": 0.7683900413176734,
130
+ "macro_f1": 0.852622602377825,
131
+ "crypto": {
132
+ "precision": 0.9749961884433602,
133
+ "recall": 0.6692130598576811,
134
+ "f1": 0.7936704933291964,
135
+ "support": 9556
136
+ },
137
+ "tech": {
138
+ "precision": 0.9602855867916109,
139
+ "recall": 0.8675670227776658,
140
+ "f1": 0.9115747114264534,
141
+ "support": 4961
142
+ },
143
+ "pred_counts": {
144
+ "crypto": 6559,
145
+ "tech": 4482,
146
+ "negative": 15153
147
+ }
148
+ }
149
+ },
150
+ "tuned_student_vs_teacher": {
151
+ "overall": {
152
+ "exact_match_accuracy": 0.9031003907722215,
153
+ "micro_precision": 0.9468231231113379,
154
+ "micro_recall": 0.866781633972839,
155
+ "micro_f1": 0.905036106161493,
156
+ "macro_precision": 0.9450696963354239,
157
+ "macro_recall": 0.8792805932309817,
158
+ "macro_f1": 0.910466457987787,
159
+ "crypto": {
160
+ "precision": 0.9509554910498307,
161
+ "recall": 0.8426213696281213,
162
+ "f1": 0.8935166770839252,
163
+ "support": 18662
164
+ },
165
+ "tech": {
166
+ "precision": 0.9391839016210173,
167
+ "recall": 0.9159398168338422,
168
+ "f1": 0.9274162388916487,
169
+ "support": 9172
170
+ },
171
+ "pred_counts": {
172
+ "crypto": 16536,
173
+ "tech": 8945,
174
+ "negative": 25288
175
+ }
176
+ },
177
+ "posts_only": {
178
+ "exact_match_accuracy": 0.9622602767853476,
179
+ "micro_precision": 0.9578884934756821,
180
+ "micro_recall": 0.9701884808890892,
181
+ "micro_f1": 0.9639992538705465,
182
+ "macro_precision": 0.9524737643275656,
183
+ "macro_recall": 0.9643505554230465,
184
+ "macro_f1": 0.958375105322077,
185
+ "crypto": {
186
+ "precision": 0.9671687073355727,
187
+ "recall": 0.980232813529541,
188
+ "f1": 0.9736569402781565,
189
+ "support": 9106
190
+ },
191
+ "tech": {
192
+ "precision": 0.9377788213195586,
193
+ "recall": 0.9484682973165519,
194
+ "f1": 0.9430932703659977,
195
+ "support": 4211
196
+ },
197
+ "pred_counts": {
198
+ "crypto": 9229,
199
+ "tech": 4259,
200
+ "negative": 11022
201
+ }
202
+ },
203
+ "profiles_only": {
204
+ "exact_match_accuracy": 0.8478244186938838,
205
+ "micro_precision": 0.9343783873926457,
206
+ "micro_recall": 0.7719225735344768,
207
+ "micro_f1": 0.8454168238400603,
208
+ "macro_precision": 0.9354692858495888,
209
+ "macro_recall": 0.7999095645912542,
210
+ "macro_f1": 0.8600163731448778,
211
+ "crypto": {
212
+ "precision": 0.9304776241959765,
213
+ "recall": 0.711490163248221,
214
+ "f1": 0.806380833778094,
215
+ "support": 9556
216
+ },
217
+ "tech": {
218
+ "precision": 0.940460947503201,
219
+ "recall": 0.8883289659342875,
220
+ "f1": 0.9136519125116617,
221
+ "support": 4961
222
+ },
223
+ "pred_counts": {
224
+ "crypto": 7307,
225
+ "tech": 4686,
226
+ "negative": 14266
227
+ }
228
+ }
229
+ },
230
+ "tuned_student_vs_weak_labels": {
231
+ "overall": {
232
+ "exact_match_accuracy": 0.8832840735524567,
233
+ "micro_precision": 0.9655429535732507,
234
+ "micro_recall": 0.8161823248407644,
235
+ "micro_f1": 0.8846022471910112,
236
+ "macro_precision": 0.965574214755928,
237
+ "macro_recall": 0.811794173017184,
238
+ "macro_f1": 0.8819491541016604,
239
+ "crypto": {
240
+ "precision": 0.9654692791485244,
241
+ "recall": 0.8274593137763036,
242
+ "f1": 0.8911526653642199,
243
+ "support": 19294
244
+ },
245
+ "tech": {
246
+ "precision": 0.9656791503633315,
247
+ "recall": 0.7961290322580645,
248
+ "f1": 0.8727456428391008,
249
+ "support": 10850
250
+ },
251
+ "pred_counts": {
252
+ "crypto": 16536,
253
+ "tech": 8945,
254
+ "negative": 25288
255
+ }
256
+ },
257
+ "posts_only": {
258
+ "exact_match_accuracy": 0.9659151574883988,
259
+ "micro_precision": 0.9944395017793595,
260
+ "micro_recall": 0.9453097469871027,
261
+ "micro_f1": 0.9692524478809119,
262
+ "macro_precision": 0.9942297434119423,
263
+ "macro_recall": 0.936574113553416,
264
+ "macro_f1": 0.9643727674837768,
265
+ "crypto": {
266
+ "precision": 0.994799003142269,
267
+ "recall": 0.9618648507071765,
268
+ "f1": 0.9780547565782465,
269
+ "support": 9545
270
+ },
271
+ "tech": {
272
+ "precision": 0.9936604836816154,
273
+ "recall": 0.9112833763996555,
274
+ "f1": 0.9506907783893069,
275
+ "support": 4644
276
+ },
277
+ "pred_counts": {
278
+ "crypto": 9229,
279
+ "tech": 4259,
280
+ "negative": 11022
281
+ }
282
+ },
283
+ "profiles_only": {
284
+ "exact_match_accuracy": 0.8060778144424833,
285
+ "micro_precision": 0.9330442758275661,
286
+ "micro_recall": 0.7013475399561266,
287
+ "micro_f1": 0.8007728638900816,
288
+ "macro_precision": 0.9343361720100598,
289
+ "macro_recall": 0.7029121738755889,
290
+ "macro_f1": 0.8022656696241247,
291
+ "crypto": {
292
+ "precision": 0.928424798138771,
293
+ "recall": 0.6958662426915581,
294
+ "f1": 0.7954971857410882,
295
+ "support": 9749
296
+ },
297
+ "tech": {
298
+ "precision": 0.9402475458813487,
299
+ "recall": 0.7099581050596198,
300
+ "f1": 0.8090341535071612,
301
+ "support": 6206
302
+ },
303
+ "pred_counts": {
304
+ "crypto": 7307,
305
+ "tech": 4686,
306
+ "negative": 14266
307
+ }
308
+ }
309
+ },
310
+ "teacher_vs_weak_labels": {
311
+ "overall": {
312
+ "exact_match_accuracy": 0.9257929502310912,
313
+ "micro_precision": 0.9578932241143925,
314
+ "micro_recall": 0.8844877919320594,
315
+ "micro_f1": 0.919728172755183,
316
+ "macro_precision": 0.9586196156540225,
317
+ "macro_recall": 0.8686619894248541,
318
+ "macro_f1": 0.9103972509783973,
319
+ "crypto": {
320
+ "precision": 0.9564891222805701,
321
+ "recall": 0.9251580802321966,
322
+ "f1": 0.9405627568763831,
323
+ "support": 19294
324
+ },
325
+ "tech": {
326
+ "precision": 0.9607501090274749,
327
+ "recall": 0.8121658986175115,
328
+ "f1": 0.8802317450804116,
329
+ "support": 10850
330
+ },
331
+ "pred_counts": {
332
+ "crypto": 18662,
333
+ "tech": 9172,
334
+ "negative": 22927
335
+ }
336
+ },
337
+ "posts_only": {
338
+ "exact_match_accuracy": 0.945423185906123,
339
+ "micro_precision": 0.9804009912142374,
340
+ "micro_recall": 0.9201494115159631,
341
+ "micro_f1": 0.9493201483312732,
342
+ "macro_precision": 0.9776264881654799,
343
+ "macro_recall": 0.9097467163339348,
344
+ "macro_f1": 0.9423142636561663,
345
+ "crypto": {
346
+ "precision": 0.9851746101471557,
347
+ "recall": 0.9398638030382399,
348
+ "f1": 0.9619859524958447,
349
+ "support": 9545
350
+ },
351
+ "tech": {
352
+ "precision": 0.9700783661838043,
353
+ "recall": 0.8796296296296297,
354
+ "f1": 0.9226425748164878,
355
+ "support": 4644
356
+ },
357
+ "pred_counts": {
358
+ "crypto": 9106,
359
+ "tech": 4211,
360
+ "negative": 11202
361
+ }
362
+ },
363
+ "profiles_only": {
364
+ "exact_match_accuracy": 0.9074514618985496,
365
+ "micro_precision": 0.9372459874629745,
366
+ "micro_recall": 0.8527734252585396,
367
+ "micro_f1": 0.8930165397742189,
368
+ "macro_precision": 0.9409932741182816,
369
+ "macro_recall": 0.8362211604736839,
370
+ "macro_f1": 0.8832334569237945,
371
+ "crypto": {
372
+ "precision": 0.9291544579321892,
373
+ "recall": 0.9107600779567135,
374
+ "f1": 0.9198653198653198,
375
+ "support": 9749
376
+ },
377
+ "tech": {
378
+ "precision": 0.9528320903043741,
379
+ "recall": 0.7616822429906542,
380
+ "f1": 0.8466015939822692,
381
+ "support": 6206
382
+ },
383
+ "pred_counts": {
384
+ "crypto": 9556,
385
+ "tech": 4961,
386
+ "negative": 11725
387
+ }
388
+ }
389
+ }
390
+ }
full_run_manifest.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "mode": "model_parallel_v7r_precision",
3
+ "classifier_version": "hashed-logreg-v7-fasttext-student",
4
+ "created_at": "2026-06-21T22:24:45",
5
+ "post_rows_scanned": 928484069,
6
+ "post_rows_written": 7728133,
7
+ "post_crypto_matches": 5725112,
8
+ "post_tech_matches": 2032807,
9
+ "profile_rows_scanned": 2667815773,
10
+ "profile_rows_written": 7915096,
11
+ "profile_crypto_matches": 5221555,
12
+ "profile_tech_matches": 2756026,
13
+ "author_stats_written": 1631493,
14
+ "thresholds": {
15
+ "post_crypto": 0.85,
16
+ "post_tech": 0.9,
17
+ "profile_crypto": 0.9,
18
+ "profile_tech": 0.99
19
+ },
20
+ "notes": "Parallel run reused current output through part_4, skipped duplicate part_5 rows from current, processed post parts 5-7 in parallel, and scanned profiles with 11 workers. Author stats use matched post counts rather than full denominator pass.",
21
+ "unreadable_files": [
22
+ "posts/part_3(1).parquet: skipping unreadable parquet file: Parquet error: Invalid Parquet file. Corrupt footer"
23
+ ]
24
+ }
model_config.json ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model_type": "hashed-logreg-v7-fasttext-student",
3
+ "task": "multi-label text classification",
4
+ "labels": [
5
+ "crypto",
6
+ "tech"
7
+ ],
8
+ "inputs": {
9
+ "post": "tweet/post text",
10
+ "profile": "bio + display_name + username + professional_category + url"
11
+ },
12
+ "artifacts": {
13
+ "classifier": "text_classifier.json",
14
+ "distillation_metrics": "distill_metrics.json",
15
+ "distillation_thresholds": "recommended_thresholds_distillation.json",
16
+ "full_run_manifest": "full_run_manifest.json"
17
+ },
18
+ "recommended_thresholds": {
19
+ "high_precision_full_run": {
20
+ "post_crypto": 0.85,
21
+ "post_tech": 0.9,
22
+ "profile_crypto": 0.9,
23
+ "profile_tech": 0.99
24
+ },
25
+ "distillation_tuned": {
26
+ "post_crypto": 0.58,
27
+ "post_tech": 0.44,
28
+ "profile_crypto": 0.34,
29
+ "profile_tech": 0.38
30
+ }
31
+ },
32
+ "notes": [
33
+ "Rust-compatible hashed logistic-regression student distilled from a V7 fastText teacher.",
34
+ "The production full-corpus run used the high_precision_full_run thresholds.",
35
+ "Metrics in distill_metrics.json are proxy metrics against teacher/weak labels, not a final human-labeled benchmark."
36
+ ]
37
+ }
recommended_thresholds_distillation.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {
2
+ "post_crypto": 0.58,
3
+ "post_tech": 0.44,
4
+ "profile_crypto": 0.34,
5
+ "profile_tech": 0.38
6
+ }
text_classifier.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f8e48c5716df193fa8d96c7b85aa956e2bc79a7ece9587fe52f6286bdabf2928
3
+ size 41342153