從零開始學機器學習——準備和視覺化資料

努力的小雨發表於2024-09-27

首先給大家介紹一個很好用的學習地址:https://cloudstudio.net/columns

資料準備-清洗

在進行機器學習的第一步——準備資料,為了方便起見,我已經提前下載好了所需的檔案。

https://files.cnblogs.com/files/guoxiaoyu/US-pumpkins.zip?t=1726642760&download=true

在大多數情況下,我們很少能夠獲得完全符合規範的資料集。因此,通常第一步是對資料進行清洗。就以今天的資料為例,讓我給大家開啟看一下,瞭解它的具體格式是怎樣的。

image

無論從哪個角度來看,這些資料都並非十分理想。它確實包含了大量資訊,因此今天我們將以月份為主要維度,來統計南瓜每月的平均價格。這樣做的話,我們基本上可以放棄許多其他欄位。

開始解析

我們的目標是獲取每月南瓜的平均價格,因此我們需要關注的欄位包括月份和價格。手動刪除不必要的欄位,再讓Python進行解析,這樣的做法顯得太繁瑣和低效了。因此,今天我們將介紹一個非常實用的工具包:Pandas,它能夠簡化這一過程。

Pandas學習地址:https://pandas.pydata.org/

import pandas as pd
pumpkins = pd.read_csv('../data/US-pumpkins.csv')
print(pumpkins.head())
print(pumpkins.tail())

這裡可以自行列印下前5行資訊和後5行資訊。

image

這裡的資料列很多,我們需要刪除那些不必要的列,只保留我們需要的月份和價格資料。

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)
print(pumpkins.isnull().sum())

注意,我們的檔案中並沒有"Month"這一列,這是我們後續需要用到的重要資料。另外,還有一個"Package"欄位,表示稱重方式,因為不同的蔬菜可能有不同的稱重方式。

通常情況下,我們購買東西時按照公斤(kg)為單位稱重進行結算。然而,商家有時為了促銷可能會以整個南瓜的方式出售,這種稱重方式的不統一是很常見的。我們需要確保只保留統一的稱重方式資料。

欄位解析

我們首先來計算比較簡單的日期,只獲取月份而不考慮年份。儘管這樣做可能會導致最終資料的不準確性,因為每年各種因素會導致價格浮動很大,但暫且不考慮這些複雜因素,先處理最簡單的情況。

month = pd.DatetimeIndex(pumpkins['Date']).month
print(month)

接下來我們處理價格,我們將只考慮每個菜品的最高價和最低價,然後計算它們的平均值。

price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2
print(price)

現在我們來處理稱重方式。針對美國地區的稱重方式,我們無需過多關注細節,直接使用已經設定好的公式即可。而對於國內地區,則需要根據資料特徵進行擷取和調整。

pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]
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)
print(new_pumpkins)

效果如下:

image

資料視覺化

我們將使用資料視覺化庫 Matplotlib 來呈現我們的資料分析結果。Matplotlib 是一個強大的工具,能夠幫助我們建立各種型別的圖表,以便更直觀地展示資料趨勢和關係。

Matplotlib入門學習地址是:https://matplotlib.org/

import matplotlib.pyplot as plt
price = new_pumpkins.Price
month = new_pumpkins.Month
plt.scatter(month, price)
plt.show()

在這裡,我們簡單地將價格和月份資料顯示在了 x 軸和 y 軸上,並沒有特別複雜的圖表設計。

image

我們來最佳化下程式碼:

new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar')
plt.ylabel("Pumpkin Price")

我來解釋一下:groupby方法被用來按照Month列對資料進行分組,這意味著所有具有相同月份的資料會被歸為一組。

接下來,['Price'].mean()是對每個分組內的Price列計算平均值。這樣,我們就得到了每個月的南瓜平均價格。

最後,.plot(kind='bar')是將計算出的平均價格資料繪製成條形圖。這裡的kind='bar'指定了繪圖型別為條形圖,它會顯示每個月的平均價格,並且每個月份會對應一個條形。

image

當然,資料視覺化並不侷限於 Matplotlib,還有許多其他依賴庫可供選擇,你可以根據個人喜好和需求選擇適合的工具。

總結

看起來,確實我們的資料處理工作已經基本完成了。

然而,在文章中我還提到了一個重要的觀點:這種方法並不能充分解釋具體問題的原因。這是因為我們只是在理想條件下計算價格,而沒有考慮到年份、天氣以及稱重等因素的影響。儘管如此,我們已經確定了資料準備的大致流程。

現在需要做的是自行決定如何維護這一流程,確保資料的清晰性和準確性。


我是努力的小雨,一名 Java 服務端碼農,潛心研究著 AI 技術的奧秘。我熱愛技術交流與分享,對開源社群充滿熱情。同時也是一位騰訊雲創作之星、阿里雲專家博主、華為云云享專家、掘金優秀作者。

💡 我將不吝分享我在技術道路上的個人探索與經驗,希望能為你的學習與成長帶來一些啟發與幫助。

🌟 歡迎關注努力的小雨!🌟

相關文章