返回文章列表

機器學習入門與Scikit-Learn應用

本文介紹機器學習的基本概念,包含監督式學習、非監督式學習和強化學習,並搭配 Scikit-Learn 程式碼範例說明如何在 Python 中實作這些演算法。同時,文章也涵蓋了機器學習的分類別、資料集結構、特徵矩陣、Scikit-Learn 的 Estimator API 等重要概念,提供讀者一個機器學習的入門

機器學習 Python

機器學習的核心目標是讓電腦從資料中學習模式並做出預測。依據學習方式的不同,機器學習主要分為監督式學習、非監督式學習和強化學習。監督式學習利用已標記的資料訓練模型,例如預測房價或辨識圖片中的物體。非監督式學習則使用未標記的資料,例如客戶分群或降維。強化學習則讓代理人透過與環境互動學習最佳策略,常見於遊戲或機器人控制。瞭解這些基本概念有助於選擇合適的演算法解決實際問題。程式碼範例中展示瞭如何使用 Scikit-Learn 載入資料集、進行資料預處理、訓練模型以及應用模型進行預測。

什麼是機器學習?

機器學習是一個廣泛的領域,主要涉及使用演算法來檢測資料集中的模式,並從中學習以進行推斷。這個領域不僅僅是一個技術工具,而是一種思考資料和模型的方式。在本章中,我們將探討機器學習的基本概念和術語,包括監督式學習、無監督式學習和強化學習等。

機器學習的類別

機器學習可以根據其應用和目標進行分類別。以下是幾種常見的類別:

  • 監督式學習:這種學習方式涉及使用標記過的資料來訓練模型,以便它可以對新資料進行預測。
  • 無監督式學習:這種學習方式涉及使用未標記的資料來發現資料中的模式和結構。
  • 強化學習:這種學習方式涉及使用代理人在環境中進行試驗和錯誤,以學習如何做出最佳決策。

監督式學習

監督式學習是機器學習中的一種基本方法,涉及使用標記過的資料來訓練模型,以便它可以對新資料進行預測。這種方法通常用於分類別和迴歸任務中。

# 範例:使用 Scikit-Learn 進行監督式學習
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

# 載入 iris 資料集
iris = load_iris()
X = iris.data
y = iris.target

# 將資料分割為訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 建立邏輯迴歸模型
model = LogisticRegression(max_iter=1000)

# 訓練模型
model.fit(X_train, y_train)

# 使用模型進行預測
y_pred = model.predict(X_test)

無監督式學習

無監督式學習是機器學習中的一種方法,涉及使用未標記的資料來發現資料中的模式和結構。這種方法通常用於聚類別和維度降低任務中。

# 範例:使用 Scikit-Learn 進行無監督式學習
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans

# 載入 iris 資料集
iris = load_iris()
X = iris.data

# 建立 K-means 模型
model = KMeans(n_clusters=3)

# 訓練模型
model.fit(X)

# 使用模型進行預測
labels = model.labels_

強化學習

強化學習是機器學習中的一種方法,涉及使用代理人在環境中進行試驗和錯誤,以學習如何做出最佳決策。這種方法通常用於遊戲和控制任務中。

# 範例:使用 Gym 進行強化學習
import gym

# 建立環境
env = gym.make('CartPole-v1')

# 建立代理人
agent =...

# 訓練代理人
for episode in range(1000):
    state = env.reset()
    done = False
    rewards = 0.0
    while not done:
        action = agent.act(state)
        state, reward, done, _ = env.step(action)
        rewards += reward
    print(f'Episode {episode+1}, Reward: {rewards:.2f}')
圖表翻譯:

此圖表示了機器學習的不同類別及其應用領域。

機器學習的類別

機器學習可以分為兩大類別:監督式學習和非監督式學習。

監督式學習涉及建立資料的特徵與標籤之間的關係模型;一旦這個模型被確定,就可以用來對新資料進行標籤。這種學習方式可以進一步分為分類別任務和迴歸任務:在分類別中,標籤是離散的類別,而在迴歸中,標籤是連續的數值。

非監督式學習則涉及對資料的特徵進行建模,而不參考任何標籤。這類別模型包括聚類別和維度降低等任務。聚類別演算法用於識別資料中的不同群組,而維度降低演算法則用於尋找資料的更簡潔的表示形式。

此外,還有一種叫做半監督式學習的方法,它介於監督式學習和非監督式學習之間。半監督式學習方法通常在只有部分標籤可用的情況下很有用。

機器學習的質性例子

分類別:預測離散標籤

首先,我們來看一個簡單的分類別任務。在這個任務中,我們給定一組已標籤的資料點,並希望使用這些資料點來對新資料點進行分類別。

假設我們有一組二維資料,如圖37-1所示。這個資料集包含兩個特徵(x和y座標)和一個標籤(紅色或藍色)。我們希望建立一個模型,能夠根據這些特徵和標籤,對新資料點進行分類別。

有一種可能的模型是假設兩個群組可以透過一條直線分隔,這樣所有在直線一側的點都屬於同一類別。這個模型是一個簡單的線性分類別器,它假設資料可以被一條直線分隔成兩個類別。

迴歸:預測連續標籤

接下來,我們來看一個簡單的迴歸任務。在這個任務中,我們給定一組資料點,每個點都有一個連續的標籤。

假設我們有一組二維資料,如圖37-4所示。這個資料集包含兩個特徵(x和y座標)和一個連續的標籤(顏色)。我們希望建立一個模型,能夠根據這些特徵和標籤,對新資料點進行預測。

有一種可能的模型是假設如果我們將標籤視為第三個空間維度,我們可以對資料進行平面擬合。這是一個簡單的線性迴歸模型,它假設資料可以被一條平面分隔成不同的區域。

機器學習演算法

我們將在後面的章節中更詳細地討論一些重要的機器學習演算法,包括高斯樸素貝葉斯、支援向量機和隨機森林等。

什麼是無監督學習?

無監督學習是一種機器學習方法,涉及描述資料而不參考任何已知標籤。它與監督學習不同,監督學習試圖根據現有資料建立預測模型。

什麼是叢集分析?

叢集分析是一種無監督學習技術,自動將資料分配到多個離散群組中。例如,假設我們有一些二維資料,叢集模型可以使用資料的內在結構來確定哪些點相關。

什麼是K-means演算法?

K-means是一種快速且直觀的叢集演算法,適應k個叢集中心;最佳中心假設為最小化每個點到其分配中心的距離。這種演算法可以用於從資料中提取有用的資訊,即使是在高維空間中。

什麼是高斯混合模型和譜聚類別?

高斯混合模型和譜聚類別是其他重要的叢集演算法。高斯混合模型使用多個高斯分佈來模擬資料,而譜聚類別則使用圖論技術來識別叢集。

什麼是降維?

降維是一種無監督演算法,從資料本身推斷標籤或其他資訊。它試圖提取資料的低維表示,保留資料集的相關品質。不同的降維例程以不同的方式測量這些相關品質。

什麼是Isomap演算法?

Isomap是一種流形學習演算法,可以檢測資料中的非線性嵌入結構。它可以將高維資料對映到低維空間,保留資料的內在結構。

什麼是主成分分析和區域性線性嵌入?

主成分分析和區域性線性嵌入是其他重要的降維演算法。主成分分析使用正交變換來轉換資料,而區域性線性嵌入則使用圖論技術來保留資料的區域性結構。

降維的應用

降維技術可以用於視覺化高維資料,例如具有100或1000個特徵的資料集。透過將資料降維到2或3個維度,可以更容易地管理和理解複雜的資料集。

機器學習簡介

機器學習是一種人工智慧的分支,旨在讓電腦系統從資料中學習,並能夠對未來的資料做出預測或分類別。簡單來說,機器學習的目標是訓練機器能夠從經驗中學習,並改善其效能。

監督式學習

監督式學習是一種機器學習方法,指的是使用已標記的訓練資料來訓練模型,以便能夠對新資料進行預測或分類別。例如,手寫字辨識、影像分類別等都屬於監督式學習。

分類別

分類別是一種監督式學習方法,目的是將資料分成不同的類別。例如,將手寫字分成不同的字母或數字。

迴歸

迴歸是一種監督式學習方法,目的是預測連續值。例如,預測房價或股票價格。

非監督式學習

非監督式學習是一種機器學習方法,指的是使用未標記的資料來訓練模型,以便能夠發現資料中的模式或結構。例如,客戶分群或降維等都屬於非監督式學習。

叢集

叢集是一種非監督式學習方法,目的是將資料分成不同的群組。例如,將客戶分成不同的群組以便進行市場推廣。

降維

降維是一種非監督式學習方法,目的是將高維度的資料轉換成低維度的資料,以便能夠更容易地分析和視覺化。

Scikit-Learn簡介

Scikit-Learn是一個Python的機器學習函式庫,提供了許多常用的機器學習演算法和工具。Scikit-Learn的特點包括統一的API、簡潔的語法和高效的演算法。

Scikit-Learn的優點

Scikit-Learn的優點包括:

  • 統一的API:Scikit-Learn提供了一個統一的API,使得使用者可以輕鬆地切換不同的模型和演算法。
  • 簡潔的語法:Scikit-Learn的語法簡潔易懂,使得使用者可以快速地上手。
  • 高效的演算法:Scikit-Learn提供了許多高效的演算法,使得使用者可以快速地處理大規模的資料。

資料表示

在Scikit-Learn中,資料通常被表示為表格。表格是一個二維的資料結構,其中每一行代表一個資料點,每一列代表一個特徵。

表格的優點

表格的優點包括:

  • 簡潔的表示:表格提供了一個簡潔的方式來表示資料,使得使用者可以快速地理解和分析資料。
  • 高效的儲存:表格可以高效地儲存資料,使得使用者可以快速地存取和操作資料。

Iris資料集

Iris資料集是一個常用的機器學習資料集,包含了150個不同類別的花朵的特徵。下面是如何使用Seaborn函式庫載入Iris資料集:

import seaborn as sns

iris = sns.load_dataset('iris')

資料前處理

在進行機器學習之前,通常需要對資料進行前處理,以便能夠得到高品質的資料。下面是如何使用Pandas函式庫進行資料前處理:

import pandas as pd

# 載入資料
iris = pd.read_csv('iris.csv')

# 檢視資料前幾行
print(iris.head())

圖表翻譯:

內容解密:

以上程式碼示範瞭如何使用Seaborn函式庫載入Iris資料集,並使用Pandas函式庫進行資料前處理。其中,sns.load_dataset('iris')用於載入Iris資料集,pd.read_csv('iris.csv')用於載入CSV檔案,iris.head()用於檢視資料前幾行。

資料集的結構和特徵

在進行資料分析和機器學習任務時,瞭解資料集的結構和特徵是非常重要的。一般來說,資料集可以被視為一個二維陣列或矩陣,其中每一行代表一個樣本(sample),每一列代表一個特徵(feature)。

樣本和特徵

在上述的 Iris 資料集中,每一行代表一個觀察到的花朵,資料行的數量代表了資料集中花朵的總數。在這種情況下,資料行被稱為樣本,資料行的數量被稱為 n_samples。同樣地,每一列代表了一個描述每個樣本的量化資訊,例如花瓣的長度和寬度等,這些列被稱為特徵,列的數量被稱為 n_features

特徵矩陣

特徵矩陣是一個二維陣列,形狀為 [n_samples, n_features],它包含了所有樣本的特徵資訊。這個矩陣通常被儲存在一個名為 X 的變數中。特徵矩陣可以是 NumPy 陣列、Pandas DataFrame 或 SciPy 稀疏矩陣等形式。

標籤陣列

除了特徵矩陣外,我們還需要一個標籤陣列(target array),它通常是一維陣列,長度為 n_samples,包含了每個樣本的標籤或類別資訊。標籤陣列可以是連續的數值,也可以是離散的類別標籤。

資料視覺化

使用 Seaborn 等資料視覺化工具,可以方便地視覺化資料集。例如,對於 Iris 資料集,可以使用 pairplot 函式來視覺化不同特徵之間的關係,以及不同類別之間的差異。

資料預處理

在使用 Scikit-Learn 進行機器學習任務時,需要從 DataFrame 中提取出特徵矩陣和標籤陣列。這可以透過 Pandas DataFrame 的操作來實作,例如使用 drop 方法刪除不需要的列,然後使用 shape 屬性來檢視提取出的特徵矩陣的形狀。

import pandas as pd
from sklearn.datasets import load_iris
import seaborn as sns
import matplotlib.pyplot as plt

# 載入 Iris 資料集
iris = load_iris()
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df['species'] = iris.target

# 視覺化資料集
plt.figure(figsize=(10, 8))
sns.pairplot(df, hue='species', height=1.5)

# 提取特徵矩陣和標籤陣列
X = df.drop('species', axis=1)
y = df['species']

print(X.shape)

這段程式碼載入了 Iris 資料集,視覺化了資料集,然後提取出了特徵矩陣和標籤陣列。最後,它列印預出了特徵矩陣的形狀。

Scikit-Learn 的 Estimator API 基礎

Scikit-Learn 的 Estimator API 是一個強大的工具,讓使用者可以輕鬆地使用各種機器學習演算法。為了確保使用者能夠順暢地使用這個 API,Scikit-Learn 的開發者制定了一些指導原則。

一致性

所有物件都分享一個共同的介面,這個介面是由一組有限的方法所組成,並且具有統一的檔案說明。這樣可以讓使用者更容易地學習和使用不同的演算法。

檢視

所有指定的引數值都被公開為公有屬性,這樣使用者可以輕鬆地檢視和修改這些引數。

有限的物件階層

只有演算法被表示為物件;資料集則被表示為標準格式(例如 NumPy 陣列、Pandas DataFrame 物件、SciPy 稀疏矩陣),並且引數名稱使用標準的 Python 字串。

組合

許多機器學習任務都可以被表示為一系列更基本的演算法,Scikit-Learn 在可能的情況下都使用了這種方法。

合理的預設值

當模型需要使用者指定引數時,該函式庫會定義一個適合的預設值。

Estimator API 的基礎

使用 Scikit-Learn 的 Estimator API 時,通常需要遵循以下步驟:

  1. 選擇模型類別:根據您的需求選擇一個合適的模型類別。
  2. 選擇模型超引數:根據您的需求選擇模型的超引數。
  3. 組織資料:將您的資料組織成特徵矩陣和目標向量。
  4. 訓練模型:使用您的資料訓練模型。
  5. 應用模型:將模型應用於新的資料中。

監督學習

在監督學習中,我們通常使用 predict 方法來預測未知資料的標籤。

非監督學習

在非監督學習中,我們通常使用 transformpredict 方法來轉換或推斷資料的屬性。

實際應用

Scikit-Learn 的 Estimator API 提供了一個一致的介面,讓使用者可以輕鬆地使用各種機器學習演算法。透過瞭解這個 API 的基礎和指導原則,使用者可以更有效地使用 Scikit-Learn 來解決機器學習問題。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 機器學習入門與Scikit-Learn應用

package "學習類型" {
    component [監督式學習] as supervised
    component [非監督式學習] as unsupervised
    component [強化學習] as reinforcement
}

package "Scikit-Learn流程" {
    component [載入資料集] as load_data
    component [train_test_split] as split
    component [特徵矩陣 X] as feature_x
    component [標籤向量 y] as label_y
}

package "Estimator API" {
    component [model.fit()] as fit
    component [model.predict()] as predict
    component [model.score()] as score
}

package "常用演算法" {
    component [LogisticRegression] as lr
    component [KMeans聚類] as kmeans
    component [PCA降維] as pca
}

supervised --> lr : 分類/迴歸
unsupervised --> kmeans : 聚類
unsupervised --> pca : 降維

load_data --> split : 分割
split --> feature_x
split --> label_y
feature_x --> fit
label_y --> fit
fit --> predict
predict --> score

note right of fit : 訓練模型
note right of predict : 預測新資料
note right of kmeans : n_clusters參數

@enduml

圖表翻譯:

上述流程圖展示了使用 Scikit-Learn 的 Estimator API 的基本步驟。從選擇模型類別開始,然後選擇模型超引數,組織資料,訓練模型,最後應用模型於新的資料中。這個流程提供了一個清晰的一致的介面,讓使用者可以輕鬆地使用各種機器學習演算法。

從技術架構視角來看,機器學習的核心價值在於其提供從資料中學習並進行推斷的能力,涵蓋監督式學習、無監督式學習和強化學習等不同方法。監督式學習利用標記資料訓練模型進行預測,無監督式學習則探索未標記資料的模式和結構,而強化學習則讓代理人透過與環境互動學習最佳決策。然而,模型的選擇、超引數調整以及資料預處理等步驟仍存在挑戰,需要根據具體應用場景進行最佳化。對於追求高效能的應用,深入理解各演算法的特性和限制至關重要,例如 K-means 演算法對初始值敏感,高斯混合模型則需要仔細選擇高斯分佈的數量。展望未來,AutoML 技術的發展有望降低機器學習的應用門檻,自動化模型選擇和超引數調整等流程,讓更多開發者能將機器學習技術整合至應用中。玄貓認為,持續關注機器學習領域的新技術和最佳實務,才能有效利用其潛力,並在資料驅動的時代保持競爭優勢。