Học máy với Python - Chuẩn bị dữ liệu
Giới thiệu
Các thuật toán Học máy hoàn toàn phụ thuộc vào dữ liệu vì nó là khía cạnh quan trọng nhất giúp đào tạo mô hình có thể thực hiện được. Mặt khác, nếu chúng ta không thể hiểu được dữ liệu đó, trước khi đưa nó vào các thuật toán ML, một cỗ máy sẽ trở nên vô dụng. Nói một cách đơn giản, chúng ta luôn cần cung cấp dữ liệu phù hợp, tức là dữ liệu có tỷ lệ, định dạng chính xác và chứa các tính năng có ý nghĩa, cho vấn đề chúng ta muốn máy giải quyết.
Điều này làm cho việc chuẩn bị dữ liệu trở thành bước quan trọng nhất trong quy trình ML. Chuẩn bị dữ liệu có thể được định nghĩa là quy trình làm cho tập dữ liệu của chúng tôi phù hợp hơn với quy trình ML.
Tại sao phải xử lý trước dữ liệu?
Sau khi chọn dữ liệu thô để huấn luyện ML, công việc quan trọng nhất là xử lý trước dữ liệu. Theo nghĩa rộng, tiền xử lý dữ liệu sẽ chuyển đổi dữ liệu đã chọn thành một dạng mà chúng ta có thể làm việc hoặc có thể cung cấp cho các thuật toán ML. Chúng tôi luôn cần xử lý trước dữ liệu của mình để dữ liệu có thể giống như kỳ vọng của thuật toán học máy.
Kỹ thuật xử lý trước dữ liệu
Chúng tôi có các kỹ thuật tiền xử lý dữ liệu sau đây có thể được áp dụng trên tập dữ liệu để tạo dữ liệu cho các thuật toán ML -
Mở rộng quy mô
Hầu hết có lẽ tập dữ liệu của chúng tôi bao gồm các thuộc tính với tỷ lệ khác nhau, nhưng chúng tôi không thể cung cấp dữ liệu đó cho thuật toán ML do đó nó yêu cầu thay đổi tỷ lệ. Thay đổi tỷ lệ dữ liệu đảm bảo rằng các thuộc tính có cùng tỷ lệ. Nói chung, các thuộc tính được thay đổi tỷ lệ thành phạm vi 0 và 1. Các thuật toán ML như gradient descent và k-Nearest Neighbors yêu cầu dữ liệu được chia tỷ lệ. Chúng ta có thể bán lại dữ liệu với sự trợ giúp của lớp MinMaxScaler của thư viện Python scikit-learning.
Thí dụ
Trong ví dụ này, chúng tôi sẽ bán lại dữ liệu của bộ dữ liệu bệnh tiểu đường người da đỏ Pima mà chúng tôi đã sử dụng trước đó. Đầu tiên, dữ liệu CSV sẽ được tải (như đã thực hiện trong các chương trước) và sau đó với sự trợ giúp của lớp MinMaxScaler, nó sẽ được thay đổi tỷ lệ trong phạm vi 0 và 1.
Vài dòng đầu tiên của tập lệnh sau giống như chúng ta đã viết trong các chương trước khi tải dữ liệu CSV.
from pandas import read_csv
from numpy import set_printoptions
from sklearn import preprocessing
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values
Bây giờ, chúng ta có thể sử dụng lớp MinMaxScaler để chia tỷ lệ dữ liệu trong phạm vi 0 và 1.
data_scaler = preprocessing.MinMaxScaler(feature_range=(0,1))
data_rescaled = data_scaler.fit_transform(array)
Chúng tôi cũng có thể tóm tắt dữ liệu cho đầu ra theo lựa chọn của chúng tôi. Ở đây, chúng tôi đang đặt độ chính xác thành 1 và hiển thị 10 hàng đầu tiên trong đầu ra.
set_printoptions(precision=1)
print ("\nScaled data:\n", data_rescaled[0:10])
Đầu ra
Scaled data:
[
[0.4 0.7 0.6 0.4 0. 0.5 0.2 0.5 1. ]
[0.1 0.4 0.5 0.3 0. 0.4 0.1 0.2 0. ]
[0.5 0.9 0.5 0. 0. 0.3 0.3 0.2 1. ]
[0.1 0.4 0.5 0.2 0.1 0.4 0. 0. 0. ]
[0. 0.7 0.3 0.4 0.2 0.6 0.9 0.2 1. ]
[0.3 0.6 0.6 0. 0. 0.4 0.1 0.2 0. ]
[0.2 0.4 0.4 0.3 0.1 0.5 0.1 0.1 1. ]
[0.6 0.6 0. 0. 0. 0.5 0. 0.1 0. ]
[0.1 1. 0.6 0.5 0.6 0.5 0. 0.5 1. ]
[0.5 0.6 0.8 0. 0. 0. 0.1 0.6 1. ]
]
Từ đầu ra ở trên, tất cả dữ liệu đã được thay đổi tỷ lệ thành phạm vi 0 và 1.
Bình thường hóa
Một kỹ thuật tiền xử lý dữ liệu hữu ích khác là Chuẩn hóa. Điều này được sử dụng để bán lại mỗi hàng dữ liệu có độ dài là 1. Nó chủ yếu hữu ích trong tập dữ liệu thưa thớt nơi chúng ta có rất nhiều số không. Chúng tôi có thể chia tỷ lệ dữ liệu với sự trợ giúp của lớp Normalizer của thư viện Python scikit-learning.
Các loại chuẩn hóa
Trong học máy, có hai loại kỹ thuật tiền xử lý chuẩn hóa như sau:
Chuẩn hóa L1
Nó có thể được định nghĩa là kỹ thuật chuẩn hóa sửa đổi các giá trị của tập dữ liệu theo cách mà trong mỗi hàng, tổng các giá trị tuyệt đối sẽ luôn lên đến 1. Nó còn được gọi là Sai lệch tuyệt đối ít nhất.
Example
Trong ví dụ này, chúng tôi sử dụng kỹ thuật L1 Normalize để chuẩn hóa dữ liệu của bộ dữ liệu bệnh tiểu đường người da đỏ Pima mà chúng tôi đã sử dụng trước đó. Đầu tiên, dữ liệu CSV sẽ được tải và sau đó với sự trợ giúp của lớp Normalizer, nó sẽ được chuẩn hóa.
Vài dòng đầu tiên của tập lệnh sau giống như chúng ta đã viết trong các chương trước khi tải dữ liệu CSV.
from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import Normalizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv (path, names=names)
array = dataframe.values
Bây giờ, chúng ta có thể sử dụng lớp Normalizer với L1 để chuẩn hóa dữ liệu.
Data_normalizer = Normalizer(norm='l1').fit(array)
Data_normalized = Data_normalizer.transform(array)
Chúng tôi cũng có thể tóm tắt dữ liệu cho đầu ra theo lựa chọn của chúng tôi. Ở đây, chúng tôi đang đặt độ chính xác thành 2 và hiển thị 3 hàng đầu tiên trong đầu ra.
set_printoptions(precision=2)
print ("\nNormalized data:\n", Data_normalized [0:3])
Output
Normalized data:
[
[0.02 0.43 0.21 0.1 0. 0.1 0. 0.14 0. ]
[0. 0.36 0.28 0.12 0. 0.11 0. 0.13 0. ]
[0.03 0.59 0.21 0. 0. 0.07 0. 0.1 0. ]
]
Chuẩn hóa L2
Nó có thể được định nghĩa là kỹ thuật chuẩn hóa sửa đổi các giá trị của tập dữ liệu theo cách mà trong mỗi hàng, tổng các bình phương sẽ luôn lên đến 1. Nó còn được gọi là bình phương nhỏ nhất.
Example
Trong ví dụ này, chúng tôi sử dụng kỹ thuật Chuẩn hóa L2 để chuẩn hóa dữ liệu của bộ dữ liệu bệnh tiểu đường người da đỏ Pima mà chúng tôi đã sử dụng trước đó. Đầu tiên, dữ liệu CSV sẽ được tải (như đã thực hiện trong các chương trước) và sau đó với sự trợ giúp của lớp Normalizer, nó sẽ được chuẩn hóa.
Vài dòng đầu tiên của tập lệnh sau giống như chúng ta đã viết trong các chương trước khi tải dữ liệu CSV.
from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import Normalizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv (path, names=names)
array = dataframe.values
Bây giờ, chúng ta có thể sử dụng lớp Normalizer với L1 để chuẩn hóa dữ liệu.
Data_normalizer = Normalizer(norm='l2').fit(array)
Data_normalized = Data_normalizer.transform(array)
Chúng tôi cũng có thể tóm tắt dữ liệu cho đầu ra theo lựa chọn của chúng tôi. Ở đây, chúng tôi đang đặt độ chính xác thành 2 và hiển thị 3 hàng đầu tiên trong đầu ra.
set_printoptions(precision=2)
print ("\nNormalized data:\n", Data_normalized [0:3])
Output
Normalized data:
[
[0.03 0.83 0.4 0.2 0. 0.19 0. 0.28 0.01]
[0.01 0.72 0.56 0.24 0. 0.22 0. 0.26 0. ]
[0.04 0.92 0.32 0. 0. 0.12 0. 0.16 0.01]
]
Binarization
Như tên cho thấy, đây là kỹ thuật với sự trợ giúp của chúng tôi có thể tạo dữ liệu nhị phân. Chúng ta có thể sử dụng ngưỡng nhị phân để tạo dữ liệu của chúng ta ở dạng nhị phân. Các giá trị trên giá trị ngưỡng đó sẽ được chuyển đổi thành 1 và dưới ngưỡng đó sẽ được chuyển đổi thành 0. Ví dụ: nếu chúng ta chọn giá trị ngưỡng = 0,5, thì giá trị tập dữ liệu ở trên nó sẽ trở thành 1 và dưới ngưỡng này sẽ trở thành 0. Nghĩa là tại sao chúng ta có thể gọi nóbinarizing dữ liệu hoặc thresholdingdữ liệu. Kỹ thuật này hữu ích khi chúng ta có xác suất trong tập dữ liệu của mình và muốn chuyển chúng thành các giá trị rõ nét.
Chúng ta có thể mã hóa dữ liệu với sự trợ giúp của lớp Binarizer của thư viện Python scikit-learning.
Thí dụ
Trong ví dụ này, chúng tôi sẽ bán lại dữ liệu của bộ dữ liệu bệnh tiểu đường người da đỏ Pima mà chúng tôi đã sử dụng trước đó. Đầu tiên, dữ liệu CSV sẽ được tải và sau đó với sự trợ giúp của lớp Binarizer, nó sẽ được chuyển đổi thành các giá trị nhị phân, tức là 0 và 1 tùy thuộc vào giá trị ngưỡng. Chúng tôi đang lấy 0,5 làm giá trị ngưỡng.
Vài dòng đầu tiên của tập lệnh sau giống như chúng ta đã viết trong các chương trước khi tải dữ liệu CSV.
from pandas import read_csv
from sklearn.preprocessing import Binarizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values
Bây giờ, chúng ta có thể sử dụng lớp Binarize để chuyển đổi dữ liệu thành các giá trị nhị phân.
binarizer = Binarizer(threshold=0.5).fit(array)
Data_binarized = binarizer.transform(array)
Ở đây, chúng tôi đang hiển thị 5 hàng đầu tiên trong đầu ra.
print ("\nBinary data:\n", Data_binarized [0:5])
Đầu ra
Binary data:
[
[1. 1. 1. 1. 0. 1. 1. 1. 1.]
[1. 1. 1. 1. 0. 1. 0. 1. 0.]
[1. 1. 1. 0. 0. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 0. 1. 0.]
[0. 1. 1. 1. 1. 1. 1. 1. 1.]
]
Tiêu chuẩn hóa
Một kỹ thuật tiền xử lý dữ liệu hữu ích khác về cơ bản được sử dụng để biến đổi các thuộc tính dữ liệu với phân phối Gaussian. Nó khác giá trị trung bình và SD (Độ lệch chuẩn) với phân phối Gaussian chuẩn với giá trị trung bình là 0 và SD là 1. Kỹ thuật này hữu ích trong các thuật toán ML như hồi quy tuyến tính, hồi quy logistic giả định phân phối Gaussian trong tập dữ liệu đầu vào và tạo ra tốt hơn kết quả với dữ liệu được thay đổi tỷ lệ. Chúng ta có thể chuẩn hóa dữ liệu (mean = 0 và SD = 1) với sự trợ giúp của lớp StandardScaler của thư viện Scikit-learning Python.
Thí dụ
Trong ví dụ này, chúng tôi sẽ bán lại dữ liệu của bộ dữ liệu bệnh tiểu đường người da đỏ Pima mà chúng tôi đã sử dụng trước đó. Đầu tiên, dữ liệu CSV sẽ được tải và sau đó với sự trợ giúp của lớp StandardScaler, nó sẽ được chuyển đổi thành Phân phối Gaussian với giá trị trung bình = 0 và SD = 1.
Vài dòng đầu tiên của tập lệnh sau giống như chúng ta đã viết trong các chương trước khi tải dữ liệu CSV.
from sklearn.preprocessing import StandardScaler
from pandas import read_csv
from numpy import set_printoptions
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values
Bây giờ, chúng ta có thể sử dụng lớp StandardScaler để bán lại dữ liệu.
data_scaler = StandardScaler().fit(array)
data_rescaled = data_scaler.transform(array)
Chúng tôi cũng có thể tóm tắt dữ liệu cho đầu ra theo lựa chọn của chúng tôi. Ở đây, chúng tôi đang đặt độ chính xác thành 2 và hiển thị 5 hàng đầu tiên trong đầu ra.
set_printoptions(precision=2)
print ("\nRescaled data:\n", data_rescaled [0:5])
Đầu ra
Rescaled data:
[
[ 0.64 0.85 0.15 0.91 -0.69 0.2 0.47 1.43 1.37]
[-0.84 -1.12 -0.16 0.53 -0.69 -0.68 -0.37 -0.19 -0.73]
[ 1.23 1.94 -0.26 -1.29 -0.69 -1.1 0.6 -0.11 1.37]
[-0.84 -1. -0.16 0.15 0.12 -0.49 -0.92 -1.04 -0.73]
[-1.14 0.5 -1.5 0.91 0.77 1.41 5.48 -0.02 1.37]
]
Ghi nhãn dữ liệu
Chúng tôi đã thảo luận về tầm quan trọng của fata tốt đối với các thuật toán ML cũng như một số kỹ thuật xử lý trước dữ liệu trước khi gửi nó đến các thuật toán ML. Một khía cạnh nữa trong vấn đề này là ghi nhãn dữ liệu. Nó cũng rất quan trọng để gửi dữ liệu đến các thuật toán ML có nhãn thích hợp. Ví dụ, trong trường hợp các vấn đề phân loại, rất nhiều nhãn ở dạng từ, số, v.v. có trên dữ liệu.
Mã hóa nhãn là gì?
Hầu hết các hàm sklearn đều mong đợi rằng dữ liệu có nhãn số hơn là nhãn từ. Do đó, chúng ta cần chuyển đổi các nhãn đó thành nhãn số. Quá trình này được gọi là mã hóa nhãn. Chúng ta có thể thực hiện mã hóa nhãn của dữ liệu với sự trợ giúp của hàm LabelEncoder () của thư viện Python scikit-learning.
Thí dụ
Trong ví dụ sau, tập lệnh Python sẽ thực hiện mã hóa nhãn.
Đầu tiên, nhập các thư viện Python được yêu cầu như sau:
import numpy as np
from sklearn import preprocessing
Bây giờ, chúng ta cần cung cấp các nhãn đầu vào như sau:
input_labels = ['red','black','red','green','black','yellow','white']
Dòng mã tiếp theo sẽ tạo bộ mã hóa nhãn và đào tạo nó.
encoder = preprocessing.LabelEncoder()
encoder.fit(input_labels)
Các dòng tiếp theo của tập lệnh sẽ kiểm tra hiệu suất bằng cách mã hóa danh sách được sắp xếp ngẫu nhiên -
test_labels = ['green','red','black']
encoded_values = encoder.transform(test_labels)
print("\nLabels =", test_labels)
print("Encoded values =", list(encoded_values))
encoded_values = [3,0,4,1]
decoded_list = encoder.inverse_transform(encoded_values)
Chúng tôi có thể lấy danh sách các giá trị được mã hóa với sự trợ giúp của tập lệnh python sau:
print("\nEncoded values =", encoded_values)
print("\nDecoded labels =", list(decoded_list))
Đầu ra
Labels = ['green', 'red', 'black']
Encoded values = [1, 2, 0]
Encoded values = [3, 0, 4, 1]
Decoded labels = ['white', 'black', 'yellow', 'green']