Tiền xử lý dữ liệu là quá trình chuẩn bị dữ liệu thô trước khi áp dụng các phương pháp học sâu để giải quyết các vấn đề thực tế. Pandas là một gói phân tích dữ liệu phổ biến trong Python và có thể được sử dụng kết hợp với định dạng ndarray mà bạn có thể cân nhắc sử dụng.
Tiền xử lý dữ liệu
Trước tiên, chúng ta đã tìm hiểu rất nhiều kỹ thuật thao tác dữ liệu lưu trữ dưới dạng ndarray. Tuy nhiên, trong thực tế, chúng ta thường phải làm việc với dữ liệu thô và không phải lúc nào dữ liệu cũng được chuẩn bị sẵn trong định dạng ndarray. Trong số các công cụ phân tích dữ liệu phổ biến của Python, gói pandas được sử dụng phổ biến. Pandas có thể được sử dụng kết hợp với ndarray và trong phần này chúng ta sẽ đi qua các bước để tiền xử lý dữ liệu thô bằng pandas và sau đó chuyển chúng sang định dạng ndarray. Các kỹ thuật tiền xử lý dữ liệu khác sẽ được giới thiệu trong các phần tiếp theo.
Đọc tập dữ liệu
Để minh họa, chúng ta sẽ bắt đầu bằng việc tạo một tập dữ liệu nhân tạo và lưu nó trong một tệp tin csv có tên là “house_tiny.csv” (csv – comma-separated values – các giá trị được phân tách bằng dấu phẩy). Tuy nhiên, dữ liệu có thể được lưu dưới các định dạng khác và được xử lý tương tự. Chúng ta sẽ sử dụng hàm “mkdir_if_not_exist” để đảm bảo rằng thư mục “../data” tồn tại.
import os
# Lưu lại trong gói d2l để dùng sau
def mkdir_if_not_exist(path):
if not isinstance(path, str):
path = os.path.join(*path)
if not os.path.exists(path):
os.makedirs(path)
Sau đó, chúng ta ghi dữ liệu vào tệp tin csv theo từng hàng.
data_file = '../data/house_tiny.csv'
mkdir_if_not_exist('../data')
with open(data_file, 'w') as f:
f.write('NumRooms,Alley,Price\n') # Tên cột
f.write('NA,Pave,127500\n') # Mỗi hàng là một điểm dữ liệu
f.write('2,NA,106000\n')
f.write('4,NA,178100\n')
f.write('NA,NA,140000\n')
Để đọc tập dữ liệu từ tệp tin csv vừa được tạo, chúng ta sử dụng gói thư viện pandas và hàm “read_csv”. Tập dữ liệu này có 4 hàng và 3 cột, trong đó mỗi hàng biểu thị số phòng (“NumRooms”), kiểu lối đi (“Alley”), và giá (“Price”) của căn nhà.
import pandas as pd
data = pd.read_csv(data_file)
print(data)
Kết quả:
NumRooms Alley Price
0 NaN Pave 127500
1 2.0 NaN 106000
2 4.0 NaN 178100
3 NaN NaN 140000
Xử lý dữ liệu thiếu
Chúng ta nhận thấy rằng giá trị “NaN” đại diện cho các giá trị bị thiếu trong tập dữ liệu. Có hai phương pháp thông thường để xử lý dữ liệu thiếu là quy buộc (imputation) và xoá bỏ (deletion), trong đó quy buộc thay thế giá trị bị thiếu bằng giá trị khác, trong khi xoá bỏ sẽ loại bỏ các giá trị bị thiếu.
Trong ví dụ này, chúng ta sử dụng phương pháp quy buộc. Sử dụng phương pháp đánh chỉ số theo số nguyên (iloc), chúng ta tách dữ liệu thành hai phần: inputs (tương ứng với hai cột đầu) và outputs (tương ứng với cột cuối cùng). Đối với các giá trị số bị thiếu trong inputs, chúng ta thay thế giá trị “NaN” bằng giá trị trung bình của cùng cột đó.
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)
Kết quả:
NumRooms Alley
0 3.0 Pave
1 2.0 NaN
2 4.0 NaN
3 3.0 NaN
Đối với các giá trị dạng hạng mục hoặc số rời rạc trong inputs, chúng ta coi “NaN” là một mục riêng. Trong trường hợp này, cột “Alley” chỉ nhận 2 giá trị riêng biệt là “Pave” (được lát gạch) và “NaN”. Pandas có thể tự động chuyển cột này thành 2 cột “Alley_Pave” và “Alley_nan”. Các hàng có kiểu lối đi là “Pave” sẽ có giá trị 1 trong cột “Alley_Pave” và giá trị 0 trong cột “Alley_nan”. Các hàng không có giá trị kiểu lối đi sẽ có giá trị 0 trong cột “Alley_Pave” và giá trị 1 trong cột “Alley_nan”.
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)
Kết quả:
NumRooms Alley_Pave Alley_nan
0 3.0 1 0
1 2.0 0 1
2 4.0 0 1
3 3.0 0 1
Chuyển sang định dạng ndarray
Khi tất cả các giá trị trong inputs và outputs đã ở dạng số, chúng ta có thể chuyển chúng sang định dạng ndarray. Khi ở định dạng này, chúng có thể được biến đổi và xử lý bằng các chức năng của ndarray đã được giới thiệu trong mục 2.1.
from mxnet import np
X, y = np.array(inputs.values), np.array(outputs.values)
X, y
Kết quả:
(array([[3., 1., 0.],
[2., 0., 1.],
[4., 0., 1.],
[3., 0., 1.]], dtype=float64),
array([127500, 106000, 178100, 140000], dtype=int64))
Kết luận
Pandas là một gói phân tích dữ liệu phổ biến trong hệ sinh thái Python. Nó có thể được sử dụng để tiền xử lý dữ liệu thô và chuyển đổi chúng sang dạng ndarray. Phương pháp quy buộc và xoá bỏ thường được áp dụng để xử lý dữ liệu thiếu.
Bài viết này sử dụng thông tin từ cuốn sách Dive into Deep Learning đã được một số dịch giả của Diễn đàn Machine Learning tiên phong dịch sang tiếng Việt.