# 章節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. 模型表示: 以數學式表示為: ![image](https://hackmd.io/_uploads/r1RoAyI8a.png) * 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)