Cách xử lý các giá trị nan trong python

Trong bài đăng này, tôi sẽ chia sẻ với bạn 5 cách đã được chứng minh mà bạn có thể áp dụng để xử lý các cột bị thiếu giá trị trong tập dữ liệu của mình

Hãy đi sâu vào

Nguyên nhân của các giá trị bị thiếu là gì. Các giá trị bị thiếu xảy ra do trích xuất không đầy đủ, thiếu thông tin, dữ liệu bị hỏng, dữ liệu không đầy đủ từ các kỹ sư hoặc do tính bảo mật của một số dữ liệu. Hãy xem xét các cách khác nhau để gán các giá trị bị thiếu

Để hiểu rõ hơn chúng ta sẽ sử dụng tập dữ liệu titanic và một số thư viện python như pandas, numpy và Scikit learn

bộ dữ liệu Titanic

Tổng quan về các cột bị thiếu
  1. Xóa hàng hoặc cột

Trong phương pháp này, chúng tôi xóa các hàng và cột có giá trị bị thiếu. Phương pháp này thường được sử dụng trong Khoa học dữ liệu nhưng chỉ nên sử dụng khi bạn có các hàng và cột có hơn 50% giá trị bị thiếu và khi chúng đủ mẫu trong tập dữ liệu. Mặc dù không phải lúc nào cũng nên xóa các cột có giá trị bị thiếu vì đôi khi có thể dẫn đến mất thông tin hoặc dữ liệu

Xóa các giá trị bị thiếu bằng cách xóa Hàng hoặc Cột

2. Thay thế bằng Mean/Mode/Median

Biện pháp này của Xu hướng trung tâm có thể cứu mạng bạn 😍 😊…

Phương pháp này được áp dụng trên các cột có giá trị số nhưng chế độ cũng có thể hoạt động trên các cột có giá trị phân loại. Chúng ta có thể tính toán giá trị trung bình, trung bình hoặc chế độ của đối tượng địa lý và thay thế nó bằng các giá trị còn thiếu (đừng lo lắng, gấu trúc có thể xử lý việc đó)

Bằng cách này, bạn sẽ không loại bỏ các cột này khỏi tập dữ liệu và bạn cũng không làm sai lệch các giá trị tiền lương

Mặc dù không hoàn hảo nhưng phương pháp này cho phép bạn giới thiệu các giá trị không ảnh hưởng đến toàn bộ tập dữ liệu, vì cho dù bạn thêm bao nhiêu giá trị trung bình thì giá trị trung bình vẫn giữ nguyên

Thay thế bằng Mean

Thay thế bằng Median và chế độ

3. Điền giá trị còn thiếu bằng một hằng số

Bạn cũng có thể quyết định điền các giá trị được đánh dấu NA bằng một giá trị không đổi. Ví dụ: bạn có thể nhập một chuỗi hoặc giá trị số đặc biệt

làm đầy với một hằng số

4. Dự đoán các giá trị còn thiếu

Sử dụng các tính năng không có giá trị bị thiếu, chúng tôi có thể dự đoán giá trị rỗng với sự trợ giúp của thuật toán học máy. Phương pháp này có thể mang lại độ chính xác cao hơn, trừ khi một giá trị bị thiếu dự kiến ​​sẽ có phương sai rất cao. Chúng tôi sẽ sử dụng hồi quy tuyến tính để thay thế các giá trị rỗng trong tính năng 'tuổi', sử dụng các tính năng có sẵn khác. Người ta có thể thử nghiệm với các thuật toán khác nhau và kiểm tra xem thuật toán nào mang lại độ chính xác tốt nhất thay vì chỉ sử dụng một thuật toán duy nhất

Dự đoán với hồi quy tuyến tính

5. Sử dụng Thuật toán hỗ trợ các giá trị bị thiếu

Chúng là nhiều mô hình học máy có thể hoạt động với các giá trị bị thiếu một cách hiệu quả mà không cần phải xóa các giá trị bị thiếu

  1. KNN. KNN là một thuật toán học máy hoạt động trên nguyên tắc đo khoảng cách. Thuật toán này có thể được sử dụng khi có null trong tập dữ liệu. Trong khi thuật toán được áp dụng, KNN xem xét các giá trị còn thiếu bằng cách lấy phần lớn K giá trị gần nhất. Trong bộ dữ liệu cụ thể này, có tính đến độ tuổi, giới tính, tầng lớp của người đó, v.v., chúng tôi sẽ giả định rằng những người có cùng dữ liệu cho các tính năng được đề cập ở trên sẽ có cùng loại giá vé. Bạn có thể xem TÀI LIỆU KNN
  2. Mô hình rừng ngẫu nhiên. Mô hình này tạo ra kết quả mạnh mẽ vì nó hoạt động tốt trên dữ liệu phi tuyến tính và phân loại. Nó thích ứng với cấu trúc dữ liệu có tính đến phương sai cao hoặc sai lệch, tạo ra kết quả tốt hơn trên các tập dữ liệu lớn. Bạn có thể xem qua TÀI LIỆU RỪNG NGẪU NHIÊN
  3. LIGHTGBM. lightGBM sẽ bỏ qua các giá trị bị thiếu trong quá trình phân tách, sau đó phân bổ chúng cho bất kỳ bên nào giảm tổn thất nhiều nhất. Bạn có thể xem TÀI LIỆU LIGHTGBM

Xử lý các biến bị thiếu trong khi làm việc trên bộ dữ liệu thực sự có thể giúp cải thiện hiệu suất mô hình của bạn và quan trọng nhất là giúp bạn khai thác tốt nhất bộ dữ liệu của mình

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ẽ báo 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 ta chỉ định giá trị cần thay thế bằng cách chuyển một đối số startegy 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 tính toá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

Chủ đề