Hướng dẫn data cleaning pipeline python - Python làm sạch đường ống dữ liệu

Tìm hiểu cách chuẩn bị và xử lý trước dữ liệu của bạn cho các thuật toán học máy

Ảnh của Ashwini Chaudhary trên unplash

Ở đó, chỉ có một trục trặc nhỏ bé này trước khi bạn đi sâu vào thế giới lạ mắt của các thuật toán học máy (ML), theo đó bạn cố gắng dự đoán tương lai: chuẩn bị dữ liệu hoặc tiền xử lý dữ liệu.Data Preparation or Data Preprocessing.

Chuẩn bị dữ liệu là một phần không chính đáng của công việc quyến rũ nhất của thế kỷ 21.

Huấn luyện các thuật toán ML và sử dụng chúng để dự đoán biến mục tiêu là một chút dễ dàng, nhờ các thư viện và gói chuyên dụng khác nhau có sẵn trong Python và R. Khoa học và thế giới ML.

Các hoạt động chuẩn bị dữ liệu chuyển đổi dữ liệu thô thành một hình thức, hình dạng và định dạng có thể được sử dụng hiệu quả và hiệu quả bởi các thuật toán ML. Nó tạo thành một thành phần quan trọng của đường ống ML và có thể thực hiện hoặc phá vỡ quy trình ML.

Các học viên đồng ý rằng phần lớn thời gian trong việc xây dựng một đường ống học máy được dành cho kỹ thuật tính năng và làm sạch dữ liệu. Tuy nhiên, mặc dù tầm quan trọng của nó, chủ đề hiếm khi được thảo luận.

Làm sạch dữ liệu chỉ là một thành phần của các hoạt động chuẩn bị dữ liệu cũng bao gồm lựa chọn tính năng, chuyển đổi dữ liệu, kỹ thuật tính năng và giảm kích thước. is just one component of data preparation activities that also include feature selection, data transformation, feature engineering, and dimensionality reduction.

Các hoạt động xử lý dữ liệu và làm sạch dữ liệu theo định nghĩa, là duy nhất cho từng bộ dữ liệu thô được cung cấp các đặc thù riêng lẻ vốn có trong một dự án ML thực tế. Mặc dù vậy, một số hoạt động nhất định là tiêu chuẩn hộp và nên được áp dụng, hoặc ít nhất là được kiểm tra dữ liệu thô trước khi đào tạo mô hình.

Bất kể loại lỗi dữ liệu được sửa, các hoạt động làm sạch dữ liệu thường bao gồm hai giai đoạn: (1) phát hiện lỗi, trong đó các lỗi và vi phạm khác nhau được xác định và có thể được xác nhận bởi các chuyên gia; và (2) sửa chữa lỗi, trong đó các bản cập nhật cho cơ sở dữ liệu được áp dụng (hoặc đề xuất cho các chuyên gia của con người) để đưa dữ liệu đến trạng thái sạch hơn phù hợp với các ứng dụng và phân tích hạ nguồn.

Warning!

Một lời cảnh báo trước khi chúng tôi khám phá các hoạt động làm sạch dữ liệu tiêu chuẩn khác nhau. Như đã lưu ý trong một trong các bài viết trước của tôi: Tất cả các hoạt động sau đây nên được thực hiện trên bộ dữ liệu đào tạo bằng số sau khi chia toàn bộ dữ liệu của bạn thành các tập hợp con/kiểm tra/xác thực để tránh rò rỉ dữ liệu. Chỉ sau đó khi bạn có một bộ dữ liệu đào tạo sạch, hãy lặp lại cùng một tập hợp các hoạt động trong các bộ dữ liệu kiểm tra (và xác thực) và trên các biến mục tiêu, nếu được yêu cầu.

Trong tất cả các đoạn mã bên dưới và tuân theo ký hiệu thông thường, X_train đề cập đến bộ dữ liệu đầu vào đào tạo.

Làm sạch dữ liệu cơ bản

Các hoạt động sau đây sẽ tạo thành điểm khởi đầu của dự án ML của bạn, để được áp dụng cho mọi dữ liệu mà bạn có được.

Xác định và xóa các yếu tố dự đoán không biến đổi không

Các yếu tố dự đoán không biến đổi không đề cập đến các tính năng đầu vào có chứa một giá trị duy nhất trên toàn bộ phổ quan sát. Theo đó, họ không thêm bất kỳ giá trị nào vào thuật toán dự đoán vì biến đích không bị ảnh hưởng bởi giá trị đầu vào, khiến chúng trở nên dư thừa. Một số thuật toán ML cũng có thể gặp lỗi bất ngờ hoặc kết quả sai đầu ra.

Pandas cung cấp một chức năng ngắn và ngọt ngào để đếm và liệt kê số lượng các giá trị duy nhất trong mỗi cột của Pandas DataFrame:

X_train.nunique()

Việc bỏ các cột cụ thể từ một khung dữ liệu gấu trúc là đủ đơn giản thông qua

X_train.drop(columns = X_train.columns[X_train.nunique() == 1],
inplace = True)
0 khi không có nhiều cột bị bỏ. Một cách mạnh mẽ hơn để đạt được kết quả tương tự với nhiều cột vô cảm không phải là:

X_train.drop(columns = X_train.columns[X_train.nunique() == 1],
inplace = True)

Mã trên sẽ giảm tất cả các cột có một giá trị duy nhất và cập nhật DataFrame X_train.

Đánh giá các cột với rất ít giá trị duy nhất

Cần xem xét đặc biệt cho các cột có rất ít số lượng giá trị duy nhất (còn gọi là phương sai thấp hoặc phương sai gần bằng không). Các cột như vậy không phải là ứng cử viên tự động bị loại khỏi bộ dữ liệu. Ví dụ, các cột thứ tự hoặc phân loại, theo thiết kế, dự kiến ​​sẽ không có số lượng giá trị duy nhất cao.

Theo trực giác, chúng ta có thể vô sinh thả các cột biến thể thấp, nhưng điều gì sẽ xảy ra nếu những người dự đoán như vậy thực sự có nhiều thông tin cho việc học mô hình? Ví dụ: giả sử rằng một tính năng nhị phân trong một vấn đề phân loại có rất nhiều số 0 và một số ít (dự đoán phương sai gần bằng 0). Biến đích luôn giống nhau khi tính năng đầu vào này bằng một; Tuy nhiên, nó có thể là một trong các giá trị mục tiêu có thể trong trường hợp tính năng này bằng không. Nó chắc chắn là hợp lý để giữ cột này như một trong những dự đoán của chúng tôi.

Do đó, các cân nhắc theo ngữ cảnh và kiến ​​thức miền nên được sử dụng để đánh giá xem các cột phương sai thấp đó có nên được loại bỏ khỏi bộ dữ liệu của chúng tôi hay không. Ví dụ:

  • Xem xét mã hóa chúng như các biến thứ tự
  • Xem xét mã hóa chúng như các biến phân loại
  • Xem xét kết hợp các cột biến thể thấp này thông qua một số kỹ thuật giảm chiều, ví dụ, phân tích thành phần chính (PCA)

Chúng ta có thể tính toán thủ công số lượng giá trị duy nhất trong mỗi cột theo tỷ lệ phần trăm của tổng số quan sát như dưới đây:

from numpy import uniquefor i in range(X_traain.shape[1]):
num = len(unique(X_train.iloc[:, i]))
percentage = float(num) / X_train.shape[0] * 100
print('%d, %d, %.1f%%' % (i, num, percentage))

Mã trên sẽ in ra một danh sách tất cả các cột, cùng với số lượng các giá trị duy nhất và tỷ lệ phần trăm của nó cho tổng số quan sát.

Hoặc, chúng ta có thể sử dụng thư viện Scikit-learn

X_train.drop(columns = X_train.columns[X_train.nunique() == 1],
inplace = True)
2Class để xác định và thả các cột biến thể thấp. Tập thể dục cực kỳ thận trọng khi sử dụng lớp
X_train.drop(columns = X_train.columns[X_train.nunique() == 1],
inplace = True)
3, vì nó được thiết kế để thả các cột dưới ngưỡng tham số hóa.and drop low-variance columns. Exercise extreme caution when using
X_train.drop(columns = X_train.columns[X_train.nunique() == 1],
inplace = True)
3 class, as it is designed to drop columns that are below the parameterized threshold.

Đối phó với dữ liệu trùng lặp

Các hàng trùng lặp, rất có thể, sẽ bị loại khỏi dữ liệu của bạn, vì dù sao chúng cũng rất có thể sẽ là dự phòng.

Pandas cung cấp một chức năng đơn giản để kiểm tra bất kỳ hàng trùng lặp nào trong DataFrame. Lưu ý rằng điều này sẽ chỉ hiển thị hàng thứ hai (và bất kỳ thứ tự cao hơn), vì hàng đầu tiên được nhân đôi không được coi là trùng lặp.

X_train[X_train.duplicated()]

Nếu, sau khi phân tích các bản ghi trùng lặp, bạn muốn tiến hành bỏ chúng, một dòng mã duy nhất có thể đạt được điều này:

X_train.drop_duplicates(inplace = True)

Phát hiện ngoại vi

Các ngoại lệ là bất kỳ điểm dữ liệu nào có vẻ hiếm hoặc không thể xảy ra trong bối cảnh của một bộ dữ liệu nhất định. Kiến thức miền và chuyên môn về chủ đề có ích để xác định các ngoại lệ. Mặc dù không có định nghĩa tiêu chuẩn về các ngoại lệ với bản chất theo ngữ cảnh của chúng, các biện pháp thống kê và âm mưu khác nhau có thể được sử dụng để xác định và giải quyết một cách thích hợp với chúng.

Tương tự như các cột biến thể thấp, các quan sát ngoại lệ không phải là ứng cử viên tự động để giảm. Thay vào đó, những điều này nên được phân tích thêm để xác định xem chúng có thực sự bất thường hay không.

Vẽ hộp và râu ria là một cách đơn giản và cơ bản để trực quan hóa các ngoại lệ số trong DataFrame của bạn:

X_train.boxplot()

Bây giờ chúng ta hãy xem một số kỹ thuật thống kê để xác định các ngoại lệ.

Sử dụng độ lệch chuẩn (SD)

Các kỹ thuật SD để phát hiện ngoại lệ có thể được áp dụng cho tất cả các tính năng số thể hiện sự phân phối giống như Gaussian hoặc Gaussian. Như một sự bồi dưỡng, hãy nhớ lại rằng:

  • 68% các quan sát phân phối bình thường nằm trong 1 SD của giá trị trung bình
  • 95% các quan sát phân phối bình thường nằm trong vòng 2 SD của giá trị trung bình
  • 99,7% các quan sát phân phối bình thường nằm trong vòng 3 SD của giá trị trung bình

Các dòng mã sau đây sẽ chọn và thả tất cả các hàng với các giá trị lớn hơn SDX được chỉ định của mỗi cột số. 3 SDS là ngưỡng tiêu chuẩn; Tuy nhiên, 2 SDS có thể được sử dụng cho các bộ dữ liệu nhỏ và 4 SD cho các bộ dữ liệu tương đối lớn.

Sử dụng phạm vi liên vùng (IQR)

Chúng ta có thể sử dụng IQR để xác định các ngoại lệ trong một tính năng đầu vào không tuân theo phân phối bình thường hoặc giống như bình thường. Các giá trị nằm ngoài một ngưỡng được chỉ định (thường là 1,5 lần IQR so với phần trăm thứ 75 và dưới phần trăm thứ 25) được lọc ra để phân tích thêm.

Đoạn mã sau sẽ lọc ra các ngoại lệ từ tất cả các cột số với ngưỡng 1,5.

Yếu tố ngoại lệ địa phương (LOF)

Từ tài liệu của Scikit-Learn, thuật toán LoF là một phương pháp phát hiện bất thường không giám sát, tính toán độ lệch mật độ cục bộ của một điểm dữ liệu nhất định đối với các nước láng giềng. Nó coi là ngoại lệ các mẫu có mật độ thấp hơn đáng kể so với hàng xóm của họ. Giấy ban đầu có thể được tìm thấy ở đây.

Phương thức ________ 14 của

X_train.drop(columns = X_train.columns[X_train.nunique() == 1],
inplace = True)
5 dự đoán liệu mỗi hàng trong một khung dữ liệu có bao gồm các ngoại lệ số (-1) hay không (1). Các hàng có ngoại lệ được đánh dấu là -1 và là 1 nếu không. Một ví dụ đơn giản, thực tế được hiển thị dưới đây:

Một lời cảnh báo với LOF: Nó không cho phép các giá trị null hoặc bị thiếu trong dữ liệu được truyền đến phương thức dự đoán.

Về mặt thống kê áp đặt các giá trị thiếu

Chỉ để nhắc lại các giá trị rõ ràng, thiếu không phải là sự xuất hiện hiếm hoi trong dữ liệu thực tế. Hầu hết các thuật toán ML không thể xử lý các giá trị bị thiếu và sẽ đưa ra một lỗi trong quá trình đào tạo mô hình. Do đó, các giá trị bị thiếu như vậy trong một bộ dữ liệu phải được bỏ qua (cách ngây thơ nhất và để tránh càng nhiều càng tốt - dữ liệu là loại tiền tệ mới!) Hoặc bằng cách nào đó được đưa ra một cách hợp lý.

Một số thống kê mô tả hiệu quả nhất định thường được áp dụng cho việc cắt bỏ như vậy bao gồm:

  • giá trị trung bình của một cột
  • giá trị trung bình của một cột
  • giá trị chế độ của một cột
  • Một số giá trị chung khác

Một vài cách đơn giản để tìm và phát hiện các giá trị thiếu hoặc null là bằng cách thực hiện một trong các chức năng sau:

# display the count of non-null values in each column of a DF
df.info()
# display the count of null values in each column of a DF
df.isnull().sum()

Các giá trị bị thiếu thống kê là khá đơn giản bằng cách sử dụng các hàm tích hợp Python. Các hàm sau đây tính toán thống kê mô tả cho mỗi cột và sử dụng thống kê được tính toán để điền vào tất cả các giá trị trống trong cột cụ thể đó:

# using mean to fill missing values
df.fillna(df.mean(), inplace = True)
# using median to fill missing values
df.fillna(df.median(), inplace = True)
# using mode to fill missing values
df.fillna(df.mode().iloc[0], inplace = True)
# using a specific constant to fill missing values
df.fillna(0, inplace = True)

Tuy nhiên, hãy nhớ rằng thống kê mô tả chỉ nên được tính toán trên bộ dữ liệu đào tạo; Và sau đó, cùng một thống kê nên được sử dụng để áp đặt bất kỳ giá trị bị thiếu nào trong cả dữ liệu đào tạo và kiểm tra. Cách tiếp cận trên hoạt động tốt với việc phân chia tàu/thử nghiệm đơn giản; Tuy nhiên, thực tế trở nên không thể khi đánh giá một mô hình sử dụng xác thực chéo gấp K-vì việc chia tách được thực hiện và lặp lại nhiều lần trong một cuộc gọi hàm.

Scikit-Learn từ

X_train.drop(columns = X_train.columns[X_train.nunique() == 1],
inplace = True)
6 và
X_train.drop(columns = X_train.columns[X_train.nunique() == 1],
inplace = True)
7 đến giải cứu của chúng tôi ở đây.

Thực hiện độc lập X_train.drop(columns = X_train.columns[X_train.nunique() == 1], inplace = True)7

Lớp

X_train.drop(columns = X_train.columns[X_train.nunique() == 1],
inplace = True)
7 tiến hành chuyển đổi dữ liệu thông qua các bước sau:

  • Xác định lớp với loại thống kê mô tả sẽ được sử dụng. Trung bình, trung bình, chế độ và giá trị hằng số cụ thể đều được hỗ trợ
  • Phù hợp với bộ dữ liệu đào tạo để tính toán thống kê cho từng cột dựa trên dữ liệu đào tạo
  • Áp dụng các Itquter được trang bị cho các bộ dữ liệu đào tạo và kiểm tra để gán thống kê được tính toán trong bước thứ 2 cho các giá trị bị thiếu trong cả hai bộ dữ liệu này

Một cuộc biểu tình đơn giản sau:

Thực hiện máy tính đơn giản với đường ống

Đường ống Scikit-Learn, cho phép chúng tôi thực hiện nhiều phép biến đổi dữ liệu một cách tuần tự trước khi áp dụng mô hình ước tính cuối cùng trong một bước duy nhất. Điều này ngăn chặn rò rỉ dữ liệu từ dữ liệu thử nghiệm vào mô hình được đào tạo trong xác thực chéo, bằng cách đảm bảo rằng các mẫu tương tự được sử dụng để đào tạo các máy biến áp và dự đoán (từ tài liệu).

Đó là cách thực hành tốt nhất để sử dụng đường ống khi sử dụng xác thực chéo, như đã được trình bày dưới đây:

Một vòng lặp

from numpy import uniquefor i in range(X_traain.shape[1]):
num = len(unique(X_train.iloc[:, i]))
percentage = float(num) / X_train.shape[0] * 100
print('%d, %d, %.1f%%' % (i, num, percentage))
0 đơn giản cũng có thể được sử dụng để phân tích tất cả bốn chiến lược cắt bỏ khác nhau có sẵn trong
X_train.drop(columns = X_train.columns[X_train.nunique() == 1],
inplace = True)
7:

Trên đây sẽ liệt kê các điểm chính xác trung bình của từng chiến lược cắt bỏ.

Dự đoán biến mục tiêu với dữ liệu mới, trực tiếp với các giá trị bị thiếu tiềm năng đạt được như sau sử dụng đường ống:

# define pipeline
pipeline = Pipeline(steps=['i', SimpleImputer(strategy='mean')),
('m', RandomForestClassifier())])
# fit the model
pipeline.fit(X, y)
# predict on new data using the fitted model
pipeline.predict(new_data)

KNN cắt bỏ các giá trị bị thiếu

Khác với việc sử dụng số liệu thống kê mô tả để áp đặt các giá trị bị thiếu, thuật toán ML cũng có thể được sử dụng để dự đoán chúng. Một mô hình hồi quy đơn giản có thể được sử dụng để dự đoán các giá trị bị thiếu; Tuy nhiên, mô hình hàng xóm K-New nhất (KNN) cũng được tìm thấy là có hiệu quả trong thực tế.

Lớp Scikit-Learn từ

from numpy import uniquefor i in range(X_traain.shape[1]):
num = len(unique(X_train.iloc[:, i]))
percentage = float(num) / X_train.shape[0] * 100
print('%d, %d, %.1f%%' % (i, num, percentage))
2 hỗ trợ KNN Imptution-rất giống với
X_train.drop(columns = X_train.columns[X_train.nunique() == 1],
inplace = True)
7 trong việc sử dụng của nó. Giống như
X_train.drop(columns = X_train.columns[X_train.nunique() == 1],
inplace = True)
7 trước tiên tôi sẽ chứng minh cách sử dụng độc lập của ____ 22 trước khi thực hiện nó trong một đường ống.

Thực hiện Knnimpter với đường ống

Bây giờ hãy để chúng tôi xem làm thế nào nó có thể được thực hiện trong một đường ống để xác nhận hiệu quả:

Chúng tôi cũng có thể áp dụng vòng lặp

from numpy import uniquefor i in range(X_traain.shape[1]):
num = len(unique(X_train.iloc[:, i]))
percentage = float(num) / X_train.shape[0] * 100
print('%d, %d, %.1f%%' % (i, num, percentage))
0 để xem qua nhiều tham số
from numpy import uniquefor i in range(X_traain.shape[1]):
num = len(unique(X_train.iloc[:, i]))
percentage = float(num) / X_train.shape[0] * 100
print('%d, %d, %.1f%%' % (i, num, percentage))
7 để xác định cái tốt nhất dựa trên số liệu chính xác của chúng tôi:

Dự đoán biến mục tiêu với dữ liệu trực tiếp mới có chứa các giá trị bị thiếu đạt được bằng các phương tiện tương tự như đã được trình bày ở trên với

X_train.drop(columns = X_train.columns[X_train.nunique() == 1],
inplace = True)
7.

Sự kết luận

Đó là từ tôi lần này đối với các nhiệm vụ làm sạch dữ liệu cụ thể trong Python cho các dự án học máy.

Hãy liên hệ với tôi nếu bạn muốn thảo luận bất cứ điều gì liên quan đến phân tích dữ liệu và học máy.

Cho đến lần sau - Rock On!

Cảm hứng và tài liệu tham khảo

Jason Brownlee của Machine Learning Mastery

[1] Zheng, A., & Casari, A. (2018). Lời nói đầu. Trong kỹ thuật tính năng cho học máy: Nguyên tắc và kỹ thuật cho các nhà khoa học dữ liệu (tr. VII). Sebastopol, CA: O hèReilly.

[2] Ilyas, I. F., & Chu, X. (2019). Giới thiệu. Trong làm sạch dữ liệu (trang 1). NY: Hiệp hội cho máy móc máy tính.