Python là ngôn ngữ lập trình dễ học, khiến nó trở thành lựa chọn ưu tiên nhất cho người mới bắt đầu trong Khoa học dữ liệu, Phân tích dữ liệu và Học máy. Nó cũng có một cộng đồng người học trực tuyến tuyệt vời và các thư viện tập trung vào dữ liệu tuyệt vời
Với rất nhiều dữ liệu được tạo ra, điều quan trọng là dữ liệu chúng tôi sử dụng cho các ứng dụng Khoa học dữ liệu như Học máy và Mô hình dự đoán phải sạch. Nhưng ý nghĩa của dữ liệu sạch là gì?
Dữ liệu bẩn đơn giản có nghĩa là dữ liệu bị lỗi. Hồ sơ trùng lặp, dữ liệu không đầy đủ hoặc lỗi thời và phân tích cú pháp không đúng cách có thể làm cho dữ liệu bị bẩn. Dữ liệu này cần được làm sạch. Làm sạch dữ liệu [hay làm sạch dữ liệu] đề cập đến quá trình “làm sạch” dữ liệu bẩn này, bằng cách xác định các lỗi trong dữ liệu và sau đó khắc phục chúng
Làm sạch dữ liệu là một bước quan trọng trong dự án Machine Learning và chúng tôi sẽ đề cập đến một số kỹ thuật làm sạch dữ liệu cơ bản [bằng Python] trong bài viết này
Làm sạch dữ liệu trong Python
Chúng ta sẽ tìm hiểu thêm về cách làm sạch dữ liệu trong Python với sự trợ giúp của tập dữ liệu mẫu. Chúng tôi sẽ sử dụng bộ dữ liệu nhà ở của Nga trên Kaggle
Chúng tôi sẽ bắt đầu bằng cách nhập các thư viện cần thiết
# import libraries import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline
Tải xuống dữ liệu, sau đó đọc dữ liệu đó vào Khung dữ liệu Pandas bằng cách sử dụng hàm read_csv[] và chỉ định đường dẫn tệp. Sau đó sử dụng thuộc tính shape để kiểm tra số hàng và số cột trong tập dữ liệu. Mã cho điều này là như dưới đây
df = pd.read_csv['housing_data.csv'] df.shape
Tập dữ liệu có 30.471 hàng và 292 cột
Bây giờ chúng ta sẽ tách các cột số khỏi các cột phân loại
# select numerical columns df_numeric = df.select_dtypes[include=[np.number]] numeric_cols = df_numeric.columns.values # select non-numeric columns df_non_numeric = df.select_dtypes[exclude=[np.number]] non_numeric_cols = df_non_numeric.columns.values
Bây giờ chúng ta đã hoàn thành các bước sơ bộ. Bây giờ chúng ta có thể chuyển sang làm sạch dữ liệu. Chúng tôi sẽ bắt đầu bằng cách xác định các cột chứa giá trị bị thiếu và cố gắng khắc phục chúng
Giá trị bị mất
Chúng tôi sẽ bắt đầu bằng cách tính phần trăm giá trị bị thiếu trong mỗi cột, sau đó lưu trữ thông tin này trong DataFrame
# % of values missing in each column values_list = list[] cols_list = list[] for col in df.columns: pct_missing = np.mean[df[col].isnull[]]*100 cols_list.append[col] values_list.append[pct_missing] pct_missing_df = pd.DataFrame[] pct_missing_df['col'] = cols_list pct_missing_df['pct_missing'] = values_list
Khung dữ liệu pct_missing_df hiện chứa tỷ lệ phần trăm giá trị bị thiếu trong mỗi cột cùng với tên cột
Chúng tôi cũng có thể tạo hình ảnh trực quan từ thông tin này để hiểu rõ hơn bằng cách sử dụng mã bên dưới
pct_missing_df.loc[pct_missing_df.pct_missing > 0].plot[kind='bar', figsize=[12,8]] plt.show[]
Đầu ra sau khi thực hiện dòng mã trên sẽ trông như thế này
Rõ ràng là một số cột có rất ít giá trị bị thiếu, trong khi các cột khác có % giá trị bị thiếu đáng kể. Bây giờ chúng tôi sẽ sửa các giá trị còn thiếu này
Có một số cách để chúng tôi có thể khắc phục các giá trị bị thiếu này. Một số trong số họ là”
Thả quan sát
Một cách có thể là loại bỏ những quan sát chứa bất kỳ giá trị null nào trong chúng cho bất kỳ cột nào. Điều này sẽ hoạt động khi tỷ lệ phần trăm giá trị bị thiếu trong mỗi cột rất ít. Chúng tôi sẽ loại bỏ các quan sát chứa null trong các cột có ít hơn 0. 5% không. Các cột này sẽ là metro_min_walk, metro_km_walk, Railroad_station_walk_km, Railroad_station_walk_min và ID_railroad_station_walk
less_missing_values_cols_list = list[pct_missing_df.loc[[pct_missing_df.pct_missing < 0.5] & [pct_missing_df.pct_missing > 0], 'col'].values] df.dropna[subset=less_missing_values_cols_list, inplace=True]
Điều này sẽ giảm số lượng bản ghi trong tập dữ liệu của chúng tôi xuống còn 30.446 bản ghi
Xóa cột [tính năng]
Một cách khác để giải quyết các giá trị bị thiếu trong tập dữ liệu là loại bỏ các cột hoặc tính năng có tỷ lệ phần trăm giá trị bị thiếu đáng kể. Các cột như vậy không chứa nhiều thông tin và có thể bị loại bỏ hoàn toàn khỏi tập dữ liệu. Trong trường hợp của chúng tôi, hãy để chúng tôi loại bỏ tất cả các cột có hơn 40% giá trị bị thiếu trong đó. Các cột này sẽ là build_year, state, Hospital_beds_raion, cafe_sum_500_min_price_avg, cafe_sum_500_max_price_avg và cafe_avg_price_500
# dropping columns with more than 40% null values _40_pct_missing_cols_list = list[pct_missing_df.loc[pct_missing_df.pct_missing > 40, 'col'].values] df.drop[columns=_40_pct_missing_cols_list, inplace=True]
Số lượng các tính năng trong tập dữ liệu của chúng tôi hiện là 286
Áp đặt các giá trị còn thiếu
Vẫn còn thiếu dữ liệu trong bộ dữ liệu của chúng tôi. Bây giờ chúng ta sẽ gán các giá trị còn thiếu trong mỗi cột số với giá trị trung bình của cột đó
df_numeric = df.select_dtypes[include=[np.number]] numeric_cols = df_numeric.columns.values for col in numeric_cols: missing = df[col].isnull[] num_missing = np.sum[missing] if num_missing > 0: # impute values only for columns that have missing values med = df[col].median[] #impute with the median df[col] = df[col].fillna[med]
Các giá trị bị thiếu trong các cột số hiện đã được sửa. Trong trường hợp cột phân loại, chúng tôi sẽ thay thế các giá trị bị thiếu bằng các giá trị chế độ của cột đó
________số 8_______Tất cả các giá trị còn thiếu trong tập dữ liệu của chúng tôi hiện đã được xử lý. Chúng tôi có thể xác minh điều này bằng cách chạy đoạn mã sau
df.isnull[].sum[].sum[]
Nếu đầu ra bằng 0, điều đó có nghĩa là không còn thiếu giá trị nào trong tập dữ liệu của chúng tôi bây giờ
Chúng tôi cũng có thể thay thế các giá trị bị thiếu bằng một giá trị cụ thể [như -9999 hoặc 'thiếu'] sẽ cho biết thực tế là dữ liệu bị thiếu ở vị trí này. Điều này có thể thay thế cho việc quy nạp giá trị còn thiếu
ngoại lệ
Một ngoại lệ là một quan sát bất thường nằm cách xa phần lớn dữ liệu. Các ngoại lệ có thể ảnh hưởng đáng kể đến hiệu suất của mô hình Machine Learning. Do đó, điều quan trọng là phải xác định các ngoại lệ và xử lý chúng.
Hãy để chúng tôi lấy cột 'life_sq' làm ví dụ. Đầu tiên chúng ta sẽ sử dụng phương thức description[] để xem xét các số liệu thống kê mô tả và xem liệu chúng ta có thể thu thập bất kỳ thông tin nào từ nó không
df = pd.read_csv['housing_data.csv'] df.shape0
Đầu ra sẽ trông như thế này
df = pd.read_csv['housing_data.csv'] df.shape1
Từ đầu ra, rõ ràng là có điều gì đó không đúng. Giá trị tối đa dường như lớn bất thường so với giá trị trung bình và trung bình. Hãy để chúng tôi tạo một boxplot dữ liệu này để hiểu rõ hơn
df = pd.read_csv['housing_data.csv'] df.shape2
Đầu ra sẽ trông như thế này
Rõ ràng từ boxplot rằng quan sát tương ứng với giá trị tối đa [7478] là một ngoại lệ trong dữ liệu này. Thống kê mô tả, biểu đồ hộp và biểu đồ phân tán giúp chúng tôi xác định các giá trị ngoại lệ trong dữ liệu
Chúng ta có thể xử lý các giá trị ngoại lai giống như cách chúng ta xử lý các giá trị còn thiếu. Chúng tôi có thể loại bỏ các quan sát mà chúng tôi cho là ngoại lệ hoặc chúng tôi có thể thay thế các ngoại lệ bằng các giá trị phù hợp hoặc chúng tôi có thể thực hiện một số loại chuyển đổi trên dữ liệu [như nhật ký hoặc hàm mũ]. Trong trường hợp của chúng tôi, hãy bỏ bản ghi có giá trị của 'life_sq' là 7478
df = pd.read_csv['housing_data.csv'] df.shape3
Bản ghi trùng lặp
Dữ liệu đôi khi có thể chứa các giá trị trùng lặp. Điều quan trọng là phải xóa các bản ghi trùng lặp khỏi tập dữ liệu của bạn trước khi bạn tiến hành bất kỳ dự án Machine Learning nào. Trong dữ liệu của chúng tôi, vì cột ID là mã định danh duy nhất nên chúng tôi sẽ loại bỏ các bản ghi trùng lặp bằng cách xem xét tất cả trừ cột ID
df = pd.read_csv['housing_data.csv'] df.shape4
Điều này sẽ giúp chúng tôi loại bỏ các bản ghi trùng lặp. Bằng cách sử dụng phương thức shape, bạn có thể kiểm tra xem các bản ghi trùng lặp đã thực sự bị loại bỏ chưa. Số lượng quan sát hiện tại là 30.434
Sửa kiểu dữ liệu
Thông thường trong tập dữ liệu, các giá trị không được lưu trữ theo đúng kiểu dữ liệu. Điều này có thể tạo ra sự cố trong các giai đoạn sau và chúng tôi có thể không nhận được đầu ra mong muốn hoặc có thể gặp lỗi khi thực hiện. Một lỗi kiểu dữ liệu phổ biến là với ngày tháng. Ngày thường được phân tích thành đối tượng trong Python. Có một loại dữ liệu riêng cho ngày trong Pandas, được gọi là DateTime
Trước tiên, chúng tôi sẽ kiểm tra loại dữ liệu của cột dấu thời gian trong dữ liệu của chúng tôi
df = pd.read_csv['housing_data.csv'] df.shape5
Điều này trả về kiểu dữ liệu 'đối tượng'. Bây giờ chúng tôi biết dấu thời gian không được lưu trữ chính xác. Để khắc phục điều này, hãy chuyển đổi cột dấu thời gian sang định dạng DateTime
df = pd.read_csv['housing_data.csv'] df.shape6
Bây giờ chúng tôi có dấu thời gian ở định dạng chính xác. Tương tự, có thể có các cột lưu trữ số nguyên dưới dạng đối tượng. Việc xác định các tính năng như vậy và sửa loại dữ liệu là rất quan trọng trước khi bạn tiếp tục với Machine Learning. May mắn thay cho chúng tôi, chúng tôi không có bất kỳ vấn đề nào như vậy trong tập dữ liệu của mình
Ghi chú cuối
Trong bài viết này, chúng ta đã thảo luận về một số cách cơ bản để chúng ta có thể làm sạch dữ liệu trong Python trước khi bắt đầu với dự án Machine Learning của mình. Chúng tôi cần xác định và xóa các giá trị bị thiếu, xác định và xử lý các giá trị ngoại lệ, xóa các bản ghi trùng lặp và sửa loại dữ liệu của tất cả các cột trong tập dữ liệu của chúng tôi trước khi chúng tôi tiến hành tác vụ ML của mình
Tác giả của bài viết này là Vishesh Arora. Bạn có thể kết nối với tôi trên LinkedIn
Phương tiện được hiển thị trong bài viết này về Nhận dạng ngôn ngữ ký hiệu không thuộc sở hữu của Analytics Vidhya và được sử dụng theo quyết định của Tác giả