[{"data":1,"prerenderedAt":1094},["ShallowReactive",2],{"navigation_docs":3,"-data-analysis-time-based-split-vs-random-split":352,"-data-analysis-time-based-split-vs-random-split-surround":1089},[4,54,83,116,125,161,179,200],{"title":5,"path":6,"stem":7,"children":8},"Ai","/ai","ai",[9,12,42,46,50],{"title":10,"path":6,"stem":11},"AI 技術探索","ai/index",{"title":13,"path":14,"stem":15,"children":16,"page":41},"Rag","/ai/rag","ai/RAG",[17,21,25,29,33,37],{"title":18,"path":19,"stem":20},"BM25 演算法深入解析：從 TF-IDF 到現代搜尋引擎的核心技術","/ai/rag/bm25-deep-dive-from-tf-idf-to-rag","ai/RAG/bm25-deep-dive-from-tf-idf-to-rag",{"title":22,"path":23,"stem":24},"Dense Retrieval（向量檢索）深入解析","/ai/rag/dense-retrieval-deep-dive","ai/RAG/dense-retrieval-deep-dive",{"title":26,"path":27,"stem":28},"RAG（Retrieval-Augmented Generation）原理與實作入門","/ai/rag/rag-intro-principles-and-implementation","ai/RAG/rag-intro-principles-and-implementation",{"title":30,"path":31,"stem":32},"RAG Retrieval Strategy 深入解析","/ai/rag/rag-retrieval-strategy-deep-dive","ai/RAG/rag-retrieval-strategy-deep-dive",{"title":34,"path":35,"stem":36},"Reciprocal Rank Fusion（RRF）教學：打造更穩定的檢索融合策略","/ai/rag/rrf-reciprocal-rank-fusion-guide","ai/RAG/rrf-reciprocal-rank-fusion-guide",{"title":38,"path":39,"stem":40},"TF-IDF（Term Frequency–Inverse Document Frequency）深入解析","/ai/rag/tf-idf-deep-dive","ai/RAG/tf-idf-deep-dive",false,{"title":43,"path":44,"stem":45},"Docus AI 功能完整實作指南","/ai/docus-ai-implementation","ai/docus-ai-implementation",{"title":47,"path":48,"stem":49},"llms.txt 是什麼？在 Nuxt 中控制 AI 與搜尋引擎爬蟲的新方式","/ai/llms-txt","ai/llms-txt",{"title":51,"path":52,"stem":53},"MCP（Model Context Protocol）是什麼？用「AI 的 USB-C」理解模型如何安全連接工具與資料","/ai/mcp_concept","ai/mcp_concept",{"title":55,"path":56,"stem":57,"children":58,"page":41},"Data Analysis","/data-analysis","data-analysis",[59,63,67,71,75,79],{"title":60,"path":61,"stem":62},"Exploratory Data Analysis（EDA）資料探索分析入門","/data-analysis/exploratory-data-analysis-eda","data-analysis/exploratory-data-analysis-eda",{"title":64,"path":65,"stem":66},"PR-AUC 深入解析：不平衡分類問題的重要評估指標","/data-analysis/pr-auc-for-imbalanced-classification","data-analysis/pr-auc-for-imbalanced-classification",{"title":68,"path":69,"stem":70},"ROC-AUC 深入解析：理解分類模型的判斷能力","/data-analysis/roc-auc-complete-guide","data-analysis/roc-auc-complete-guide",{"title":72,"path":73,"stem":74},"SHAP（SHapley Additive exPlanations）模型解釋方法深入解析","/data-analysis/shap-model-interpretation-complete-guide","data-analysis/shap-model-interpretation-complete-guide",{"title":76,"path":77,"stem":78},"Social Network Analysis（SNA）深入解析","/data-analysis/social-network-analysis-sna","data-analysis/social-network-analysis-sna",{"title":80,"path":81,"stem":82},"Time-based Split：為什麼時間序列資料不能使用 Random Split？","/data-analysis/time-based-split-vs-random-split","data-analysis/time-based-split-vs-random-split",{"title":84,"path":85,"stem":86,"children":87,"page":41},"MachineLearning","/machine_learning","machine_learning",[88,92,96,100,104,108,112],{"title":89,"path":90,"stem":91},"Confusion Matrix（混淆矩陣）完整解析","/machine_learning/confusion-matrix","machine_learning/confusion-matrix",{"title":93,"path":94,"stem":95},"Decision Tree 模型完整教學：從原理到 Python 實作","/machine_learning/decision-tree-complete-guide","machine_learning/decision-tree-complete-guide",{"title":97,"path":98,"stem":99},"為什麼 Decision Tree 在 Tabular Data 上常常勝過 Deep Learning？","/machine_learning/decision-tree-vs-deep-learning-on-tabular-data","machine_learning/decision-tree-vs-deep-learning-on-tabular-data",{"title":101,"path":102,"stem":103},"LightGBM 模型入門：理解高效能的 Gradient Boosting 演算法","/machine_learning/lightgbm-intro-for-tabular-data","machine_learning/lightgbm-intro-for-tabular-data",{"title":105,"path":106,"stem":107},"Logistic Regression（Logit 回歸）完整教學","/machine_learning/logistic-regression-complete-guide","machine_learning/logistic-regression-complete-guide",{"title":109,"path":110,"stem":111},"為什麼模型訓練需要 Train / Validation / Test Dataset？","/machine_learning/train-validation-test-dataset","machine_learning/train-validation-test-dataset",{"title":113,"path":114,"stem":115},"XGBoost 原理與實務教學","/machine_learning/xgboost-complete-guide","machine_learning/xgboost-complete-guide",{"title":117,"path":118,"stem":119,"children":120,"page":41},"Network","/network","network",[121],{"title":122,"path":123,"stem":124},"DNS 設定入門：CNAME vs A Record 完整解析","/network/dns-cname-vs-a-record-guide","network/dns-cname-vs-a-record-guide",{"title":126,"path":127,"stem":128,"children":129},"Nuxt","/nuxt","nuxt",[130,133,137,141,145,149,153,157],{"title":131,"path":127,"stem":132},"Nuxt 實戰指南","nuxt/index",{"title":134,"path":135,"stem":136},"Abstraction Layer 與 Adapter 的差別，一次搞懂設計角色","/nuxt/adapter_abstraction_layer","nuxt/adapter_abstraction_layer",{"title":138,"path":139,"stem":140},"Nuxt 4 全面理解 — 專案檔案結構解析","/nuxt/directory_structure","nuxt/directory_structure",{"title":142,"path":143,"stem":144},"Nuxt 前端 build 流程完整解析","/nuxt/frontend_build","nuxt/frontend_build",{"title":146,"path":147,"stem":148},"Nitro 是什麼？從 Nuxt 專案到 Server 與 Edge 的關鍵引擎","/nuxt/nitro","nuxt/nitro",{"title":150,"path":151,"stem":152},"深入理解 Nuxt 的 .nuxt 與 .output：為什麼部署時一定要分清楚？","/nuxt/nuxt_and_output","nuxt/nuxt_and_output",{"title":154,"path":155,"stem":156},"Nuxt 中 dev、build、preview 的差異一次搞懂","/nuxt/nuxt_dev_build_preview","nuxt/nuxt_dev_build_preview",{"title":158,"path":159,"stem":160},"Nuxt Image vs \u003Cimg>：為什麼 Nuxt 3 專案幾乎都該用 \u003CNuxtImg>？","/nuxt/nuxt_image","nuxt/nuxt_image",{"title":162,"path":163,"stem":164,"children":165},"Python 程式開發","/python","python/index",[166,167,171,175],{"title":162,"path":163,"stem":164},{"title":168,"path":169,"stem":170},"如何在 FastAPI 中調用記憶體 Buffer 回傳圖片 (附實例)","/python/memory_buffer","python/memory_buffer",{"title":172,"path":173,"stem":174},"Python 單元測試教學：如何為你的程式撰寫 Test","/python/python-unit-testing-unittest-pytest","python/python-unit-testing-unittest-pytest",{"title":176,"path":177,"stem":178},"如何使用 uv 取代 pip：改善 Python 專案的開發流程","/python/uv","python/uv",{"title":180,"path":181,"stem":182,"children":183,"page":41},"Statistic","/statistic","statistic",[184,188,192,196],{"title":185,"path":186,"stem":187},"卡方檢定（Chi-Square Test）入門教學","/statistic/chi-square-test-intro","statistic/chi-square-test-intro",{"title":189,"path":190,"stem":191},"常見抽樣方法（Sampling Methods）教學：Stratified、Quota、Convenience、Systematic、Simple Random","/statistic/common-sampling-methods-guide","statistic/common-sampling-methods-guide",{"title":193,"path":194,"stem":195},"Cramér’s V 指標介紹：如何衡量兩個類別變數之間的關聯","/statistic/cramers-v-for-categorical-association","statistic/cramers-v-for-categorical-association",{"title":197,"path":198,"stem":199},"Mann–Whitney U 與 Kolmogorov–Smirnov（KS）檢定：非參數統計檢定的入門指南","/statistic/mann-whitney-u-and-ks-test-intro","statistic/mann-whitney-u-and-ks-test-intro",{"title":201,"path":202,"stem":203,"children":204},"WebDev","/web_dev","web_dev",[205,208,234,248,282,312,334],{"title":206,"path":202,"stem":207},"Web 前端開發","web_dev/index",{"title":209,"path":210,"stem":211,"children":212},"瀏覽器與渲染","/web_dev/browser","web_dev/browser/index",[213,214,218,222,226,230],{"title":209,"path":210,"stem":211},{"title":215,"path":216,"stem":217},"瀏覽器儲存空間完整解析：Cookie、localStorage、IndexedDB 到 Cache Storage","/web_dev/browser/browser-storage-comprehensive-guide","web_dev/browser/browser-storage-comprehensive-guide",{"title":219,"path":220,"stem":221},"DOM (Document Object Model) 深入解析","/web_dev/browser/dom","web_dev/browser/dom",{"title":223,"path":224,"stem":225},"Service Worker Request Flow 深入解析","/web_dev/browser/service-worker-request-flow","web_dev/browser/service-worker-request-flow",{"title":227,"path":228,"stem":229},"CSR、SSR 與 SSG 是什麼？前端渲染策略完整比較","/web_dev/browser/ssr_csr_ssg","web_dev/browser/ssr_csr_ssg",{"title":231,"path":232,"stem":233},"Virtual DOM 深入解析：為什麼它能優化前端效能？","/web_dev/browser/virtual_dom","web_dev/browser/virtual_dom",{"title":235,"path":236,"stem":237,"children":238},"圖形技術","/web_dev/graphics","web_dev/graphics/index",[239,240,244],{"title":235,"path":236,"stem":237},{"title":241,"path":242,"stem":243},"為什麼 Three.js 專案幾乎都選擇 CSR？從 SSR 問題談起","/web_dev/graphics/threejs_csr","web_dev/graphics/threejs_csr",{"title":245,"path":246,"stem":247},"WebGL 是什麼？為什麼前端 3D 幾乎都靠它？","/web_dev/graphics/webgl","web_dev/graphics/webGL",{"title":249,"path":250,"stem":251,"children":252},"架構與配置","/web_dev/infrastructure","web_dev/infrastructure/index",[253,254,258,262,266,270,274,278],{"title":249,"path":250,"stem":251},{"title":255,"path":256,"stem":257},"Zeabur + K3s + Nuxt 部署架構完整解析","/web_dev/infrastructure/k3s-zeabur","web_dev/infrastructure/K3s-zeabur",{"title":259,"path":260,"stem":261},"ECS vs Docker vs Kubernetes：從部署堆疊理解三層架構","/web_dev/infrastructure/ecs-docker-kubernetes-stack","web_dev/infrastructure/ecs-docker-kubernetes-stack",{"title":263,"path":264,"stem":265},"ECS vs VPS 是什麼？從部署網站的角度一次搞懂差別","/web_dev/infrastructure/ecs-vs-vps","web_dev/infrastructure/ecs-vs-vps",{"title":267,"path":268,"stem":269},"Zeabur 內網服務連線完整入門指南","/web_dev/infrastructure/k3s-internal-networking","web_dev/infrastructure/k3s-internal-networking",{"title":271,"path":272,"stem":273},"使用 Microservices 架構設計系統的優勢解析","/web_dev/infrastructure/microservices-architecture-advantages","web_dev/infrastructure/microservices-architecture-advantages",{"title":275,"path":276,"stem":277},"Nginx 入門教學：從反向代理到與 Kubernetes 的架構比較","/web_dev/infrastructure/nginx-intro","web_dev/infrastructure/nginx-intro",{"title":279,"path":280,"stem":281},"YAML 配置是什麼？為什麼現代開發都在用它","/web_dev/infrastructure/yaml-configuration","web_dev/infrastructure/yaml-configuration",{"title":283,"path":284,"stem":285,"children":286},"網絡與通訊","/web_dev/network","web_dev/network/index",[287,288,292,296,300,304,308],{"title":283,"path":284,"stem":285},{"title":289,"path":290,"stem":291},"HTTP Request 結構完整解析：從 Request Line 到 Header 一次看懂","/web_dev/network/http-request-structure","web_dev/network/http-request-structure",{"title":293,"path":294,"stem":295},"OSI 模型（Open Systems Interconnection Model）完整解析","/web_dev/network/osi-model","web_dev/network/osi-model",{"title":297,"path":298,"stem":299},"RESTful API 設計原則與實務解析","/web_dev/network/restful-api","web_dev/network/restful-api",{"title":301,"path":302,"stem":303},"RESTful API 五大設計原則深入解析","/web_dev/network/restful-api-principles","web_dev/network/restful-api-principles",{"title":305,"path":306,"stem":307},"Server-Sent Events (SSE) 深入解析與實作教學","/web_dev/network/sse-introduction","web_dev/network/sse-introduction",{"title":309,"path":310,"stem":311},"WebSocket 入門教學：從概念到 Node.js 實作","/web_dev/network/websocket-introduction","web_dev/network/websocket-introduction",{"title":313,"path":314,"stem":315,"children":316},"認證與安全","/web_dev/security","web_dev/security/index",[317,318,322,326,330],{"title":313,"path":314,"stem":315},{"title":319,"path":320,"stem":321},"使用 Cookie 與 Session 建立使用者驗證（完整新手教學）","/web_dev/security/cookie-session-authentication","web_dev/security/cookie-session-authentication",{"title":323,"path":324,"stem":325},"JWT 驗證機制完整解析：從登入流程到實務應用","/web_dev/security/jwt-authentication","web_dev/security/jwt-authentication",{"title":327,"path":328,"stem":329},"Secret Key 簽名是什麼？從零理解資料簽名的本質","/web_dev/security/secret-key-signing","web_dev/security/secret-key-signing",{"title":331,"path":332,"stem":333},"SSH（Secure Shell）是什麼？從遠端登入到安全通道的核心概念","/web_dev/security/ssh","web_dev/security/ssh",{"title":335,"path":336,"stem":337,"children":338},"SEO 與規範","/web_dev/seo","web_dev/seo/index",[339,340,344,348],{"title":335,"path":336,"stem":337},{"title":341,"path":342,"stem":343},"Canonical URL 是什麼？用生活化方式搞懂前端 SEO 的基本保命符","/web_dev/seo/canonical_link","web_dev/seo/canonical_link",{"title":345,"path":346,"stem":347},"robots.txt 是什麼？SEO 的第一道守門員","/web_dev/seo/robot_txt","web_dev/seo/robot_txt",{"title":349,"path":350,"stem":351},"Nuxt SEO 中的 Meta 與 SEO 工具是如何運作的？","/web_dev/seo/seo","web_dev/seo/seo",{"id":353,"title":80,"body":354,"description":1076,"extension":1077,"links":1078,"meta":1079,"navigation":419,"path":81,"seo":1087,"stem":82,"__hash__":1088},"docs/data-analysis/time-based-split-vs-random-split.md",{"type":355,"value":356,"toc":1063},"minimark",[357,362,371,382,385,466,472,475,482,501,504,510,513,517,523,526,532,535,628,634,642,645,651,654,656,660,663,668,671,674,680,683,689,692,702,704,709,715,718,720,724,727,799,802,808,815,884,890,892,896,899,904,910,913,919,922,927,929,933,939,941,947,950,958,961,963,967,970,984,990,993,1004,1007,1013,1015,1018,1021,1024,1030,1033,1035,1038,1059],[358,359,361],"h2",{"id":360},"為什麼資料切分方式很重要","為什麼資料切分方式很重要？",[363,364,365,366,370],"p",{},"在機器學習的模型訓練流程中，一個非常基本但關鍵的步驟就是 ",[367,368,369],"strong",{},"資料切分（data splitting）","。",[363,372,373,374,377,378,381],{},"通常我們會將資料分成 ",[367,375,376],{},"Training set（訓練資料）"," 與 ",[367,379,380],{},"Test set（測試資料）","，藉此評估模型在未見過資料上的表現。",[363,383,384],{},"在許多教學或範例中，你可能會看到類似下面的寫法：",[386,387,392],"pre",{"className":388,"code":389,"language":390,"meta":391,"style":391},"language-python shiki shiki-themes github-dark","from sklearn.model_selection import train_test_split\n\nX_train, X_test, y_train, y_test = train_test_split(\n    X, y, test_size=0.2, random_state=42\n)\n","python","",[393,394,395,414,421,433,460],"code",{"__ignoreMap":391},[396,397,400,404,408,411],"span",{"class":398,"line":399},"line",1,[396,401,403],{"class":402},"snl16","from",[396,405,407],{"class":406},"s95oV"," sklearn.model_selection ",[396,409,410],{"class":402},"import",[396,412,413],{"class":406}," train_test_split\n",[396,415,417],{"class":398,"line":416},2,[396,418,420],{"emptyLinePlaceholder":419},true,"\n",[396,422,424,427,430],{"class":398,"line":423},3,[396,425,426],{"class":406},"X_train, X_test, y_train, y_test ",[396,428,429],{"class":402},"=",[396,431,432],{"class":406}," train_test_split(\n",[396,434,436,439,443,445,449,452,455,457],{"class":398,"line":435},4,[396,437,438],{"class":406},"    X, y, ",[396,440,442],{"class":441},"s9osk","test_size",[396,444,429],{"class":402},[396,446,448],{"class":447},"sDLfK","0.2",[396,450,451],{"class":406},", ",[396,453,454],{"class":441},"random_state",[396,456,429],{"class":402},[396,458,459],{"class":447},"42\n",[396,461,463],{"class":398,"line":462},5,[396,464,465],{"class":406},")\n",[363,467,468,469,370],{},"這種方式稱為 ",[367,470,471],{},"Random Split（隨機切分）",[363,473,474],{},"它會隨機抽取資料作為訓練集與測試集，在很多問題中確實是合理的做法。",[363,476,477,478,481],{},"然而，一旦資料具有 ",[367,479,480],{},"時間順序（temporal order）","，例如：",[483,484,485,489,492,495,498],"ul",{},[486,487,488],"li",{},"金融交易紀錄",[486,490,491],{},"使用者行為資料",[486,493,494],{},"IoT 感測資料",[486,496,497],{},"網站流量",[486,499,500],{},"股票價格",[363,502,503],{},"此時如果仍然使用 Random Split，模型評估就可能出現嚴重的問題。",[363,505,506,507,370],{},"這也是為什麼在時間相關的資料問題中，我們通常會使用 ",[367,508,509],{},"Time-based Split",[511,512],"hr",{},[358,514,516],{"id":515},"什麼是-time-based-split","什麼是 Time-based Split？",[363,518,519,522],{},[367,520,521],{},"Time-based Split（時間切分）"," 指的是依照資料發生的時間順序來切分資料，而不是隨機抽樣。",[363,524,525],{},"最基本的概念非常直覺：",[527,528,529],"blockquote",{},[363,530,531],{},"使用「過去資料」訓練模型，並用「未來資料」進行測試。",[363,533,534],{},"例如，假設我們有一份交易資料：",[536,537,538,557],"table",{},[539,540,541],"thead",{},[542,543,544,548,551,554],"tr",{},[545,546,547],"th",{},"date",[545,549,550],{},"transaction_id",[545,552,553],{},"amount",[545,555,556],{},"label",[558,559,560,575,588,602,615],"tbody",{},[542,561,562,566,569,572],{},[563,564,565],"td",{},"2022-01",[563,567,568],{},"T1",[563,570,571],{},"100",[563,573,574],{},"0",[542,576,577,580,583,586],{},[563,578,579],{},"2022-02",[563,581,582],{},"T2",[563,584,585],{},"200",[563,587,574],{},[542,589,590,593,596,599],{},[563,591,592],{},"2022-03",[563,594,595],{},"T3",[563,597,598],{},"500",[563,600,601],{},"1",[542,603,604,607,610,613],{},[563,605,606],{},"2022-04",[563,608,609],{},"T4",[563,611,612],{},"150",[563,614,574],{},[542,616,617,620,623,626],{},[563,618,619],{},"2022-05",[563,621,622],{},"T5",[563,624,625],{},"900",[563,627,601],{},[363,629,630,631,633],{},"如果我們使用 ",[367,632,509],{},"，資料切分可能會像這樣：",[386,635,640],{"className":636,"code":638,"language":639},[637],"language-text","Training set: 2022-01 ~ 2022-03\nTest set: 2022-04 ~ 2022-05\n","text",[393,641,638],{"__ignoreMap":391},[363,643,644],{},"換句話說：",[386,646,649],{"className":647,"code":648,"language":639},[637],"過去 → 用來訓練模型\n未來 → 用來評估模型\n",[393,650,648],{"__ignoreMap":391},[363,652,653],{},"這樣的切分方式更符合真實世界中模型的使用情境。",[511,655],{},[358,657,659],{"id":658},"為什麼不能使用-random-split","為什麼不能使用 Random Split？",[363,661,662],{},"如果在時間資料中使用 Random Split，會產生一個常見問題：",[363,664,665],{},[367,666,667],{},"Future Data Leakage（未來資料洩漏）",[363,669,670],{},"我們來看一個簡單的例子。",[363,672,673],{},"假設你的資料是：",[386,675,678],{"className":676,"code":677,"language":639},[637],"2022-01 2022-02 2022-03 2022-04 2022-05\n",[393,679,677],{"__ignoreMap":391},[363,681,682],{},"如果使用 Random Split，資料可能會變成：",[386,684,687],{"className":685,"code":686,"language":639},[637],"Training set: 2022-01 2022-04 2022-05\nTest set: 2022-02 2022-03\n",[393,688,686],{"__ignoreMap":391},[363,690,691],{},"這代表一件非常不合理的事情：",[363,693,694,695,698,699,370],{},"模型在訓練時看到了 ",[367,696,697],{},"2022-05 的資料","，\n卻被要求預測 ",[367,700,701],{},"2022-02 的資料",[363,703,644],{},[527,705,706],{},[363,707,708],{},"模型在訓練過程中已經看到了「未來」。",[363,710,711,712,370],{},"這種情況在真實世界中是不可能發生的，因此模型的評估結果會被 ",[367,713,714],{},"嚴重高估（overly optimistic）",[363,716,717],{},"在金融詐欺偵測、信用風險評估、需求預測等問題中，這種錯誤可能會讓模型在離線測試時看起來非常準確，但實際部署後卻表現很差。",[511,719],{},[358,721,723],{"id":722},"time-based-split-的實作方式","Time-based Split 的實作方式",[363,725,726],{},"在 Python 中，最簡單的方式就是直接依照時間排序後切分資料。",[386,728,730],{"className":388,"code":729,"language":390,"meta":391,"style":391},"df = df.sort_values(\"date\")\n\ntrain_size = int(len(df) * 0.8)\ntrain = df.iloc[:train_size]\ntest = df.iloc[train_size:]\n",[393,731,732,748,752,779,789],{"__ignoreMap":391},[396,733,734,737,739,742,746],{"class":398,"line":399},[396,735,736],{"class":406},"df ",[396,738,429],{"class":402},[396,740,741],{"class":406}," df.sort_values(",[396,743,745],{"class":744},"sU2Wk","\"date\"",[396,747,465],{"class":406},[396,749,750],{"class":398,"line":416},[396,751,420],{"emptyLinePlaceholder":419},[396,753,754,757,759,762,765,768,771,774,777],{"class":398,"line":423},[396,755,756],{"class":406},"train_size ",[396,758,429],{"class":402},[396,760,761],{"class":447}," int",[396,763,764],{"class":406},"(",[396,766,767],{"class":447},"len",[396,769,770],{"class":406},"(df) ",[396,772,773],{"class":402},"*",[396,775,776],{"class":447}," 0.8",[396,778,465],{"class":406},[396,780,781,784,786],{"class":398,"line":435},[396,782,783],{"class":406},"train ",[396,785,429],{"class":402},[396,787,788],{"class":406}," df.iloc[:train_size]\n",[396,790,791,794,796],{"class":398,"line":462},[396,792,793],{"class":406},"test ",[396,795,429],{"class":402},[396,797,798],{"class":406}," df.iloc[train_size:]\n",[363,800,801],{},"這樣就可以確保：",[386,803,806],{"className":804,"code":805,"language":639},[637],"train → 較早的資料\ntest → 較晚的資料\n",[393,807,805],{"__ignoreMap":391},[363,809,810,811,814],{},"如果使用 ",[367,812,813],{},"scikit-learn","，也可以使用專門為時間資料設計的工具：",[386,816,818],{"className":388,"code":817,"language":390,"meta":391,"style":391},"from sklearn.model_selection import TimeSeriesSplit\n\ntscv = TimeSeriesSplit(n_splits=5)\n\nfor train_index, test_index in tscv.split(X):\n    X_train, X_test = X.iloc[train_index], X.iloc[test_index]\n",[393,819,820,831,835,855,859,873],{"__ignoreMap":391},[396,821,822,824,826,828],{"class":398,"line":399},[396,823,403],{"class":402},[396,825,407],{"class":406},[396,827,410],{"class":402},[396,829,830],{"class":406}," TimeSeriesSplit\n",[396,832,833],{"class":398,"line":416},[396,834,420],{"emptyLinePlaceholder":419},[396,836,837,840,842,845,848,850,853],{"class":398,"line":423},[396,838,839],{"class":406},"tscv ",[396,841,429],{"class":402},[396,843,844],{"class":406}," TimeSeriesSplit(",[396,846,847],{"class":441},"n_splits",[396,849,429],{"class":402},[396,851,852],{"class":447},"5",[396,854,465],{"class":406},[396,856,857],{"class":398,"line":435},[396,858,420],{"emptyLinePlaceholder":419},[396,860,861,864,867,870],{"class":398,"line":462},[396,862,863],{"class":402},"for",[396,865,866],{"class":406}," train_index, test_index ",[396,868,869],{"class":402},"in",[396,871,872],{"class":406}," tscv.split(X):\n",[396,874,876,879,881],{"class":398,"line":875},6,[396,877,878],{"class":406},"    X_train, X_test ",[396,880,429],{"class":402},[396,882,883],{"class":406}," X.iloc[train_index], X.iloc[test_index]\n",[363,885,886,889],{},[393,887,888],{},"TimeSeriesSplit"," 會模擬「模型隨時間不斷更新」的情境，因此在時間序列問題中非常常見。",[511,891],{},[358,893,895],{"id":894},"rolling-window-與-expanding-window","Rolling Window 與 Expanding Window",[363,897,898],{},"在實務中，Time-based Split 常常會搭配兩種訓練策略。",[900,901,903],"h3",{"id":902},"expanding-window","Expanding Window",[363,905,906,907,370],{},"Expanding Window 指的是 ",[367,908,909],{},"訓練資料會隨時間持續增加",[363,911,912],{},"例如：",[386,914,917],{"className":915,"code":916,"language":639},[637],"Train: 2018\nTest : 2019\n\nTrain: 2018–2019\nTest : 2020\n\nTrain: 2018–2020\nTest : 2021\n",[393,918,916],{"__ignoreMap":391},[363,920,921],{},"這種方式模擬的是：",[527,923,924],{},[363,925,926],{},"模型會不斷累積歷史資料進行重新訓練。",[511,928],{},[900,930,932],{"id":931},"rolling-window","Rolling Window",[363,934,935,936,370],{},"Rolling Window 則是 ",[367,937,938],{},"訓練資料維持固定長度",[363,940,912],{},[386,942,945],{"className":943,"code":944,"language":639},[637],"Train: 2018–2019\nTest : 2020\n\nTrain: 2019–2020\nTest : 2021\n",[393,946,944],{"__ignoreMap":391},[363,948,949],{},"這種方式通常用在：",[483,951,952,955],{},[486,953,954],{},"市場環境快速變化",[486,956,957],{},"舊資料不再具有代表性",[363,959,960],{},"例如金融市場或使用者行為分析。",[511,962],{},[358,964,966],{"id":965},"time-based-split-在金融資料中的重要性","Time-based Split 在金融資料中的重要性",[363,968,969],{},"在金融資料科學領域，例如：",[483,971,972,975,978,981],{},[486,973,974],{},"信用卡詐欺偵測",[486,976,977],{},"反洗錢（AML）",[486,979,980],{},"信用風險模型",[486,982,983],{},"客戶流失預測",[363,985,986,987,370],{},"資料幾乎都具有強烈的 ",[367,988,989],{},"時間依賴性",[363,991,992],{},"例如在詐欺偵測中：",[483,994,995,998,1001],{},[486,996,997],{},"詐欺模式會不斷改變",[486,999,1000],{},"攻擊者策略會持續演化",[486,1002,1003],{},"新型詐欺手法會出現",[363,1005,1006],{},"如果模型在訓練時看到了未來資料，就會造成評估結果過於樂觀，進而導致模型在實際上線後無法有效偵測新的詐欺行為。",[363,1008,1009,1010,370],{},"因此在金融風控領域中，",[367,1011,1012],{},"Time-based Split 幾乎是標準做法",[511,1014],{},[358,1016,1017],{"id":1017},"結論",[363,1019,1020],{},"Time-based Split 是處理具有時間順序資料時最重要的資料切分方法之一。",[363,1022,1023],{},"與 Random Split 不同，它會依照資料的時間順序進行切分，確保模型只使用「過去資料」來預測「未來資料」。",[363,1025,1026,1027,1029],{},"這樣的設計可以有效避免 ",[367,1028,667],{},"，並讓模型評估結果更接近真實世界的表現。",[363,1031,1032],{},"當你在處理金融交易、使用者行為或任何時間序列資料時，選擇正確的資料切分方式，往往比模型本身的複雜度還要重要。理解並正確使用 Time-based Split，能夠大幅提升機器學習模型評估的可靠性。",[511,1034],{},[358,1036,1037],{"id":1037},"參考資料",[1039,1040,1041,1049,1052],"ol",{},[486,1042,1043,1044,1048],{},"Aurélien Géron, ",[1045,1046,1047],"em",{},"Hands-On Machine Learning with Scikit-Learn, Keras & TensorFlow",", O’Reilly.",[486,1050,1051],{},"scikit-learn documentation – TimeSeriesSplit",[486,1053,1054,1055,1058],{},"Kuhn & Johnson, ",[1045,1056,1057],{},"Feature Engineering and Selection",", CRC Press.",[1060,1061,1062],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}",{"title":391,"searchDepth":416,"depth":416,"links":1064},[1065,1066,1067,1068,1069,1073,1074,1075],{"id":360,"depth":416,"text":361},{"id":515,"depth":416,"text":516},{"id":658,"depth":416,"text":659},{"id":722,"depth":416,"text":723},{"id":894,"depth":416,"text":895,"children":1070},[1071,1072],{"id":902,"depth":423,"text":903},{"id":931,"depth":423,"text":932},{"id":965,"depth":416,"text":966},{"id":1017,"depth":416,"text":1017},{"id":1037,"depth":416,"text":1037},"介紹 Time-based Split 的概念、為什麼時間資料不能隨機切分，以及如何避免未來資料洩漏（Future Data Leakage）。","md",null,{"tags":1080,"category":57,"date":1086},[1081,1082,1083,1084,1085],"machine learning","data science","time series","data leakage","model evaluation","2026-03-07",{"title":80,"description":1076},"oGu2oGt2CKHkCfSzk2dyciVHj00B_bD5K0QcpGY1Gs0",[1090,1092],{"title":76,"path":77,"stem":78,"description":1091,"children":-1},"介紹社會網路分析（Social Network Analysis, SNA）的基本概念、常見指標與應用場景，理解如何透過網路結構分析人際關係、資訊傳播與交易網路。",{"title":89,"path":90,"stem":91,"description":1093,"children":-1},"從直觀概念到實際應用，深入理解 Confusion Matrix 的結構、評估指標與在詐欺偵測中的重要性。",1776690841330]