A routing model for support tickets that picks the right team and a confidence level. Two model types were compared before choosing, and low-confidence tickets stay in the shared queue.

- Machine Learning Specialization · Coursera
- Advanced Learning Algorithms · DeepLearning.AI & Stanford Online · Coursera
Overview
What this is and why it matters, in plain English.
A routing model for support tickets that picks the right team and a confidence level. Two model types were compared before choosing, and low-confidence tickets stay in the shared queue.
Machine learning that sends each support ticket to the right team, and leaves unsure ones for a person.
The situation
What was going on before, and why it needed fixing.
Support tickets landed in one shared inbox and were sorted by whoever picked them up. Misrouted tickets bounced between teams before work started.
Tickets landed in one shared inbox and were sorted by whoever picked them up. Misrouted tickets bounced between teams before anyone started on them.
What it needed to do
The outcomes the project had to deliver.
- Route each ticket to the right team automatically.
- Compare model families fairly before choosing one.
- Never route confidently when the model is unsure.
What I did
My part of the work and who I worked with.
I built and evaluated the TensorFlow neural network and the XGBoost model, ran the bias and variance diagnostics, and shipped the chosen model behind a Node.js REST endpoint with Redis caching.
How it works
The main building blocks, from the screen people use to the data underneath.
Trained a softmax neural network in TensorFlow on ticket text and an XGBoost model on structured fields, compared them on the same held-out set, and deployed the chosen model behind a Node.js endpoint that returns a team and a confidence. Low-confidence tickets stay in the shared queue.
- 01
Text and structured features
Ticket text is vectorized for the neural network; structured fields such as product area and channel feed the tree model.
- 02
Neural network (TensorFlow)
Dense layers with ReLU, L2 regularization and dropout, and a softmax output over teams.
- 03
Gradient-boosted trees (XGBoost)
A tree ensemble trained on the same split for a direct comparison.
- 04
Node.js API
Returns a team and a confidence; below the threshold the ticket stays in the shared queue. Recent results are cached in Redis.
Key choices and trade-offs
Every build involves trade-offs. These are the important ones and what each one cost.
| Decision | Trade-off |
|---|---|
| Evaluate both model families on one held-out set. | More training work, but the choice rests on evidence rather than habit. |
| Abstain below a confidence threshold. | Some tickets still need manual sorting, but confident misroutes are avoided. |
| Class weights for small teams. | Slightly lower overall fit, but low-volume teams are not ignored. |
Under the hood
Implementation details for technical readers, with a code sample.
- Applies neural networks, softmax multiclass output, and decision-tree ensembles from Advanced Learning Algorithms.
- Uses bias and variance diagnostics and learning curves from the Machine Learning Specialization.
- A clear abstain path to the shared queue.
model = tf.keras.Sequential([
tf.keras.layers.Dense(128, activation="relu", kernel_regularizer=tf.keras.regularizers.l2(1e-4)),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(64, activation="relu"),
tf.keras.layers.Dense(num_teams, activation="linear"),
])
model.compile(optimizer="adam",
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True))
model.fit(X_train, y_train, validation_data=(X_cv, y_cv), class_weight=weights, epochs=40)Problems solved
What got in the way, and how each problem was fixed.
- 01
Some teams receive far fewer tickets, so class weights and per-class metrics kept the small teams from being ignored.
Class weights during training and per-class precision and recall during evaluation.
- 02
Training and validation curves were used to diagnose high bias versus high variance before adding data or capacity.
Training and cross-validation curves read before each change, so more data or more capacity was added only when the diagnosis called for it.
- 03
A wrong confident route is worse than no route, so the API abstains below a confidence threshold.
A confidence threshold on the softmax output; tickets below it are not routed.
Security, speed and growth
How data is protected, and how the system stays fast as usage grows.
Security
Ticket text is processed in the service and not written to logs; only the route and confidence are stored.
Speed & growth
One model call per ticket behind a lightweight Node.js endpoint, with Redis caching repeat lookups.
Quality and releases
How changes were tested and shipped safely.
Held-out evaluation per team, threshold tuning on a validation split, and regression tests on a fixed ticket set before each model update.
Tech stack
The tools and technologies used, for recruiters and technical reviewers.
Results
What the system is designed to achieve, and how.
| Metric | Result |
|---|---|
| Models compared | 2 NN vs trees |
| Low confidence | Abstain to shared queue |
| Output | Softmax multiclass |
These are design targets and approach choices for the system, not reported production figures.
Questions
Plain answers first, then the detail a technical reviewer would ask about.
Common questions
- What happens when the system is not sure?
- The ticket stays in the shared queue for a person to route, so uncertain tickets never go to the wrong team.
- What does it save a support team?
- Time spent reading and forwarding tickets by hand, so agents start on the actual problem sooner.
For your tech lead
- Which certification does this apply?
- Advanced Learning Algorithms, and the Machine Learning Specialization.
- What happens when the model is unsure?
- The ticket stays in the shared queue for a person to route.
Key takeaways
- •Machine learning that sends each support ticket to the right team, and leaves unsure ones for a person.
- •Built with Python, TensorFlow, XGBoost, Node.js, Redis, REST.