簡介
您不需要成為 Python 專家才能學習 ML,但您必須熟悉表格資料。本文是一門“速成課程”,重點關注 ML 中最需要的內容:讀取資料、過濾、轉換、檢查遺失的資料以及創建簡單的特徵。
課程目標
- 使用 Pandas 讀取和探索數據
- 在訓練模型之前執行最常見的操作
- 知道何時使用筆記本以及何時將程式碼分開到單獨的文件中
1. 你會經常使用的兩個函式庫
NumPy
用於數組算術和向量化運算。
熊貓
用於表格資料(DataFrame)。
在大多數基本的 ML 專案中,您在 Pandas 上花費的時間比在模型上花費的時間更多。
2. 建立第一個 DataFrame
import pandas as pd
df = pd.DataFrame({
'dien_tich': [45, 60, 80, 120],
'so_phong': [1, 2, 3, 4],
'gia': [1.2, 1.8, 2.6, 4.1]
})
print(df)
結果是一個包含行和列的表格。在機器學習中:
- 每行通常是一個觀察結果
- 每列都是一個功能或目標
3. 5 個需要立即記住的 Pandas 動作
快速查看數據
df.head()
df.shape
df.columns
df.info()
df.describe()
選擇列
df['dien_tich']
df[['dien_tich', 'so_phong']]
過濾流
df[df['so_phong'] >= 2]
建立新列
df['gia_m2'] = df['gia'] / df['dien_tich']
安排
df.sort_values('gia', ascending=False)
4. 從 CSV 讀取數據
df = pd.read_csv('data/raw/houses.csv')
讀取資料後的第一件事應該始終是:
print(df.head())
print(df.shape)
print(df.isnull().sum())
目標是回答三個問題:
- 資料有多少行和列?
- 哪一列缺少資料?
- 哪一列是數字,哪一列是文字?
5. 什麼是缺失值?
缺失值是缺失的資料單元格。例如,客戶沒有申報年齡,或系統沒有記錄某個欄位。
檢查:
df.isnull().sum()
基本處理:
- 如果缺少太多行/列,則跳過
- 填寫平均數、中位數或眾數
- 添加了標誌
is_missing
例如:
df['tuoi'] = df['tuoi'].fillna(df['tuoi'].median())
6. 分類變數
許多非數字列,例如:
- 城市
- 服務包類型
- 性別
機器學習模型通常不能直接處理純文本,因此需要轉換。最基本的方式是one-hot編碼。
pd.get_dummies(df, columns=['thanh_pho'], drop_first=True)
7. Groupby 與聚合
這是理解數據和創建特徵的非常強大的技能。
df.groupby('thanh_pho')['gia'].mean()
df.groupby('loai_khach')['doanh_thu'].agg(['mean', 'count'])
應用範例:
- 按客戶群劃分的平均收入
- 按城市劃分的購買數量
- 按服務包劃分的流失率
8. 合併數據
實際上,數據很少駐留在單一表中。
customers = pd.read_csv('customers.csv')
orders = pd.read_csv('orders.csv')
df = customers.merge(orders, on='customer_id', how='left')
重要規則:合併後,始終檢查行號和新產生的空值。
9. 基本特徵工程
特徵工程正在創建額外的列來幫助模型更好地學習。
例如:
gia_m2 = gia / dien_tichthoi_gian_su_dung = ngay_hien_tai - ngay_dang_kytong_chi_tieu_30_ngay
好的特徵通常來自對問題的理解,而不是來自模型技巧。
10. 筆記本還是腳本?
在下列情況下使用筆記本:
- 探索數據
- 繪製圖表
- 快速嘗試想法
在下列情況下使用腳本/模組:
- 程式碼重複多次
- 需要重複使用
- 希望管道清潔且易於維護
實用原則:
- 筆記本探索
src/產生程式碼
簡短範例:第一個 EDA
import pandas as pd
df = pd.read_csv('data/raw/customers.csv')
print(df.head())
print(df.shape)
print(df.isnull().sum())
print(df['plan'].value_counts())
df['monthly_spend'] = df['total_spend'] / df['months_active']
print(df[['monthly_spend', 'churn']].head())
練習練習
1.讀取任意CSV檔案並運行 head, info, describe。
2. 根據原始資料建立至少 2 個新特徵。
3. 寫 3 個句子來描述您從 EDA 中學到的知識。
常見錯誤
- 在不理解該列含義的情況下編輯資料。
- 使用未來的資訊創建特徵。
- 合併完成但未檢查行號。
完成標準
- 可以將 CSV 讀入 DataFrame
- 可以執行基本的篩選、分組和合併
- 為問題創造一個新的有意義的特徵