# 章節1 : 介紹
## AI vs ML vs DL
人工智慧 (AI):
AI的全寫是artificial intelligence。
目標是使機器擁有智慧,能夠像人類一樣進行智能活動。
希望機器能夠處理繁雜的任務,提高效率。
機器學習 (ML):
ML的全寫是machine learning。
機器學習是實現人工智慧的方法之一。
透過讓機器從過去儲存的資料中學習,找出規則。
用簡單的一句話概括:從資料中找出規則。
深度學習 (DL):
DL的全寫是deep learning。
是機器學習的一種方法,模仿人類大腦的神經網路。
透過類神經網路從資料中找出規則。
類神經網路:
DL中使用的一種神經網路結構,模仿人腦神經元的運作方式。
總結圖解:
人工智慧(AI)是目標,機器學習(ML)是實現方法之一,而深度學習(DL)是機器學習的一種技術,利用類神經網路來從資料中學習規則。
## 機器如何學習?
機器學習過程:
* 機器學習是透過數學技巧與程式,讓機器從資料中找出規則。
* 模型是機器學習的工具,可以視為程式加上數學技巧的組合。
監督式學習範例:
* 以狗貓辨識為例,將圖片資料輸入模型,模型根據反饋進行修正。
* 透過反覆的訓練,使模型學會區分狗和貓的特徵。
特徵與標籤:
* 在房價預測例子中,坪數、位置、房間數是特徵。
* 房價是標籤,機器學習的目標是由特徵預測標籤。
模型訓練:
* 模型一開始是無知的,透過不斷輸入特徵與標籤進行修正。
* 修正的過程就是模型學習的過程,直到模型預測與真實標籤的誤差達到一定範圍。
未來預測:
* 訓練好的模型可以應用在未知資料上,進行預測。
特徵與標籤的擴充:
擴充特徵可以提高模型的預測能力,例如在房價預測中除了坪數外還考慮位置、房間數等。
機器學習的應用:
在不同領域應用機器學習,透過資料訓練模型解決問題。
## 環境建置(colab)
Google Colab 簡介:
* 免費的Python撰寫環境,由Google提供。
* 可在瀏覽器中快速簡單地撰寫Python程式。
環境建置步驟:
* 登錄Google帳號,進入雲端硬碟。
* 新增Google Colab應用程式。
* 安裝Colab應用程式。
* 創建Colab筆記本,修改檔案名稱與設定環境。
* 連線到Colab,分配資源。
Colab介面功能:
* 編輯器可分為程式碼和文字格子。
* 可隨時新增、刪除格子。
* 提供免費GPU和TPU運算資源,可在筆記本設定中啟用。
程式碼與文字格子:
* 程式碼格子用於撰寫Python程式,可執行並顯示結果。
* 文字格子用於添加說明、筆記或Markdown格式文字。
硬體加速:
* Colab提供GPU和TPU加速,可在筆記本設定中選擇啟用。
GPU資訊查看:
* 使用 !nvidia-smi 可查看Colab分配的GPU資訊。
---
# 章節2 : 簡單線性回歸 Simple Linear Regression
## 介紹
簡單線性回歸 (Simple Linear Regression):
數學技巧,用於找出兩變數之間的線性關係。
主要應用在預測或模型建立的場景。
以一條直線表示兩變數之間的關係。
狀況描述:
假設為一新創公司老闆,欲聘請第一位員工,但薪水不確定。
收集同職位人的年資與對應薪水,用散點圖表示。
資料呈現:
X軸為年資,Y軸為月薪。
每個散點表示收集到的資料。
問題情境:
第一位員工年資為2.5年,老闆欲預測應給多少薪水。
簡單線性回歸的表示式:
一條直線表示為 y = w * x + b。
其中,y 為月薪,x 為年資,w 為斜率,b 為截距。
找出最適合的直線:
目標是找到最適合的 w 和 b 來表示資料的線性關係。
實作流程:
將不同的 w 和 b 帶入式子,觀察生成的直線效果。
最適合的直線:
透過數學方法找到最能擬合資料的 w 和 b。
結果解釋:
當找到最適合的 w 和 b 後,可將員工的年資帶入,預測應給的薪水。
## y = w*x + b
資料讀取:
* 使用 Pandas 模組,將資料讀取進來。
* Pandas 是一個強大的資料處理工具,預設在 Colab 中已安裝。
資料呈現:
* 使用 Matplotlib 的 Pyplot,將數據以散點圖表示。
* 利用 scatter 函數,可以自由設定點的樣式和顏色。
中文顯示支援:
* 下載中文字體並加入 Matplotlib,使得圖表上的中文能正確顯示。
* 使用中文標題、標籤等,需要額外設定字體。
簡單線性回歸表示式:
* 一條直線在數學上可以表示為 y=w⋅x+b。
* y 為預測的值,x 為特徵(此處為年資),w 為權重(斜率),b 為截距。
圖表設定:
* 設定圖表標題、x軸、y軸的標籤,以及圖例。
動態調整線條參數:
* 使用 ipywidgets 中的 interact 函數實現互動元件。
* 通過互動元件動態調整線性回歸的權重 w 和截距 b。
線性回歸模型呈現:
* 將線性回歸模型的預測線與真實數據以互動方式呈現。
* 觀察 w 與 b 值的變化對預測直線的影響。
## 最適合資料的直線?
目標: 我們的目標是找到一條直線,使其能夠最好地擬合或表示給定的資料集。
適合程度的評分: 我們介紹了用於評估直線與真實資料的適合程度的評分方法。這是透過計算每個資料點到直線的距離,然後取平方,最後將所有距離平方加總。
成本函數(Cost Function): 為了找到最適合的直線,我們引入了成本函數,也被稱為損失函數。這是一個衡量模型預測與實際資料之間差異的指標。在線性回歸中,常用的成本函數是平方誤差,其公式為 (實際值 - 預測值)^2。
最小化成本: 我們的目標是找到成本函數的最小值。通過調整直線的參數(斜率 w 和截距 b),我們追求成本函數的最小值,這意味著模型能夠更好地擬合資料。
視覺化成本函數: 我們展示了成本函數在不同參數(w 和 b)值下的三維圖形。我們尋找這個圖形上的最低點,即成本最小的位置,以找到最適合資料的直線。
梯度下降: 這是一種優化算法,用於自動調整模型參數以最小化成本函數。梯度下降的目標是沿著成本函數的反方向更新參數,以逐步接近最小值。
## 成本函數 Cost Function
這一段程式碼主要是實作成本函數(Cost Function)。以下是整理與補充:
### 資料讀取:
```python
# 在 Colab 中讀取資料,先複製之前的資料讀取程式碼
```
### 實作 Cost Function:
```python
# 定義預測值 y_pred = w * x + b,並先假設 w=10, b=0
w = 10
b = 0
y_pred = w * x + b
# 計算成本函數(Mean Squared Error)
cost = ((y - y_pred) 2).sum() / len(x)
print(cost)
```
### 將成本函數寫成函式:
```python
def compute_cost(x, y, w, b):
y_pred = w * x + b
cost = ((y - y_pred) 2).sum() / len(x)
return cost
```
### 實際呼叫 compute_cost 函式:
```python
xy = ...
cost_value = compute_cost(xy[0], xy[1], 10, 0)
print(cost_value)
```
### 計算不同 w 值對應的 cost:
```python
# 假設 b 固定為 0,計算 w 從 -100 到 100 之間的 cost
costs = []
for w_val in range(-100, 101):
cost_val = compute_cost(xy[0], xy[1], w_val, 0)
costs.append(cost_val)
# 顯示 w 對應的 cost
plt.scatter(range(-100, 101), costs)
plt.title("Cost vs. w (b=0)")
plt.xlabel("w")
plt.ylabel("Cost")
plt.show()
```
### 3D 成本函數圖:
```python
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
# 設定 w, b 的範圍
ws = np.arange(-100, 101, 1)
bs = np.arange(-100, 101, 1)
# 初始化成本矩陣
costs = np.zeros((len(ws), len(bs)))
# 計算成本函數值
for i, w_val in enumerate(ws):
for j, b_val in enumerate(bs):
costs[i, j] = compute_cost(xy[0], xy[1], w_val, b_val)
# 繪製 3D 圖
fig = plt.figure(figsize=(7, 7))
ax = fig.add_subplot(111, projection='3d')
b_grid, w_grid = np.meshgrid(bs, ws)
ax.plot_surface(w_grid, b_grid, costs, cmap='spectral_r', alpha=0.7)
# 設定標題、標籤、透明度等
ax.set_title("w, b vs. Cost")
ax.set_xlabel("w")
ax.set_ylabel("b")
ax.set_zlabel("Cost")
ax.view_init(45, -120) # 調整視角
plt.show()
```
### 找到最小成本的 w, b 值:
```python
min_cost = np.min(costs)
w_index, b_index = np.where(costs == min_cost)
min_w = ws[w_index[0]]
min_b = bs[b_index[0]]
print(f"Minimum cost: {min_cost}, w: {min_w}, b: {min_b}")
```
### 在 3D 圖上標註最小成本的點:
```python
fig = plt.figure(figsize=(7, 7))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(w_grid, b_grid, costs, cmap='spectral_r', alpha=0.7)
ax.scatter(min_w, min_b, min_cost, color='red', s=40) # 標註最小成本的點
ax.set_title("w, b vs. Cost")
ax.set_xlabel("w")
ax.set_ylabel("b")
ax.set_zlabel("Cost")
ax.view_init(45, -120)
plt.show()
```
### 調整圖的大小:
```python
plt.figure(figsize=(7, 7))
# ... (其他畫圖的程式碼)
plt.show()
```
## 怎麼有效率的找出w b
背景介紹
* 在機器學習中,我們通常需要找到一組權重(w)和偏差(b),以最小化成本函數(cost function)。
* 先前的方法是暴力破解,窮舉各種權重和偏差的組合,計算其成本,然後選擇最小成本的組合。
梯度下降概念
* 梯度下降(Gradient Descent) 是一種通用的最佳化算法,目的是最小化一個可微分函數。
* 通常應用於找到最小化成本函數的權重和偏差。
基本原理
* 根據函數的斜率(梯度)調整參數,以降低函數值。
* 使用函數對權重和偏差的偏導數,即梯度,來引導更新。
單變數梯度下降
* 以單一權重為例,計算函數對其的偏導數,得到斜率。
* 利用斜率調整權重,重複迭代直到找到最小值。
學習率(Learning Rate)
* 學習率是控制每次更新步伐大小的超參數。
* 學習率過大可能導致跳過最小值,過小可能收斂速度過慢。
多變數梯度下降
* 考慮多個權重和偏差時,計算各自的梯度,同時更新。
* 透過偏導數的計算,可找到多維空間中的最小值。
收斂判斷
* 當梯度接近零時,表示可能接近最小值,更新變化較小。
算法流程
* 隨機初始化權重和偏差。
* 計算成本函數。
* 計算權重和偏差的梯度。
* 更新權重和偏差。
* 重複迭代直到滿足停止條件。
梯度下降的挑戰
* 選擇適當的學習率。
* 避免陷入局部最小值。
* 適當的特徵縮放。
優化方法
* 隨機梯度下降(Stochastic Gradient Descent):使用隨機樣本進行更新。
* 小批次梯度下降(Mini-batch Gradient Descent):結合批次更新和隨機梯度下降。
結語
* 梯度下降是一種有效率的優化方法,用於機器學習模型的權重和偏差調整,以最小化成本函數。適當的學習率的選擇尤為重要,需要根據問題特點進行調整。
## 梯度下降 Gradient Descent (part1)
1. 梯度下降基本概念:
* 目標: 最小化(或最大化)成本函數(損失函數)。
* 核心思想: 沿著梯度的反方向進行迭代,以找到函數的極小值。
2. 主要元素:
* 參數(Parameters): 模型中需要優化的權重(weights)和偏差(bias)。
* 成本函數(Cost Function): 衡量模型預測與實際值之間的差異,越小越好。
* 學習率(Learning Rate): 控制每次迭代中參數更新的步長,避免更新過快或過慢。
3. 梯度的計算:
* 對參數求偏導數(偏微分): 計算成本函數對於每個參數的斜率,得到梯度。
* 梯度向量: 包含所有參數的梯度組成的向量。
4. 更新參數:
* 更新公式: 新的權重 = 原權重 - 學習率 * 梯度。
* 迭代過程: 重複計算梯度並更新參數,直到滿足停止條件(固定次數或梯度趨近於零)。
5. 不同變體:
* 批量梯度下降(Batch Gradient Descent): 使用全部訓練數據計算梯度。
* 隨機梯度下降(Stochastic Gradient Descent): 使用單個樣本計算梯度。
* 小批量梯度下降(Mini-Batch Gradient Descent): 使用部分樣本計算梯度。
6. 收斂性:
* 局部極小值: 算法可能在局部極小值處停滯。
* 學習率的影響: 過大可能使算法發散,過小可能收斂太慢。
7. 應用:
* 線性回歸: 最小二乘法的優化過程即可用梯度下降實現。
* 深度學習: 在神經網絡的權重更新中廣泛使用。
8. 改進與進階概念:
* 動量(Momentum): 加速收斂,減緩震盪。
* 自適應學習率: 例如 Adagrad、RMSprop、Adam 等算法。
* 學習率衰減: 隨著迭代進行降低學習率。
9. Python 實作:
* 資料讀取: 讀取訓練數據。
* 梯度計算: 計算權重和偏差的梯度。
* 參數更新: 使用梯度更新權重和偏差。
* 收斂過程: 監視成本函數隨迭代次數的變化。
10. 注意事項:
* 特徵縮放: 確保各特徵在相似範圍內,避免梯度下降受特徵尺度影響。
* 初始值的影響: 初始權重和偏差的選擇可能影響算法的性能。
## 梯度下降 Gradient Descent (part2)
初始化參數:
* w 和 b 是線性回歸的權重和截距。
* learning_rate 是梯度下降的學習率,用於調整每次更新的步長。
* iterations 是梯度下降的迭代次數。
生成模擬數據:
generate_data 函數用於生成模擬的訓練數據,包含年資(x)和對應的薪水(y)。
定義成本函數:
calculate_cost 函數計算成本函數(cost function)的值,這裡使用的是均方誤差(Mean Squared Error)。
梯度下降迴圈:
* 使用 gradient_descent 函數實施梯度下降。
* 在每次迭代中,計算當前權重 w 和截距 b 對成本函數的梯度。
* 使用梯度乘以學習率,來更新權重和截距的值,逐漸逼近最小成本。
預測薪水:
使用找到的最終權重和截距,對新的員工年資進行預測。
繪製成本下降圖:
使用 Matplotlib 繪製成本函數隨迭代次數的下降曲線。
繪製3D成本曲面:
* 繪製3D曲面圖,顯示成本函數在權重和截距空間中的形狀。
* 利用學習率、迭代次數等參數來觀察梯度下降的效果。
繪製權重和截距的更新過程:
* 使用 Matplotlib 的 3D 散點圖,顯示權重和截距的更新歷程,以及它們在找到最小成本時的位置。
調整梯度下降參數:
* 演示不同的初始值、學習率、迭代次數等對梯度下降的影響。
結論:
演示梯度下降是如何根據定義的成本函數,不斷調整模型參數以最小化成本的過程。
## 總結
1. 機器學習流程概述:
* 資料準備
* 模型設定
* Cost function 設定
* 優化器(Optimizer)設定
2. 模型設定:
* 以簡單線性回歸為例,使用一條直線表示資料趨勢。
* 模型中可能包含參數,此例中為直線的傾斜度 w 與截距 b。
3. Cost Function 設定:
* 目的是評估模型的好壞,這裡使用資料點與直線的距離平方加總的方式。
* Cost function 值越小,表示模型越適合資料。
4. 梯度下降法(Gradient Descent):
* 目標是找到最小化 Cost function 的 w 與 b。
* 使用優化器(Optimizer)進行自動化的參數更新。
* 透過計算參數的梯度(對 Cost function 的偏微分),不斷調整參數以降低 Cost。
5. Gradient Descent 步驟:
* 隨機初始化 w 與 b。
* 計算 Cost,求取梯度。
* 使用優化器更新 w 與 b,這裡使用學習率(Learning Rate)控制更新步長。
* 重複上述步驟直到收斂或達到指定的更新次數。
6. 資料預測:
* 當模型訓練完成,可使用訓練好的參數進行新資料的預測。
* 預測值通常是根據模型的輸入,計算得到的輸出。
7. 三維圖形呈現:
* 使用 Matplotlib 繪製 Cost 下降過程的曲線。
* 透過 3D 圖形展示 Cost function 在參數空間中的形狀。
8. 參數設定與影響:
* 學習率(Learning Rate):影響梯度下降的步長,過大可能導致不收斂,過小則收斂速度緩慢。
* 初始值的選擇:初始值不同可能導致收斂到不同的極值。
* 更新次數:控制梯度下降的迭代次數。
9. 注意事項:
* 梯度下降的效能高,但需要調整適當的超參數。
* 學習率選擇與收斂判斷是重要的課題。
* 模型的適用性與準確性需視資料特性而定。
10. 優化器(Optimizer):
* Gradient Descent 是一種優化器,還有其他優化器如 Adam、RMSprop 等。
* 不同優化器可能適用於不同情境,需要根據實際問題選擇。
11. 小結:
* 機器學習流程涵蓋資料處理、模型設計、評估方式、梯度下降等步驟。
* 有效的機器學習需仰賴合適的模型、評估標準、優化器等因素的搭配。
* 實作過程中需謹慎調整超參數,觀察收斂情況及結果。
---
# 章節3 : 多元線性回歸 Multiple Linear Regression
## 介紹
1. 多元線性回歸(Multiple Linear Regression)概述:
* 與簡單線性回歸類似,但允許考慮多個特徵。
* 通常應用於預測目標(例如薪水)與多個解釋變數(例如年資、學歷、工作地點)之間的關係。
2. 模型表示:
以數學式表示為:

* y 是目標變數(例如月薪)。
* W 是權重參數。
* X 是特徵值。
* b 是截距項。
對於每個特徵,都有相對應的權重參數。
3. 多元線性回歸的目標:
* 找到最佳的權重 W 和截距 b,以最好地擬合資料。
* 使模型能夠最好地解釋目標變數與多個特徵之間的關係。
4. 資料特徵:
* 例子中使用的特徵包括年資、學歷、工作地點。
* 特徵數量可以隨需求增減,模型將針對所有特徵進行權重調整。
5. 多元線性回歸的優勢:
* 能夠考慮多個特徵,更符合現實世界的複雜情況。
* 提供更精細的資料建模能力。
6. 模型訓練過程:
* 使用訓練資料集進行模型訓練,找到最佳權重
* W 和截距 b。
* 可以使用與簡單線性回歸相似的梯度下降等優化器進行參數的調整。
7. 多元線性回歸的實際應用:
* 在人力資源管理中,預測員工薪水可能同時考慮年資、學歷、工作地點等多個因素。
* 在金融領域,可能預測股票價格時同時考慮多個相關變數。
8. 注意事項:
* 特徵的選擇需要基於領域知識和資料分析,避免不相關或冗餘的特徵。
* 模型的解釋性增加,但也需要更多的資料。
9. 模型評估:
* 與簡單線性回歸一樣,可使用評估指標如均方誤差(MSE)等進行模型效能評估。
10. 多元線性回歸的改進:
* 可以引入正則化(Regularization)等技術,防止過擬合等問題。
11. 小結:
* 多元線性回歸是簡單線性回歸的自然擴展,更適用於現實生活中包含多個因素的問題。
* 適當選擇特徵,調整參數,是建立高效多元線性回歸模型的關鍵。
## 資料預處理 - Label Encoding
1. 學歷特徵的問題:
學歷和工作地點是文字型特徵,無法直接套用於數學模型。
2. 解決辦法 - Label Encoding:
* 使用 Label Encoding 將文字型特徵轉換為數字表示。
* 這是一種將類別型變數映射為整數的方法。
3. Label Encoding 實作:
* 選擇要處理的特徵(這裡是學歷 - education level)。
* 建立字典,將文字值映射為數字,例如:高中以下 → 0,大學 → 1,碩士以上 → 2。
* 使用 Python 的 map 函數進行轉換,將原始文字值映射為數字。
4. Label Encoding 範例:
* 展示學歷特徵經過 Label Encoding 後的結果。
* 示範如何對應高中以下、大學、碩士以上到數字0、1、2。
5. 轉換後的資料呈現:
* 展示整體資料經過 Label Encoding 處理後的結果。
* 以學歷為例,原本的"大學"變成了1,"碩士以上"變成了2。
6. Label Encoding 的優勢:
* 適用於有順序或等級關係的類別型變數。
* 能夠在保留數值特性的同時,將文字特徵納入模型中。
7. 擴展至其他特徵:
* 除了學歷,也可以應用 Label Encoding 於其他文字型特徵,如工作地點等。
8. 注意事項:
* Label Encoding 假設類別之間存在順序,不適用於沒有順序關係的類別型變數。
* 在使用 Label Encoding 時,確保映射的邏輯符合實際情況。
9. Label Encoding 的局限性:
* 可能引入虛擬的數值大小,模型在訓練時可能錯誤理解其實際意義。
10. 預處理的目的:
* 資料預處理的目標是確保資料能夠適用於模型訓練,而 Label Encoding 是實現這個目標的一種手段。
11. 總結:
* Label Encoding 是處理文字型特徵的一種實用方法,但在使用時需要謹慎考慮特徵之間的關係,確保轉換合理。
## 資料預處理 - One-Hot Encoding
1. 特徵處理 - 工作地點 (City)
工作地點特徵有三種可能的值:城市a、城市b、城市c。
2. One-Hot Encoding 解釋:
* 當一個特徵沒有高低或大小的順序關係時,使用 One-Hot Encoding。
* One-Hot Encoding 可將一個特徵轉換為多個二元特徵,每個特徵代表原始特徵的一個類別。
3. One-Hot Encoding 步驟:
* 為每個類別創建一個二元特徵,將原始特徵的每個值映射到一個新的二元特徵。
* 以城市為例,建立城市a、城市b、城市c三個新特徵,每個特徵代表一個城市。
* 將原始特徵的值轉換為二元特徵,存在的城市標記為1,其他為0。
4. One-Hot Encoding 示範:
* 以 Scikit-Learn 的 OneHotEncoder 實作 One-Hot Encoding。
* 創建 OneHotEncoder 物件。
* 使用 fit 函數擬合(fit)原始特徵的類別。
* 使用 transform 函數將原始特徵轉換為 One-Hot Encoding。
* 結果可能是稀疏矩陣,可透過 toarray 轉換為一般矩陣。
5. 創建 OneHotEncoder:
* 使用 Scikit-Learn 的 OneHotEncoder。
創建 OneHotEncoder 物件。
6. 擬合原始特徵:
* 使用 fit 函數擬合 OneHotEncoder。
* 指定城市(city)特徵,注意要為二維矩陣。
7. 轉換特徵:
* 使用 transform 函數將原始特徵轉換為 One-Hot Encoding。
* 結果可能是稀疏矩陣,視需要可使用 toarray 轉換為一般矩陣。
8. 新特徵命名:
* One-Hot Encoding 後,新特徵的命名通常是原始特徵值的組合。
9. 新特徵整合:
* 新特徵為原始特徵的每個類別創建一個二元特徵。
* 將新特徵整合到資料集中。
10. 刪除多餘特徵:
- 在 One-Hot Encoding 後,可以刪除原始特徵,並刪除其中一個新特徵(通常是最後一個)以避免多重共線性。
11. One-Hot Encoding 優勢:
- 適用於沒有順序關係的類別型變數。
- 可以將類別特徵引入模型中。
12. 注意事項:
- 不是所有特徵都需要 One-Hot Encoding,某些特徵可能存在特殊意義或有助於模型訓練效果。
13. 總結:
- One-Hot Encoding 是處理沒有順序關係的類別型變數的有效方法,使其適用於機器學習模型。
## 資料預處理 - Train & Test
資料預處理 - Train & Test
1. Train-Test Split:
- 目的: 將資料分為訓練集(Train Set)和測試集(Test Set),以便在模型訓練後進行評估。
- 方法: 使用`train_test_split`函數,通常設定`test_size`指定測試集佔總資料的比例。
```python
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=87)
```
- `x_train`: 訓練集的特徵
- `x_test`: 測試集的特徵
- `y_train`: 訓練集的目標(標籤)
- `y_test`: 測試集的目標(標籤)
2. 固定隨機分割結果:
- 目的: 若需要固定隨機分割的結果,可以使用`random_state`參數,給定一個數字。
```python
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=87)
```
- 每次使用相同的`random_state`數字,分割的結果都將相同。
3. 資料轉換成 Numpy 格式:
- 目的: 將資料轉換成 Numpy 格式,以便於後續的計算。
- 方法: 使用 Pandas DataFrame 的 `to_numpy` 函數。
```python
x_train = x_train.to_numpy()
x_test = x_test.to_numpy()
```
- 將 DataFrame 資料轉換成 Numpy 矩陣形式,方便後續的數學運算。
4. 附帶補充:
- random_state 參數: 該參數確保每次運行程式時,資料集的分割方式都是相同的。這對於需要固定分割結果以進行可重複實驗的情況很有用。
這樣的資料預處理流程確保我們有獨立的測試集和訓練集,讓我們能夠訓練模型並在未見過的資料上進行評估。
## w1x1 + w2x2... + b
1. 模型表示:
- 多元線性回歸模型的表示式:\[ y_{\text{pred}} = W_1 \cdot X_1 + W_2 \cdot X_2 + \ldots + W_n \cdot X_n + b \]
- \( W_1, W_2, \ldots, W_n \) 是特徵權重(weights),分別對應到每個特徵 \( X_1, X_2, \ldots, X_n \)。
- \( b \) 是偏差項(bias)。
2. 特徵與權重:
- 特徵數增加:原有3個特徵擴充到4個,包含年資、學歷、cityA、cityB。
- \( W = [W_1, W_2, W_3, W_4] \) 是一維矩陣,表示各特徵的權重。
```python
import numpy as np
W = np.array([1, 2, 3, 4]) # 4個特徵的權重
b = 1 # 偏差項
```
3. 特徵與訓練集相乘:
- 使用 Numpy 的矩陣相乘,將權重 \( W \) 與特徵 \( X_{\text{train}} \) 相乘。
```python
X_train = ... # 特徵矩陣,每列代表一筆資料的各特徵值
y_pred = np.dot(X_train, W) + b
```
- \( X_{\text{train}} \) 的每一行代表一筆訓練資料的各特徵值。
4. 加總與偏差項:
- 將特徵與權重的相乘結果加總,再加上偏差項 \( b \)。
```python
y_pred = np.sum(np.dot(X_train, W), axis=1) + b
```
- 使用 `np.sum` 針對每一行進行加總,`axis=1` 表示沿著橫軸的方向相加。
5. 預測結果:
- 最終的預測結果 \( y_{\text{pred}} \) 即為模型對訓練集的薪資預測。
```python
y_pred = np.sum(np.dot(X_train, W), axis=1) + b
```
- 這個預測的結果將用來與實際薪資(訓練集的目標值 \( y_{\text{train}} \))進行比較,以計算模型的誤差。
這段程式碼示範了如何建構多元線性回歸模型,其中 \( W \) 是特徵的權重,\( b \) 是偏差項,而 \( X_{\text{train}} \) 則是訓練集的特徵矩陣。預測的結果 \( y_{\text{pred}} \) 將用來評估模型的表現。
## 設定 Cost Function
1. 定義最適合:
- 在找出最適合的 \( W \) 與 \( b \) 的組合之前,需要先定義最適合的標準。這就是透過設定一個 cost function 來衡量模型預測結果與實際資料的差距。
2. Cost Function 定義:
- Cost function 是衡量模型誤差的函式,這裡使用的是均方誤差(Mean Squared Error,MSE):
\[ \text{cost} = \frac{1}{2m} \sum_{i=1}^{m} (y_{\text{train}}^{(i)} - y_{\text{pred}}^{(i)})^2 \]
- \( m \) 是訓練樣本的數量,\( y_{\text{train}}^{(i)} \) 是第 \( i \) 筆實際薪資,\( y_{\text{pred}}^{(i)} \) 是對應的預測薪資。
3. Cost Function 實作:
- 實作 `compute_cost` 函式,計算預測值 \( y_{\text{pred}} \) 與實際值 \( y_{\text{train}} \) 的均方誤差。
```python
def compute_cost(x, y, w, b):
y_pred = np.sum(np.dot(x, w), axis=1) + b
cost = np.mean((y - y_pred) 2) / 2
return cost
```
- 函式的輸入包括特徵矩陣 \( x \)、實際薪資 \( y \)、權重 \( w \) 與偏差 \( b \)。
4. 測試 Cost Function:
- 測試不同 \( w \) 與 \( b \) 的組合,觀察相對應的 cost。
```python
cost_example = compute_cost(X_train, y_train, np.array([0, 2, 2, 4]), 0)
```
- 計算得到的 `cost_example` 就是這個組合下的模型誤差。
這段程式碼設定了均方誤差(Mean Squared Error,MSE)作為 cost function,該函式將用來評估模型預測與實際資料之間的差異。 `compute_cost` 函式計算了預測值 \( y_{\text{pred}} \) 與實際值 \( y_{\text{train}} \) 的均方誤差,並提供了一個衡量模型效能的標準。
## 設定 Optimizer - Gradient Descent
設定 Optimizer - Gradient Descent
1. 選擇優化器:
- 在找出最適合的 \( W \) 與 \( b \) 的組合之後,需要一個有效率的方式來更新這些參數。在這個例子中,使用了梯度下降法(Gradient Descent)作為優化器,以根據斜率調整參數。
2. Gradient Descent 回顧:
- 在簡單線性回歸中,我們更新 \( w \) 與 \( b \) 的方式是 \( w = w - \text{learning\_rate} \times \frac{\partial \text{cost}}{\partial w} \) 與 \( b = b - \text{learning\_rate} \times \frac{\partial \text{cost}}{\partial b} \)。
- 在多變量線性回歸中,參數 \( W \) 包含了 \( w_1, w_2, w_3, w_4 \),更新方式仍相同,只是梯度的計算需要考慮所有特徵的影響。
3. 梯度的計算:
- 計算 \( W \) 與 \( b \) 方向的斜率,即 \( \frac{\partial \text{cost}}{\partial W_i} \) 與 \( \frac{\partial \text{cost}}{\partial b} \)。這可以通過對 cost function 進行偏微分得到。
- \( \frac{\partial \text{cost}}{\partial W_i} \) 的計算以 \( W_iX_i \) 之形式,其中 \( X_i \) 為對應的特徵。 \( \frac{\partial \text{cost}}{\partial b} \) 不需要乘以特徵。
4. 梯度的平均:
- 在計算斜率時,取特徵方向上的平均值,以總和所有樣本的梯度。
5. 梯度下降的實作:
- 使用一個迴圈來計算每個參數方向上的梯度,並更新參數。
- 設定學習率(learning rate)以調整更新的步伐大小。學習率過大可能導致跳過最小值,過小可能收斂速度過慢。
6. 優化器的函式:
- 實作 `gradient_descent` 函式,傳入特徵 \( x \)、實際資料 \( y \)、當前的 \( W \) 與 \( b \)、學習率 \( \text{learning\_rate} \)。
- 函式內計算梯度,然後更新 \( W \) 與 \( b \)。
```python
def gradient_descent(x, y, w, b, learning_rate):
w_gradient, b_gradient = compute_gradient(x, y, w, b)
w -= learning_rate * w_gradient
b -= learning_rate * b_gradient
return w, b
```
- `compute_gradient` 函式計算梯度,並在 `gradient_descent` 函式中使用這些梯度進行更新。
7. 迭代更新參數:
- 使用迴圈迭代多次,每次呼叫 `gradient_descent` 更新參數,逐漸逼近最小值。
8. 測試與調整:
- 測試不同的學習率,觀察模型的收斂情況。適當的學習率可使模型在合理的時間內達到最小值。
9. 梯度下降法 (Gradient Descent)
- 梯度下降是一種最小化目標函數的優化算法,用於調整模型參數以降低預測誤差。
- 目標:最小化成本函數,使模型預測盡可能接近實際觀測值。
10. 更新參數的步驟
- 梯度下降的核心思想是通過計算損失函數對於每個參數的梯度,然後按照梯度的方向進行參數的更新。
- 計算 w 和 b 的梯度(斜率),然後按照這個梯度的反方向進行更新。
11. 更新權重(w)和偏差(b)
- 權重 w 的更新:\[ w = w - \text{{learning rate}} \times \frac{{\partial \text{{Cost}}}}{{\partial w}} \]
- 偏差 b 的更新:\[ b = b - \text{{learning rate}} \times \frac{{\partial \text{{Cost}}}}{{\partial b}} \]
- 學習率(learning rate):控制每次更新的步長,避免更新過大或過小。
12. Gradient Descent 函式
- 將上述更新步驟封裝成一個函式,稱為 Gradient Descent 函式。
- 可以根據訓練數據進行多次迭代,逐漸降低成本函數值。
13. 訓練過程
- 初始化權重 \( w \) 和偏差 \( b \)。
- 進行多次迭代,利用梯度下降法不斷更新參數。
- 每次迭代後,觀察成本函數的變化,確認是否收斂。
14. 梯度的計算
- 使用偏微分計算權重 \( w \) 和偏差 \( b \) 方向上的梯度。
- 具體計算方式與目標函數的形式有關。
15. 學習率的調整
- 學習率過大可能導致震盪或無法收斂,過小可能收斂速度過慢。
- 可以進行學習率的調整,觀察模型在驗證集上的表現。
16. 應用於線性回歸
- 將梯度下降法應用於線性回歸問題,尋找最適合數據的線性模型。
- 使用訓練集和測試集進行模型的訓練和評估。
17. 實際應用
- 將訓練好的模型應用於實際情況,例如預測應聘者的薪水。
- 對新的數據進行特徵轉換並進行預測。
18. 評估模型性能
- 通過計算成本函數或測試集上的誤差,評估模型在實際應用中的性能。
- 考慮模型預測與實際觀測值之間的差異。
19. 優化與調參
- 根據模型在實際應用中的表現進行優化和調參,以提升模型性能。
- 可以調整學習率、迭代次數、初始化參數等。
20. 注意事項
- 特徵縮放:在梯度下降中,特徵的尺度應保持一致,可以進行特徵縮放。
21. 未來優化方向
- 可以嘗試其他優化算法,如隨機梯度下降(SGD)、小批次梯度下降等。
- 探索更複雜模型以提高預測性能。
## 特徵縮放 Feature Scaling
特徵縮放(Feature Scaling)是一種常見的數據前處理技術,用於確保不同特徵的數值範圍相似,以加速機器學習算法的訓練過程。在這段程式碼中,提到了標準化(Standardization)作為特徵縮放的方法,以下是該段程式碼的重點整理:
1. 特徵縮放的動機:
- 當特徵的大小範圍不一致時,可能導致梯度下降過程中震盪和收斂速度緩慢。
2. 標準化的方法:
- 使用標準化(Standardization)將每個特徵的值縮放到平均值為0,標準差為1的範圍內。
- 對每個特徵進行標準化,公式為 `(feature - mean) / standard deviation`。
3. 程式碼實現:
```python
from sklearn.preprocessing import StandardScaler
# 創建 StandardScaler 對象
scaler = StandardScaler()
# 使用訓練集擬合(fit)並轉換(transform)特徵資料
x_train_scaled = scaler.fit_transform(x_train)
# 將訓練集的標準差和平均值應用於測試集,僅使用 transform
x_test_scaled = scaler.transform(x_test)
```
4. 應用到梯度下降:
- 經過特徵縮放後,重新執行梯度下降,觀察到更快的收斂速度。
5. 注意事項:
- 特徵縮放只能在訓練集上進行擬合,然後將相同的轉換應用於訓練集和測試集,以確保一致性。
這段程式碼的主要目的是演示標準化對於梯度下降效果的提升。標準化可以使特徵的數值範圍一致,從而改善梯度下降的表現。
---
# 章節4 : 邏輯回歸 Logistic Regression
## 介紹
# 邏輯回歸(Logistic Regression)介紹
1. 問題背景
假設我們想要解決一個分類問題,例如判斷一個人是否患有糖尿病。我們收集了一些資料,包含年齡、體重、血糖水平和性別等特徵,以及該人是否患有糖尿病的標籤。在這種情況下,輸出的可能值只有兩類:1(有糖尿病)或0(沒有糖尿病)。這樣的問題被歸類為分類問題,而邏輯回歸是解決這類問題的一種常用模型。
2. 邏輯回歸的特點
- 分類問題: 邏輯回歸主要用於處理二元分類問題,即輸出只有兩種可能的類別。
- 輸出值介於0和1之間: 透過使用 Sigmoid 函數,邏輯回歸的輸出被限制在0和1之間,這可以被解釋為概率。
3. Sigmoid 函數
邏輯回歸使用 Sigmoid 函數將線性組合轉換為概率輸出。Sigmoid 函數的數學表達式為:
\[ \sigma(z) = \frac{1}{1 + e^{-z}} \]
其中 \( z \) 是線性組合(如 \( W_1 \cdot X_1 + W_2 \cdot X_2 + \ldots + b \)),而 \( e \) 是自然對數的底數。
4. 邏輯回歸模型
邏輯回歸模型的預測式:
\[ y = \sigma(W_1 \cdot X_1 + W_2 \cdot X_2 + \ldots + b) \]
其中 \( y \) 是模型的預測輸出,\( \sigma \) 是 Sigmoid 函數,\( W_1, W_2, \ldots \) 是權重,\( X_1, X_2, \ldots \) 是特徵,\( b \) 是偏差項。
5. 擬合模型
透過梯度下降等優化方法,找到最佳的權重 \( W \) 和偏差項 \( b \),使得模型的預測與實際標籤的差異最小化。
6. 優勢與注意事項
- 簡單且有效: 邏輯回歸是一種簡單而有效的分類算法,並且易於實現。
- 適用性: 尤其適用於二元分類問題,可用於機器學習和統計建模。
- 不足之處: 當特徵之間存在複雜的非線性關係時,邏輯回歸的表現可能受到限制。
7. 應用範疇
邏輯回歸廣泛應用於醫學、金融、市場研究等領域,例如預測疾病風險、信用評分、客戶流失等。
邏輯回歸是解決分類問題的一個重要工具,通過將線性組合轉換為概率值,使得模型能夠在預測結果上具有可解釋性。
## Sigmoid Function
1. 引言
Sigmoid 函數是邏輯回歸模型中關鍵的轉換函數,用於將線性組合的輸出轉換為介於0和1之間的概率值。這個章節將深入介紹 Sigmoid 函數的特性以及在邏輯回歸中的應用。
2. Sigmoid 函數的數學表達式
Sigmoid 函數的數學表達式如下:
\[ \sigma(z) = \frac{1}{1 + e^{-z}} \]
其中 \( z \) 是線性組合的結果,而 \( e \) 是自然對數的底數。這個函數的特性使得輸出在 \( 0 \) 到 \( 1 \) 之間,這符合概率的範圍。
3. Sigmoid 函數的特性
- S 形曲線: Sigmoid 函數的曲線呈現出一個 S 形,這是它的特徵之一。
- 連續可微性: Sigmoid 函數在其定義域內是連續可微的,這對梯度下降等優化算法至關重要。
- 輸出介於 0 和 1: 函數的輸出始終介於 \( 0 \) 和 \( 1 \) 之間,可被解釋為概率。
4. Sigmoid 函數的應用
在邏輯回歸中,Sigmoid 函數被用來對線性組合的輸出進行轉換,將其轉換為表示概率的形式。這樣,我們可以將模型的預測視為某一類別的概率值,便於進行二元分類。
5. 實際應用舉例
```python
import numpy as np
# 定義 Sigmoid 函數
def sigmoid(z):
return 1 / (1 + np.exp(-z))
# 測試 Sigmoid 函數
z_values = np.array([-2, -1, 0, 1, 2])
sigmoid_values = sigmoid(z_values)
print(sigmoid_values)
```
輸出:
```
[0.11920292 0.26894142 0.5 0.73105858 0.88079708]
```
上述程式碼示範了對 Sigmoid 函數進行應用,並計算了一些輸入值的對應輸出。
6. 關鍵概念
- 線性組合: Sigmoid 函數通常應用在線性組合的輸出上,用來獲得介於0和1之間的概率值。
- 模型預測: 在邏輯回歸中,Sigmoid 函數的輸出被解釋為對某一類別的預測概率。
7. 優勢與注意事項
- 連續性: Sigmoid 函數的連續性使得梯度下降等最優化算法更容易應用。
- 避免梯度消失: 在深度學習等領域,Sigmoid 函數在反向傳播中容易面臨梯度消失的問題,這是需要注意的一點。
Sigmoid 函數是邏輯回歸模型的核心,它的特性使得模型能夠處理分類問題並提供可解釋的概率輸出。
# 關鍵字
* 人工智慧 (AI)
* 機器學習 (ML)
* 深度學習 (DL)
* 類神經網路
* 資料
* 規則
* 特徵 (Feature):在機器學習中,指的是用來描述資料的屬性或特性,例如在房價預測中的坪數、位置、房間數等。
* 標籤 (Label):機器學習中的輸出,即我們想要預測的目標,例如在房價預測中的實際房價。
* 模型 (Model):由數學公式和參數構成的程式,用來對特徵和標籤之間的關係進行建模,進而進行預測。
* 監督式學習 (Supervised Learning):一種機器學習的方法,使用帶有標籤的訓練資料,使模型能夠學習特徵和標籤之間的映射。
* 誤差值 (Loss):衡量模型預測與實際標籤之間的差距的指標,目標是最小化誤差值,提高模型的預測準確性。
* 訓練 (Training):使用標籤資料來調整模型的參數,使其能夠更好地預測特徵和標籤之間的關係。
* 未知資料 (Unseen Data):模型在訓練階段未曾見過的資料,用來評估模型在真實環境中的表現。
* 擴充特徵 (Feature Engineering):調整或添加特徵,以提高模型的性能和預測能力。
* 過擬合 (Overfitting):
模型在訓練階段過度擬合訓練資料,導致在未知資料上的表現不佳。
* 非監督式學習 (Unsupervised Learning):一種機器學習的方法,使用未標籤的訓練資料,目標是發現資料中的結構或模式。
* 機器學習應用 (Applications of Machine Learning):在各領域應用機器學習解決問題,包括影像辨識、語音辨識、自然語言處理、醫學影像分析等。
* Google Colab
* Python
* 瀏覽器環境
* Colab應用程式
* 筆記本
* 資源分配
* GPU和TPU
* 程式碼格子
* 文字格子
* Markdown
* 硬體加速
* 資訊查看
* TensorFlow
* Deep Learning
* 連線* Google Colab
* Python
* 瀏覽器環境
* Colab應用程式
* 筆記本
* 資源分配
* GPU和TPU
* 程式碼格子
* 文字格子
* Markdown
* 硬體加速
* 資訊查看
* TensorFlow
* Deep Learning
* 連線
* 簡單線性回歸(Simple Linear Regression):是一種統計方法,用來建立兩個變數之間的線性關係模型。這種方法通常應用在預測或解釋一個變數(稱為因變數)如何受另一個變數(稱為自變數)的影響。
* 數學技巧(Mathematical Techniques): 使用數學方法來找出最適合描述兩變數之間關係的模型。
* 預測(Prediction): 簡單線性回歸的主要目的之一是透過模型進行預測,基於已知自變數的值預測因變數的值。
* 模型建立(Model Establishment): 建立一個數學模型,通常是一條直線,以描述自變數和因變數之間的線性關係。
* 兩變數之間的線性關係(Linear Relationship between Two Variables): 簡單線性回歸假設自變數和因變數之間存在線性關係。
* 一條直線表示(Represented by a Straight Line): 透過一條直線來表示模型,該直線的斜率和截距由回歸分析所確定。
* 散點圖(Scatter Plot): 常用散點圖來視覺化自變數和因變數之間的數據分佈,以便初步了解它們之間的關係。
* 斜率(w,Slope): 直線的傾斜度,表示每單位自變數變化對因變數的影響程度。
* 截距(b,Intercept): 直線和因變數軸(自變數為零時的值)的交點。
* 最適合的直線(Best-Fitting Line): 透過數學方法找到的直線,使模型能夠最好地擬合數據點。
* 線性關係(Linear Relationship): 表示因變數和自變數之間存在線性相依。
* 資料擬合(Data Fitting): 調整模型的參數,使其能夠最好地擬合實際數據。
* 數學方法(Mathematical Methods): 使用數學技巧,如最小二乘法,以找到最適合的直線。
* 資料預測(Data Prediction): 利用建立的模型,對未知數據進行預測。
* 模型訓練(Model Training): 利用已知數據來調整模型的參數,以提高對未知數據的預測準確性。
* Pandas 模組
* Matplotlib 的 Pyplot
* 散點圖 (Scatter Plot)
* 中文字體設定
* 簡單線性回歸表示式
* 互動元件 (ipywidgets)
* Interact 函數
* 線性回歸模型
* 權重 (Weight)
* 截距 (Intercept)
* 動態調整模型參數
* 標題、標籤、圖例的設定
* 特徵(年資)、目標(月薪)
* 互動式探索
* 模型可解釋性
* Matplotlib 的 Plot 函數
* 數據可視化
* 互動式數據分析
* 線性回歸
* 適合度評分
* 成本函數(損失函數)
* 平方誤差
* 最小化成本
* 參數調整
* 梯度下降
* 資料擬合
* 訓練模型
* 成本函數(Cost Function):衡量模型預測和實際值之間的差異的函數。
* 學習率(Learning Rate):控制每次更新步伐大小的超參數。
* 偏導數(Partial Derivative):函數對一個變數的偏導數,表示對該變數的敏感度。
* 梯度(Gradient):包含所有偏導數的向量,指示函數變化最快的方向。
* 梯度下降(Gradient Descent): 一種最小化函數的優化算法,通過尋找函數梯度的方向並以此方向上的步長進行迭代,以降低函數值。
* 成本函數(Cost Function): 衡量模型預測和實際觀測值之間差異的函數,用於評估模型的性能。
* 學習率(Learning Rate): 梯度下降中控制更新步長的超參數,影響算法的收斂速度和穩定性。
* 均方誤差(Mean Squared Error,MSE): 一種成本函數,用於測量預測值和實際值之間的平均平方差。
* 3D曲面圖: 以三個維度(權重1、權重2、成本)繪製的圖,展示成本函數在不同權重下的變化。
* 參數調整: 調整模型中的參數,如初始值、學習率等,以獲得更好的梯度下降效果。
- 權重(Weights)
- 截距(Intercept)
- 特徵工程(Feature Engineering)
- 正規化(Regularization)
- 預測準確性(Predictive Accuracy)