Làm cách nào để bạn xử lý các giá trị bị thiếu trong python?

Trong tình huống thực tế, dữ liệu có sẵn hiếm khi sạch. Mỗi và mọi bộ dữ liệu có thể có các giá trị bị thiếu, vì vậy việc làm sạch dữ liệu là phần chính và quan trọng nhất của mọi dự án khoa học dữ liệu

Ảnh của tác giả

Trong bài viết này, chúng tôi trình bày một số công cụ Pandas tích hợp phổ biến để xử lý dữ liệu bị thiếu trong Python. Bài tập này được thực hiện bằng cách sử dụng bộ dữ liệu Giá nhà của Kaggle

Tại sao chúng ta cần điền vào các dữ liệu còn thiếu?

Nguồn. Giphy

Thật không may, nếu chúng ta chuyển một giá trị thiếu e. g không phải là số (NaN), hầu hết các mô hình máy học (ML) mà chúng tôi muốn sử dụng cho các vấn đề phân loại hoặc hồi quy sẽ cung cấp lỗi. Do đó, trước khi bắt đầu hướng tới bất kỳ quy trình xây dựng mô hình nào, chúng ta cần ưu tiên quy trình làm sạch dữ liệu. Chiến lược cơ bản nhất là xóa tất cả các hàng chứa giá trị bị thiếu hoặc trong trường hợp cực đoan là toàn bộ cột chứa giá trị bị thiếu. Tuy nhiên, có một nhược điểm với phương pháp này là chúng tôi sẽ mất dữ liệu có thể ảnh hưởng đến hiệu suất mô hình của chúng tôi. Vì vậy, nó không phải là ý tưởng tốt nhất. Mặc dù vậy, nó có thể hữu ích khi hầu hết các giá trị trong một cột bị thiếu

Đang tải và xem tập dữ liệu

Bộ dữ liệu được sử dụng có 1460 quan sát với 79 biến tính năng giải thích mô tả mọi khía cạnh của nhà ở ở các bang khác nhau của Hoa Kỳ và một biến đầu ra để dự đoán giá cuối cùng của mỗi ngôi nhà. Chi tiết đầy đủ của các biến này được mô tả tại đây. Trong bài viết này, chúng tôi sẽ chỉ tập trung vào các phương pháp khác nhau để xử lý các giá trị bị thiếu

Hãy bắt đầu với việc nhập Pandas và NumPy vào môi trường python của chúng tôi và tải một. tập dữ liệu csv vào khung dữ liệu gấu trúc có tên df. Mỗi và mọi ví dụ hiển thị trong bài viết này đều được xác minh trên sổ ghi chép Jupyter

tải. tập dữ liệu csv và kiểm tra cấu trúc của dữ liệu

Trước khi bắt đầu phân tích dữ liệu và đưa ra bất kỳ kết luận nào, cần phải hiểu sự hiện diện của các giá trị còn thiếu trong bất kỳ tập dữ liệu nào. Các giá trị bị thiếu trong tập dữ liệu có thể được biểu thị bằng các quy ước khác nhau (?, NaN, $, NA,. …)

Làm cách nào để biết liệu tập dữ liệu có thiếu giá trị nào không?

Để kiểm tra xem tập dữ liệu của chúng ta có thiếu giá trị nào hay không, cách đơn giản nhất là sử dụng df. hàm thông tin(). Hàm này sẽ cung cấp cho chúng ta tên cột với số lượng giá trị khác null trong mỗi cột

Chỉ số dtype , các cột và các giá trị khác null của mỗi cột

Ngoài ra còn có một cách khác để tìm xem chúng ta có giá trị null trong dữ liệu hay không bằng cách sử dụng hàm df. hàm isnull(). df. isnull(). sum() được sử dụng để tóm tắt tổng số giá trị còn thiếu trên mỗi cột

Tổng số dữ liệu bị thiếu trong các cột có ít nhất một NaN

Từ đầu ra ở trên, chúng tôi đã tìm thấy 19 cột có giá trị bị thiếu. Để làm cho cuộc sống của chúng ta dễ dàng hơn một chút, tốt hơn là viết một hàm cho các giá trị bị thiếu sẽ cho kết quả là tổng tỷ lệ phần trăm của các giá trị bị thiếu cùng với phân phối của tất cả các cột có giá trị bị thiếu trong tập dữ liệu. chúng tôi sẽ sử dụng thư viện matplotlib để vẽ các cột bị thiếu dữ liệu

Sơ đồ thanh của các cột có giá trị bị thiếu

Có nhiều cách xử lý dữ liệu bị thiếu và cách này khác nhau đối với các loại tập dữ liệu khác nhau. Không có cách phổ biến để xử lý dữ liệu bị thiếu. Bạn cần khám phá các tùy chọn khác nhau và cố gắng xác định phương pháp nào là tốt nhất cho tập dữ liệu của mình

Bây giờ, hãy thảo luận về các phương pháp xử lý dữ liệu bị thiếu

  • Xóa hàng/cột bị thiếu dữ liệu
  • Imputing Missing Values ​​(Điền dữ liệu còn thiếu bằng một giá trị)
Xóa hàng/cột bị thiếu dữ liệu

Phương pháp đầu tiên là xóa tất cả các hàng chứa giá trị bị thiếu hoặc trong trường hợp cực đoan là toàn bộ cột chứa giá trị bị thiếu. Điều này có thể được thực hiện bằng cách sử dụng df. hàm dropna(). axis=0 hoặc axis=1 được sử dụng để xóa các hàng/cột có giá trị NaN

# drop rows with missing values
df.dropna(axis=0, inplace=True)

Hình ảnh này cho thấy sự biến đổi bảng sau khi xóa một hàng (trái) hoặc một cột (phải)

Trong tập dữ liệu của chúng tôi, chúng tôi quan sát thấy 4 cột có hơn 1000 giá trị NaN (>65%). Vì vậy, tốt hơn là bỏ những cột này

Bốn cột bị loại bỏ bằng cách sử dụng hàm Pandas drop() Tính toán các giá trị bị thiếu

Phương pháp tiếp theo là thay thế các giá trị bị thiếu bằng một giá trị nhất định. Có nhiều tùy chọn để chọn khi thay thế một giá trị bị thiếu

  • phương pháp thay thế
  • Thay thế NaN bằng 0
  • Thay thế NaN bằng Mean/Median/Mode của cột
  • Thay thế NaN bằng SimpleImputer() của sklearn
  • Thay thế NaN bằng k Hàng xóm gần nhất (kNN)
  • Thay thế NaN bằng giá trị từ hàng trước hoặc hàng tiếp theo (sử dụng phương thức ffill hoặc bfill)
  • Thay thế NaN bằng phương pháp nội suy
  1. phương pháp thay thế

Đôi khi chúng tôi thiếu các giá trị trong tập dữ liệu ở dạng __, NA, @, ? . Cách dễ nhất để kiểm tra các giá trị bị thiếu này là in các giá trị duy nhất của một cột cụ thể

df["column"].unique()

Trong tình huống này, chúng tôi sẽ thay thế tất cả các giá trị còn thiếu bằng NaN bằng cách sử dụng df. chức năng thay thế (). Ở đây, chúng tôi chỉ định cả giá trị được thay thế và giá trị thay thế. Bây giờ, chúng ta sẽ dễ dàng xử lý các giá trị null hơn là bất kỳ ký hiệu không xác định nào

df = df.replace('?',np.nan)

“?”

2. Thay thế NaN bằng 0

Chúng tôi sẽ sử dụng Pandas df. hàm fillna() để thay thế các giá trị bị thiếu trong một cột bằng 0

df["MasVnrArea"] = df["MasVnrArea"].fillna(0)

Đầu ra tương tự cũng có thể đạt được bằng phương pháp thay thế

df["MasVnrArea"] = df["MasVnrArea"].replace(np.nan, 0)

3. Thay thế NaN bằng Mean/Median

Trường hợp cột hoặc biến số (dtype. int, float), chúng ta có thể điền giá trị còn thiếu bằng giá trị trung bình hoặc trung bình của chúng. Nếu bạn có dtype làm đối tượng cho một cột số, hàm pandas to_numeric() rất hữu ích để chuyển đổi các cột loại đối tượng thành các cột số

df["column"] = pd.to_numeric(df["column"], errors = 'coerce')

Hình ảnh này cho thấy sự thay thế các giá trị NaN bằng giá trị Trung bình (trái) hoặc Trung bình (phải) trong Cột 2
#using mean
df['LotFrontage'] = df['LotFrontage'].fillna(df['LotFrontage'].mean(), inplace=True)
# using median
df['LotFrontage'] = df['LotFrontage'].fillna(df['LotFrontage'].median(), inplace=True)

Tốt nhất là chỉ thay thế dữ liệu bị thiếu bằng giá trị trung bình khi dữ liệu có nhiều ngoại lệ hơn

4. Thay thế NaN bằng Chế độ

Trong trường hợp cột phân loại hoặc biến (dtype. đối tượng), chúng ta có thể thay thế dữ liệu bị thiếu bằng giá trị phổ biến nhất được gọi là chế độ

# using mode
df["GarageType"] = df["GarageType"].fillna(df["GarageType"].mode(), inplace=True)

Hình ảnh này cho thấy sự thay thế các giá trị NaN bằng giá trị phổ biến nhất (Chế độ) trong Cột 2

5. Tranh luận với SimpleImuter()

Thư viện sklearn cung cấp một hàm SimpleImputer() có thể được sử dụng để thay thế các giá trị bị thiếu. Điều này cho phép chúng tôi chỉ định giá trị cần thay thế bằng cách chuyển đối số chiến lược, chẳng hạn như giá trị trung bình, trung vị, chế độ hoặc bất kỳ hằng số nào

Nhập dữ liệu bị thiếu với SimpleImputer() và kiểm tra số lượng không null

Trong ví dụ trên, tôi đã tạo một khung dữ liệu mới df1 bằng cách chọn một cột (MasVnrArea) từ khung dữ liệu hiện có df. Cột này có tổng cộng 8 giá trị NaN. Tất cả các giá trị còn thiếu được gán với giá trị trung bình bằng cách sử dụng SimpleImputer(strategy = 'mean')

Ghi chú. Các phương pháp trung bình/trung bình cho kết quả kém trên các biến phân loại được mã hóa. Ngoài ra, các phương pháp này (Mean, Median, Mode) cũng không tính đến mối tương quan giữa các biến khác nhau

6. Tranh chấp với k Hàng xóm gần nhất

Thư viện sklearn cung cấp hàm KNNImputer() để thay thế các giá trị bị thiếu. Điều này cho phép chúng tôi chỉ định giá trị để thay thế các giá trị bị thiếu bằng giá trị trung bình từ hàng xóm gần nhất (n_neighbors) của điểm dữ liệu

Trong hình trên, chúng tôi có giá trị k là 3 và sau khi tìm thấy hàng xóm gần nhất của điểm dữ liệu mới, bản ghi mới sẽ có xu hướng chuyển sang lớp tam giác màu xanh lá cây dựa trên đa số phiếu bầu vì bản ghi dữ liệu tam giác xuất hiện nhiều hơn trong bán kính gần nhất k. Trường hợp giá trị k = 7, điểm dữ liệu mới sẽ có xu hướng chuyển sang hạng sao đỏ

Nhập dữ liệu bị thiếu với KNNImputer() và kiểm tra số lượng không null

Trong ví dụ trên, tôi đã tạo một khung dữ liệu mới df2 bằng cách chọn hai cột (MasVnrArea, SalePrice) từ khung dữ liệu hiện có df. Khung dữ liệu mới có tổng cộng 8 giá trị NaN trong biến MasVnrArea. Tất cả các giá trị còn thiếu được gán với giá trị khoảng cách trung bình của 3 hàng xóm gần nhất bằng cách sử dụng KNN

7. Thay thế NaN bằng phương thức ffill/bfill

Trong phương thức này, chúng ta có thể chỉ định điền trước (fill) để truyền giá trị trước đó theo hướng thuận hoặc điền ngược (bfill) để truyền giá trị theo hướng lùi

Ảnh này cho thấy việc thay thế các giá trị NaN bằng phương thức ffill (trái) hoặc bfill (phải)

Nếu giá trị trước đó không có sẵn trong quá trình điền chuyển tiếp, giá trị NaN sẽ giữ nguyên và ngược lại. Vì vậy, bạn có thể chọn phương thức ffill hoặc bfill cho cột phù hợp dựa trên tập dữ liệu của mình

________số 8

8. Thay thế NaN bằng phương pháp nội suy

Một cách khác để điền các giá trị NaN là sử dụng các kỹ thuật nội suy có thể được thực hiện bằng cách sử dụng hàm interpolate(). Phương pháp này rất hữu ích trong dữ liệu chuỗi thời gian

df["column"].interpolate(method="linear", direction = "forward", inplace=True)

kết luận

  • Chúng tôi đã học được rằng mỗi và mọi bộ dữ liệu đều có thể thiếu giá trị, vì vậy việc làm sạch dữ liệu là phần chính và quan trọng nhất của mọi dự án khoa học dữ liệu
  • Có nhiều cách khác nhau để điền các giá trị còn thiếu tùy thuộc vào tập dữ liệu. Không có quy tắc điền các giá trị còn thiếu. Bạn cần thử nghiệm và kiểm tra xem phương pháp nào hoạt động tốt nhất cho phân tích của bạn
  • Tôi khuyên bạn nên xem qua khóa học này của DataCamp để hiểu chi tiết

Điều này đưa chúng ta đến cuối bài viết này. Cảm ơn bạn đã xem qua bài viết này. Hy vọng bây giờ bạn hiểu rõ hơn về cách xử lý các giá trị bị thiếu. Nếu bạn có bất kỳ câu hỏi nào, vui lòng nhắn tin trong phần bình luận

Tài liệu tham khảo phù hợp được cung cấp trong suốt bài viết. Một số tài liệu tham khảo bài viết hữu ích hơn và chi tiết khóa học trực tuyến được đề cập dưới đây