You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/zh-HK/2-Regression/2-Data/README.md

294 lines
15 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 使用 Scikit-learn 建立迴歸模型:準備與視覺化數據
![數據視覺化資訊圖表](../../../../translated_images/zh-HK/data-visualization.54e56dded7c1a804.webp)
資訊圖由 [Dasani Madipalli](https://twitter.com/dasani_decoded) 製作
## [課前測驗](https://ff-quizzes.netlify.app/en/ml/)
> ### [此課程有 R 語言版本!](../../../../2-Regression/2-Data/solution/R/lesson_2.html)
## 介紹
現在你已經準備好所需工具,可以開始使用 Scikit-learn 進行機器學習模型的建立,準備好向你的數據提問。當你處理數據並應用機器學習解決方案時,非常重要的是要了解如何提出正確的問題,才能恰當地發掘數據集的潛力。
在本課程中,你將學習:
- 如何準備數據以建立模型。
- 如何使用 Matplotlib 進行數據視覺化。
- 如何使用 Seaborn 進行更具表現力的數據視覺化。
## 向數據提出正確的問題
你需要回答的問題將決定你會使用哪種類型的機器學習算法。你得到的答案品質,也會很大程度取決於你的數據本質。
看看這課程提供的 [數據](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv),你可以在 VS Code 中打開這個 .csv 檔案。快速瀏覽會立即發現有空白欄位和字串與數字的混合資料。還有一個奇怪的欄位叫「Package」裡面混合了「sacks」、「bins」和其他值。事實上資料狀況有點混亂。
[![機器學習入門 - 如何分析與清理資料集](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "機器學習入門 - 如何分析與清理資料集")
> 🎥 點擊上圖觀看本課程準備數據的短片教學。
事實上,很少會拿到一個完全準備好可直接用來建立機器學習模型的數據集。在本課中,你將學習如何使用標準 Python 函式庫來準備原始數據集,同時學習多種數據視覺化技巧。
## 個案研究:「南瓜市場」
在此資料夾的根目錄 `data` 裡,有一個名為 [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) 的 .csv 檔案,包含 1757 行關於南瓜市場的數據,依城市分組。這是從美國農業部發布的 [特產作物終端市場標準報告](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) 中提取的原始資料。
### 數據準備
這些資料屬於公共領域。從 USDA 網站可分城市下載多個獨立檔案。為避免過多分檔,我們已將所有城市數據合併到一份試算表中,因此資料已經做了一點「準備」。接下來,我們深入查看數據本身。
### 南瓜數據:初步結論
你對這些數據有什麼觀察?你已經看到,裡面混合了字串、數字、空白和奇怪的值,需要你去理解。
使用迴歸技術,你可以問數據什麼問題?例如「預測給定月份內南瓜的售價」。再看數據,你需要對結構做一些調整來完成這個任務所需的數據架構。
## 練習 - 分析南瓜數據
我們用 [Pandas](https://pandas.pydata.org/)意指「Python 數據分析」)這個非常適合整理數據的工具,來分析並準備這份南瓜數據。
### 首先,檢查缺少日期
你需要先進行以下步驟檢查缺少的日期:
1. 將日期轉為月份格式(這裡為美式日期格式,`MM/DD/YYYY`)。
2. 將月份擷取到一個新欄位。
在 Visual Studio Code 中開啟 _notebook.ipynb_ 檔案,並將試算表匯入新的 Pandas 資料框架dataframe
1. 使用 `head()` 函式查看前五行數據。
```python
import pandas as pd
pumpkins = pd.read_csv('../data/US-pumpkins.csv')
pumpkins.head()
```
✅ 你會用什麼函式來查看最後五行?
1. 檢查目前 dataframe 中是否有遺失資料:
```python
pumpkins.isnull().sum()
```
有遺失資料,但可能對當前任務影響不大。
1. 為使 dataframe 更方便操作,使用 `loc` 函式選擇你需要的欄位。此函式從原 dataframe 中擷取列(第一個參數)與欄(第二個參數)。範例中 `:` 表示「所有列」。
```python
columns_to_select = ['Package', 'Low Price', 'High Price', 'Date']
pumpkins = pumpkins.loc[:, columns_to_select]
```
### 第二步,計算南瓜平均價格
思考如何求得某月南瓜的平均價格。你會選哪些欄位?提示:需要 3 個欄位。
解法:將 `Low Price``High Price` 欄位取平均,填入新的 Price 欄;同時將日期欄位轉換為月份。幸運的是,前面檢查結果顯示日期與價格欄無遺失資料。
1. 計算平均價格,添加以下程式碼:
```python
price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2
month = pd.DatetimeIndex(pumpkins['Date']).month
```
✅ 如果想確認數據,可以用 `print(month)` 列印出來檢查。
2. 現在,將轉換後資料複製到新的 Pandas dataframe
```python
new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price})
```
列印你的 dataframe可看到一份乾淨整齊的數據用於建立迴歸新模型。
### 等等!這裡有點奇怪
看看 `Package` 這欄南瓜販售方式多樣。有些依「1 1/9 公頃桶」計量有些是「1/2 公頃桶」,有些按南瓜顆數賣,有些按磅賣,還有用不同寬度的大箱子裝。
> 南瓜似乎很難以統一標準來秤重
深入看原始數據,`Unit of Sale` 欄為 'EACH' 或 'PER BIN' 的記錄裡,`Package` 欄的值往往是按英寸、箱或「個」數量記錄。南瓜很難秤重一致,因此我們先只挑選 `Package` 欄包含「bushel」字串的南瓜篩選出來。
1. 在檔案開頭、csv 匯入後添加過濾器:
```python
pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]
```
列印資料可看到僅剩約 415 行以公頃桶銷售的南瓜數據。
### 等等!還有一件事要做
注意公頃桶份數會因列不同而異。你需將價格標準化為每公頃桶價格,做些計算來標準化。
1. 在建立 new_pumpkins dataframe 之後添加這段程式碼:
```python
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9)
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2)
```
✅ 根據 [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308) 的說法,公頃桶的重量依作物種類不同而有差異,因為它是體積單位。例如,一公頃桶番茄重 56 磅……葉菜類空間大但重量輕,所以菠菜一公頃桶約 20 磅。相當複雜!我們不做公頃桶到磅的換算,改按公頃桶計價。但這說明理解數據性質有多重要!
現在可以分析以公頃桶為單位的價格。再列印一次資料,你會看到價格已標準化。
✅ 你注意到按半公頃桶賣的南瓜非常貴嗎?能猜出原因嗎?提示:小南瓜比大南瓜每公頃桶貴許多,可能是因為小南瓜數量多,大南瓜佔據了許多未利用的空間。
## 視覺化策略
資料科學家的部分工作,是展示所處理資料的品質與狀況。他們常利用有趣的視覺化圖像、圖表和曲線圖,呈現資料的不同面向。如此就可以直觀地顯示資料之間的關係與空白,這些往往是難以直接察覺的。
[![機器學習入門 - 如何用 Matplotlib 視覺化數據](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "機器學習入門 - 如何用 Matplotlib 視覺化數據")
> 🎥 點擊上圖觀看本課程數據視覺化的短片教學。
視覺化也有助於判斷哪種機器學習技術最適合該數據。例如,散佈圖若呈線狀分布,代表資料適合進行線性迴歸。
Jupyter notebook 中常用的數據視覺化函式庫之一是 [Matplotlib](https://matplotlib.org/)(你在上一課也看過)。
> 想獲得更多視覺化經驗,請參考[這些教學](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott)。
## 練習 - 嘗試 Matplotlib
嘗試創建一些基本圖表來顯示你新建立的 dataframe。基本的線形圖會顯示什麼
1. 在檔案開頭Pandas 匯入後,匯入 Matplotlib
```python
import matplotlib.pyplot as plt
```
1. 重新運行整個 notebook 以刷新數據。
1. 在 notebook 底部新增一個儲存格,繪製箱型圖:
```python
price = new_pumpkins.Price
month = new_pumpkins.Month
plt.scatter(price, month)
plt.show()
```
![顯示價格與月份關係的散佈圖](../../../../translated_images/zh-HK/scatterplot.b6868f44cbd2051c.webp)
這個圖有用嗎?有何驚喜?
它其實用處不大,因為僅呈現出資料在每月內的分散點。
### 讓它有用一些
要做出有用的圖表一般要對數據進行分組。試著製作一個圖y 軸為月份,顯示資料分佈情形。
1. 加一個儲存格,創建分組長條圖:
```python
new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar')
plt.ylabel("Pumpkin Price")
```
![顯示價格與月份關係的長條圖](../../../../translated_images/zh-HK/barchart.a833ea9194346d76.webp)
這是較有用的視覺化!它顯示南瓜價格九月、十月最高。你的預期符合嗎?為什麼?
## 練習 - 嘗試 Seaborn
Matplotlib 功能強大,但生成精美圖表可能需寫較多代碼。[Seaborn](https://seaborn.pydata.org/) 是建立在 Matplotlib 之上的函式庫,專為統計數據視覺化設計。它直接配合 Pandas dataframe提供美觀預設樣式且能用較少代碼創建資訊豐富的圖表。因為 Seaborn 傳回 Matplotlib 物件,你仍可用已有的 Matplotlib 經驗微調結果。
> 如果你還沒有安裝 Seaborn請用 `pip install seaborn` 安裝。
1. 在 notebook 頂部其他匯入後加入 Seaborn 匯入,習慣用別名 `sns`
```python
import seaborn as sns
```
### 散佈圖展示變數關係
建模前重要的資料探索之一,是尋找變數間的 _關聯性_。[散佈圖](https://en.wikipedia.org/wiki/Scatter_plot) 是最佳工具之一:如果點趨近於一條直線,兩變數可能相關,意味線性迴歸模型可能有效。
1. 使用 Seaborn 的 [`relplot()`](https://seaborn.pydata.org/generated/seaborn.relplot.html)(關係圖)重現先前的價格對月份散佈圖,該函式能直接使用 dataframe 欄位:
```python
sns.relplot(x="Price", y="Month", data=new_pumpkins)
```
![Seaborn 散佈圖顯示價格與月份關係](../../../../translated_images/zh-HK/relplot.a03837d8f0329cec.webp)
注意你只傳入 _欄位名稱_ 和 dataframeSeaborn 能自動處理軸標籤。
2. 可以傳入 `kind="line"` 參數切換成線圖。Seaborn 還會畫出反映線周置信區間的藍色陰影帶:
```python
sns.relplot(x="Price", y="Month", kind="line", data=new_pumpkins)
```
![Seaborn 線圖顯示價格與月份關係](../../../../translated_images/zh-HK/lineplot.f9034ba47b1e30ee.webp)
該數據較嘈雜,線圖不算最清楚,但示範了如何輕鬆切換 Seaborn 的圖表種類。
### 長條圖顯示分布
早前你親手將數據分組,以 Matplotlib 創建條形圖。Seaborn 的 [`catplot()`](https://seaborn.pydata.org/generated/seaborn.catplot.html)(類別圖)可以為你進行分組和聚合。預設情況下,`kind="bar"` 顯示每個類別的平均值,並帶有一條黑線標示信賴區間。
1. 創建每月平均價格的條形圖:
```python
sns.catplot(x="Month", y="Price", data=new_pumpkins, kind="bar")
```
![顯示每月價格分布的 Seaborn 條形圖](../../../../translated_images/zh-HK/catplot.e73fc35fdf96242b.webp)
這證實了你用 Matplotlib 看到的情況 — 價格在九月和十月達到高峰 — 但 Seaborn 亦可視化每個月份內價格的 _變異_ 程度。
### 顯示相關性的熱力圖
散點圖一次比較兩個變量。當你有多個數值欄時,[熱力圖](https://en.wikipedia.org/wiki/Heat_map) 能讓你一口氣觀察 _所有_ 欄位對的關係強度。這是選擇用於模型輸入的特徵前,一種常見的識別最相關欄位的方法(而同一類型的圖表稍後會用於顯示分類的混淆矩陣)。
1. 用 Pandas 建立相關矩陣,然後用 Seaborn 的 [`heatmap()`](https://seaborn.pydata.org/generated/seaborn.heatmap.html) 畫出來。`annot=True` 選項會在每個格子裡顯示相關係數:
```python
correlations = new_pumpkins[['Month', 'Low Price', 'High Price', 'Price']].corr()
sns.heatmap(correlations, annot=True, cmap="coolwarm")
```
![顯示數值欄位間相關性的 Seaborn 熱力圖](../../../../translated_images/zh-HK/heatmap.bd98dce43b404c57.webp)
接近 `1`(或 `-1`)的值意味著欄位間具有強烈的 _線性_ 相關性。注意 `Low Price``High Price` 幾乎完全相關。另一方面,`Month` 與價格的線性相關性很弱 — 儘管上面的條形圖展現了九月和十月明顯的季節高峰。這是一個重要的教訓:相關係數只衡量 _直線_ 關係,因此可能忽略季節性或其它非線性模式。✅ 為什麼在決定使用哪些欄位前,既看熱力圖 <em></em> 看像條形圖這樣的圖表很有用?
### Matplotlib 還是 Seaborn
兩個庫都值得了解:
- **Matplotlib** 讓你精細控制圖表的每個元素,是幾乎所有其他 Python 繪圖庫的基礎。
- **Seaborn** 提供更高階的函數和吸引人的預設統計圖表樣式,直接支持資料框,且在探索性資料分析時通常更快。
常見工作流程是先用 Seaborn 快速探索數據,再在需要自訂細節時退回 Matplotlib。
---
## 🚀挑戰
探索 Matplotlib 和 Seaborn 提供的不同視覺化類型。哪些類型最適合迴歸問題?
## [課後小測驗](https://ff-quizzes.netlify.app/en/ml/)
## 複習與自學
查看多種資料視覺化方式。列出可用的各種庫,並註明哪些最適合特定任務,如 2D 視覺化與 3D 視覺化。你發現了什麼?
## 作業
[探索視覺化](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**免責聲明**
本文件由 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻譯而成。雖然我們致力於確保準確性,但請注意,機器自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議進行專業人工翻譯。我們不對因使用本翻譯而產生的任何誤解或誤釋承擔責任。
<!-- CO-OP TRANSLATOR DISCLAIMER END -->