Tiền xử lý dữ liệu trong Machine Learning, ví dụ cụ thể.
- 02-09-2021
- chuong xuan
- 0 Comments
Tiền xử lý dữ liệu là một bước không thể thiếu trong Machline Learning vì như bạn đã biết, dữ liệu là một phần rất quan trọng, ảnh hưởng trực tiếp tới việc Training Model. Do vậy, tiền xử lý dữ liệu trước khi đưa nó vào model là rất quan trọng, giúp loại bỏ hoặc bù đắp những dữ liệu còn thiếu.
Trong bài viết này tôi sẽ giúp bạn hiểu được các xử lý dữ liệu trước khi đưa vào mô hình như thế nào thông qua một ví dụ cụ thể chứ không chỉ là lý thuyế khô khan.
Đầu tiền chắc chắn là cần tập dữ liệu để các bạn thực hành.
Mục lục
Chuẩn bị dữ liệu.
Các bạn có thể lấy dữ liệu theo link dưới đây. Thì đơn giản đây là dữ liệu gồm 10 row và 4 column, phần sau bạn sẽ hiểu tại sao tôi lại chọn dữ liệu gồm 10 row để thực thi. Dữ liệu thống kê hành vi mua xe của một số người trên các quốc gia, có độ tuổi và mức lương khác nhau. Trong đó cũng có ,một vài dữ liệu bị mất.
dataset = pd.read_csv("data.csv")
Country Age Salary Purchased
0 France 44.0 72000.0 No
1 Spain 27.0 48000.0 Yes
2 Germany 30.0 54000.0 No
3 Spain 38.0 61000.0 No
4 Germany 40.0 NaN Yes
5 France 35.0 58000.0 Yes
6 Spain NaN 52000.0 No
7 France 48.0 79000.0 Yes
8 Germany 50.0 83000.0 No
9 France 37.0 67000.0 Yes
Tách dữ liệu
Xử dụng hàm .iloc[] trong pandas.core để cắt dữ liệu, xác định được đâu là features và đâu là output.
Ví dụ: X = dataset.iloc[:3, :-1] // cắt từ 3 hàng đầu và bỏ cột cuối.
Country Age Salary
0 France 44.0 72000.0
1 Spain 27.0 48000.0
2 Germany 30.0 54000.0
Và để xử lý dữ liệu thì bạn phải chuyển về numpy array với hàm X = dataset.iloc[:3, :-1].values.
Tiền xử lý dữ liệu
Sau đây sẽ là một số khái niệm tôi dùng trong bài viết này:
- Xử lý Missing Data
- Standardization (Phân phối chuẩn)
- Handling Catogrical Variables
- One-hot Encoding
- Multicollinearity
1. Xử lý Missing Data
Trên bất kì loại dataset nào trên thế giới đều có những few null values. Điều đó thì thực sự không tốt khi bạn muốn sử dụng các mô hình như regression (hồi quy) hay classification(phân lớp) hay bất kì các mô hình khác. Chú ý: Trong Python thì NULL cũng được biểu diễn bằng NAN. Do vậy chúng có thể được sử dụng thay thế cho nhau.
Bạn có thể tự thực hiện code bằng cách dùng vòng lặp duyệt quan các phần tử của từng cột xem cột nào có giá trị tương đương isnull() và xử lý.
Trong ví dụ này tôi sẽ hướng dẫn bạn xử dụng thư viện Sklearn giúp bạn dễ dàng xử lý các missing data. SimpleImputer là một class của Sklearn nó hỗ trợ xử lý các missing data là số và thay chúng là một giá trị trung bình của cột, tần suất của dữ liệu suất hiện nhiều nhất,…
from sklearn.impute import SimpleImputer #Create an instance of Class SimpleImputer: np.nan is the empty value in the dataset imputer = SimpleImputer(missing_values=np.nan, strategy='mean') #Replace missing value from numerical Col 1 'Age', Col 2 'Salary' imputer.fit(X[:, 1:3]) #transform will replace & return the new updated columns X[:, 1:3] = imputer.transform(X[:, 1:3]
)
2. Xử lý categorical data
Encode Independent Variables: Giúp chúng ta convert một cột chứa các String thành vector 0 & 1
- Xử dụng ColumnTransformer class và OneHotEncoder của sklearn.
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
Tạo một tuple (‘encoder’ encoding transformation, instance của class OneHotEncoder, [cols muốn transform) và các cols khác bạn không muốn làm gì tới nó thì có thể dùng remainder=”passthrough” để bỏ qua chúng.
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [0])] , remainder="passthrough" )
Fit và transform với input = X và instance ct của class ColumnTransformer
#fit and transform with input = X #np.array: need to convert output of fit_transform() from matrix to np.array X = np.array(ct.fit_transform(X))
Sau khi converting ta được France = [1.0,0.0,0.0] những là đã được one-hot.
Encode Dependent Variables: Nghĩa là chúng ta phải mã hóa các nhãn đầu ra cho máy hiểu.
- Sử dụng Label Encoder để mã hóa các nhãn
from sklearn.preprocessing import LabelEncoder le = LabelEncoder() #output of fit_transform of Label Encoder is already a Numpy Array y = le.fit_transform(y) #y = [0 1 0 0 1 1 0 1 0 1]
Splitting Training set và Test set
- Sử dụng train_test_split của Sklearn-Model Selection để cắt dữ liệu train và test.
- Sử dụng tham số: test_size=… để chia dữ liệu tập test trên toàn bộ dữ liệu.
- random_state = 1: Giúp sử dụng bộ random có sẵn của python.
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 1)
Feature Scaling
Tại sao lại xảy ra FS: Khi mà chúng ta khai phá dữ liệu thì có thể có một số feature có độ lớn hơn hẳn các feature khác do vậy features nhỏ hơn chắc chắn sẽ bị bỏ qua khi chúng ta thực hiện ML Model.
# Note 1: FS không cần áp dụng cho Multi-Regression models vì khi y dự đoán = b0 + b1*x1 + b2*x2 + … + bn*xn thì khi đó (b0, b1, …, bn) là các hệ số để bù lại cho việc chênh lệnh do vậy không cần FS.
# Note 2: Đối với các Categorical Features Encoding cũng không cần áp dụng FS.
#Note3: FS phải được thực hiện sau khi splitting Training và Test sets. Do nếu chúng ta sử dụng FS trước khi splitting training & test sets thì dữ liệu sẽ bị mất đi tính đúng.
Vậy làm sao để feature scaling.
Có 2 kĩ thuật để làm điều này là:
- Standardisation: Biến đổi dữ liệu sao cho giá trị trung bình là 0 và standard deviation là 1.
Trên dữ liệu này bạn có thể thấy số Age và Salary có độ chênh lệnh nhau khá nhiều do vậy dữ liệu của Age có thể không được sử dụng trong model. Do vậy chúng ta cần chuẩn hóa dữ liệu đưa chúng về số nhỏ hơn và vẫn đảm bảo tính tương quan của dữ liệu.
Bạn có thể sử dụng StandardScaler của sklearn.preprocessing để Std cho dữ liệu.
from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train[:,3:] = sc.fit_transform(X_train[:,3:]) #only use Transform to use the SAME scaler as the Training Set X_test[:,3:] = sc.transform(X_test[:,3:])
- Normalisation: Làm cho tập dữ liệu giao động trong khoảng từ 0 đến 1.