7

Tôi đang cố gắng hiểu cách sử dụng dữ liệu danh mục làm tính năng trong sklearn.linear_model 's LogisticRegression.Sử dụng dữ liệu phân loại làm tính năng trong Sklean LogisticRegression

Tôi hiểu tất nhiên tôi cần mã hóa nó.

  1. Những gì tôi không hiểu là làm thế nào để vượt qua tính năng mã hóa để hồi quy Logistic vì vậy nó xử lý như một tính năng phân loại, và không giải thích giá trị int nó nhận được khi mã hóa như một tính năng định lượng tiêu chuẩn.

  2. (Ít quan trọng hơn) Ai đó có thể giải thích sự khác biệt giữa việc sử dụng preprocessing.LabelEncoder(), DictVectorizer.vocabulary hoặc chỉ tự mã hóa dữ liệu phân loại bằng một lệnh đơn giản? Alex A.'s comment here chạm vào đối tượng nhưng không sâu sắc.

Đặc biệt với thẻ đầu tiên!

Trả lời

1
  1. Standart phương pháp để chuyển đổi các tính năng categorial vào số - OneHotEncoding
  2. Đó là hoàn toàn lớp khác nhau:

    [DictVectorizer][2].vocabulary_

    Một từ điển tên tính năng lập bản đồ tính năng chỉ số.

    tức là Sau fit()DictVectorizer có tất cả các tên tính năng có thể, và bây giờ nó biết trong đó đặc biệt là cột nó sẽ đặt giá trị cụ thể của một tính năng. Vì vậy, DictVectorizer.vocabulary_ chứa chỉ báo đối tượng địa lý, chứ không phải giá trị.

    LabelEncoder trong bản đồ đối diện mỗi nhãn có thể (Nhãn có thể là chuỗi hoặc số nguyên) thành giá trị số nguyên và trả về véc tơ 1D của các giá trị số nguyên này.

+0

Cảm ơn bạn đã trả lời.Chuyển đổi chính nó là ít vấn đề (tôi nghĩ), mối quan tâm chính của tôi là reg logistic sẽ xem xét các giá trị số như một giá trị số chuẩn, vì vậy nếu Cat được mã hóa là 1 và Dog là 2, nó sẽ giả định quan sát với 'Dog' có 'nhiều hơn' của tài sản đó, trong khi chúng ta biết các giá trị được gán là vô nghĩa. – Optimesh

+0

@Optimesh, Ý bạn là gì khi được "mã hóa"? Nếu bạn đang nói về các biến mục tiêu - không có gì sai trong các mục tiêu [1,2,3], LogisticRegression sẽ đơn giản xây dựng các phân loại 3 (trong trường hợp cụ thể này) và kết hợp chúng trong lược đồ OneVsRest. Nếu bạn đang nói về các tính năng - OneHotEncoder sẽ mã hóa từng tính năng phân loại theo định dạng nhị phân, tức là nó sẽ tạo ra tính năng nhị phân mới thay vì mỗi giá trị có thể cho tính năng phân loại, tức là tập dữ liệu kết quả sẽ phân tách các tính năng nhị phân (cột) cho các giá trị Dog = 1, Dog = 2, Dog = 3, Cat = 1, v.v. Nhìn vào các ví dụ trong tài liệu chính thức. –

3

Bạn có thể tạo biến chỉ báo cho các danh mục khác nhau. Ví dụ:

animal_names = {'mouse';'cat';'dog'} 

Indicator_cat = strcmp(animal_names,'cat') 
Indicator_dog = strcmp(animal_names,'dog') 

Sau đó, chúng ta có:

   [0       [0 
Indicator_cat = 1  Indicator_dog = 0 
       0]       1] 

Và bạn có thể nối các vào ma trận dữ liệu ban đầu của bạn:

X_with_indicator_vars = [X, Indicator_cat, Indicator_dog] 

Ghi dù để rời khỏi một thể loại mà không chỉ báo nếu thuật ngữ không đổi được bao gồm trong ma trận dữ liệu! Nếu không, ma trận dữ liệu của bạn sẽ không được xếp hạng đầy đủ cột (hoặc trong điều kiện kinh tế lượng, bạn có đa cộng tuyến).

[1 1 0 0   Notice how constant term, an indicator for mouse, 
1 0 1 0   an indicator for ca,t and an indicator for dog 
1 0 0 1]  leads to a less than full column rank matrix: 
        the first column is the sum of the last three. 
+0

Cảm ơn bạn đã phản hồi. Nghĩ về điều đó, nhưng tính năng tôi có trong tâm trí có hơn 40 giá trị phân loại (mèo, chó, voi, sư tử, ..............). Có phải là một cách tốt hơn. – Optimesh

+0

Tôi không chắc chắn những gì bạn muốn sau đó? Bạn có thể nhóm chúng thành các danh mục lớn hơn? Hoặc ánh xạ các danh mục vào một không gian vectơ chiều 'n' nào đó? (ví dụ: tên bản đồ động vật cho không gian vectơ 2 chiều (chiều cao, cân nặng)). Nhưng nếu bạn muốn đối xử với từng thể loại như là thể loại duy nhất của riêng nó, thì đây là những gì bạn (nói chung cho hồi quy) phải làm. Và nếu bạn giả định các hiệu ứng có thể VARY theo thể loại, bạn phải có tất cả các điều khoản tương tác quá của các danh mục của bạn với các biến hồi quy khác của bạn. Có lẽ sklearn sẽ làm điều này cho bạn đằng sau hậu trường (tôi không có ý tưởng), nhưng điều này có lẽ là những gì sẽ xảy ra. –

+0

@Optimesh, không có cách nào tốt hơn, nhưng bạn có thể giảm kích thước bằng FeatureHashing hoặc các kỹ thuật phức tạp hơn như PCA, v.v. Ngoài ra, bài đăng này đề xuất cùng một kỹ thuật Mã hóa nóng. –

0

Giả sử loại của từng biến phân loại là "đối tượng".Thứ nhất, bạn có thể tạo một panda.index các tên cột phân loại:

import pandas as pd  
catColumns = df.select_dtypes(['object']).columns 

Sau đó, bạn có thể tạo các biến chỉ sử dụng một cho vòng lặp bên dưới. Đối với các biến phân loại nhị phân, hãy sử dụng LabelEncoder() để chuyển đổi thành 01. Đối với các biến phân loại có nhiều hơn hai loại, hãy sử dụng pd.getDummies() để lấy các biến chỉ báo và sau đó thả một danh mục (để tránh vấn đề đa cộng tuyến).

from sklearn import preprocessing 
le = preprocessing.LabelEncoder() 

for col in catColumns: 
    n = len(df[col].unique()) 
    if (n > 2): 
     X = pd.get_dummies(df[col]) 
     X = X.drop(X.columns[0], axis=1) 
     df[X.columns] = X 
     df.drop(col, axis=1, inplace=True) # drop the original categorical variable (optional) 
    else: 
     le.fit(df[col]) 
     df[col] = le.transform(df[col]) 
+1

Trong các phiên bản sklearn gần đây, bạn có thể sử dụng le.fit cho các biến phân loại với nhiều hơn hai lớp. – Bismarck

Các vấn đề liên quan