[Nhập môn Machine Learning] Bài 9: Giới thiệu các thư viện Numpy, Matplotlib, Pandas (P2: Matplotlib và Pandas)


Ở bài viết này, chúng ta lại tiếp tục tìm hiểu về 2 thư viện còn lại là Matplotlib và Pandas. Các bạn có thể tự hỏi rằng tại sao chúng ta cần phải biết thêm 2 thư viện này trong khi chỉ với Numpy chúng ta đã có thể cài đặt thuật toán Linear Regression rồi. Đúng là như vậy, nhưng Numpy chỉ giúp chúng ta về mặt tính toán chứ không giúp ta hiểu được hoạt động của thuật toán đó. Thay vào đó, biểu đồ và bảng biểu sẽ giúp ta có cái nhìn rõ ràng hơn những vấn đề đang xảy ra với thuật toán ta đang sử dụng. Ví dụ như Cost Function của chúng ta đang tăng hay giảm, tăng mạnh hay không, những điều đó chúng ta rất khó có thể nhận ra mà phải cần đến một công cụ có thể chuyển số liệu thành hình ảnh. Đó là chỗ mà Matplotlib nhảy vào để hỗ trợ chúng ta.

Pandas cũng không phải ngoại lệ, thông thường các dữ liệu của bạn đều được tải từ một tệp tin, phổ biến nhất là tệp .csv (Comma Separated Value), vào trong chương trình. Pandas có sẵn những hàm để làm việc này. Chưa kể đến chúng ta còn phải xử lý, dọn dẹp trước dữ liệu trước khi ta đưa chúng vào thuật toán.

Matplotlib

Chúng ta thường tương tác với module pyplot trong matplotlib là chủ yếu, vậy nên chúng ta cần import module này trước khi sử dụng nó
import matplotlib.pyplot as plt
Matplotlib hoạt động ổn với mảng bình thường cũng như mảng của Numpy. Nhưng để nhất quán, trong bài viết này mình sẽ chỉ sử dụng mảng của Numpy, và vì thế nên chúng ta cũng cần phải import nó nữa.
import numpy as np

Biểu đồ đường (line plot)

Đây có lẽ là biểu đồ thường được dùng nhiều nhất khi làm Machine Learning. Ta sử dụng hàm plot() trong pyplot để làm điều này, hàm này cần ít nhất hai tham số đó là:
  • Mảng chứa các tọa độ x của các điểm trong đồ thị
  • Mảng chứa các tọa độ y tương ứng của các điểm trong đồ thị
Các tham số mà hàm này cần để vẽ cũng giống như cách chúng ta vẽ biểu đồ đường cần phải liệt kê một vài điểm tọa độ rồi nối chúng lại với nhau vậy. Các bạn có thể tham khảo thêm ở đoạn code ở dưới.
# Tạo một mảng numpy từ 0 -> 5
x = np.arange(0, 6)

# Tạo một mảng numpy với giá trị của các phần tử trong x mũ 2
y = x**2

# Tạo một biểu đồ đường
plt.plot(x, y)

# Hiển thị biểu đồ đường ra màn hình
# Đừng quên dòng này. Nếu không, bạn sẽ không thấy gì cả
plt.show()
Kết quả:

Chúc mừng, bạn vừa mới vẽ biểu đồ đầu tiên của mình chỉ bằng code. Tuy nhiên, đồ thị này vẫn chưa mượt như ta mong muốn. Đó là vì chúng ta chỉ sử dụng 5 điểm để vẽ. Tuy nhiên, ta có thể làm cho nó mượt hơn bằng cách tăng số điểm lên. Trong hàm arange của numpy có một tham số thứ 3 là step. Ta có thể giảm step xuống để tăng số điểm lên.
x = np.arange(0, 6, 0.05) # Giảm step xuống còn 0.05 thay vì 1 (mặc định)
y = x**2                  # Tức là 100 điểm tọa độ tất cả (từ 0 đến 1 có 20 điểm)
plt.plot(x, y)
plt.show()
Kết quả:

Mượt hơn rồi đúng không? Điều tuyệt vời hơn cả là bây giờ bạn đã có công cụ để vẽ tất cả các dạng hàm bạn có thể nghĩ ra. Dưới đây là một vài ví dụ, nhưng mình sẽ để các bạn tự tìm ra cách làm coi như là một bài tập dành cho bạn.

Chú ý: Khi cửa sổ hiển thị biểu đồ của bạn vẫn chưa đóng, chương trình của bạn vẫn coi như đang chạy trên cửa sổ terminal. Hãy đóng cửa sổ đó lại để dừng chương trình python.

Ngoài việc đơn giản là plot, ta cũng có thể chỉnh sửa nét vẽ trên biểu đồ như là vẽ nét đứt, vẽ hình tròn, hình tam giác ở các điểm thay vì nối chúng lại với nhau, ... Nhưng mình thấy bản thân xài khá ít nên sẽ không đề cập ở đây.

Các bạn có thể tham khảo thêm tại đây: matplotlib.pyplot.plot()

Biểu đồ điểm (scatter plot)

Là hàm scatter() trong matplotlib, hàm này cũng lấy 2 tham số là x, y là tọa độ các điểm cần vẽ.
t = np.arange(0, 2*np.pi, 0.1)

x = np.cos(t)
y = np.sin(t)

plt.scatter(x,y)
plt.show()
Kết quả:

Đối với hàm này thì mình có hay dùng thêm 2 tham số marker với color (2 tham số này cũng có ở hàm plot()). Dưới đây là một ví dụ.
t = np.arange(0, 2*np.pi, 0.1)

x = np.cos(t)
y = np.sin(t)

plt.scatter(x,y, marker = 'x', color = 'red') # vẽ những dấu gạch chéo màu đỏ
plt.show()

Tìm hiểu thêm:

Biểu đồ Contour

Contour là một biểu đồ dùng để biểu diễn mặt phẳng trong không gian ba chiều xuống thành hai chiều. Bằng cách vẽ các đường đồng mức là các đường mà trên đó, giá trị của chiều thứ ba là bằng nhau. Ví dụ, đây là đồ thị contour của hàm số z=x2+y2z = x^2 + y^2.

Ta có thể thấy mặt phẳng của nó có dạng một cái tô trong không gian ba chiều.

Ta có thể sử dụng hàm contour() để vẽ biểu đồ contour. Tuy nhiên trước đó ta cần biết đến meshgrid() trong Numpy đã. Giả sử ta cần biểu thị tọa độ x từ 0 đến 2 và y từ 0 đến 1. Vậy ta có thể tạo ra hai danh sách gồm các giá trị của x và của y. Nhưng contour() nhận ba tọa độ x, y, z theo một cách đặc biệt như thế này.

Và thay vì ta phải code tay hai ma trận x, y như trong hình, ta có thể sử dụng hàm meshgrid để tạo ra hai ma trận này từ hai dãy chứa giá trị tọa độ của x và y. sau đó, ta chỉ cần sử dụng các tính chất của ma trận ndarray để tính ra z.

Đoạn code để tạo một biểu đồ contour như sau
import numpy as np
import matplotlib.pyplot as plt

# Tạo hai dãy bao gồm các tọa độ x và y 
# từ -10 đến 10 và tổng cộng 20 tọa độ tất cả 
x = np.linspace(-10,10,20)
y = np.linspace(-10,10,20)

# Tạo meshgrid. XX và YY là hai ma trận có kích thước 20x20 
# Công thức chung để xác định kích thước là (số tọa độ y) x (số tọa độ x)
XX, YY = np.meshgrid(x,y)

# Tính các giá trị Z
Z = np.sqrt(XX**2 +YY**2)

# Vẽ biểu đồ
cs = plt.contour(XX, YY, Z)
# Hiển thị giá trị của các đường đồng mức
plt.clabel(cs)
# Hiển thị biểu đồ
plt.show()
Kết quả:

Ta cũng có thể tăng số đường đồng mức muốn hiện thị lên bằng cách truyền tham số thứ 4 vào contour() là số đường đồng mức.
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-10,10,20)
y = np.linspace(-10,10,20)

XX, YY = np.meshgrid(x,y)

Z = np.sqrt(XX**2 +YY**2)

cs = plt.contour(XX, YY, Z, 10) # <-- Hiển thị 10 đường đồng mức
plt.clabel(cs)
plt.show()

Tạm thời, đây là các đồ thị quan trọng trong việc tìm hiểu Machine Learning nhưng đó cũng chỉ là một số nhỏ các đồ thị mà Matplotlib có thể cung cấp. Để có thể tìm hiểu thêm, các bạn có thể đọc thêm tại:

https://matplotlib.org/3.1.1/tutorials/introductory/sample_plots.html

Pandas

Như các bạn đã biết, Machine Learning hoạt động dựa trên dataset. Bây giờ, điều chúng ta quan tâm là làm sao để lấy dataset từ file vào bộ nhớ làm việc của máy tính. Pandas có thể là việc đó bằng câu lệnh sau
# import thư viện
import pandas as pd

# Truyền địa chỉ tương đối từ file .py đến file .csv 
dataset = pd.read_csv('path/to/filename.csv')

# Để dễ dàng, bạn có thể để chúng vào cùng một thư mục  và sử dụng
dataset = pd.read_csv('filename.csv)

print(type(dataset))
# In ra 5 mẫu đầu trong dataset
print(dataset.head())
Lúc này, Pandas sẽ trả lại cho chúng ta một Dataframe, là một dạng đối tượng đặc biệt của thư viện này, nhưng hiện giờ chúng ta chưa cần quan tâm đến nó. Ta chỉ cần rút trích các giá trị mà Pandas đọc được và lưu dưới dạng ndarray (để dễ dàng xử lý) bằng lệnh.
data = dataset.to_numpy() # Chuyển Dataframe thành ndarray

print(type(data))
print(data.shape)
print(data)

Tổng kết

Vậy là ta đã có một cuộc làm quen nhanh để bắt đầu cài đặt những thuật toán Machine Learning. Mặc dù không đầy đủ nhưng như vậy là đã đủ để chúng ta bắt đầu những bước đi đầu tiên. Các bạn hãy để lại bình luận góp ý ở bên dưới để mình có thể cải thiện chất lượng bài đọc của mình. Cảm ơn các bạn đã đọc.

Nhận xét

Bài đăng phổ biến từ blog này

Phép phân tích ma trận A=LU

Thuật toán tính lũy thừa nhanh. Giải thích một cách đơn giản

Độc lập tuyến tính và phụ thuộc tuyến tính