Hướng dẫn how does python handle non numeric data? - python xử lý dữ liệu không phải là số như thế nào?

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_split

data = 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)

  1. 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.io

Chú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
    drop_X_train = X_train_full.select_dtypes(exclude=['object'])
    drop_X_valid = X_valid_full.select_dtypes(exclude=['object'])
    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à
  • Cài đặ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'])
    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).

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:

https://www.kaggle.com

Làm thế nào để bạn xử lý không

Cách xử lý dữ liệu phi hình số điển hình nhất là chuyển đổi một cột duy nhất thành nhiều cột nhị phân. Điều này được gọi là "Nhận các biến giả" hoặc "mã hóa nóng" (trong số nhiều thuật ngữ hợm hĩnh khác).convert a single column into multiple binary columns. This is called "getting dummy variables" or a "one hot encoding" (among many other snobby terms).

Làm thế nào để học máy đối phó với không

Đầu tiên, bạn sẽ muốn đạp xe qua các cột trong Pandas DataFrame.Đối với các cột không phải là số, bạn muốn tìm các yếu tố duy nhất của chúng.Điều này có thể được thực hiện bằng cách đơn giản là lấy một tập hợp các giá trị cột.Từ đây, chỉ mục trong tập hợp đó có thể là giá trị "số" mới hoặc "ID" của dữ liệu văn bản.cycle through the columns in the Pandas dataframe. For columns that are not numbers, you want to find their unique elements. This can be done by simply take a set of the column values. From here, the index within that set can be the new "numerical" value or "id" of the text data.

Làm cách nào để kiểm tra xem dữ liệu không

Phương thức python isnumeric () kiểm tra xem tất cả các ký tự của chuỗi có phải là ký tự số hay không.Nó trả về đúng nếu tất cả các ký tự là đúng, nếu không thì trả về sai.Các ký tự số bao gồm các ký tự chữ số và tất cả các ký tự có thuộc tính giá trị số Unicode. checks whether all the characters of the string are numeric characters or not. It returns True if all the characters are true, otherwise returns False. Numeric characters include digit characters and all the characters which have the Unicode numeric value property.

Làm thế nào để bạn chuyển đổi không

Để mã hóa dữ liệu không phải là số thành số, bạn có thể sử dụng nhãn của Scikit-LEARN.Nó sẽ mã hóa từng danh mục như A, B, C cho số nguyên của Col1.enc.fit () tạo các giá trị số nguyên tương ứng.use scikit-learn's LabelEncoder. It will encode each category such as COL1's a , b , c to integers. enc. fit() creates the corresponding integer values.