Chuyển đến nội dung chính

Hướng dẫn Machine Learning với bộ dữ liệu Black Friday

Trong hướng dẫn này, bạn sẽ học cách điền giá trị null, tiền xử lý dữ liệu, giảm chiều bằng PCA và chia dữ liệu bằng K-Fold.
· 10 phút đọc

Khám phá cùng AI

Trước tiên, hãy import thư viện cơ bản cần thiết để làm việc với tập dữ liệu.

import pandas as pd

Bây giờ hãy đọc tập dữ liệu và xem thử.

bfriday = pd.read_csv("BlackFriday.csv")
bfriday.head(10)
dataset

Dòng trên cho ta một phần của tập dữ liệu gồm 10 hàng và tất cả các cột. Nếu bạn thử gọi bfriday.head(x,y) sẽ báo lỗi vì máy tính mặc định lấy tổng số cột là bắt buộc. bfriday.head() cũng sẽ cho bạn kết quả mà không lỗi và máy sẽ tự lấy số hàng và cột theo mặc định của nó.

bfriday.shape #this gives use dimensions of dataset(rows,columns)
(550068, 12)
bfriday['Stay_In_Current_City_Years'].value_counts()# counts the number of values per each range, bfriday['City_Category'].value_counts()
1    193821
2    101838
3     95285
5     84726
0     74398
Name: Stay_In_Current_City_Years, dtype: int64
bfriday.isnull().sum() #colculates no of null values for each category in dataset
User_ID                            0
Product_ID                         0
Gender                             0
Age                                0
Occupation                         0
City_Category                      0
Stay_In_Current_City_Years         0
Marital_Status                     0
Product_Category_1                 0
Product_Category_2            173638
Product_Category_3            383247
Purchase                           0
dtype: int64
b = ['Product_Category_2','Product_Category_3'] #here we are making an array consisting of 2 columns namely Product_Category_2,Product_Category_3
for i in b:
    exec("bfriday.%s.fillna(bfriday.%s.value_counts().idxmax(), inplace=True)" %(i,i))

Bây giờ chúng ta sẽ điền các chỗ trống bằng giá trị xuất hiện nhiều nhất. Bạn cũng có thể làm sạch hoặc điền chỗ trống với bfriday.Product_Category_2.fillna(bfriday.Product_Category_2.value_counts().idxmax(),inplace=True) và tương tự cho cột Product_category_3.

X = bfriday.drop(["Purchase"], axis=1)

Giờ ta đã loại bỏ cột có tên purchase khỏi tập dữ liệu và tạo một mảng tên X gồm tất cả các cột ngoại trừ cột purchase.

from sklearn.preprocessing import LabelEncoder#Now let's import encoder from sklearn library
LE = LabelEncoder()
#Now we will encode the data into labels using label encoder for easy computing
X = X.apply(LE.fit_transform)#Here we applied encoder onto data

Giờ chúng ta sẽ chuyển dữ liệu sang dạng số bằng pandas vì làm việc với dữ liệu số sẽ dễ hơn so với dữ liệu phân loại.

X.Gender = pd.to_numeric(X.Gender)
X.Age = pd.to_numeric(X.Age)
X.Occupation = pd.to_numeric(X.Occupation)
X.City_Category = pd.to_numeric(X.City_Category)
X.Stay_In_Current_City_Years = pd.to_numeric(X.Stay_In_Current_City_Years)
X.Marital_Status = pd.to_numeric(X.Marital_Status)
X.Product_Category_1 = pd.to_numeric(X.Product_Category_1)
X.Product_Category_2 = pd.to_numeric(X.Product_Category_2)
X.Product_Category_3 = pd.to_numeric(X.Product_Category_3)
Y = bfriday["Purchase"]#Here we will made a array named as Y consisting of data from purchase column
from sklearn.preprocessing import StandardScaler
SS = StandardScaler()

Chuẩn hóa đặc trưng bằng cách loại bỏ trung bình và đưa về phương sai đơn vị. Việc căn giữa và chuẩn hóa diễn ra độc lập trên từng đặc trưng bằng cách tính các thống kê liên quan trên các mẫu trong tập huấn luyện. Giá trị trung bình và độ lệch chuẩn sau đó được lưu lại để dùng cho dữ liệu về sau thông qua phương thức transform.

Xs = SS.fit_transform(X)
#You must to transform X into numeric representation (not necessary binary).Because all machine learning methods operate on matrices of number
from sklearn.decomposition import PCA
pc = PCA(4)#here 4 indicates the number of components you want it into.

Giảm chiều tuyến tính bằng cách phân rã giá trị kỳ dị của dữ liệu để chiếu nó sang không gian có số chiều thấp hơn. PCA là một trong những phương pháp giảm chiều nổi tiếng và được dùng nhiều nhất. PCA giúp tăng tốc các thuật toán machine learning; bạn fit PCA chỉ trên tập huấn luyện. Phân tích thành phần chính (PCA).

PCA thay thế các biến gốc bằng các biến mới, gọi là các thành phần chính, có hiệp phương sai bằng 0 và có phương sai giảm dần. Do đó, ma trận hiệp phương sai giữa các thành phần chính được trích xuất từ dữ liệu.

pca
Nguồn: 6.3 - Principal Components Analysis (PCA)

Chúng ta có một điều thú vị ở đây tên là RandomizedPCA

Lưu ý: Không bao giờ dùng RandomizedPCA cho dữ liệu thưa. Việc dùng RandomizedPCA trên dữ liệu thưa là không đúng vì ta không thể căn giữa dữ liệu mà không phá vỡ tính thưa, điều này có thể làm bùng nổ bộ nhớ với dữ liệu thưa kích thước thực tế. Tuy nhiên việc căn giữa là bắt buộc đối với PCA.

principalComponents = pc.fit_transform(X)#Here we are applying PCA to data/fitting data to PCA
pc.explained_variance_ratio_
array([7.35041374e-01, 2.64935995e-01, 1.10061180e-05, 6.21704987e-06])
principalDf = pd.DataFrame(data = principalComponents, columns = ["component 1", "component 2", "component 3", "component 4"])
from sklearn.model_selection import KFold
kf = KFold(20)
#Provides train/test indices to split data in train/test sets. Split dataset into k consecutive folds (without shuffling by default).
#Each fold is then used once as a validation while the k - 1 remaining folds form the training set.
for a,b in kf.split(principalDf):
    X_train, X_test = Xs[a],Xs[b]
    y_train, y_test = Y[a],Y[b]
from sklearn.linear_model import LinearRegression

Hồi quy nhằm xem xét hai điều: (1) một tập biến dự đoán có làm tốt việc dự đoán biến kết quả (phụ thuộc) không? (2) Cụ thể biến nào là bộ dự đoán quan trọng của biến kết quả, và chúng tác động ra sao — thể hiện qua độ lớn và dấu của hệ số beta? Các ước lượng hồi quy này được dùng để giải thích mối quan hệ giữa một biến phụ thuộc và một hoặc nhiều biến độc lập. Dạng đơn giản nhất của phương trình hồi quy với một biến phụ thuộc và một biến độc lập được xác định bởi công thức y = c + b*x, trong đó y = giá trị ước lượng của biến phụ thuộc, c = hằng số, b = hệ số hồi quy, và x = điểm số của biến độc lập.

simple linear regression model
Nguồn: Linear Regression
from sklearn.tree import DecisionTreeRegressor

Một cây quyết định được xây dựng từ trên xuống bắt đầu từ nút gốc và liên quan đến việc chia dữ liệu thành các tập con chứa các mẫu có giá trị tương tự. Cây quyết định xây dựng mô hình dưới dạng cấu trúc cây. Nó chia nhỏ tập dữ liệu thành các tập con ngày càng nhỏ hơn, đồng thời phát triển dần một cây quyết định đi kèm. Kết quả cuối là một cây với các nút quyết định và nút lá. Một nút quyết định (ví dụ, Outlook) có hai hoặc nhiều nhánh (ví dụ, Sunny, Overcast và Rainy), mỗi nhánh đại diện cho giá trị của thuộc tính được kiểm tra. Nút lá (ví dụ, Hours Played) đại diện cho quyết định về mục tiêu số. Nút quyết định trên cùng trong một cây, tương ứng với bộ dự đoán tốt nhất, gọi là nút gốc. Cây quyết định có thể xử lý cả dữ liệu phân loại và dữ liệu số. Cây quyết định mà biến mục tiêu có thể nhận giá trị liên tục (thường là số thực) được gọi là cây hồi quy. Nếu đặt độ sâu tối đa của cây quá cao, cây quyết định sẽ học quá chi tiết từ dữ liệu huấn luyện và học cả nhiễu, tức là bị overfit.

decision tree
Nguồn: Decision Trees
from sklearn.ensemble import RandomForestRegressor

Rừng ngẫu nhiên là một bộ ước lượng huấn luyện nhiều cây quyết định phân loại trên các mẫu con khác nhau của tập dữ liệu và dùng trung bình để cải thiện độ chính xác dự đoán và kiểm soát overfitting. Kích thước mẫu con luôn bằng kích thước mẫu đầu vào gốc nhưng các mẫu được lấy có hoàn lại nếu bootstrap=True. Ý tưởng đằng sau kỹ thuật này là khử tương quan giữa các cây. Nó tạo ra các mẫu bootstrap khác nhau (tức mẫu tự sinh) từ dữ liệu huấn luyện. Sau đó ta giảm phương sai của các cây bằng cách lấy trung bình. Do đó, phương pháp này tạo ra một số lượng lớn cây quyết định trong Python hoặc R. Mô hình rừng ngẫu nhiên rất tốt trong xử lý dữ liệu dạng bảng với đặc trưng số, hoặc đặc trưng phân loại có ít hơn hàng trăm hạng mục. Rừng ngẫu nhiên có khả năng nắm bắt tương tác phi tuyến giữa các đặc trưng và mục tiêu.

Lưu ý: Các mô hình dựa trên cây không được thiết kế để làm việc với đặc trưng rất thưa. Khi xử lý dữ liệu đầu vào thưa, ta có thể tiền xử lý đặc trưng thưa để tạo thống kê số hoặc chuyển sang mô hình tuyến tính, vốn phù hợp hơn cho các tình huống như vậy.

random forest simplified
Nguồn: Random Forest Simple Explanation by William Koehrsen
from sklearn.ensemble import GradientBoostingRegressor

Gradient boosting là một kỹ thuật machine learning cho các bài toán hồi quy và phân loại, tạo ra mô hình dự đoán dưới dạng một tập hợp các mô hình yếu, thường là cây quyết định. Nó xây dựng mô hình theo từng giai đoạn như các phương pháp boosting khác, và khái quát hóa bằng cách cho phép tối ưu một hàm mất mát khả vi bất kỳ. Boosting có thể được hiểu là một thuật toán tối ưu trên một hàm chi phí phù hợp. Hai bài báo sau đã giới thiệu cách nhìn về các thuật toán boosting như những thuật toán hạ gradient hàm theo cách lặp. Tức là, các thuật toán tối ưu một hàm chi phí trên không gian hàm bằng cách lặp lại việc chọn một hàm (giả thuyết yếu) trỏ theo hướng gradient âm. Cách nhìn hạ gradient hàm này đã dẫn đến sự phát triển của các thuật toán boosting trong nhiều lĩnh vực của machine learning và thống kê vượt ra ngoài hồi quy và phân loại. Gradient boosting kết hợp các “người học” yếu thành một người học mạnh theo cách lặp. Dễ giải thích nhất trong bối cảnh hồi quy bình phương tối thiểu, nơi mục tiêu là “dạy” một mô hình F dự đoán giá trị dạng y ^ = F(x) bằng cách tối thiểu hóa sai số bình phương trung bình.

gradient boosting simple version
Nguồn: Gradient Boosting Phần 1 – Hình dung khái niệm
lr = LinearRegression()
dtr = DecisionTreeRegressor()
rfr = RandomForestRegressor()
gbr = GradientBoostingRegressor()
fit1 = lr.fit(X_train,y_train)#Here we fit training data to linear regressor
fit2 = dtr.fit(X_train,y_train)#Here we fit training data to Decision Tree Regressor
fit3 = rfr.fit(X_train,y_train)#Here we fit training data to Random Forest Regressor
fit4 = gbr.fit(X_train,y_train)#Here we fit training data to Gradient Boosting Regressor

Đến giờ bạn đã thấy fit và fit_transform nhưng chưa hiểu chúng là gì? Hãy tìm hiểu ngay.

fit(): Dùng để tạo các tham số của mô hình học từ dữ liệu huấn luyện.

transform(): Các tham số sinh ra từ phương thức fit() được áp dụng lên mô hình để tạo tập dữ liệu đã biến đổi.

fit_transform(): Là sự kết hợp của fit() và transform() trên cùng một tập dữ liệu.

print("Accuracy Score of Linear regression on train set",fit1.score(X_train,y_train)*100)
print("Accuracy Score of Decision Tree on train set",fit2.score(X_train,y_train)*100)
print("Accuracy Score of Random Forests on train set",fit3.score(X_train,y_train)*100)
print("Accuracy Score of Gradient Boosting on train set",fit4.score(X_train,y_train)*100)
Accuracy Score of Linear regression on train set 11.829233894211866
Accuracy Score of Decision Tree on train set 100.0
Accuracy Score of Random Forests on train set 94.207451077798
Accuracy Score of Gradient Boosting on train set 65.49517152859553
print("Accuracy Score of Linear regression on test set",fit1.score(X_test,y_test)*100)
print("Accuracy Score of Decision Tree on test set",fit2.score(X_test,y_test)*100)
print("Accuracy Score of Random Forests on test set",fit3.score(X_test,y_test)*100)
print("Accuracy Score of Gradient Boosting on testset",fit4.score(X_test,y_test)*100)
Accuracy Score of Linear regression on test set 36.8210287243639
Accuracy Score of Decision Tree on test set 57.61911563230391
Accuracy Score of Random Forests on test set 74.71675935214292
Accuracy Score of Gradient Boosting on testset 72.43849411693184

Kết luận

Hướng dẫn này cung cấp một ý tưởng nhanh về cách điền giá trị null. Tôi viết về chủ đề này vì hầu hết thời gian dữ liệu thực tế lộn xộn hơn nhiều do có giá trị null, giá trị sai và rất nhiều “rác” cần được làm sạch. Tuyệt vời! Bạn đã hoàn thành hướng dẫn này. Nếu bạn có bất kỳ câu hỏi hoặc suy nghĩ nào về hướng dẫn, cứ để lại trong phần bình luận bên dưới.

Nếu bạn muốn học thêm về Machine Learning với Python, hãy xem hướng dẫn Giới thiệu về Machine Learning bằng Python và khóa học Tiền xử lý cho Machine Learning bằng Python của DataCamp.

Chủ đề

Liên quan