引言:初識 Scikit-Learn
Scikit-learn 是 Python 機器學習領域的黃金標準庫。它構建在 NumPy, SciPy 和 Matplotlib 之上,提供了大量用于分類、回歸、聚類和降維等任務的算法。Scikit-learn 廣受歡迎的原因在于其三大核心優勢:
- 一致的 API 設計: 幾乎所有的算法都遵循相同的、簡潔的接口模式,使得學習和應用新模型變得非常容易。
- 豐富的算法選擇: 涵蓋了從經典的線性模型到強大的集成方法等絕大多數機器學習算法。
- 強大的生態集成: 與 NumPy 數組和 Pandas DataFrame 無縫集成,是整個 Python 數據科學生態的核心組件之一。
本篇的目標是帶領您走完使用 Scikit-learn 構建一個完整機器學習模型的全過程,讓您親身體驗其簡潔與強大,并為后續更復雜的項目建立信心。
Scikit-Learn 的核心 API 模式
Scikit-learn 的設計哲學是“一致性”。一旦你掌握了一個模型的使用方法,你就幾乎掌握了所有模型的使用方法。這個通用的模式可以概括為以下幾個步驟,我們稱之為“Estimator API”:
-
選擇模型類 (Choose a model)
從 Scikit-learn 的模塊中導入你需要的模型類。例如,from sklearn.tree import DecisionTreeClassifier
。 -
實例化模型 (Instantiate the model)
創建該模型類的一個實例,并可以設置其超參數(Hyperparameters)。超參數是模型在學習前設置的參數,例如決策樹的最大深度。# 超參數 max_depth=3 在實例化時設置 model = DecisionTreeClassifier(max_depth=3)
-
擬合模型 (Fit the model)
使用訓練數據來訓練模型。這一步通過調用模型的.fit()
方法完成,傳入訓練集的特征X_train
和標簽y_train
。model.fit(X_train, y_train)
-
預測 (Predict)
使用訓練好的模型對新數據(通常是測試集)進行預測。這一步通過調用.predict()
方法完成,傳入測試集的特征X_test
。predictions = model.predict(X_test)
-
評估 (Evaluate)
比較模型的預測結果和真實的測試集標簽,以評估模型性能。這通常通過調用.score()
方法或使用sklearn.metrics
模塊中的函數來完成。accuracy = model.score(X_test, y_test)
這個“導入-實例化-擬合-預測-評估”的流程是 Scikit-learn 的核心。掌握了這個模式,你就掌握了使用 Scikit-learn 的鑰匙,可以輕松地在不同算法之間切換和實驗。
你的第一個模型:決策樹分類器實戰
為了專注于 Scikit-learn 的工作流程,我們將使用一個簡單且干凈的內置數據集——鳶尾花(Iris)數據集。這是一個典型的多分類問題,我們的任務是根據四個特征(花萼長度、花萼寬度、花瓣長度、花瓣寬度)來預測鳶尾花的種類。
步驟 1: 導入庫并加載數據
首先,我們導入所有需要的庫和函數,并加載 Iris 數據集。load_iris()
函數返回一個類似字典的對象,其中 .data
屬性是特征數據,.target
屬性是標簽數據。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score# 加載數據集
iris = load_iris()
X = iris.data # 特征矩陣
y = iris.target # 標簽向量
步驟 2: 劃分訓練集和測試集
遵循我們在上一篇文章中學到的原則,我們使用 train_test_split
函數將數據劃分為訓練集和測試集,通常將 30% 的數據作為測試集。random_state
參數用于確保每次運行代碼時,隨機劃分的結果都是一樣的,這對于結果復現很重要。
# 劃分數據,70% 用于訓練,30% 用于測試
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)print(f"訓練集大小: {X_train.shape}, 測試集大小: {X_test.shape}")
步驟 3 & 4: 實例化并訓練模型
現在我們應用 Scikit-learn 的核心 API 模式。我們選擇 DecisionTreeClassifier
作為我們的模型,創建一個實例,然后用訓練數據 .fit()
它。
# 1. 實例化決策樹分類器
clf = DecisionTreeClassifier()# 2. 使用訓練數據訓練模型
clf.fit(X_train, y_train)
步驟 5: 進行預測
模型訓練好之后,我們用它來對測試集 X_test
進行預測。
# 對測試集進行預測
y_pred = clf.predict(X_test)
步驟 6: 評估模型
最后一步是評估模型的性能。我們將模型預測的 y_pred
與真實的測試集標簽 y_test
進行比較。對于分類問題,最直觀的評估指標是準確率 (Accuracy),即正確預測的樣本占總樣本的比例。
# 計算并打印模型的準確率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型準確率: {accuracy:.2f}")
運行代碼后,你可能會看到一個接近 1.00
的準確率,這表明我們的簡單決策樹模型在這個問題上表現得非常好。
結果解讀
準確率為 1.00 意味著我們的模型在測試集上正確預測了所有樣本的類別。雖然這是一個非常理想的結果,但在更復雜、更“臟”的真實世界數據集中,達到這樣的性能是罕見的。
注意:準確率雖然直觀,但并非總是最佳的評估指標,尤其是在處理類別不平衡的數據集時。在后續的項目中,我們將接觸到更多評估指標,如精確率 (Precision)、召回率 (Recall) 和 F1 分數 (F1-score)。
總結與展望
恭喜!您已經成功地使用 Scikit-learn 構建、訓練并評估了您的第一個機器學習模型。您不僅完成了一個完整的流程,更重要的是,您掌握了 Scikit-learn 通用的 Estimator API,這為您探索更多高級算法鋪平了道路。
現在,您已經具備了數據處理、可視化和基礎建模的能力。是時候將這些技能整合起來,挑戰一個更真實、更復雜的項目了。在下一篇文章中,我們將踏上泰坦尼克號的航程,運用目前所學的一切,預測這艘傳奇巨輪上的生還者。