據(jù)挖掘與機器學(xué)習(xí)入門:從零跑通第一個分類項目)
我最早開始整理數(shù)據(jù)挖掘與機器學(xué)習(xí)學(xué)習(xí)筆記是因為一個很現(xiàn)實的原因?qū)W得太快忘得更快。機器學(xué)習(xí)這個方向每翻幾頁教材就會蹦出來一個算法每個算法背后又拖著數(shù)學(xué)、代碼、案例三條尾巴。今天覺得自己懂了明天打開電腦寫代碼才發(fā)現(xiàn)連數(shù)據(jù)從哪來、模型怎么評估都理不清。于是我自己定了個規(guī)矩每學(xué)完一個主題就把它整理成一篇筆記把原理、代碼、踩坑全部寫下來。這篇就是系列筆記的第一篇先不聊太深的公式把機器學(xué)習(xí)入門階段必須理清楚的那些事情一次性講透。如果你是那種剛接觸數(shù)據(jù)挖掘和機器學(xué)習(xí)、看到滿屏術(shù)語就頭疼的人或者之前零零散散看過一些課程、但始終沒有獨立跑通過一個正經(jīng)模型的人這篇文章應(yīng)該對你有用。它覆蓋三個層面的內(nèi)容認(rèn)知層數(shù)據(jù)挖掘和機器學(xué)習(xí)到底什么關(guān)系、數(shù)學(xué)要補到什么程度、該按什么順序?qū)W工具層Python、NumPy、Pandas、Matplotlib、scikit-learn 這些必備工具到底怎么搭配使用實戰(zhàn)層我會帶你在一個經(jīng)典小數(shù)據(jù)集上從數(shù)據(jù)探索到建模評估完整跑一遍分類任務(wù)并附上我在實踐里踩過的幾個經(jīng)典坑??赐曛竽憧梢哉罩@個路徑復(fù)現(xiàn)一遍把自己第一個機器學(xué)習(xí)項目真正跑起來。1. 先別急著寫代碼入門前的3個認(rèn)知準(zhǔn)備1.1 數(shù)據(jù)挖掘和機器學(xué)習(xí)到底是不是一回事在很多學(xué)習(xí)筆記里數(shù)據(jù)挖掘和機器學(xué)習(xí)經(jīng)常被并列提出來。它們像兄弟但不是雙胞胎。數(shù)據(jù)挖掘的源頭是“從數(shù)據(jù)中發(fā)現(xiàn)有價值的知識”它的關(guān)注點更寬數(shù)據(jù)清洗、數(shù)據(jù)理解、特征工程、模式發(fā)現(xiàn)、異常檢測、可視化探索都在這個范疇里。它不要求一定用機器學(xué)習(xí)模型傳統(tǒng)的統(tǒng)計方法、簡單的規(guī)則同樣可以是數(shù)據(jù)挖掘手段。我習(xí)慣把它理解成“在一個礦山里篩金子”——得先搞清楚哪個區(qū)域可能埋著東西、用什么工具篩、篩出來的東西怎么評估這些環(huán)節(jié)都在數(shù)據(jù)挖掘內(nèi)部。機器學(xué)習(xí)相比之下更聚焦在“構(gòu)建一個能從數(shù)據(jù)中學(xué)習(xí)并做出預(yù)測或決策的系統(tǒng)”。它關(guān)心的是數(shù)據(jù)里有沒有可學(xué)習(xí)的模式以及如何用算法把這個模式學(xué)出來然后對未知樣本做出判斷。你可以把它理解成“訓(xùn)練一只導(dǎo)盲犬”給它大量帶提示的樣例讓它學(xué)會看到某個輸入就做出正確的動作。不過在真實項目里兩者高度交疊數(shù)據(jù)挖掘項目大概率會用到機器學(xué)習(xí)模型機器學(xué)習(xí)項目也一定繞不開數(shù)據(jù)清洗和特征處理。入門階段你不需要糾結(jié)學(xué)科邊界只要記住一句話數(shù)據(jù)挖掘偏“找知識”機器學(xué)習(xí)偏“學(xué)映射”。后文聊到的所有實操本質(zhì)上都是把一堆原始數(shù)據(jù)變成有價值輸出的完整鏈條。1.2 學(xué)習(xí)路徑怎么安排才不會被勸退我見過太多人雄心勃勃地翻開一本大部頭教材從第一章的數(shù)學(xué)推導(dǎo)開始啃兩周后心態(tài)直接崩了。不是深挖理論不對而是入門階段你還沒有足夠的“模型直覺”來支撐理論理解。沒有直覺托底公式讀起來就只是一堆符號在跳動。我建議的路線是先跑通一個極簡項目再逐步擴大知識面。拆開來看就五步把 Python 基礎(chǔ)語法過一遍能寫循環(huán)、能處理列表字典就夠了不需要學(xué)得很深。學(xué) NumPy、Pandas、Matplotlib 的常用操作用兩個小數(shù)據(jù)集把加載、清洗、畫圖做熟?;ㄒ恢芨愣畽C器學(xué)習(xí)最核心的幾個概念訓(xùn)練集/測試集、特征/標(biāo)簽、監(jiān)督/無監(jiān)督、過擬合。用 scikit-learn 跑通第一個分類和回歸任務(wù)不管效果多粗糙先看到模型能跑起來?;氐浇滩陌葱柩a數(shù)學(xué)、補算法細(xì)節(jié)。這個路徑最大的好處是每一步都有正反饋。學(xué)完一個東西馬上能看到效果比如畫出一張清晰的分布圖或者跑出一個有基本準(zhǔn)頭的模型。這種反饋是支撐你繼續(xù)走下去最重要的燃料。我還想強調(diào)一點不要試圖把數(shù)據(jù)挖掘和機器學(xué)習(xí)拆成兩條平行的學(xué)習(xí)線。它們本來就是一套工作流上的環(huán)節(jié)現(xiàn)實中也是綁定在一起的。你拿到一份數(shù)據(jù)先做探索分析和清洗再做特征工程接著建模評估最后嘗試解釋結(jié)果。一套完整流程跑下來兩個領(lǐng)域的知識就一起覆蓋了。1.3 數(shù)學(xué)基礎(chǔ)要補到什么程度才夠用這是新手最焦慮的問題我數(shù)學(xué)不好能不能學(xué)機器學(xué)習(xí)我的答案很明確能。入門階段你只需要把三門數(shù)學(xué)課的核心內(nèi)容學(xué)到“會用”的程度。線性代數(shù)要理解向量、矩陣、矩陣乘法、轉(zhuǎn)置、特征值和特征向量。原因是數(shù)據(jù)在代碼里就是二維數(shù)組PCA 降維本質(zhì)上是在找特征方向神經(jīng)網(wǎng)絡(luò)的每一層也就是一次矩陣運算。概率統(tǒng)計要掌握期望、方差、條件概率、貝葉斯公式、常見分布和最大似然的基本思想。真實世界的標(biāo)簽往往帶噪聲“不確定性”這個概念會貫穿整個機器學(xué)習(xí)。微積分里重點是導(dǎo)數(shù)和梯度。梯度下降是大多數(shù)優(yōu)化算法的引擎把“沿著梯度反方向走一小步目標(biāo)函數(shù)會下降”這一句話想明白就夠用了。入門階段不需要證明公式也不需要手推 SVM 的對偶問題。學(xué)機器學(xué)習(xí)有點像學(xué)開車數(shù)學(xué)是發(fā)動機原理你可以先會開車再逐步理解發(fā)動機為什么好開。等你遇到具體場景比如為什么 L2 正則化能讓權(quán)重變小、為什么邏輯回歸要用極大似然估計再回頭補數(shù)學(xué)效率會高很多。2. 工具鏈與學(xué)習(xí)路線Python生態(tài)怎么搭2.1 為什么首選Python而不是Excel/R/SPSS我早期做過一段時間的報表和數(shù)據(jù)分析Excel 用得非常多數(shù)據(jù)透視表、VLOOKUP、條件格式都玩得熟練。但 Excel 有其明顯天花板一旦面對幾十萬行、上百個字段的數(shù)據(jù)操作就會變得很卡而且很難承載“訓(xùn)練一個模型并反復(fù)調(diào)參”這類任務(wù)。R 在統(tǒng)計分析和繪圖上有獨到優(yōu)勢尤其適合統(tǒng)計檢驗、學(xué)術(shù)圖表這類的場景。但它在工程化、深度學(xué)習(xí)生態(tài)和通用編程能力上不如 Python 均衡很多工程團隊也不太用它來上線模型。至于 SPSS、SAS 這類商業(yè)統(tǒng)計工具更偏傳統(tǒng)統(tǒng)計流程閉源、昂貴而且很難和現(xiàn)代數(shù)據(jù)處理鏈路集成。Python 能成為數(shù)據(jù)挖掘和機器學(xué)習(xí)的事實標(biāo)準(zhǔn)根本原因是生態(tài)。scikit-learn 把所有經(jīng)典算法封裝成統(tǒng)一接口Pandas 提供類似 SQL 的表格操作能力Matplotlib/Seaborn 解決可視化NumPy 負(fù)責(zé)底層高效數(shù)值計算。更關(guān)鍵的是社區(qū)龐大你遇到的問題幾乎都能搜到對應(yīng)解決方案。對新手來說搜索問題效率高本身就是巨大的優(yōu)勢。我自己學(xué)習(xí)時遵循一個原則能在命令行里用代碼解決的問題絕不用鼠標(biāo)在圖形界面里點來點去。代碼可復(fù)制、可復(fù)現(xiàn)、可版本化這比任何“記憶操作步驟”都可靠。這也是數(shù)據(jù)工作最基本的素養(yǎng)之一。2.2 數(shù)據(jù)三件套NumPy、Pandas、Matplotlib怎么學(xué)所謂三件套就是 NumPy、Pandas 和 Matplotlib/Seaborn。它們各解決什么問題我用一個場景說明。假設(shè)你拿到一張訂單表幾萬行數(shù)據(jù)包含訂單號、城市、商品類別、金額、下單時間等字段。你想知道“每個城市每類商品的銷售額排名”。用 Excel 要做透視表用 Pandas 只需要一個方法鏈按城市和類別分組、對金額求和、排序輸出一個新表。這個處理過程本質(zhì)上就是數(shù)據(jù)挖掘里的“數(shù)據(jù)準(zhǔn)備與聚合”。NumPy 的職責(zé)是底層數(shù)值計算。Pandas 底層大量依賴 NumPy你不需要把 NumPy 的 API 全背下來但一定要理解它與 Python 內(nèi)置列表的關(guān)鍵區(qū)別向量化運算。比如把一整個數(shù)組的每個元素乘 2用純 Python for 循環(huán)可能慢得明顯用 NumPy 的廣播機制幾乎是瞬間完成。大規(guī)模數(shù)據(jù)操作必須依靠向量化這是性能的核心。Matplotlib 是基礎(chǔ)繪圖庫Seaborn 在它之上封裝出更美觀的統(tǒng)計圖形。入門階段掌握四類圖就夠散點圖、直方圖、箱線圖、熱力圖。每次拿到新數(shù)據(jù)集先畫分布和相關(guān)性這是發(fā)現(xiàn)異常值和理解特征關(guān)系最快的方法。學(xué)習(xí)三件套時我強烈建議直接拿真實數(shù)據(jù)集練手而不是去刷語法手冊。比如找一份公開的銷售記錄連續(xù)做幾個小任務(wù)篩選某月數(shù)據(jù)、計算客單價、按城市分組統(tǒng)計、畫出金額分布。這些小練習(xí)做完你的掌握程度會遠(yuǎn)超那些只跟著教程敲過例子的人。2.3 先學(xué)scikit-learn還是先學(xué)深度學(xué)習(xí)框架幾乎每個初學(xué)者都問過這個問題。深度學(xué)習(xí)框架熱度太高容易讓人誤以為入門就要從 PyTorch 或 TensorFlow 開始。我的建議非常明確入門階段先老老實實學(xué) scikit-learn。理由有三條。第一scikit-learn 算法覆蓋率高線性回歸、邏輯回歸、決策樹、隨機森林、SVM、KNN、聚類、降維、特征工程工具全都有而且 API 極度統(tǒng)一核心就是 fit 和 predict 兩個方法。學(xué)會一個模型其他模型很快就能舉一反三。第二它對新手很友好默認(rèn)參數(shù)在常見規(guī)模的數(shù)據(jù)上通常表現(xiàn)不錯不需要你理解太多底層細(xì)節(jié)就能跑出可接受的結(jié)果。第三它和深度學(xué)習(xí)框架不是對立關(guān)系而是前后銜接的關(guān)系——兩者共享同一套機器學(xué)習(xí)思維比如數(shù)據(jù)預(yù)處理、訓(xùn)練測試劃分、評估指標(biāo)、過擬合與正則化。那什么時候可以轉(zhuǎn)向深度學(xué)習(xí)框架我的判斷標(biāo)準(zhǔn)很實際當(dāng)你手里的數(shù)據(jù)是圖像、長文本、語音這類非結(jié)構(gòu)化數(shù)據(jù)或者發(fā)現(xiàn)傳統(tǒng)模型已經(jīng)明顯遇到瓶頸再或者你需要自定義靈活的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)時就可以切入 PyTorch 了。到那個階段你已經(jīng)有模型直覺和數(shù)據(jù)處理經(jīng)驗再學(xué)張量、自動求導(dǎo)、GPU 加速這些概念會順很多。學(xué)習(xí)順序上先用 scikit-learn 把經(jīng)典算法全部過一遍再用 PyTorch 重寫其中幾個簡單模型比如線性回歸和邏輯回歸。這一步做完你既理解了兩代工具的差異也能把基礎(chǔ)概念串起來。3. 核心概念掃盲從模型到完整流程3.1 監(jiān)督學(xué)習(xí)的兩大基本盤分類與回歸監(jiān)督學(xué)習(xí)的核心是有一批已經(jīng)標(biāo)注好的樣本模型從這些樣本里學(xué)規(guī)律然后去預(yù)測新樣本的標(biāo)簽。用“開卷復(fù)習(xí)之后閉卷考試”來理解就對了——訓(xùn)練集是你復(fù)習(xí)時翻看的標(biāo)準(zhǔn)答案測試集是考場上的新題目模型在測試集上的表現(xiàn)才算真本事。監(jiān)督學(xué)習(xí)下面最常用的是兩類任務(wù)分類任務(wù)預(yù)測的標(biāo)簽是離散類別。例如銀行判斷一筆交易是否屬于欺詐、郵件服務(wù)判斷一封郵件是否垃圾郵件、公司根據(jù)用戶畫像預(yù)測用戶是否會流失?;貧w任務(wù)預(yù)測的標(biāo)簽是連續(xù)數(shù)值。例如預(yù)測房價、預(yù)測明天最高氣溫、預(yù)測某個商品未來一個月的銷量。項目里反復(fù)出現(xiàn)的概念不外乎這么幾個特征也就是樣本的屬性比如年齡、消費金額、訪問次數(shù)標(biāo)簽也就是你真正想預(yù)測的值比如“是否流失”訓(xùn)練集用來學(xué)習(xí)規(guī)律的樣本測試集負(fù)責(zé)考試的樣本。新手最容易犯的錯誤之一是把訓(xùn)練集上的表現(xiàn)直接當(dāng)成模型最終水平。訓(xùn)練集上的高分說明模型“背得熟”測試集上的分?jǐn)?shù)才說明模型“學(xué)得會”。這兩者之間的差距大小本質(zhì)上就是過擬合的程度。用一個例子串起來你要預(yù)測某用戶是否會在未來三個月內(nèi)購買某商品特征可能有瀏覽時長、歷史購買次數(shù)、最近一次訪問間隔。你用一個月的歷史數(shù)據(jù)構(gòu)造訓(xùn)練集再用后面一周的數(shù)據(jù)做測試集訓(xùn)練一個分類模型。整個過程聽起來不難但真上手之后你會發(fā)現(xiàn)數(shù)據(jù)清洗和特征篩選才是真正花時間的地方訓(xùn)練模型反而只是其中一環(huán)。3.2 無監(jiān)督學(xué)習(xí)聚類和降維是干什么用的和監(jiān)督學(xué)習(xí)不同無監(jiān)督學(xué)習(xí)面對的數(shù)據(jù)沒有標(biāo)簽?zāi)P鸵约簭臄?shù)據(jù)結(jié)構(gòu)中發(fā)現(xiàn)模式。這個概念一開始有點抽象我用最常見的兩個任務(wù)來講。聚類目標(biāo)是把相似的樣本聚成一組。舉個例子電商平臺并沒有給用戶打上“高價值/低價值”的標(biāo)簽但你希望做客戶分群。于是你用消費頻次、客單價、瀏覽深度這些特征讓算法自動把用戶分成幾簇。分完以后每簇用戶可能呈現(xiàn)出不同的行為畫像運營策略就能因人而異。K-Means 是最常用的聚類算法核心其實就是圓心 K 的取值你想聚成幾類。選 K 的方式可以看手肘法則也可以結(jié)合業(yè)務(wù)經(jīng)驗。降維目標(biāo)是壓縮特征維度。假設(shè)原始特征有 100 個里面大量冗余、彼此高度相關(guān)PCA 通過尋找數(shù)據(jù)方差最大的方向把 100 個特征壓成 5 個同時盡量保留原有信息。降維還有一個很實用的場景是可視化——把高維數(shù)據(jù)投影到二維平面人眼才能看到它的分布和簇結(jié)構(gòu)。無監(jiān)督學(xué)習(xí)有時被認(rèn)為是更貼近“數(shù)據(jù)挖掘”本意的技術(shù)。確實數(shù)據(jù)挖掘的起點往往就是沒有標(biāo)簽的數(shù)據(jù)你得先有探索性的理解才可能設(shè)計出更合理的特征和方案。入門階段至少要跑通一次 K-Means 和一次 PCA不是為了看效果有多好而是為了建立“從數(shù)據(jù)自身結(jié)構(gòu)里找規(guī)律”的感覺。3.3 一個完整數(shù)據(jù)挖掘項目的六個階段很多新手學(xué)到建模就停了以為拿到高準(zhǔn)確率就是整個項目的終點。真正讓數(shù)據(jù)挖掘產(chǎn)生業(yè)務(wù)價值行業(yè)里最經(jīng)典的流程框架叫 CRISP-DM中文常譯作“跨行業(yè)數(shù)據(jù)挖掘標(biāo)準(zhǔn)流程”它把項目切成了六個階段業(yè)務(wù)理解搞清楚要解決什么問題、價值在哪里。數(shù)據(jù)理解收集數(shù)據(jù)、初步探查、驗證數(shù)據(jù)質(zhì)量。數(shù)據(jù)準(zhǔn)備清洗、合并、構(gòu)造特征、處理缺失值。建模在干凈數(shù)據(jù)上訓(xùn)練多個候選模型。評估回到業(yè)務(wù)目標(biāo)判斷模型是否真的解決問題。部署把模型接入實際系統(tǒng)持續(xù)監(jiān)控效果。我用一個生活中的類比幫助記憶你在城市里找地方開咖啡店。業(yè)務(wù)理解是“確定該開在哪、服務(wù)誰”數(shù)據(jù)理解是“調(diào)查周邊人流、消費水平”數(shù)據(jù)準(zhǔn)備是“把各路信息整理成一張干凈的表”建模是“用不同策略評估候選位置”評估是“模擬利潤并實地復(fù)核”部署是“真的把店開起來并持續(xù)觀察”。在這個階段里新手最容易忽略的是“評估”和“部署”但這恰恰是項目能否落地的分水嶺。作為入門筆記我建議你在做任何練習(xí)項目時都按照這個框架寫一份簡短文檔把每個階段做了什么寫下來。哪怕只是給自己看它也能幫你建立完整的數(shù)據(jù)項目思維。4. 手把手實操跑通一個完整的分類項目4.1 環(huán)境準(zhǔn)備與數(shù)據(jù)集選擇實操前先把環(huán)境準(zhǔn)備好。我用的是 conda因為它能很方便地創(chuàng)建隔離環(huán)境避免不同項目之間的依賴沖突。打開終端執(zhí)行conda create -n ml_learning python3.10 conda activate ml_learning pip install notebook scikit-learn pandas matplotlib seaborn如果 conda 在某些網(wǎng)絡(luò)環(huán)境下安裝較慢你也可以換成 venv 配合 pip管理思路是一樣的只是命令略有差別。環(huán)境搞定之后在終端輸入 jupyter notebook 啟動交互環(huán)境就可以開始寫代碼了。這次使用的數(shù)據(jù)集是鳶尾花數(shù)據(jù)集 Iris。這是一個非常經(jīng)典的入門數(shù)據(jù)集三種鳶尾花各有若干樣本每個樣本有四個特征——花萼長度、花萼寬度、花瓣長度、花瓣寬度。目標(biāo)是根據(jù)這四個連續(xù)特征預(yù)測當(dāng)前樣本屬于哪一個品種。為什么選它來做第一個項目第一數(shù)據(jù)干凈、無缺失值不需要做復(fù)雜的清洗第二四維特征少而清晰畫圖就能直觀看到分布第三三個類別樣本數(shù)量均衡評估結(jié)果不容易被誤導(dǎo)第四scikit-learn 內(nèi)置了這個數(shù)據(jù)的讀取接口一行代碼就能加載省去下載和解析的麻煩。等你把這套流程跑熟了再切換到真實世界那些又臟又大的數(shù)據(jù)難度逐級提升才不會一開始就被勸退。4.2 數(shù)據(jù)探索先別建模好好看看數(shù)據(jù)很多人拿到數(shù)據(jù)就急著跑模型這是大忌。先花幾分鐘探查數(shù)據(jù)既能發(fā)現(xiàn)異常也能建立對問題的直覺。加載數(shù)據(jù)并轉(zhuǎn)成 DataFramefrom sklearn.datasets import load_iris import pandas as pd iris load_iris() df pd.DataFrame(iris.data, columnsiris.feature_names) df[species] iris.target_names[iris.target] print(df.head()) print(df.info()) print(df.describe())head() 讓你看到前五行知道數(shù)據(jù)長什么樣info() 顯示有沒有空值、每列的類型describe() 給出每列的均值、標(biāo)準(zhǔn)差、最小值、最大值等統(tǒng)計量。跑完之后你會發(fā)現(xiàn)花瓣長度和花瓣寬度的取值范圍明顯比花萼特征大最大值能到 6.9而花萼寬度的最小值是 2.0。這個觀察是一個信號暗示后面建模時要注意特征縮放。接著畫一張成對分布圖把四個特征兩兩組合不同品種用不同顏色標(biāo)出import seaborn as sns import matplotlib.pyplot as plt sns.pairplot(df, huespecies) plt.show()從這張圖里你能直觀看到山鳶尾和另外兩種花是混在一起還是分得很開。以我的經(jīng)驗Iris 的成對分布圖會呈現(xiàn)出一個很明顯的結(jié)論花瓣長度和花瓣寬度這兩個特征對區(qū)分品種貢獻(xiàn)最大而花萼寬度單獨使用時區(qū)分度很弱。這種直覺會直接影響你后續(xù)建模時的特征選擇也會讓你對模型能達(dá)到的準(zhǔn)確率有一個合理預(yù)期。4.3 建模與評估用KNN跑第一個模型數(shù)據(jù)探查結(jié)束可以建模了。我的第一個模型選 K 最近鄰也就是 KNN。理由不是它最強而是它直覺最好理解一個新樣本來了看看離它最近的 K 個已知樣本分別屬于哪一類哪個類別多新樣本就屬于哪個類。這個算法沒有復(fù)雜的訓(xùn)練過程非常適合用來理解“模型是怎么做預(yù)測”的。完整代碼如下from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier X df.iloc[:, :-1].values y iris.target X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state42 ) scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test) model KNeighborsClassifier(n_neighbors3) model.fit(X_train_scaled, y_train) acc model.score(X_test_scaled, y_test) print(f準(zhǔn)確率: {acc:.4f})有幾處細(xì)節(jié)需要特別說明。第一為什么劃分訓(xùn)練集和測試集test_size0.3 意味著 30% 的數(shù)據(jù)留作測試70% 參與訓(xùn)練。random_state 固定成 42是讓每次實驗的劃分結(jié)果一致方便復(fù)現(xiàn)。你看別人的學(xué)習(xí)筆記時如果對方不固定隨機種子你很難跑出完全一樣的結(jié)果。第二StandardScaler 的作用是讓每個特征變成均值 0、方差 1。KNN 依賴距離歐氏距離會被取值范圍大的特征主導(dǎo)不縮放的話花瓣特征的影響就被花萼長度蓋過去了。第三scaler 只在訓(xùn)練集上 fit測試集只做 transform。這個順序非常重要我在下一章會專門展開講為什么。正確執(zhí)行的情況下你在 Iris 上通常能得到 0.93 以上的準(zhǔn)確率。這三個類別在特征空間里本身區(qū)分度就高所以模型表現(xiàn)好并不意外。關(guān)鍵在于理解這個數(shù)字的含義它是模型在從未見過的測試樣本上的表現(xiàn)而不是在訓(xùn)練集上的自吹自擂。跑完分類你還可以順手把數(shù)據(jù)集切出一份做 K-Means 聚類或者用線性回歸預(yù)測一個連續(xù)變量練練手。不過第一步先把分類流程跑順貪多嚼不爛。5. 新手最容易踩的坑實操問題排查實錄5.1 數(shù)據(jù)泄漏一個偷看答案的習(xí)慣數(shù)據(jù)泄漏是新手最容易犯、也最不容易察覺的錯誤。最典型的表現(xiàn)是在劃分訓(xùn)練集和測試集之前就用全量數(shù)據(jù)做標(biāo)準(zhǔn)化、缺失值填充或者算了某些統(tǒng)計指標(biāo)。這樣一來測試集的信息在訓(xùn)練階段就泄露給了模型。相當(dāng)于考前老師把考卷答案也當(dāng)成例題講了考出來的分?jǐn)?shù)自然反映不了真實水平。正確做法永遠(yuǎn)是先劃分訓(xùn)練集和測試集再在訓(xùn)練集上 fit 預(yù)處理器最后應(yīng)用到測試集。對應(yīng)到代碼就是scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test)注意這里的差別fit_transform 只出現(xiàn)在訓(xùn)練集上測試集只用 transform。如果先對全量數(shù)據(jù) fit_transform 再拆分你得到的高分是虛高的。在真實項目上這種虛高帶來的后果更嚴(yán)重模型部署到線上后面對全新的數(shù)據(jù)表現(xiàn)會遠(yuǎn)遠(yuǎn)低于你在驗證時看到的指標(biāo)。養(yǎng)成“一切統(tǒng)計和擬合操作只基于訓(xùn)練集”的習(xí)慣是從新手走向合格工程師的重要一步。5.2 忘記特征縮放距離類模型的隱形殺手第二個坑和數(shù)據(jù)處理相關(guān)但沒那么容易察覺。KNN、SVM 這類基于距離的模型對特征尺度極其敏感。我見過不少同學(xué)跑 KNN 時不做標(biāo)準(zhǔn)化結(jié)果在 Iris 上的準(zhǔn)確率明顯下降。原因很好理解計算距離時取值范圍大的特征天然獲得更大權(quán)重模型幾乎被那一兩個特征牽著走。你可能會問那樹模型和線性回歸也需要縮放嗎決策樹和隨機森林不需要因為它們按特征分裂不依賴距離線性回歸在解釋系數(shù)時一般建議縮放否則系數(shù)之間不可比神經(jīng)網(wǎng)絡(luò)、KNN、SVM、PCA 則強烈依賴同一量綱。這是算法選型時必須記住的細(xì)節(jié)。怎么判斷一個模型是否需要特征縮放問自己一個問題這個模型的計算過程里有沒有用到距離、梯度、方差用到就得認(rèn)真考慮。最簡單省心的習(xí)慣是數(shù)值型特征先 StandardScaler再喂給模型除非你有明確理由不這樣做。5.3 只看準(zhǔn)確率類別不平衡下的評估誤區(qū)初學(xué)階段很多人習(xí)慣拿準(zhǔn)確率當(dāng)唯一指標(biāo)。準(zhǔn)確率確實直觀但在類別不均衡的場景下會極度誤導(dǎo)。舉一個極端例子假設(shè)欺詐交易只占全部交易的 1%你寫一個“永遠(yuǎn)預(yù)測正?!钡纳倒夏P蜏?zhǔn)確率照樣是 99%但它完全沒用因為真實欺詐一筆都沒抓到。這時候要用到一組更細(xì)的指標(biāo)精確率、召回率、F1 分?jǐn)?shù)。精確率回答的是“模型判定為欺詐的交易里有多少是真的欺詐”召回率回答的是“所有真實欺詐交易里模型抓到了多少”F1 是兩者的調(diào)和平均兼顧兩邊的表現(xiàn)。實際業(yè)務(wù)往往需要在兩率之間做權(quán)衡抓漏的代價高還是誤傷的代價高這個答案只有業(yè)務(wù)方知道模型自身不會告訴你。入門階段不要求你立刻精通全部評估指標(biāo)但至少要有這個意識準(zhǔn)確率不是萬能的要結(jié)合數(shù)據(jù)分布和業(yè)務(wù)目標(biāo)選擇合適的評估方式。另外還有一個高頻翻車點訓(xùn)練集表現(xiàn)很好測試集突然拉胯。這種時候多數(shù)是以下四種原因之一數(shù)據(jù)劃分泄漏、沒有做特征縮放、訓(xùn)練樣本太少、模型太復(fù)雜導(dǎo)致過擬合。照著這個清單逐條排查大多數(shù)“神奇翻車”都能定位到。6. 入門之后這條路還能往哪些方向走6.1 常用算法清單先認(rèn)識全貌再逐個擊破當(dāng)你跑通 KNN 之后可以按順序掃掉一批經(jīng)典算法。我整理了一張快速認(rèn)識的對照表算法任務(wù)類型一句話理解入門探索建議線性回歸回歸用一條超平面擬合數(shù)據(jù)先理解最小二乘損失邏輯回歸分類在回歸基礎(chǔ)上加 sigmoid 壓縮出概率理解輸出為什么在 0 到 1 之間決策樹分類/回歸按特征做一層層 if-then 判斷畫棵樹看每個節(jié)點怎么選特征隨機森林分類/回歸多棵決策樹投票或平均降低過擬合理解 Bagging 思想SVM分類找最大化間隔的分隔超平面先用線性核再感受核技巧K-Means聚類按距離把樣本分簇嘗試不同 K看分簇效果PCA降維找方差最大的若干方向投影結(jié)合可視化理解特征方向每一條都值得單獨花時間寫代碼跑一遍。我的經(jīng)驗是每學(xué)一個新算法就把它放到同一份數(shù)據(jù)集上跟舊模型對比看看差異在哪里。這樣你對算法的理解會比死背公式深刻得多。這個階段不追求調(diào)出最完美的模型而是建立“看到數(shù)據(jù)時能聯(lián)想到多種算法工具”的直覺。6.2 特征工程與模型調(diào)參真正拉開差距的地方不少入門者以為機器學(xué)習(xí)做到“調(diào)模型”就結(jié)束了事實恰恰相反真實項目里最耗時間的往往是特征工程而不是調(diào)參。特征工程是指從原始數(shù)據(jù)里構(gòu)造出更能刻畫業(yè)務(wù)規(guī)律的新特征。比如從時間戳里拆出“星期幾”從用戶行為序列里統(tǒng)計“最近 7 天購買次數(shù)”或者把類別型變量編碼成模型能處理的數(shù)值。同樣的算法特征工程做得好不好最終效果可能相差一個量級。這個環(huán)節(jié)考驗的主要是兩點一是對業(yè)務(wù)的理解二是對數(shù)據(jù)變換工具的熟練程度。入門時不要怕花時間把缺失值處理、類別編碼、數(shù)值分桶、時間特征拆解這四類操作練熟。調(diào)參方面入門階段建議直接用網(wǎng)格搜索系統(tǒng)性地找參數(shù)而不是靠感覺一個個試。例如在 KNN 上嘗試不同的 k 值和距離權(quán)重from sklearn.model_selection import GridSearchCV param_grid { n_neighbors: [3, 5, 7, 9], weights: [uniform, distance] } grid GridSearchCV(KNeighborsClassifier(), param_grid, cv5) grid.fit(X_train_scaled, y_train) print(grid.best_params_)GridSearchCV 會把參數(shù)組合全部試一遍并用交叉驗證選出一組最優(yōu)參數(shù)。這里的 cv5 表示把訓(xùn)練數(shù)據(jù)切成 5 份輪流用 4 份訓(xùn)練、1 份驗證。它的意義在于你選參數(shù)時不依賴某一次特定的數(shù)據(jù)劃分評估結(jié)果更穩(wěn)定。等你掌握了網(wǎng)格搜索再去理解隨機搜索、貝葉斯調(diào)參本質(zhì)上也只是搜索策略的優(yōu)化。核心思想始終是模型選擇要有評價依據(jù)不能拍腦袋。6.3 從結(jié)構(gòu)化數(shù)據(jù)走向深度學(xué)習(xí)傳統(tǒng)機器學(xué)習(xí)中的經(jīng)典算法最擅長處理的場景是結(jié)構(gòu)化表格數(shù)據(jù)。但當(dāng)數(shù)據(jù)切換成圖片、視頻、語音、長文本之后特征高度非結(jié)構(gòu)化手動設(shè)計特征的成本急劇上升這時神經(jīng)網(wǎng)絡(luò)這類能自動學(xué)習(xí)特征表達(dá)的模型就開始接管戰(zhàn)場。深度學(xué)習(xí)的進階路徑建議從多層感知機 MLP 起步。先理解神經(jīng)網(wǎng)絡(luò)如何通過一層層線性變換加非線性激活函數(shù)來逼近復(fù)雜函數(shù)然后過渡到卷積神經(jīng)網(wǎng)絡(luò) CNN處理圖像再到適合文本序列的 Transformer 結(jié)構(gòu)。這不是一篇入門筆記能展開的內(nèi)容但方向可以先立起來。對打算走數(shù)據(jù)挖掘路線的人我的建議是不用盲目追深度學(xué)習(xí)每一條最新進展先把經(jīng)典模型和數(shù)據(jù)處理能力練扎實。深度學(xué)習(xí)是工具經(jīng)典機器學(xué)習(xí)是地基。地基穩(wěn)了上層的新工具你學(xué)習(xí)起來會非常快地基不牢跑再多新模型也只是在別人的代碼上拼拼湊湊。整套筆記寫下來我最深的體會不是某個模型跑得有多準(zhǔn)而是“先跑通、再深入”這套學(xué)習(xí)方法真的對新手最友好。我后來再看自己這篇第一篇筆記仍然能回憶起當(dāng)年踩坑時的抓狂但現(xiàn)在回看那些坑恰恰是理解模型評估和數(shù)據(jù)處理的入口。如果你也在學(xué)機器學(xué)習(xí)我建議你不妨也把學(xué)過的內(nèi)容寫成文字。寫出來是一個很強的信號代表你不僅有“我懂了”的錯覺還能把它講清楚讓一個完全沒接觸過的人照著做也能跑出結(jié)果。這種能力比單獨記住某個算法的公式值錢得多。