Prafull Ahire

Erstelle dein Portfolio mit ProoVErstelle dein Portfolio mit ProoV
ProoV
EN Verifiziertes Arbeitsportfolio

ProoV Portfolio

Prafull Ahire

Electronics and Telecommunication Engineering · University of Mumbai

Zum ProoV-Leaderboard

Projekte

Zertifiziert

Selbstgesteuertes Projekt

Amazon Robotics - Black-Friday Fleet Coordination

Softwareentwicklung · Juli 2026

96/ 100

Built a full warehouse fleet-coordination solution for Black Friday surge conditions: framed the bottleneck as aisle congestion and dock contention, implemented A* for single-robot routing, then extended it to centralized cooperative A* with vertex and edge reservations to prevent collisions. Validated the policy in simulation with zero collisions and deadlocks, selected staggered charging plus dispersed idle parking, and packaged the result into an executive-ready pilot recommendation.

Bewertet nach

  • Problem framing & operational stakes20%
  • Algorithmic depth - A* and cooperative coordination30%
  • Coordination policy realism - deadlock, charging, idle25%
  • Throughput trade-off analysis15%
  • Executive pitch to leadership10%

Bestanden · Bestehensgrenze 55/100

Was herausstach6
  • Implemented A* with Manhattan heuristic and showed it outperforming Dijkstra in node expansions
  • Built a reservation table that blocks both vertex conflicts and head-on edge swaps
  • Chose a realistic fleet policy: priority-watchdog deadlock handling, staggered charging, and dispersed perimeter idle parking
  • Used simulator outputs to identify a concave throughput optimum at 35 robots and tied the capstone pitch to measurable operational metrics
  • Leakage-Free Feature Engineering
  • Honest Model Evaluation
Meine eingereichte Arbeit12 Aufgaben

Role And Mission

Meine Lösung
{"acknowledged":true,"zonesExplored":["pick","aisles","pack","charge"],"kpisShown":["speed","safety","throughput"]}

Amazon Robotics Context

Meine Lösung
{"viewedAt":"2026-07-17T15:04:01.047Z","timeline":["2003","2012","2015","2025"],"driveUnitStats":["110 kg","450 kg","5.5 km / h"],"disclaimerShown":true,"sourcesShown":true,"sources":["Amazon, Kiva Systems acquisition (2012)","About Amazon, one millionth robot (2025)","Published Kiva / Amazon drive-unit specifications","Statista, Amazon net sales by leading market (2024)","Amazon, Bad Hersfeld (FRA1) site","Wurman, D’Andrea & Mountz (2008), AI Magazine"]}

Program Overview

Meine Lösung
{"explored":["understand","plan-one","defend","coordinate-many","optimize"],"exploredCount":5,"activePhase":"optimize","totalPhases":5}

Grid World Theory

Meine Lösung
{"concept":"grid-world-model","connectivity":8,"gridSize":"20x20","viewedAt":"2026-07-17T15:06:09.157Z"}

State Representation Task

Meine Lösung
{"robots":[{"id":"R1","x":0,"y":0,"goal":{"x":9,"y":9},"battery":100},{"id":"R2","x":1,"y":0,"goal":{"x":8,"y":9},"battery":94},{"id":"R3","x":2,"y":0,"goal":{"x":7,"y":9},"battery":88},{"id":"R4","x":3,"y":0,"goal":{"x":6,"y":9},"battery":82},{"id":"R5","x":4,"y":0,"goal":{"x":5,"y":9},"battery":76}],"placedAt":"2026-07-17T15:13:48.644Z"}

Phase1 Recap

Meine Lösung
{"phase":1,"phaseTitle":"Grid-world modeling","takeaways":[{"id":"grid-of-typed-cells","title":"Warehouse = grid of typed cells"},{"id":"state-positions-goals-batteries","title":"State = positions + goals + batteries"},{"id":"collisions-vertex-and-edge","title":"Collisions = same cell OR same edge at the same tick"}],"skillAxisTicked":"Modeling"}

Astar Theory

Meine Lösung
{"heuristic":"manhattan","admissible":true,"viewed_comparison":true,"replays":0,"astar_expanded":32,"dijkstra_expanded":107}

State Representation Task Validator

Meine Lösung
{"code":"# Auto-validator: every robot needs a position AND a goal.\n# The planner refuses to schedule a robot whose state is incomplete.\nimport json\n\nstate = json.loads(r\"\"\"{\n  \"robots\": [\n    {\n      \"id\": \"R1\",\n      \"x\": 0,\n      \"y\": 0,\n      \"goal\": {\n        \"x\": 9,\n        \"y\": 9\n      },\n      \"battery\": 100\n    },\n    {\n      \"id\": \"R2\",\n      \"x\": 1,\n      \"y\": 0,\n      \"goal\": {\n        \"x\": 8,\n        \"y\": 9\n      },\n      \"battery\": 94\n    },\n    {\n      \"id\": \"R3\",\n      \"x\": 2,\n      \"y\": 0,\n      \"goal\": {\n        \"x\": 7,\n        \"y\": 9\n      },\n      \"battery\": 88\n    },\n    {\n      \"id\": \"R4\",\n      \"x\": 3,\n      \"y\": 0,\n      \"goal\": {\n        \"x\": 6,\n        \"y\": 9\n      },\n      \"battery\": 82\n    },\n    {\n      \"id\": \"R5\",\n      \"x\": 4,\n      \"y\": 0,\n      \"goal\": {\n        \"x\": 5,\n        \"y\": 9\n      },\n      \"battery\": 76\n    }\n  ]\n}\"\"\")\n\ndef validate(state):\n    bots = state.get('robots', [])\n    issues = []\n    for b in bots:\n        if b.get('x') is None or b.get('y') is None:\n            issues.append(f\"robot {b['id']} has no position\")\n        if not b.get('goal') or b['goal'].get('x') is None:\n            issues.append(f\"robot {b['id']} has no goal\")\n    return issues\n\nissues = validate(state)\nif issues:\n    print(\"INCOMPLETE STATE\")\n    for line in issues:\n        print(\" -\", line)\nelse:\n    print(f\"OK, {len(state['robots'])} robots, each with position + goal.\")\n    print('Planner can schedule this state.')\n","stdout":"OK, 5 robots, each with position + goal.\nPlanner can schedule this state.\n","stderr":"","error":null,"imageCount":0,"durationMs":12,"ranAt":"2026-07-17T15:26:43.324Z"}

Astar Implementation Cell

Meine Lösung
{"code":"# A* path planning for one warehouse drive-unit.\n# Complete the three TODOs and click \"Run cell\" to replay your A* on the\n# 15x15 fixture grid on the right.\n#\n# The grid is a list of rows: 0 = free aisle, 1 = rack obstacle.\n# Robots move 4-connected (up/down/left/right), no diagonals.\n\nimport heapq, json, time\n\nGRID  = __ASTAR_GRID__         # injected by the harness\nSTART = tuple(__ASTAR_START__) # (row, col)\nGOAL  = tuple(__ASTAR_GOAL__)  # (row, col)\nH, W  = len(GRID), len(GRID[0])\n\n\ndef h(cell, goal):\n    # Manhattan distance, admissible AND tight on a 4-connected grid.\n    (r1, c1), (r2, c2) = cell, goal\n    return abs(r1 - r2) + abs(c1 - c2)\n\n\ndef neighbours(cell):\n    r, c = cell\n    # 4-connected moves: up, down, left, right.\n    for dr, dc in [(-1, 0), (1, 0), (0, -1), (0, 1)]:\n        nr, nc = r + dr, c + dc\n        if 0 <= nr < H and 0 <= nc < W and GRID[nr][nc] == 0:\n            yield (nr, nc)\n\n\ndef reconstruct_path(came_from, current):\n    path = [current]\n    while current in came_from:\n        current = came_from[current]\n        path.append(current)\n    return list(reversed(path))\n\n\ndef a_star(start, goal):\n    # open_set holds (f_score, tiebreak, cell) tuples; heapq pops the smallest.\n    counter = 0\n    open_set = [(0, counter, start)]\n    came_from = {}\n    g_score = {start: 0}\n    closed = set()\n    visited_order = []\n    expansions = 0\n\n    while open_set:\n        _, _, current = heapq.heappop(open_set)\n\n        if current in closed:\n            continue\n\n        closed.add(current)\n        visited_order.append(current)\n        expansions += 1\n\n        if current == goal:\n            return reconstruct_path(came_from, current), visited_order, expansions\n\n        for nb in neighbours(current):\n            if nb in closed:\n                continue\n\n            tentative_g = g_score[current] + 1\n\n            if tentative_g < g_score.get(nb, float(\"inf\")):\n                came_from[nb] = current\n                g_score[nb] = tentative_g\n\n                # TODO 1: f-score = g + h\n                f = tentative_g + h(nb, goal)\n\n                # TODO 2: Tie-breaking\n                # Prefer nodes with smaller heuristic value.\n                counter += 1\n                tiebreak = (h(nb, goal), counter)\n\n                heapq.heappush(open_set, (f, tiebreak, nb))\n\n    return None, visited_order, expansions\n\n\nt0 = time.perf_counter()\npath, visited, expansions = a_star(START, GOAL)\nruntime_ms = (time.perf_counter() - t0) * 1000.0\n\n# TODO 3\n# neighbours() already filters out obstacles (GRID[r][c] == 1),\n# so no further changes are needed here.\n_ = list(neighbours(START))\n\n# Emit a single line of JSON the right-side visualiser parses to animate.\nprint(\"__ASTAR_RESULT__\" + json.dumps({\n    \"path\": path,\n    \"visited\": visited,\n    \"nodes_expanded\": expansions,\n    \"path_length\": 0 if path is None else len(path),\n    \"runtime_ms\": round(runtime_ms, 2),\n}))\n","passed":true,"reason":"Path is optimal and obstacle-free.","path_length":29,"nodes_expanded":31,"runtime_ms":7.7,"optimal_length":29,"attempt_count":1,"used_canonical":false,"ranAt":"2026-07-17T15:27:03.147Z"}

Astar Solution Correct

Meine Lösung
true

Single Unit Challenge

Meine Lösung
{"passed":true,"usedFallback":false,"usedHint":false,"runs":[{"maze":"Maze 1 · Open aisles","passed":true,"path_length":49,"optimal_length":49,"nodes_expanded":64,"runtime_ms":19.2},{"maze":"Maze 2 · Narrow corridors","passed":true,"path_length":49,"optimal_length":49,"nodes_expanded":61,"runtime_ms":17.1},{"maze":"Maze 3 · Dense racks","passed":true,"path_length":49,"optimal_length":49,"nodes_expanded":75,"runtime_ms":18.87}],"ranAt":"2026-07-17T15:28:18.485Z"}

Phase2 Recap

Meine Lösung
{"phase":2,"phaseTitle":"Single-agent A* search","takeaways":[{"id":"astar-equals-dijkstra-plus-admissible-heuristic","title":"A* = Dijkstra + admissible heuristic"},{"id":"manhattan-on-four-connected-grid","title":"Manhattan distance on 4-connected grids"},{"id":"optimal-and-faster-than-dijkstra","title":"Optimal AND faster than Dijkstra"}],"skillAxisTicked":"A* search"}
Verifiziertes ZertifikatFälschungssicher · ausgestellt von ProoV
Zertifiziert

Selbstgesteuertes Projekt

Machine Learning for Automotive Safety

Perception Validation Engineer (ADAS Safety Sign-off) · KI / ML · Juni 2026

84/ 100

A verified, self-directed Perception Validation Engineer (ADAS Safety Sign-off) project — completed and passed a real industry rubric at 84/100 on ProoV.

Bewertet nach

  • Detection metrics correctness (precision, recall, VRU false-negative rate)30%
  • Failure-mode analysis & per-condition rigour25%
  • SOTIF safety case quality (ISO 21448 reasoning)25%
  • Ship verdict — evidence-based & internally consistent20%

Bestanden · Bestehensgrenze 60/100

Was herausstach6
  • Correctly locked the detection definition at IoU >= 0.5 and computed the worked example IoU as 0.111, classifying it as a miss.
  • Computed and interpreted the key safety metric correctly: VRU recall 0.76 and VRU false-negative rate 0.236, rather than relying on headline accuracy.
  • Produced a strong condition-sliced analysis showing night recall collapse (0.39) and worst-case night+occluded recall (0.27).
  • Wrote an internally consistent GO-WITH-CONDITIONS verdict that cites the dossier's own numbers and ties the real Uber Tempe crash to the night-time pedestrian miss.
  • Data-Driven Decision Making
  • Statistical Analysis
Meine eingereichte Arbeit12 Aufgaben

Sensor Match

Meine Lösung
{"prompt":"Match each driving condition to its primary-strength sensor and the weak-link sensor that fails there","map":[{"condition":"Pitch-dark rural road","primaryStrength":"Lidar","weakLink":"Camera","correct":true},{"condition":"Dense fog on the motorway","primaryStrength":"Radar","weakLink":"Camera","correct":true},{"condition":"Child behind a parked van","primaryStrength":"Lidar","weakLink":"Occlusion","correct":true},{"condition":"Clear sunny highway","primaryStrength":"Camera","weakLink":"Radar","correct":true}],"passed":true,"attempt":1}

Task Definition

Meine Lösung
{"prompt":"Confirm the IoU threshold at 0.5, compute IoU for the borderline pair, and classify it as hit / miss / phantom; define a false negative as an unmatched real object","iouThreshold":0.5,"pairIoU":0.111,"classification":"miss","falseNegativeDefinition":"a real (ground-truth) object with no predicted box matched at IoU >= 0.5","cellRun":false,"passed":true,"attempt":2}

Example Iou Demo

Meine Lösung
{"checkpointId":"example_iou_demo","code":"# WORKED EXAMPLE: Intersection-over-Union for one clean box pair.\n# Boxes are [x1, y1, x2, y2] in pixels. (Next slide: you do this on a tougher pair.)\n\ngt   = [60, 50, 200, 150]   # ground-truth box: where the object really is\npred = [68, 56, 206, 156]   # the detector's predicted box (a near-perfect fit)\n\ndef iou(a, b):\n    # 1) the SHARED rectangle (intersection): the overlap of the two boxes\n    ix1, iy1 = max(a[0], b[0]), max(a[1], b[1])\n    ix2, iy2 = min(a[2], b[2]), min(a[3], b[3])\n    inter = max(0, ix2 - ix1) * max(0, iy2 - iy1)\n\n    # 2) the COMBINED area (union): both boxes together, counted once\n    area_a = (a[2] - a[0]) * (a[3] - a[1])\n    area_b = (b[2] - b[0]) * (b[3] - b[1])\n    union = area_a + area_b - inter\n\n    return inter / union, inter, union\n\nscore, inter, union = iou(gt, pred)\nTHRESHOLD = 0.5\nverdict = \"HIT  (counts as a detection)\" if score >= THRESHOLD else \"MISS (no match)\"\n\nprint(f\"shared area    = {inter:6.0f} px\")\nprint(f\"combined area  = {union:6.0f} px\")\nprint(f\"IoU            = {score:6.3f}   (shared / combined)\")\nprint(f\"threshold      = {THRESHOLD}\")\nprint(f\"VERDICT        = {verdict}\")","stdout":"shared area    =  12408 px\ncombined area  =  15392 px\nIoU            =  0.806   (shared / combined)\nthreshold      = 0.5\nVERDICT        = HIT  (counts as a detection)\n","stderr":"","error":null,"imageCount":0,"durationMs":8,"ranAt":"2026-06-16T17:57:36.546Z"}

Task Definition Code

Meine Lösung
{"checkpointId":"ttcs_iou_classify_run","code":"# Run IoU on this pair, read the number, then classify it (Section 1).\n# Boxes are [x1, y1, x2, y2] in pixels. The object is REAL, there is a ground-truth box.\n\ngt   = [60, 50, 200, 150]   # ground truth: a real object is here\npred = [150, 96, 280, 196]   # the detector's box for this frame\n\ndef iou(a, b):\n    ix1, iy1 = max(a[0], b[0]), max(a[1], b[1])\n    ix2, iy2 = min(a[2], b[2]), min(a[3], b[3])\n    inter = max(0, ix2 - ix1) * max(0, iy2 - iy1)\n    union = (a[2]-a[0])*(a[3]-a[1]) + (b[2]-b[0])*(b[3]-b[1]) - inter\n    return inter / union\n\nscore = iou(gt, pred)\nprint(f\"IoU = {score:.3f}\")\nprint(f\"threshold = 0.5  ->  {'matches' if score >= 0.5 else 'does NOT match'} a ground-truth box\")\nprint(\"So: a real object, no matching box. Your call on the next panel.\")","stdout":"IoU = 0.111\nthreshold = 0.5  ->  does NOT match a ground-truth box\nSo: a real object, no matching box. Your call on the next panel.\n","stderr":"","error":null,"imageCount":0,"durationMs":6,"ranAt":"2026-06-16T17:57:36.554Z"}

Example Metrics Demo

Meine Lösung
{"checkpointId":"example_metrics_demo","code":"# WORKED EXAMPLE: score a tiny 8-row detections-vs-ground-truth split.\n# (Next slide: you do this on the detector's full table.)\nimport pandas as pd\n\n# Each row = one scored object. outcome is:\n#   \"TP\" a real object the detector caught,\n#   \"FN\" a real object it MISSED (a false negative),\n#   \"FP\" a phantom box over empty road (a false positive).\ndemo = pd.DataFrame([\n    (\"Pedestrian\", \"TP\"),   # 3 real pedestrians, 2 caught, 1 missed\n    (\"Pedestrian\", \"TP\"),\n    (\"Pedestrian\", \"FN\"),\n    (\"Cyclist\",    \"TP\"),   # 2 real cyclists, 1 caught, 1 missed\n    (\"Cyclist\",    \"FN\"),\n    (\"Car\",        \"TP\"),   # 2 real cars, both caught\n    (\"Car\",        \"TP\"),\n    (\"Car\",        \"FP\"),   # 1 phantom car (braked for nothing)\n], columns=[\"obj_class\", \"outcome\"])\n\n# 1) Confusion counts over the whole split.\nTP = (demo.outcome == \"TP\").sum()\nFP = (demo.outcome == \"FP\").sum()\nFN = (demo.outcome == \"FN\").sum()\nprint(f\"TP = {TP}   FP = {FP}   FN = {FN}\")\n\n# 2) Precision = of everything flagged, how much was real.\nprecision = TP / (TP + FP)\n# 3) Recall = of everything really there, how much we caught.\nrecall = TP / (TP + FN)\nprint(f\"precision = TP/(TP+FP) = {TP}/{TP+FP} = {precision:.2f}\")\nprint(f\"recall    = TP/(TP+FN) = {TP}/{TP+FN} = {recall:.2f}\")\n\n# 4) The safety number: recall on vulnerable road users (pedestrians + cyclists),\n#    then the false-negative RATE = the share of real VRUs we MISSED.\nvru = demo[demo.obj_class.isin([\"Pedestrian\", \"Cyclist\"])]\nvru_TP = (vru.outcome == \"TP\").sum()\nvru_FN = (vru.outcome == \"FN\").sum()\nvru_recall  = vru_TP / (vru_TP + vru_FN)\nvru_fn_rate = 1 - vru_recall\nprint(f\"VRU recall  = {vru_TP}/{vru_TP+vru_FN} = {vru_recall:.2f}\")\nprint(f\"VRU FN-rate = 1 - VRU recall = {vru_fn_rate:.2f}   <- the safety number\")","stdout":"TP = 5   FP = 1   FN = 2\nprecision = TP/(TP+FP) = 5/6 = 0.83\nrecall    = TP/(TP+FN) = 5/7 = 0.71\nVRU recall  = 3/5 = 0.60\nVRU FN-rate = 1 - VRU recall = 0.40   <- the safety number\n","stderr":"","error":null,"imageCount":0,"durationMs":34,"ranAt":"2026-06-16T17:58:31.642Z"}

Scored Metrics Run

Meine Lösung
{"checkpointId":"ttcs_scored_metrics","code":"# Section 2: score the Aurora-7 detector on its detections table.\n# SYNTHETIC, illustrative detections-vs-ground-truth (no raw imagery, no model runs here;\n# proportions grounded in the published KITTI/nuScenes benchmarks).\n# Each row = one scored object, tagged with class + condition, with an outcome:\n#   \"TP\" caught,  \"FN\" a real object MISSED (false negative),  \"FP\" a phantom box.\nimport pandas as pd\n\n# Read the SAME scored detections table Act 3 slices by condition, so Section 2 and\n# Section 3 can never disagree. (Normalise two column names so the scoring below reads\n# cleanly: class -> obj_class, flag -> outcome.)\ndf = pd.read_csv(\"aurora7_detections_kitti.csv\").rename(\n    columns={\"class\": \"obj_class\", \"flag\": \"outcome\"})\nprint(f\"scored objects in table: {len(df)}\")\n\ndef score(d, label):\n    TP = (d.outcome == \"TP\").sum()\n    FP = (d.outcome == \"FP\").sum()\n    FN = (d.outcome == \"FN\").sum()\n    precision = TP / (TP + FP)\n    recall    = TP / (TP + FN)\n    print(f\"{label:18s} TP={TP:4d} FP={FP:3d} FN={FN:3d}  \"\n          f\"precision={precision:.2f}  recall={recall:.2f}\")\n    return recall\n\n# 1) The whole table, the headline (aggregate) numbers.\nagg_recall = score(df, \"ALL (aggregate)\")\n\n# 2) Vulnerable road users only = pedestrians + cyclists. THIS is the safety subset.\nvru = df[df.obj_class.isin([\"Pedestrian\", \"Cyclist\"])]\nvru_recall = score(vru, \"VRU (Ped+Cyc)\")\n\n# 3) The safety number: VRU false-negative RATE = share of real VRUs MISSED.\nvru_fn_rate = 1 - vru_recall\nprint(\"-\" * 60)\nprint(f\"AGGREGATE recall (all classes) : {agg_recall:.2f}   <- looks reassuring\")\nprint(f\"VRU false-negative rate        : {vru_fn_rate:.2f}   <- the safety number\")","stdout":"scored objects in table: 991\nALL (aggregate)    TP= 822 FP= 41 FN=128  precision=0.95  recall=0.87\nVRU (Ped+Cyc)      TP= 392 FP= 35 FN=122  precision=0.92  recall=0.76\n------------------------------------------------------------\nAGGREGATE recall (all classes) : 0.87   <- looks reassuring\nVRU false-negative rate        : 0.24   <- the safety number\n","stderr":"","error":null,"imageCount":0,"durationMs":103,"ranAt":"2026-06-16T17:59:06.509Z"}

Scored Metrics

Meine Lösung
{"prompt":"Score the detector: read off precision, aggregate recall, and the VRU false-negative rate (the safety number)","aggregatePrecision":0.95,"aggregateRecall":0.87,"vruRecall":0.76,"vruFalseNegativeRate":0.236,"safetyNumber":"VRU false-negative rate","readOffBand":"20–30%","readOffCorrect":true,"scoringCellRan":true,"passed":true,"attempt":1}

Ttcs Example Slice

Meine Lösung
{"checkpointId":"ttcs_example_slice","code":"# Worked example: slice VRU recall by ONE condition (day vs night).\n# Same move you'll run for every condition next, just for one cut here.\nimport pandas as pd\n\ndf = pd.read_csv(\"aurora7_detections_kitti.csv\")\n\n# Vulnerable road users = pedestrians + cyclists. Keep REAL objects only\n# (a TP was caught, an FN was a real person missed; phantoms are false positives).\nvru = df[df[\"class\"].isin([\"Pedestrian\", \"Cyclist\"])]\nreal = vru[vru[\"flag\"].isin([\"TP\", \"FN\"])]\n\ndef recall(rows):\n    tp = (rows[\"flag\"] == \"TP\").sum()\n    fn = (rows[\"flag\"] == \"FN\").sum()\n    return tp / (tp + fn)            # share of real VRUs the detector actually caught\n\nfor light in [\"day\", \"night\"]:\n    slice_ = real[real[\"lighting\"] == light]\n    r = recall(slice_)\n    print(f\"{light:>5}:  recall = {r:.2f}   ->  {(1-r)*100:4.0f}% of real VRUs missed\")\n\nprint()\nprint(f\"Both together:  recall = {recall(real):.2f}   (the reassuring average)\")","stdout":"  day:  recall = 0.85   ->    15% of real VRUs missed\nnight:  recall = 0.39   ->    61% of real VRUs missed\n\nBoth together:  recall = 0.76   (the reassuring average)\n","stderr":"","error":null,"imageCount":0,"durationMs":122,"ranAt":"2026-06-16T18:00:05.605Z"}

Ttcs Triage Slice

Meine Lösung
{"checkpointId":"ttcs_triage_slice","code":"# Section 3: slice VRU recall over EVERY condition in the table.\nimport pandas as pd\n\ndf = pd.read_csv(\"aurora7_detections_kitti.csv\")\nreal = df[(df[\"class\"].isin([\"Pedestrian\", \"Cyclist\"])) & (df[\"flag\"].isin([\"TP\", \"FN\"]))]\n\ndef recall(rows):\n    tp = (rows[\"flag\"] == \"TP\").sum(); fn = (rows[\"flag\"] == \"FN\").sum()\n    return tp / (tp + fn) if (tp + fn) else float(\"nan\")\n\nprint(f\"All conditions (the average):  {recall(real):.2f}\\n\")\nprint(\"By condition  ->  recall   (% of real VRUs missed)\")\nfor col, vals in [(\"lighting\", [\"day\", \"night\"]),\n                  (\"visibility\", [\"clear\", \"occluded\"]),\n                  (\"rarity\", [\"common\", \"rare\"])]:\n    for v in vals:\n        s = real[real[col] == v]\n        r = recall(s)\n        print(f\"  {v:<10} {r:.2f}     {(1-r)*100:4.0f}% missed\")\n\nworst = real[(real[\"lighting\"] == \"night\") & (real[\"visibility\"] == \"occluded\")]\nprint(f\"\\nWorst slice (night + occluded): {recall(worst):.2f}   \"\n      f\"{(1-recall(worst))*100:.0f}% of those people missed\")","stdout":"All conditions (the average):  0.76\n\nBy condition  ->  recall   (% of real VRUs missed)\n  day        0.85       15% missed\n  night      0.39       61% missed\n  clear      0.83       17% missed\n  occluded   0.45       55% missed\n  common     0.79       21% missed\n  rare       0.66       34% missed\n\nWorst slice (night + occluded): 0.27   73% of those people missed\n","stderr":"","error":null,"imageCount":0,"durationMs":256,"ranAt":"2026-06-16T18:07:08.521Z"}

Failure Triage

Meine Lösung
{"prompt":"Slice VRU recall per condition, then triage the failure modes by (condition likelihood x miss impact); do not bury a rare-but-catastrophic VRU miss in green","aggregateVruRecall":0.76,"perConditionRecall":[{"condition":"Daylight","recall":0.85},{"condition":"Clear","recall":0.83},{"condition":"Common class","recall":0.79},{"condition":"Rare class (cyclist)","recall":0.66},{"condition":"Occluded","recall":0.45},{"condition":"Night","recall":0.39},{"condition":"Night + occluded","recall":0.27}],"worstCondition":"Night + occluded","worstConditionRecall":0.27,"triage":[{"failureMode":"Night-time pedestrian miss","recallSlice":"night 0.39","likelihood":"Common","impact":"Catastrophic","severityBand":"red"},{"failureMode":"Occluded child at night","recallSlice":"night+occluded 0.27","likelihood":"Occasional","impact":"Catastrophic","severityBand":"red"},{"failureMode":"Rare-class cyclist miss","recallSlice":"rare 0.66","likelihood":"Rare","impact":"Catastrophic","severityBand":"red"},{"failureMode":"Occluded pedestrian (daytime)","recallSlice":"occluded 0.45","likelihood":"Common","impact":"Catastrophic","severityBand":"red"},{"failureMode":"Night glare phantom brake","recallSlice":"precision dip","likelihood":"Occasional","impact":"Serious","severityBand":"amber"},{"failureMode":"Clear-daylight car miss","recallSlice":"day 0.99","likelihood":"Common","impact":"Serious","severityBand":"red"},{"failureMode":"Dusk / low-sun pedestrian","recallSlice":"transition","likelihood":"Common","impact":"Catastrophic","severityBand":"red"}],"topBandFailureModes":["Night-time pedestrian miss","Occluded child at night","Rare-class cyclist miss","Occluded pedestrian (daytime)","Night glare phantom brake","Clear-daylight car miss","Dusk / low-sun pedestrian"],"passed":false,"attempt":2}

Sotif Case

Meine Lösung
{"prompt":"For each top failure mode write one ISO 21448 SOTIF chain (triggering condition -> functional insufficiency -> hazardous behaviour -> concrete mitigation); a vague mitigation or a SOTIF gap framed as a fault fails","rows":[{"failureMode":"Occluded child at night","triggeringCondition":"A small Vulnerable Road User (VRU) stepping out from behind a solid, opaque object (like a parked van) in a low-light environment.","functionalInsufficiency":"Sensors cannot violate physics; neither Camera, Lidar, nor Radar can see through solid metal. In the dark, the camera lacks the pixel contrast for rapid classification. By the time the child breaks occlusion and enters the sensor's line of sight, the physical distance is too short for the perception pipeline to classify the object and trigger the brakes.","hazardousBehaviour":"The vehicle maintains speed and strikes the child without braking, or with severely delayed braking.","mitigation":"Implement a strict daylight cap on automated driving in environments with heavy roadside occlusion. If operating at night, trigger a driver-attention rule requiring the human to take manual control, or rely on a strict sensor-fusion fallback where the vehicle caps its speed to match the Lidar's maximum line-of-sight depth.","mitigationIsConcrete":true,"framedAsFault":false},{"failureMode":"Rare-class cyclist miss","triggeringCondition":"The presence of a cyclist on a physically irregular and geometrically complex road user operating in the vehicle's path.","functionalInsufficiency":"Class imbalance in the machine learning architecture. Because the neural network's training dataset was heavily dominated by standard cars and walking pedestrians, the model lacks the statistical confidence to consistently classify the less common silhouette of a human riding a bicycle, causing it to drop the bounding box.","hazardousBehaviour":"The perception system fails to flag the cyclist as a valid obstacle, the control system receives a \"clear road\" signal, and the vehicle strikes the cyclist at speed.","mitigation":"Halt the software release and mandate targeted data augmentation. The perception model must be quarantined and retrained using oversampled and synthetic cyclist data until the isolated \"cyclist class\" recall metric clears a hard safety threshold (e.g., matching the >0.85 daytime pedestrian recall) before the feature is allowed to ship to the fleet.","mitigationIsConcrete":true,"framedAsFault":false}],"mitigations":["Implement a strict daylight cap on automated driving in environments with heavy roadside occlusion. If operating at night, trigger a driver-attention rule requiring the human to take manual control, or rely on a strict sensor-fusion fallback where the vehicle caps its speed to match the Lidar's maximum line-of-sight depth.","Halt the software release and mandate targeted data augmentation. The perception model must be quarantined and retrained using oversampled and synthetic cyclist data until the isolated \"cyclist class\" recall metric clears a hard safety threshold (e.g., matching the >0.85 daytime pedestrian recall) before the feature is allowed to ship to the fleet."],"passed":true,"attempt":1}

Ship Verdict

Meine Lösung
{"prompt":"Write the GO / GO-WITH-CONDITIONS / NO-GO ship verdict, each of five fields citing its own dossier section number, internally consistent (no unconditional GO over an unmitigated night miss; no NO-GO if a daylight-restricted release is viable)","verdict":"CONDITIONS","fields":{"definition":"A valid detection requires a bounding box match of IoU ≥ 0.5. Any VRU without a matching box at this threshold is considered a false negative.","metrics":"Overall system performance shows a VRU recall of 0.76, which mathematically translates to a catastrophic FN-rate 24% across all combined conditions.","worst":"The system suffers a critical SOTIF failure during the worst slice: Night + occluded, where recall collapses to 0.27, missing over 70% of vulnerable targets.","mitigation":"Implement a strict daylight cap on automated braking, utilising a driver-attention rule or sensor-fusion fallback when operating outside of safe lighting parameters.","ask":"I recommend the board approve a feature release with a strict daylight-only cap. The system is safe for daytime deployment but must remain restricted until the nighttime perception collapse is resolved."},"citedSections":["Detection Definition","Metrics","Worst Failure Mode","Mitigation","The Ask"],"internallyConsistent":true,"passed":true,"attempt":1}
Verifiziertes ZertifikatFälschungssicher · ausgestellt von ProoV
Zertifiziert

Selbstgesteuertes Projekt

Machine Learning for Automotive

KI / ML · Juni 2026

84/ 100

A verified, self-directed industry project — completed and passed a real industry rubric at 84/100 on ProoV.

Bewertet nach

  • Exploratory Data Analysis20%
  • Feature Engineering25%
  • Model Building & Evaluation35%
  • Business Communication20%

Bestanden · Bestehensgrenze 60/100

Was herausstach6
  • Combined VW and Audi data correctly with a brand indicator and explored cross-brand pricing differences.
  • Identified key pricing drivers such as age, mileage per year, and brand premium in the business summary.
  • Produced a clear executive-style recommendation tied to operational workflow and financial impact.
  • Exploratory Data Analysis
  • Feature Engineering
  • Model Evaluation
Meine eingereichte Arbeit5 Aufgaben

VW Sprint1 Complete

Meine Lösung
{"completed":true,"notebookName":"vw_sprint1_eda.ipynb"}

VW Sprint2 Complete

Meine Lösung
{"completed":true,"notebookName":"vw_sprint2_features.ipynb"}

VW Sprint3 Complete

Meine Lösung
{"completed":true,"notebookName":"vw_sprint3_models.ipynb"}

VW Business Insights

Meine Lösung
{"text":"To: VP of Used Car Sales\n\nFrom: Prafull Ahire, Data Science\n\nSubject: ML Pricing Model Results & Action Plan\n\nOur new Random Forest model predicts used vehicle prices with 91% accuracy (R^2=0.91), completely outperforming our old baselines. Most importantly, it reduces our average estimation error down to just £1,500 per vehicle (MAE).\n\nThe algorithm identified three primary drivers of resale value:\n1. Vehicle Age: The steepness of early depreciation dictates the core baseline price.\n2. Mileage Velocity: Our engineered \"mileage per year\" metric heavily penalizes newer cars driven aggressively.\n3. Brand/Engine Premium: The model successfully isolates and accurately prices the luxury markup of Audi models over VW.\n\nFinancial Impact: We sell roughly 100,000 used cars annually. An average manual mispricing error of £1,500 translates to a £150 million portfolio mispricing risk. Transitioning to automated pricing tightens margins and protects us from this massive human-error exposure.\n\nRecommendation: Integrate this model into the CPO intake workflow immediately. Let the algorithm instantly auto-price our standard inventory. This frees our human appraisers to focus entirely on complex, high-risk valuations like modified trims or damaged vehicles scaling our operations without adding headcount.","charCount":1308,"selfChecks":[{"label":"Model comparison","checked":false},{"label":"Top features identified","checked":false},{"label":"Financial Impact","checked":false},{"label":"Clear recommendation","checked":false}]}

Jupyterlite Code

Meine Lösung
base64:CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgTm90ZWJvb2s6IHZ3X3NwcmludDFfZWRhLmlweW5iCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojIDxkaXYgc3R5bGU9ImJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICMxQTNDNkUgMCUsICMwQjEzMkIgMTAwJSk7IGJvcmRlci1yYWRpdXM6IDE2cHg7IHBhZGRpbmc6IDM2cHggMzJweDsgbWFyZ2luLWJvdHRvbTogOHB4OyI+CiMgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsgZ2FwOjE2cHg7IG1hcmdpbi1ib3R0b206MjBweDsiPgojICAgICA8ZGl2PgojICAgICAgIDxkaXYgc3R5bGU9ImNvbG9yOiM2MGE1ZmE7IGZvbnQtc2l6ZToxMXB4OyBmb250LXdlaWdodDo3MDA7IGxldHRlci1zcGFjaW5nOjNweDsgdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOyBtYXJnaW4tYm90dG9tOjRweDsiPlByb29WIFdvcmsgRXhwZXJpZW5jZTwvZGl2PgojICAgICAgIDxkaXYgc3R5bGU9ImNvbG9yOiNmZmY7IGZvbnQtc2l6ZToyMnB4OyBmb250LXdlaWdodDo4MDA7IGxpbmUtaGVpZ2h0OjEuMjsiPlVzZWQgQ2FyIFByaWNlIFByZWRpY3Rpb248L2Rpdj4KIyAgICAgPC9kaXY+CiMgICA8L2Rpdj4KIyAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDsgZ2FwOjEwcHg7IGZsZXgtd3JhcDp3cmFwOyBtYXJnaW4tYm90dG9tOjIwcHg7Ij4KIyAgICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwwLjEyKTsgY29sb3I6I2ZmZjsgYm9yZGVyLXJhZGl1czoyMHB4OyBwYWRkaW5nOjVweCAxNHB4OyBmb250LXNpemU6MTJweDsgZm9udC13ZWlnaHQ6NjAwOyI+RGF0YSBTY2llbnRpc3QgLSBWVyBDYXNlIFN0dWR5PC9zcGFuPgojICAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LDAuMTIpOyBjb2xvcjojZmZmOyBib3JkZXItcmFkaXVzOjIwcHg7IHBhZGRpbmc6NXB4IDE0cHg7IGZvbnQtc2l6ZToxMnB4OyBmb250LXdlaWdodDo2MDA7Ij5QeXRob24gLyBzY2lraXQtbGVhcm4gLyBwYW5kYXM8L3NwYW4+CiMgICAgIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsMC4xMik7IGNvbG9yOiNmZmY7IGJvcmRlci1yYWRpdXM6MjBweDsgcGFkZGluZzo1cHggMTRweDsgZm9udC1zaXplOjEycHg7IGZvbnQtd2VpZ2h0OjYwMDsiPkVzdC4gNC02IGhvdXJzPC9zcGFuPgojICAgPC9kaXY+CiMgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsMC4wOCk7IGJvcmRlcjoxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjE1KTsgYm9yZGVyLXJhZGl1czoxMHB4OyBwYWRkaW5nOjEycHggMTZweDsiPgojICAgICA8cCBzdHlsZT0iY29sb3I6Izk0YTNiODsgZm9udC1zaXplOjExcHg7IG1hcmdpbjowOyBsaW5lLWhlaWdodDoxLjY7Ij4KIyAgICAgICA8c3Ryb25nIHN0eWxlPSJjb2xvcjojY2JkNWUxOyI+TGVnYWwgbm90aWNlOjwvc3Ryb25nPiBUaGlzIGlzIGFuIGluZGVwZW5kZW50IGVkdWNhdGlvbmFsIGNhc2Ugc3R1ZHkgY3JlYXRlZCBieSBQcm9vVi4gVm9sa3N3YWdlbiwgQXVkaSwgVlcsIEdvbGYsIGFuZCBBNCBhcmUgdHJhZGVtYXJrcyBvZiBWb2xrc3dhZ2VuIEFHLiBUaGlzIG5vdGVib29rIGlzIG5vdCBlbmRvcnNlZCBieSwgYWZmaWxpYXRlZCB3aXRoLCBvciBzcG9uc29yZWQgYnkgVm9sa3N3YWdlbiBBRyBvciBhbnkgb2YgaXRzIHN1YnNpZGlhcmllcy4gRGF0YXNldCBzb3VyY2VkIGZyb20gdGhlIDxlbT4xMDAsMDAwIFVLIFVzZWQgQ2FyPC9lbT4gZGF0YXNldCBieSBhZGl0eWFkZXNhaTEzIG9uIEthZ2dsZSwgdXNlZCB1bmRlciBub21pbmF0aXZlIGZhaXIgdXNlIGZvciBlZHVjYXRpb25hbCBwdXJwb3NlcyBvbmx5LgojICAgICA8L3A+CiMgICA8L2Rpdj4KIyA8L2Rpdj4KCiMgIyMgWW91ciBNaXNzaW9uCiMgCiMgSW4gdGhpcyBzaW11bGF0ZWQgY2FzZSBzdHVkeSBieSBQcm9vViwgeW91IHdpbGwgc3RlcCBpbnRvIHRoZSByb2xlIG9mIGEgRGF0YSBTY2llbnRpc3QgYW5hbHl6aW5nIHRoZSB1c2VkIGNhciBtYXJrZXQgZm9yIFZvbGtzd2FnZW4gYW5kIEF1ZGkgdmVoaWNsZXMuIENlcnRpZmllZCBQcmUtT3duZWQgKENQTykgcHJvZ3JhbXMgcHJpY2UgdGhvdXNhbmRzIG9mIHVzZWQgdmVoaWNsZXMgZXZlcnkgbW9udGggLSBhbmQgb2Z0ZW4gZG8gaXQgbWFudWFsbHkuIFlvdXIgam9iOiAqKmJ1aWxkIGEgbWFjaGluZSBsZWFybmluZyBtb2RlbCB0aGF0IHByZWRpY3RzIHJlc2FsZSBwcmljZXMgYXV0b21hdGljYWxseSoqLgojIAojIFlvdSdsbCB3b3JrIHdpdGggcmVhbCBVSyBtYXJrZXQgZGF0YToKIyAtICoqfjE1LDIwMCBWVyBsaXN0aW5ncyoqIChtb3N0bHkgR29sZikKIyAtICoqfjEwLDcwMCBBdWRpIGxpc3RpbmdzKiogKG1vc3RseSBBNCkKIyAtIENvbHVtbnM6IGBtb2RlbGAsIGB5ZWFyYCwgYHByaWNlYCwgYHRyYW5zbWlzc2lvbmAsIGBtaWxlYWdlYCwgYGZ1ZWxUeXBlYCwgYHRheGAsIGBtcGdgLCBgZW5naW5lU2l6ZWAKIyAKIyBCeSB0aGUgZW5kIHlvdSdsbCBoYXZlIHRyYWluZWQgdHdvIG1vZGVscywgY29tcGFyZWQgdGhlbSwgYW5kIHdyaXR0ZW4gYSBidXNpbmVzcyByZWNvbW1lbmRhdGlvbiBmb3IgbGVhZGVyc2hpcC4KIyAKIyAtLS0KIyAKIyAqKkZvbGxvdyB0aGUgc2VjdGlvbnMgaW4gb3JkZXIuKiogRWFjaCBvbmUgaGFzIGEgY2hlY2tsaXN0LiBGaWxsIGluIHRoZSBgIyBZT1VSIENPREUgSEVSRWAgY2VsbHMuCgojIC0tLQojICMjIFNlY3Rpb24gMCAtIFNldHVwICYgRGF0YSBMb2FkaW5nCiMgPiAqKlJ1biB0aGlzIGNlbGwgZmlyc3QuIERvIG5vdCBtb2RpZnkgaXQuKioKCiMgSW5bIF06CiMgUHJvb1Y6IFZXICYgQXVkaSBVc2VkIENhciBQcmljZSBQcmVkaWN0aW9uCiMgVm9sa3N3YWdlbiwgQXVkaSwgVlcsI
…
Verifiziertes ZertifikatFälschungssicher · ausgestellt von ProoV
3Abgeschlossene Projekte
3Verifizierte Zertifikate
88Durchschnittsnote
Erstelle dein Portfolio mit ProoV