學習筆記(23): 機器學習之數據預處理Pandas和轉換成張量格式[1]
學習機器學習,需要學習如何預處理原始數據,這里用到pandas,將原始數據轉換為張量格式的數據。
1、安裝pandas
pip install pandas
2、寫入和讀取數據
>>創建一個人工數據集,并存儲在CSV(逗號分隔值)文件 ../../data/house_tiny.csv中。 以其他格式存儲的數據也可以通過類似的方式進行處理。 下面我們將數據集按行寫入CSV文件中。
2.1、代碼
import os
import pandas as pd#向上兩級目錄,然后進入data目錄
os.makedirs(os.path.join('..','..','data'),exist_ok=True)
data_file =os.path.join('..','..','data','house_tiny.csv')
#寫入csv數據
with open(data_file,'w') as f:f.write('NumRoos,Alley,Price\n') #列名f.write('NA,Pave,127500\n') # 每行表示一個數據樣本f.write('2,NA,106000\n') # 每行表示一個數據樣本f.write('4,NA,178100\n')f.write('NA,NA,140000\n')#從csv讀取數據
data = pd.read_csv(data_file)
print(data)
>>從創建的CSV文件中加載原始數據集,我們導入pandas包并調用read_csv函數。該數據集有四行三列。其中每行描述了房間數量(“NumRooms”)、巷子類型(“Alley”)和房屋價格(“Price”)。
2.2、執行結果
3、處理缺失值(插值法)
? ? ? “NaN”項代表缺失值。 為了處理缺失的數據,典型的方法包括插值法和刪除法, 其中插值法用一個替代值彌補缺失值,而刪除法則直接忽略缺失值。 在這里,我們將考慮插值法。
3.1、NumRoos缺失值處理
3.1.1、代碼
# 處理缺失值
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
# 轉換 NumRoos 列為數值類型(將 'NA' 轉為 NaN)
inputs['NumRoos'] = pd.to_numeric(inputs['NumRoos'], errors='coerce')
# 用均值填充 NumRoos 列的缺失值
inputs['NumRoos'] = inputs['NumRoos'].fillna(inputs['NumRoos'].mean())
print("\n均值填充后的數據:")
print(inputs)
? ? ? ?通過位置索引iloc,我們將data分成inputs和outputs, 其中前者為data的前兩列,而后者為data的最后一列。 對于inputs中缺少的數值,我們用同一列的均值替換“NaN”項。
3.1.2、執行結果
這段代碼解釋:
類型轉換:
inputs['NumRoos'] = pd.to_numeric(inputs['NumRoos'], errors='coerce')
將 NumRoos 列從 object 類型轉為數值類型
errors='coerce' 會把無法轉換的 'NA' 轉為 NaN
均值填充:
inputs['NumRoos'] = inputs['NumRoos'].fillna(inputs['NumRoos'].mean())
此時 NumRoos 是數值類型,mean() 能正確計算均值(3.0)
3.2、Alley字段缺失值處理
? ? ? ? 對于inputs
中的類別值或離散值,我們將“NaN”視為一個類別。 由于“巷子類型”(“Alley”)列只接受兩種類型的類別值“Pave”和“NaN”,?pandas
可以自動將此列轉換為兩列“Alley_Pave”和“Alley_nan”。 巷子類型為“Pave”的行會將“Alley_Pave”的值設置為1,“Alley_nan”的值設置為0。 缺少巷子類型的行會將“Alley_Pave”和“Alley_nan”分別設置為0和1。
inputs = pd.get_dummies(inputs, dummy_na=True)
- 自動處理分類變量?
Alley
dummy_na=True
?會為缺失值創建單獨的列
3.2.1、代碼
# 對Alley變量進行缺失值處理
inputs = pd.get_dummies(inputs, dummy_na=True)
# 檢查數據類型
# print(inputs.dtypes)
# 將所有布爾列轉換為整數類型(True → 1, False → 0)
inputs = inputs.astype(int)
print("\n缺失值處理后的數據:")
print(inputs)
3.2.2、執行結果
這樣的數據就可以直接用于機器學習模型(如線性回歸、決策樹等)了。
4、轉換為張量格式
現在inputs
和outputs
中的所有條目都是數值類型,它們可以轉換為張量格式。
4.1、代碼
import torch
print("\n轉換成張量數據:")
x = torch.tensor(inputs.to_numpy(dtype=float))
print(x)
y = torch.tensor(outputs.to_numpy(dtype=float))
print(y)
4.2、執行結果
-
pandas
軟件包是Python中常用的數據分析工具中,pandas
可以與張量兼容。 -
用
pandas
處理缺失的數據時,我們可根據情況選擇用插值法和刪除法。