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.
CHƯƠNG XỬ LÝ DỮ LIỆU SỐ Giới thiệu Dữ liệu định lượng thước đo điều đó—cho dù quy mơ lớp học, doanh số hàng tháng hay điểm số học sinh Cách tự nhiên để biểu diễn số lượng số (ví dụ: 29 sinh viên, doanh thu 529.392 USD) Trong chương này, đề cập đến nhiều chiến lược để chuyển đổi liệu số thô thành tính xây dựng có mục đích cho thuật toán học máy Thay đổi thang đo thuộc tính Sử dụng MinMaxScaler scikit-learn để thay đổi tỷ lệ mảng tính năng: # Load libraries import numpy as np from sklearn import preprocessing # Create feature feature = np.array([[-500.5], [-100.1], [0], [100.1], [900.9]]) # Create scaler minmax_scale preprocessing.MinMaxScaler(feature_range=(0, 1)) # Scale feature scaled_feature = minmax_scale.fit_transform(feature) # Show feature = scaled_feature array([[ ], [ 0.28571429], [ 0.35714286], [ 0.42857143], [ ]]) Thay đổi thang đo nhiệm vụ tiền xử lý phổ biến học máy Nhiều thuật tốn mơ tả sau sách giả định tất tính có thang đo, thường đến –1 đến Có số kỹ thuật thay đổi thang đo, kỹ thuật đơn giản gọi thang đo tối thiểu-tối đa Thang đo tối thiểu-tối đa sử dụng giá trị tối thiểu tối đa thuộc tính để định lại thang đo giá trị phạm vi Cụ thể, min-max tính tốn: x vectơ thuộc tính, xi giá trị thuộc tính x x’ giá trị chuyển đổi thang đo Trong ví dụ trên, thấy từ thuộc tính feature đổi thành thang đo từ 0-1: array([[ ], [ 0.28571429], [ 0.35714286], [ 0.42857143], [ ]]) MinMaxScaler scikit-learn cung cấp hai tùy chọn để thay đổi thang đo thuộc tính Một tùy chọn sử dụng fit để tính toán giá trị tối thiểu tối đa thuộc tính, sau sử dụng transform để định lại thang đo cho thuộc tính Tùy chọn thứ hai sử dụng fit_transform để thực hai thao tác lúc Khơng có khác biệt mặt tốn học hai tùy chọn, đơi có lợi ích thực tế giữ thao tác riêng biệt cho phép áp dụng phép biến đổi cho liệu khác Chuẩn hóa thuộc tính StandardScaler scikit-learn thực hai phép biến đổi chuyển trung bình thuộc tính định lượng thành độ lệch chuẩn thành # Load libraries import numpy as np from sklearn import preprocessing # Create feature x = np.array([[-1000.1], [-200.2], [500.5], [600.6], [9000.9]]) # Create scaler scaler = preprocessing.StandardScaler() # Transform the feature standardized = scaler.fit_transform(x) # Show feature standardized array([[-0.76058269], [-0.54177196], [-0.35009716], [-0.32271504], [ 1.97516685]]) Một giải pháp thay phổ biến cho việc thay đổi thang đo tối thiểu-tối đa thay đổi thang đo thuộc tính để có phân bố gần phân phối chuẩn Để đạt điều này, sử dụng phương pháp tiêu chuẩn hóa để chuyển đổi liệu cho có giá trị trung bình độ lệch chuẩn = Cụ thể, giá trị thuộc tính chuyển đổi cho: Trong x’ giá trị tiêu chuẩn hóa x Thuộc tính chuyển đổi biểu thị số độ lệch chuẩn giá trị ban đầu so với giá trị trung bình thuộc tính (cịn gọi điểm z thống kê) Tiêu chuẩn hóa phương pháp thay đổi thang đo phổ biến tiền xử lý máy học theo kinh nghiệm tơi, sử dụng thường xuyên so với thay đổi thang đo tối thiểu-tối đa Tuy nhiên, phụ thuộc vào thuật tốn học tập Ví dụ, phân tích thành phần thường hoạt động tốt sử dụng tiêu chuẩn hóa, thay đổi thang đo tối thiểu-tối đa thường khuyến nghị cho mạng thần kinh (cả hai thuật toán thảo luận sau sách này) Theo nguyên tắc chung, khuyên bạn nên đặt mặc định tiêu chuẩn hóa trừ bạn có lý cụ thể để sử dụng giải pháp thay Chúng ta thấy tác động việc tiêu chuẩn hóa cách xem xét giá trị trung bình độ lệch chuẩn kết đầu 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 Standard deviation: 1.0 Nếu liệu có giá trị ngoại lai, tác động tiêu cực đến việc tiêu chuẩn hóa chúng tơi cách ảnh hưởng đến giá trị trung bình phương sai thuộc tính Trong trường hợp này, việc thay đổi thang đo thuộc tính cách sử dụng trung vị khoảng tứ phân vị thường hữu ích Trong scikit-learn, thực việc phương pháp RobustScaler: # Create scaler robust_scaler = preprocessing.RobustScaler() # Transform feature robust_scaler.fit_transform(x) array([[ -1.87387612], [ -0.875 ], [ ], [ 0.125 ], [ 10.61488511]]) Bình thường hóa quan sát Bạn muốn rescale giá trị đặc trưng quan sát để có định mức đơn vị (tổng độ dài 1) Chúng ta sử dụng Normalizer với đối số norm # Load libraries import numpy as np 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], [10.9, 3.3]]) # Create normalizer normalizer = Normalizer(norm="l2") # Transform feature matrix normalizer.transform(features) array([[ 0.70710678, 0.70710678], [ 0.30782029, 0.95144452], [ 0.07405353, 0.99725427], [ 0.04733062, 0.99887928], [ 0.95709822, 0.28976368]]) Nhiều phương pháp thay đổi tỷ lệ (ví dụ: tối đa-tối thiểu chuẩn hóa) vận hành biến; nhiên, thay đổi thang đo theo quan sát riêng lẻ Normalizer định lại tỷ lệ giá trị quan sát riêng lẻ để có định mức đơn vị (tổng độ dài chúng 1) Kiểu thay đổi tỷ lệ thường sử dụng có nhiều biến tương đương (ví dụ: phân loại văn từ nhóm n từ biến) Normalizer cung cấp ba tùy chọn chuẩn với chuẩn Euclide (thường gọi L2) đối số mặc định: x quan sát riêng lẻ x n giá trị quan sát đặc điểm thứ n # Transform feature matrix features_l2_norm = Normalizer(norm="l2").transform(features) # Show feature matrix features_l2_norm array([[ 0.70710678, 0.70710678], [ 0.30782029, 0.95144452], [ 0.07405353, 0.99725427], [ 0.04733062, 0.99887928], [ 0.95709822, 0.28976368]]) Cịn khơng, sử dụng chuẩn Manhattan norm (L1): # Transform feature matrix features_l1_norm = Normalizer(norm="l1").transform(features) # Show feature matrix features_l1_norm array([[ 0.5 , 0.5 ], [ 0.24444444, 0.75555556], [ 0.06912442, 0.93087558], [ 0.04524008, 0.95475992], [ 0.76760563, 0.23239437]]) Về mặt trực quan, chuẩn L2 coi khoảng cách hai điểm New York chim (tức đường thẳng), L1 coi khoảng cách người đường (đi phía bắc dãy nhà, dãy phía đơng, dãy phía bắc, dãy phía đơng, v.v.), lý gọi “chuẩn Manhattan” “chuẩn Taxicab” Trên thực tế, lưu ý norm="l1" thay đổi tỷ lệ giá trị quan sát để chúng có tổng 1, đơi 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]) Sum of the first observation's values: 1.0 Tạo biến đa thức tương tác Mặc dù số người chọn tạo tính đa thức tương tác theo cách thủ công, scikit-learn cung cấp phương pháp tích hợp sẵn: # Load libraries import numpy as np from sklearn.preprocessing import PolynomialFeatures # Create feature matrix features = np.array([[2, 3], [2, 3], [2, 3]]) # Create PolynomialFeatures object polynomial_interaction = PolynomialFeatures(degree=2, include_bias=False) # Create polynomial features polynomial_interaction.fit_transform(features) array([[ 2., 3., 4., 6., 9.], [ 2., 3., 4., 6., 9.], [ 2., 3., 4., 6., 9.]]) Tham số degree xác định bậc tối đa đa thức Ví dụ: degree =2 tạo tính nâng lên lũy thừa bậc hai: degree =3 tạo tính nâng lên lũy thừa bậc hai thứ ba: Ngoài theo mặc định PolynomialFeatures bao gồm ln tương tác đặc tính: Chúng ta hạn chế tính tạo tính tương tác cách đặt interaction_only thành True: interaction = PolynomialFeatures(degree=2, interaction_only=True, include_bias=False) interaction.fit_transform(features) array([[ 2., 3., 6.], [ 2., 3., 6.], [ 2., 3., 6.]]) Các biến đa thức thường tạo muốn đưa vào khái niệm tồn mối quan hệ phi tuyến tính biến mục tiêu Ví dụ, nghi ngờ ảnh hưởng tuổi tác đến khả mắc bệnh lý nghiêm trọng cố định theo thời gian mà tăng lên tuổi tác tăng lên Chúng ta mã hóa hiệu ứng khơng cố định đối tượng, x , cách tạo dạng bậc cao đối tượng ( x2, x3, v.v.) Ngồi ra, thường gặp phải tình tác dụng biến này phụ thuộc vào biến khác Một ví dụ đơn giản cố gắng dự đốn xem cà phê có hay khơng có hai đặc điểm: (1) cà phê có khuấy hay khơng (2) có thêm đường hay khơng Riêng lẻ, đặc điểm khơng dự đốn độ cà phê, kết hợp tác dụng chúng có Nghĩa cà phê có vị cà phê có đường khuấy Tác động đặc tính lên mục tiêu (vị ngọt) phụ thuộc lẫn Chúng ta mã hóa mối quan hệ cách đưa vào đặc tính tương tác tích đặc tính riêng lẻ Chuyển đổi biến số Bạn muốn thực chuyển đổi tùy chỉnh sang nhiều tính Trong scikit-learn, sử dụng hàm FunctionTransformer để áp dụng hàm cho tập hợp biến số: # Load libraries import numpy as np 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: return x + 10 # Create transformer ten_transformer = FunctionTransformer(add_ten) # Transform feature matrix ten_transformer.transform(features) array([[12, 13], [12, 13], [12, 13]]) Chúng ta chuyển đổi biến số pandas hàm apply: Khơng có kỹ thuật tốt để phát giá trị ngoại lai Thay vào đó, có tập hợp kỹ thuật, tất có ưu điểm nhược điểm riêng Chiến lược tốt thường thử nhiều kỹ thuật (ví dụ: phát EllipticEnvelope IQR) xem xét kết cách tổng thể Nếu có thể, nên xem xét quan sát mà phát giá trị ngoại lai cố gắng hiểu chúng Ví dụ: có tập liệu ngơi nhà biến số phịng, giá trị ngoại lai có 100 phịng có thực ngơi nhà hay thực khách sạn bị phân loại sai? Xử lý giá trị ngoại lai Bạn có giá trị ngoại lai liệu mà bạn muốn xác định sau giảm tác động chúng đến phân phối liệu Thơng thường sử dụng ba chiến lược để xử lý ngoại lệ Đầu tiên, loại bỏ chúng: # Load library import pandas as pd # Create DataFrame houses = pd.DataFrame() houses['Price'] = [534433, 392333, 293222, 4322032] houses['Bathrooms'] = [2, 3.5, 2, 116] houses['Square_Feet'] = [1500, 2500, 1500, 48000] # Filter observations houses[houses['Bathrooms'] < 20] Price 53443 Bathroo Square_F ms eet 2.0 1500 3.5 2500 2.0 1500 39233 29322 Thứ hai, đánh dấu chúng giá trị ngoại lai thêm “Outlier” vào thành biến số: # Load library import numpy as np # Create feature based on boolean condition houses["Outlier"] = np.where(houses["Bathrooms"] < 20, 0, 1) # Show data houses Price 53443 Bathroo Square_F Outli ms eet er 2.0 1500 3.5 2500 2.0 1500 39233 29322 Price 43220 Bathroo Square_F Outli ms eet er 116.0 48000 32 Cách cuối chuyển biến để làm giảm tác động giá trị ngoại lai: # Log feature houses["Log_Of_Square_Feet"] = [np.log(x) for x in houses["Square_Feet"]] # Show data houses Price 53443 Bathroo Square_F Outli Log_Of_Square_ ms eet er Feet 2.0 1500 7.313220 3.5 2500 7.824046 2.0 1500 7.313220 116.0 48000 10.778956 39233 29322 43220 32 Tương tự việc phát giá trị ngoại lệ, khơng có quy tắc cố định nhanh chóng để xử lý chúng Cách xử lý chúng phải dựa hai khía cạnh Đầu tiên, nên xem xét điều khiến chúng trở nên khác biệt Nếu chúng tơi cho lỗi liệu, chẳng hạn cảm biến bị hỏng giá trị bị mã hóa sai, loại bỏ quan sát thay giá trị ngoại lệ NaN chúng tơi khơng thể tin cậy giá trị Tuy nhiên, tin giá trị ngoại lai giá trị thực (ví dụ: ngơi nhà [biệt thự] có 200 phịng tắm), việc đánh dấu chúng giá trị ngoại lệ chuyển đổi giá trị chúng phù hợp Thứ hai, cách xử lý ngoại lệ phải dựa mục tiêu máy học Ví dụ: muốn dự đốn giá nhà dựa đặc điểm ngơi nhà, giả định cách hợp lý giá biệt thự có 100 phịng tắm thúc đẩy động lực khác với nhà gia đình thơng thường Hơn nữa, đào tạo mơ hình để sử dụng phần ứng dụng web cho vay mua nhà trực tuyến, chúng tơi cho người dùng tiềm không bao gồm tỷ phú tìm mua biệt thự Vậy nên làm có ngoại lệ? Hãy suy nghĩ lý chúng ngoại lệ, có mục tiêu cuối cho liệu quan trọng nhớ việc không đưa định giải giá trị ngoại lai tự định có hàm ý Một điểm bổ sung: bạn có giá trị ngoại lai, chuẩn hóa khơng phù hợp giá trị trung bình phương sai bị ảnh hưởng nhiều giá trị ngoại lai Trong trường hợp này, sử dụng phương pháp thay đổi tỷ lệ mạnh mẽ để chống lại giá trị ngoại lệ, RobustScaler Phân nhóm biến định lượng cách sử dụng Rời rạc hóa Bạn có biến định lượng muốn chia thành phần rời rạc Tùy thuộc vào cách muốn chia nhỏ liệu, có hai kỹ thuật sử dụng Đầu tiên, nhị phân hóa biến theo số ngưỡng: # Load libraries import numpy as np 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 chia biến số thành nhiều ngưỡng: # Bin feature np.digitize(age, bins=[20,30,64]) array([[0], [0], [1], [2], [3]]) Lưu ý đối số cho tham số bins biểu thị giới hạn trái bin Ví dụ: đối số 20 khơng bao gồm phần tử có giá trị 20, có hai giá trị nhỏ 20 Chúng ta chuyển đổi hành vi cách đặt tham số right thành True: # Bin feature np.digitize(age, bins=[20,30,64], right=True) array([[0], [0], [0], [2], [3]]) Rời rạc hóa chiến lược hiệu có lý để tin biến số hoạt động giống biến phân loại Ví dụ, tin có khác biệt thói quen chi tiêu niên 19 20 tuổi, có khác biệt đáng kể niên 20 21 tuổi (độ tuổi Hoa Kỳ mà niên tiêu dùng rượu bia) Trong ví dụ đó, hữu ích chia cá nhân liệu thành người uống rượu người khơng thể Tương tự, trường hợp khác, việc phân tách liệu thành ba bin trở lên hữu ích Trong ví dụ trên, chúng tơi thấy có hai phương pháp rời rạc hóa—Binarizer scikit-learn chia thành hai bin digitize NumPy cho ba bin trở lên—tuy nhiên, sử dụng digitize để nhị phân hóa tính Binarizer cách định ngưỡng nhất: # Bin feature np.digitize(age, bins=[18]) Translate into array([[0], [0], [1], [1], [1]]) Phân nhóm biến định lượng cách sử dụng phân cụm (clustering) Bạn muốn nhóm quan sát để quan sát tương tự nhóm lại với Nếu bạn biết có k nhóm, bạn sử dụng phân cụm k-means để nhóm quan sát tương tự đưa thuộc tính chứa thành viên nhóm quan sát: # Load libraries import pandas as pd from sklearn.datasets import make_blobs from sklearn.cluster import KMeans # Make simulated feature matrix features, _ = make_blobs(n_samples = 50, n_features = 2, centers = 3, random_state = 1) # Create DataFrame dataframe = pd.DataFrame(features, columns=["feature_1", "feature_2"]) # Make k-means clusterer clusterer = KMeans(3, random_state=0)