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

Tiền xử lý trong Khoa học Dữ liệu (Phần 2): Chuẩn hóa tâm, Chuẩn hóa tỷ lệ và Hồi quy Logistic

Khám phá liệu chuẩn hóa tâm và tỷ lệ có giúp mô hình của bạn trong bối cảnh hồi quy logistic hay không.
Đã cập nhật 5 thg 10, 2026  · 9 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Trong bài viết đầu tiên của loạt bài, tôi đã khám phá vai trò của tiền xử lý trong các tác vụ phân loại học máy (ML), với phần đào sâu vào thuật toán k-Nearest Neighbours (k-NN) và bộ dữ liệu chất lượng rượu vang. Ở đó, bạn đã thấy rằng chuẩn hóa tâm và tỷ lệ dữ liệu số giúp cải thiện hiệu suất của k-NN theo một số thước đo hiệu năng mô hình (ví dụ: độ chính xác). Bạn cũng đã thấy rằng tiền xử lý không diễn ra trong môi trường chân không và giá trị của nó chỉ có thể được đánh giá khi xem trong bối cảnh một pipeline ML hướng dự đoán. Tuy nhiên, chúng ta mới chỉ thấy tầm quan trọng của tiền xử lý trong bối cảnh một mô hình duy nhất, k-NN. Trường hợp này, mô hình của chúng ta hoạt động tốt hơn đáng kể, nhưng liệu điều đó có phải lúc nào cũng đúng? Không nhất thiết! Trong bài viết này, tôi sẽ khám phá vai trò của việc chuẩn hóa tỷ lệ và chuẩn hóa tâm dữ liệu số trong một mô hình cơ bản khác, hồi quy logistic. Bạn có thể muốn ôn lại bằng cách xem bài viết trước và/hoặc bảng thuật ngữ ở cuối bài. Một lần nữa, chúng ta sẽ khám phá bộ dữ liệu chất lượng rượu vang. Tất cả ví dụ trong bài đều bằng Python. Nếu bạn chưa quen với Python, bạn có thể xem toàn bộ khóa học khoa học dữ liệu của chúng tôi tại đây. Tôi sẽ sử dụng thư viện pandas cho nhu cầu về dataframe và scikit-learn cho nhu cầu về học máy.

Trước tiên tôi sẽ giới thiệu ngắn gọn về hồi quy, có thể được dùng để dự đoán giá trị biến số cũng như phân lớp. Tôi sẽ giới thiệu hồi quy tuyến tính, hồi quy logistic và sau đó dùng mô hình sau để dự đoán chất lượng rượu vang đỏ. Bạn sẽ thấy liệu việc chuẩn hóa tâm và tỷ lệ có giúp mô hình của chúng ta trong bối cảnh hồi quy hay không.

Giới thiệu ngắn về Hồi quy với Python

Hồi quy tuyến tính trong Python

Như đã đề cập, hồi quy thường được dùng để dự đoán giá trị của một biến số từ biến số khác. Ví dụ, dưới đây chúng ta thực hiện một hồi quy tuyến tính trên dữ liệu nhà ở Boston (một bộ dữ liệu dựng sẵn trong scikit-learn): trong trường hợp này, biến độc lập (trục x) là số phòng và biến phụ thuộc (trục y) là giá.

Hồi quy như vậy hoạt động thế nào? Tóm lược cơ chế như sau: chúng ta muốn khớp một mô hình \(y = ax + b\) với dữ liệu \((x_i,y_i)\), tức là chúng ta muốn tìm \(a\) và \(b\) tối ưu dựa trên dữ liệu. Trong công thức bình phương tối thiểu thông thường (OLS, phổ biến nhất), có giả định rằng sai số xảy ra ở biến phụ thuộc. Vì vậy, các giá trị \(a\) và \(b\) tối ưu được tìm bằng cách tối thiểu hóa \[SSE = \sum_i (y_i - (ax_i + b))^2\] và tối ưu hóa này thường đạt được bằng thuật toán hạ dốc. Ở đây chúng ta thực hiện một hồi quy tuyến tính đơn giản với dữ liệu nhà ở Boston:

# Import necessary packages
import pandas as pd
%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('ggplot')
from sklearn import datasets
from sklearn import linear_model
import numpy as np

# Load data
boston = datasets.load_boston()
yb = boston.target.reshape(-1, 1)
Xb = boston['data'][:,5].reshape(-1, 1)

# Plot data
plt.scatter(Xb,yb)
plt.ylabel('value of house /1000 ($)')
plt.xlabel('number of rooms')

# Create linear regression object
regr = linear_model.LinearRegression()
# Train the model using the training sets
regr.fit( Xb, yb)

# Plot outputs
plt.scatter(Xb, yb,  color='black')
plt.plot(Xb, regr.predict(Xb), color='blue',
         linewidth=3)
plt.show()

Number of Rooms Graph

Hồi quy này nắm bắt xu hướng tăng tổng quát của dữ liệu nhưng không nhiều hơn. Chúng ta mới chỉ dùng một biến dự báo và có thể dùng nhiều hơn, khi đó ta sẽ có \(n\) hệ số \(a_1,\ldots,a_n\) trong mô hình, mỗi hệ số cho một biến dự báo. Đáng chú ý là độ lớn của biến \(a_i\) cho biết biến tương ứng tương quan mạnh thế nào với biến mục tiêu.

Hồi quy logistic trong Python

Hồi quy cũng có thể dùng cho bài toán phân loại. Ví dụ tự nhiên đầu tiên là hồi quy logistic. Trong phân loại nhị phân (hai nhãn), ta có thể coi các nhãn là 0 & 1. Một lần nữa, ký hiệu biến dự báo là \(x\), mô hình hồi quy logistic được cho bởi hàm logistic \[F(x) = \frac{1}{1+e^{-(ax+b)}}.\] Đây là một đường cong hình chữ S (sigmoid) và bạn có thể xem ví dụ bên dưới. Với bất kỳ \(x\) nào, nếu \(F(x) <0.5\) thì mô hình logistic dự đoán y = 0 và ngược lại, nếu \(F(X) > 0.5\) mô hình dự đoán \(y = 1\). Một lần nữa, nếu có nhiều hơn một biến dự báo, chúng ta cũng có \(n\) hệ số \(a_1,\ldots,a_n\), mỗi hệ số cho một biến dự báo. Trong trường hợp này, độ lớn của biến \(a_i\) cho biết biến tương ứng ảnh hưởng mạnh thế nào đến biến dự báo.

# Synthesize data
X1 = np.random.normal(size=150)
y1 = (X1 > 0).astype(np.float)
X1[X1 > 0] *= 4
X1 += .3 * np.random.normal(size=150)
X1= X1.reshape(-1, 1)

# Run the classifier
clf = linear_model.LogisticRegression()
clf.fit(X1, y1)

# Plot the result
plt.scatter(X1.ravel(), y1, color='black', zorder=20 , alpha = 0.5)
plt.plot(X1_ordered, clf.predict_proba(X1_ordered)[:,1], color='blue' , linewidth = 3)
plt.ylabel('target variable')
plt.xlabel('predictor variable')
plt.show()

Predictor Variable Graph

Hồi quy logistic và Chuẩn hóa dữ liệu: Bộ dữ liệu Rượu vang

Giờ khi đã thấy cơ chế của hồi quy logistic, hãy triển khai một bộ phân loại hồi quy logistic trên bộ dữ liệu rượu vang hấp dẫn của chúng ta. Tôi sẽ nhập dữ liệu và vẽ biến mục tiêu (rượu ngon/tệ) để ôn lại:

# Import necessary modules
from sklearn import linear_model
from sklearn.cross_validation import train_test_split

# Load data
df = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv ' , sep = ';')
X = df.drop('quality' , 1).values #drop target variable
y1 = df['quality'].values
y = y1 <= 5 # is the rating <= 5?

# plot histograms of original target variable
# and aggregated target variable
plt.figure(figsize=(20,5));
plt.subplot(1, 2, 1 );
plt.hist(y1);
plt.xlabel('original target value')
plt.ylabel('count')
plt.subplot(1, 2, 2);
plt.hist(y)
plt.xlabel('aggregated target value')
plt.show()

Target Value Graphs

Bây giờ hãy chạy hồi quy logistic và xem hiệu quả ra sao!

# Split the data into test and training sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

#initial logistic regression model
lr = linear_model.LogisticRegression()

# fit the model
lr = lr.fit(X_train, y_train)
print('Logistic Regression score for training set: %f' % lr.score(X_train, y_train))
from sklearn.metrics import classification_report
y_true, y_pred = y_test, lr.predict(X_test)
print(classification_report(y_true, y_pred))
Logistic Regression score for training set: 0.752932
             precision    recall  f1-score   support

      False       0.78      0.74      0.76       179
       True       0.69      0.74      0.71       141

avg / total       0.74      0.74      0.74       320

Mặc định, mô hình hồi quy logistic này hoạt động tốt hơn K-NN (có hoặc không chuẩn hóa). Giờ hãy chuẩn hóa dữ liệu và thực hiện hồi quy logistic:

from sklearn.preprocessing import scale
Xs = scale(X)
Xs_train, Xs_test, y_train, y_test = train_test_split(Xs, y, test_size=0.2, random_state=42)
lr_2 = lr.fit(Xs_train, y_train)
print('Scaled Logistic Regression score for test set: %f' % lr_2.score(Xs_test, y_test))
y_true, y_pred = y_test, lr_2.predict(Xs_test)
print(classification_report(y_true, y_pred))
Scaled Logistic Regression score for test set: 0.740625
             precision    recall  f1-score   support

      False       0.79      0.74      0.76       179
       True       0.69      0.74      0.72       141

avg / total       0.74      0.74      0.74       320

Thật thú vị! Hiệu suất của hồi quy logistic không cải thiện khi chuẩn hóa dữ liệu. Tại sao, nhất là khi chúng ta thấy hiệu suất của k-Nearest Neighbours cải thiện đáng kể với chuẩn hóa? Lý do là nếu có các biến dự báo có khoảng giá trị lớn nhưng không ảnh hưởng đến biến mục tiêu, một thuật toán hồi quy sẽ làm cho các hệ số tương ứng \(a_i\) nhỏ đi để chúng không ảnh hưởng nhiều đến dự đoán. K-nearest neighbours không có chiến lược tích hợp như vậy nên chúng ta rất cần chuẩn hóa dữ liệu.

Trong bài tiếp theo, tôi sẽ bóc tách các kết quả rất khác nhau của việc chuẩn hóa tâm và tỷ lệ trong k-NN và hồi quy logistic bằng cách tổng hợp một bộ dữ liệu, thêm nhiễu và xem cách chuẩn hóa tâm và tỷ lệ làm thay đổi hiệu suất của cả hai mô hình theo cường độ nhiễu.

Trong cửa sổ tương tác bên dưới, bạn có thể tự chơi với dữ liệu. Bạn có thể chuẩn hóa dữ liệu bằng cách đặt sc = True, nếu muốn. Sau đó chạy toàn bộ script để báo cáo độ chính xác của mô hình hồi quy logistic cùng với báo cáo phân loại.

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IHBhbmRhcyBhcyBwZFxuaW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdFxuZnJvbSBza2xlYXJuLmNyb3NzX3ZhbGlkYXRpb24gaW1wb3J0IHRyYWluX3Rlc3Rfc3BsaXRcbmZyb20gc2tsZWFybiBpbXBvcnQgbmVpZ2hib3JzXG5mcm9tIHNrbGVhcm4ucHJlcHJvY2Vzc2luZyBpbXBvcnQgc2NhbGVcbmZyb20gc2tsZWFybi5tZXRyaWNzIGltcG9ydCBjbGFzc2lmaWNhdGlvbl9yZXBvcnRcbmZyb20gc2tsZWFybiBpbXBvcnQgbGluZWFyX21vZGVsIiwic2FtcGxlIjoiIyBTZXQgc2MgPSBUcnVlIHRvIHNjYWxlIHlvdXIgZmVhdHVyZXMgXG5zYyA9IEZhbHNlIFxuXG4jIExvYWQgZGF0YSBcbmRmID0gcGQucmVhZF9jc3YoJ2h0dHA6Ly9hcmNoaXZlLmljcy51Y2kuZWR1L21sL21hY2hpbmUtbGVhcm5pbmctZGF0YWJhc2VzL3dpbmUtcXVhbGl0eS93aW5lcXVhbGl0eS1yZWQuY3N2ICcgLCBzZXAgPSAnOycpIFxuWCA9IGRmLmRyb3AoJ3F1YWxpdHknICwgMSkudmFsdWVzICMgZHJvcCB0YXJnZXQgdmFyaWFibGUgXG5cbiMgSGVyZSB3ZSBzY2FsZSwgaWYgZGVzaXJlZCBcbmlmIHNjID09IFRydWU6IFxuICBYID0gc2NhbGUoWCkgXG4gIFxuIyBUYXJnZXQgdmFsdWUgXG55MSA9IGRmWydxdWFsaXR5J10udmFsdWVzICMgb3JpZ2luYWwgdGFyZ2V0IHZhcmlhYmxlIFxueSA9IHkxIDw9IDUgICMgbmV3IHRhcmdldCB2YXJpYWJsZTogaXMgdGhlIHJhdGluZyA8PSA1PyBcblxuIyBTcGxpdCB0aGUgZGF0YSBpbnRvIGEgdGVzdCBzZXQgYW5kIGEgdHJhaW5pbmcgc2V0IFhfdHJhaW4sIFhfdGVzdCwgeV90cmFpbiwgeV90ZXN0ID0gXG50cmFpbl90ZXN0X3NwbGl0KFgsIHksIHRlc3Rfc2l6ZT0wLjIsIHJhbmRvbV9zdGF0ZT00MikgXG5cbiMgVHJhaW4gbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbCBhbmQgcHJpbnQgcGVyZm9ybWFuY2Ugb24gdGhlIHRlc3Qgc2V0IFxubHIgPSBsaW5lYXJfbW9kZWwuTG9naXN0aWNSZWdyZXNzaW9uKCkgXG5sciA9IGxyLmZpdChYX3RyYWluLCB5X3RyYWluKSBcbnByaW50KCdMb2dpc3RpYyBSZWdyZXNzaW9uIHNjb3JlIGZvciB0cmFpbmluZyBzZXQ6ICVmJyAlIGxyLnNjb3JlKFhfdHJhaW4sIHlfdHJhaW4pKSBcbnlfdHJ1ZSwgeV9wcmVkID0geV90ZXN0LCBsci5wcmVkaWN0KFhfdGVzdCkgXG5wcmludChjbGFzc2lmaWNhdGlvbl9yZXBvcnQoeV90cnVlLCB5X3ByZWQpKSBcbiJ9

Thuật ngữ

Học có giám sát: Nhiệm vụ suy luận một biến mục tiêu từ các biến dự báo. Ví dụ, suy luận biến mục tiêu ‘có bệnh tim’ từ các biến dự báo như ‘tuổi’, ‘giới tính’ và ‘tình trạng hút thuốc’.

Nhiệm vụ phân loại: Một nhiệm vụ học có giám sát là nhiệm vụ phân loại nếu biến mục tiêu bao gồm các hạng mục (ví dụ: ‘nhấp’ hoặc ‘không’, khối u ‘ác tính’ hoặc ‘lành tính’).

Nhiệm vụ hồi quy: Một nhiệm vụ học có giám sát là nhiệm vụ hồi quy nếu biến mục tiêu là biến thay đổi liên tục (ví dụ: giá nhà) hoặc biến phân loại có thứ tự như ‘đánh giá chất lượng rượu’.

k-Nearest Neighbors: Một thuật toán cho nhiệm vụ phân loại, trong đó một điểm dữ liệu được gán nhãn theo quyết định đa số của k láng giềng gần nhất.

Tiền xử lý: Bất kỳ số thao tác nào mà nhà khoa học dữ liệu sử dụng để đưa dữ liệu vào dạng phù hợp hơn với mục đích của họ. Ví dụ, trước khi phân tích cảm xúc dữ liệu Twitter, bạn có thể muốn loại bỏ thẻ html, khoảng trắng, mở rộng chữ viết tắt và tách tweet thành danh sách các từ chứa trong đó.

Chuẩn hóa tâm và Chuẩn hóa tỷ lệ: Cả hai đều là các hình thức tiền xử lý dữ liệu số, tức dữ liệu gồm các con số, trái ngược với hạng mục hay chuỗi, chẳng hạn; chuẩn hóa tâm một biến là trừ đi giá trị trung bình của biến khỏi mỗi điểm dữ liệu để biến mới có trung bình bằng 0; chuẩn hóa tỷ lệ một biến là nhân mỗi điểm dữ liệu với một hằng số nhằm thay đổi khoảng giá trị của dữ liệu. Xem phần nội dung bài viết để biết tầm quan trọng của chúng kèm ví dụ.

Bài viết này được tạo từ một sổ tay Jupyter. Bạn có thể tải sổ tay tại đây.

Chủ đề
Machine Learning
Python
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm