Ứng dụng của TF-IDF và Logistic Regression trong phân tích dữ liệu với Scikit-learn

28/10/2025    102    4.9/5 trong 5 lượt 
Ứng dụng của TF-IDF và Logistic Regression trong phân tích dữ liệu với Scikit-learn
TF-IDF và Logistic Regression là hai công cụ mạnh mẽ trong xử lý và phân tích dữ liệu văn bản. Bằng cách kết hợp với thư viện Scikit-learn, ta có thể dễ dàng triển khai các mô hình dự đoán hiệu quả. Bài viết này sẽ hướng dẫn bạn cách sử dụng TF-IDF và Logistic Regression để phân loại cảm xúc từ dữ liệu một cách tối ưu.

B1: Tạo dataset nhãn

Nếu bạn muốn xây dựng một mô hình phân loại cảm xúc hiệu quả, bước đầu tiên không thể thiếu là tạo ra một dataset với các nhãn cảm xúc từ dữ liệu thô. Điều này đóng vai trò then chốt để đảm bảo rằng mô hình có thể học và hiểu đúng các dạng cảm xúc từ dữ liệu đầu vào.

Việc sở hữu một dataset chất lượng rất quan trọng, bởi vì nó chính là nền tảng để mô hình của bạn học hỏi. Dataset cần phải có độ phong phú và đa dạng, được xử lý và gán nhãn chính xác. Một dataset không cân bằng có thể dẫn đến việc mô hình bị lệch lạc và không thể phân loại đúng các nhãn cảm xúc.

Đầu tiên, bạn cần thực hiện các bước thu thập dữ liệu một cách hiệu quả. Hãy sử dụng các nguồn dữ liệu rõ ràng và đáng tin cậy. Các nền tảng mạng xã hội, diễn đàn, hoặc thậm chí các survey trực tuyến là những nguồn tuyệt vời để thu thập dữ liệu cảm xúc. Đảm bảo rằng dữ liệu bạn thu thập được là thô, chưa qua xử lý và đại diện tốt cho vấn đề bạn muốn giải quyết.

Sau khi dữ liệu thô được thu thập, giai đoạn tiếp theo là 'làm sạch' dữ liệu bằng cách loại bỏ những thông tin không cần thiết như stop words, ký tự đặc biệt, hoặc các mẫu không phục vụ cho mục đích phân tích. Điều này giúp giảm nhiễu cho dữ liệu và giúp cho quá trình gán nhãn dễ dàng hơn.

Khi đã có dữ liệu sạch, bạn cần tiến hành gán nhãn. Đây là bước quan trọng và cần sự chính xác cao. Hãy nhờ đến sự hỗ trợ từ các chuyên gia hoặc sử dụng các công cụ gán nhãn tự động nếu có thể. Việc này đảm bảo tính chính xác và nhất quán của nhãn trong dataset.

Một khía cạnh không thể không nhắc đến là sự cân bằng giữa các nhãn trong dataset. Một ví dụ cụ thể, nếu bạn đang phân tích dữ liệu văn bản để phân loại cảm xúc tích cực và tiêu cực, thì tập dữ liệu cần phải có một tỷ lệ nhãn cân bằng giữa hai loại cảm xúc. Nếu không cân bằng, mô hình có khả năng thiên lệch về phía nhãn có dữ liệu nhiều hơn, dẫn đến kết quả không chính xác.

Nhìn chung, các kỹ thuật xử lý dữ liệu và chiến lược thu thập thông tin có thể khác nhau tùy thuộc vào loại dữ liệu bạn đang làm việc. Hãy luôn kiểm tra và đảm bảo rằng quá trình chuẩn bị dữ liệu không có các bước nào bị bỏ sót và đặt tiêu chuẩn cao nhất trong việc gán nhãn dữ liệu của bạn.


B2: Tách train/test

Việc tách dataset thành các tập train và test là một bước không thể thiếu trong quy trình xây dựng mô hình máy học. Mục tiêu của việc này là để đảm bảo rằng mô hình được huấn luyện trên dữ liệu chưa từng thấy khi đánh giá, từ đó cung cấp một thước đo khách quan về khả năng tổng quát hóa của mô hình đối với các dữ liệu mới.

Khi xây dựng mô hình machine learning, điều quan trọng là phải tránh overfitting - hiện tượng mô hình học quá chi tiết các đặc trưng của dataset huấn luyện đến mức không thể hoạt động hiệu quả trên dữ liệu mới. Việc tách một phần dữ liệu làm tập train (dùng để huấn luyện mô hình) và một phần dữ liệu làm tập test (để kiểm tra xem mô hình có hoạt động tốt trên dữ liệu chưa thấy) giúp đảm bảo tính chính xác của việc đánh giá mô hình.

Sử dụng Scikit-learn, một trong những thư viện phổ biến nhất trong Python cho các tác vụ máy học, công việc phân chia dữ liệu trở nên hết sức dễ dàng và hiệu quả. Thư viện này cung cấp cho người dùng hàm train_test_split trong mô-đun sklearn.model_selection, giúp đơn giản hóa việc phân chia dữ liệu với các tùy chọn như tỷ lệ phân chia, xáo trộn dữ liệu, và đặt seed để đảm bảo tính ngẫu nhiên lặp lại. Dưới đây là một ví dụ cụ thể.

Trong ví dụ trên, dataset được chia thành hai phần: 80% dữ liệu được sử dụng để huấn luyện (train) và 20% được sử dụng để kiểm tra (test). Tham số random_state=42 đảm bảo khả năng tái lập kết quả khi cần.

Việc phân chia dữ liệu là bước quan trọng giúp tăng độ chính xác của mô hình khi được triển khai thực tế. Đặc biệt, trong bối cảnh xử lý ngôn ngữ tự nhiên và phân loại cảm xúc, việc đảm bảo rằng mô hình có khả năng tổng quát hóa là vô cùng cần thiết.

Sử dụng các công cụ mạnh mẽ từ Scikit-learn để phân chia dữ liệu không chỉ tiết kiệm thời gian mà còn tối ưu hóa quá trình xây dựng mô hình cảm xúc, giúp tăng khả năng thành công trong việc triển khai mô hình vào các ứng dụng thực tiễn.


B3 TF-IDFLogistic Regression

Trong bước này, chúng ta sẽ áp dụng TF-IDF và Logistic Regression để xây dựng một mô hình phân loại cảm xúc. TF-IDF, viết tắt của Term Frequency-Inverse Document Frequency, là một kỹ thuật rất phổ biến trong xử lý ngôn ngữ tự nhiên (NLP) để chuyển đổi văn bản thành các vector số. Các vector này có thể được đưa vào mô hình học máy như Logistic Regression.

Vậy TF-IDF hoạt động như thế nào? Đầu tiên, "Term Frequency" (TF) đo lường tần suất từ xuất hiện trong một tài liệu cụ thể. Trong khi đó, "Inverse Document Frequency" (IDF) đánh giá tầm quan trọng của từ bằng cách tính toán nghịch đảo số lượng tài liệu mà từ đó xuất hiện. TF-IDF kết hợp cả hai chỉ số trên để xác định mức độ quan trọng của một từ trong văn bản. Khi một từ xuất hiện thường xuyên trong một tài liệu nhưng ít xuất hiện trong toàn bộ tập dữ liệu, từ đó có thể mang nhiều thông tin quan trọng hơn.

Để tính toán TF-IDF và áp dụng Logistic Regression, trước tiên cần phải chuẩn bị dữ liệu của mình. Dựa vào các phân vùng train/test mà chúng ta đã chuẩn bị ở bước trước, chúng ta sẽ tiếp tục xây dựng mô hình.

Ví dụ: Sử dụng TF-IDF và Logistic Regression

Dưới đây là cách chúng ta thực hiện quá trình này bằng Scikit-learn:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split

# Sử dụng dataset ví dụ
data = fetch_20newsgroups(subset='train', categories=['rec.sport.hockey', 'sci.space'])
X = data.data
y = data.target

# Tách dữ liệu
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Tạo pipeline TF-IDF và Logistic Regression
model = make_pipeline(TfidfVectorizer(), LogisticRegression(max_iter=1000))

# Huấn luyện mô hình
model.fit(X_train, y_train)

# Dự đoán
predictions = model.predict(X_test)

Trong đoạn mã trên, TfidfVectorizer chuyển đổi văn bản thành vector TF-IDF. Sau đó, chúng ta sử dụng LogisticRegression để huấn luyện mô hình phân loại. Việc sử dụng pipelining giúp kết hợp các bước một cách dễ dàng và đảm bảo mô hình của chúng ta được huấn luyện một cách hiệu quả.

Áp dụng Logistic Regression cùng với TF-IDF là một lựa chọn tối ưu trong phân loại văn bản nhờ tính đơn giản và hiệu quả. Tiếp tục với các bước sau, chúng ta sẽ đánh giá mô hình với chỉ số F1-score để hiểu rõ hơn về hiệu suất của nó.


B4 Đánh giá F1

Để đánh giá hiệu suất của mô hình phân loại cảm xúc, một trong những chỉ số quan trọng nhất mà chúng ta cần quan tâm là F1-score. Tại sao F1-score lại quan trọng? Hãy cùng tìm hiểu các khía cạnh của chỉ số này.

F1-score là sự kết hợp hài hòa giữa độ chính xác (precision) và độ nhạy (recall). Được tính bằng công thức:

Ở đây:

  • Precision: Tỷ lệ các dự đoán đúng trên tổng số dự đoán "có" từ mô hình.
  • Recall: Tỷ lệ các dự đoán đúng trên tổng số trường hợp mà đáng lẽ nó phải dự đoán "có".

F1-score là một chỉ số đặc biệt hữu ích trong phân loại dữ liệu không cân bằng — điều xảy ra khi một lớp dữ liệu chiếm ưu thế so với các lớp khác. Trong trường hợp như vậy, chỉ sử dụng độ chính xác (accuracy) để đánh giá mô hình là không hợp lý, bởi mô hình có thể đạt độ chính xác cao chỉ bằng cách dự đoán lớp ưu thế nhất cho tất cả các trường hợp.

Bây giờ, ta hãy đi qua một ví dụ cụ thể để thấy sự khác biệt giữa mô hình trước và sau khi tối ưu hóa dựa trên F1-score.

Hãy thử tưởng tượng trong một bài toán phân loại độ phân cực của câu (tích cực/tiêu cực). Sau khi chạy mô hình Logistic Regression với dữ liệu số cân bằng sử dụng TF-IDF, ta thu thập được các kết quả sau:

Điều đó có nghĩa là, mặc dù độ chính xác của mô hình có vẻ ổn, nhưng mô hình vẫn chưa có khả năng phán đoán đúng tất cả các trường hợp tích cực/tiêu cực.

Sau khi áp dụng một số kỹ thuật tối ưu hóa, chẳng hạn như điều chỉnh tham số hoặc sử dụng kỹ thuật tăng cường dữ liệu, hiệu suất mô hình được cải thiện như sau:

Như bạn có thể thấy, chỉ số Precision và Recall đều được cải thiện, do đó làm cho F1-score cũng được nâng cấp. Điều này cho thấy mô hình sau khi tối ưu hóa không chỉ tinh gọn mà còn chính xác hơn trong việc phân loại đúng các trường hợp.

Nếu bạn đang làm việc với dữ liệu không cân bằng, F1-score là chỉ số không thể thiếu để đảm bảo mô hình của bạn được tối ưu hóa ở mức cao nhất. Việc liên tục so sánh F1-score trước và sau khi sửa đổi sẽ giúp bạn tối ưu hóa mô hình một cách hiệu quả.


B5 Lưu và infer mẫu

Trong quá trình xây dựng mô hình phân loại cảm xúc sử dụng TF-IDF và Logistic Regression, sau khi đã hoàn thành việc đánh giá hiệu suất của mô hình thông qua chỉ số F1-score, bước tiếp theo quan trọng không kém là lưu trữ mô hình và thực hiện dự đoán trên dữ liệu mẫu mới. Khả năng lưu trữ mô hình giúp chúng ta dễ dàng tái sử dụng mô hình đã huấn luyện mà không cần huấn luyện lại từ đầu, tiết kiệm thời gian và tài nguyên đáng kể.

Điều đầu tiên mà chúng ta cần là sử dụng thư viện joblib của Python để lưu trữ mô hình đã huấn luyện. Đây là thư viện phổ biến trong lưu trữ mô hình của Scikit-learn nhờ vào tốc độ và tính hiệu quả. Dưới đây là một minh họa về cách lưu trữ mô hình:


from sklearn.externals import joblib

# Giả sử mô hình đã huấn luyện có tên là model
joblib.dump(model, 'logistic_regression_model.pkl')

Sau khi đã lưu trữ mô hình dưới định dạng .pkl, chúng ta có thể dễ dàng tải lại mô hình để thực hiện dự đoán (infer) trên dữ liệu mới. Điều này vô cùng tiện lợi trong các ứng dụng thực tế, chẳng hạn như khi triển khai mô hình trên server để xử lý yêu cầu từ người dùng.

Để thực hiện infer trên dữ liệu mới, trước tiên chúng ta cần tải mô hình đã lưu, sau đó áp dụng quá trình dự đoán. Dưới đây là ví dụ chi tiết:


# Tải mô hình đã lưu
loaded_model = joblib.load('logistic_regression_model.pkl')

# Dự đoán trên dữ liệu mới
def make_prediction(new_data):
    # Chuyển đổi dữ liệu đầu vào thành dạng TF-IDF
    tfidf_vectorizer = TfidfVectorizer()
    new_data_tfidf = tfidf_vectorizer.transform(new_data)

    # Dự đoán cảm xúc
    predictions = loaded_model.predict(new_data_tfidf)
    return predictions

# Ví dụ dữ liệu mới
new_samples = ["I love this product!", "This is the worst experience."]
predictions = make_prediction(new_samples)
print(predictions)

Việc triển khai một mô hình dự đoán như vậy trong ứng dụng thực tế có thể kèm theo các công cụ quản lý cấu hình, như Docker để đảm bảo tính ổn định và khả năng mở rộng của dịch vụ. Docker cho phép chúng ta đóng gói và triển khai mô hình cùng với mọi thứ cần thiết để chạy nó vào một container duy nhất. Điều này giúp quá trình triển khai mô hình ở môi trường thực tế trở nên dễ dàng và sử dụng được ở nhiều server khác nhau mà không lo lắng về sự khác biệt hệ thống.

Trong hướng dẫn này, chúng ta đã tìm hiểu cách lưu trữ mô hình Logistic Regression đã huấn luyện và áp dụng nó để dự đoán trên dữ liệu mới. Quá trình lưu và infer không chỉ giúp tiết kiệm thời gian mà còn hỗ trợ việc triển khai mô hình trong các ứng dụng công nghiệp một cách hiệu quả. Việc tối ưu hóa và quản lý mô hình là bước quan trọng cuối cùng để đưa ứng dụng phân tích dữ liệu của chúng ta vào hoạt động thực tiễn.


Kết luận
Phân loại cảm xúc sử dụng TF-IDF và Logistic Regression cùng với Scikit-learn mang lại phương pháp hiệu quả để xử lý dữ liệu văn bản. Bài viết đã trình bày chi tiết từng bước từ việc tạo dataset, tách train-test, tính toán TF-IDF đến huấn luyện và đánh giá mô hình. Với công cụ mạnh mẽ này, việc phân loại cảm xúc trở nên dễ dàng và chính xác hơn.
By AI