chore(i18n): sync translations with latest source changes (chunk 1/1, 12 changes)

update-translations
localizeflow[bot] 1 week ago
parent 55ff23341b
commit d540bd85cd

@ -36,8 +36,8 @@
"language_code": "zh-HK"
},
"1-Introduction/4-techniques-of-ML/README.md": {
"original_hash": "9d91f3af3758fdd4569fb410575995ef",
"translation_date": "2025-09-05T09:25:28+00:00",
"original_hash": "84b1715a6be62ef1697351dcc5d7b567",
"translation_date": "2026-04-26T20:34:36+00:00",
"source_file": "1-Introduction/4-techniques-of-ML/README.md",
"language_code": "zh-HK"
},
@ -90,8 +90,8 @@
"language_code": "zh-HK"
},
"2-Regression/3-Linear/README.md": {
"original_hash": "26c53a922f1f1e8542b0ea41ff52221a",
"translation_date": "2026-04-20T16:15:19+00:00",
"original_hash": "8b776e731c35b171d316d01d0e7b1369",
"translation_date": "2026-04-26T20:34:13+00:00",
"source_file": "2-Regression/3-Linear/README.md",
"language_code": "zh-HK"
},
@ -107,6 +107,12 @@
"source_file": "2-Regression/3-Linear/solution/Julia/README.md",
"language_code": "zh-HK"
},
"2-Regression/3-Linear/solution/notebook.ipynb": {
"original_hash": "6781223ffbe8cfdaa38d0200f08e1288",
"translation_date": "2026-04-26T20:31:36+00:00",
"source_file": "2-Regression/3-Linear/solution/notebook.ipynb",
"language_code": "zh-HK"
},
"2-Regression/4-Logistic/README.md": {
"original_hash": "abf86d845c84330bce205a46b382ec88",
"translation_date": "2025-09-05T09:17:03+00:00",

@ -1,123 +1,125 @@
# 機器學習技術
# Techniques of Machine Learning
建立、使用和維護機器學習模型及其所需數據的過程,與許多其他開發工作流程有很大的不同。在本課中,我們將揭開這個過程的神秘面紗,並概述您需要了解的主要技術。您將學到
建立、使用及維護機器學習模型及其數據的流程與許多其他開發工作流程大不相同。在本課程中,我們將揭開這個過程的神秘面紗,並概述您需要了解的主要技巧。您將
- 從高層次理解機器學習的基本流程。
- 探索基本概念,例如「模型」、「預測」和「訓練數據」。
- 在高層次上理解機器學習背後的過程。
- 探索「模型」、「預測」和「訓練數據」等基本概念
## [課前測驗](https://ff-quizzes.netlify.app/en/ml/)
## [課前測驗](https://ff-quizzes.netlify.app/en/ml/)
[![機器學習初學者 - 機器學習技術](https://img.youtube.com/vi/4NGM0U2ZSHU/0.jpg)](https://youtu.be/4NGM0U2ZSHU "機器學習初學者 - 機器學習技術")
[![ML for beginners - Techniques of Machine Learning](https://img.youtube.com/vi/4NGM0U2ZSHU/0.jpg)](https://youtu.be/4NGM0U2ZSHU "ML for beginners - Techniques of Machine Learning")
> 🎥 點擊上方圖片觀看一段簡短的影片,了解本課內容
> 🎥 點擊上方圖片觀看本課程的短片教學
##
## 介
從高層次來看創建機器學習ML流程的技術包括以下幾個步驟:
從高層次來看創建機器學習ML流程的工藝包含多個步驟:
1. **確定問題**。大多數機器學習流程始於提出一個無法通過簡單條件程序或基於規則的引擎解答的問題。這些問題通常圍繞基於數據集合進行的預測。
2. **收集和準備數據**。為了回答您的問題,您需要數據。數據的質量,有時還包括數量,將決定您能多好地回答最初的問題。數據可視化是這個階段的重要部分。這個階段還包括將數據分為訓練組和測試組以構建模型。
3. **選擇訓練方法**。根據您的問題和數據的性質,您需要選擇如何訓練模型,以便最好地反映數據並對其進行準確預測。這是機器學習過程中需要專業知識且通常需要大量試驗的部分
4. **訓練模型**。使用訓練數據,您將使用各種算法訓練模型以識別數據中的模式。模型可能會利用內部權重,這些權重可以調整以優化某些數據部分,從而構建更好的模型。
5. **評估模型**。使用從未見過的數據(測試數據)來檢查模型的表現。
6. **參數調整**。根據模型的表現,您可以使用不同的參數或變量重新進行訓練,這些參數或變量控制訓練模型時所用算法的行為。
7. **進行預測**。使用新輸入測試模型的準確性
1. <strong>決定問題</strong>。大多數機器學習流程從提出一個無法通過簡單條件程式或規則引擎解答的問題開始。這些問題通常圍繞基於數據集合的預測。
2. <strong>收集和準備數據</strong>。為了能回答您的問題,您需要數據。數據的質量有時還有數量將決定您對初始問題回答的準確程度。視覺化數據是這個階段的一個重要部分。此階段也包括將數據分拆成訓練組和測試組以建立模型。
3. <strong>選擇訓練方法</strong>。根據您的問題和數據特性,您需要選擇如何訓練模型,以最佳反映數據並對其進行準確預測。這部分的機器學習流程需要特定專業知識,且通常需要大量試驗
4. <strong>訓練模型</strong>。利用訓練資料,您將使用各種演算法來訓練模型,以識別數據中的模式。模型可能利用可調整的內部權重,優先考慮數據的某些部分以建立更好的模型。
5. <strong>評估模型</strong>。您使用從未見過的數據(測試數據)來檢驗模型的表現。
6. <strong>參數調整</strong>。基於模型的表現,您可以使用不同的參數或變量重新進行訓練,這些參數控制用於訓練模型的演算法行為。
7. <strong>預測</strong>。使用新輸入測試模型的準確度
## 該問什麼問題
電腦特別擅長發現數據中的隱藏模式。這對於研究人員來說非常有用,因為他們可能有一些無法通過條件規則引擎輕鬆回答的問題。例如,針對精算任務,數據科學家可能能夠手工構建關於吸煙者與非吸煙者死亡率的規則。
電腦對於發現數據中隱藏的模式特別在行。這對於研究者來說非常有用,他們在某一領域有問題,無法簡單透過建立條件性規則引擎得到答案。例如,在精算任務中,資料科學家或許能夠圍繞吸煙者與非吸煙者的死亡率構建手工規則。
然而,當涉及到許多其他變量時,機器學習模型可能更有效地根據過去的健康記錄預測未來的死亡率。一個更令人愉快的例子可能是根據包括緯度、經度、氣候變化、靠近海洋的距離、噴流模式等數據,預測某地四月份的天氣
但當許多其他變數加入分析時,機器學習模型在根據過去的健康歷史預測未來死亡率方面可能更有效。一個較為愉快的例子是,基於包含緯度、經度、氣候變化、接近海洋程度、噴射氣流模式等數據,對某地區四月的天氣進行預測
✅ 這份[簡報](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf)提供了使用機器學習進行天氣分析的歷史視角
✅ 這份[天氣模型簡報](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf) 提供了使用機器學習分析天氣的歷史觀點
## 建前任務
## 建前任務
在開始構建模型之前,您需要完成幾項任務。為了測試您的問題並根據模型的預測形成假設,您需要識別並配置幾個元素。
開始建立模型前,您需要完成若干任務。為了驗證問題並建立基於模型預測的假設,您需要識別並配置多個元素。
### 數據
為了能夠以任何確定性回答您的問題,您需要足夠數量且類型正確的數據。在這個階段,您需要完成以下兩件事
為了能帶著一定程度的確定性回答問題,您需要大量且正確類型的數據。此時有兩件事您必須完成
- **收集數據**。記住上一課關於數據分析公平性的內容,謹慎收集數據。注意數據的來源、可能存在的內在偏見,並記錄其來源。
- **準備數據**。數據準備過程包括多個步驟。如果數據來自不同來源,您可能需要整理並標準化數據。您可以通過各種方法提高數據的質量和數量,例如將字符串轉換為數字(如我們在[聚類](../../5-Clustering/1-Visualize/README.md)中所做的)。您還可以基於原始數據生成新數據(如我們在[分類](../../4-Classification/1-Introduction/README.md)中所做的)。您可以清理和編輯數據(如我們在[Web 應用](../../3-Web-App/README.md)課程之前所做的)。最後,根據您的訓練技術,您可能還需要隨機化和打亂數據
- <strong>收集數據</strong>。記住前一課關於數據分析公正性的內容,謹慎收集數據。留意數據來源、可能的內在偏差,並記錄其起源。
- <strong>準備數據</strong>。數據準備流程包含多個步驟。若數據來自不同來源,您或許需要整理和正規化數據。可以透過將字串轉換為數字(如我們在[分群](../../5-Clustering/1-Visualize/README.md)中所做)等各種方法提升數據質量及數量。您甚至可能會基於原始數據生成新數據(如在[分類](../../4-Classification/1-Introduction/README.md)中所做)。您也可以對數據進行清理和編輯(如[網頁應用程式](../../3-Web-App/README.md)課程前所示)。最後,根據訓練方法的需求,您可能還需要對數據進行隨機化及洗牌
✅ 在收集和處理數據後,花點時間檢查其結構是否能幫助您解決預期問題。正如我們在[聚類](../../5-Clustering/1-Visualize/README.md)課程中發現的那樣,數據可能無法很好地完成給定任務!
✅ 在收集並處理數據後,花點時間檢視數據形態是否足以解答您的問題。如我們在[分群](../../5-Clustering/1-Visualize/README.md)課程所發現,數據可能無法出色地完成所規劃的任務。
### 特徵與目標
[特徵](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection)是數據的一個可測量屬性。在許多數據集中,它通常以列標題的形式表達,例如「日期」、「大小」或「顏色」。特徵變量通常在代碼中表示為 `X`,代表用於訓練模型的輸入變量
[特徵](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection) 是數據中可測量的屬性。在許多資料集中以欄位標題形式出現,如「日期」、「大小」或「顏色」。您的特徵變數,通常在程式碼中表示為 `X`,代表用於訓練模型的輸入變數
目標是您試圖預測的事物。目標通常在代碼中表示為 `y`,代表您試圖從數據中回答的問題。例如:在十二月,哪種**顏色**的南瓜最便宜?在舊金山,哪些街區的房地產**價格**最好?有時目標也被稱為標籤屬性。
目標是您嘗試預測的對象。目標通常在程式碼中表示為 `y`,代表您希望從數據中回答的問題:例如在十二月,哪種<strong>顏色</strong>的南瓜最便宜?在舊金山,哪些社區的房地產<strong>價格</strong>最優惠?目標有時也稱為標籤屬性。
### 選擇您的特徵變量
### 選擇特徵變數
🎓 **特徵選擇與特徵提取** 如何知道在構建模型時選擇哪個變量?您可能需要通過特徵選擇或特徵提取的過程來選擇最合適的變量以構建性能最佳的模型。然而,這兩者並不相同:「特徵提取通過原始特徵的函數創建新特徵,而特徵選擇則返回特徵的子集。」([來源](https://wikipedia.org/wiki/Feature_selection)
🎓 <strong>特徵選擇與特徵提取</strong> 您如何知道在建立模型時應選哪些變數?您可能會通過特徵選擇或特徵提取過程來選擇最適合、表現最好模型的變數。但兩者不同:「特徵提取是從原始特徵函數創建新特徵,而特徵選擇是返回特徵的子集。」 ([資料來源](https://wikipedia.org/wiki/Feature_selection))
### 視化數據
### 視化數據
數據科學家工具箱中的一個重要部分是使用 Seaborn 或 MatPlotLib 等優秀庫來可視化數據的能力。通過可視化數據,您可能會發現可以利用的隱藏相關性。您的可視化還可能幫助您發現偏見或數據不平衡(如我們在[分類](../../4-Classification/2-Classifiers-1/README.md)中發現的那樣)。
數據科學家的工具中,使用如 Seaborn 或 MatPlotLib 等優秀函式庫視覺化數據,具備強大功能。將數據以圖像形式呈現,可能幫助發現您可加以利用的隱藏相關性。視覺化也能協助您偵測偏差或數據不平衡狀況(如我們在[分類](../../4-Classification/2-Classifiers-1/README.md)所發現)。
### 分數據集
### 分數據集
在訓練之前,您需要將數據集分為兩部分或更多部分,這些部分的大小不相等,但仍能很好地代表數據
訓練前,您需要將數據集拆分為兩個以上不同大小但仍能代表數據的部分
- **訓練集**。這部分數據集用於訓練模型。它構成了原始數據集的大部分
- **測試集**。測試數據集是從原始數據中獨立提取的一組數據,用於確認構建的模型的性能。
- **驗證集**。驗證集是一組較小的獨立數據,用於調整模型的超參數或架構以改進模型。根據數據的大小和您提出的問題,您可能不需要構建這第三組數據(如我們在[時間序列預測](../../7-TimeSeries/1-Introduction/README.md)中提到的那樣)。
- <strong>訓練組</strong>。此部分用於訓練模型,佔原始數據集多數
- <strong>測試組</strong>。測試數據集是獨立的數據組,通常從原始數據取得,用於驗證建立的模型的效能。
- <strong>驗證組</strong>。驗證集是一小部分獨立樣本,用來調整模型超參數或架構,提升模型表現。依數據大小及問題,有時不需要建立此第三集合(如我們在[時間序列預測](../../7-TimeSeries/1-Introduction/README.md)所述)。
## 建模型
## 建模型
使用您的訓練數據,您的目標是使用各種算法**訓練**模型,從而構建數據的統計表示。訓練模型使其接觸數據,並讓其對發現的模式進行假設、驗證並接受或拒絕。
利用訓練數據,您的目標是透過各種演算法建立模型,亦即對數據的統計表示,進行<strong>訓練</strong>。訓練模型是令它接觸數據並從所識別、驗證的模式中做出假設並接受或拒絕。
### 決定訓練方法
### 選擇訓練方法
根據您的問題和數據的性質,您將選擇一種訓練方法。通過瀏覽[Scikit-learn 的文檔](https://scikit-learn.org/stable/user_guide.html)(我們在本課程中使用),您可以探索多種訓練模型的方法。根據您的經驗,您可能需要嘗試多種方法以構建最佳模型。您可能會經歷一個過程,數據科學家通過向模型提供未見過的數據來評估其性能,檢查準確性、偏差和其他質量問題,並選擇最適合當前任務的訓練方法。
根據您的問題與數據特性,您將選擇適當的訓練方法。透過翻閱[Scikit-learn 的文件](https://scikit-learn.org/stable/user_guide.html) — 本課程採用的函式庫 — 您可探索多種訓練模型方式。視經驗有時須嘗試多種方法,資料科學家會透過讓模型面對未見數據,檢查準確度、公正性及其他可能影響品質的問題,挑選最合適的訓練方法。
### 訓練模型
有了訓練數據,您可以開始「擬合」數據以創建模型。您會注意到在許多機器學習庫中代碼中會出現「model.fit」——這時您將特徵變量作為值的數組通常是 `X`)以及目標變量(通常是 `y`)傳入
有了訓練數據,您就能開始「擬合」模型。您會注意到許多機器學習函式庫中會用到「model.fit」程式碼 — 此時您將送入特徵變數陣列(通常為 X及目標變數通常為 y
### 評估模型
訓練過程完成後(對於大型模型可能需要多次迭代或「epoch」您可以使用測試數據來評估模型的質量檢查其性能。這些數據是原始數據的一部分模型之前未曾分析過。您可以打印出一個關於模型質量的指標表
訓練過程完成後(訓練大型模型可能經歷多次迭代或「時代」),您可藉由測試數據評估模型品質。此數據為模型之前未分析過的原始數據子集。您可以列印包含模型品質指標的表格
🎓 **模型擬合**
🎓 <strong>模型擬合</strong>
在機器學習的背景下,模型擬合指的是模型的底層函數在嘗試分析未見過的數據時的準確性
就機器學習而言,模型擬合意指模型對未知數據分析的底層函數準確程度
🎓 **欠擬合**和**過擬合**是常見問題,會降低模型質量。欠擬合的模型無法很好地分析訓練數據或未見過的數據,而過擬合的模型則過於貼合訓練數據,因為它過於詳細地學習了數據的細節和噪聲
🎓 <strong>欠擬合</strong><strong>過擬合</strong>是常見損害模型品質的問題,前者擬合不夠,後者擬合過度。這使模型對訓練數據的預測過於精確或不夠精確。過擬合模型對訓練數據預測過好,因為模型過度學習資料細節及噪聲。欠擬合模型則不準確,既無法準確分析訓練數據,也無法分析未知數據
![過擬合模型](../../../../1-Introduction/4-techniques-of-ML/images/overfitting.png)
> 圖表由 [Jen Looper](https://twitter.com/jenlooper) 提供
![overfitting model](../../../../translated_images/zh-HK/overfitting.1c132d92bfd93cb6.webp)
> 資訊圖表由 [Jen Looper](https://twitter.com/jenlooper) 提供
## 參數調整
完成初步訓練後,觀察模型的質量,並考慮通過調整其「超參數」來改進模型。閱讀更多相關內容:[文檔](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott)。
初次訓練完成後,觀察模型品質並考慮透過微調「超參數」來改善模型。詳情請參考官方[文件](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott)。
## 預測
這是您可以使用全新數據測試模型準確性的時刻。在「應用」機器學習的場景中,當您構建用於生產的網頁資產時,這個過程可能涉及收集用戶輸入(例如按下按鈕)來設置變量,並將其發送到模型進行推斷或評估。
此時您將使用全新數據測試模型準確度。在「應用」機器學習環境中,當您建置網站資產以在生產環境使用模型時,此過程可能涉及收集用戶輸入(例如按鈕點擊)以設定變數,送入模型進行推理或評估。
在這些課程中,您將學習如何使用這些步驟來準備、構建、測試、評估和預測——這些都是數據科學家的基本技能,隨著您的進步,您將逐步成為一名「全棧」機器學習工程師
在這些課程中,您會發現如何使用這些步驟準備、建構、測試、評估和預測——這些均是資料科學家的核心技能並更進一步支持您成為「全端」ML 工程師的旅程
---
## 🚀挑戰
繪製一個反映機器學習從業者步驟的流程圖。您認為自己目前處於哪個步驟?您預測在哪些方面會遇到困難?哪些部分對您來說似乎很容易?
繪製一張反映機器學習從業者步驟的流程圖。您認為自己目前處於流程的哪個階段?您預測會在哪裡遇到困難?有哪些部分對您而言似乎容易?
## [課後測驗](https://ff-quizzes.netlify.app/en/ml/)
## [課後測驗](https://ff-quizzes.netlify.app/en/ml/)
## 回顧與自學
## 複習與自學
在線搜索數據科學家討論日常工作的訪談。這裡有一個[例子](https://www.youtube.com/watch?v=Z3IjgbbCEfs)。
在線上搜尋資料科學家的訪談,了解他們的日常工作。這裡有[一段](https://www.youtube.com/watch?v=Z3IjgbbCEfs)。
## 作業
[訪問一位數據科學家](assignment.md)
[訪問一位資料科學家](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**免責聲明**
此文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤詮釋概不負責。
本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們力求準確,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件的原文版本應視為權威來源。對於重要資訊,建議使用專業人工翻譯。我們對因使用本翻譯而引起的任何誤解或誤釋概不負責。
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,137 +1,136 @@
# 使用 Scikit-learn 建立迴歸模型:四種迴歸方
# 使用 Scikit-learn 建立迴歸模型:四種迴歸方
## 初學者
## 初學者
線性迴歸用於當我們想要預測<strong>數值</strong>(例如,房價、溫度或銷售額)時。
線性迴歸透過尋找一條最佳代表輸入特徵和輸出之間關係的直線來運作。
當我們想要預測<strong>數值</strong>(例如房屋價格、溫度或銷售額)時,會使用線性迴歸。它是透過尋找最能代表輸入特徵與輸出之間關係的直線來進行預測。
在本課程中,我們著重於先理解概念,再探索更進階的迴歸技術。
![線性與多項式歸資訊圖](../../../../translated_images/zh-HK/linear-polynomial.5523c7cb6576ccab.webp)
> 資訊圖由 [Dasani Madipalli](https://twitter.com/dasani_decoded) 製作
本課程將先專注於理解概念,稍後再探討更進階的迴歸技術。
![線性與多項式歸資訊圖](../../../../translated_images/zh-HK/linear-polynomial.5523c7cb6576ccab.webp)
> 資訊圖由 [Dasani Madipalli](https://twitter.com/dasani_decoded) 製作
## [課前小測驗](https://ff-quizzes.netlify.app/en/ml/)
> ### [本課程亦有 R 版本!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html)
### 介紹
> ### [本課程也提供 R 語言版本!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html)
### 導言
到目前為止,您已經使用南瓜價格資料集探索了什麼是迴歸,並且使用 Matplotlib 做了資料視覺化。
到目前為止,你已經用南瓜定價資料集探討了迴歸概念,並使用 Matplotlib 進行視覺化。
現在您已準備深入了解機器學習的迴歸。雖然視覺化可以幫助理解資料但機器學習的真正威力來自於_訓練模型_。模型是基於歷史資料訓練而成能自動捕捉資料間的依賴關係並能對之前沒看過的新資料預測結果
現在你準備深入了解 ML 中的迴歸應用。視覺化讓你理解資料,真正的機器學習威力來自於「訓練模型」。模型會基於歷史資料自動捕捉資料關聯,並能對未見過的新資料進行預測
在本課中您將學習兩種迴歸_基本線性迴歸_及_多項式迴歸_以及其中一些數學原理。這些模型將讓我們根據不同輸入資料預測南瓜價格。
本課程將介紹兩種迴歸方式:_基本線性迴歸_和_多項式迴歸_,並涵蓋這些技術背後的數學原理。這些模型將幫助我們依據不同輸入資料預測南瓜價格。
[![機器學習入門 - 理解線性迴歸](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "機器學習入門 - 理解線性迴歸")
[![初學者機器學習 - 理解線性迴歸](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "初學者機器學習 - 理解線性迴歸")
> 🎥 點擊上方圖片觀看線性迴歸的簡短影片概述
> 🎥 點擊上方圖片觀看線性迴歸的簡短影片介紹
> 在整個課程中,我們假設學員的數學知識量少,並力求讓其他領域的學生都能理解,因此會有註解、🧮 重點標註、圖解及其他學習工具協助理解
> 本課程假設極少的數學背景,並致力讓非相關領域的學生也能理解,請留意課堂筆記、🧮 數學補充、圖表等學習輔助工具
### 先知識
### 先知識
您應該已熟悉我們正在檢視的南瓜資料結構。這份資料已預先載入並清理好,在本課的 _notebook.ipynb_ 檔案中。檔中南瓜價格以每蒲式耳價格顯示於新的資料框中。請確保您能在 Visual Studio Code 的環境中執行這些筆記本
你現在應熟悉我們分析的南瓜資料結構。資料已預先載入並清理,存於本課程的 _notebook.ipynb_。在該檔案中,南瓜價格以「每蒲式耳」價格呈現。請確定你能在 Visual Studio Code 的 kernel 執行這些 notebook
### 準備工作
提醒您,載入這些資料是為了探究一些問題:
提醒你,載入資料是為了向它提出問題:
- 何時購買南瓜最划算?
- 一箱迷你南瓜的價格大約多少?
- 應該買半蒲式耳的籃子,還是 1又1/9蒲式耳的箱子
讓我們繼續挖掘這些資料。
- 什麼時候買南瓜最划算?
- 一箱迷你南瓜大約多少
- 我該買半蒲式耳籃裝還是 1 1/9 蒲式耳箱裝?
讓我們持續深入挖掘資料。
前一課中,您建立了 Pandas 資料框,並填入原始資料的部分,且將價格以蒲式耳標準化。但如此一來,只收集了約 400 筆資料,且僅涵蓋秋季
上一課中,你建立了 Pandas dataframe 並用原始數據部分填充,還根據蒲式耳標準化了價格。不過,那時僅蒐集約 400 筆資料,也只涵蓋秋季月份
請看看本課附帶筆記本所載入的資料,我們已有初始散點圖繪出月份資料。也許透過更多清理,我們能獲得這資料本質的更多細節
請看看本課 notebook 中預載的資料。資料已預先載入,並藉由散佈圖初步描繪出月份資料。也許我們可以進一步清理,以更細緻了解資料本質
## 線性迴歸線
## 線性迴歸
您在第一課學到的,線性迴歸的目標是能繪出一條線,以:
第一課所學,線性迴歸的目的是畫出一條線,用以:
- <strong>展示變數間關係</strong>。展現變數的相互關係
- <strong>進行預測</strong>準確預測新資料點在線上的落點
- <strong>顯示變數關係</strong>。展示變數間的關聯。
- <strong>進行預測</strong>對新數據點相較這條線的落點做出精準預測。
<strong>最小平方法迴歸</strong>通常用於繪製此類線條。所謂「最小平方法」是指最小化模型總誤差的過程。對每個資料點,我們測量該點與迴歸線間的垂直距離(稱為殘差)。
此類線通常由<strong>最小平方法回歸</strong>繪出。「最小平方法」指的是最小化模型總誤差的過程。對每筆資料點,測量實際點與迴歸線間的垂直距離(稱作殘差)。
我們將這些距離平方,主要有兩個原因
這些距離會被平方,理由有二
1. <strong>重視誤差大小而非方向</strong>:誤差 -5 與誤差 +5 對我們而言應同等重要,平方能將所有誤差轉為正數
1. <strong>大小勝過方向</strong>:我們希望把 -5 與 +5 的誤差同等對待,平方後皆轉為正值
2. <strong>對離群值加重懲罰</strong>:平方會加重較大誤差的權重,促使線條貼近偏遠點。
2. <strong>懲罰離群點</strong>:平方強化較大誤差權重,迫使線條更貼近遠離的點。
接著將所有平方後的誤差相加,希望求出誤差和最小的那條線——這即是「最小平方法」的由來
接著將所有平方值加總。目標是找到能使平方誤差加總最低(最小值)的線,因此稱為「最小平方法」
> **🧮 為我展示數學推導**
> **🧮 數學公式展現**
>
> 這條線稱為_最適合線_可用[一個方程](https://en.wikipedia.org/wiki/Simple_linear_regression)表示
> 此線稱為_最佳擬合線_,可用[以下方程式表達](https://en.wikipedia.org/wiki/Simple_linear_regression)
>
> ```
> Y = a + bX
> ```
>
> `X` 為「解釋變數」;`Y` 為「應變數」。線的斜率是 `b`,而 `a` 是 y 截距,表示當 `X = 0``Y` 的數值。
>
>![計算斜率](../../../../translated_images/zh-HK/slope.f3c9d5910ddbfcf9.webp)
>
> 先計算斜率 `b`。資訊圖由 [Jen Looper](https://twitter.com/jenlooper) 提供
>
> 換句話說,針對南瓜資料的原始問題:「根據月份預測每蒲式耳南瓜價格」,`X` 是指價格而 `Y` 是銷售的月份。
>
>![完成式](../../../../translated_images/zh-HK/calculation.a209813050a1ddb1.webp)
>
> 計算 Y 的數值。如果您付約 $4就應該是四月資訊圖由 [Jen Looper](https://twitter.com/jenlooper) 提供
>
> 計算該線的數學必須展示斜率,也取決於截距,也就是 `X = 0``Y` 所在位置。
>
> 可參考 [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) 網站來觀察此計算方法;也可使用 [此最小平方法計算器](https://www.mathsisfun.com/data/least-squares-calculator.html) 來觀察數字如何影響迴歸線
>
> `X` 是「解釋變數」,`Y` 是「被解釋變數」。線的斜率是 `b``a` 是 y 軸截距,即當 `X = 0` 時的 `Y` 值。
>
>![計算斜率](../../../../translated_images/zh-HK/slope.f3c9d5910ddbfcf9.webp)
>
> 先計算斜率 `b`。資訊圖由 [Jen Looper](https://twitter.com/jenlooper) 製作。
>
> 換句話說,根據我們的南瓜數據的問題:「依月份預測每蒲式耳南瓜價格」,`X` 指價格,`Y` 指銷售月份。
>
>![完成式](../../../../translated_images/zh-HK/calculation.a209813050a1ddb1.webp)
>
> 計算 Y 的值。如果你付了約 4 美元,那一定是四月!資訊圖表由 [Jen Looper](https://twitter.com/jenlooper) 製作。
>
> 計算線條的數學必須反映出斜率,也取決於截距,即當 `X = 0``Y` 的位置。
>
> 可參考 [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) 網站了解計算方法,也可以使用[這個最小平方法計算器](https://www.mathsisfun.com/data/least-squares-calculator.html) 觀察數值如何影響線條
## 相關係數
另一重要詞彙是給定 `X``Y` 變數間的<strong>相關係數</strong>。透過散點圖,您能快速直觀地看見此係數。若資料點沿著一條整齊的線散佈,代表高度相關;若資料點分佈分散在 `X``Y` 之間,則代表相關性低。
另一重要概念是給定 X 和 Y 變數間的<strong>相關係數</strong>。利用散佈圖,能快速看出相關輕重。若資料點沿一條整齊線排列,相關程度高;若資料點在 X、Y 間散布成零散狀,則相關度低。
一個好的線性迴歸模型,其相關係數用最小平方法計算得到的值應該是高的(接近 1而非 0
一個良好的線性迴歸模型,會有接近 1比 0 大得多)的高相關係數,並採用最小平方法找到最適回歸線
✅ 執行本課附帶的筆記本並觀察「月份對價格」的散點圖。從這散點圖視覺判斷,與南瓜銷售之月對價格的資料,看起來是高還是低相關?如果改為使用更細緻的時間尺度取代月份,例如「一年中第幾天」(自年初起的天數),結果會改變嗎?
✅ 執行本課附帶的 notebook觀察「月份對價格」的散佈圖。依你目測南瓜銷售的「月份價格」資料是高相關還是低相關換用更細膩的時間單位如「年中第幾天」Day of Year),結果會改變嗎?
接下來的程式中,我們假設資料已清理完畢,並產生類似以下的 `new_pumpkins` 資料框
下面程式碼示範假設資料已清理乾淨,並取得名為 `new_pumpkins` 的資料框,內容大致如下
ID | 月份 | 一年中第幾天 | 品種 | 城市 | 包裝 | 最低價 | 最高價 | 價格
---|-----|--------|------|------|-------|-------|-------|-------
70 | 9 | 267 | 派用型 | 巴爾的摩 | 1又1/9蒲式耳箱 | 15.0 | 15.0 | 13.636364
71 | 9 | 267 | 派用型 | 巴爾的摩 | 1又1/9蒲式耳箱 | 18.0 | 18.0 | 16.363636
72 | 10 | 274 | 派用型 | 巴爾的摩 | 1又1/9蒲式耳箱 | 18.0 | 18.0 | 16.363636
73 | 10 | 274 | 派用型 | 巴爾的摩 | 1又1/9蒲式耳箱 | 17.0 | 17.0 | 15.454545
74 | 10 | 281 | 派用型 | 巴爾的摩 | 1又1/9蒲式耳箱 | 15.0 | 15.0 | 13.636364
ID | Month | DayOfYear | Variety | City | Package | Low Price | High Price | Price
---|-------|-----------|---------|------|---------|-----------|------------|-------
70 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364
71 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636
72 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636
73 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 17.0 | 17.0 | 15.454545
74 | 10 | 281 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364
> 資料清理的程式碼請參見 [`notebook.ipynb`](notebook.ipynb)。我們執行了與上一課相同的清理步驟,並用下式計算出 `DayOfYear` 欄位:
> 清理資料的程式碼可在 [`notebook.ipynb`](notebook.ipynb) 中找到。我們做了和前一課相同的清理步驟,`DayOfYear` 欄位是用以下公式計算的:
```python
day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)
```
現在您已了解線性迴歸的數學原理,讓我們建立迴歸模型,看看是否能預測出哪種包裝的南瓜價格最划算。想要打造南瓜節慶角落的購買者,會希望知悉這資訊以最佳化南瓜包裝的購買決策
理解線性迴歸背後的數學後,讓我們來建立一個迴歸模型,看看能否預測哪種包裝的南瓜價格較低。要在節慶南瓜園採購南瓜時,這資訊有助於優化選購方案
## 尋找相關性
[![機器學習入門 - 尋找相關性:線性迴歸的關鍵](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "機器學習入門 - 尋找相關性:線性迴歸的關鍵")
[![初學者機器學習 - 尋找相關性:線性迴歸的關鍵](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "初學者機器學習 - 尋找相關性:線性迴歸的關鍵")
> 🎥 點擊上方圖片觀看相關性的簡短影片概述
> 🎥 點擊圖片觀看相關性的簡短影片介紹
在先前的課堂中,您大概已看到不同月份的平均價格如下
前一課你可能已見過不同月份平均價格如下圖
<img alt="各月份平均價格" src="../../../../translated_images/zh-HK/barchart.a833ea9194346d76.webp" width="50%"/>
顯示應該存在某種相關性,我們可以嘗試訓練線性迴歸模型來預測 `Month``Price``DayOfYear``Price` 間的關係。下圖展示後者的散點圖:
代表應該會有某種相關性,我們可以嘗試訓練線性迴歸模型,去預測 `Month``Price``DayOfYear``Price` 之間的關係。下圖是後者的散佈圖:
<img alt="價格與一年中第幾天散點圖" src="../../../../translated_images/zh-HK/scatter-dayofyear.bc171c189c9fd553.webp" width="50%" />
<img alt="價格與年中日散佈圖" src="../../../../translated_images/zh-HK/scatter-dayofyear.bc171c189c9fd553.webp" width="50%" />
我們用 `corr` 函式來看看有無相關性
讓我們用 `corr` 函式檢視相關係數
```python
print(new_pumpkins['Month'].corr(new_pumpkins['Price']))
print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price']))
```
來相關性非常小,使用 `Month` 為 -0.15,使用 `DayOfMonth` 為 -0.17,但可能還有另一個重要的關係。價格在不同南瓜品種間似乎分成不同群聚。為了驗證此假設,我們用不同顏色來繪製各南瓜類別。透過給 `scatter` 函式傳入 `ax` 參數,可以將所有點繪製在同一張圖上
起來相關性偏低,`Month` 約為 -0.15`DayOfYear` 約 -0.17,但似乎有其他重要因素。不同南瓜品種對應不同價格群聚。為驗證,將每種南瓜用不同顏色繪圖。傳入 `ax` 參數至 `scatter` 繪圖函式可同時在同張圖上繪出所有點
```python
ax=None
@ -140,75 +139,75 @@ for i,var in enumerate(new_pumpkins['Variety'].unique()):
df = new_pumpkins[new_pumpkins['Variety']==var]
ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var)
```
<img alt="一年中第幾天與價格散點圖(有顏色區分)" src="../../../../translated_images/zh-HK/scatter-dayofyear-color.65790faefbb9d54f.webp" width="50%" />
研究顯示品種對價格影響比銷售日期更大。我們用長條圖來說明:
<img alt="價格與年中日散佈圖(彩色品種區分)" src="../../../../translated_images/zh-HK/scatter-dayofyear-color.65790faefbb9d54f.webp" width="50%" />
結果顯示品種對價格影響較大,勝過實際銷售日期。下圖柱狀圖呈現此結果:
```python
new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar')
```
<img alt="品種與價格長條圖" src="../../../../translated_images/zh-HK/price-by-variety.744a2f9925d9bcb4.webp" width="50%" />
暫時只聚焦於一種南瓜品種「派用型」,來看看日期對價格的影響:
<img alt="不同品種價格柱狀圖" src="../../../../translated_images/zh-HK/price-by-variety.744a2f9925d9bcb4.webp" width="50%" />
暫時只聚焦於南瓜品種中的「派用型」pie type觀察日期對價格的影響
```python
pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
pie_pumpkins.plot.scatter('DayOfYear','Price')
```
<img alt="一天中日期與價格散點圖" src="../../../../translated_images/zh-HK/pie-pumpkins-scatter.d14f9804a53f927e.webp" width="50%" />
<img alt="價格與年中日散佈圖(派用型)" src="../../../../translated_images/zh-HK/pie-pumpkins-scatter.d14f9804a53f927e.webp" width="50%" />
如果這時用 `corr` 函式計算 `Price``DayOfYear` 的相關性,大約是 `-0.27`,意味著訓練預測模型是合理的。
接著以 `corr` 函式計算 `Price``DayOfYear` 的相關係數,可能得出約 `-0.27`,顯示訓練預測模型是有意義的。
> 在訓練線性迴歸前,務必確保資料乾淨。線性迴歸對缺漏值不友善,因此最好去除所有空值儲存格
> 訓練線性迴歸模型前,務必確認資料是乾淨的。線性迴歸不適用於遺失值,因此應排除所有空白欄位
```python
pie_pumpkins.dropna(inplace=True)
pie_pumpkins.info()
```
另一個作法是使用相對應欄位的平均值填充這些空值
另一種做法是用該欄位平均值填補空白資料
## 簡單線性迴歸
[![機器學習入門 - 使用 Scikit-learn 線性與多項式迴歸](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "機器學習入門 - 使用 Scikit-learn 線性與多項式迴歸")
[![初學者機器學習 - 使用 Scikit-learn 線性與多項式迴歸](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "初學者機器學習 - 使用 Scikit-learn 線性與多項式迴歸")
> 🎥 點擊上方圖片觀看線性與多項式迴歸的簡短影片概述
> 🎥 點擊圖片觀看線性及多項式迴歸的簡短影片介紹
我們將使用 **Scikit-learn** 函式庫來訓練線性迴歸模型
訓練線性迴歸模型時,我們會使用 **Scikit-learn** 函式庫
```python
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
```
首先將輸入值(特徵)與預期輸出(標籤)分開存成 numpy 陣列:
我們先將輸入特徵features與預期輸出label分別存為兩個 numpy 陣列:
```python
X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1)
y = pie_pumpkins['Price']
```
> 注意我們必須對輸入資料做 `reshape`,讓線性迴歸模組可正確理解。線性迴歸要求輸入為二維陣列,陣列中每一列代表一組輸入特徵向量。由於我們只有一個輸入特徵,故需為形狀 N×1 的陣列N 為資料集大小。
接著,需將資料劃分為訓練集和測試集,以便訓練後驗證模型:
> 注意我們必須對輸入資料做 `reshape`,讓 Linear Regression 套件能識別。線性迴歸期待輸入為二維陣列,每列為一組特徵向量。因為我們只有一個輸入變數,須將陣列形狀調整為 N×1其中 N 是資料筆數。
接著,將資料切分成訓練集與測試集,方便訓練後評估模型:
```python
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
```
最後,訓練線性迴歸模型只需兩行程式:定義 `LinearRegression` 物件,並用 `fit` 方法擬合模型
最後,訓練線性迴歸模型只要兩行程式碼。定義 `LinearRegression` 物件,並用 `fit` 方法套用資料
```python
lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train)
```
`fit` 後的 `LinearRegression` 對象包含了回歸的所有係數,可以通過 `.coef_` 屬性訪問。在我們的情況下,只有一個係數,應該約為 `-0.017`。這意味著價格似乎隨時間略有下降,但不多,大約每天下降 2 分錢。我們還可以使用 `lin_reg.intercept_` 訪問回歸與 Y 軸的交點 — 在我們的情況下將約為 `21`,表示年初的價格。
`LinearRegression` 對象在 `fit` 之後包含了迴歸的所有係數,可以通過 `.coef_` 屬性訪問。在我們的例子中,只有一個係數,應該約為 `-0.017`。這意味著價格隨時間略有下降,但不多,大約每天下降 2 分錢。我們還可以通過 `lin_reg.intercept_` 訪問迴歸與 Y 軸的截距 — 在我們的例子中約為 `21`,表示年初的價格。
為了查看我們模型的準確度我們可以在測試數據集上進行價格預測然後測量預測值與預期值的接近程度。這可以通過均方根誤差RMSE指標完成該指標是所有預期值與預測值差的平方平均的平方根。
為了檢視模型的準確度,我們可以在測試數據集上預測價格,然後測量預測結果與期望值的接近程度。這可以使用均方根誤差 (RMSE) 指標計算,即期望值與預測值所有平方差均值的平方根。
```python
pred = lin_reg.predict(X_test)
@ -217,15 +216,15 @@ rmse = np.sqrt(mean_squared_error(y_test,pred))
print(f'RMSE: {rmse:3.3} ({rmse/np.mean(pred)*100:3.3}%)')
```
我們的誤差約為 2 點,約為 17%。不太理想。另一個模型質量的指標是 <strong>決定係數</strong>,可以如下獲得:
我們的誤差約為 2 點,約為 17%。表現不是很好。另一個評估模型質量的指標是<strong>決定係數</strong>,可以這樣獲得:
```python
score = lin_reg.score(X_train,y_train)
print('Model determination: ', score)
```
若該值為 0表示模型未考慮輸入數據行為就像<em>最差的線性預測器</em>,即結果的均值。值為 1 表示我們可以完美預測所有預期輸出。在我們的情況下,係數約為 0.06,較低。
如果值為 0表示模型沒有考慮輸入數據表現為<em>最差線性預測器</em>,即結果的均值。值為 1 表示我們可以完美預測所有預期輸出。在我們的例子中,係數約為 0.06,相當低。
我們還可以將測試數據與回歸線繪製在一起,以更好地觀察回歸情況
我們還可以將測試數據與迴歸線一起繪圖,更清楚地觀察迴歸效果
```python
plt.scatter(X_test,y_test)
@ -234,19 +233,19 @@ plt.plot(X_test,pred)
<img alt="Linear regression" src="../../../../translated_images/zh-HK/linear-results.f7c3552c85b0ed1c.webp" width="50%" />
## 多項式
## 多項式
另一種線性回歸是多項式回歸。有時變量之間呈線性關係——比如體積越大的南瓜價格越高——但有時這種關係無法用平面或直線表示。
另一種線性迴歸類型是多項式迴歸。有時候變量之間是線性關係 — 譬如南瓜體積越大,價格越高 — 但有時這些關係無法用平面或直線表示。
✅ 這裡有[一些額外範例](https://online.stat.psu.edu/stat501/lesson/9/9.8)數據適合用多項式回歸
✅ 這裡有一些[更多範例](https://online.stat.psu.edu/stat501/lesson/9/9.8)適合使用多項式迴歸的資料
再看看日期和價格的關係。這個散點圖是否一定要用直線分析?價格難道不會波動嗎?這種情況下,可以嘗試多項式回歸。
再看看日期與價格的關係。散點圖是否一定要用直線分析?價格難道不會波動?此時可以嘗試多項式迴歸。
✅ 多項式是由一個或多個變量及係數構成的數學表達式
✅ 多項式是可能包含一個或多個變量及係數的數學表達式
多項式回歸產生一條曲線,更好地擬合非線性數據。在我們的案例中,若將平方的 `DayOfYear` 變量加入輸入資料,應能用拋物線曲線擬合數據,曲線在一年中某點處有最小值。
多項式迴歸會擬合曲線以更好地適應非線性資料。在我們的例子中,如果將平方的 `DayOfYear` 變量加入輸入資料,就能用拋物線擬合數據,且拋物線會在年度中的某點有最小值。
Scikit-learn 提供了方便的[管道 API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline)來將不同的數據處理步驟組合起來<strong>管道</strong>是一系列<strong>估計器</strong>。在這裡,我們創建一個管道,先加入多項式特徵,然後進行回歸訓練
Scikit-learn 提供了實用的[管道 API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline),用來串聯資料處理的各步驟<strong>管道</strong>是一連串<strong>估計器</strong>。在此,我們會先產生多項式特徵,再培訓迴歸模型
```python
from sklearn.preprocessing import PolynomialFeatures
@ -257,36 +256,58 @@ pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)
```
使用 `PolynomialFeatures(2)` 表示我們將包含所有二次項多項式。對於一個變量僅為 `DayOfYear` 的平方,但對兩個輸入變量 X 和 Y 則為 X<sup>2</sup>、XY、Y<sup>2</sup>。我們也可以使用更高次多項式。
使用 `PolynomialFeatures(2)` 表示我們將包括輸入數據中所有二次多項式。對我們來說,只有 `DayOfYear`<sup>2</sup>,但如果有兩個輸入變量 X 與 Y則會加上 X<sup>2</sup>、XY 與 Y<sup>2</sup>。如果想,也可以使用更高次數的多項式。
管道的用法與原本的 `LinearRegression` 物件相同,即先 `fit` 管道,接著用 `predict` 得到預測結果:
```python
pred = pipeline.predict(X_test)
rmse = np.sqrt(mean_squared_error(y_test,pred))
print(f'RMSE: {rmse:3.3} ({rmse/np.mean(pred)*100:3.3}%)')
score = pipeline.score(X_train,y_train)
print('Model determination: ', score)
```
為了繪製平滑擬合曲線,我們使用 `np.linspace` 產生均勻分布的輸入值,而非直接在無序的測試資料中繪圖(否則線條會鋸齒狀):
```python
X_range = np.linspace(X_test.min(), X_test.max(), 100).reshape(-1,1)
y_range = pipeline.predict(X_range)
plt.scatter(X_test, y_test)
plt.plot(X_range, y_range)
```
管道可以像原始的 `LinearRegression` 對象那樣使用,即可 `fit` 管道,然後用 `predict` 獲取預測結果。下面的圖展示了測試數據和擬合的曲線:
以下是測試資料與擬合曲線的圖示
<img alt="Polynomial regression" src="../../../../translated_images/zh-HK/poly-results.ee587348f0f1f60b.webp" width="50%" />
使用多項式回歸,我們可以獲得稍低的均方誤差和更高的決定係數,但提升不明顯。需要考慮其他特徵!
使用多項式迴歸,我們可以得到稍低的 RMSE 與較高的決定係數,但幅度有限。我們還需要考慮其他特徵!
> 你可以看到最小南瓜價格出現在萬聖節前後。你如何解釋這種現象?
> 你可以看到最低的南瓜價格出現在萬聖節附近。你怎麼解釋這個現象?
🎃 恭喜,你剛剛建立了一個能幫助預測派南瓜價格的模型。你也可以用同樣的方法針對所有南瓜品種建立模型,但那會很繁瑣。接下來學習如何將南瓜品種納入模型考慮!
🎃 恭喜你剛完成可以預測派用南瓜價格的模型。你大概也可以用同樣流程對其他南瓜種類進行建模,但會很費時。接下來讓我們學習如何將南瓜品種納入模型
## 類別特徵
理想狀況下,我們希望用同一模型預測不同南瓜品種的價格。但 `Variety` 欄位與 `Month` 不同,因為它包含非數字值。這類欄位稱為<strong>類別特徵categorical</strong>
理想情況下,我們希望能用同一模型預測不同南瓜品種的價格。但 `Variety` 欄位與 `Month` 欄位不同,因為它包含非數字值。這類欄位稱為<strong>類別欄位(categorical)</strong>
[![ML for beginners - Categorical Feature Predictions with Linear Regression](https://img.youtube.com/vi/DYGliioIAE0/0.jpg)](https://youtu.be/DYGliioIAE0 "ML for beginners - Categorical Feature Predictions with Linear Regression")
> 🎥 點擊上圖觀看簡短影片,了解如何使用類別特徵。
> 🎥 點擊上圖觀看使用類別特徵的簡短影片
這裡展示了平均價格與品種的關係:
這裡可以看到不同品種的平均價格
<img alt="Average price by variety" src="../../../../translated_images/zh-HK/price-by-variety.744a2f9925d9bcb4.webp" width="50%" />
要考慮品種,首先要將其轉為數字形式,即<strong>編碼</strong>。有幾種方法:
為了考慮品種,我們首先要將其轉換成數值形式,即<strong>編碼</strong>。有幾種方法:
* 簡單的<strong>數字編碼</strong>會建一個包含各品種的表格,然後用對應索引替換品種名稱。這對線性回歸不是最佳方案,因為線性回歸使用索引的數字值乘以係數再加總,然而指標號碼和價格的關係顯然非線性,即使索引有特定排序也無法保證
* <strong>獨熱編碼One-hot encoding</strong>則把 `Variety` 欄拆成 4 個不同欄位(每個品種一欄)。對應行屬該品種的欄位為 `1`,否則為 `0`。這意味著線性回歸中會有四個係數,分別表示各品種的「起始價格」或「額外價格」
* 簡單的 <strong>數值編碼</strong> 是建立一張不同品種的索引表,再將品種名以該表的索引數替代。這對線性迴歸不算好,因為線性迴歸直接用該數字乘上係數,然後加到結果中。我們的例子中,索引與價格的關係明顯非線性,即使我們確保索引有特定順序
* **One-hot 編碼** 會將 `Variety` 欄位拆成四個不同欄位,對應四種品種。每個欄位若該行是此品種則為 `1`,否則為 `0`。這會產生四個線性迴歸係數,分別代表每種南瓜品種的「基準價格」(或者更準確來說,是「額外價格」)
下面代碼演示如何獨熱編碼品種
下面的程式碼展示如何對品種使用 one-hot 編碼
```python
pd.get_dummies(new_pumpkins['Variety'])
@ -303,14 +324,14 @@ pd.get_dummies(new_pumpkins['Variety'])
1741 | 0 | 1 | 0 | 0
1742 | 0 | 1 | 0 | 0
要用獨熱編碼的品種作為輸入訓練線性回歸,只要正確初始化 `X``y` 數據即可
要用 one-hot 編碼品種的資料訓練線性迴歸,我們只要正確初始化 `X``y`
```python
X = pd.get_dummies(new_pumpkins['Variety'])
y = new_pumpkins['Price']
```
其餘代碼與之前用於訓練線性回歸的相同。試驗後會看到均方誤差約相同,但決定係數大幅提升至約 77%。要想更精確,也可納入更多類別特徵和數值特徵,如 `Month``DayOfYear`。為了拼成一個大特徵陣列,可使用 `join`
其餘程式碼與我們之前用來訓練線性迴歸的相同。如果你嘗試,你會發現均方誤差差不多,但決定係數大幅提升到約 77%。要得到更準確的預測,我們還可以考慮更多類別型特徵及數值型特徵,如 `Month``DayOfYear`。為了合併成一個特徵陣列,可使用 `join`
```python
X = pd.get_dummies(new_pumpkins['Variety']) \
@ -320,11 +341,11 @@ X = pd.get_dummies(new_pumpkins['Variety']) \
y = new_pumpkins['Price']
```
這裡我們還考慮了 `City``Package` 類型,結果為 MSE 2.84(約 10%決定係數 0.94
這裡我們還加入了 `City``Package` 類型,結果是 RMSE 2.8410.5%)與決定係數 0.94
## 綜合應用
## 全面整合
為構建最佳模型,我們可以將上述示例中一熱編碼類別+數值的特徵結合多項式回歸。以下是完整代碼,方便參考
要做出最佳模型我們可以用上述合併的one-hot 編碼類別 + 數值)特徵資料,同時套用多項式迴歸。方便起見,這是完整程式碼
```python
# 設置訓練數據
@ -334,46 +355,46 @@ X = pd.get_dummies(new_pumpkins['Variety']) \
.join(pd.get_dummies(new_pumpkins['Package']))
y = new_pumpkins['Price']
# 進行訓練和測試分割
# 製作訓練和測試數據分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# 設置並訓練流程
# 設置及訓練管道
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)
# 預測測試數據結果
pred = pipeline.predict(X_test)
# 計算均方誤差和決定係數
mse = np.sqrt(mean_squared_error(y_test,pred))
print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')
# 計算均方根誤差及判定係數
rmse = mean_squared_error(y_test, pred, squared=False)
print(f'RMSE: {rmse:3.3} ({rmse/pred.mean()*100:3.3}%)')
score = pipeline.score(X_train,y_train)
print('Model determination: ', score)
```
預計獲得近乎 97% 的最佳決定係數,以及 MSE=2.23(約 8% 預測誤差)。
這應該會得到接近 97% 的最高決定係數RMSE=2.23(約 8% 的預測誤差)。
| 模型 | MSE | 決定係數 |
|-------|-----|---------------|
| `DayOfYear` 線性 | 2.77 (17.2%) | 0.07 |
| `DayOfYear` 多項式 | 2.73 (17.0%) | 0.08 |
| `Variety` 線性 | 5.24 (19.7%) | 0.77 |
| 所有特徵 線性 | 2.84 (10.5%) | 0.94 |
| 所有特徵 多項式 | 2.23 (8.25%) | 0.97 |
| 模型 | RMSE | 決定係數 |
|-------|-----|---------|
| `DayOfYear` 線性迴歸 | 2.77 (17.2%) | 0.07 |
| `DayOfYear` 多項式迴歸 | 2.73 (17.0%) | 0.08 |
| `Variety` 線性迴歸 | 5.24 (19.7%) | 0.77 |
| 所有特徵 線性迴歸 | 2.84 (10.5%) | 0.94 |
| 所有特徵 多項式迴歸 | 2.23 (8.25%) | 0.97 |
🏆 做得好!本課程你建立了四種回歸模型,並將模型質量提升至 97%。最後一節關於回歸,會介紹用於分類的邏輯迴歸。
🏆 做得好!你在一課中創建了四個迴歸模型,並將模型質量提升至 97%。在迴歸的最後部分,你將學習用來判別類別的邏輯迴歸。
---
## 🚀挑戰
## 🚀 挑戰
試驗本筆記本中的多種變數,看看相關性如何影響模型準確度
在這個筆記本中嘗試幾個不同變量,看看它們的相關性如何對模型準確度造成影響
## [課後測驗](https://ff-quizzes.netlify.app/en/ml/)
## [課後測驗](https://ff-quizzes.netlify.app/en/ml/)
## 複習與自學
本課學習了線性回歸。還有其他重要的回歸類型。請閱讀逐步回歸、嶺回歸、套索回歸和彈性網技術。學習更多可參考[史丹佛統計學習課程](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning)
本課我們學到了線性迴歸。還有其他重要類型的迴歸。可以閱讀關於逐步、嶺回歸 (Ridge)、套索 (Lasso) 和彈性網路 (Elasticnet) 的技術。推薦研習的課程是[史丹佛統計學習課程](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning)
## 作業
@ -383,5 +404,5 @@ print('Model determination: ', score)
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**免責聲明**
本文件 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻譯而成。雖然我們致力於準確,請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議聘請專業人工翻譯。對於因使用本翻譯而產生的任何誤解或錯誤詮釋,我們概不負責
本文件係使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻譯而成。雖然我們致力於確保翻譯準確,請注意自動翻譯可能包含錯誤或不準確之處。原始文件之原文版本應被視為權威來源。對於重要資訊,建議採用專業人工翻譯。我們不對因使用本翻譯而引致的任何誤解或誤譯承擔責任
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -4,14 +4,14 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## 南瓜定價的線性回歸與多項式回歸 - 第三課\n",
"## 南瓜定價的線性與多項式回歸 - 課程 3\n",
"\n",
"載入所需的庫和數據集。將數據轉換為包含數據子集的數據框:\n",
"載入所需的函式庫和數據集。將數據轉換成包含部分數據的資料框:\n",
"\n",
"- 只選取按蒲式耳定價的南瓜\n",
"- 只取以蒲式耳計價的南瓜\n",
"- 將日期轉換為月份\n",
"- 計算價格為高價與低價的平均值\n",
"- 將價格轉換為按蒲式耳數量計算的價格\n"
"- 將價格轉換以反映蒲式耳數量的定價\n"
]
},
{
@ -377,7 +377,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"散圖提醒我們,我們只有八月至十二月的月份數據。我們可能需要更多數據才能以線性方式得出結論。\n"
"散圖提醒我們,我們只有八月至十二月的月份數據。我們可能需要更多數據才能以線性方式得出結論。\n"
]
},
{
@ -447,7 +447,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"讓我們看看是否存在相關性:\n"
]
},
{
"cell_type": "code",
@ -472,7 +474,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"看起來相關性相當小,但存在一些其他更重要的關係——因為上圖中的價格點似乎有幾個明顯的群集。讓我們製作一個圖表來顯示不同的南瓜品種:\n"
"看起來相關性相當小,但還有其他更重要的關係——因為上面圖中的價格點似乎有幾個明顯的群集。讓我們畫一張圖來顯示不同的南瓜品種:\n"
]
},
{
@ -535,7 +537,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"暫時,我哋專注喺一款品種——<strong>撻類</strong>。\n"
]
},
{
"cell_type": "code",
@ -662,7 +666,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"可以從線性回歸係數中確定直線的斜率:\n"
"可以從線性回歸係數中確定直線的斜率:\n"
]
},
{
@ -688,7 +692,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"我們可以使用訓練好的模型來預測價格:\n"
]
},
{
"cell_type": "code",
@ -718,9 +724,9 @@
"source": [
"### 多項式回歸\n",
"\n",
"有時候,特徵與結果之間的關係本質上是非線性的。例如,南瓜的價格可能在冬季(月份=1,2較高然後在夏季月份=5-7下降接著再次上升。線性回歸無法準確捕捉這種關係。\n",
"有時候,特徵與結果之間的關係本質上是非線性的。例如,南瓜價格可能在冬天(月份=1,2很高然後在夏天月份=5-7下降再之後上升。線性回歸無法準確擬合這種關係。\n",
"\n",
"在這種情況下,我們可以考慮添加額外的特徵。一個簡單的方法是使用來自輸入特徵的多項式,這樣就會形成**多項式回歸**。在 Scikit Learn 中,我們可以使用管道自動預先計算多項式特徵:\n"
"在這種情況下,我們可以考慮增加額外的特徵。一個簡單的方法是使用輸入特徵的多項式,這將導致<strong>多項式回歸</strong>。在 Scikit Learn 中,我們可以使用管線自動預先計算多項式特徵:\n"
]
},
{
@ -775,22 +781,25 @@
"score = pipeline.score(X_train,y_train)\n",
"print('Model determination: ', score)\n",
"\n",
"plt.scatter(X_test,y_test)\n",
"plt.plot(sorted(X_test),pipeline.predict(sorted(X_test)))"
"X_range = np.linspace(X_test.min(), X_test.max(), 100).reshape(-1,1)\n",
"y_range = pipeline.predict(X_range)\n",
"\n",
"plt.scatter(X_test, y_test)\n",
"plt.plot(X_range, y_range)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 編碼品種\n",
"### 編碼變化\n",
"\n",
"在理想情況下,我們希望能使用同一個模型來預測不同南瓜品種的價格。為了考慮品種,我們首先需要將其轉換為數字形式,或者稱為**編碼**。有幾種方法可以做到\n",
"在理想情況下,我們希望能使用同一個模型來預測不同南瓜品種的價格。要考慮品種這個因素,首先我們需要將其轉換成數字形式,或稱為<strong>編碼</strong>。有幾種方法我們可以使用\n",
"\n",
"* 簡單的數字編碼,這種方法會建立一個不同品種的表格,然後用該表格中的索引來替換品種名稱。這對於線性回歸來說並不是最好的方法,因為線性回歸會考慮索引的數值,而這些數值可能與價格並沒有數字上的相關性。\n",
"* 獨熱編碼One-hot encoding這種方法會將 `Variety` 欄位替換為4個不同的欄位每個品種對應一個欄位。如果某一行屬於某個品種該欄位的值為1否則為0。\n",
"* 簡單的數值編碼,會建立一個不同品種的表,然後用該表中的索引來替代品種名稱。這對線性迴歸來說不是最佳做法,因為線性迴歸會將索引的數值視為一個量值,而這個數值通常與價格的數值關聯性不大。\n",
"* One-hot 編碼,將 `Variety` 欄位拆成四個不同的欄位,每個代表一種品種,如果該列是該品種則內容為 1否則為 0。\n",
"\n",
"以下的程式碼展示了如何對品種進行獨熱編碼:\n"
"以下程式碼展示了如何對品種進行 one-hot 編碼:\n"
]
},
{
@ -940,7 +949,7 @@
"source": [
"### 品種的線性回歸\n",
"\n",
"我們現在將使用與上面相同的程式碼,但這次我們將使用我們的單熱編碼品種作為輸入,而不是 `DayOfYear`\n"
"我們現在將使用與上面相同的代碼,但輸入將不是 `DayOfYear`,而是我們的獨熱編碼品種\n"
]
},
{
@ -988,7 +997,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"我們也可以以相同的方式嘗試使用其他功能,並將它們與數值功能結合,例如 `Month` 或 `DayOfYear`:\n"
"我們也可以用同樣的方法嘗試使用其他特徵,並將它們與數值特徵結合,例如 `Month` 或 `DayOfYear`\n"
]
},
{
@ -1019,9 +1028,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"### 多項式歸\n",
"### 多項式歸\n",
"\n",
"多項式回歸亦可用於已進行獨熱編碼的分類特徵。訓練多項式回歸的程式碼基本上與我們之前看到的相同。\n"
"多項式迴歸亦可用於已進行 one-hot 編碼的類別特徵。訓練多項式迴歸的程式碼基本上與上述相同。\n"
]
},
{
@ -1068,7 +1077,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免責聲明** \n本文件已使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始語言的文件應被視為權威來源。對於重要資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋概不負責。\n"
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**免責聲明** \n本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於準確性,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件之母語版本應被視為權威來源。對於關鍵資訊,建議採用專業人工翻譯。我們不對因使用本翻譯而引起的任何誤解或誤釋承擔責任。\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
],
@ -1098,13 +1107,7 @@
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"orig_nbformat": 2,
"coopTranslator": {
"original_hash": "d77bd89ae7e79780c68c58bab91f13f8",
"translation_date": "2025-09-03T19:18:47+00:00",
"source_file": "2-Regression/3-Linear/solution/notebook.ipynb",
"language_code": "hk"
}
"orig_nbformat": 2
},
"nbformat": 4,
"nbformat_minor": 2

@ -36,8 +36,8 @@
"language_code": "zh-MO"
},
"1-Introduction/4-techniques-of-ML/README.md": {
"original_hash": "9d91f3af3758fdd4569fb410575995ef",
"translation_date": "2025-09-06T09:14:17+00:00",
"original_hash": "84b1715a6be62ef1697351dcc5d7b567",
"translation_date": "2026-04-26T20:33:28+00:00",
"source_file": "1-Introduction/4-techniques-of-ML/README.md",
"language_code": "zh-MO"
},
@ -90,8 +90,8 @@
"language_code": "zh-MO"
},
"2-Regression/3-Linear/README.md": {
"original_hash": "26c53a922f1f1e8542b0ea41ff52221a",
"translation_date": "2026-04-20T16:11:02+00:00",
"original_hash": "8b776e731c35b171d316d01d0e7b1369",
"translation_date": "2026-04-26T20:32:58+00:00",
"source_file": "2-Regression/3-Linear/README.md",
"language_code": "zh-MO"
},
@ -107,6 +107,12 @@
"source_file": "2-Regression/3-Linear/solution/Julia/README.md",
"language_code": "zh-MO"
},
"2-Regression/3-Linear/solution/notebook.ipynb": {
"original_hash": "6781223ffbe8cfdaa38d0200f08e1288",
"translation_date": "2026-04-26T20:31:07+00:00",
"source_file": "2-Regression/3-Linear/solution/notebook.ipynb",
"language_code": "zh-MO"
},
"2-Regression/4-Logistic/README.md": {
"original_hash": "abf86d845c84330bce205a46b382ec88",
"translation_date": "2025-09-06T09:07:21+00:00",

@ -1,117 +1,117 @@
# 機器學習技術
建立、使用和維護機器學習模型及其所需數據的過程,與許多其他開發工作流程有很大的不同。在本課程中,我們將揭開這個過程的神秘面紗,並概述您需要了解的主要技術。您將
建立、使用和維護機器學習模型及其所用數據的過程,與許多其他開發工作流程截然不同。在本課程中,我們將揭開這個過程的神秘面紗,並概述您需要知道的主要技術。您將會
- 理解機器學習背後的高層次流程。
- 探索基本概念,例如「模型」、「預測」和「訓練數據」。
- 從宏觀層面了解支撐機器學習的過程。
- 探討基本概念,如「模型」、「預測」和「訓練數據」。
## [課前測驗](https://ff-quizzes.netlify.app/en/ml/)
[![機器學習入門 - 機器學習技術](https://img.youtube.com/vi/4NGM0U2ZSHU/0.jpg)](https://youtu.be/4NGM0U2ZSHU "機器學習入門 - 機器學習技術")
[![ML for beginners - Techniques of Machine Learning](https://img.youtube.com/vi/4NGM0U2ZSHU/0.jpg)](https://youtu.be/4NGM0U2ZSHU "ML for beginners - Techniques of Machine Learning")
> 🎥 點擊上方圖片觀看本課程的短視頻
> 🎥 點擊上方圖片觀看簡短影片,講解本課程內容
##
## 介
從高層次來看創建機器學習ML流程的技術包括以下幾個步驟:
從高層次來看創建機器學習ML流程的技藝包括多個步驟:
1. **確定問題**。大多數機器學習流程始於提出一個無法通過簡單的條件程序或基於規則的引擎回答的問題。這些問題通常圍繞基於數據集合的預測。
2. **收集和準備數據**。為了回答您的問題,您需要數據。數據的質量以及有時候數量將決定您能多好地回答最初的問題。可視化數據是此階段的重要方面。此階段還包括將數據分為訓練組和測試組以建立模型。
3. **選擇訓練方法**。根據您的問題和數據的性質,您需要選擇如何訓練模型以最好地反映您的數據並進行準確的預測。這是機器學習流程中需要特定專業知識且通常需要大量實驗的部分。
4. **訓練模型**。使用您的訓練數據,您將使用各種算法訓練模型以識別數據中的模式。模型可能利用內部權重,這些權重可以調整以優化某些數據部分,從而建立更好的模型。
5. **評估模型**。使用從收集的數據集中從未見過的測試數據來檢查模型的性能
6. **參數調整**。根據模型的性能,您可以使用不同的參數或變量重新進行過程,這些參數或變量控制用於訓練模型的算法行為。
7. **預測**。使用新的輸入測試模型的準確性
1. <strong>決定問題</strong>。大多數機器學習流程從提出一個無法用簡單條件程式或規則引擎回答的問題開始。這些問題通常圍繞基於一組數據的預測。
2. <strong>收集與準備數據</strong>。為了能回答您的問題,您需要數據。數據的質量,有時還有數量,會決定您回答初始問題的能力。數據可視化是此階段的重要部分。此階段還包括將數據分為訓練組和測試組以建立模型。
3. <strong>選擇訓練方法</strong>。根據您的問題和數據的特性,您需要選擇如何訓練模型,以最佳反映數據並進行準確預測。這是 ML 流程中需要專門知識,且常需大量實驗的部分。
4. <strong>訓練模型</strong>。使用訓練數據,運用各種算法來訓練模型,讓其識別數據中的模式。模型可能利用可調整的內部權重,強調數據中的某些部分,以建立更好的模型。
5. <strong>評估模型</strong>。使用您未曾見過的數據(測試數據)來檢視模型的表現
6. <strong>參數調整</strong>。根據模型的表現,您可以使用不同的參數或變量重新訓練,這些參數控制訓練模型的算法行為。
7. <strong>預測</strong>。使用新的輸入測試模型的準確度
## 提出問題
## 該問什麼問題
電腦特別擅長發現數據中的隱藏模式。這種能力對於研究人員來說非常有用,尤其是當他們面臨無法輕易通過條件規則引擎回答的問題時。例如,針對精算任務,數據科學家可能能夠手工製作規則來分析吸煙者與非吸煙者的死亡率
電腦特別擅長發現數據中隱藏的模式。這種功能對於在某領域有問題但無法用條件規則引擎輕易回答的研究者非常有幫助。例如,對於精算任務,數據科學家或許可以手工建立關於吸菸者與非吸菸者死亡率的規則
然而,當涉及到許多其他變量時,機器學習模型可能更有效地根據過去的健康歷史預測未來的死亡率。一個更愉快的例子可能是根據包括緯度、經度、氣候變化、靠近海洋、噴流模式等數據,為某地四月的天氣進行預測。
然而,當引入更多變量時,機器學習模型可能更有效,能根據過去健康記錄預測未來死亡率。一個較樂觀的例子是,根據含有緯度、經度、氣候變化、海洋鄰近度、噴射氣流模式等數據,對特定地點的四月天氣做預測。
✅ 這份[幻燈片](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf)提供了使用機器學習進行天氣分析的歷史視角
✅ 這份[氣象模型簡報](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf)提供有關使用機器學習分析氣象的歷史觀點
## 建模前任務
## 建模前任務
在開始建立模型之前,您需要完成幾項任務。為了測試您的問題並根據模型的預測形成假設,您需要識別並配置幾個元素。
在開始建立模型前,有幾項任務需完成。為了測試問題並基於模型的預測形成假設,您需識別並設定數個要素。
### 數據
為了能夠有一定的確定性回答您的問題,您需要足夠數量且類型正確的數據。在這個階段,您需要完成以下兩件事:
為了能用一定的確定性回答您的問題,您需要足夠且類型合適的數據。此階段需做兩件事:
- **收集數據**。記住上一課中關於數據分析公平性的內容,謹慎收集您的數據。注意數據的來源、可能存在的固有偏差,並記錄其來源。
- **準備數據**。數據準備過程包括多個步驟。如果數據來自不同來源,您可能需要整理並標準化它。您可以通過各種方法提高數據的質量和數量,例如將字符串轉換為數字(如我們在[聚類](../../5-Clustering/1-Visualize/README.md)中所做的)。您可能還會基於原始數據生成新數據(如我們在[分類](../../4-Classification/1-Introduction/README.md)中所做的)。您可以清理和編輯數據(如我們在[Web App](../../3-Web-App/README.md)課程之前所做的)。最後,根據您的訓練技術,您可能還需要隨機化並打亂數據。
- <strong>收集數據</strong>。記得先前課程中對數據分析公平性的說明,請謹慎收集數據。留意數據來源、潛在偏差並記錄其來源。
- <strong>準備數據</strong>。數據準備包含多步驟。若數據來自不同來源,可能需要合併及正規化。您也可以透過多種方法提升數據量和品質,例如把字串轉換成數字(如同我們在[分群](../../5-Clustering/1-Visualize/README.md)課程中所示)。您也可以根據原始資料產生新數據(如在[分類](../../4-Classification/1-Introduction/README.md)中)。還能清理和編輯數據(如在[網頁應用程式](../../3-Web-App/README.md)課程前)。最後,依訓練技術可能需要隨機化和打亂數據。
在收集和處理數據後,花點時間檢查其形狀是否能幫助您解決預期問題。可能數據在您的任務中表現不佳,正如我們在[聚類](../../5-Clustering/1-Visualize/README.md)課程中所發現
收集並處理數據後,稍作檢視數據形態是否能回答您的問題。某些任務中數據表現不佳,我們在[分群](../../5-Clustering/1-Visualize/README.md)課程中所發現!
### 特徵目標
### 特徵目標
[特徵](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection)是數據的一個可測量屬性。在許多數據集中,它通常以列標題的形式表達,例如「日期」、「大小」或「顏色」。特徵變量通常在代碼中表示為`X`,代表用於訓練模型的輸入變量。
[特徵](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection)是可量化的數據屬性。在多數數據集中以欄位標題表現,如「日期」、「大小」或「顏色」。特徵變量,程式碼中通常以 `X` 表示,為用來訓練模型的輸入變量。
目標是您試圖預測的事物。目標通常在代碼中表示為`y`,代表您試圖從數據中回答的問題:在十二月,哪種**顏色**的南瓜最便宜?在舊金山,哪些街區的房地產**價格**最好?有時目標也被稱為標籤屬性。
目標是您希望預測的結果。通常以 `y` 表示,它是您向數據提出問題的答案:十二月時,哪種<strong>顏色</strong>的南瓜最便宜?在舊金山,哪些社區的房價<strong>價格</strong>最好?有時目標也稱為標籤屬性。
### 選擇特徵變量
🎓 **特徵選擇與特徵提取** 如何在建立模型時選擇變量?您可能需要通過特徵選擇或特徵提取的過程來選擇最合適的變量以構建性能最佳的模型。然而,它們並不完全相同:「特徵提取通過原始特徵的函數創建新特徵,而特徵選擇返回特徵的子集。」([來源](https://wikipedia.org/wiki/Feature_selection)
🎓 <strong>特徵選擇與特徵提取</strong>:如何知道建立模型時該選哪個變量?您或許會透過特徵選擇或特徵提取來挑選關鍵變量以建置最有效模型。但兩者並不相同:「特徵提取從原始特徵的函數中創造新特徵,而特徵選擇則挑出特徵的一個子集。」([來源](https://wikipedia.org/wiki/Feature_selection))
### 可視化數據
數據科學家工具包中的一個重要方面是使用一些優秀的庫如Seaborn或MatPlotLib來可視化數據的能力。以可視化方式表示數據可能幫助您發現可以利用的隱藏相關性。您的可視化還可能幫助您發現偏差或數據不平衡如我們在[分類](../../4-Classification/2-Classifiers-1/README.md)中所發現的)。
數據科學家的重要工具之一,是利用 Seaborn 或 MatPlotLib 等優秀函式庫將數據視覺化。視覺呈現數據,有助於您發現可利用的隱藏關聯,亦能幫助揭露偏差或不平衡數據(我們在[分類](../../4-Classification/2-Classifiers-1/README.md)課程中探討過此議題)。
### 分割數據集
在訓練之前,您需要將數據集分為兩個或更多不等大小的部分,這些部分仍然能很好地代表數據
訓練前,需將數據集拆分為兩個或以上大小不等但仍能代表數據的子集
- **訓練**。數據集的這部分用於訓練模型。這部分通常佔原始數據集的大部分
- **測試**。測試數據集是獨立的數據組,通常從原始數據中獲得,用於確認已建立模型的性能
- **驗證**。驗證集是一個較小的獨立數據組,用於調整模型的超參數或架構以改進模型。根據數據的大小和您提出的問題,您可能不需要建立這第三部分(如我們在[時間序列預測](../../7-TimeSeries/1-Introduction/README.md)中所提到的)。
- <strong>訓練集</strong>:用來擬合模型的數據集,通常占原始數據的大多數
- <strong>測試集</strong>:獨立的測試數據組,通常從原始數據中取得,用於確認模型表現
- <strong>驗證集</strong>:較小的獨立數據組,用於調整模型的超參數或結構以優化模型。依據數據大小和問題,有時不必建立此第三個集合(如在[時間序列預測](../../7-TimeSeries/1-Introduction/README.md)中所述)。
## 建立模型
使用您的訓練數據,您的目標是使用各種算法建立模型,或數據的統計表示,並對其進行**訓練**。訓練模型使其接觸數據,並讓其對發現的模式進行假設、驗證並接受或拒絕。
使用訓練數據,運用多種算法,您的目標是建置一個模型,或是數據的統計表徵,並<strong>訓練</strong>它。模型訓練階段會讓它接觸數據,依發現的模式進行假設、驗證並接受或拒絕。
### 決定訓練方法
### 選擇訓練方法
根據您的問題和數據的性質,您將選擇一種訓練方法。瀏覽[Scikit-learn的文檔](https://scikit-learn.org/stable/user_guide.html)——我們在本課程中使用它——您可以探索多種訓練模型的方法。根據您的經驗,您可能需要嘗試幾種不同的方法以建立最佳模型。您可能會經歷一個過程,數據科學家通過向模型提供未見過的數據來評估其性能,檢查準確性、偏差和其他質量下降問題,並選擇最適合當前任務的訓練方法
根據您的問題和數據性質,選擇適合的訓練方法。透過瀏覽 [Scikit-learn 文件](https://scikit-learn.org/stable/user_guide.html) — 本課程使用的套件 — 您能探究多種訓練模型方式。依經驗,您可能需嘗試幾種方法,才能打造最佳模型。數據科學家通常會透過讓模型分析未見過的數據,檢查準確度、偏差和其他品質問題,再挑選最合適的訓練方式
### 訓練模型
有了訓練數據,您就可以「擬合」它來創建模型。您會注意到,在許多機器學習庫中,您會看到代碼`model.fit`——此時您將特徵變量作為值數組(通常是`X`)以及目標變量(通常是`y`)傳入
準備好訓練數據後,便可「擬合」數據以建立模型。您會發現多數 ML 函式庫中均有 'model.fit' 代碼,這是將特徵變量(通常是 'X')和目標變量(通常是 'y')傳入模型的時候
### 評估模型
一旦訓練過程完成對於大型模型可能需要多次迭代或「epoch」您將能夠使用測試數據評估模型的質量以衡量其性能。這些數據是原始數據的一部分模型之前未曾分析過。您可以打印出關於模型質量的指標表。
當訓練完成後(大型模型可能需多次迭代或「週期」),您就能使用測試數據評估模型品質。測試數據是原始數據子集,模型之前未接觸過。您可列印模型品質指標表。
🎓 **模型擬合**
🎓 <strong>模型擬合</strong>
在機器學習的背景下,模型擬合指的是模型的底層函數在分析其不熟悉的數據時的準確性
在機器學習語境中,模型擬合指模型基礎函數在分析不熟悉數據時的準確度
🎓 **欠擬合**和**過擬合**是常見問題,會降低模型的質量,因為模型要麼擬合得不夠好,要麼擬合得太好。這會導致模型的預測要麼過於貼合,要麼過於偏離其訓練數據。過擬合模型因為過於熟悉數據的細節和噪音而對訓練數據預測得過於準確。欠擬合模型則不夠準確,既無法準確分析其訓練數據,也無法準確分析其未見過的數據
🎓 <strong>欠擬合</strong><strong>過擬合</strong> 是常見問題,會降低模型質量。欠擬合指模型擬合不佳,無法準確分析訓練數據或未知數據;過擬合則表示模型對訓練數據過度擬合,將細節和雜訊也學會,導致預測過於貼合訓練數據,降低泛化能力
![過擬合模型](../../../../1-Introduction/4-techniques-of-ML/images/overfitting.png)
> 信息圖由 [Jen Looper](https://twitter.com/jenlooper) 提供
![overfitting model](../../../../translated_images/zh-MO/overfitting.1c132d92bfd93cb6.webp)
> 資訊圖表由 [Jen Looper](https://twitter.com/jenlooper) 提供
## 參數調整
完成初步訓練後,觀察模型的質量,並考慮通過調整其「超參數」來改進它。閱讀更多相關內容[在文檔中](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott)。
完成初始訓練後,觀察模型品質,考慮透過調整「超參數」來改善。如要了解更多過程,請參考[官方文件](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott)。
## 預測
是您可以使用全新數據測試模型準確性的時刻。在「應用」機器學習設置中,當您構建網頁資產以在生產環境中使用模型時,此過程可能涉及收集用戶輸入(例如按下按鈕)以設置變量並將其發送到模型進行推斷或評估。
個階段您可以使用全新數據來測試模型準確度。在應用型機器學習場景中,您建置網頁資產以在正式環境中使用模型,過程可能需要接收用戶輸入(例如按鈕點擊),將變量送入模型進行推論或評估。
在這些課程中,您將學習如何使用這些步驟來準備、建立、測試、評估和預測——這些都是數據科學家的手勢,隨著您的進步,您將成為「全棧」機器學習工程師。
在這些課程中,您將學習如何利用這些步驟來準備、建立、測試、評估和預測——執行數據科學家的所有基本動作,並在成長過程中成為一名「全端」機器學習工程師。
---
## 🚀挑戰
繪製一個反映機器學習實踐者步驟的流程圖。您認為自己目前處於哪個步驟?您預測在哪些方面會遇到困難?哪些看起來比較容易?
畫出反映機器學習從業者流程步驟的流程圖。您認為自己目前處於哪個階段?您預見會在哪裡遇到困難?哪部分對您來說比較容易?
## [課後測驗](https://ff-quizzes.netlify.app/en/ml/)
## 回顧與自學
## 複習與自學
在線搜索數據科學家討論其日常工作的訪談。這裡有一個[例子](https://www.youtube.com/watch?v=Z3IjgbbCEfs)。
線上搜尋數據科學家的訪談,了解他們的日常工作。這裡有[一段](https://www.youtube.com/watch?v=Z3IjgbbCEfs)。
## 作業
@ -119,5 +119,7 @@
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**免責聲明**
本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
本文件係透過人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻譯而成。雖然我們致力於確保準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原文件以其母語版本為權威資料。對於重要資訊,建議採用專業人工翻譯。我們不對因使用此翻譯而引起的任何誤解或曲解負責。
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,97 +1,97 @@
# 使用 Scikit-learn 建立回歸模型:回歸四種方法
# 使用 Scikit-learn 建立迴歸模型:四種迴歸方式
## 初學者筆記
線性回歸用於當我們想預測一個<strong>數值</strong>(例如,房價、溫度或銷售量)。
它通過尋找一條最能代表輸入特徵與輸出之間關係的直線來工作。
當我們想要預測一個<strong>數值</strong>(例如房價、溫度或銷售額)時,會使用線性迴歸。它透過尋找一條最能代表輸入特徵與輸出之間關係的直線來運作。
在本課程中,我們將先著重理解這個概念,再進一步探討更進階的迴歸技術。
![線性與多項式迴歸圖解](../../../../translated_images/zh-MO/linear-polynomial.5523c7cb6576ccab.webp)
> 圖解由 [Dasani Madipalli](https://twitter.com/dasani_decoded) 提供
在本課程中,我們專注於理解概念,然後進一步探索更進階的回歸技術。
![線性回歸與多項式回歸資訊圖](../../../../translated_images/zh-MO/linear-polynomial.5523c7cb6576ccab.webp)
> 資訊圖由 [Dasani Madipalli](https://twitter.com/dasani_decoded) 製作
## [課前小測驗](https://ff-quizzes.netlify.app/en/ml/)
> ### [本課程亦提供 R 版本!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html)
### 介紹
> ### [本課程也提供 R 語言版本!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html)
### 介紹
到目前為止,你已經透過南瓜定價資料集(本課程將持續使用)探討了回歸的意義。你也使用 Matplotlib 將其視覺化
到目前為止,你已經探索過什麼是迴歸,並使用整個課程將會用到的南瓜價格資料集做範例。你也已經運用 Matplotlib 視覺化這些資料
現在你已準備好深入探討機器學習中的回歸。雖然視覺化可以幫助你理解數據機器學習的真正力量來自於_訓練模型_。模型在歷史數據上訓練以自動捕捉數據之間的依賴關係並允許你對模型未見過的新數據進行預測。
現在你已經準備深入了解為機器學習用的迴歸。雖然視覺化讓你可以理解資料但機器學習的真正威力在於_訓練模型_。模型是透過歷史資料訓練以自動捕捉資料間的依賴關係並讓你得以對未見過的新資料進行結果預測。
本課將介紹兩種回歸_基本線性回歸_與_多項式回歸_以及一些這些技術背後的數學原理。這些模型將讓我們根據不同輸入資料預測南瓜價格。
本課程會介紹兩種迴歸方法_基本線性迴歸_與_多項式迴歸_並略談其背後的數學原理。這些模型將讓我們依據不同輸入資料預測南瓜價格。
[![初學者機器學習 - 理解線性回歸](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "初學者機器學習 - 理解線性回歸")
[![機器學習入門-理解線性迴歸](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "機器學習入門-理解線性迴歸")
> 🎥 點擊上圖觀看線性回歸的短片介紹
> 🎥 點擊上方圖片,觀看線性迴歸的短片概述
> 整個課程假設對數學知識要求低,並致力於讓來自不同領域的學生都能理解,因此你會看到筆記、🧮 註解、圖解及其他學習工具協助理解
> 本課程假設讀者數學基礎不深,並致力於讓來自其他背景的學生也能輕鬆理解,請留意筆記、🧮 計算提示、圖示與其他助學工具
### 前置知識
### 前置條件
你現在應該熟悉我們正在檢視的南瓜數據架構。你可以在本課程的 _notebook.ipynb_ 中找到事先加載並預先清理好的數據。在該檔中,南瓜價格以每蒲式耳計算並顯示於新的資料框架中。確保你能在 Visual Studio Code 中運行這些 notebook
你現在應該已熟悉我們所探討的南瓜資料結構。本課程的 _notebook.ipynb_ 檔案中已預載並預先清理好資料。該檔案將南瓜價格以每蒲式耳價格顯示於新的資料框中。請確保可於 Visual Studio Code 的內核中順利執行這些筆記本
### 準備工作
提醒你,你正在載入這些數據是為了針對它們提出問題。
提醒你,載入這些資料是為了向它提出問題:
- 何時是購買南瓜的最佳時機
- 一箱迷你南瓜的價格大約是多少?
- 我應該買半蒲式耳的南瓜籃還是一箱1 1/9蒲式耳的箱子
讓我們繼續探索這些數據
- 什麼時候買南瓜最好
- 一箱迷你南瓜價格會是多少?
- 我應該買半蒲式耳籃裝還是一箱 1 1/9 蒲式耳盒裝的
讓我們繼續深入挖掘這些資料
在上一課中,你建立了一個 Pandas 資料框架並以原始資料的一部分填充將價格標準化為每蒲式耳價格。然而這樣你只能取得約400筆數據且只涵蓋秋季月份
前一課你建立了一個 Pandas 資料框,並用原始資料集的一部分填充,將價格標準化為每蒲式耳價格。但這樣只能得到約 400 筆資料,且只涵蓋秋季的幾個月
看看我們在本課的 notebook 中預先加載的數據。資料已加載且初步使用散點圖顯示月份數據。也許我們可以透過進一步清理獲得更詳細的資料特性
請查看本課程隨課程提供筆記本中預載的資料。資料已預載,且已繪製初始散點圖以顯示月份。也許我們可以透過更進一步的清理,來了解資料的本質
## 線性歸線
## 線性歸線
如你在第一課中學到,線性回歸的目標是繪製一條線來
正如你在第一課學到的,線性迴歸的目標是能繪製一條線
- <strong>示變量關係</strong>。展示變數間的關係
- <strong>進行預測</strong>。準確預測新數據點相較該線會落在哪裡
- <strong>現變數關係</strong>。展現變數間的關係
- <strong>做出預測</strong>。準確預測新資料點相對於此線的位置
<strong>最小平方回歸</strong>常用來繪製這類線條。術語「最小平方」指的是我們想最小化模型中總誤差的過程。對每個數據點,我們量度實際點與回歸線之間的垂直距離(稱為殘差)。
最常用的做法是<strong>最小平方法迴歸</strong>Least-Squares Regression畫出這樣的一條線。“最小平方法”意指在模型中使誤差總和最小化的過程。對每一資料點我們會測量該點與迴歸線間的垂直距離(稱為殘差)。
我們將這些距離平方,原因有兩個:
我們將這些距離平方,有兩個主要原因
1. <strong>大小勝方向</strong>:我們要將-5的誤差與+5的誤差等同對待平方讓所有值都變成正數。
1. **只看大小,不看方向:** 我們想讓漏誤為 -5 與 +5 變成同樣的錯誤大小。平方可將所有數值轉為正數。
2. <strong>懲罰離群值</strong>:平方會給較大誤差更重的權重,迫使線條更貼近遠離的點。
2. **懲罰離群點:** 平方會使離誤差較大的點權重更重,迫使線盡可能接近這些較遠的點。
接著將所有平方值加總起來。我們的目標是尋找使該總和最小(可能的最小值)的特定直線——因此稱作「最小平方」
接著,我們加總所有平方後的誤差,我們的目標是找到使此和達最小值的那條直線(故名「最小平方法」)
> **🧮 看數學計算**
> **🧮 數學說明**
>
> 這條稱作_最佳擬合線_的直線能用[方程式](https://en.wikipedia.org/wiki/Simple_linear_regression)表示
> 這條稱為_最佳擬合線_其表達式是[一個等式](https://en.wikipedia.org/wiki/Simple_linear_regression)
>
> ```
> Y = a + bX
> ```
>
> `X` 是「解釋變數」,`Y` 是「被解釋變數」。線的斜率是 `b``a` 是 y 截距,指的是當 `X = 0` 時的 `Y` 值。
>
>![計算斜率](../../../../translated_images/zh-MO/slope.f3c9d5910ddbfcf9.webp)
>
> 首先計算斜率 `b` 資訊圖由 [Jen Looper](https://twitter.com/jenlooper) 製作
>
> 換句話說,對應我們南瓜資料的原始問題:「根據月份預測每蒲式耳南瓜的價格」,`X` 指價格,`Y` 則是銷售月份。
>
>![完成方程式](../../../../translated_images/zh-MO/calculation.a209813050a1ddb1.webp)
>
> 計算 `Y` 的值。如果你支付約 4 美元,應該是四月!資訊圖由 [Jen Looper](https://twitter.com/jenlooper) 製作
>
> 計算直線的數學必須展示斜率,而斜率也依賴截距,即 `X = 0``Y` 所在位置。
>
> 你可以 [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) 網站觀察這些計算方法。也可到[此最小平方計算器](https://www.mathsisfun.com/data/least-squares-calculator.html)觀看數值如何影響直線
>
> `X` 是「解釋變數」,`Y` 是「依變數」。線的斜率是 `b`,而 `a` 是 y 截距,也就是當 `X = 0``Y`值。
>
>![計算斜率](../../../../translated_images/zh-MO/slope.f3c9d5910ddbfcf9.webp)
>
> 首先計算斜率 `b`。圖由 [Jen Looper](https://twitter.com/jenlooper) 提供
>
> 換句話說,針對我們南瓜資料的原始問題:「依照月份預測每蒲式耳南瓜價格」,`X` 是價格,`Y` 則是銷售的月份。
>
>![完成式](../../../../translated_images/zh-MO/calculation.a209813050a1ddb1.webp)
>
> 計算 Y 的值。如果你付出約 $4那一定是四月圖解由 [Jen Looper](https://twitter.com/jenlooper) 提供
>
> 計算線的數學必須顯示線的斜率,同時取決於截距,即 `X = 0``Y` 的位置。
>
> 你可以 [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) 網站看到這些數值的計算方式,也可拜訪[這個最小二乘計算器](https://www.mathsisfun.com/data/least-squares-calculator.html)來觀察數字如何影響線的表現
## 相關係數
## 相關
還有一個需要了解的詞彙是給定 X 與 Y 變數間的<strong>相關係數</strong>使用散點圖,你可以快速視覺化這個係數。若數據點呈現整齊分布成一條線,代表相關性高;若點散布在 X 與 Y 之間各處,則相關性低。
另一個要理解的詞是給定 X 和 Y 變數間的<strong>相關係數</strong>透過散佈圖,你可以快速視覺化此係數。點呈現筆直排列的散佈圖表示高度相關,但若資料點在 X 與 Y 間亂散則表示相關性低。
一個好的線性回歸模型會有一個高接近1而非0相關係數使用最小平方回歸法與回歸線
一個良好的線性迴歸模型會在最小平方法與迴歸線下,呈現較高(接近 1 而非 0的相關係數
✅ 執行本課程附帶 notebook查看月份對價格的散點圖。根據你對散點圖的視覺判斷月份與南瓜銷售價格之間的資料關聯是高還是低如果換成更細緻的度量例如<em>該年天數</em>(即距離該年開始日的天數),情況會改變嗎?
✅ 執行本課程附帶的筆記本並查看「月份 vs 價格」的散佈圖。依據你對散佈圖的視覺判斷,南瓜銷售的月份與價格看來關聯性高還是低?如果不用 `Month` 而改用更細緻的量度指標例如_一年中的日數_即自年初後流逝的天數這狀況會改變嗎?
在以下程式中,假設我們已清理了資料,得到了名為 `new_pumpkins` 的資料框架,結構類似
下方程式碼中,我們假設已整理好資料,取得名為 `new_pumpkins` 的資料框,如下所示
ID | Month | DayOfYear | Variety | City | Package | Low Price | High Price | Price
---|-------|-----------|---------|------|---------|-----------|------------|-------
@ -101,36 +101,36 @@ ID | Month | DayOfYear | Variety | City | Package | Low Price | High Price | Pri
73 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 17.0 | 17.0 | 15.454545
74 | 10 | 281 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364
> 清理數據的程式碼在 [`notebook.ipynb`](notebook.ipynb) 中。我們已完成與上一課相同的清理步驟,並利用以下公式計算 `DayOfYear` 欄位:
> 清理資料的程式碼位於 [`notebook.ipynb`](notebook.ipynb) 檔案中。我們採用了前課的相同步驟,並用以下表達式計算 `DayOfYear` 欄位:
```python
day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)
```
現在你已了解線性回歸背後的數學,讓我們建立一個迴歸模型,看看是否能預測哪種南瓜包裝的南瓜價格會最好。假如有人想購買南瓜以打造節日南瓜園,這資訊會對他們優化包裝購買策略很有幫助
了解線性迴歸背後的數學後,我們來建立一個迴歸模型,看看是否可以預測哪種南瓜包裝擁有最佳南瓜價格。採買節慶南瓜的人可能想要這些資訊,以便優化購買南瓜包裝的決策
## 尋找相關性
[![初學者機器學習 - 尋找相關性:線性回歸的關鍵](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "初學者機器學習 - 尋找相關性:線性回歸的關鍵")
[![機器學習入門-尋找相關性:線性迴歸的關鍵](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "機器學習入門-尋找相關性:線性迴歸的關鍵")
> 🎥 點擊上圖觀看相關性短片介紹
> 🎥 點擊上方影片縮圖,觀看相關性簡介
根據上一課,你可能見過不同月份平均價格長這樣:
從前一課你可能已看到不同月份的平均價格長這樣:
<img alt="月平均價格" src="../../../../translated_images/zh-MO/barchart.a833ea9194346d76.webp" width="50%"/>
<img alt="平均價格" src="../../../../translated_images/zh-MO/barchart.a833ea9194346d76.webp" width="50%"/>
表示應該有某種相關性,我們可以嘗試訓練線性回歸模型來預測 `Month``Price``DayOfYear``Price` 之間的關係。以下散點圖顯示後者關係
暗示著一定存在某種相關性,我們可以嘗試訓練線性迴歸模型來預測 `Month``Price`,或是 `DayOfYear``Price` 的關係。下圖為後者的散點圖
<img alt="價格與該年天數散點圖" src="../../../../translated_images/zh-MO/scatter-dayofyear.bc171c189c9fd553.webp" width="50%" />
<img alt="價格與一年中日數的散佈圖" src="../../../../translated_images/zh-MO/scatter-dayofyear.bc171c189c9fd553.webp" width="50%" />
讓我們使用 `corr` 函數看看是否存在相關
讓我們`corr` 函式檢視是否存在相關性
```python
print(new_pumpkins['Month'].corr(new_pumpkins['Price']))
print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price']))
```
起來 `Month` 的相關性大約是 -0.15`DayOfMonth` 則是 -0.17,都相當小,但可能還有其他重要關係。看來不同南瓜品種的價格形成不同叢集。為證實此假設,我們用不同顏色標示每種南瓜類別。透過傳 `ax` 參數給 `scatter` 繪圖函式,我們可以將所有點畫在同一圖上:
來相關性相當小,按 `Month` 計算是 -0.15,按 `DayOfYear` 是 -0.17,但可能有另一個重要關係—不同南瓜品種似乎對價格產生價格群聚現象。為了驗證此猜想,我們以不同顏色標示每種南瓜品種。藉由在 `scatter` 繪圖函式中傳入 `ax` 參數,我們能將所有點畫在同一張圖上:
```python
ax=None
@ -139,75 +139,75 @@ for i,var in enumerate(new_pumpkins['Variety'].unique()):
df = new_pumpkins[new_pumpkins['Variety']==var]
ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var)
```
<img alt="價格與一年中日數的散佈圖(彩色標示)" src="../../../../translated_images/zh-MO/scatter-dayofyear-color.65790faefbb9d54f.webp" width="50%" />
<img alt="價格與該年天數散點圖,依顏色區分" src="../../../../translated_images/zh-MO/scatter-dayofyear-color.65790faefbb9d54f.webp" width="50%" />
調查顯示品種比實際銷售日期對整體價格影響更大。我們用長條圖看得更明顯:
研判發現品種對整體價格影響較大,而非實際銷售日期。我們可以用長條圖來看:
```python
new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar')
```
<img alt="品種與價格的長條圖" src="../../../../translated_images/zh-MO/price-by-variety.744a2f9925d9bcb4.webp" width="50%" />
<img alt="按品種價格長條圖" src="../../../../translated_images/zh-MO/price-by-variety.744a2f9925d9bcb4.webp" width="50%" />
暫時只看一種南瓜品種稱為「pie type」來看看日期對價格的影響
目前我們先專注於一種南瓜品種,『派型』,看看日期對價格的影響:
```python
pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
pie_pumpkins.plot.scatter('DayOfYear','Price')
```
<img alt="價格與該年天數散點圖" src="../../../../translated_images/zh-MO/pie-pumpkins-scatter.d14f9804a53f927e.webp" width="50%" />
<img alt="價格與一年中日數的散佈圖(派型)" src="../../../../translated_images/zh-MO/pie-pumpkins-scatter.d14f9804a53f927e.webp" width="50%" />
若用 `corr` 函數計算 `Price``DayOfYear` 相關性,會得到約 `-0.27`,表示訓練預測模型是有意義的。
如果用 `corr` 函式計算 `Price``DayOfYear` 的相關性,大概會得到 `-0.27`,這代表訓練預測模型是有意義的。
> 在訓練線性回歸模型前,請確定數據是乾淨的。線性回歸對遺失值表現不佳,因此最好清除所有空白欄位
> 在訓練線性迴歸模型之前,重要的是確保資料清潔。線性迴歸對缺失值表現不佳,因此建議先剔除所有空值
```python
pie_pumpkins.dropna(inplace=True)
pie_pumpkins.info()
```
另一個作法是用對應欄位的平均值填補這些空缺。
另一方法是用該欄位的平均值填補空白。
## 簡單線性迴歸
## 簡單線性回歸
[![機器學習入門-使用 Scikit-learn 作線性與多項式迴歸](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "機器學習入門-使用 Scikit-learn 作線性與多項式迴歸")
[![初學者機器學習 - 使用 Scikit-learn 的線性與多項式回歸](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "初學者機器學習 - 使用 Scikit-learn 的線性與多項式回歸")
> 🎥 點擊上方圖片,觀看線性與多項式迴歸簡介。
> 🎥 點擊上圖觀看線性與多項式回歸短片介紹。
我們將使用 **Scikit-learn** 函式庫訓練線性回歸模型。
我們將採用<strong>Scikit-learn</strong>套件訓練線性迴歸模型。
```python
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
```
首先,我們要將輸入值(特徵)和預期輸出(標籤)分別放進 numpy 陣列:
首先將輸入特徵與預期輸出(標籤)分別存入 numpy 陣列:
```python
X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1)
y = pie_pumpkins['Price']
```
> 注意,我們對輸入資料做了 `reshape`,讓線性迴歸套件能正確識別。線性迴歸期望輸入為 2D 陣列,其中每一列代表一組輸入特徵向量,因為此處只有一個特徵,故需一個大小為 N×1 的陣列N 為資料筆數。
> 注意,我們必須將輸入資料 `reshape` 以讓線性回歸套件能正確處理。線性回歸預期輸入是 2 維陣列,每列是輸入特徵向量。在本例中因為只有一個輸入,所以需要一個形狀為 N×1 的陣列N 是資料集大小。
接著,我們需要將資料分成訓練集和測試集,以便在訓練後驗證模型:
接著,我們需要將資料拆分為訓練與測試集,好在訓練後驗證模型成效:
```python
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
```
最後,訓練線性回歸模型只需兩行程式碼。我們定義 `LinearRegression` 物件,然後用 `fit` 方法將其擬合到資料上
最後,訓練線性迴歸模型僅需兩行程式碼。我們宣告 `LinearRegression` 物件,並使用 `fit` 方法訓練
```python
lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train)
```
`LinearRegression` 物件在 `fit` 後會包含迴歸的所有係數,可以透過 `.coef_` 屬性來存取。在我們的例子中,只有一個係數,應該約為 `-0.017`。這表示價格似乎隨時間略微下降,但不多,每天約下降兩仙。我們也可以使用 `lin_reg.intercept_` 來存取迴歸與 Y 軸的交點——在我們的例子中大約是 `21`,表示年初的價格。
`LinearRegression` 物件在進行 `fit` 後包含了所有回歸的係數,可以用 `.coef_` 屬性存取。在我們的例子中只有一個係數,大約是 `-0.017`。這表示價格隨時間似乎有輕微下降,但幅度不大,大約每天下降 2 分錢。我們也可以用 `lin_reg.intercept_` 存取回歸線與 Y 軸的交叉點——在我們的例子中約為 `21`,表示年初的價格。
為了看看我們的模型有多準確我們可以在測試資料集上預測價格然後測量預測值與實際值的接近程度。這可以使用均方根誤差RMSE指標來完成即所有預期與預測值平方差均值的平方根
要看看我們的模型有多準確,我們可以在測試資料集上預測價格,然後衡量預測值與期望值的接近程度。這可以用均方根誤差 (RMSE) 指標來完成,該指標是所有期望值與預測值平方差的平均後開根號
```python
pred = lin_reg.predict(X_test)
@ -216,15 +216,15 @@ rmse = np.sqrt(mean_squared_error(y_test,pred))
print(f'RMSE: {rmse:3.3} ({rmse/np.mean(pred)*100:3.3}%)')
```
我們的誤差約為 2 點,約為 17%。不是太好。衡量模型品質的另一個指標是<strong>決定係數coefficient of determination</strong>,可以這樣取得:
我們的誤差大約是 2 點,約為 ~17%。這不算太好。另一個衡量模型品質的指標是 <strong>決定係數</strong>,可用以下程式取得:
```python
score = lin_reg.score(X_train,y_train)
print('Model determination: ', score)
```
如果值為 0表示模型不考慮輸入資料作用如同<em>最差線性預測器</em>,即輸出結果的平均值。值為 1 表示我們可以完美預測所有預期輸出。在我們的例子中,係數約為 0.06,相當低。
當該值為 0 時,表示模型不考慮輸入資料,僅當作<em>最差線性預測</em>,即結果的平均值。當該值為 1 時,表示我們可以完美預測所有期望輸出。在我們的例子中,決定係數約為 0.06,偏低。
我們也可以將測試資料與迴歸線一起繪圖,以更清楚看到迴歸在我們的案例中如何運作
我們也可以將測試資料與回歸線繪圖,以更好地觀察回歸的效果
```python
plt.scatter(X_test,y_test)
@ -233,19 +233,19 @@ plt.plot(X_test,pred)
<img alt="Linear regression" src="../../../../translated_images/zh-MO/linear-results.f7c3552c85b0ed1c.webp" width="50%" />
## 多項式
## 多項式
另一種線性迴歸是多項式迴歸。雖然有時變數間存在線性關係——例如南瓜體積越大,價格越高——但有時這些關係無法用平面或直線繪製
線性回歸的另一種類型是多項式回歸。有時候變數之間呈線性關係——體積越大的南瓜價格越高——但有時這種關係無法用平面或直線描述
以下是[一些多項式迴歸適用的示例](https://online.stat.psu.edu/stat501/lesson/9/9.8)
這裡有[更多示例](https://online.stat.psu.edu/stat501/lesson/9/9.8)可以使用多項式回歸的資料
再看看日期與價格的關係。這散點圖看起來是否非得用直線分析?價格是否可能波動?這種情況下,可以嘗試多項式迴歸。
再看一次日期與價格的關係。這個散點圖看起來一定要用直線分析嗎?價格難道不會波動?這時可以嘗試多項式回歸。
✅ 多項式是由一個或多個變數與係數組成的數學表達式
✅ 多項式是可能包含一個或多個變數與係數的數學表達式
多項式迴歸建立一條曲線,以更好地擬合非線性資料。在我們的例子中,如果將平方的 `DayOfYear` 變數納入輸入,我們應該可以用一個二次曲線擬合資料,該曲線在一年中某點有最小值。
多項式回歸會產生一條曲線,以更貼合非線性資料。在我們的情況下,如果將平方的 `DayOfYear` 變數包含進輸入資料,應該能以一條抛物線擬合資料,該曲線在年中的某個點有一個最小值。
Scikit-learn 提供一個方便的[管道 API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline)來結合多個資料處理步驟。<strong>管道</strong>由多個<strong>預估器</strong>串連而成。在我們例子中,我們將建構一個管道,先加入多項式特徵,再進行迴歸訓練
Scikit-learn 包含方便的[管道 API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline)來結合不同的資料處理步驟。<strong>管道</strong>一連串的<strong>估計器</strong>。在我們的例子中,我們會建立一個先增加多項式特徵,再訓練迴歸模型的管道
```python
from sklearn.preprocessing import PolynomialFeatures
@ -256,36 +256,58 @@ pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)
```
使用 `PolynomialFeatures(2)` 表示包含所有二次項多項式。對我們而言,只有 `DayOfYear`<sup>2</sup>,但若有兩個輸入變數 X 和 Y則會加入 X<sup>2</sup>、XY 與 Y<sup>2</sup>。我們也可以使用更高次多項式。
使用 `PolynomialFeatures(2)` 表示我們會包含所有二次多項式。就我們例子來說,就是 `DayOfYear`<sup>2</sup>,但對兩個輸入變數 X 和 Y會加入 X<sup>2</sup>、XY 和 Y<sup>2</sup>。如有需要,也可用更高次方多項式。
管道可像原始的 `LinearRegression` 物件一樣使用,也就是我們可以在管道上呼叫 `fit`,然後用 `predict` 取得預測結果:
```python
pred = pipeline.predict(X_test)
rmse = np.sqrt(mean_squared_error(y_test,pred))
print(f'RMSE: {rmse:3.3} ({rmse/np.mean(pred)*100:3.3}%)')
score = pipeline.score(X_train,y_train)
print('Model determination: ', score)
```
要繪製平滑的擬合曲線,我們用 `np.linspace` 產生均勻間距的輸入值範圍,而非直接在無序的測試資料上繪製(那樣會呈現鋸齒狀線):
```python
X_range = np.linspace(X_test.min(), X_test.max(), 100).reshape(-1,1)
y_range = pipeline.predict(X_range)
plt.scatter(X_test, y_test)
plt.plot(X_range, y_range)
```
管道的使用方式與原始的 `LinearRegression` 物件相同,即可以 `.fit` 管道,之後使用 `.predict` 得到預測結果。以下圖顯示測試資料與擬合曲線:
這是包含測試資料和擬合曲線的圖
<img alt="Polynomial regression" src="../../../../translated_images/zh-MO/poly-results.ee587348f0f1f60b.webp" width="50%" />
使用多項式迴歸,我們能取得稍低的 MSE 及較高的決定係數,但改善幅度不大。我們需要考慮其他特徵!
使用多項式回歸,我們能得到稍低的 RMSE 與稍高的決定係數,但差異不大。我們需要考慮其他特徵!
> 你可以看到最低價的南瓜出現在萬聖節附近。你如何解釋這現象?
> 你可以看到,最低的南瓜價格大約出現在萬聖節左右。你怎麼解釋這個現象?
🎃 恭喜,你剛完成一個可幫助預測派用南瓜價格的模型。你可以對其他南瓜種類重複同樣操作,但非常繁瑣。接著讓我們學習如何在模型中考慮南瓜品種!
🎃 恭喜,你剛剛建立了一個可以幫助預測派南瓜價格的模型。你或許也可以用相同程序針對其他南瓜品種建立模型,但那會很繁瑣。現在讓我們學習如何在模型中考慮南瓜品種!
## 類別特徵
理想狀況下,我們希望同一模型能預測不同南瓜品種的價格。然而,`Variety` 欄位與 `Month` 不同,因它包含非數字值,這類欄位稱為<strong>類別型</strong>
理想狀況下,我們希望同一模型預測不同南瓜品種的價格。然而,`Variety` 欄位與 `Month` 等欄位不同,它包含非數值資料。這類欄位稱為<strong>類別特徵</strong>
[![ML for beginners - Categorical Feature Predictions with Linear Regression](https://img.youtube.com/vi/DYGliioIAE0/0.jpg)](https://youtu.be/DYGliioIAE0 "ML for beginners - Categorical Feature Predictions with Linear Regression")
> 🎥 點擊上方圖片觀看使用類別特徵的簡短影片介紹。
> 🎥 點擊上方圖片觀看使用類別特徵的線性回歸短片概述
這裡展示了平均價格如何依品種變化:
這裡顯示平均價格如何依品種變化:
<img alt="Average price by variety" src="../../../../translated_images/zh-MO/price-by-variety.744a2f9925d9bcb4.webp" width="50%" />
為了考慮品種,我們首先需要將它轉換為數字形式,或稱<strong>編碼</strong>。有幾種方法:
要考慮品種,我們首先需要將其轉換為數字形式,稱作<strong>編碼</strong>。有幾種方法:
* 簡單的<strong>字編碼</strong>會建立一張不同品種的表,然後用該表的索引取代品種名稱。這對線性迴歸不是好方法,因為模型會把索引數字當作數值處理及乘以係數加入結果,但品種索引與價格的關係明顯非線性,即使確保索引有特定順序也會如此
* <strong>獨熱編碼one-hot encoding</strong>會把 `Variety` 欄位換成4個欄位每個對應一個品種。若該行品種對應該欄位會為 1否則為 0。如此在迴歸模型有四個係數分別對應每種南瓜品種表示該品種的「起價」或更準確地說「額外價格」)。
* 簡單的<strong>值編碼</strong>會建立一張各品種的表,然後用該表的索引取代品種名稱。這對線性回歸來說並不理想,因為線性回歸會直接將索引數值乘以係數相加,但在我們案例中索引號碼與價格的關係很明顯是非線性的,即使我們嘗試將索引做某種特定排序
* <strong>獨熱編碼</strong>則會用 4 個不同欄位取代 `Variety`,每個欄位對應一個品種。如果該列是特定品種,該欄位為 `1`,反之為 `0`。這表示線性回歸會有四個係數,分別對應四個品種,代表該品種的“起始價”(或者說“額外價格”)。
以下程式碼示範如何對品種進行獨熱編碼:
以下程式示範如何對品種做獨熱編碼:
```python
pd.get_dummies(new_pumpkins['Variety'])
@ -302,14 +324,14 @@ pd.get_dummies(new_pumpkins['Variety'])
1741 | 0 | 1 | 0 | 0
1742 | 0 | 1 | 0 | 0
要用獨熱編碼品種訓練線性迴歸,只需正確初始化 `X``y` 資料
要用獨熱編碼品種作為輸入,訓練線性回歸,只要初始化 `X``y` 的資料正確即可
```python
X = pd.get_dummies(new_pumpkins['Variety'])
y = new_pumpkins['Price']
```
他程式碼與前面訓練線性迴歸相同。若嘗試執行,將會發現均方誤差差不多,但決定係數大幅提升(約 77%)。為達更準確預測,我們可以同時考慮更多類別特徵及數值特徵,例如 `Month``DayOfYear`若要取得一個完整特徵陣列,可`join`
餘程式碼與前面訓練線性回歸時相同。你試試看就會發現均方誤差差不多,但決定係數大幅提高到約 77%。若想更精確,可以同時考慮更多類別特徵及數值特徵,例如 `Month``DayOfYear`要合併成一個大特徵陣列,可以`join`
```python
X = pd.get_dummies(new_pumpkins['Variety']) \
@ -319,68 +341,68 @@ X = pd.get_dummies(new_pumpkins['Variety']) \
y = new_pumpkins['Price']
```
這裡還考慮了 `City``Package` 類型,得到 MSE 2.8410%)與決定係數 0.94
這裡我們也納入 `City``Package` 類別,得出的 RMSE 是 2.8410.5%),決定係數為 0.94
## 綜合應用
為做出最佳模型,我們可以使用上述結合(獨熱編碼類別+數值)資料,並搭配多項式迴歸。以下是完整程式碼,方便你參考:
要建立最好的模型,我們可以用上述案例的合併(獨熱編碼的類別 + 數值)特徵資料,並搭配多項式回歸。以下是完整程式,方便參考:
```python
# 設訓練數據
# 設訓練數據
X = pd.get_dummies(new_pumpkins['Variety']) \
.join(new_pumpkins['Month']) \
.join(pd.get_dummies(new_pumpkins['City'])) \
.join(pd.get_dummies(new_pumpkins['Package']))
y = new_pumpkins['Price']
# 進行訓練-測試劃分
# 製作訓練-測試分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# 設置並訓練管道
# 設定並訓練流程
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)
# 對測試數據進行預測結果
# 預測測試數據結果
pred = pipeline.predict(X_test)
# 計算均方誤差和決定係數
mse = np.sqrt(mean_squared_error(y_test,pred))
print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')
# 計算均方根誤差及決定係數
rmse = mean_squared_error(y_test, pred, squared=False)
print(f'RMSE: {rmse:3.3} ({rmse/pred.mean()*100:3.3}%)')
score = pipeline.score(X_train,y_train)
print('Model determination: ', score)
```
樣可以取得將近 97% 的最高決定係數,以及 2.23(約 8% 預測誤差)的 MSE
應該會給我們接近 97% 的最高決定係數與 RMSE=2.23(約 8% 預測誤差)
| 模型 | MSE | 決定係數 |
| 模型 | RMSE | 決定係數 |
|-------|-----|---------------|
| `DayOfYear` 線性 | 2.77 (17.2%) | 0.07 |
| `DayOfYear` 多項式 | 2.73 (17.0%) | 0.08 |
| `Variety` 線性 | 5.24 (19.7%) | 0.77 |
| 全特徵線性 | 2.84 (10.5%) | 0.94 |
| 全特徵多項式 | 2.23 (8.25%) | 0.97 |
| 所有特徵 線性 | 2.84 (10.5%) | 0.94 |
| 所有特徵 多項式 | 2.23 (8.25%) | 0.97 |
🏆 做得好!你在一堂課中建立了四個迴歸模型,將模型品質提升至 97%。在迴歸的最後一節中,你將學習用於分類的邏輯斯迴歸。
🏆 幹得好!在一堂課中建立了四個回歸模型,並將模型品質提升到 97%。在回歸的最後一節,你將學習用於分類判斷的邏輯迴歸。
---
## 🚀挑戰
這個筆記本中測試不同變數,查看相關性與模型準確度的關係。
此筆記本中測試不同變數,觀察其相關性與模型準確性的關係。
## [課後測驗](https://ff-quizzes.netlify.app/en/ml/)
## [課後測驗](https://ff-quizzes.netlify.app/en/ml/)
## 複習與自學
本課我們學習了線性迴歸。還有其他重要的迴歸方法。閱讀關於逐步迴歸、Ridge、Lasso 和 Elasticnet 的技術。推薦深入學習的課程是[史丹佛統計學習課程](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning)
本課涵蓋了線性回歸。其他重要的回歸類型還包括階層回歸、嶺回歸、Lasso 與彈性網路。想深入學習可以參考 [Stanford 統計學習課程](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning)
## 作業
## 作業
[建立模型](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**免責聲明**
本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於準確性,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件之母語版本應視為權威來源。對於重要資訊,建議採用專業人工翻譯。我們不對因使用本翻譯而引起之任何誤解或錯誤解釋負責
**免責聲明**
本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們力求準確,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應視為權威來源。對於重要資訊,建議尋求專業人工作翻譯。我們對因使用本翻譯而產生的任何誤解或誤釋不承擔任何責任
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -4,14 +4,14 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## 南瓜定價的線性與多項式回歸 - 第三課\n",
"## 線性與多項式回歸應用於南瓜定價 - 課程 3\n",
"\n",
"載入所需的庫和數據集。將數據轉換為包含部分數據的數據框:\n",
"載入所需的函式庫和資料集。將資料轉換為包含資料子集的資料框:\n",
"\n",
"- 僅取按蒲式耳定價的南瓜\n",
"- 僅取按蒲式耳定價的南瓜\n",
"- 將日期轉換為月份\n",
"- 計算價格為高價與低價的平均值\n",
"- 將價格轉換為反映蒲式耳數量定價\n"
"- 計算價格為高價與低價的平均值\n",
"- 將價格轉換為反映蒲式耳數量定價\n"
]
},
{
@ -377,7 +377,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"散佈圖提醒我們,我們只有從八月到十二月的月度數據。我們可能需要更多的數據才能以線性方式得出結論。\n"
"散點圖提醒我們,我們只有從八月至十二月的月份數據。我們可能需要更多數據才能以線性方式得出結論。\n"
]
},
{
@ -447,7 +447,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"讓我們看看是否有相關性:\n"
]
},
{
"cell_type": "code",
@ -472,7 +474,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"看起來相關性相當小,但存在一些其他更重要的關係——因為上圖中的價格點似乎有幾個明顯的群集。我們來製作一個圖表,顯示不同的南瓜品種:\n"
"看起來相關性相當小,但有一些其他更重要的關係——因為上面圖表中的價格點似乎有幾個明顯的群聚。我們來畫一個圖,顯示不同的南瓜品種:\n"
]
},
{
@ -535,7 +537,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"暫時,我們先專注於一種款式 - <strong>批類型</strong>。\n"
]
},
{
"cell_type": "code",
@ -582,9 +586,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"### 線性歸\n",
"### 線性歸\n",
"\n",
"我們將使用 Scikit Learn 來訓練線性回歸模型:\n"
"我們將使用 Scikit Learn 來訓練線性迴歸模型:\n"
]
},
{
@ -662,7 +666,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"可以從線性回歸係數中確定直線的斜率:\n"
"線性回歸係數可以用來確定直線的斜率:\n"
]
},
{
@ -688,7 +692,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"我們可以使用訓練好的模型來預測價格:\n"
]
},
{
"cell_type": "code",
@ -718,9 +724,9 @@
"source": [
"### 多項式回歸\n",
"\n",
"有時候,特徵與結果之間的關係本質上是非線性的。例如,南瓜的價格可能在冬季(月份=1,2很高然後在夏季月份=5-7下降接著又上升。線性回歸無法準確地捕捉這種關係。\n",
"有時候,特徵與結果之間的關係本質上是非線性的。例如,冬天(月份=1,2南瓜價格可能較高然後在夏天月份=5-7下降接著再上升。線性回歸無法準確擬合這種關係。\n",
"\n",
"在這種情況下,我們可以考慮添加額外的特徵。一個簡單的方法是從輸入特徵中使用多項式,這樣就會形成**多項式回歸**。在 Scikit Learn 中,我們可以使用管道自動預先計算多項式特徵:\n"
"在這種情況下,我們可以考慮加入額外的特徵。簡單的方法是使用輸入特徵的多項式,這會產生<strong>多項式回歸</strong>。在 Scikit Learn 中,我們可以使用管線自動預先計算多項式特徵:\n"
]
},
{
@ -775,22 +781,25 @@
"score = pipeline.score(X_train,y_train)\n",
"print('Model determination: ', score)\n",
"\n",
"plt.scatter(X_test,y_test)\n",
"plt.plot(sorted(X_test),pipeline.predict(sorted(X_test)))"
"X_range = np.linspace(X_test.min(), X_test.max(), 100).reshape(-1,1)\n",
"y_range = pipeline.predict(X_range)\n",
"\n",
"plt.scatter(X_test, y_test)\n",
"plt.plot(X_range, y_range)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 編碼種\n",
"### 編碼種\n",
"\n",
"在理想情況下,我們希望能夠使用同一個模型來預測不同南瓜品種的價格。為了考慮品種的影響,我們首先需要將其轉換為數字形式,或者說進行**編碼**。有幾種方法可以做到\n",
"在理想情況下,我們希望能夠使用同模型來預測不同南瓜品種的價格。為了考慮品種,我們首先需要將其轉換為數值形式,或稱為<strong>編碼</strong>。我們可以用幾種方法來做\n",
"\n",
"* 簡單的數字編碼,這種方法會建立一個不同品種的表格,然後用該表格中的索引來替換品種名稱。這對於線性回歸來說並不是最好的方法,因為線性回歸會考慮索引的數值,而這些數值很可能與價格之間沒有數值上的相關性。\n",
"* 獨熱編碼One-hot encoding這種方法會用4個不同的列來替換`Variety`列,每個列對應一個品種。如果某一行屬於某個特定品種,該列的值為1否則為0。\n",
"* 簡單的數值編碼,會建立一個不同品種的對照表,然後用該表中的索引來替換品種名稱。這對線性回歸來說不是最好的主意,因為線性回歸會考慮索引的數值,而該數值不一定與價格在數值上相關。\n",
"* 一熱編碼,會將`Variety`欄替換為4個不同的欄位每個品種一個如果該欄位的行屬於該品種則為1否則為0。\n",
"\n",
"以下的程式碼展示了如何對品種進行獨熱編碼:\n"
"下面的程式碼展示了如何對品種進行一熱編碼:\n"
]
},
{
@ -938,9 +947,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"### 品種的線性回歸\n",
"### 品種的線性回歸\n",
"\n",
"我們現在將使用與上述相同的程式碼,但這次將使用我們的單熱編碼品種作為輸入,而不是 `DayOfYear`。\n"
"我們現在將使用與上面相同的程式碼,但不使用 `DayOfYear`改為使用我們的多品種one-hot編碼作為輸入\n"
]
},
{
@ -988,7 +997,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"我們也可以以相同的方式嘗試使用其他特徵,並將它們與數值特徵結合,例如 `Month` 或 `DayOfYear`:\n"
"我們亦可嘗試以相同方式使用其他特徵,並將它們與數值特徵結合,例如 `Month` 或 `DayOfYear`\n"
]
},
{
@ -1019,9 +1028,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"### 多項式歸\n",
"### 多項式歸\n",
"\n",
"多項式回歸也可以用於經過獨熱編碼的類別型特徵。訓練多項式回歸的程式碼基本上與我們之前看到的相同。\n"
"多項式迴歸亦可用於經過一熱編碼的類別特徵。訓練多項式迴歸的程式碼基本上與上述所見相同。\n"
]
},
{
@ -1068,7 +1077,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免責聲明** \n本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。\n"
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**免責聲明** \n本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於準確性,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應視為權威資料。對於重要資訊,建議使用專業人工翻譯。我們不對因使用此翻譯而引起的任何誤解或誤譯承擔責任。\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
],
@ -1098,13 +1107,7 @@
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"orig_nbformat": 2,
"coopTranslator": {
"original_hash": "d77bd89ae7e79780c68c58bab91f13f8",
"translation_date": "2025-08-29T22:46:58+00:00",
"source_file": "2-Regression/3-Linear/solution/notebook.ipynb",
"language_code": "mo"
}
"orig_nbformat": 2
},
"nbformat": 4,
"nbformat_minor": 2

@ -36,8 +36,8 @@
"language_code": "zh-TW"
},
"1-Introduction/4-techniques-of-ML/README.md": {
"original_hash": "9d91f3af3758fdd4569fb410575995ef",
"translation_date": "2025-09-05T09:53:31+00:00",
"original_hash": "84b1715a6be62ef1697351dcc5d7b567",
"translation_date": "2026-04-26T20:35:46+00:00",
"source_file": "1-Introduction/4-techniques-of-ML/README.md",
"language_code": "zh-TW"
},
@ -90,8 +90,8 @@
"language_code": "zh-TW"
},
"2-Regression/3-Linear/README.md": {
"original_hash": "26c53a922f1f1e8542b0ea41ff52221a",
"translation_date": "2026-04-20T16:20:06+00:00",
"original_hash": "8b776e731c35b171d316d01d0e7b1369",
"translation_date": "2026-04-26T20:35:22+00:00",
"source_file": "2-Regression/3-Linear/README.md",
"language_code": "zh-TW"
},
@ -107,6 +107,12 @@
"source_file": "2-Regression/3-Linear/solution/Julia/README.md",
"language_code": "zh-TW"
},
"2-Regression/3-Linear/solution/notebook.ipynb": {
"original_hash": "6781223ffbe8cfdaa38d0200f08e1288",
"translation_date": "2026-04-26T20:32:06+00:00",
"source_file": "2-Regression/3-Linear/solution/notebook.ipynb",
"language_code": "zh-TW"
},
"2-Regression/4-Logistic/README.md": {
"original_hash": "abf86d845c84330bce205a46b382ec88",
"translation_date": "2025-09-05T09:43:09+00:00",

@ -1,123 +1,126 @@
# 機器學習技術
建立、使用維護機器學習模型及其所使用的數據的過程,與許多其他開發工作流程有很大的不同。在本課中,我們將揭開這一過程的神秘面紗,並概述您需要了解的主要技術。您將學到
建立、使用以及維護機器學習模型及其所使用的數據的過程,與許多其他開發工作流程有很大的不同。在本課程中,我們將揭開這個過程的神秘面紗,並概述您需要了解的主要技術。您將會
- 高層次理解支撐機器學習的過程。
- 探索基本概念,如「模型」、「預測」和「訓練數據」。
- 高層次理解支撐機器學習的過程。
- 探索基本概念,如「模型」、「預測」和「訓練數據」。
## [課前測驗](https://ff-quizzes.netlify.app/en/ml/)
## [課前測驗](https://ff-quizzes.netlify.app/en/ml/)
[![機器學習初學者 - 機器學習技術](https://img.youtube.com/vi/4NGM0U2ZSHU/0.jpg)](https://youtu.be/4NGM0U2ZSHU "機器學習初學者 - 機器學習技術")
[![ML for beginners - Techniques of Machine Learning](https://img.youtube.com/vi/4NGM0U2ZSHU/0.jpg)](https://youtu.be/4NGM0U2ZSHU "ML for beginners - Techniques of Machine Learning")
> 🎥 點擊上方圖片觀看一段簡短的影片,了解本課內容
> 🎥 點擊上方圖片觀看一個關於本課程的短影片
## 簡介
從高層次來看創建機器學習ML流程的技術包括以下幾個步驟:
在高層次上創建機器學習ML流程的工作包含多個步驟:
1. **確定問題**。大多數機器學習流程始於提出一個無法通過簡單條件程序或基於規則的引擎回答的問題。這些問題通常圍繞基於數據集合進行的預測。
2. **收集和準備數據**。為了回答您的問題,您需要數據。數據的質量以及有時候的數量,將決定您能多好地回答最初的問題。數據可視化是這一階段的重要部分。這一階段還包括將數據分為訓練組和測試組以構建模型。
3. **選擇訓練方法**。根據您的問題和數據的性質,您需要選擇如何訓練模型以最佳反映數據並對其進行準確預測。這是機器學習過程中需要特定專業知識且通常需要大量實驗的部分。
4. **訓練模型**。使用訓練數據,您將使用各種算法訓練模型以識別數據中的模式。模型可能會利用內部權重,這些權重可以調整以優先考慮數據的某些部分,從而構建更好的模型。
5. **評估模型**。使用從未見過的數據(測試數據)來檢查模型的性能
6. **參數調整**。根據模型的性能,您可以使用不同的參數或變量重新進行該過程,這些參數或變量控制訓練模型時所用算法的行為。
7. **預測**。使用新輸入測試模型的準確性。
1. <strong>決定問題</strong>。多數的機器學習流程從提出一個無法用簡單條件式程式碼或基於規則引擎回答的問題開始。這些問題通常圍繞基於大量數據的預測。
2. <strong>收集與準備數據</strong>。為了能回答您的問題,您需要數據。數據的品質,有時候還有數量,將決定您能多好地回答最初的問題。視覺化數據是此階段的重要方面。這個階段還包括將數據拆分為訓練集和測試集來建構模型。
3. <strong>選擇訓練方法</strong>。根據您的問題和數據的性質,您需要選擇如何訓練模型,才能最佳反映數據並做出準確預測。這是您的機器學習流程中需要專業知識且常常需要大量實驗的部分。
4. <strong>訓練模型</strong>。利用訓練數據,您將使用各種演算法訓練模型,以識別數據中的模式。模型可能會利用可調整的內部權重,讓模型更偏重數據中的某些部份,以建造更佳的模型。
5. <strong>評估模型</strong>。您使用以前未見過的數據(測試數據)來檢驗模型的表現
6. <strong>參數調整</strong>。根據模型的表現,您可以使用不同的參數或變數重新執行流程,以調控用來訓練模型演算法的行為。
7. <strong>預測</strong>。使用新輸入資料測試模型的準確性。
## 該問什麼問題
計算機特別擅長發現數據中的隱藏模式。這對於研究人員來說非常有用,因為他們對某個領域有一些問題,而這些問題無法輕易通過創建基於條件的規則引擎來回答。例如,針對精算任務,數據科學家可能能夠構建手工規則來分析吸煙者與非吸煙者的死亡率
電腦特別擅長從數據中發掘隱藏的模式。這項功能對於研究者很有幫助,尤其是在許多問題無法輕易透過條件式規則引擎回答的領域。例如,在保險精算工作中,資料科學家或許能針對吸菸者和非吸菸者的死亡率訂定人工規則
然而,當許多其他變量被納入考量時,機器學習模型可能更有效地根據過去的健康歷史預測未來的死亡率。一個更令人愉快的例子可能是根據包括緯度、經度、氣候變化、靠近海洋的距離、噴流模式等數據,預測某地四月份的天氣。
然而,當多個變數加入考量時,機器學習模型可能會更有效率地根據過去健康紀錄預測未來的死亡率。另一個較為愉快的例子是,根據包含緯度、經度、氣候變遷、近海距離、噴射氣流模式等數據,預測某地四月份的天氣。
✅ 這份[簡報](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf)提供了使用機器學習進行天氣分析的歷史視角
✅ 這份 [關於天氣模型的簡報](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf) 提供了應用機器學習進行天氣分析的歷史觀點
## 構建前的任務
## 建模前的準備工作
在開始建模型之前,您需要完成幾項任務。為了測試您的問題並根據模型預測形成假設,您需要識別並配置幾個元素。
在開始建模型之前,有幾項工作您需要完成。為了測試您的問題並根據模型預測形成假設,您需要識別並配置幾個元素。
### 數據
為了能夠以任何確定性回答您的問題,您需要足夠數量且類型正確的數據。在這一點上,您需要完成以下兩件事
為了能有一定信心回答您的問題,您需要大量並且類型正確的數據。此時您需要進行兩件事情
- **收集數據**。記住上一課中關於數據分析公平性的內容,謹慎收集數據。注意數據的來源、可能存在的內在偏見,並記錄其來源。
- **準備數據**。數據準備過程包括多個步驟。如果數據來自不同來源,您可能需要整理並標準化數據。您可以通過各種方法提高數據的質量和數量,例如將字符串轉換為數字(如我們在[聚類](../../5-Clustering/1-Visualize/README.md)中所做的)。您還可以基於原始數據生成新數據(如我們在[分類](../../4-Classification/1-Introduction/README.md)中所做的)。您可以清理和編輯數據(如我們在[Web 應用](../../3-Web-App/README.md)課程之前所做的)。最後,根據您的訓練技術,您可能還需要隨機化和打亂數據
- <strong>收集數據</strong>。回想上一課關於數據分析公正性的部分,請謹慎收集數據。注意數據來源、可能存在的偏見,並記錄其來源。
- <strong>準備數據</strong>。數據準備的過程包含數個步驟。如果數據來自不同來源,您需要整合並正規化數據。您也能透過將字串轉為數字(如我們在[分群](../../5-Clustering/1-Visualize/README.md)課程所示)等方法改善數據的品質與數量。您可能還會基於原始數據產生新數據(如在[分類](../../4-Classification/1-Introduction/README.md)中示範)。將數據清理及編輯(如我們在[Web App](../../3-Web-App/README.md)課程前所做)也是重要步驟。最後,根據您的訓練技巧,可能還需要對數據做隨機化和打亂
在收集和處理數據後,花點時間檢查其形狀是否能幫助您解決預期問題。可能數據在您的任務中表現不佳,正如我們在[聚類](../../5-Clustering/1-Visualize/README.md)課程中發現的那樣!
收集及處理數據後,請確認其形態是否足以解決您要提問的問題。就在我們的[分群](../../5-Clustering/1-Visualize/README.md)課程中,我們會發現有時數據在任務中的表現不佳。
### 特徵與目標
[特徵](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection)是數據的一個可測量屬性。在許多數據集中,它表現為列標題,例如「日期」、「大小」或「顏色」。特徵變量通常在代碼中表示為 `X`,代表用於訓練模型的輸入變量
[特徵](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection) 是數據中的可衡量屬性。在許多資料集中,它以欄位標題表達,如「日期」、「尺寸」或「顏色」。您的特徵變數通常用代碼中的 `X` 表示,代表用來訓練模型的輸入變數
目標是您試圖預測的事物。目標通常在代碼中表示為 `y`,代表您試圖從數據中回答的問題。例如:在十二月,哪種**顏色**的南瓜最便宜?在舊金山,哪些街區的房地產**價格**最好?有時目標也被稱為標籤屬性。
目標是您嘗試預測的事物。目標變數通常代碼中為 `y`,代表您嘗試問數據的問題答案:十二月,哪種 <strong>顏色</strong> 的南瓜最便宜?在舊金山,哪些社區的房地產 <strong>價格</strong> 最佳?有時候目標也被稱為標籤屬性。
### 選擇您的特徵變量
### 選擇特徵變數
🎓 **特徵選擇與特徵提取** 如何知道在構建模型時選擇哪個變量?您可能需要經歷特徵選擇或特徵提取的過程,以選擇最適合的變量來構建性能最佳的模型。然而,這兩者並不相同:「特徵提取通過原始特徵的函數創建新特徵,而特徵選擇則返回特徵的子集。」([來源](https://wikipedia.org/wiki/Feature_selection)
🎓 <strong>特徵選擇與特徵提取</strong>:建構模型時,您如何知道該選擇哪個變數?您可能會透過特徵選擇或特徵提取過程選出最能提升模型效能的變數。然而兩者不同:「特徵提取是從原始特徵的函數中創造新特徵,而特徵選擇則是從原特徵中選出子集。」([來源](https://wikipedia.org/wiki/Feature_selection)
### 視化數據
### 視化數據
數據科學家工具箱中的一個重要方面是使用多種優秀庫(如 Seaborn 或 MatPlotLib來可視化數據的能力。以可視化方式表示數據可能幫助您發現可以利用的隱藏相關性。您的可視化還可能幫助您發現偏見或數據不平衡如我們在[分類](../../4-Classification/2-Classifiers-1/README.md)中發現的那樣)。
資料科學家工具箱的重要一環是利用優秀的庫,例如 Seaborn 或 MatPlotLib將數據視覺化。視覺化數據可能讓您發現潛藏的相關性加以利用。您的視覺化也可能幫助發現偏見或數據不平衡如[分類](../../4-Classification/2-Classifiers-1/README.md)課程所示)。
### 分割數據
### 拆分資料
在訓練之前,您需要將數據集分為兩個或更多不等大小的部分,這些部分仍能很好地代表數據。
在訓練之前,您需要將資料集拆分為兩個或以上不等大小的部分,且仍能良好代表數據。
- **訓練集**。這部分數據集用於訓練模型。這部分數據通常佔原始數據集的大多數。
- **測試集**。測試數據集是從原始數據中獨立提取的一組數據,用於確認構建的模型的性能。
- **驗證集**。驗證集是一組較小的獨立數據,用於調整模型的超參數或架構,以改進模型。根據數據的大小和您提出的問題,您可能不需要構建這第三組數據(如我們在[時間序列預測](../../7-TimeSeries/1-Introduction/README.md)中所述)。
- <strong>訓練集</strong>。這部分資料用來擬合模型並訓練,佔原始資料集大多數。
- <strong>測試集</strong>。測試資料集是獨立的資料,通常從原始資料中取得,用以驗證建立的模型效能。
- <strong>驗證集</strong>。驗證集是較小且獨立的樣本組,用來調整模型的超參數(或架構),以改善模型表現。根據資料大小和問題,您可能不需要建立此第三個資料集(如[時間序列預測](../../7-TimeSeries/1-Introduction/README.md)課程中所說)。
## 建模型
## 建模型
使用訓練數據,您的目標是使用各種算法構建一個模型,或者說是數據的統計表示,來**訓練**它。訓練模型使其接觸數據,並讓它對發現的模式進行假設、驗證並接受或拒絕
利用您的訓練資料,目標是使用各種演算法去<strong>訓練</strong>模型,或對數據建立統計表示。訓練模型的過程是讓模型接觸數據並對所發現、驗證且接受或拒絕的模式做出假設
### 決定訓練方法
根據您的問題和數據的性質,您將選擇一種方法來訓練模型。通過瀏覽[Scikit-learn 的文檔](https://scikit-learn.org/stable/user_guide.html)(我們在本課程中使用的工具),您可以探索多種訓練模型的方法。根據您的經驗,您可能需要嘗試幾種不同的方法來構建最佳模型。您可能會經歷一個過程,數據科學家通過向模型提供未見過的數據來評估其性能,檢查準確性、偏差和其他可能降低質量的問題,並選擇最適合當前任務的訓練方法。
根據您的問題與數據性質,您會選擇一種訓練方法。瀏覽 [Scikit-learn 的文件](https://scikit-learn.org/stable/user_guide.html) — 這門課程採用的工具 — 您能探索許多訓練模型的方式。依經驗不同,您可能需要嘗試數種方法以建構最佳模型。資料科學家通常會透過讓模型分析未見過的數據,檢查準確性、偏見與其他降低品質的問題,然後選擇最適合此任務的訓練方法。
### 訓練模型
### 模型訓練
有了訓練數據,您可以開始「擬合」數據以創建模型。您會注意到,在許多機器學習庫中,您會看到代碼 `model.fit`——這時您將特徵變量作為值數組(通常是 `X`)以及目標變量(通常是 `y`)傳入
帶著訓練資料,您已準備好使用模型的 `fit` 方法擬合數據。您會注意到許多 ML 函式庫中有 `model.fit` 的程式碼 - 這時您會傳入特徵變數(通常為 `X` 的陣列)和目標變數(通常為 `y`
### 評估模型
一旦訓練過程完成(對於大型模型,可能需要多次迭代或「時期」),您將能夠使用測試數據來評估模型的質量,檢查其性能。這些測試數據是原始數據的一個子集,模型之前未曾分析過。您可以打印出一個關於模型質量的指標表。
完成訓練過程後大型模型可能需許多迭代或「epochs」您能利用測試資料評估模型品質。測試資料是原始資料中模型之前未分析過的一部分。您可以列印出關於模型品質的評估指標表。
🎓 **模型擬合**
🎓 <strong>模型擬合</strong>
在機器學習的背景下,模型擬合指的是模型的底層函數在嘗試分析未熟悉的數據時的準確性
在機器學習中,模型擬合指的是模型基底函數用以嘗試分析未曾接觸數據時的精確度
🎓 **欠擬合**和**過擬合**是常見問題,會降低模型質量,因為模型要麼擬合得不夠好,要麼擬合得太好。這會導致模型的預測與訓練數據過於緊密或過於鬆散地對齊。過擬合模型對訓練數據的預測過於準確,因為它過於詳細地學習了數據的細節和噪聲。欠擬合模型則不夠準確,因為它既無法準確分析訓練數據,也無法準確分析未見過的數據。
🎓 <strong>欠擬合</strong><strong>過擬合</strong> 是常見問題,會降低模型品質;欠擬合是模型擬合不夠好,無法準確分析訓練資料或新資料;過擬合則是模型過度擬合訓練資料的細節與噪音,導致對訓練資料預測太精準。
過擬合模型與訓練資料太過貼合,欠擬合模型則不夠準確。
![過擬合模型](../../../../1-Introduction/4-techniques-of-ML/images/overfitting.png)
> 信息圖由 [Jen Looper](https://twitter.com/jenlooper) 提供
![overfitting model](../../../../translated_images/zh-TW/overfitting.1c132d92bfd93cb6.webp)
> 資料圖由 [Jen Looper](https://twitter.com/jenlooper) 製作
## 參數調整
完成初步訓練後,觀察模型的質量,並考慮通過調整其「超參數」來改進模型。閱讀更多相關過程的[文檔](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott)。
完成初步訓練後,觀察模型品質,並考慮透過調整「超參數」來改進。關於這個過程的更多內容,請參考[文件說明](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott)。
## 預測
這是您可使用全新數據測試模型準確性的時刻。在「應用」機器學習設置中,當您構建用於生產的網頁資產時,這一過程可能涉及收集用戶輸入(例如按下按鈕)來設置變量並將其發送到模型進行推理或評估。
這是您可使用全新數據測試模型準確性的時刻。在「應用」機器學習場域,您可能會建置網頁資產以在生產環境使用模型,此時流程可能包含收集使用者輸入(例如按鈕點擊),將變數送入模型進行推論或評估。
在這些課程中,您將學習如何使用這些步驟來準備、構建、測試、評估和預測——這些都是數據科學家的基本操作,隨著您在成為「全棧」機器學習工程師的旅程中不斷進步,您還會學到更多
在這些課程中,您將發現如何利用這些步驟準備、建構、測試、評估與預測 — 這些都是資料科學家的基本動作,並且更多,助您向「全端」機器學習工程師的旅程邁進
---
## 🚀挑戰
繪製一個反映機器學習從業者步驟的流程圖。您認為自己目前處於該過程的哪一步?您預測在哪些方面會遇到困難?哪些部分對您來說似乎很簡單
繪製一張反映機器學習從業人員步驟的流程圖。您認為自己目前處於哪個環節?您預測將會遇到哪裡的困難?哪個部分您覺得比較容易
## [課後測驗](https://ff-quizzes.netlify.app/en/ml/)
## [課後測驗](https://ff-quizzes.netlify.app/en/ml/)
## 回顧與自學
## 複習與自學
在線搜索數據科學家討論日常工作的訪談。這裡有一個[例子](https://www.youtube.com/watch?v=Z3IjgbbCEfs)。
在線上搜尋資料科學家的訪談,了解他們的日常工作。這裡有[一則訪談](https://www.youtube.com/watch?v=Z3IjgbbCEfs)。
## 作業
[訪談一位數據科學家](assignment.md)
[訪談一位資料科學家](assignment.md)
---
**免責聲明**
本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而產生的任何誤解或錯誤解讀概不負責。
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**免責聲明**
本文件係使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 所翻譯。雖然我們致力於準確性,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件之母語版本應視為權威之來源。對於重要資訊,建議請專業人工翻譯。我們不對因使用本翻譯所引起之任何誤解或誤釋承擔責任。
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,96 +1,97 @@
# 使用 Scikit-learn 建立迴歸模型:四種迴歸方式
# 使用 Scikit-learn 建立迴歸模型:迴歸四種方法
## 初學者說明
## 初學者提醒
線性迴歸用於我們想預測<strong>數值型</strong>結果(例如房價、溫度或銷售額)時。它透過尋找一條最能代表輸入特徵與輸出之間關係的直線來工作。
當我們想要預測<strong>數值型的值</strong>(例如房價、溫度或銷售額)時,就會用到線性迴歸。
線性迴歸透過尋找一條最佳代表輸入特徵與輸出之間關係的直線來工作。
本課程重點放在理解概念,稍後會探討更進階的迴歸技術。
![Linear vs polynomial regression infographic](../../../../translated_images/zh-TW/linear-polynomial.5523c7cb6576ccab.webp)
> 資訊圖 [Dasani Madipalli](https://twitter.com/dasani_decoded) 製作
本課程將先著重了解概念,再探索更進階的迴歸技術。
![線性與多項式迴歸資訊圖](../../../../translated_images/zh-TW/linear-polynomial.5523c7cb6576ccab.webp)
> 資訊圖表作者 [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [課前測驗](https://ff-quizzes.netlify.app/en/ml/)
> ### [本課程也提供 R 版本!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html)
> ### [本課程也提供 R 語言版本!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html)
### 介紹
到目前為止,你已經了解了迴歸是什麼,並使用了本課程中將持續使用的南瓜價格資料集進行了範例資料的探索。你也使用 Matplotlib 進行了視覺化
到目前為止,你已經使用我們將在本課中持續使用的南瓜價格資料集探索了迴歸是什麼。你也使用 Matplotlib 視覺化了資料
現在你已經準備好更深入了解機器學習的迴歸。雖然視覺化可以幫助你理解資料但機器學習的真正強大之處在於_訓練模型_。模型在歷史資料上訓練能自動捕捉資料間的相依關係並能為模型沒見過的新資料做出預測。
現在你已準備好深入探討機器學習中的迴歸。雖然視覺化幫助理解資料機器學習的真正強大在於_訓練模型_。模型會基於歷史資料自動捕捉資料依賴關係並允許你對模型未曾見過的新資料進行預測。
本課將學習兩種迴歸_基本線性迴歸_與_多項式迴歸_並了解這些技術背後的一些數學原理。這些模型將允許我們依據不同的輸入資料預測南瓜價格。
本課將進一步介紹兩種迴歸_基本線性迴歸_和_多項式迴歸_並說明這些技術背後的部分數學理論。這些模型將讓我們能依據不同的輸入資料預測南瓜價格。
[![ML for beginners - Understanding Linear Regression](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "ML for beginners - Understanding Linear Regression")
[![初學者機器學習 - 理解線性迴歸](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "初學者機器學習 - 理解線性迴歸")
> 🎥 點擊上方圖片看關於線性迴歸的短影片概述
> 🎥 點擊上方圖片觀看線性迴歸簡介短片
> 在整個課程中,我們假設數學知識最小,並致力於讓來自其他領域的學生也能理解,因此請留意筆記、🧮 註解、圖表及其他學習工具以協助理解
> 在整個課程中,我們假設數學知識最低限度,並致力於讓來自不同領域的學生都能理解,因此請留意注記、🧮 數學提示、圖解與其他學習工具
### 先備知識
你現在應該已熟悉我們所研究的南瓜資料結構。資料已在本課的 _notebook.ipynb_ 檔中預先載入並清理過。該檔案中,南瓜價格已按每蒲式耳顯示。請確保你能在 Visual Studio Code 的 kernel 中執行這些筆記本
你現在應該對我們檢視的南瓜資料結構有所熟悉。本課將在 _notebook.ipynb_ 檔案中預先載入與預先清理該資料。此檔中,南瓜價格會以每蒲式耳價格顯示在新的資料框中。請確保你能在 Visual Studio Code 的 kernel 中執行這些 notebooks
### 準備工作
### 準備
提醒你,我們載入此資料是為了提出問題:
提醒你,我們載入這些資料是為了向它提出問題:
- 什麼時候買南瓜最划算
- 一箱迷你南瓜的大致價格是多少?
- 我該買半蒲式耳籃裝還是 1 1/9 蒲式耳箱裝?
讓我們繼續深入這份資料。
- 何時是買南瓜的最佳時機
- 我能預期迷你南瓜整箱的價格是多少?
- 我應該買半蒲式耳籃裝,還是 1又1/9蒲式耳箱裝?
讓我們繼續探究這些資料。
上一課中,你建了一個 Pandas 資料框,並填入原始資料部分內容,統一以蒲式耳價格化。這樣你只蒐集到約 400 筆資料,且只有秋季月份
上一課你建立了 Pandas 資料框,並使用了原始資料部分,只蒐集了秋季月份且標準化至每蒲式耳價格,因而僅取得約 400 筆資料
看看本課附帶筆記本預先載入的資料。資料已準備好,並繪製了最初的散點圖以顯示月份資料。也許我們可以透過更進一步清理,獲得關於資料性質的更多細節
請參考本課附帶 notebook 中預載的資料。資料已預先載入並繪出初始散點圖以顯示月份資料。也許透過更細部的清理,可以更了解該資料特性
## 線性迴歸線
如你在第一課學習的,線性迴歸的目標是能夠繪製一條線,以:
如你在第一課學,線性迴歸的目標是繪製一條線,以:
- <strong>顯示變數關係</strong>。展示變數間的關聯
- <strong>做出預測</strong>。準確預測新數據點相較於該線的位置
- <strong>展示變數關聯性</strong>:展示變數間的關係
- <strong>做出預測</strong>:準確預測新資料點相對於該條線的位置
通常使用<strong>最小平方回歸</strong>繪製這類線條。名詞「最小平方」指的是我們在模型中將誤差總和降到最低的過程。對每個資料點,我們測量該點與回歸線間的垂直距離(稱為殘差)。
<strong>最小平方法迴歸</strong> 會繪製這類線。術語「最小平方法」指的是我們透過最小化模型中總誤差的過程。對每個資料點,我們測量實際點和迴歸線間的垂直距離(稱為殘差)。
我們會將這些距離平方的原因有兩個
這些距離的平方有兩大理由
1. <strong>大小勝於方向</strong>:希望把誤差 -5 與 +5 視為同樣大小,平方能將所有數值轉為正值
1. <strong>誤差大小重於方向</strong>:我們希望將-5與+5的誤差視同。平方會把所有值變為正數
2. <strong>重懲離群值</strong>:平方對較大誤差給予更多權重,促使線條更接近偏離較遠的點。
2. <strong>懲罰離群點</strong>:平方會給予較大的誤差更高權重,迫使直線貼近遠離的點。
接著,我們將所有平方值相加。目標是找到使這個總和最小的那條線,因此稱為「最小平方」。
接著加總所有平方值。我們目標是找出使此總和最小的那條直線,故稱「最小平方法」。
> **🧮 給我數學公式**
> **🧮 數學說明**
>
> 這條稱為_最佳擬合線_的直線可以透過[方程式](https://en.wikipedia.org/wiki/Simple_linear_regression)表示:
> 此直線稱為_最佳擬合線_可用[方程式](https://en.wikipedia.org/wiki/Simple_linear_regression)表示:
>
> ```
> Y = a + bX
> ```
>
> `X` 是「自變數」,`Y` 是「應變數」。直線的斜率為 `b``a` 是截距,指當 `X = 0` 時 `Y` 值。
> `X` 為「解釋變數」,`Y` 為「依賴變數」。直線斜率為 `b``a` 是截距,指當 `X=0` 時 `Y` 值。
>
>![計算斜率](../../../../translated_images/zh-TW/slope.f3c9d5910ddbfcf9.webp)
>
> 首先計算斜率 `b`。資訊圖 [Jen Looper](https://twitter.com/jenlooper) 製作
> 首先計算斜率 `b`。資訊圖表作者 [Jen Looper](https://twitter.com/jenlooper)
>
> 換句話說,回到我們南瓜資料的初始問題:「按月份預測南瓜每蒲式耳價格」,`X` 代表價格,`Y` 代表銷售月份。
> 換句話說,針對我們南瓜資料的問題:「依月份預測每蒲式耳南瓜價格」,`X` 代表價格,`Y` 代表銷售月份。
>
>![完成方程式](../../../../translated_images/zh-TW/calculation.a209813050a1ddb1.webp)
>
> 計算 Y 值。如果你付了約 4 美元,那一定是四月!資訊圖由 [Jen Looper](https://twitter.com/jenlooper) 製作
> 計算 Y 的值。如果價格約為 4 美元,那應該是四月!資訊圖表作者 [Jen Looper](https://twitter.com/jenlooper)
>
> 計算直線的公式必須呈現斜率,同時也取決於截距,即當 `X=0``Y` 落在哪裡
> 計算該直線的數學公式必須反映斜率,且斜率依賴截距,即當 `X=0``Y` 的位置
>
> 你可以參考 [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) 網站中這些值的計算方法。也可利用 [this Least-squares calculator](https://www.mathsisfun.com/data/least-squares-calculator.html) 觀察數值如何影響直線。
> 你可 [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) 網站查看這些值的計算方法,亦可使用[此最小平方法計算器](https://www.mathsisfun.com/data/least-squares-calculator.html)觀看數字值如何影響直線。
## 相關性
另一個要理解的概念是給定 X 和 Y 變數之間的<strong>相關係數</strong>利用散點圖可快速視覺化此係數。若數據點呈現整齊的線狀排列,代表高度相關;若散佈在 X 與 Y 間各處,則相關性低。
另一句需要了解的術語是給定 X 和 Y 變數間的<strong>相關係數</strong>使用散點圖,你可直觀了解此係數。資料點排列整齊成一條線的散點圖代表高度相關,而資料點四散無序的散點圖則相關性較低。
良好的線性迴歸模型會在最小平方迴歸線中擁有高(較接近 1相關係數。
良好的線性迴歸模型將具有用最小平方法計算出的較高(接近 1 而非 0相關係數。
✅ 執行本課附帶的筆記本,觀察「月份對價格」的散點圖。根據你對散點圖的視覺理解,南瓜銷售中月份和價格的相關性是高還是低?若改用較細緻的衡量標準,像是<em>一年中的第幾天</em>(即從年初算起的天數)情況會有改變嗎
✅ 執行本課附帶的 notebook觀察「月份對價格」的散點圖。依你對散點圖的視覺判斷月份與南瓜價格關聯性是高還是低如果改用更精細的時間測量例如一年中某天表示自年初以來的天數相關性是否改變
以下程式碼假設資料已清理,並取得名為 `new_pumpkins` 的資料框,如下所示
以下程式中,我們假設已清理資料,並取得名為 `new_pumpkins` 的資料框,格式類似如下:
ID | Month | DayOfYear | Variety | City | Package | Low Price | High Price | Price
---|-------|-----------|---------|------|---------|-----------|------------|-------
@ -100,36 +101,36 @@ ID | Month | DayOfYear | Variety | City | Package | Low Price | High Price | Pri
73 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 17.0 | 17.0 | 15.454545
74 | 10 | 281 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364
> 清理資料的程式碼可在 [`notebook.ipynb`](notebook.ipynb) 找到。我們執行了與前一課相同的清理步驟,並使用下列表達式計算 `DayOfYear` 欄位:
> 清理資料的程式碼請見 [`notebook.ipynb`](notebook.ipynb)。我們已執行和上一課相同的清理步驟,並用以下表達式計算了 `DayOfYear` 欄位:
```python
day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)
```
了解線性迴歸的數學後,接著建立一個迴歸模型,看看是否能預測哪種南瓜包裝會有最佳價格。想在南瓜節使用南瓜的人,可能想利用這些資訊優化購買方案
現在你了解線性迴歸背後的數學,我們來建立一個迴歸模型,看看是否能預測哪種包裝的南瓜價格最佳。買南瓜裝飾節慶專用的人可能會希望藉此資訊優化他們的購買配置
## 探索相關性
## 尋找相關性
[![ML for beginners - Looking for Correlation: The Key to Linear Regression](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "ML for beginners - Looking for Correlation: The Key to Linear Regression")
[![初學者機器學習 - 尋找相關性:線性迴歸的關鍵](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "初學者機器學習 - 尋找相關性:線性迴歸的關鍵")
> 🎥 點擊上方圖片看相關性的短影片介紹
> 🎥 點擊上方圖片觀看相關性簡介短片
你可能已在前一課看到,不同月份的平均價格大致如下:
從上一課你可能看過不同月份的平均價格如下:
<img alt="Average price by month" src="../../../../translated_images/zh-TW/barchart.a833ea9194346d76.webp" width="50%"/>
<img alt="依月份顯示的平均價格" src="../../../../translated_images/zh-TW/barchart.a833ea9194346d76.webp" width="50%"/>
這暗示應該存在某種相關關係,我們可以嘗試用線性迴歸模型來預測 `Month``Price`,或 `DayOfYear``Price` 間的關係。下方散點圖展示後者
這暗示應該存在某種相關性,我們可以嘗試用線性迴歸模型預測`Month`與`Price`、或`DayOfYear`與`Price`的關係。以下是後者的散點圖
<img alt="Scatter plot of Price vs. Day of Year" src="../../../../translated_images/zh-TW/scatter-dayofyear.bc171c189c9fd553.webp" width="50%" />
<img alt="價格對應一年中的天數散點圖" src="../../../../translated_images/zh-TW/scatter-dayofyear.bc171c189c9fd553.webp" width="50%" />
來看看我們用 `corr` 函數測試相關性結果
我們來用 `corr` 函數檢視相關性
```python
print(new_pumpkins['Month'].corr(new_pumpkins['Price']))
print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price']))
```
「月份」的相關係數大約是 -0.15,「年份中的某天」約是 -0.17,相關性看起來不大,不過可能還存在其他重要關係。似乎價格分成幾個群集,對應著不同南瓜品種。為驗證此假設,我們用不同顏色繪製南瓜分類。傳入 `ax` 參數給 `scatter` 函數,把所有點繪在同一張圖
似乎相關係數很小,`Month` 為 -0.15`DayOfYear` 為 -0.17,但可能存在另一重要關係。看起來不同南瓜品種的價格形成了不同群集。為驗證此假設,我們將用不同顏色繪製每個南瓜類別。並透過傳入 `ax` 參數給 `scatter` 函數,將所有點繪在同一圖表
```python
ax=None
@ -139,42 +140,42 @@ for i,var in enumerate(new_pumpkins['Variety'].unique()):
ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var)
```
<img alt="Scatter plot of Price vs. Day of Year" src="../../../../translated_images/zh-TW/scatter-dayofyear-color.65790faefbb9d54f.webp" width="50%" />
<img alt="價格對應一年中的天數並以顏色分品種散點圖" src="../../../../translated_images/zh-TW/scatter-dayofyear-color.65790faefbb9d54f.webp" width="50%" />
調查顯示品種對價格整體影響遠大於銷售日期。條形圖更明顯說明
調查顯示品種比銷售日期對價格影響更大。這點可見於長條圖
```python
new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar')
```
<img alt="Bar graph of price vs variety" src="../../../../translated_images/zh-TW/price-by-variety.744a2f9925d9bcb4.webp" width="50%" />
<img alt="以南瓜品種為分類的價格長條圖" src="../../../../translated_images/zh-TW/price-by-variety.744a2f9925d9bcb4.webp" width="50%" />
且只看「派用型」南瓜,觀察日期對價格的影響:
時我們只聚焦於「派型」南瓜,觀察日期對價格的影響:
```python
pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
pie_pumpkins.plot.scatter('DayOfYear','Price')
```
<img alt="Scatter plot of Price vs. Day of Year" src="../../../../translated_images/zh-TW/pie-pumpkins-scatter.d14f9804a53f927e.webp" width="50%" />
<img alt="價格對應一年中的天數(派型南瓜)的散點圖" src="../../../../translated_images/zh-TW/pie-pumpkins-scatter.d14f9804a53f927e.webp" width="50%" />
此時如果用 `corr` 計算 `Price``DayOfYear` 的相關係數,會是約 `-0.27`,代表訓練預測模型是可行的。
若計算 `Price``DayOfYear` 的相關係數,結果約為 `-0.27`——這表示訓練預測模型是合理的。
> 在訓練線性迴歸模型前,確保數據乾淨很重要。線性迴歸對缺失值敏感,通常會把空值剔除
> 在訓練線性迴歸模型之前,請務必確保資料乾淨。線性迴歸對缺失值較不穩定,因此刪除所有空值較為適宜
```python
pie_pumpkins.dropna(inplace=True)
pie_pumpkins.info()
```
另一種做法是用對應欄的平均值填補缺失值。
另一種方法是用對應欄位的平均值取代空值。
## 簡單線性迴歸
[![ML for beginners - Linear and Polynomial Regression using Scikit-learn](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "ML for beginners - Linear and Polynomial Regression using Scikit-learn")
[![初學者機器學習 - 使用 Scikit-learn 的線性與多項式迴歸](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "初學者機器學習 - 使用 Scikit-learn 的線性與多項式迴歸")
> 🎥 點擊上方圖片看簡單線性及多項式迴歸的短影片介紹
> 🎥 點擊上方圖片觀看線性與多項式迴歸簡介短片
我們將用 **Scikit-learn** 函式庫訓練線性迴歸模型。
我們使用 **Scikit-learn** 函式庫來訓練線性迴歸模型。
```python
from sklearn.linear_model import LinearRegression
@ -182,31 +183,31 @@ from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
```
起初,我們將輸入值(特徵)與期望輸出(標籤)分別放入兩個 numpy 陣列:
我們先把輸入值(特徵)與期望輸出(標籤)分開,放入獨立的 numpy 陣列:
```python
X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1)
y = pie_pumpkins['Price']
```
> 注意我們對輸入資料做了 `reshape`,讓線性迴歸套件正確識別。它預期輸入為 2 維陣列,每列為一組特徵向量。此處只有一個輸入,故需求是 N×1 形狀,其中 N 是資料集大小。
> 注意需對輸入資料做 `reshape`,讓線性迴歸套件正確理解。線性迴歸期望輸入為二維陣列,陣列每列為一組輸入特徵向量。我們此例僅有單一輸入,故需為 N×1 的矩陣,其中 N 是資料集大小。
下來,我們要將資料分割成訓練集和測試集,以利驗證模型表現
著,我們要將資料分割成訓練集與測試集,以便訓練後驗證模型
```python
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
```
最後,訓練線性迴歸モデル僅需兩行程式碼。我們先建立 `LinearRegression` 物件,再用 `fit` 方法對資料進行擬合:
最後,訓練線性迴歸模型僅要兩行程式。定義 `LinearRegression` 物件,並用 `fit` 方法對資料做擬合:
```python
lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train)
```
`LinearRegression` 物件在 `fit` 後包含了回歸的所有係數,可以使用 `.coef_` 屬性存取。在我們這個例子中,只有一個係數,約為 `-0.017`。這意味著價格似乎隨時間略微下降,但幅度不大,大約是每天下降兩分錢。我們也可以使用 `lin_reg.intercept_` 存取回歸線與 Y 軸的交點——在我們的例子中會約為 `21`,代表年初的價格。
`LinearRegression` 物件在完成 `fit` 後,會包含迴歸的所有係數,可以透過 `.coef_` 屬性取得。在我們的例子中,只有一個係數,該係數應該約為 `-0.017`。這表示價格似乎隨時間略微下降,但幅度不大,約為每天 2 分錢。我們也可以透過 `lin_reg.intercept_` 取得迴歸線與 Y 軸的截距點——在我們的例子中,約為 `21`,代表一年的開始時的價格。
為了檢視模型的準確性我們可以在測試資料集上預測價格然後衡量預測值與實際值的接近程度。這可以透過均方根誤差RMSE指標完成其為所有實際值與預測值平方差的平均數的平方根。
為了檢視我們模型的準確度,我們可以在測試資料集上預測價格,然後衡量預測值與期望值的接近程度。這可以使用均方根誤差 (RMSE) 指標來完成,它是期望值與預測值所有平方差的平均值的平方根。
```python
pred = lin_reg.predict(X_test)
@ -215,15 +216,16 @@ rmse = np.sqrt(mean_squared_error(y_test,pred))
print(f'RMSE: {rmse:3.3} ({rmse/np.mean(pred)*100:3.3}%)')
```
我們的誤差約為 2 點,約佔 ~17%。不是非常理想。模型品質的另一指標是 <strong>判定係數</strong>,可以用以下方法取得:
我們的誤差約為 2 點,約佔 17%。表現不是很好。另一個模型品質指標是<strong>決定係數</strong>,可以這樣取得:
```python
score = lin_reg.score(X_train,y_train)
print('Model determination: ', score)
```
若值為 0表示模型未考慮輸入資料表現為 <em>最差的線性預測器</em>,即結果的平均值。值為 1 表示可以完美預測所有目標輸出。在我們的例子中,判定係數約為 0.06,屬於相當低。
我們也可以繪製測試資料與回歸線,以更清楚觀看回歸效果:
如果該值為 0表示模型不考慮輸入資料並以<em>最差線性預測器</em>運作,簡單來說就是結果的平均值。值為 1 表示我們能完全準確預測所有期望輸出。在我們的例子中,決定係數約為 0.06,十分低。
我們也可以將測試資料與迴歸線一起繪圖,來更好地觀察迴歸結果:
```python
plt.scatter(X_test,y_test)
@ -232,19 +234,19 @@ plt.plot(X_test,pred)
<img alt="Linear regression" src="../../../../translated_images/zh-TW/linear-results.f7c3552c85b0ed1c.webp" width="50%" />
## 多項式回歸Polynomial Regression
## 多項式迴歸
另一類線性回歸是多項式回歸。雖然變數間有時呈線性關係——例如南瓜體積越大,價格越高——有時這些關係無法用平面或直線來描繪
另一種線性迴歸稱為多項式迴歸。有時候變數間是線性關係——例如南瓜的體積越大,價格越高,但有時這種關係無法用平面或直線來描述
✅ 這裡有[更多的例子](https://online.stat.psu.edu/stat501/lesson/9/9.8)適用於多項式回歸的資料
✅ 這裡有[更多範例](https://online.stat.psu.edu/stat501/lesson/9/9.8)適合使用多項式迴歸的資料
再看一次日期與價格的關係。這個散佈圖看起來一定得用直線分析嗎?價格不會波動嗎?此時可以嘗試多項式回歸。
再看一次日期與價格的關係。這個散佈圖看起來一定要用直線來分析嗎?價格不會波動的嗎?在這種情況下,你可以嘗試多項式迴歸。
✅ 多項式是可能包含一個或多個變數及係數的數學表達式
✅ 多項式是可能含有一個或多個變數與係數的數學表達式
多項式回歸會產生曲線以更好擬合非線性資料。我們若在輸入資料中加入平方的 `DayOfYear` 變數,應該能用拋物線曲線擬合資料,且該曲線在某年內的某點有極小值
多項式迴歸會創建曲線,以更好地擬合非線性資料。在我們的例子中,如果將 `DayOfYear` 的平方加入輸入資料,我們應該可以用拋物線擬合數據,該曲線會在年度某個點達到最低點
Scikit-learn 提供了方便的 [pipeline API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline) 將不同的資料處理步驟串聯起來。**pipeline** 是一連串的 **estimators**。在我們例子中,建立一個首先加入多項式特徵,接著訓練回歸模型的 pipeline
Scikit-learn 提供了一個方便的[pipeline API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline)用來串接不同的資料處理步驟。**pipeline** 是一連串的<strong>估計器</strong>。在本例中,我們將建立一個 pipeline先加入多項式特徵再訓練迴歸
```python
from sklearn.preprocessing import PolynomialFeatures
@ -255,36 +257,58 @@ pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)
```
使用 `PolynomialFeatures(2)` 意味著會包含所有二階多項式。我們的例子為 `DayOfYear`<sup>2</sup>,如果有兩個輸入變數 X 與 Y會加入 X<sup>2</sup>、XY 與 Y<sup>2</sup>。當然也可以用更高階多項式。
使用 `PolynomialFeatures(2)` 表示我們將包含所有二次多項式特徵。對於本例,就是 `DayOfYear`<sup>2</sup>,但若有兩個輸入變數 X 和 Y則包含 X<sup>2</sup>、XY 及 Y<sup>2</sup>。若需要,也可使用更高階多項式。
pipeline 使用方式跟原本的 `LinearRegression` 物件相同,也就是可以 `fit` pipeline然後用 `predict` 取得預測結果:
```python
pred = pipeline.predict(X_test)
rmse = np.sqrt(mean_squared_error(y_test,pred))
print(f'RMSE: {rmse:3.3} ({rmse/np.mean(pred)*100:3.3}%)')
score = pipeline.score(X_train,y_train)
print('Model determination: ', score)
```
為了繪製平滑的近似曲線,我們使用 `np.linspace` 創建均勻的輸入值範圍,而不是直接在無序的測試資料上繪圖(後者會產生鋸齒狀線條):
```python
X_range = np.linspace(X_test.min(), X_test.max(), 100).reshape(-1,1)
y_range = pipeline.predict(X_range)
plt.scatter(X_test, y_test)
plt.plot(X_range, y_range)
```
Pipeline 使用方式與原本的 `LinearRegression` 物件相同,可以 `fit` 來訓練,然後用 `predict` 預測。下圖展示測試資料與擬合曲線:
下圖顯示測試資料和近似曲線:
<img alt="Polynomial regression" src="../../../../translated_images/zh-TW/poly-results.ee587348f0f1f60b.webp" width="50%" />
使用多項式回歸,我們能獲得稍微更低的 MSE 與更高的判定係數,但差異不大。還是要加入其他特徵考量!
使用多項式迴歸,我們可獲得稍低的 RMSE 與較高的決定係數,但改進不大。我們還需要考慮其他特徵
> 你可以看到南瓜價格的最低點出現在萬聖節左右。你如何解釋這個現象?
> 你可以看到南瓜價格最低點大約出現在萬聖節附近。你怎麼解釋這個現象?
🎃 恭喜,你已建立了可協助預測派用南瓜價格的模型。你可以用同樣流程為所有南瓜種類建立模型,但會很繁瑣。接著讓我們學習如何將南瓜品種納入模型中!
🎃 恭喜,你已經建立了一個能預測派形南瓜價格的模型。你或許可以用相同程序來處理所有南瓜品種,不過那很繁瑣。接著讓我們學習如何在模型中考量南瓜品種
## 類別變數Categorical Features
## 類別特徵
理想狀況下,我們希望能用同一個模型預測不同南瓜品種的價格。但 `Variety` 欄位與 `Month` 等欄位不同,因為它包含非數值資料。這種欄位稱為 **類別變數categorical**。
理想情況下,我們希望用相同模型預測不同南瓜品種的價格。然而 `Variety` 欄位有別於像 `Month` 這類的欄位,因為它包含非數字值。這類欄位稱為<strong>類別特徵</strong>
[![ML for beginners - Categorical Feature Predictions with Linear Regression](https://img.youtube.com/vi/DYGliioIAE0/0.jpg)](https://youtu.be/DYGliioIAE0 "ML for beginners - Categorical Feature Predictions with Linear Regression")
> 🎥 點擊上方圖片,可觀看使用類別特徵的簡短說明影片。
> 🎥 點擊上方圖片可觀看關於如何使用類別特徵的短影片。
這裡展示了平均價格與品種的關係:
這裡可以看到平均價格如何依品種而異
<img alt="Average price by variety" src="../../../../translated_images/zh-TW/price-by-variety.744a2f9925d9bcb4.webp" width="50%" />
要考慮品種,我們必須先將它轉成數字形式,或叫做<strong>編碼</strong>。有幾種方法:
要考慮品種,我們首先需要將其轉為數值形式,也就是<strong>編碼</strong>。有幾種方法:
* 簡單的<strong>數字編碼</strong>會建立不同品種的編號表,然後用編號替換品種名稱。對線性回歸來說這不佳,因為數字編碼會被視為數值並乘以係數,造成明顯的非線性關係,尤其即便我們嘗試排序編號仍然不合適
* <strong>One-hot 編碼</strong>會把 `Variety` 欄拆成四個欄位,分別代表四種品種。每欄包含 1 或 0表示該行是否屬於此品種。線性回歸有四個係數各自代表各品種的“基本價格”或“額外價格”
* 簡單的<strong>數字編碼</strong>會建立一張品種表,並將品種名稱替換為表中的索引。在線性迴歸中這不是最佳方案,因為線性迴歸使用索引的數值,乘以某個係數後再加入結果。以我們的例子來說,品種索引與價格的關係明顯非線性,即便我們確保索引依某個有意義的順序排列亦然
* **獨熱編碼 (One-hot encoding)** 會將 `Variety` 欄替換成 4 個欄位,分別對應每個品種。每個欄位若該行屬於對應品種,值為 `1`,否則為 `0`。這表示線性迴歸中會有四個係數,分別代表各品種的「基本價格」(或可理解為「額外價格」)
以下程式碼示範如何對品種做 one-hot 編碼:
以下程式碼示範如何將品種獨熱編碼:
```python
pd.get_dummies(new_pumpkins['Variety'])
@ -301,14 +325,14 @@ pd.get_dummies(new_pumpkins['Variety'])
1741 | 0 | 1 | 0 | 0
1742 | 0 | 1 | 0 | 0
若要用 one-hot 編碼的品種訓練線性回歸,只要正確建立 `X``y` 即可:
要用獨熱編碼品種作為輸入訓練線性迴歸,只要正確初始化 `X``y` 資料即可:
```python
X = pd.get_dummies(new_pumpkins['Variety'])
y = new_pumpkins['Price']
```
其餘程式碼與之前線性回歸訓練過程相同。嘗試執行後會看到均方誤差大致相同,但判定係數明顯提升到約 77%。若要更準確的預測,可以將更多類別特徵和數值特徵(如 `Month``DayOfYear`)納入。用 `join` 合併成一個大特徵陣列
其餘程式碼同前面訓練線性迴歸時使用的。如果你嘗試執行,會發現均方誤差差不多,但決定係數大幅提升至約 77%。要讓預測更準確,我們能考慮更多類別特徵和數值特徵,例如 `Month``DayOfYear`。若要得到一個包含所有特徵的大陣列,可以用 `join`
```python
X = pd.get_dummies(new_pumpkins['Variety']) \
@ -318,60 +342,60 @@ X = pd.get_dummies(new_pumpkins['Variety']) \
y = new_pumpkins['Price']
```
這裡也將 `City``Package` 類型納入,得到的 MSE 降至 2.8410%),判定係數提升至 0.94
這裡我們還加入了 `City` 和包裝方式 `Package`,結果 RMSE 降至 2.8410.5%),決定係數達到 0.94
## 綜合建模
## 組合應用
為了取得最佳模型我們可以將前面例子中合併one-hot 編碼類別 + 數值)資料與多項式回歸結合。以下是完整範例程式碼供您方便使用
為了打造最佳模型,我們可以將上述例子的組合數據(獨熱編碼類別加上數值特徵)與多項式迴歸結合。以下是完整程式碼
```python
# 設置訓練資料
# 設置訓練數據
X = pd.get_dummies(new_pumpkins['Variety']) \
.join(new_pumpkins['Month']) \
.join(pd.get_dummies(new_pumpkins['City'])) \
.join(pd.get_dummies(new_pumpkins['Package']))
y = new_pumpkins['Price']
# 進行訓練-測試資料切
# 進行訓練測試分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# 設並訓練流程
# 設並訓練流程
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)
# 預測測試資料的結果
# 預測測試數據結果
pred = pipeline.predict(X_test)
# 計算均方誤差和決定係數
mse = np.sqrt(mean_squared_error(y_test,pred))
print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')
# 計算均方誤差和決定係數
rmse = mean_squared_error(y_test, pred, squared=False)
print(f'RMSE: {rmse:3.3} ({rmse/pred.mean()*100:3.3}%)')
score = pipeline.score(X_train,y_train)
print('Model determination: ', score)
```
這會讓我們得到接近 97% 的判定係數,以及 MSE = 2.23(約 8% 預測誤差)。
這會給出幾乎 97% 的最佳決定係數,以及 2.23 的 RMSE(約 8% 預測誤差)。
| 模型 | MSE | 判定係數 |
|-------|-----|----------------|
| 模型 | RMSE | 決定係數 |
|-------|-----|---------------|
| `DayOfYear` 線性 | 2.77 (17.2%) | 0.07 |
| `DayOfYear` 多項式 | 2.73 (17.0%) | 0.08 |
| `Variety` 線性 | 5.24 (19.7%) | 0.77 |
| 所有特徵 線性 | 2.84 (10.5%) | 0.94 |
| 所有特徵 多項式 | 2.23 (8.25%) | 0.97 |
| 特徵 線性 | 2.84 (10.5%) | 0.94 |
| 特徵 多項式 | 2.23 (8.25%) | 0.97 |
🏆 做得好!你在這一課建立了四個迴歸模型,並將模型品質提升到 97%。在迴歸的最後一節我們會學習羅吉斯迴歸Logistic Regression來判斷類別。
🏆 表現非常好!你在一堂課中建立了四個迴歸模型,並將模型質量提升到 97%。在迴歸的最後一個章節,你將學習邏輯迴歸,用來判斷類別。
---
## 🚀挑戰
此筆記本中測試不同變數,看看其相關度與模型準確率的關係。
這個筆記本中測試多個不同變數,觀察相關性與模型準確度間的關係。
## [課後測驗](https://ff-quizzes.netlify.app/en/ml/)
## [課後小考](https://ff-quizzes.netlify.app/en/ml/)
## 複習與自學
本課程學習了線性回歸。還有其他重要的迴歸類型像是逐步回歸、Ridge、Lasso 與 Elasticnet 技術。推薦研讀的優良課程為 [史丹佛統計學習課程](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning)
這堂課我們學習了線性迴歸。還有其他重要的迴歸類型。請閱讀 Stepwise、Ridge、Lasso 與 Elasticnet 技術。推薦的進階課程是[史丹佛大學統計學習課程](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning)
## 作業
@ -381,5 +405,5 @@ print('Model determination: ', score)
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**免責聲明**
本文件係使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於確保翻譯準確,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件之母語版本應視為權威來源。對於重要資訊,建議採用專業人工翻譯。因使用本翻譯所產生之任何誤解或誤用,我們概不負責。
本文件係使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們力求準確,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件的本地語言版本應視為權威來源。對於重要資訊,建議尋求專業人工翻譯。我們不對因使用本翻譯所產生的任何誤解或曲解負責。
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -4,14 +4,14 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## 南瓜定價的線性回歸與多項式回歸 - 第三課\n",
"## 南瓜定價的線性與多項式迴歸 - 第三課\n",
"\n",
"載入所需的庫和數據集。將數據轉換為包含部分數據的數據框:\n",
"載入所需的函式庫和資料集。將資料轉換為只包含子集的資料框:\n",
"\n",
"- 僅選取按蒲式耳定價的南瓜\n",
"- 只取以蒲式耳計價的南瓜\n",
"- 將日期轉換為月份\n",
"- 計算價格為高價與低價的平均值\n",
"- 將價格轉換為反映按蒲式耳數量定價\n"
"- 計算價格為最高價和最低價的平均值\n",
"- 將價格轉換為反映每蒲式耳數量的價格\n"
]
},
{
@ -377,7 +377,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"散佈圖提醒我們,我們只有從八月到十二月的月份數據。我們可能需要更多數據才能以線性方式得出結論。\n"
"散佈圖提醒我們,我們只有從八月到十二月的月份資料。我們可能需要更多資料,才能以線性方式得出結論。\n"
]
},
{
@ -447,7 +447,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"讓我們來看看是否存在相關性:\n"
]
},
{
"cell_type": "code",
@ -472,7 +474,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"看起來相關性相當小,但存在一些其他更重要的關係——因為上圖中的價格點似乎有幾個明顯的群集。讓我們製作一個圖表來顯示不同的南瓜品種:\n"
"看起來相關性相當小,但有一些其他更重要的關係——因為上圖中的價格點似乎有幾個明顯的群聚。讓我們來畫一張圖,展示不同的南瓜品種:\n"
]
},
{
@ -535,7 +537,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"暫時先集中注意力於一種品種——<strong>派類型</strong>。\n"
]
},
{
"cell_type": "code",
@ -662,7 +666,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"可以從線性回歸係數中確定直線的斜率\n"
"線的斜率可以從線性迴歸係數中決定\n"
]
},
{
@ -720,9 +724,9 @@
"source": [
"### 多項式回歸\n",
"\n",
"有時候特徵與結果之間的關係本質上是非線性的。例如,南瓜的價格可能在冬季(月份=1,2較高,然後在夏季(月份=5-7下降接著再次上漲。線性回歸無法準確捕捉這種關係。\n",
"有時候特徵與結果之間的關係本質上是非線性的。例如,南瓜的價格可能在冬季(月份=1,2很高,然後在夏季(月份=5-7下降接著又回升。線性回歸無法準確擬合這種關係。\n",
"\n",
"在這種情況下,我們可以考慮添加額外的特徵。一個簡單的方法是使用來自輸入特徵的多項式,這樣就會形成**多項式回歸**。在 Scikit Learn 中,我們可以使用管道自動預先計算多項式特徵:\n"
"在這種情況下,我們可以考慮添加額外的特徵。一個簡單的方法是使用輸入特徵的多項式,這將產生<strong>多項式回歸</strong>。在 Scikit Learn 中,我們可以使用管線自動預先計算多項式特徵:\n"
]
},
{
@ -777,22 +781,25 @@
"score = pipeline.score(X_train,y_train)\n",
"print('Model determination: ', score)\n",
"\n",
"plt.scatter(X_test,y_test)\n",
"plt.plot(sorted(X_test),pipeline.predict(sorted(X_test)))"
"X_range = np.linspace(X_test.min(), X_test.max(), 100).reshape(-1,1)\n",
"y_range = pipeline.predict(X_range)\n",
"\n",
"plt.scatter(X_test, y_test)\n",
"plt.plot(X_range, y_range)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 編碼種\n",
"### 編碼種\n",
"\n",
"在理想情況下,我們希望能夠使用相同的模型來預測不同南瓜品種的價格。為了考慮品種的影響,我們首先需要將其轉換為數字形式,或者說進行**編碼**。我們可以採用以下幾種方法\n",
"在理想情況下,我們希望能夠使用相同的模型來預測不同南瓜品種的價格。為了將品種納入考量,我們首先需要將其轉換為數值形式,或稱為<strong>編碼</strong>。有幾種方法可以做到這點\n",
"\n",
"* 簡單的數字編碼,這種方法會建立一個不同品種的對應表,然後用該表中的索引來替換品種名稱。這對於線性回歸來說並不是最好的方法,因為線性回歸會考慮索引的數值,而這些數值很可能與價格之間沒有數值上的相關性。\n",
"* One-hot 編碼,這種方法會用 4 個不同的列來替換 `Variety` 列,每個品種對應一列。如果某一行屬於某個品種,則該列的值為 1否則為 0。\n",
"* 簡單的數值編碼會建立一個不同品種的表格,然後用該表格中的索引來取代品種名稱。這對線性回歸來說不是最佳做法,因為線性回歸會將索引的數值納入考量,而數值很可能與價格的數值沒有關聯。\n",
"* 一次性編碼One-hot encoding會用4個不同的欄位來取代 `Variety` 欄位每個欄位對應一個品種對於該筆資料是否屬於該品種則用1或0表示。\n",
"\n",
"以下的程式碼展示了我們如何對品種進行 One-hot 編碼:\n"
"以下程式碼示範了我們如何對品種進行一次性編碼:\n"
]
},
{
@ -940,9 +947,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"### 品種的線性回歸\n",
"### 以品種進行線性回歸\n",
"\n",
"我們現在將使用與上述相同的程式碼,但這次將使用我們的單熱編碼品種作為輸入,而不是 `DayOfYear`\n"
"我們現在將使用與上述相同的程式碼,但輸入不是 `DayOfYear`,而是我們用一熱編碼(one-hot-encoded)的品種\n"
]
},
{
@ -990,7 +997,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"我們也可以以相同方式嘗試使用其他特徵,並將它們與數值特徵結合,例如 `Month` 或 `DayOfYear`\n"
"我們也可以嘗試以相同方式使用其他特徵,並將它們與數值特徵結合,例如 `Month` 或 `DayOfYear`\n"
]
},
{
@ -1021,9 +1028,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"### 多項式歸\n",
"### 多項式歸\n",
"\n",
"多項式回歸也可以用於經過獨熱編碼的分類特徵。訓練多項式回歸的程式碼基本上與我們之前看到的相同。\n"
"多項式迴歸也可以用於經過獨熱編碼的類別特徵。訓練多項式迴歸的程式碼基本上與我們上面看到的相同。\n"
]
},
{
@ -1070,7 +1077,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免責聲明** \n本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們致力於提供準確的翻譯,請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。\n"
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**免責聲明** \n本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於確保準確性,但請注意自動翻譯可能包含錯誤或不精確之處。原始母語文件應視為權威來源。對於重要資訊,建議採用專業人工翻譯。我們不對因使用本翻譯而產生的任何誤解或曲解承擔責任。\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
],
@ -1100,13 +1107,7 @@
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"orig_nbformat": 2,
"coopTranslator": {
"original_hash": "d77bd89ae7e79780c68c58bab91f13f8",
"translation_date": "2025-09-03T19:19:14+00:00",
"source_file": "2-Regression/3-Linear/solution/notebook.ipynb",
"language_code": "tw"
}
"orig_nbformat": 2
},
"nbformat": 4,
"nbformat_minor": 2

Loading…
Cancel
Save