-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathaiengineering.html
More file actions
274 lines (254 loc) · 35.3 KB
/
Copy pathaiengineering.html
File metadata and controls
274 lines (254 loc) · 35.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="AI Engineering portfolio of Devis Saputra: featured empirical studies and reproducible machine-learning engineering work.">
<title>Devis Saputra — AI Engineering</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Source+Serif+4:opsz,wght@8..60,400;8..60,600;8..60,700&family=IBM+Plex+Sans:wght@400;500;600&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/jpswalsh/academicons@1/css/academicons.min.css">
<style>
:root{--paper:#EEF0EF;--paper-raised:#F5F6F5;--ink:#1B2430;--ink-soft:#5B6660;--line:#C9CDC5;--accent:#2F5D62;--accent-soft:#DDE6E4;--accent-deep:#244A4E;--serif:"Source Serif 4",Georgia,serif;--sans:"IBM Plex Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;}
*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--paper);color:var(--ink);font-family:var(--sans);font-size:16px;line-height:1.58}a{color:var(--accent)}h1,h2,h3{font-family:var(--serif);margin:0;line-height:1.18}
.page{display:grid;grid-template-columns:280px 1fr;max-width:1320px;margin:0 auto;min-height:100vh}
.sidebar{padding:46px 32px 38px 40px;position:sticky;top:0;align-self:start;height:100vh;display:flex;flex-direction:column;justify-content:space-between}
.sidebar-top h1{font-size:1.72rem}.tagline{margin:12px 0 0;color:var(--ink-soft);font-size:.98rem;max-width:22ch}
nav.toc{margin-top:26px}nav.toc a{display:block;padding:6px 0 6px 12px;margin-left:-12px;border-left:2px solid transparent;color:var(--ink);text-decoration:none;font-size:.9rem;font-weight:600}nav.toc a:hover{border-left-color:var(--accent);color:var(--accent)}
.sidebar-bottom{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:12px;row-gap:9px;font-size:.84rem;color:var(--ink-soft)}.sidebar-bottom .contact-label{grid-column:1/-1;color:var(--ink);font-weight:600}.sidebar-bottom a{display:flex;align-items:center;gap:7px;color:var(--accent);text-decoration:none;white-space:nowrap}.sidebar-bottom i{width:18px;text-align:center}.sidebar-bottom .scholar{grid-column:1/-1}
.content{padding:48px 48px 80px 34px;border-left:1px solid var(--line)}section{max-width:940px;margin-bottom:56px}.back-link{display:inline-flex;gap:8px;align-items:center;margin-bottom:25px;color:var(--ink-soft);text-decoration:none;font-size:.9rem}
.hero{margin-bottom:48px}.kicker{font-size:.78rem;text-transform:uppercase;letter-spacing:.13em;color:var(--accent);font-weight:600;margin-bottom:10px}.hero h2{font-size:clamp(2rem,3.6vw,2.8rem)}.hero .lede{margin:16px 0 0;max-width:820px;font-family:var(--serif);font-size:1.13rem;color:#303B42}
.portfolio-nav{display:grid;grid-template-columns:repeat(4,1fr);margin-top:28px;border:1px solid #D7DAD5;border-radius:7px;overflow:hidden}.portfolio-nav a{display:flex;align-items:center;justify-content:center;min-height:48px;padding:9px 8px;background:#F2F3F2;color:#222B33;text-decoration:none;text-align:center;font-size:.88rem;font-weight:600;border-right:1px solid #D7DAD5}.portfolio-nav a:last-child{border-right:none}.portfolio-nav a.active{background:var(--accent);color:#fff}
.eyebrow-rule{display:flex;align-items:center;gap:14px;margin-bottom:18px}.eyebrow-rule h2{font-size:1.45rem}.eyebrow-rule::after{content:"";flex:1;height:1px;background:var(--line)}
.contact-row{display:flex;flex-wrap:wrap;gap:10px}.contact-row a{padding:8px 13px;border:1px solid var(--line);border-radius:5px;background:var(--paper-raised);color:var(--ink);text-decoration:none}
footer{max-width:940px;margin-top:54px;padding-top:18px;border-top:1px solid var(--line);color:var(--ink-soft);font-size:.78rem}
@media(max-width:900px){.page{grid-template-columns:1fr}.sidebar{position:static;height:auto;padding:34px 24px 26px;border-bottom:1px solid var(--line);gap:26px}nav.toc{display:none}.content{padding:34px 24px 58px;border-left:none}}
@media(max-width:700px){.portfolio-nav{grid-template-columns:1fr}.portfolio-nav a{border-right:none;border-bottom:1px solid #D7DAD5}}
.project-index{display:flex;flex-wrap:wrap;gap:7px;margin-top:22px}
.project-index a{padding:5px 9px;border:1px solid var(--line);border-radius:5px;background:var(--paper-raised);text-decoration:none;font-size:.78rem;color:#39444A}
.project-index a:hover,.project-index a:focus-visible{border-color:var(--accent);color:var(--accent)}
.portfolio-detail .repo-visual img{aspect-ratio:10/7;height:auto}.repo-copy{line-height:1.65}.repo-links a{min-height:40px}
</style>
<link rel="stylesheet" href="assets/site.css?v=20260926-layout-1">
</head>
<body class="portfolio-detail">
<div class="page">
<aside class="sidebar">
<div class="sidebar-top">
<h1>Devis Saputra</h1>
<p class="tagline">Learning Designer | AIEd</p>
<nav class="toc" aria-label="AI Engineering page navigation">
<a href="index.html">← Main Portfolio</a>
<a href="#overview">Overview</a>
<a href="#research-bundles">Empirical Studies <i class="fa-brands fa-github" aria-hidden="true"></i></a>
<a href="#imbalanced_learning">Repositories</a>
<a href="#contact">Contact</a>
</nav>
</div>
<div class="sidebar-bottom" aria-label="Contact links">
<div class="contact-label">Links</div>
<a href="mailto:devis.saputra@gmail.com"><i class="fa-solid fa-envelope"></i><span>Email</span></a>
<a href="https://linkedin.com/in/devissaputra" target="_blank" rel="noopener noreferrer"><i class="fa-brands fa-linkedin"></i><span>LinkedIn</span></a>
<a href="https://www.xing.com/profile/Devis_Saputra" target="_blank" rel="noopener noreferrer"><i class="fa-brands fa-xing"></i><span>Xing</span></a>
<a href="https://github.com/devissaputra/" target="_blank" rel="noopener noreferrer"><i class="fa-brands fa-github"></i><span>GitHub</span></a>
<a href="https://orcid.org/0000-0002-7133-9410" target="_blank" rel="noopener noreferrer"><i class="ai ai-orcid"></i><span>ORCID</span></a>
<a class="scholar" href="https://scholar.google.com/citations?user=EB5_ZRMAAAAJ&hl=en&oi=ao" target="_blank" rel="noopener noreferrer"><i class="ai ai-google-scholar"></i><span>Google Scholar</span></a>
</div>
</aside>
<main class="content">
<a class="back-link" href="index.html"><i class="fa-solid fa-arrow-left"></i> Back to main portfolio</a>
<div class="portfolio-nav" aria-label="Portfolio areas">
<a href="research.html">Research</a>
<a href="learningdevelopment.html">Learning & Development</a>
<a class="active" href="aiengineering.html" aria-current="page">AI Engineering</a>
<a href="aieducation.html">AI in Education</a>
</div>
<section class="hero" id="overview">
<h2>Portfolio in AI Engineering</h2>
<p class="lede">This portfolio documents my growing AI engineering practice, grounded in an Informatics degree and experience translating operational problems into software. The projects develop Python and machine-learning competence through explicit baselines, probability calibration, error analysis and reproducible evaluation. They provide evidence of project-based development rather than a claim of long-standing production AI experience.</p>
<div class="project-index" aria-label="Page project index">
<a href="#research-bundles">Empirical Studies</a>
<a href="#imbalanced_learning">Learning from Imbalanced Data</a>
<a href="#pca_clustering">PCA & K-Means</a>
<a href="#mlp_neural_network">MLP vs Linear Baseline</a>
<a href="#cnn_image_classification">CNN Image Classification</a>
<a href="#lstm_time_series">LSTM Time Series</a>
</div>
</section>
<section class="repo-section" id="research-bundles">
<div class="eyebrow-rule bundle-heading"><h2>Empirical Studies</h2></div>
<p class="repo-section-intro">These four studies connect external data, explicit comparisons, recorded results, and working papers. Each entry links to its calculations and states what the evidence can support.</p>
<article class="repo-project research-bundle" id="classification_calibration">
<header class="repo-project-heading"><div class="repo-kicker">Empirical Study · AI Engineering</div>
<h3>Probability Calibration</h3></header>
<div class="repo-project-grid">
<div class="repo-visuals">
<figure class="repo-visual"><a class="figure-link" href="assets/aieng/classification_calibration/review_overview.svg?v=20260926-evidence-review" target="_blank" rel="noopener noreferrer" aria-label="Open figure at full size in a new tab"><img loading="lazy" src="assets/aieng/classification_calibration/review_overview.svg?v=20260926-evidence-review" alt="Can predicted probabilities be trusted? UCI Bank Marketing: 45,211 records and 16 predictors; subscription is the positive class."></a><figcaption>Study question, data, design and interpretation limits</figcaption></figure>
<figure class="repo-visual"><a class="figure-link" href="assets/aieng/classification_calibration/review_calculations.svg?v=20260926-evidence-review" target="_blank" rel="noopener noreferrer" aria-label="Open figure at full size in a new tab"><img loading="lazy" src="assets/aieng/classification_calibration/review_calculations.svg?v=20260926-evidence-review" alt="Calculation: Brier = mean((p - y)^2); ECE = sum(bin share × |mean p - mean y|)."></a><figcaption>Calculation definition and source-linked evidence; open for full size</figcaption></figure>
</div>
<div>
<div class="repo-copy"><p>This study asks a more demanding question than whether a classifier is simply accurate: when a model assigns a probability, does that number match what actually happens? Using the UCI Bank Marketing dataset with 45,211 observations, 16 predictors, and an 11.7% positive class, the protocol compares a class-prior baseline with uncalibrated, sigmoid-calibrated, and isotonic-calibrated logistic regression across five fixed stratified holdouts. Discrimination is evaluated separately from probability quality using ROC-AUC and average precision alongside Brier score, log loss, and expected calibration error.</p>
<p>Isotonic calibration reduces mean Brier score from 0.0720 to 0.0693 across five holdouts, while ROC-AUC stays near 0.906. This supports a probability-quality improvement under the frozen protocol, rather than a substantial change in ranking. The call-duration ablation matters operationally because duration is unavailable before a call; results using it describe a retrospective task.</p></div>
<div class="repo-evidence" aria-label="Probability calibration evidence snapshot">
<div class="repo-evidence-item"><span class="repo-evidence-value">45,211</span><span class="repo-evidence-label">observations</span></div>
<div class="repo-evidence-item"><span class="repo-evidence-value">11.7%</span><span class="repo-evidence-label">positive class</span></div>
<div class="repo-evidence-item"><span class="repo-evidence-value">5</span><span class="repo-evidence-label">repeated splits</span></div>
<div class="repo-evidence-item"><span class="repo-evidence-value">0.0074</span><span class="repo-evidence-label">isotonic ECE-10</span></div>
</div>
<div class="repo-data-note"><strong>Data and provenance:</strong> UCI Bank Marketing (dataset 222), DOI 10.24432/C5K306. The runner downloads the official archive, validates the exact <code>bank-full.csv</code> SHA-256, and keeps raw source data out of the repository.</div>
<div class="repo-links"><a href="https://github.com/devissaputra/classification_calibration/blob/main/CALCULATIONS.md" target="_blank" rel="noopener noreferrer">Calculations & evidence</a><a href="https://github.com/devissaputra/classification_calibration" target="_blank" rel="noopener noreferrer"><i class="fa-brands fa-github"></i> Repository</a>
<a href="https://github.com/devissaputra/classification_calibration/blob/main/paper/results.md" target="_blank" rel="noopener noreferrer"><i class="fa-solid fa-chart-line"></i> Results</a>
<a href="https://github.com/devissaputra/classification_calibration/blob/main/paper/paper.md" target="_blank" rel="noopener noreferrer"><i class="fa-solid fa-file-pen"></i> Paper</a>
<a href="https://github.com/devissaputra/classification_calibration/blob/main/DATA.md" target="_blank" rel="noopener noreferrer"><i class="fa-solid fa-database"></i> Data & provenance</a></div>
</div>
</div>
</article>
<article class="repo-project research-bundle" id="anomaly_detection">
<header class="repo-project-heading"><div class="repo-kicker">Empirical Study · AI Engineering</div>
<h3>Label-Blind Threshold-Aware Anomaly Detection on NAB</h3></header>
<div class="repo-project-grid">
<div class="repo-visuals">
<figure class="repo-visual"><a class="figure-link" href="assets/aieng/anomaly_detection/review_overview.svg?v=20260926-evidence-review" target="_blank" rel="noopener noreferrer" aria-label="Open figure at full size in a new tab"><img loading="lazy" src="assets/aieng/anomaly_detection/review_overview.svg?v=20260926-evidence-review" alt="When do label-blind detectors produce useful alerts? Four realKnownCause NAB streams; pinned data and annotation hashes."></a><figcaption>Study question, data, design and interpretation limits</figcaption></figure>
<figure class="repo-visual"><a class="figure-link" href="assets/aieng/anomaly_detection/review_calculations.svg?v=20260926-evidence-review" target="_blank" rel="noopener noreferrer" aria-label="Open figure at full size in a new tab"><img loading="lazy" src="assets/aieng/anomaly_detection/review_calculations.svg?v=20260926-evidence-review" alt="Calculation: Threshold = quantile(validation scores, 1 - budget); FPR = FP / (FP + TN)."></a><figcaption>Calculation definition and source-linked evidence; open for full size</figcaption></figure>
</div>
<div>
<div class="repo-copy"><p>This study compares feature-based Isolation Forest with a transparent robust-history baseline on four real NAB streams. The primary pipeline stays label-blind during fitting and alert-budget calibration, then evaluates event detection separately so threshold tuning does not quietly leak benchmark labels into the detector.</p>
<p>At the 5% validation alert budget, the primary Isolation Forest test false-positive rate ranges from 0.0300 to 0.2338 across the four streams. This variation is central to the finding: a fixed calibration budget does not guarantee a stable operating point after temporal change. Repeated seeds and history-window checks describe robustness on these streams, not independent replications.</p></div>
<div class="repo-data-note"><strong>Data source:</strong> Numenta Anomaly Benchmark (NAB), pinned benchmark revision and frozen selected streams.</div>
<div class="repo-links"><a href="https://github.com/devissaputra/anomaly_detection/blob/main/CALCULATIONS.md" target="_blank" rel="noopener noreferrer">Calculations & evidence</a><a href="https://github.com/devissaputra/anomaly_detection" target="_blank" rel="noopener noreferrer"><i class="fa-brands fa-github"></i> Repository</a>
<a href="https://github.com/devissaputra/anomaly_detection/blob/main/paper/results.md" target="_blank" rel="noopener noreferrer"><i class="fa-solid fa-file-lines"></i> Results</a>
<a href="https://github.com/devissaputra/anomaly_detection/blob/main/paper/paper.md" target="_blank" rel="noopener noreferrer"><i class="fa-solid fa-file-pen"></i> Paper</a>
<a href="https://github.com/devissaputra/anomaly_detection/blob/main/DATA.md" target="_blank" rel="noopener noreferrer"><i class="fa-solid fa-database"></i> Data source</a></div>
</div>
</div>
</article>
<article class="repo-project research-bundle" id="explainable_ai">
<header class="repo-project-heading"><div class="repo-kicker">Empirical Study · AI Engineering</div>
<h3>Explainable AI: Model Dependence and Feature-Governance Study</h3></header>
<div class="repo-project-grid">
<div class="repo-visuals">
<figure class="repo-visual"><a class="figure-link" href="assets/aieng/explainable_ai/review_overview.svg?v=20260926-evidence-review" target="_blank" rel="noopener noreferrer" aria-label="Open figure at full size in a new tab"><img loading="lazy" src="assets/aieng/explainable_ai/review_overview.svg?v=20260926-evidence-review" alt="Do explanations change with the model and feature policy? UCI Adult: 48,842 records; exact duplicate predictor profiles remain within the same partition."></a><figcaption>Study question, data, design and interpretation limits</figcaption></figure>
<figure class="repo-visual"><a class="figure-link" href="assets/aieng/explainable_ai/review_calculations.svg?v=20260926-evidence-review" target="_blank" rel="noopener noreferrer" aria-label="Open figure at full size in a new tab"><img loading="lazy" src="assets/aieng/explainable_ai/review_calculations.svg?v=20260926-evidence-review" alt="Calculation: Importance(j) = AUC(original) - mean AUC(permuted feature j)."></a><figcaption>Calculation definition and source-linked evidence; open for full size</figcaption></figure>
</div>
<div>
<div class="repo-copy"><p>This study examines how global feature explanations change across model families and feature-governance choices on the Adult income benchmark. It combines held-out performance, permutation-importance stability, subgroup behavior, feature exclusion, and error analysis while keeping predictive dependence separate from causal or fairness claims.</p>
<p>On the primary grouped holdout, random-forest ROC-AUC is 0.9174 with all features and 0.9167 after excluding race and sex; logistic regression scores 0.9063 and 0.9052. Marital status leads the permutation rankings, but its importance differs markedly between models. Subgroup diagnostics remain necessary after exclusion, so the study supports inspection of model dependence rather than causal attribution or a fairness verdict.</p></div>
<div class="repo-data-note"><strong>Data source:</strong> UCI Adult / Census Income (dataset 2), DOI 10.24432/C5XW20.</div>
<div class="repo-links"><a href="https://github.com/devissaputra/explainable_ai/blob/main/CALCULATIONS.md" target="_blank" rel="noopener noreferrer">Calculations & evidence</a><a href="https://github.com/devissaputra/explainable_ai" target="_blank" rel="noopener noreferrer"><i class="fa-brands fa-github"></i> Repository</a>
<a href="https://github.com/devissaputra/explainable_ai/blob/main/paper/results.md" target="_blank" rel="noopener noreferrer"><i class="fa-solid fa-file-lines"></i> Results</a>
<a href="https://github.com/devissaputra/explainable_ai/blob/main/paper/paper.md" target="_blank" rel="noopener noreferrer"><i class="fa-solid fa-file-pen"></i> Paper</a>
<a href="https://github.com/devissaputra/explainable_ai/blob/main/DATA.md" target="_blank" rel="noopener noreferrer"><i class="fa-solid fa-database"></i> Data source</a></div>
</div>
</div>
</article>
<article class="repo-project research-bundle" id="mini_transformers_sequences">
<header class="repo-project-heading"><div class="repo-kicker">Empirical Study · AI Engineering</div>
<h3>Transformer Forecasting on WDC-SILSO</h3></header>
<div class="repo-project-grid">
<div class="repo-visuals">
<figure class="repo-visual"><a class="figure-link" href="assets/aieng/mini_transformers_sequences/review_overview.svg?v=20260926-evidence-review" target="_blank" rel="noopener noreferrer" aria-label="Open figure at full size in a new tab"><img loading="lazy" src="assets/aieng/mini_transformers_sequences/review_overview.svg?v=20260926-evidence-review" alt="Does a small Transformer justify its complexity? WDC-SILSO monthly sunspots, January 1749 to March 2026: 3,327 definitive observations."></a><figcaption>Study question, data, design and interpretation limits</figcaption></figure>
<figure class="repo-visual"><a class="figure-link" href="assets/aieng/mini_transformers_sequences/review_calculations.svg?v=20260926-evidence-review" target="_blank" rel="noopener noreferrer" aria-label="Open figure at full size in a new tab"><img loading="lazy" src="assets/aieng/mini_transformers_sequences/review_calculations.svg?v=20260926-evidence-review" alt="Calculation: MAE = mean(|forecast - observed|); delta = Transformer MAE - baseline MAE."></a><figcaption>Calculation definition and source-linked evidence; open for full size</figcaption></figure>
</div>
<div>
<div class="repo-copy"><p>This multi-horizon forecasting study asks whether a compact Transformer actually earns its complexity over persistence, seasonal-naive, ridge, and gradient-boosted baselines on a long scientific time series. It evaluates several forecast horizons, seed stability, context-length sensitivity, early-versus-late test behavior, and performance during high solar activity.</p>
<p>The Transformer has lower mean error than the simpler baselines at the 1- and 6-month horizons under the recorded protocol. The 12-month result is less stable: its three-seed mean MAE is 24.206, versus 23.973 for histogram gradient boosting, despite seed 42 favoring the Transformer. The seed-42 intervals against that baseline also cross zero at 6 and 12 months. This qualifies any broad claim that the Transformer is consistently superior.</p></div>
<div class="repo-data-note"><strong>Data source:</strong> WDC-SILSO Version 2.0 monthly mean total sunspot number, frozen through March 2026.</div>
<div class="repo-links"><a href="https://github.com/devissaputra/mini_transformers_sequences/blob/main/CALCULATIONS.md" target="_blank" rel="noopener noreferrer">Calculations & evidence</a><a href="https://github.com/devissaputra/mini_transformers_sequences" target="_blank" rel="noopener noreferrer"><i class="fa-brands fa-github"></i> Repository</a>
<a href="https://github.com/devissaputra/mini_transformers_sequences/blob/main/paper/results.md" target="_blank" rel="noopener noreferrer"><i class="fa-solid fa-file-lines"></i> Results</a>
<a href="https://github.com/devissaputra/mini_transformers_sequences/blob/main/paper/paper.md" target="_blank" rel="noopener noreferrer"><i class="fa-solid fa-file-pen"></i> Paper</a>
<a href="https://github.com/devissaputra/mini_transformers_sequences/blob/main/DATA.md" target="_blank" rel="noopener noreferrer"><i class="fa-solid fa-database"></i> Data source</a></div>
</div>
</div>
</article>
</section>
<section class="repo-section" id="repositories">
<div class="eyebrow-rule"><h2>Repositories</h2></div>
<p class="repo-section-intro">The remaining five repositories are compact engineering studies built around transparent comparisons, reproducible splits, and scientific visuals rather than presentation-only demos.</p>
<article class="repo-project" id="imbalanced_learning">
<header class="repo-project-heading"><div class="repo-kicker">AI Engineering Repository · 05</div>
<h3>Learning from Imbalanced Data</h3></header>
<div class="repo-project-grid">
<div class="repo-visuals">
<figure class="repo-visual"><a class="figure-link" href="assets/aieng/imbalanced_learning/review_overview.svg?v=20260926-evidence-review" target="_blank" rel="noopener noreferrer" aria-label="Open figure at full size in a new tab"><img loading="lazy" src="assets/aieng/imbalanced_learning/review_overview.svg?v=20260926-evidence-review" alt="How does class weighting change minority-class recovery? Wisconsin Diagnostic Breast Cancer observations; retain 212 malignant cases and sample 35 benign cases."></a><figcaption>Study question, data, design and interpretation limits</figcaption></figure>
<figure class="repo-visual"><a class="figure-link" href="assets/aieng/imbalanced_learning/review_calculations.svg?v=20260926-evidence-review" target="_blank" rel="noopener noreferrer" aria-label="Open figure at full size in a new tab"><img loading="lazy" src="assets/aieng/imbalanced_learning/review_calculations.svg?v=20260926-evidence-review" alt="Calculation: Precision = TP/(TP+FP); recall = TP/(TP+FN); F1 = 2PR/(P+R)."></a><figcaption>Calculation definition and source-linked evidence; open for full size</figcaption></figure>
</div>
<div>
<div class="repo-copy"><p>This controlled experiment uses real Wisconsin Diagnostic Breast Cancer observations to compare ordinary logistic regression, class-weighted logistic regression, and a weighted random forest. It deliberately makes benign cases the minority class, then reports average precision, recall, F1, and balanced accuracy on one stratified split. The recorded perfect forest score is retained alongside the small-sample limitation: it demonstrates the behavior of this setup, not clinical reliability.</p></div>
<div class="repo-links"><a href="https://github.com/devissaputra/imbalanced_learning/blob/main/CALCULATIONS.md" target="_blank" rel="noopener noreferrer">Calculations & evidence</a><a href="https://github.com/devissaputra/imbalanced_learning" target="_blank" rel="noopener noreferrer"><i class="fa-brands fa-github"></i> Repository</a>
<a href="https://github.com/devissaputra/imbalanced_learning/blob/main/README.md" target="_blank" rel="noopener noreferrer"><i class="fa-solid fa-file-lines"></i> README</a></div>
</div>
</div>
</article>
<article class="repo-project" id="pca_clustering">
<header class="repo-project-heading"><div class="repo-kicker">AI Engineering Repository · 06</div>
<h3>PCA and K-Means Clustering</h3></header>
<div class="repo-project-grid">
<div class="repo-visuals">
<figure class="repo-visual"><a class="figure-link" href="assets/aieng/pca_clustering/review_overview.svg?v=20260926-evidence-review" target="_blank" rel="noopener noreferrer" aria-label="Open figure at full size in a new tab"><img loading="lazy" src="assets/aieng/pca_clustering/review_overview.svg?v=20260926-evidence-review" alt="Can unlabeled chemical measurements reveal wine groups? 178 wine observations and 13 standardized chemical features."></a><figcaption>Study question, data, design and interpretation limits</figcaption></figure>
<figure class="repo-visual"><a class="figure-link" href="assets/aieng/pca_clustering/review_calculations.svg?v=20260926-evidence-review" target="_blank" rel="noopener noreferrer" aria-label="Open figure at full size in a new tab"><img loading="lazy" src="assets/aieng/pca_clustering/review_calculations.svg?v=20260926-evidence-review" alt="Calculation: Silhouette(i) = (b(i)-a(i))/max(a(i),b(i)); PCA variance share = eigenvalue / total."></a><figcaption>Calculation definition and source-linked evidence; open for full size</figcaption></figure>
</div>
<div>
<div class="repo-copy"><p>This unsupervised study separates clustering from visualization. K-means is selected using silhouette scores in all 13 standardized wine features, while a two-component PCA projection provides an interpretable view. The selected three-cluster solution has full-space silhouette 0.2849 and post-hoc adjusted Rand index 0.8975 against known labels; the much larger projected silhouette is explicitly not used as evidence that the full-space clusters are equally well separated.</p></div>
<div class="repo-links"><a href="https://github.com/devissaputra/pca_clustering/blob/main/CALCULATIONS.md" target="_blank" rel="noopener noreferrer">Calculations & evidence</a><a href="https://github.com/devissaputra/pca_clustering" target="_blank" rel="noopener noreferrer"><i class="fa-brands fa-github"></i> Repository</a>
<a href="https://github.com/devissaputra/pca_clustering/blob/main/README.md" target="_blank" rel="noopener noreferrer"><i class="fa-solid fa-file-lines"></i> README</a></div>
</div>
</div>
</article>
<article class="repo-project" id="mlp_neural_network">
<header class="repo-project-heading"><div class="repo-kicker">AI Engineering Repository · 07</div>
<h3>Multilayer Perceptron vs Linear Baseline on Handwritten Digits</h3></header>
<div class="repo-project-grid">
<div class="repo-visuals">
<figure class="repo-visual"><a class="figure-link" href="assets/aieng/mlp_neural_network/review_overview.svg?v=20260926-evidence-review" target="_blank" rel="noopener noreferrer" aria-label="Open figure at full size in a new tab"><img loading="lazy" src="assets/aieng/mlp_neural_network/review_overview.svg?v=20260926-evidence-review" alt="Does a nonlinear network beat a linear digit classifier? scikit-learn handwritten digits; 1,347 training and 450 test observations."></a><figcaption>Study question, data, design and interpretation limits</figcaption></figure>
<figure class="repo-visual"><a class="figure-link" href="assets/aieng/mlp_neural_network/review_calculations.svg?v=20260926-evidence-review" target="_blank" rel="noopener noreferrer" aria-label="Open figure at full size in a new tab"><img loading="lazy" src="assets/aieng/mlp_neural_network/review_calculations.svg?v=20260926-evidence-review" alt="Calculation: Accuracy = correct / n; macro-F1 = mean(F1 for each digit class)."></a><figcaption>Calculation definition and source-linked evidence; open for full size</figcaption></figure>
</div>
<div>
<div class="repo-copy"><p>This experiment compares a multilayer perceptron with multinomial logistic regression on the same standardized handwritten-digit split. The recorded linear baseline reaches 0.9778 accuracy, compared with 0.9578 for the MLP, with macro-F1 showing the same ordering. Keeping this negative result makes the engineering question clear: additional nonlinear capacity must justify its complexity under an explicit evaluation protocol.</p></div>
<div class="repo-links"><a href="https://github.com/devissaputra/mlp_neural_network/blob/main/CALCULATIONS.md" target="_blank" rel="noopener noreferrer">Calculations & evidence</a><a href="https://github.com/devissaputra/mlp_neural_network" target="_blank" rel="noopener noreferrer"><i class="fa-brands fa-github"></i> Repository</a>
<a href="https://github.com/devissaputra/mlp_neural_network/blob/main/README.md" target="_blank" rel="noopener noreferrer"><i class="fa-solid fa-file-lines"></i> README</a></div>
</div>
</div>
</article>
<article class="repo-project" id="cnn_image_classification">
<header class="repo-project-heading"><div class="repo-kicker">AI Engineering Repository · 08</div>
<h3>Convolutional Neural Network for Handwritten Digits</h3></header>
<div class="repo-project-grid">
<div class="repo-visuals">
<figure class="repo-visual"><a class="figure-link" href="assets/aieng/cnn_image_classification/review_overview.svg?v=20260926-evidence-review" target="_blank" rel="noopener noreferrer" aria-label="Open figure at full size in a new tab"><img loading="lazy" src="assets/aieng/cnn_image_classification/review_overview.svg?v=20260926-evidence-review" alt="Does preserving image structure help digit classification? Handwritten digits represented as small 2D images; a shared held-out split."></a><figcaption>Study question, data, design and interpretation limits</figcaption></figure>
<figure class="repo-visual"><a class="figure-link" href="assets/aieng/cnn_image_classification/review_calculations.svg?v=20260926-evidence-review" target="_blank" rel="noopener noreferrer" aria-label="Open figure at full size in a new tab"><img loading="lazy" src="assets/aieng/cnn_image_classification/review_calculations.svg?v=20260926-evidence-review" alt="Calculation: Accuracy difference = CNN accuracy - logistic accuracy."></a><figcaption>Calculation definition and source-linked evidence; open for full size</figcaption></figure>
</div>
<div>
<div class="repo-copy"><p>This PyTorch experiment compares a compact convolutional network with a flattened logistic-regression baseline on handwritten digits. The committed run reports 0.9733 accuracy for the CNN and 0.9622 for logistic regression after 14 epochs. The small gain illustrates a possible benefit from preserving spatial structure, while the single-split design and lack of an uncertainty estimate limit the strength of the architectural conclusion.</p></div>
<div class="repo-links"><a href="https://github.com/devissaputra/cnn_image_classification/blob/main/CALCULATIONS.md" target="_blank" rel="noopener noreferrer">Calculations & evidence</a><a href="https://github.com/devissaputra/cnn_image_classification" target="_blank" rel="noopener noreferrer"><i class="fa-brands fa-github"></i> Repository</a>
<a href="https://github.com/devissaputra/cnn_image_classification/blob/main/README.md" target="_blank" rel="noopener noreferrer"><i class="fa-solid fa-file-lines"></i> README</a></div>
</div>
</div>
</article>
<article class="repo-project" id="lstm_time_series">
<header class="repo-project-heading"><div class="repo-kicker">AI Engineering Repository · 09</div>
<h3>LSTM Forecasting for Mauna Loa CO₂</h3></header>
<div class="repo-project-grid">
<div class="repo-visuals">
<figure class="repo-visual"><a class="figure-link" href="assets/aieng/lstm_time_series/review_overview.svg?v=20260926-evidence-review" target="_blank" rel="noopener noreferrer" aria-label="Open figure at full size in a new tab"><img loading="lazy" src="assets/aieng/lstm_time_series/review_overview.svg?v=20260926-evidence-review" alt="Can a recurrent model improve weekly CO₂ forecasts? Mauna Loa weekly CO₂ from statsmodels; 24-week input windows."></a><figcaption>Study question, data, design and interpretation limits</figcaption></figure>
<figure class="repo-visual"><a class="figure-link" href="assets/aieng/lstm_time_series/review_calculations.svg?v=20260926-evidence-review" target="_blank" rel="noopener noreferrer" aria-label="Open figure at full size in a new tab"><img loading="lazy" src="assets/aieng/lstm_time_series/review_calculations.svg?v=20260926-evidence-review" alt="Calculation: RMSE = sqrt(mean((forecast-observed)^2)); MAE = mean(|forecast-observed|)."></a><figcaption>Calculation definition and source-linked evidence; open for full size</figcaption></figure>
</div>
<div>
<div class="repo-copy"><p>This experiment compares persistence, ridge autoregression, and a compact LSTM for next-week Mauna Loa CO₂ forecasting. Missing weeks now use past-only forward filling, and the corrected 20-epoch experiment has been rerun successfully in GitHub Actions. On the 452-week chronological holdout, ridge achieves RMSE 0.4639 ppm, persistence 0.5135 ppm, and the LSTM 1.0751 ppm. The recurrent model therefore does not justify its added complexity in this fixed-seed setup.</p></div>
<div class="repo-links"><a href="https://github.com/devissaputra/lstm_time_series/blob/main/CALCULATIONS.md" target="_blank" rel="noopener noreferrer">Calculations & evidence</a><a href="https://github.com/devissaputra/lstm_time_series" target="_blank" rel="noopener noreferrer"><i class="fa-brands fa-github"></i> Repository</a>
<a href="https://github.com/devissaputra/lstm_time_series/blob/main/README.md" target="_blank" rel="noopener noreferrer"><i class="fa-solid fa-file-lines"></i> README</a></div>
</div>
</div>
</article>
</section>
<section id="contact">
<div class="eyebrow-rule"><h2>Contact</h2></div>
<p>For research collaboration, doctoral discussions, or questions about these repositories, contact me through the links below.</p>
<div class="contact-row"><a href="mailto:devis.saputra@gmail.com">Email</a><a href="https://linkedin.com/in/devissaputra">LinkedIn</a><a href="https://github.com/devissaputra">GitHub</a></div>
</section>
<footer><a href="https://github.com/devissaputra/devissaputra.github.io/blob/main/REPOSITORY_REVIEW.md">Repository review: 39/39 completed</a><br>© Devis Saputra · AI Engineering portfolio · Built for GitHub Pages</footer>
</main>
</div>
</body>
</html>