chuỗi như các tính năng trong cây quyết định / rừng ngẫu nhiên


64

Tôi đang làm một số vấn đề về một ứng dụng của cây quyết định / rừng ngẫu nhiên. Tôi đang cố gắng phù hợp với một vấn đề có số cũng như chuỗi (như tên quốc gia) làm tính năng. Bây giờ, thư viện, scikit-learn chỉ lấy số làm tham số, nhưng tôi muốn thêm chuỗi cũng như chúng mang một lượng kiến ​​thức đáng kể.

Làm thế nào để tôi xử lý một kịch bản như vậy?

Tôi có thể chuyển đổi một chuỗi thành số bằng một số cơ chế như băm trong Python. Nhưng tôi muốn biết cách thực hành tốt nhất về cách xử lý các chuỗi trong các vấn đề của cây quyết định.


Trong trường hợp sckitlearn tôi đã thấy rằng chúng ta cần mã hóa các biến phân loại, phương thức phù hợp khác sẽ đưa ra một lỗi nói ValueError: không thể chuyển đổi chuỗi thành float
Kar

Câu trả lời:


56

Trong hầu hết các hệ thống máy học được thiết lập tốt, các biến phân loại được xử lý một cách tự nhiên. Ví dụ: trong R bạn sẽ sử dụng các yếu tố, trong WEKA bạn sẽ sử dụng các biến danh nghĩa. Đây không phải là trường hợp trong scikit-learn. Các cây quyết định được triển khai trong scikit-learn chỉ sử dụng các tính năng số và các tính năng này luôn được hiểu là các biến số liên tục .

Do đó, chỉ nên thay thế các chuỗi bằng mã băm, bởi vì được coi là một tính năng số liên tục, bất kỳ mã hóa nào bạn sẽ sử dụng sẽ tạo ra một thứ tự đơn giản không tồn tại trong dữ liệu của bạn.

Một ví dụ là mã ['đỏ', 'xanh', 'xanh'] bằng [1,2,3], sẽ tạo ra những thứ kỳ lạ như 'đỏ' thấp hơn 'xanh' và nếu bạn trung bình một 'đỏ' và 'màu xanh' bạn sẽ nhận được 'màu xanh'. Một ví dụ khác tinh tế hơn có thể xảy ra khi bạn mã ['thấp', 'trung bình', 'cao'] bằng [1,2,3]. Trong trường hợp sau, có thể có một trật tự có ý nghĩa, tuy nhiên, một số mâu thuẫn tinh tế có thể xảy ra khi 'trung bình' không ở giữa 'thấp' và 'cao'.

Cuối cùng, câu trả lời cho câu hỏi của bạn nằm ở việc mã hóa tính năng phân loại thành nhiều tính năng nhị phân . Ví dụ: bạn có thể mã ['đỏ', 'xanh', 'xanh'] với 3 cột, mỗi cột cho mỗi danh mục, có 1 khi danh mục khớp với 0 và nếu không. Đây được gọi là mã hóa một nóng, mã hóa nhị phân, mã hóa một chiều hoặc bất cứ thứ gì. Bạn có thể kiểm tra tài liệu ở đây để mã hóa các tính năng phân loạitrích xuất tính năng - băm và dicts . Rõ ràng mã hóa một nóng sẽ mở rộng yêu cầu không gian của bạn và đôi khi nó cũng làm tổn hại đến hiệu suất.


2
Đó là cách thực hiện scikit mà nó không xử lý đúng các biến phân loại. Giải mã như cách câu trả lời này gợi ý có lẽ là điều tốt nhất bạn có thể làm. Người dùng nghiêm trọng hơn có thể tìm kiếm gói thay thế.
SmallChess

3
Người ta có thể sử dụng sklearn.pre Processing.LabelBinarizer cho một mã hóa nóng của biến phân loại.
GuSuku

@rapaio Tôi nghĩ mã hóa nhị phân không giống một mã hóa nóng. Mã hóa nhị phân là khi bạn đại diện cho 8 danh mục với 3 cột hoặc từ 9 đến 16 danh mục với 4 cột, v.v. Tôi có lầm không?
Alok Nayak

gói python patsy sẽ đối phó với mã hóa một nóng của các biến phân loại. patsy.readthedocs.io/en/latest/quickstart.html
zhespelt

5
Không sử dụng LabelBinarizer, sử dụng sklearn.pre Processing.OneHotEncoder . Nếu bạn đang sử dụng gấu trúc để nhập và xử lý trước dữ liệu của mình, bạn cũng có thể thực hiện điều đó trực tiếp bằng pandas.get_dummies . Nó cho rằng scikit-learn không hỗ trợ các biến phân loại.
Ricardo Cruz

11

Bạn cần mã hóa các chuỗi của mình dưới dạng các tính năng số mà sci-kit có thể sử dụng cho các thuật toán ML. Chức năng này được xử lý trong mô-đun tiền xử lý (ví dụ: xem sklearn.pre Processing.LabelEncoder để biết ví dụ).


3
rapaio giải thích trong câu trả lời của mình tại sao điều này sẽ nhận được kết quả không chính xác
Keith

7

Bạn thường nên mã hóa các biến phân loại một nóng cho các mô hình scikit-learn, bao gồm cả rừng ngẫu nhiên. Rừng ngẫu nhiên thường sẽ hoạt động tốt mà không cần mã hóa một nóng nhưng thường hoạt động tốt hơn nếu bạn thực hiện mã hóa một nóng. Các biến số mã hóa nóng và "giả" có nghĩa là điều tương tự trong bối cảnh này. Scikit-learn có sklearn.pre Processing.OneHotEncoder và Pandas có pandas.get_dummies để thực hiện điều này.

Tuy nhiên, có những lựa chọn thay thế. Bài viết "Vượt lên một lần nóng" tại KDnuggets thực hiện rất tốt việc giải thích lý do tại sao bạn cần mã hóa các biến phân loại và các lựa chọn thay thế cho mã hóa một nóng.

Có các triển khai thay thế của rừng ngẫu nhiên không yêu cầu mã hóa một lần nóng như R hoặc H2O. Việc triển khai trong R tốn kém về mặt tính toánsẽ không hoạt động nếu các tính năng của bạn có nhiều danh mục . H2O sẽ làm việc với số lượng lớn các loại. Continuum đã làm cho H2O có sẵn trong Anaconda Python.

Có một nỗ lực liên tục để làm cho scikit-learn xử lý các tính năng phân loại trực tiếp .

Bài viết này có một lời giải thích về thuật toán được sử dụng trong H2O. Nó tham khảo tài liệu học thuật Một thuật toán cây quyết định phát song songphiên bản dài hơn của cùng một bài viết.


5

Cập nhật 2018!

Bạn có thể tạo một không gian nhúng (vector dày đặc) cho các biến phân loại của bạn. Nhiều bạn quen thuộc với word2vec và fastext, chúng nhúng các từ vào một không gian vectơ dày đặc có ý nghĩa. Cùng một ý tưởng ở đây-- các biến phân loại của bạn sẽ ánh xạ tới một vectơ với một số ý nghĩa.

Từ giấy Guo / Berkhahn :

Việc nhúng thực thể không chỉ làm giảm việc sử dụng bộ nhớ và tăng tốc các mạng thần kinh so với mã hóa một nóng, mà quan trọng hơn là bằng cách ánh xạ các giá trị tương tự gần nhau trong không gian nhúng, nó cho thấy các thuộc tính bên trong của các biến phân loại. Chúng tôi đã áp dụng nó thành công trong một cuộc thi Kaggle gần đây và có thể đạt được vị trí thứ ba với các tính năng đơn giản tương đối.

Các tác giả nhận thấy rằng việc đại diện cho các biến phân loại theo cách này đã cải thiện hiệu quả của tất cả các thuật toán học máy được thử nghiệm, bao gồm cả rừng ngẫu nhiên.

Ví dụ tốt nhất có thể là ứng dụng kỹ thuật của Pinterest vào các Ghim liên quan đến nhóm:

nhập mô tả hình ảnh ở đây

Những người ở fastai đã thực hiện các nhúng nhúng phân loại và tạo ra một bài đăng blog rất đẹp với máy tính xách tay demo đồng hành .

Chi tiết bổ sung và giải thích

Một mạng lưới thần kinh được sử dụng để tạo ra các nhúng, tức là gán một vectơ cho mỗi giá trị phân loại. Khi bạn có các vectơ, bạn có thể sử dụng chúng trong bất kỳ mô hình nào chấp nhận giá trị số. Mỗi thành phần của vector trở thành một biến đầu vào. Ví dụ: nếu bạn đã sử dụng vectơ 3 chiều để nhúng danh sách màu phân loại của mình, bạn có thể nhận được một cái gì đó như: red = (0, 1.5, -2.3), blue = (1, 1, 0), v.v. Bạn sẽ sử dụng ba các biến đầu vào trong rừng ngẫu nhiên của bạn tương ứng với ba thành phần. Đối với những thứ màu đỏ, c1 = 0, c2 = 1.5 và c3 = -2.3. Đối với những thứ màu xanh, c1 = 1, c2 = 1 và c3 = 0.

Bạn thực sự không cần phải sử dụng một mạng lưới thần kinh để tạo ra các nhúng (mặc dù tôi không khuyên bạn nên tránh xa kỹ thuật này). Bạn có thể tự tạo các nhúng của mình bằng tay hoặc các phương tiện khác, khi có thể. Vài ví dụ:

  1. Ánh xạ màu tới vectơ RGB.
  2. Ánh xạ vị trí đến vectơ lat / long.
  3. Trong một mô hình chính trị Hoa Kỳ, ánh xạ các thành phố tới một số thành phần vectơ đại diện cho sự liên kết trái / phải, gánh nặng thuế, v.v.

OK, nhưng trừ khi tôi bỏ lỡ một cái gì đó thì đây là lúc lưới bắt đầu kết thúc. Làm thế nào để chúng ta tạo ra một sự nhúng và sau đó vượt qua sự nhúng đó vào một Forrest? Tôi đoán bạn phải huấn luyện cả một mạng với tất cả các tính năng và sau đó lấy một vài lớp đầu tiên và sử dụng nó làm tính năng đầu vào cho Forrest của bạn. Nó không rõ làm thế nào điều này sẽ được thực hiện.
Keith

@Keith một mạng lưới thần kinh được sử dụng để tạo các nhúng, tức là gán một vectơ cho mỗi giá trị phân loại. Khi bạn có các vectơ, bạn có thể sử dụng chúng trong bất kỳ mô hình nào chấp nhận giá trị số. Mỗi thành phần của vector trở thành một biến đầu vào. Ví dụ: nếu bạn đã sử dụng vectơ 3 chiều để nhúng danh sách màu phân loại của mình, bạn có thể nhận được một cái gì đó như: red = (0, 1.5, -2.3), blue = (1, 1, 0)v.v. Bạn sẽ sử dụng ba biến đầu vào trong khu rừng ngẫu nhiên tương ứng với ba thành phần. Đối với những thứ màu đỏ, c1 = 0, c2 = 1.5 và c3 = -2.3. Đối với những thứ màu xanh, c1 = 1, c2 = 1 và c3 = 0.
Pete

Tôi hoàn toàn có được khái niệm vì nó khá đơn giản. Tôi có nghĩa là làm thế nào điều này sẽ được thực hiện trong việc thực hiện? Máy tính xách tay demo nhanh.ai mà bạn liên kết có một chút với RandomForestRegressor ở cuối nhưng tôi không thực sự thấy cách này bổ sung trong các nhúng.
Keith

Tôi nghĩ rằng đây có thể là một ví dụ tốt về mã trong Keras github.com/entron/entity-embpping-rossmann
Keith

3

Bạn có thể sử dụng các biến giả trong các tình huống như vậy. Với gấu trúc, panda.get_dummiesbạn có thể tạo các biến giả cho các chuỗi bạn muốn đặt trong Cây quyết định hoặc Rừng ngẫu nhiên.

Thí dụ:

import pandas as pd
d = {'one' : pd.Series([1., 2., 3.,4.], index=['a', 'b', 'c','d']),'two' :pd.Series(['Paul', 'John', 'Micheal','George'], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)

df_with_dummies= pd.get_dummies(df,columns=["two"],drop_first=False)
df_with_dummies

2

Biến chúng thành số, ví dụ cho mỗi quốc gia duy nhất khẳng định một số duy nhất (như 1,2,3 và ...)

Ngoài ra, bạn không cần sử dụng Mã hóa một lần (hay còn gọi là biến giả) khi làm việc với rừng ngẫu nhiên, vì cây không hoạt động như thuật toán khác (như hồi quy tuyến tính / logistic) và chúng không hoạt động ở xa (chúng làm việc với việc tìm kiếm sự phân chia tốt cho các tính năng của bạn) vì vậy KHÔNG CẦN cho Mã hóa một lần nóng


1
Nó thực sự phụ thuộc vào thuật toán cụ thể đào tạo cây. Cụ thể, scikit KHÔNG hỗ trợ các biến phân loại.
lừa đảo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.