Máy học 101: #1

Feb 27 2023
Mã hóa một chiều (OHE)
Mục lục · Giới thiệu ∘ Tại sao không .get_dummies( ) ?· Nhập dữ liệu ∘ Thứ nguyên ∘ Số biến phân loại ∘ Lọc các biến phân loại ∘ Số lượng cột bổ sung dự đoán · Một mã hóa nóng (OHE) ∘ Số cột bổ sung thực tế Giới thiệu Máy móc YÊU những con số KHÔNG thích dữ liệu văn bản lắm Rất nhiều dữ liệu có ở dạng dữ liệu văn bản.

Mục lục

· Giới thiệu
∘ Tại sao không .get_dummies( ) ?
· Nhập dữ liệu
∘ Thứ nguyên
∘ Số lượng biến phân loại
∘ Lọc các biến phân loại
∘ Số lượng cột bổ sung được dự đoán
· Một mã hóa nóng (OHE)
∘ Số lượng cột bổ sung thực tế

Giới thiệu

Máy YÊU những con số KHÔNG thích dữ liệu văn bản

Rất nhiều dữ liệu đến ở dạng dữ liệu văn bản. Các nhà khoa học dữ liệu cần có khả năng chuyển đổi dữ liệu này thành loại dữ liệu số để các thuật toán máy học của chúng tôi không bị lỗi

Trong hướng dẫn Machine Learning 101 đầu tiên của chúng tôi , chúng ta sẽ tìm hiểu cách Mã hóa một lần nóng (OHE) các biến phân loại trong tập dữ liệu.

Chúng tôi sẽ lấy một tập dữ liệu về dữ liệu mua bán nhà ở và chúng tôi sẽ mã hóa tất cả các đặc điểm phân loại của khung dữ liệu này để tạo các biến giả sẽ nhận giá trị là 0️ hoặc 1 . Các biến giả này sau đó sẽ được thêm lại vào khung dữ liệu ban đầu.

Đổi lại, chúng tôi cũng sẽ cần loại bỏ ️ các cột văn bản gốc đã được mã hóa, vì các thuật toán máy học của chúng tôi sẽ không thích những cột này ❌

Tại sao không .get_dummies( ) ?

Một cách tiếp cận khác để mã hóa các biến phân loại là sử dụng phương thức .get_dummies() . Tại sao không sử dụng phương pháp này, thay vào đó?

Câu trả lời là vì .get_dummies( ) kém hiệu quả hơn nhiều so với việc sử dụng OHE cho các tập dữ liệu lớn hơn OHE hiệu quả hơn vì nó tận dụng một thứ gọi là ma trận thưa thay vì chỉ xuất ra toàn bộ khung dữ liệu.

Nhập dữ liệu

Dữ liệu cho hướng dẫn này có thể được tìm thấy tại Github của tôi .

# Import libraries
import pandas as pd
import numpy as np
import warnings

# Ignore warnings
warnings.filterwarnings("ignore")
    
# Import data
data = pd.read_csv("Housing_Sales_Data.csv")

# Display subset of data frame
data.iloc[:,:10].head()

Bằng cách sử dụng .shape , chúng tôi có thể tìm kích thước của khung dữ liệu nhà ở của mình: 1379 hàng và 80 cột.

# Inspect df dimensions
data.shape

Sử dụng phương thức .value_counts( ) , chúng ta có thể đếm số lượng của từng loại biến trong khung dữ liệu của mình Chúng ta sẽ tìm thấy 43 cột của đối tượng kiểu dữ liệu (biến chuỗi). Đây là những cột phân loại của chúng tôi.

# Count data types
data.dtypes.value_counts()

      
                

Bây giờ chúng ta sẽ tạo một biến, mặt nạ , cho phép chúng ta lọc ra các cột không phân loại khỏi khung dữ liệu của mình. mặt nạ sẽ nhận giá trị Boolean cho từng đối tượng tùy thuộc vào việc đối tượng đó có phải là biến phân loại hay không.

# Create mask variable
mask = data.dtypes == np.object

# Display mask
mask

      
                

# Select only categorical variables
categorical_cols = data.columns[mask]

Bạn nên xem có bao nhiêu biến bổ sung mà bạn muốn tạo, để xem liệu con số dự đoán của bạn có khớp với số cột thực tế được tạo ở cuối hay không.

Để xác định có bao nhiêu cột bổ sung sẽ được tạo, chúng tôi sử dụng hàm lambda . Đối với mỗi biến phân loại, hàm lambda sẽ trả về số lớp duy nhất cho đối tượng đó.

# Determine number of extra columns
num_ohe_cols = (data[categorical_cols]
                .apply(lambda x: x.nunique())
                .sort_values(ascending=False))

# Display first 10 rows
num_ohe_cols.head(10)

      
                

Chúng tôi sẽ không quan tâm đến việc mã hóa các tính năng chỉ có một giá trị, vì vậy sẽ xóa các tính năng này khỏi khung dữ liệu ❌ Nhân dịp này, không có tính năng nào chỉ có một giá trị, nhưng đây là một bước hữu ích cần có.

# No need to encode if there is only one value
small_num_ohe_cols = num_ohe_cols.loc[num_ohe_cols>1]

Ví dụ, Vùng lân cận sẽ tạo 25 biến giả, vì nó có 25 lớp duy nhất (xem bên trên). Trước khi thêm các cột mới này trở lại khung dữ liệu ban đầu, chúng tôi sẽ loại bỏ cột Vùng lân cận ban đầu vì nó sẽ không còn cần thiết nữa (và không thể được sử dụng do loại dữ liệu của nó)! Vì vậy, chúng tôi đang thêm 25 biến … nhưng trừ đi 1.

# Subtract 1 value from each feature
small_num_ohe_cols -= 1

# Sum of new features
small_num_ohe_cols.sum()

Một mã hóa hấp dẫn (OHE)

Trước khi nhập OneHotEncoder , chúng tôi sẽ tạo một bản sao khung dữ liệu của mình để tính toán sự khác biệt trong các cột trước và sau khi mã hóa.

# Copy of the data
data_ohe = data.copy()

# Import OneHotEncoder
from sklearn.preprocessing import OneHotEncoder

# Initialise
ohe = OneHotEncoder()

# The encoders
ohe = OneHotEncoder(drop="first")

May mắn thay… nó không có tác động đáng kể đến khả năng dự đoán mà máy học chủ yếu quan tâm Do đó, chúng tôi sẽ không sử dụng nó ở đây.

Bây giờ, chúng ta sẽ tạo một vòng lặp for Vòng lặp này sẽ:

  1. Lặp lại từng tính năng phân loại
  2. One Hot Mã hóa dữ liệu để trả về một mảng thưa thớt
  3. Xóa cột được liên kết khỏi khung dữ liệu gốc
  4. Lấy tên của tất cả các nhãn lớp duy nhất từ ​​cột
  5. Tạo tên cột cho từng cột được mã hóa theo giá trị
  6. Tạo khung dữ liệu mới
  7. Nối khung dữ liệu được mã hóa mới vào khung dữ liệu gốc
  8. # (1) - Loop through categorical variables
    for col in num_ohe_cols.index:
        
        # (2) - OHE data to get sparse matrix
        new_dat = ohe.fit_transform(data_ohe[[col]])
        
        # (3) - Remove this column from original df
        data_ohe = data_ohe.drop(col, axis=1)
        
         # (4) - Get unique value names
        cats = ohe.categories_
        
        # (5) - Create column names
        new_cols = ['_'.join([col,cat]) for cat in cats[0]]
        
        # (6) - Create new df
        new_df = pd.DataFrame(new_dat.toarray(),columns=new_cols)
        
        # (7) - Append df
        data_ohe = pd.concat([data_ohe, new_df], axis =1)
    

Khung dữ liệu này sau đó được thêm vào khung dữ liệu gốc sau khi Foundation bị xóa khỏi nó. Quá trình này lặp lại cho tất cả 43 biến phân loại trong khung dữ liệu gốc

Số cột bổ sung thực tế

Sau khi chúng tôi đã mã hóa từng biến phân loại và thêm tất cả các biến giả trở lại khung dữ liệu ban đầu… bây giờ chúng tôi muốn xác định có bao nhiêu cột bổ sung được tạo bằng cách mã hóa. Nhớ lại, chúng tôi đang mong đợi 215!

Chúng tôi sử dụng .shape[1] trên cả hai khung dữ liệu (khung có biến giả mới và khung ban đầu của chúng tôi). Điều này sẽ trả về số cột trong cả hai khung dữ liệu. Sau đó chúng tôi chỉ cần trừ cái này từ cái kia.

# Column difference is as calculated above
data_ohe.shape[1] - data.shape[1]

Hoàn thành!

Với điều đó, hướng dẫn này đã kết thúc! Tôi hy vọng bạn thấy nó hữu ích. Hẹn lần sau… Súp Đậu ✌️