Giới Thiệu Thư Viện Scikit-Learn Trong Python

Thư viện Scikit-learn

Trong bài này chúng ta sẽ cùng tìm hiểu thư viện Scikit-learn trong Python: Scikit-learn là gì, các tính năng chính, cách cài đặt và 3 ứng dụng phổ biến là phân loại, hồi quy, phân cụm kèm code chạy được.

Học máy (machine learning) nghe thì to tát, nhưng ý tưởng rất đời thường: cho máy xem thật nhiều ví dụ để nó tự rút ra quy luật. Giống như bạn nhìn đủ nhiều quả xoài thì tự biết quả nào chín quả nào xanh, dù không ai đưa công thức. Scikit-learn giúp bạn làm việc đó chỉ với vài dòng code nhé.

Thư viện Scikit-learn trong Python là gì?

Scikit-learn (hay gọi tắt là sklearn) là thư viện học máy phổ biến nhất của Python. Nó cung cấp sẵn công cụ cho cả quy trình: xử lý dữ liệu ban đầu, chọn mô hình, huấn luyện, đánh giá và tối ưu tham số.

Scikit-learn được xây dựng trên nền NumPy, SciPy và Matplotlib, nên nếu bạn đã đọc các bài trước trong serie thì sẽ thấy dữ liệu đầu vào rất quen thuộc.

Viết mã nhập từ thư viện Scikit-Learn
Hình 1. Viết mã nhập từ thư viện Scikit-Learn

Những tính năng quan trọng của thư viện Scikit-learn

Các tính năng chính của Scikit-learn:

  • Tiền xử lý dữ liệu (preprocessing): chuẩn hóa dữ liệu, xử lý giá trị bị thiếu, mã hóa biến phân loại thành số.

  • Mô hình học máy: có sẵn rất nhiều mô hình như hồi quy, cây quyết định, rừng ngẫu nhiên, SVM, mạng neuron đơn giản.

Thư viện Scikit-Learn trong ngành học máy
Hình 2. Thư viện Scikit-Learn trong ngành học máy
  • Đánh giá mô hình: các công cụ như ROC curve, kiểm định chéo (cross-validation) để biết mô hình tốt đến đâu.

  • Tối ưu tham số: tự động tìm bộ tham số tốt nhất bằng tìm kiếm lưới (grid search) hoặc tìm kiếm ngẫu nhiên (random search).

Tại sao chúng ta phải sử dụng thư viện Scikit-learn?

Một số lý do khiến Scikit-learn được dùng nhiều đến vậy:

  1. Đủ bộ công cụ: từ xử lý dữ liệu đến huấn luyện và đánh giá mô hình đều nằm trong một thư viện.
  2. Miễn phí, mã nguồn mở: cộng đồng rất lớn, tài liệu và ví dụ có sẵn khắp nơi.
  3. Nhiều mô hình, cùng một cách dùng: mô hình nào cũng có fit() để huấn luyện và predict() để dự đoán. Đổi mô hình chỉ cần sửa đúng một dòng, rất tiện để thử nghiệm xem mô hình nào hợp với bài toán.
  4. Tiền xử lý dữ liệu tốt: đây là bước tốn thời gian nhất trong mọi dự án học máy, và sklearn làm rất gọn.
  5. Tối ưu tham số tự động: không phải ngồi thử tay từng bộ tham số.
Áp dụng mô hình Scikit-Learn vào app Java
Hình 3. Áp dụng mô hình Scikit-Learn vào app Java

Cài đặt thư viện Scikit-learn trong Python

Cài Scikit-learn bằng pip:

  1. Mở command prompt hoặc terminal.

  2. Chạy lệnh cài đặt:

pip install -U scikit-learn

Tham số -U (upgrade) để cài hoặc nâng lên bản mới nhất. Nếu muốn cài đúng một phiên bản cụ thể thì bỏ -U và ghi rõ phiên bản, ví dụ pip install scikit-learn==1.3.2.

  1. Chờ quá trình cài đặt hoàn tất.

Cài xong thì import vào để kiểm tra:

import sklearn

Không báo lỗi là cài thành công. Để ý tên cài là scikit-learn nhưng tên import lại là sklearn nhé.

Các kiểu dữ liệu trong thư viện Scikit-learn trong Python

Scikit-learn nhận dữ liệu đầu vào ở nhiều dạng:

  1. NumPy array: dạng phổ biến nhất, mảng nhiều chiều chứa dữ liệu số.
  2. Pandas DataFrame: dữ liệu dạng bảng có tên cột, thường đọc từ file CSV.
  3. SciPy sparse matrix: ma trận thưa, tức là ma trận mà hầu hết phần tử bằng 0, dùng để tiết kiệm bộ nhớ.
  4. Python list: dùng được nhưng ít dùng vì chậm hơn NumPy.

Ngoài ra sklearn có các công cụ biến đổi dữ liệu như LabelEncoder để chuyển nhãn dạng chữ (ví dụ “setosa”, “versicolor”) thành số nguyên mà mô hình hiểu được.

Những ứng dụng phổ biến trong thư viện Scikit-learn

3 bài toán học máy cơ bản nhất mà Scikit-learn hỗ trợ là phân loại, hồi quy và phân cụm. Mỗi phần dưới đây có một ví dụ chạy được ngay, dùng bộ dữ liệu có sẵn trong sklearn nên không cần tải thêm gì.

1. Phân loại

Phân loại (classification) là bài toán xác định một điểm dữ liệu thuộc nhóm nào. Ví dụ: từ số đo cánh hoa, đoán xem bông hoa thuộc loài nào. Các thuật toán phân loại có trong sklearn: cây quyết định, rừng ngẫu nhiên, hồi quy logistic…

Ví dụ:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# Load iris dataset
iris = load_iris()

# Split data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42)

# Create logistic regression model
model = LogisticRegression(max_iter=200)

# Train the model
model.fit(X_train, y_train)

# Make predictions on the testing set
y_pred = model.predict(X_test)

# Evaluate the accuracy of the model
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

Kết quả:

Accuracy: 1.0

Dữ liệu được chia làm 2 phần: 70% để huấn luyện (train), 30% để kiểm tra (test). Mô hình học trên tập train, sau đó dự đoán trên tập test mà nó chưa từng thấy. Accuracy 1.0 nghĩa là đoán đúng 100% số bông hoa trong tập test.

Lưu ý: Luôn đánh giá mô hình trên dữ liệu mà nó chưa được học. Nếu dùng chính tập train để kiểm tra thì độ chính xác lúc nào cũng rất cao, nhưng đem ra dữ liệu thật lại đoán sai bét. Tham số random_state=42 giúp mỗi lần chạy chia dữ liệu giống nhau, để kết quả của bạn khớp với bài viết.

2. Hồi quy

Hồi quy (regression) dùng để dự đoán một giá trị số liên tục dựa trên các biến đầu vào. Ví dụ: dự đoán giá nhà từ diện tích, số phòng. Các thuật toán hồi quy trong sklearn: hồi quy tuyến tính, cây quyết định, rừng ngẫu nhiên…

Ví dụ: dùng bộ dữ liệu bệnh tiểu đường có sẵn trong sklearn, dự đoán chỉ số tiến triển bệnh sau một năm từ 10 chỉ số sức khỏe của bệnh nhân.

from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# Load diabetes dataset
diabetes = load_diabetes()

# Split data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(diabetes.data, diabetes.target, test_size=0.3, random_state=42)

# Create linear regression model
model = LinearRegression()

# Train the model
model.fit(X_train, y_train)

# Make predictions on the testing set
y_pred = model.predict(X_test)

# Evaluate the performance of the model
mse = mean_squared_error(y_test, y_pred)
print("Mean squared error:", mse)

Kết quả:

Mean squared error: 2821.7509810013107

MSE (sai số bình phương trung bình) càng nhỏ thì mô hình dự đoán càng sát.

Lưu ý: Nhiều tài liệu cũ dùng bộ dữ liệu giá nhà Boston với hàm load_boston(). Hàm này đã bị xóa từ scikit-learn 1.2, chạy sẽ báo ImportError. Thay bằng load_diabetes() như trên, hoặc fetch_california_housing() nếu muốn dùng dữ liệu giá nhà.

3. Phân cụm

Phân cụm (clustering) là chia dữ liệu thành các nhóm có đặc điểm giống nhau, mà không cần biết trước nhãn. Khác với phân loại, ở đây không ai nói cho máy biết điểm nào thuộc nhóm nào, máy tự tìm ra. Các thuật toán phân cụm trong sklearn: K-Means, DBSCAN…

Ví dụ: tạo 1000 điểm ngẫu nhiên quanh 4 tâm, rồi dùng K-Means tìm lại 4 cụm đó.

from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# Generate synthetic data
X, y = make_blobs(n_samples=1000, centers=4, n_features=2, random_state=0)

# Create KMeans model
model = KMeans(n_clusters=4, n_init=10, random_state=0)

# Fit the model and get cluster labels
labels = model.fit_predict(X)

# Plot the clusters and their centers
plt.scatter(X[:, 0], X[:, 1], c=labels, s=10)
plt.scatter(model.cluster_centers_[:, 0], model.cluster_centers_[:, 1], c='red', marker='x', s=200)
plt.title("KMeans clustering")
plt.show()

fit_predict() vừa huấn luyện vừa trả về nhãn cụm của từng điểm. Đồ thị sẽ hiện 4 cụm điểm với 4 màu khác nhau, dấu X đỏ là tâm của mỗi cụm mà K-Means tìm được.

Kết

Scikit-learn có một điểm rất hay: mô hình nào cũng dùng chung bộ hàm fit(), predict(). Nắm được 3 ví dụ phân loại, hồi quy, phân cụm ở trên là bạn đã có khung sườn để thử bất kỳ mô hình nào khác trong thư viện.

Nếu thấy bài viết này hay, hãy chia sẻ tới bạn bè đang học Python nhé. Và nếu thắc mắc điều gì, hãy để lại bình luận bên dưới.

5/5 - (1 bình chọn)

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *