Bạn là một người mới và muốn có một cách để loại bỏ các giá trị không phải là số lượng từ bộ dữ liệu. Vâng, trong trường hợp đó, chúng tôi đang chia sẻ những vấn đề tương tự. Tôi sẽ giải thích 3 phương pháp khác nhau sẽ giải quyết vấn đề của bạn.
Các biến phân loại là các loại dữ liệu là Nun-Numeric và bao gồm các câu trả lời hạn chế. Ví dụ, một câu hỏi hỏi bạn tần suất bạn chơi thể thao như thế nào: Không bao giờ, thì hiếm khi, một ngày, hầu hết các ngày, hay mỗi ngày. Trong trường hợp này, dữ liệu là phân loại, bởi vì các câu trả lời rơi vào một tập hợp các danh mục cố định. Những người đã trả lời câu hỏi thương hiệu xe đạp nào họ sở hữu, các câu trả lời sẽ thuộc về các danh mục như Trek Trek, thì Carr Carraro, và Sal Salcano Hồi . Trong trường hợp này, dữ liệu cũng được phân loại. Để xử lý các biến phân loại, hãy để bắt đầu mã.
People responded to question which what brand of bicycle they owned, the responses would fall into categories like “Trek”, “Carraro”, and “Salcano”. In this case, the data is also categorical.
To handle categorical variables let’s start to code.
Chúng tôi sẽ bắt đầu với việc nhập dữ liệu tàu của chúng tôi và chia nó thành các tập hợp kiểm tra và xác thực. Để làm cho nó dễ dàng hơn, chúng tôi sẽ thả các cột có các giá trị bị thiếu.
import pandas as pd
from sklearn.model_selection import train_test_splitdata = pd.read_csv['../Kagle/train.csv']
y = data['SalePrice']
X = data.drop[['SalePrice'], axis=1]
# Split the data into training and validation sets
X_train_full, X_valid_full, y_train, y_valid = train_test_split[X, y, train_size=0.8, test_size=0.2, random_state=0]
# Drop columns with missing values [simplest approach]
cols_with_missing = [col for col in X_train_full.columns if X_train_full[col].isnull[].any[]]
X_train_full.drop[cols_with_missing, axis=1, inplace=True]
X_valid_full.drop[cols_with_missing, axis=1, inplace=True]
- Cách tiếp cận: Biến phân loại thả
Đây là cách đơn giản nhất. Chúng ta có thể trực tiếp thả các giá trị không phải là số và sử dụng phần còn lại.
# Drop columns with categorical variables
drop_X_train = X_train_full.select_dtypes[exclude=['object']]
drop_X_valid = X_valid_full.select_dtypes[exclude=['object']]
Chúng tôi thả các cột
# Drop columns with categorical variables
drop_X_train = X_train_full.select_dtypes[exclude=['object']]
drop_X_valid = X_valid_full.select_dtypes[exclude=['object']]
0 với phương pháp # Drop columns with categorical variables
drop_X_train = X_train_full.select_dtypes[exclude=['object']]
drop_X_valid = X_valid_full.select_dtypes[exclude=['object']]
1. # Drop columns with categorical variables
drop_X_train = X_train_full.select_dtypes[exclude=['object']]
drop_X_valid = X_valid_full.select_dtypes[exclude=['object']]
0 về cơ bản đề cập đến các giá trị với chuỗi.2. Cách tiếp cận: Mã hóa thứ tựApproach: Ordinal Encoding
Mã hóa thứ tự gán mỗi giá trị duy nhất cho một số nguyên khác nhau. Ví dụ: bạn có thể đặt hàng tần số như là người không bao giờ [0] Để sử dụng phương pháp này, vui lòng xem xét dữ liệu của bạn là bối cảnh thứ tự.
Để tiếp tục, chúng ta cần biết một thuật ngữ khác được gọi là Card Cardality. Cardinality có nghĩa là số lượng các giá trị duy nhất trong một cột. Nó phụ thuộc vào bộ dữ liệu và thuật toán của bạn nhưng làm việc với các cột phân loại cardinality thấp sẽ hiệu quả hơn, [ý tôi là thấp là 10 trở xuống, tuy nhiên nó phụ thuộc vào bộ dữ liệu của bạn để quyết định ranh giới.]cardinality”. Cardinality means the number of unique values in a column. It depends on your dataset and algorithm but working with low cardinality categorical columns will be more efficient, [What I mean by low is 10 and below, however it depends on your dataset to decide boundaries.]
Tìm các cột phân loại Cardinality thấp:
low_cardinality_cols = [cname for cname in X_train_full.columns if X_train_full[cname].nunique[] < 10 and
X_train_full[cname].dtype == "object"]
Don Tiết quên thêm các giá trị số:
numerical_cols = [cname for cname in X_train_full.columns if X_train_full[cname].dtype in ['int64', 'float64']]
Chúng tôi đang trộn chúng để tạo bộ tính năng cuối cùng:
my_cols = low_cardinality_cols + numerical_cols
X_train = X_train_full[my_cols].copy[]
X_valid = X_valid_full[my_cols].copy[]
Sau đó để có được danh sách các biến phân loại:
# Get list of categorical variables
s = [X_train.dtypes == 'object']
object_cols = list[s[s].index]
Tại thời điểm này, bộ dữ liệu của chúng tôi đã sẵn sàng để được mã hóa thứ tự. Những gì chúng tôi có là một bộ dữ liệu có các giá trị số và giá trị phân loại với tính toán dưới 10.
Thư viện Scikit-learn có một lớp
# Drop columns with categorical variables
drop_X_train = X_train_full.select_dtypes[exclude=['object']]
drop_X_valid = X_valid_full.select_dtypes[exclude=['object']]
3 có thể được sử dụng để có được mã hóa thứ tự. Chúng tôi sẽ áp dụng mã hóa thứ tự cho từng cột phân loại trong bộ dữ liệu của chúng tôi.from sklearn.preprocessing import OrdinalEncoder# Make copy to avoid changing original data
label_X_train = X_train.copy[]
label_X_valid = X_valid.copy[]
# Apply ordinal encoder to each column with categorical data
ordinal_encoder = OrdinalEncoder[]
label_X_train[object_cols] = ordinal_encoder.fit_transform[X_train[object_cols]]
label_X_valid[object_cols] = ordinal_encoder.transform[X_valid[object_cols]]
Lưu ý rằng, chúng tôi đang sử dụng
# Drop columns with categorical variables
drop_X_train = X_train_full.select_dtypes[exclude=['object']]
drop_X_valid = X_valid_full.select_dtypes[exclude=['object']]
4Method trong bộ tàu và # Drop columns with categorical variables
drop_X_train = X_train_full.select_dtypes[exclude=['object']]
drop_X_valid = X_valid_full.select_dtypes[exclude=['object']]
5Method trong bộ xác thực. Ngoài ra, phần trên, chúng tôi tự động chỉ định từng giá trị uniqe cho một số nguyên khác nhau. Nếu bạn muốn, bạn có thể cung cấp nhãn tốt hơn cho tất cả các biến được đặt hàng. Kiểm tra ở đây để biết tài liệu.!!! !!! Chúng ta cần thêm các dòng bổ sung vào mã trên để ngăn ngừa lỗi !!!
Vấn đề phổ biến nhất là sẽ có một số giá trị trong tập xác thực nhưng không có trong tập huấn luyện. Cách tiếp cận đơn giản nhất, là bỏ các cột phân loại có vấn đề.
# Categorical columns in the training data
object_cols = [col for col in X_train.columns if X_train[col].dtype == "object"]# Columns that can be safely ordinal encoded
good_label_cols = [col for col in object_cols if
set[X_valid[col]].issubset[set[X_train[col]]]]# Problematic columns that will be dropped from the dataset
bad_label_cols = list[set[object_cols]-set[good_label_cols]]
Phần trên chúng tôi tìm thấy các colums không có vấn đề và có vấn đề. Bây giờ chúng tôi sẽ chỉ sử dụng các giá trị phi biểu tượng.
label_X_train = X_train.drop[bad_label_cols, axis=1]
label_X_valid = X_valid.drop[bad_label_cols, axis=1]# Apply ordinal encoder
ordinal_encoder = OrdinalEncoder[]
label_X_train[good_label_cols] = ordinal_encoder.fit_transform[X_train[good_label_cols]]
label_X_valid[good_label_cols] = ordinal_encoder.transform[X_valid[good_label_cols]]
3. Cách tiếp cận: Mã hóa một lần nóng
Mã hóa một lần tạo ra các cột mới cho biết sự hiện diện [hoặc vắng mặt] của từng giá trị có thể trong dữ liệu gốc. Để hiểu điều này, bạn có thể kiểm tra ảnh dưới đây. Nếu dữ liệu phân loại của bạn không được đặt hàng như màu xanh lá cây, thì màu đỏ, thì màu xanh da trời hoặc nữ, nam, nam, hay thì tốt hơn là bạn nên sử dụng mã hóa một lần. Các biến phân loại không có thứ hạng nội tại được gọi là các biến danh nghĩa. Ngoài ra, nếu các biến phân loại lấy số lượng lớn các giá trị [ví dụ: 15], có lẽ nó sẽ không hoạt động tốt.nominal variables. In addition, if the categorical variables takes large number of values [e.g. 15], probably it will not perform well.
Ảnh từ: Datagy.ioChúng tôi sử dụng lớp
# Drop columns with categorical variables
drop_X_train = X_train_full.select_dtypes[exclude=['object']]
drop_X_valid = X_valid_full.select_dtypes[exclude=['object']]
6 từ Scikit-learn để có được mã hóa một lần nóng. Kiểm tra ở đây để biết tài liệu.- Chúng tôi đặt
# Drop columns with categorical variables
7 để tránh các lỗi khi dữ liệu xác thực chứa các lớp không được biểu thị trong dữ liệu đào tạo và
drop_X_train = X_train_full.select_dtypes[exclude=['object']]
drop_X_valid = X_valid_full.select_dtypes[exclude=['object']] - Cài đặt
# Drop columns with categorical variables
8 đảm bảo rằng các cột được mã hóa được trả về dưới dạng mảng numpy [thay vì ma trận thưa thớt].
drop_X_train = X_train_full.select_dtypes[exclude=['object']]
drop_X_valid = X_valid_full.select_dtypes[exclude=['object']]
LƯU Ý: Chúng tôi sẽ sử dụng danh sách các biến phân loại, bộ đào tạo và xác thực
# Drop columns with categorical variables
drop_X_train = X_train_full.select_dtypes[exclude=['object']]
drop_X_valid = X_valid_full.select_dtypes[exclude=['object']]
9 mà chúng tôi đã tìm thấy trên phần trước.from sklearn.preprocessing import OneHotEncoder# Apply one-hot encoder to each column with categorical data
OH_encoder = OneHotEncoder[handle_unknown='ignore', sparse=False]
OH_cols_train = pd.DataFrame[OH_encoder.fit_transform[X_train[object_cols]]]
OH_cols_valid = pd.DataFrame[OH_encoder.transform[X_valid[object_cols]]]
# One-hot encoding removed index; put it back
OH_cols_train.index = X_train.index
OH_cols_valid.index = X_valid.index
# Remove categorical columns [will replace with one-hot encoding]
num_X_train = X_train.drop[object_cols, axis=1]
num_X_valid = X_valid.drop[object_cols, axis=1]
# Add one-hot encoded columns to numerical features
OH_X_train = pd.concat[[num_X_train, OH_cols_train], axis=1]
OH_X_valid = pd.concat[[num_X_valid, OH_cols_valid], axis=1]
Những gì chúng tôi đã làm ở trên là đầu tiên, chúng tôi đã trích xuất các cột số [tính năng] mới từ các biến phân loại và các chỉ mục phù hợp. Sau đó, chúng tôi đã bỏ tất cả các biến phân loại [
low_cardinality_cols = [cname for cname in X_train_full.columns if X_train_full[cname].nunique[] < 10 and
X_train_full[cname].dtype == "object"]
0] từ bộ dữ liệu của chúng tôi. Sau đó, chúng tôi đã tham gia các giá trị số từ bộ dữ liệu gốc [low_cardinality_cols = [cname for cname in X_train_full.columns if X_train_full[cname].nunique[] < 10 and
X_train_full[cname].dtype == "object"]
1] và các giá trị được mã hóa một lần [____ 22] mà chúng tôi có được.Trong bài viết này, chúng tôi đã liệt kê 3 cách tiếp cận khác nhau để xử lý các giá trị không phải là số trong bộ dữ liệu của chúng tôi. Chúng tôi đã sử dụng thư viện Python và Sckit-learn. Hãy nhớ rằng không có giải pháp nghiêm ngặt tốt nhất cho vấn đề này. Bạn cần xem xét bộ dữ liệu và thuật toán của bạn để chọn cách tiếp cận bạn sử dụng.
Refferences:
//www.kaggle.com