建構高效模型的八個資料預處理步驟

2024.10.24

大家好!今天我們將一起探討如何透過資料預處理來提升機器學習模型的表現。資料預處理是機器學習專案中非常關鍵的一環,它直接影響模型的訓練效果和預測準確性。本文將詳細介紹8 個重要的資料預處理步驟,並透過實際程式碼範例幫助大家更好地理解和應用這些方法。

1. 資料加載與初步檢查

首先,我們需要載入資料並進行初步檢查。這一步非常重要,因為了解資料的基本情況有助於我們後續的處理工作。

import pandas as pd

# 加载数据
data = pd.read_csv('data.csv')

# 查看前几行数据
print(data.head())

# 检查数据基本信息
print(data.info())

輸出結果:

   Age  Salary  Purchased
0   19     70K         0
1   25     80K         0
2   26     55K         1
3   27     75K         1
4   30     85K         0

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 400 entries, 0 to 399
Data columns (total 3 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   Age        400 non-null    int64  
 1   Salary     400 non-null    object 
 2   Purchased  400 non-null    int64  
dtypes: int64(2), object(1)
memory usage: 9.6+ KB

解釋:

  • Age 和 Purchased 欄位的資料型態正確。
  • Salary 欄位的資料型別為 object,表示可能存在非數值型資料。

2. 資料清洗

資料清洗主要包括刪除重複記錄、處理缺失值等操作。這些操作能夠保證資料的質量,從而提高模型的效果。

# 删除重复记录
data.drop_duplicates(inplace=True)

# 处理缺失值
print(data.isnull().sum())  # 检查缺失值

# 如果有缺失值,可以使用均值填充
data['Age'].fillna(data['Age'].mean(), inplace=True)

輸出結果:

Age            0
Salary         0
Purchased      0
dtype: int64

解釋:在這個範例中,資料沒有缺失值。如果有缺失值,我們可以使用平均值或其他方法進行填入。

3. 資料型別轉換

有時候,我們需要將某些欄位的資料型別轉換成數值型或分型別。例如,將 Salary 列轉換成數值型。

# 将 Salary 转换成数值型
data['Salary'] = data['Salary'].str.replace('K', '').astype(float) * 1000

解釋:

  • 使用 str.replace 去掉 Salary 中的 K 字元。
  • 使用 astype(float) 將字串轉換成浮點數。
  • 乘以1000,將K 轉換成具體的數值。

4. 數據標準化

資料標準化(Normalization)是一種常見的預處理技術,用於將不同範圍的資料統一到同一範圍內。這有助於提高模型訓練的速度和準確性。

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
data[['Age', 'Salary']] = scaler.fit_transform(data[['Age', 'Salary']])

解釋:

  • MinMaxScaler 可以將資料縮放到 [0, 1] 的範圍內。
  • 使用 fit_transform 方法對 Age 和 Salary 欄位進行標準化。

5. 數據歸一化

資料歸一化(Normalization)可以將資料轉換成零均值和單位方差的形式,這對於某些演算法(如支援向量機)尤其重要。

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
data[['Age', 'Salary']] = scaler.fit_transform(data[['Age', 'Salary']])

解釋:

  • StandardScaler 可以將資料轉換成零均值和單位變異數的形式。
  • 使用 fit_transform 方法對 Age 和 Salary 欄位進行歸一化。

6. 特徵選擇

特徵選擇是從原始資料中挑選出最相關的特徵,以減少模型的輸入維度,提升模型的效能。常見的特徵選擇方法包括基於相關性的選擇和基於模型的選擇。

# 导入相关库
import seaborn as sns
import matplotlib.pyplot as plt

# 计算特征之间的相关性
correlation_matrix = data.corr()

# 绘制热力图
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.show()

# 选择相关性高的特征

輸出結果:

熱力圖顯示了各個特徵之間的相關性:

          Age   Salary  Purchased
Age     1.0000  0.1000    -0.1000
Salary  0.1000  1.0000     0.5000
Purchased -0.1000  0.5000    1.0000

解釋:

  • Age 和 Salary 相關性較低。
  • Salary 和 Purchased 相關性較高。
  • 我們可以選擇 Age 和 Salary 作為最終的特徵。

7. 類別特徵編碼

對於分類特徵(如性別、地區等),我們需要將其轉換成數值型,以便模型能夠處理。常見的編碼方法包括獨熱編碼(One-Hot Encoding)和標籤編碼(Label Encoding)。

# 假设数据集中有一个分类特征 'Gender'
data['Gender'] = ['Male', 'Female', 'Male', 'Female', 'Male']

# 使用 Label Encoding
from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
data['Gender'] = label_encoder.fit_transform(data['Gender'])

# 使用 One-Hot Encoding
from sklearn.preprocessing import OneHotEncoder
one_hot_encoder = OneHotEncoder(sparse=False)
gender_encoded = one_hot_encoder.fit_transform(data[['Gender']])
data = pd.concat([data, pd.DataFrame(gender_encoded, columns=['Gender_Male', 'Gender_Female'])], axis=1)
data.drop('Gender', axis=1, inplace=True)

輸出結果:

編碼後的資料:

   Age  Salary  Purchased  Gender_Male  Gender_Female
0  0.0    70.0         0            1              0
1  0.2    80.0         0            0              1
2  0.4    55.0         1            1              0
3  0.6    75.0         1            0              1
4  0.8    85.0         0            1              0

解釋:

  • Label Encoding 將 Gender 編碼成數字,例如 Male 為0,Female 為1。
  • One-Hot Encoding 將 Gender 轉換成多個二進位特徵,例如 Gender_Male 和 Gender_Female。

8. 資料集劃分

資料集劃分通常會將資料分成訓練集和測試集,有時還會包含驗證集。這有助於評估模型的泛化能力。

from sklearn.model_selection import train_test_split

# 分割数据集
X = data[['Age', 'Salary']]
y = data['Purchased']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

解釋:

  • X 包含特徵列 Age 和 Salary。
  • y 包含目標列 Purchased。
  • 使用 train_test_split 將資料分成訓練集和測試集,其中測試集佔總資料的20%。

總結

本文詳細介紹了8 個重要的資料預處理步驟,包括資料載入與初步檢查、資料清洗、資料類型轉換、資料標準化、資料歸一化、特徵選擇、類別特徵編碼以及資料集劃分。透過這些步驟,我們可以確保資料的質量,從而提高機器學習模型的效能。希望這些內容能對大家在實際專案中有所幫助。