Dữ liệu định lượng là thước đo của một điều gì đó—cho dù quy mô lớp học, doanh số hàng tháng hay điểm số của học sinh. Cách tự nhiên để biểu diễn những số lượng này là bằng số (ví dụ: 29 sinh viên, doanh thu là 529.392 USD). Trong chương này, chúng tôi sẽ đề cập đến nhiều chiến lược để chuyển đổi dữ liệu số thô thành các tính năng được xây dựng có mục đích cho các thuật toán học máy.
Trang 1CHƯƠNG 4 XỬ LÝ DỮ LIỆU SỐ
Giới thiệu
Dữ liệu định lượng là thước đo của một điều gì đó—cho dùquy mô lớp học, doanh số hàng tháng hay điểm số của học sinh.Cách tự nhiên để biểu diễn những số lượng này là bằng số (vídụ: 29 sinh viên, doanh thu là 529.392 USD) Trong chương này,chúng tôi sẽ đề cập đến nhiều chiến lược để chuyển đổi dữ liệu
số thô thành các tính năng được xây dựng có mục đích cho cácthuật toán học máy
Thay đổi thang đo một thuộc tính
Sử dụng MinMaxScaler của scikit-learn để thay đổi tỷ lệmột mảng tính năng:
Trang 2trong đó
x là vectơ thuộc tính,
xi là một giá trị của thuộc tính x
và x’ chính là giá trị chuyển đổi thang đo
Trong ví dụ trên, chúng ta có thể thấy từ thuộc tínhfeature đã được đổi thành thang đo từ 0-1:
Trang 3tính toán giá trị tối thiểu và tối đa của thuộc tính, sau đó sửdụng transform để định lại thang đo cho thuộc tính Tùy chọnthứ hai là sử dụng fit_transform để thực hiện cả hai thao táccùng một lúc Không có sự khác biệt về mặt toán học giữa haitùy chọn, nhưng đôi khi có lợi ích thực tế khi giữ các thao tácriêng biệt vì nó cho phép chúng ta áp dụng cùng một phép biếnđổi cho các bộ dữ liệu khác nhau.
Chuẩn hóa một thuộc tính
StandardScaler của scikit-learn thực hiện cả hai phépbiến đổi chuyển trung bình của thuộc tính định lượng thành 0 và
scaler = preprocessing StandardScaler ()
# Transform the feature
standardized = scaler fit_transform ( )
Trang 4[ 1.97516685]])
Một giải pháp thay thế phổ biến cho việc thay đổi thang
đo tối thiểu-tối đa là thay đổi thang đo thuộc tính để có phân bốgần đúng phân phối chuẩn Để đạt được điều này, chúng tôi sửdụng phương pháp tiêu chuẩn hóa để chuyển đổi dữ liệu saocho nó có giá trị trung bình bằng 0 và độ lệch chuẩn = 1 Cụthể, mỗi giá trị của thuộc tính được chuyển đổi sao cho:
Trong đó
x’ chính là giá trị đã tiêu chuẩn hóa của x Thuộc tính đượcchuyển đổi biểu thị số độ lệch chuẩn của giá trị ban đầu so vớigiá trị trung bình của thuộc tính (còn được gọi là điểm z trongthống kê)
Tiêu chuẩn hóa là một phương pháp thay đổi thang đophổ biến trong tiền xử lý máy học và theo kinh nghiệm của tôi,
nó được sử dụng thường xuyên hơn so với thay đổi thang đo tốithiểu-tối đa Tuy nhiên, nó phụ thuộc vào thuật toán học tập Ví
dụ, phân tích thành phần chính thường hoạt động tốt hơn khi sửdụng tiêu chuẩn hóa, trong khi thay đổi thang đo tối thiểu-tối đathường được khuyến nghị cho các mạng thần kinh (cả hai thuậttoán sẽ được thảo luận sau trong cuốn sách này) Theo nguyêntắc chung, tôi khuyên bạn nên đặt mặc định là tiêu chuẩn hóatrừ khi bạn có lý do cụ thể để sử dụng giải pháp thay thế
Chúng ta có thể thấy tác động của việc tiêu chuẩn hóabằng cách xem xét giá trị trung bình và độ lệch chuẩn của kếtquả đầu ra của giải pháp tiêu chuẩn hóa:
# Print mean and standard deviation
print ( "Mean:" , round ( standardized mean ()))
print ( "Standard deviation:" , standardized std ())
Mean: 0.0
Trang 5Standard deviation: 1.0
Nếu dữ liệu của chúng ta có các giá trị ngoại lai, nó cóthể tác động tiêu cực đến việc tiêu chuẩn hóa của chúng tôibằng cách ảnh hưởng đến giá trị trung bình và phương sai củathuộc tính Trong trường hợp này, việc thay đổi thang đo thuộctính bằng cách sử dụng trung vị và khoảng tứ phân vị thườnghữu ích Trong scikit-learn, chúng tôi thực hiện việc này bằngphương pháp RobustScaler:
Bình thường hóa các quan sát
Bạn muốn rescale các giá trị đặc trưng của quan sát để cóđịnh mức đơn vị (tổng độ dài là 1) Chúng ta sử dụng Normalizervới đối số norm
# Load libraries
from sklearn.preprocessing import Normalizer
# Create feature matrix
features = np.array([[0.5, 0.5],
[1.1, 3.4],
[1.5, 20.2],
[1.63, 34.4],
Trang 6sẽ định lại tỷ lệ các giá trị trên các quan sát riêng lẻ để có địnhmức đơn vị (tổng độ dài của chúng là 1) Kiểu thay đổi tỷ lệ nàythường được sử dụng khi chúng ta có nhiều biến tương đương(ví dụ: phân loại văn bản khi mỗi từ hoặc nhóm n từ là mộtbiến).
Normalizer cung cấp ba tùy chọn chuẩn với chuẩn Euclide(thường được gọi là L2) là đối số mặc định:
trong đó x là một quan sát riêng lẻ và xn là giá trị của quan sát
đó đối với đặc điểm thứ n
# Transform feature matrix
features_l2_norm = Normalizer(norm="l2").transform(features)
# Show feature matrix
features_l2_norm
Trang 7Còn không, chúng ta sử dụng chuẩn Manhattan norm (L1):
# Transform feature matrix
features_l1_norm = Normalizer(norm="l1").transform(features)
# Show feature matrix
đó là lý do tại sao nó được gọi là “chuẩn Manhattan” hoặc
“chuẩn Taxicab”
Trên thực tế, hãy lưu ý rằng norm="l1" thay đổi tỷ lệ cácgiá trị của quan sát để chúng có tổng bằng 1, đôi khi có thể làchất lượng mong muốn:
# Print sum
print("Sum of the first observation\'s values:",
features_l1_norm[0, 0] + features_l1_norm[0, 1])
Trang 8Sum of the first observation's values: 1.0
Tạo các biến đa thức và tương tác
Mặc dù một số người chọn tạo các tính năng đa thức vàtương tác theo cách thủ công, nhưng scikit-learn cung cấp mộtphương pháp tích hợp sẵn:
# Load libraries
from sklearn.preprocessing import PolynomialFeatures
# Create feature matrix
# Create polynomial features
trong khi degree =3 sẽ tạo ra các tính năng mới được nânglên lũy thừa bậc hai và thứ ba:
Trang 9Ngoài ra theo mặc định PolynomialFeatures bao gồm luôn
cả tương tác của các đặc tính:
Chúng ta có thể hạn chế các tính năng được tạo chỉ ở cáctính năng tương tác bằng cách đặt interaction_only thành True:interaction = PolynomialFeatures(degree=2,
interaction_only=True, include_bias=False)
Ngoài ra, chúng ta thường gặp phải tình huống trong đótác dụng của một biến này này phụ thuộc vào biến khác Một ví
dụ đơn giản là nếu chúng ta đang cố gắng dự đoán xem cà phêcủa mình có ngọt hay không và chúng ta có hai đặc điểm: (1) càphê có được khuấy hay không và (2) chúng ta có thêm đườnghay không Riêng lẻ, mỗi đặc điểm không dự đoán được độ ngọtcủa cà phê, nhưng sự kết hợp tác dụng của chúng thì có Nghĩa
Trang 10là cà phê chỉ có vị ngọt nếu cà phê có đường và được khuấyđều Tác động của từng đặc tính lên mục tiêu (vị ngọt) phụthuộc lẫn nhau Chúng ta có thể mã hóa mối quan hệ đó bằngcách đưa vào một đặc tính tương tác là tích của các đặc tínhriêng lẻ.
Chuyển đổi biến số
Bạn muốn thực hiện chuyển đổi tùy chỉnh sang một hoặcnhiều tính năng Trong scikit-learn, hãy sử dụng hàmFunctionTransformer để áp dụng một hàm cho một tập hợp cácbiến số:
# Load libraries
from sklearn.preprocessing import FunctionTransformer
# Create feature matrix
features = np.array([[2, 3],
[2, 3],
[2, 3]])
# Define a simple function
def add_ten(x: int) -> int:
Trang 11Phát hiện các giá trị ngoại lai
Bạn muốn xác định những quan sát cực trị Thật khôngmay, việc phát hiện các giá trị ngoại lai là một nghệ thuật hơn
là một khoa học Tuy nhiên, một phương pháp phổ biến là giả sử
dữ liệu có phân phối chuẩn và dựa trên giả định đó, “vẽ” mộthình elip xung quanh dữ liệu, phân loại mọi quan sát bên trong
Trang 12hình elip là nội bộ (được gắn nhãn là 1) và mọi quan sát bênngoài hình elip là một ngoại lệ (được gắn nhãn là -1):
# Load libraries
from sklearn.covariance import EllipticEnvelope
from sklearn.datasets import make_blobs
# Create simulated data
Trong các mảng này, giá trị -1 đề cập đến các giá trị ngoại
lệ trong khi giá trị 1 đề cập đến các giá trị nội bộ Hạn chế chínhcủa phương pháp này là cần phải xác định thông sốcontamination, tức là tỷ lệ các quan sát nằm ngoài phạm vi giátrị ngoại lệ—một giá trị mà chúng ta không biết Hãy coicontamination là ước tính của chúng ta về độ sạch của dữ liệu.Nếu chúng tôi kỳ vọng dữ liệu của mình có ít ngoại lệ, chúng tôi
có thể đặt contamination ở mức nhỏ Tuy nhiên, nếu chúng tôi
Trang 13tin rằng dữ liệu có khả năng có nhiều ngoại lệ, chúng tôi có thểđặt contamination ở giá trị cao hơn.
Thay vì xem xét các quan sát một cách tổng thể, chúng ta
có thể xem xét các đặc điểm riêng lẻ và xác định các giá trị cựctrị trong các đặc điểm đó bằng cách sử dụng khoảng tứ phân vị(IQR):
# Create one feature
feature = features[:,0]
# Create a function to return index of outliers
def indicies_of_outliers(x: int) -> np.array(int):
IQR is the difference between the first and third quartile of a set
of data You can think of IQR as the spread of the bulk of thedata, with outliers being observations far from the mainconcentration of data Outliers are commonly defined as anyvalue 1.5 IQRs less than the first quartile, or 1.5 IQRs greaterthan the third quartile
IQR là hiệu giữa tứ phân vị thứ nhất và thứ ba của một tậphợp dữ liệu Bạn có thể coi IQR là sự phân tán của phần lớn dữliệu, với các giá trị ngoại lệ là những quan sát nằm xa nơi tậptrung dữ liệu chính Các số ngoại lai thường được định nghĩa làbất kỳ giá trị nào nhỏ hơn 1,5 IQR so với tứ phân vị thứ nhấthoặc lớn hơn 1,5 IQR so với tứ phân vị thứ ba
Trang 14Không có một kỹ thuật tốt nhất nào để phát hiện các giá trịngoại lai Thay vào đó, chúng ta có một tập hợp các kỹ thuật,tất cả đều có ưu điểm và nhược điểm riêng Chiến lược tốt nhấtcủa chúng ta thường là thử nhiều kỹ thuật (ví dụ: phát hiệnbằng EllipticEnvelope và IQR) và xem xét kết quả một cáchtổng thể.
Nếu có thể, chúng ta nên xem xét những quan sát màchúng ta phát hiện là những giá trị ngoại lai và cố gắng hiểuchúng Ví dụ: nếu chúng ta có một tập dữ liệu về các ngôi nhà
và một biến là số phòng, thì một giá trị ngoại lai có 100 phòng
có thực sự là một ngôi nhà hay nó thực sự là một khách sạn đã
bị phân loại sai?
Xử lý các giá trị ngoại lai
Bạn có giá trị ngoại lai trong dữ liệu mà bạn muốn xác định
và sau đó giảm tác động của chúng đến phân phối dữ liệu.Thông thường chúng ta có thể sử dụng ba chiến lược để xử lýcác ngoại lệ Đầu tiên, chúng ta có thể loại bỏ chúng:
Trang 15Price Bathroo
ms
Square_F eet
Outli er
Trang 16Price Bathroo
ms
Square_F eet
Outli er
Outli er
Log_Of_Square_ Feet
Trang 17cảm biến bị hỏng hoặc giá trị bị mã hóa sai, thì chúng ta có thểloại bỏ quan sát hoặc thay thế các giá trị ngoại lệ bằng NaN vìchúng tôi không thể tin cậy những giá trị đó Tuy nhiên, nếuchúng ta tin rằng các giá trị ngoại lai là những giá trị cực kỳthực sự (ví dụ: một ngôi nhà [biệt thự] có 200 phòng tắm), thìviệc đánh dấu chúng là các giá trị ngoại lệ hoặc chuyển đổi giátrị của chúng sẽ phù hợp hơn.
Thứ hai, cách chúng ta xử lý các ngoại lệ phải dựa trênmục tiêu máy học của chúng ta Ví dụ: nếu muốn dự đoán giánhà dựa trên đặc điểm của ngôi nhà, chúng ta có thể giả địnhmột cách hợp lý rằng giá của những biệt thự có hơn 100 phòngtắm được thúc đẩy bởi một động lực khác với những ngôi nhàgia đình thông thường Hơn nữa, nếu chúng ta đang đào tạomột mô hình để sử dụng như một phần của ứng dụng web chovay mua nhà trực tuyến, chúng tôi có thể cho rằng người dùngtiềm năng của chúng tôi sẽ không bao gồm các tỷ phú đang tìmmua biệt thự
Vậy chúng ta nên làm gì nếu có ngoại lệ? Hãy suy nghĩ về
lý do tại sao chúng là các ngoại lệ, có mục tiêu cuối cùng cho
dữ liệu và quan trọng nhất là hãy nhớ rằng việc không đưa raquyết định giải quyết các giá trị ngoại lai tự nó đã là một quyếtđịnh có hàm ý
Một điểm bổ sung: nếu bạn có các giá trị ngoại lai, chuẩnhóa có thể không phù hợp vì giá trị trung bình và phương sai cóthể bị ảnh hưởng nhiều bởi các giá trị ngoại lai Trong trườnghợp này, hãy sử dụng phương pháp thay đổi tỷ lệ mạnh mẽ hơn
để chống lại các giá trị ngoại lệ, như RobustScaler
Trang 18Phân nhóm biến định lượng bằng cách sử dụng Rời rạc hóa
Bạn có một biến định lượng và muốn chia nó thành các phần rời rạc Tùy thuộc vào cách chúng ta muốn chia nhỏ dữ liệu, có hai kỹ thuật chúng ta có thể sử dụng Đầu tiên, chúng ta
có thể nhị phân hóa biến theo một số ngưỡng:
# Load libraries
from sklearn.preprocessing import Binarizer
# Create feature
age = np.array([[6],
[12],
[20],
[36],
[65]])
# Create binarizer binarizer = Binarizer(threshold=18) # Transform feature binarizer.fit_transform(age) array([[0], [0],
[1],
[1],
[1]])
Cách thứ hai chúng ta có thể chia biến số thành nhiều ngưỡng: # Bin feature np.digitize(age, bins=[20,30,64]) array([[0], [0],
Trang 19Rời rạc hóa có thể là một chiến lược hiệu quả khi chúng ta
có lý do để tin rằng một biến số sẽ hoạt động giống một biếnphân loại hơn Ví dụ, chúng ta có thể tin rằng có rất ít sự khácbiệt trong thói quen chi tiêu của thanh niên 19 và 20 tuổi,nhưng có sự khác biệt đáng kể giữa thanh niên 20 và 21 tuổi(độ tuổi ở Hoa Kỳ mà thanh niên có thể tiêu dùng rượu bia).Trong ví dụ đó, có thể hữu ích khi chia các cá nhân trong dữ liệucủa chúng ta thành những người có thể uống rượu và nhữngngười không thể Tương tự, trong các trường hợp khác, việcphân tách dữ liệu của chúng ta thành ba bin trở lên có thể hữuích
Trong ví dụ trên, chúng tôi thấy có hai phương pháp rời rạchóa—Binarizer của scikit-learn chia thành hai bin và digitize của NumPy cho ba bin trở lên—tuy nhiên, chúng ta cũng có thể
sử dụng digitize để nhị phân hóa các tính năng như Binarizerbằng cách chỉ định một ngưỡng duy nhất:
Trang 20có thể sử dụng phân cụm k-means để nhóm các quan sát tương
tự và đưa ra một thuộc tính mới chứa thành viên nhóm của mỗiquan sát:
# Load libraries
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
# Make simulated feature matrix
# Make k-means clusterer
clusterer = KMeans(3, random_state=0)
Trang 21# Fit clusterer
clusterer.fit(features)
# Predict values
dataframe["group"] = clusterer.predict(features)
# View first few observations
dataframe.head(5)
feature
_1
feature _2
grou p
9.87755
4
–3.336145
2
Chúng tôi đang đi trước một chút và sẽ đi sâu hơn nhiều vềcác thuật toán phân cụm ở phần sau của cuốn sách Tuy nhiên,tôi muốn chỉ ra rằng chúng ta có thể sử dụng phân cụm như
Trang 22một bước tiền xử lý Cụ thể, chúng ta sử dụng các thuật toánhọc không giám sát như k-mean để phân cụm các quan sátthành các nhóm Kết quả là một đặc điểm phân loại có nhữngquan sát tương tự là thành viên của cùng một nhóm.
Đừng lo lắng nếu bạn không hiểu tất cả những điều đó: chỉcần nhớ rằng phân cụm có thể được sử dụng trong quá trìnhtiền xử lý
Xóa các quan sát có giá trị bị thiếu
Bạn cần xóa các quan sát chứa các giá trị bị thiếu Việcxóa các quan sát có giá trị bị thiếu thật dễ dàng với dòngNumPy thông minh:
# Keep only observations that are not (denoted by ~) missing
features[~np.isnan(features).any(axis=1)]
Trang 23Giải pháp đơn giản nhất là xóa mọi quan sát chứa mộthoặc nhiều giá trị bị thiếu, một nhiệm vụ được thực hiện nhanhchóng và dễ dàng bằng cách sử dụng NumPy hoặc pandas.
Điều đó có nghĩa là chúng ta nên cẩn thận khi xóa cácquan sát có giá trị bị thiếu Xóa chúng là tùy chọn cơ bản vìthuật toán của chúng ta mất quyền truy cập vào thông tin chứatrong các giá trị không thiếu của quan sát
Điều quan trọng không kém là tùy thuộc vào nguyên nhâncủa các giá trị bị thiếu, việc xóa các quan sát có thể gây sailệch cho dữ liệu của chúng ta Có ba loại dữ liệu bị thiếu: