學習筆記(24): 機器學習之數據預處理Pandas和轉換成張量格式[2]
學習機器學習,需要學習如何預處理原始數據,這里用到pandas,將原始數據轉換為張量格式的數據。
學習筆記(23): 機器學習之數據預處理Pandas和轉換成張量格式[1]-CSDN博客
下面介紹下:處理缺失值(刪除法)
為什么要這樣做?
這種處理缺失值的策略很實用,當某列的缺失值比例過高時,保留該列可能會對后續分析造成負面影響。刪除缺失值最多的列可以避免在缺失值填充時引入過多噪聲,提高數據質量。
原始數據:
? ?NumRoos Alley ? Price
0 ? ? ?NaN ?Pave ?127500
1 ? ? ?2.0 ? NaN ?106000
2 ? ? ?4.0 ? NaN ?178100
3 ? ? ?NaN ? NaN ?140000
1、處理缺失值(刪除法)
? ? ? “NaN”項代表缺失值。 為了處理缺失的數據,典型的方法包括插值法和刪除法, 其中插值法用一個替代值彌補缺失值,而刪除法則直接忽略缺失值。 在這里,我們將考慮刪除法。
1.1、代碼
# 處理缺失值
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
# 轉換 NumRoos 列為數值類型(將 'NA' 轉為 NaN)
inputs['NumRoos'] = pd.to_numeric(inputs['NumRoos'],errors='coerce')# 計算每列的缺失值數量
miss_counts = inputs.isna().sum()
print("\n各列缺失值數量:")
print(miss_counts)# 找出缺失值最多的列
if not miss_counts.empty:max_miss = miss_counts.max() # 計算最大缺失值數量,結果為3(Alley列有3個缺失值print(max_miss)clos_drop = miss_counts[miss_counts ==max_miss].index.tolist() #篩選出缺失值數量等于最大值的列,miss_counts == max_miss 返回布爾 Seriesinputs = inputs.drop(columns=clos_drop) #刪除篩選出的列print(f"\n已刪除缺失值最多的列: {clos_drop}")# 用均值填充 NumRoos 列的缺失值
inputs['NumRoos'] = inputs['NumRoos'].fillna(inputs['NumRoos'].mean())print("\n處理后的數據:")
print(inputs)
代碼解析如下
1. 數據分割:提取輸入特征和輸出標簽
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]inputs:提取數據的前兩列(索引 0 和 1)作為特征(NumRoos和Alley)。
outputs:提取第三列(索引 2)作為目標變量(Price)。
2. 將NumRoos列轉換為數值類型
inputs['NumRoos'] = pd.to_numeric(inputs['NumRoos'], errors='coerce')pd.to_numeric(..., errors='coerce'):將字符串類型的數值轉換為數字,無法轉換的(如NA)會被轉為NaN(缺失值)。
3. 計算每列的缺失值數量
miss_counts = inputs.isna().sum()
print("\n各列缺失值數量:")
print(miss_counts)
inputs.isna():返回一個布爾型 DataFrame,標記每個位置是否為缺失值。
.sum():統計每列的True(缺失值)數量。
#篩選出缺失值數量等于最大值的列
clos_drop = miss_counts[miss_counts == max_miss].index.tolist()
這行代碼主要做了三件事:篩選、提取索引、轉換為列表。
1、篩選操作?
missing_counts[...]
? ? ?miss_counts == max_miss 返回布爾 Series
? ? ?miss_counts[...] 篩選出值為True的行(即Alley)。# 結果:
# NumRoos ? ?False
# Alley ? ? ? True
# dtype: bool2、
.index
?獲取列名篩選結果是一個新的 Series,我們需要它的索引(也就是列名)
# 結果:
# Index(['Alley'], dtype='object')3、
.tolist()
?轉換為列表.index.tolist() 將列名轉為列表 ['Alley']。
為什么要轉換為列表?
你可能會問:為什么不直接用索引對象,而非要轉成列表呢?這主要是為了兼容drop()
方法。drop()
方法的columns
參數可以接受列名列表或索引對象,但列表更靈活,方便后續處理。
關鍵細節總結
1、缺失值處理策略:
優先刪除缺失比例最高的列(Alley列缺失率 75%)。
對剩余列(NumRoos)用均值填充。
2、數據類型轉換:
pd.to_numeric(..., errors='coerce') 是處理含缺失值的數值列的常用方法。
3、邊緣情況處理:
當有多個列缺失值數量相同時(如兩列均有 3 個缺失值),會同時刪除這些列。
if not miss_counts.empty 確保無缺失值時不會報錯。
# 用均值填充 NumRoos 列的缺失值
inputs['NumRoos'] = inputs['NumRoos'].fillna(inputs['NumRoos'].mean())
inputs['NumRoos'].mean():計算NumRoos列的均值(結果為 3.0,因為有效數值為 2 和 4)。
.fillna(...):將NumRoos列的缺失值(NaN)填充為均值 3.0。
1.2、執行結果
2、轉換為張量格式
現在inputs
和outputs
中的所有條目都是數值類型,它們可以轉換為張量格式。
2.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)
2.2、執行結果
-
pandas
軟件包是Python中常用的數據分析工具中,pandas
可以與張量兼容。 -
用
pandas
處理缺失的數據時,我們可根據情況選擇用插值法和刪除法。