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/2-Regression/2-Data/translations/README.zh-tw.md

204 lines
9.8 KiB

# 使用 Scikit-learn 構建回歸模型:準備和可視化數據
![數據可視化信息圖](../images/data-visualization.png)
> 作者 [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [課前測](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/11/)
## 介紹
既然你已經設置了開始使用 Scikit-learn 處理機器學習模型構建所需的工具你就可以開始對數據提出問題了。當你處理數據並應用ML解決方案時了解如何提出正確的問題以正確釋放數據集的潛力非常重要。
在本課中,你將學習:
- 如何為模型構建準備數據。
- 如何使用 Matplotlib 進行數據可視化。
## 對你的數據提出正確的問題
你提出的問題將決定你將使用哪種類型的 ML 算法。你得到的答案的質量將在很大程度上取決於你的數據的性質。
查看為本課程提供的[數據](../data/US-pumpkins.csv)。你可以在 VS Code 中打開這個 .csv 文件。快速瀏覽一下就會發現有空格還有字符串和數字數據的混合。還有一個奇怪的列叫做「Package」其中的數據是「sacks」、「bins」和其他值的混合。事實上數據有點亂。
事實上,得到一個完全準備好用於創建 ML 模型的開箱即用數據集並不是很常見。在本課中,你將學習如何使用標準 Python 庫準備原始數據集。你還將學習各種技術來可視化數據。
## 案例研究:「南瓜市場」
你將在 `data` 文件夾中找到一個名為 [US-pumpkins.csv](../data/US-pumpkins.csv) 的 .csv 文件,其中包含有關南瓜市場的 1757 行數據,已按城市排序分組。這是從美國農業部分發的[特種作物終端市場標準報告](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice)中提取的原始數據。
### 準備數據
這些數據屬於公共領域。它可以從美國農業部網站下載,每個城市有許多不同的文件。為了避免太多單獨的文件,我們將所有城市數據合並到一個電子表格中,因此我們已經準備了一些數據。接下來,讓我們仔細看看數據。
### 南瓜數據 - 早期結論
你對這些數據有什麽看法?你已經看到了無法理解的字符串、數字、空格和奇怪值的混合體。
你可以使用回歸技術對這些數據提出什麽問題?「預測給定月份內待售南瓜的價格」怎麽樣?再次查看數據,你需要進行一些更改才能創建任務所需的數據結構。
## 練習 - 分析南瓜數據
讓我們使用 [Pandas](https://pandas.pydata.org/)「Python 數據分析」 Python Data Analysis 的意思)一個非常有用的工具,用於分析和準備南瓜數據。
### 首先,檢查遺漏的日期
你首先需要采取以下步驟來檢查缺少的日期:
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()
```
✅ 使用什麽函數來查看最後五行?
2. 檢查當前 dataframe 中是否缺少數據:
```python
pumpkins.isnull().sum()
```
有數據丟失,但可能對手頭的任務來說無關緊要。
3. 為了讓你的 dataframe 更容易使用,使用 `drop()` 刪除它的幾個列,只保留你需要的列:
```python
new_columns = ['Package', 'Month', 'Low Price', 'High Price', 'Date']
pumpkins = pumpkins.drop([c for c in pumpkins.columns if c not in new_columns], axis=1)
```
### 然後,確定南瓜的平均價格
考慮如何確定給定月份南瓜的平均價格。你會為此任務選擇哪些列?提示:你需要 3 列。
解決方案:取 `Low Price``High Price` 列的平均值來填充新的 Price 列,將 Date 列轉換成只顯示月份。幸運的是,根據上面的檢查,沒有丟失日期或價格的數據。
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` 列中帶有字符串「蒲式耳」的南瓜來過濾它們。
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磅。」 這一切都相當復雜!讓我們不要費心進行蒲式耳到磅的轉換,而是按蒲式耳定價。然而,所有這些對蒲式耳南瓜的研究表明,了解數據的性質是多麽重要!
現在,你可以根據蒲式耳測量來分析每單位的定價。如果你再打印一次數據,你可以看到它是如何標準化的。
✅ 你有沒有註意到半蒲式耳賣的南瓜很貴?你能弄清楚為什麽嗎?提示:小南瓜比大南瓜貴得多,這可能是因為考慮到一個大的空心餡餅南瓜占用的未使用空間,每蒲式耳的南瓜要多得多。
## 可視化策略
數據科學家的部分職責是展示他們使用的數據的質量和性質。為此,他們通常會創建有趣的可視化或繪圖、圖形和圖表,以顯示數據的不同方面。通過這種方式,他們能夠直觀地展示難以發現的關系和差距。
可視化還可以幫助確定最適合數據的機器學習技術。例如,似乎沿著一條線的散點圖表明該數據是線性回歸練習的良好候選者。
一個在 Jupyter notebooks 中運行良好的數據可視化庫是 [Matplotlib](https://matplotlib.org/)(你在上一課中也看到過)。
> 在[這些教程](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-15963-cxa)中獲得更多數據可視化經驗。
## 練習 - 使用 Matplotlib 進行實驗
嘗試創建一些基本圖形來顯示你剛剛創建的新 dataframe。基本線圖會顯示什麽
1. 在文件頂部導入 Matplotlib
```python
import matplotlib.pyplot as plt
```
2. 重新刷新以運行整個 notebook。
3. 在 notebook 底部,添加一個單元格以繪製數據:
```python
price = new_pumpkins.Price
month = new_pumpkins.Month
plt.scatter(price, month)
plt.show()
```
![顯示價格與月份關系的散點圖](../images/scatterplot.png)
這是一個有用的圖嗎?有什麽讓你吃驚的嗎?
它並不是特別有用,因為它所做的只是在你的數據中顯示為給定月份的點數分布。
### 讓它有用
為了讓圖表顯示有用的數據,你通常需要以某種方式對數據進行分組。讓我們嘗試創建一個圖,其中 y 軸顯示月份,數據顯示數據的分布。
1. 添加單元格以創建分組柱狀圖:
```python
new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar')
plt.ylabel("Pumpkin Price")
```
![顯示價格與月份關系的柱狀圖](../images/barchart.png)
這是一個更有用的數據可視化!似乎表明南瓜的最高價格出現在 9 月和 10 月。這符合你的期望嗎?為什麽?為什麽不?
---
## 🚀挑戰
探索 Matplotlib 提供的不同類型的可視化。哪種類型最適合回歸問題?
## [課後測](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/12/)
## 復習與自學
請看一下可視化數據的多種方法。列出各種可用的庫,並註意哪些庫最適合給定類型的任務,例如 2D 可視化與 3D 可視化。你發現了什麽?
## 任務
[探索可視化](./assignment.zh-tw.md)