df['column_name'] = pd.factorize[df['column_name']][0]
Bạn cũng có thể sử dụng cú pháp sau để chuyển đổi mọi biến phân loại trong DataFrame thành biến số
#identify all categorical variables cat_columns = df.select_dtypes[['object']].columns #convert all categorical variables to numeric df[cat_columns] = df[cat_columns].apply[lambda x: pd.factorize[x][0]]
Các ví dụ sau đây cho thấy cách sử dụng cú pháp này trong thực tế
ví dụ 1. Chuyển đổi một biến phân loại thành số
Giả sử chúng ta có DataFrame gấu trúc sau
import pandas as pd #create DataFrame df = pd.DataFrame[{'team': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'], 'position': ['G', 'G', 'F', 'G', 'F', 'C', 'G', 'F', 'C'], 'points': [5, 7, 7, 9, 12, 9, 9, 4, 13], 'rebounds': [11, 8, 10, 6, 6, 5, 9, 12, 10]}] #view DataFrame df team position points rebounds 0 A G 5 11 1 A G 7 8 2 A F 7 10 3 B G 9 6 4 B F 12 6 5 B C 9 5 6 C G 9 9 7 C F 4 12 8 C C 13 10
Chúng ta có thể sử dụng cú pháp sau để chuyển đổi cột 'đội' thành số
#convert 'team' column to numeric
df['team'] = pd.factorize[df['team']][0]
#view updated DataFrame
df
team position points rebounds
0 0 G 5 11
1 0 G 7 8
2 0 F 7 10
3 1 G 9 6
4 1 F 12 6
5 1 C 9 5
6 2 G 9 9
7 2 F 4 12
8 2 C 13 10
Đây là cách chuyển đổi hoạt động
- Mỗi đội có giá trị 'A' được chuyển đổi thành 0
- Mỗi đội có giá trị 'B' được chuyển đổi thành 1
- Mỗi đội có giá trị 'C' được chuyển đổi thành 2
ví dụ 2. Chuyển đổi nhiều biến phân loại thành số
Một lần nữa, giả sử chúng ta có DataFrame gấu trúc sau
import pandas as pd #create DataFrame df = pd.DataFrame[{'team': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'], 'position': ['G', 'G', 'F', 'G', 'F', 'C', 'G', 'F', 'C'], 'points': [5, 7, 7, 9, 12, 9, 9, 4, 13], 'rebounds': [11, 8, 10, 6, 6, 5, 9, 12, 10]}] #view DataFrame df team position points rebounds 0 A G 5 11 1 A G 7 8 2 A F 7 10 3 B G 9 6 4 B F 12 6 5 B C 9 5 6 C G 9 9 7 C F 4 12 8 C C 13 10
Chúng ta có thể sử dụng cú pháp sau để chuyển đổi mọi biến phân loại trong DataFrame thành biến số
#get all categorical columns
cat_columns = df.select_dtypes[['object']].columns
#convert all categorical columns to numeric
df[cat_columns] = df[cat_columns].apply[lambda x: pd.factorize[x][0]]
#view updated DataFrame
df
team position points rebounds
0 0 0 5 11
1 0 0 7 8
2 0 1 7 10
3 1 0 9 6
4 1 1 12 6
5 1 2 9 5
6 2 0 9 9
7 2 1 4 12
8 2 2 13 10
Lưu ý rằng cả hai cột phân loại [đội và vị trí] đều được chuyển đổi thành số trong khi các cột điểm và số lần bật lại vẫn giữ nguyên
Bất cứ khi nào chúng ta đưa văn bản vào máy tính, nó sẽ giải mã nó thành 0 và 1 mà con người không thể hiểu trực tiếp. Nó diễn giải những con số này dưới dạng hướng dẫn hiển thị văn bản, âm thanh, hình ảnh, v.v. , có ý nghĩa với mọi người. Tương tự, khi chúng tôi gửi dữ liệu tới bất kỳ mô hình máy học [ML] nào, chúng tôi cần gửi dữ liệu đó ở định dạng phù hợp vì các thuật toán chỉ hiểu các con số. Các biến phân loại này cũng chứa các mẩu thông tin có giá trị về dữ liệu. Trong bài viết này, chúng ta sẽ tìm hiểu cách mã hóa các biến phân loại thành số với Pandas và Scikit-learning
Các biến phân loại thường được gọi là 'chuỗi' hoặc 'danh mục' và có số lượng hữu hạn. Đây là vài ví dụ
Thành phố nơi một người sống. San Francisco, Chicago, Las Vegas, Seattle, v.v.
Bộ phận mà một người làm việc trong. Tiếp thị, Bán hàng, Nhân sự, v.v.
Bằng cấp cao nhất mà một người có. Trung học, Cử nhân, Thạc sĩ, Tiến sĩ, v.v.
Có hai loại dữ liệu phân loại, thứ tự và danh nghĩa
dữ liệu thông thường. Các giá trị tuân theo một số trật tự tự nhiên. Khi mã hóa dữ liệu theo thứ tự, chúng ta cần giữ lại thông tin liên quan đến thứ tự mà danh mục được cung cấp. Thứ tự rất quan trọng. Ví dụ, mức độ của một người cung cấp cho chúng tôi thông tin quan trọng về trình độ của mình. Chúng tôi không thể chỉ định ngẫu nhiên các số cho các độ này
Dữ liệu ẩn danh. Các danh mục không thể được sắp xếp theo bất kỳ cách có ý nghĩa nào. Trong dữ liệu danh nghĩa, có một giả định về thứ tự hiện tại. Chúng ta chỉ cần xem xét sự hiện diện và vắng mặt của một tính năng. Chẳng hạn, trong ví dụ trên, việc biết thành phố của một người là rất quan trọng. Cũng như vậy nếu người đó thích Chicago hay Las Vegas
Bây giờ chúng ta đã có kiến thức về các biến phân loại, hãy xem xét các tùy chọn để mã hóa chúng bằng Pandas và Scikit-learning
Tìm và thay thế
Phương pháp đơn giản nhất để mã hóa dữ liệu phân loại là tìm và thay thế. Phương thức replace[] thay thế mỗi lần xuất hiện khớp của ký tự cũ trong chuỗi bằng ký tự mới
Đây là cách nó hoạt động
Giả sử có một cột có tên là "số xi-lanh" trong tập dữ liệu và số xi-lanh cao nhất mà một chiếc ô tô có thể có là 4. Các giá trị mà cột này chứa không thể vượt quá 4. Tuy nhiên, vấn đề là tất cả các giá trị này đều được viết dưới dạng văn bản, chẳng hạn như “hai”, “một”, v.v. Những gì chúng ta có thể làm là thay thế trực tiếp các giá trị văn bản này bằng giá trị số tương đương của chúng bằng cách sử dụng chức năng 'thay thế' do Pandas cung cấp
numeric_var = {“num_cylinders”: {“four”:4, “three”:3, “two”:2, “one”:1}}
df = df.replace[numeric_var]
Ở đây, chúng tôi đang tạo một từ điển ánh xạ sẽ ánh xạ tất cả các giá trị văn bản thành các giá trị số của chúng. Cách tiếp cận này rất hữu ích khi xử lý dữ liệu theo thứ tự vì chúng ta cần duy trì trình tự
Trong ví dụ trên về “bằng cấp của một người”, chúng ta có thể ánh xạ mức độ cao nhất thành số lớn hơn và mức độ thấp nhất thành số thấp nhất
mã hóa nhãn
Theo cách tiếp cận này, mỗi nhãn được gán một số nguyên duy nhất dựa trên thứ tự bảng chữ cái. Chúng ta có thể thực hiện điều này bằng thư viện Scikit-learning
import pandas as pd
import numpy as np
df = pd.read_csv[“cars_data.csv”]
df.head[]
Tập dữ liệu này chứa một số giá trị null, vì vậy điều quan trọng là phải xóa chúng
Hãy xem kiểu dữ liệu của các tính năng này
________số 8Chúng ta có thể thấy rằng hầu hết tất cả các biến đều được đại diện bởi kiểu dữ liệu đối tượng, ngoại trừ cột “ký hiệu”
Hãy mã hóa cột “body_style”
#import label encoder
from sklearn import preprocessing
#make an instance of Label Encoder
label_encoder = preprocessing.LabelEncoder[]
df[‘’body_style”] = label_encoder.fir_transform[data[‘body_style’]
df.head[]
nguồn hình ảnh. Python kinh doanh thực tế
Vì mã hóa nhãn sử dụng thứ tự bảng chữ cái, "mui trần" đã được mã hóa bằng 0, "hatchback" đã được mã hóa bằng 2 và "sedan" với 3. Phải có một danh mục khác trong body_style được mã hóa bằng 1
Nếu chúng ta nhìn vào cột “body_style”, chúng ta sẽ nhận thấy rằng nó không có bất kỳ thứ tự nào. Nếu chúng tôi thực hiện mã hóa nhãn trên đó, chúng tôi sẽ thấy rằng cột được xếp hạng dựa trên bảng chữ cái. Do thứ tự này, mô hình có thể nắm bắt một số mối quan hệ giả định
Mã hóa một lần nóng
Chúng tôi thường sử dụng mã hóa một lần nóng để giải quyết nhược điểm của mã hóa nhãn. Chiến lược là chuyển đổi từng danh mục thành một cột và gán giá trị 1 hoặc 0 cho nó. Đó là một quá trình tạo ra các biến giả
Hãy xem cách chúng ta có thể triển khai nó trong Python
#identify all categorical variables cat_columns = df.select_dtypes[['object']].columns #convert all categorical variables to numeric df[cat_columns] = df[cat_columns].apply[lambda x: pd.factorize[x][0]]0
#identify all categorical variables cat_columns = df.select_dtypes[['object']].columns #convert all categorical variables to numeric df[cat_columns] = df[cat_columns].apply[lambda x: pd.factorize[x][0]]1
Chúng ta có thể thấy từ bảng trên rằng tất cả các danh mục duy nhất đã được chỉ định một cột mới. Nếu có một danh mục, chúng tôi có 1 trong cột và 0 cho những người khác
Vì dữ liệu thưa thớt nên nó dẫn đến bẫy biến giả vì kết quả của một biến có thể được dự đoán với sự trợ giúp của các biến còn lại. Sự cố này xảy ra khi các biến có tương quan cao với nhau. Nó cũng dẫn đến một vấn đề cộng tuyến gây ra các vấn đề trong các mô hình hồi quy khác nhau
Có một vấn đề khác với phương pháp này. nếu có nhiều danh mục duy nhất và chúng tôi muốn mã hóa chúng, chúng tôi sẽ có nhiều cột bổ sung. Điều này cuối cùng sẽ làm tăng độ phức tạp và thời gian của mô hình vì sẽ mất nhiều thời gian hơn để phân tích mối quan hệ giữa các biến
Chuyển đổi dữ liệu phân loại thành dữ liệu số bằng Pandas
Sau đây là các phương pháp được sử dụng để chuyển đổi dữ liệu phân loại thành dữ liệu số bằng Pandas
Phương pháp 1. Sử dụng get_dummies[]
cú pháp
#identify all categorical variables cat_columns = df.select_dtypes[['object']].columns #convert all categorical variables to numeric df[cat_columns] = df[cat_columns].apply[lambda x: pd.factorize[x][0]]2
nguồn hình ảnh. GeekforGeek
#identify all categorical variables cat_columns = df.select_dtypes[['object']].columns #convert all categorical variables to numeric df[cat_columns] = df[cat_columns].apply[lambda x: pd.factorize[x][0]]3
nguồn hình ảnh. GeekforGeek
Phương pháp 2. Sử dụng thay thế[]
cú pháp
#identify all categorical variables cat_columns = df.select_dtypes[['object']].columns #convert all categorical variables to numeric df[cat_columns] = df[cat_columns].apply[lambda x: pd.factorize[x][0]]4
Chuyển đổi cùng một dữ liệu bằng một cách tiếp cận khác
nguồn hình ảnh. GeekforGeek
#identify all categorical variables cat_columns = df.select_dtypes[['object']].columns #convert all categorical variables to numeric df[cat_columns] = df[cat_columns].apply[lambda x: pd.factorize[x][0]]5
nguồn hình ảnh. GeekforGeek
Chuyển đổi dữ liệu phân loại thành dữ liệu số trong Scikit-learning có thể được thực hiện theo các cách sau
Phương pháp 1. mã hóa nhãn
Hãy triển khai điều này trên các dữ liệu khác nhau và xem nó hoạt động như thế nào
import pandas as pd
import numpy as np
df = pd.read_csv[“cars_data.csv”]
df.head[]
0nguồn hình ảnh. GeekforGeek
import pandas as pd
import numpy as np
df = pd.read_csv[“cars_data.csv”]
df.head[]
1import pandas as pd
import numpy as np
df = pd.read_csv[“cars_data.csv”]
df.head[]
2nguồn hình ảnh. GeekforGeek
Phương pháp 2. Mã hóa một lần nóng
import pandas as pd
import numpy as np
df = pd.read_csv[“cars_data.csv”]
df.head[]
3Sử dụng kỹ thuật mã hóa nào?
Để biết khi nào nên sử dụng kỹ thuật mã hóa nào, chúng ta cần hiểu rõ dữ liệu của mình. Sau đó chúng ta cần quyết định áp dụng mô hình nào
Ví dụ: nếu có hơn 15 tính năng phân loại và chúng tôi quyết định sử dụng thuật toán máy vectơ hỗ trợ [SVM], thời gian đào tạo có thể tăng lên do SVM chậm. Cung cấp cho nó nhiều tính năng riêng biệt làm tăng thêm độ phức tạp và thời gian đào tạo của mô hình
Dưới đây là một số điểm chính cần lưu ý khi chọn kỹ thuật mã hóa
Sử dụng phương pháp tìm và thay thế
Khi việc duy trì trình tự là quan trọng vì phương pháp này giúp duy trì trật tự
Khi dữ liệu là thứ tự hoặc đại diện cho một số loại cường độ. Ví dụ: nếu các giá trị của một biến là nhỏ, trung bình và lớn, chúng ta có thể ánh xạ chúng thành 1, 2 và 3 tương ứng
Sử dụng mã hóa một lần nóng
Khi tính năng phân loại không có thứ tự hoặc không có thứ tự. Ví dụ: thành phố nơi một người ở không theo thứ tự nên mã hóa một lần nóng có thể được sử dụng cho các loại cột như vậy
Khi số lượng các tính năng phân loại duy nhất ít hơn. Điều này là do nhiều tính năng hơn làm tăng độ phức tạp và thời gian đào tạo của mô hình
Sử dụng mã hóa nhãn
Khi tính năng phân loại có một số thứ tự hoặc là thứ tự. Ví dụ: vị trí của quân đội là thứ tự và vị trí cao nhất có số lượng cao
Khi số lượng danh mục lớn
Chúng tôi đã khám phá nhiều cách khác nhau để mã hóa dữ liệu phân loại cùng với các vấn đề của chúng và các trường hợp sử dụng phù hợp. Tóm lại, mã hóa là một phần quan trọng và không thể tránh khỏi của kỹ thuật tính năng. Điều quan trọng là phải biết những ưu điểm và hạn chế của tất cả các phương pháp được sử dụng để mô hình có thể học đúng cách