2016-06-29 20 views
15

Có một số bài viết về cách mã hóa dữ liệu chủng loại cây Sklearn decission, nhưng từ tài liệu Sklearn, chúng tôi đã nhận nhữngTruyền dữ liệu phân loại để Sklearn Quyết định Tree

Some advantages of decision trees are:

(...)

Able to handle both numerical and categorical data. Other techniques are usually specialised in analysing datasets that have only one type of variable. See algorithms for more information.

Nhưng chạy kịch bản sau đây

import pandas as pd 
from sklearn.tree import DecisionTreeClassifier 

data = pd.DataFrame() 
data['A'] = ['a','a','b','a'] 
data['B'] = ['b','b','a','b'] 
data['C'] = [0, 0, 1, 0] 
data['Class'] = ['n','n','y','n'] 

tree = DecisionTreeClassifier() 
tree.fit(data[['A','B','C']], data['Class']) 

kết quả đầu ra được lỗi sau:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/site-packages/sklearn/tree/tree.py", line 154, in fit 
    X = check_array(X, dtype=DTYPE, accept_sparse="csc") 
    File "/usr/local/lib/python2.7/site-packages/sklearn/utils/validation.py", line 377, in check_array 
    array = np.array(array, dtype=dtype, order=order, copy=copy) 
ValueError: could not convert string to float: b 

Tôi biết rằng trong R có thể truyền dữ liệu phân loại, với Sklearn, có thể không?

Trả lời

4

Trái ngược với câu trả lời được chấp nhận, tôi muốn sử dụng các công cụ được cung cấp bởi Scikit-Tìm hiểu cho mục đích này. Lý do chính để làm như vậy là chúng có thể dễ dàng được tích hợp trong một số Pipeline.

Scikit-Learn chính nó cung cấp các lớp học rất tốt để xử lý dữ liệu phân loại. Thay vì viết chức năng tùy chỉnh của bạn, bạn nên sử dụng LabelEncoderđược thiết kế đặc biệt cho mục đích này.

Tham khảo các mã sau đây từ các tài liệu:

le = preprocessing.LabelEncoder() 
le.fit(["paris", "paris", "tokyo", "amsterdam"]) 
le.transform(["tokyo", "tokyo", "paris"]) 

này sẽ tự động mã hóa chúng thành số cho thuật toán học máy tính của bạn. Bây giờ điều này cũng hỗ trợ quay trở lại chuỗi từ số nguyên. Bạn có thể thực hiện việc này bằng cách chỉ cần gọi inverse_transform như sau:

list(le.inverse_transform([2, 2, 1])) 

Điều này sẽ trả lại ['tokyo', 'tokyo', 'paris']. Cũng xin lưu ý rằng đối với nhiều loại phân loại khác, ngoài cây quyết định, chẳng hạn như hồi quy logistic hoặc SVM, bạn muốn mã hóa các biến phân loại của mình bằng cách sử dụng One-Hot encoding. Scikit-learning hỗ trợ điều này cũng như thông qua các lớp học OneHotEncoder.

Hy vọng điều này sẽ hữu ích!

+31

-1 điều này gây hiểu lầm. Vì nó đứng, cây quyết định sklearn không xử lý dữ liệu phân loại - [xem vấn đề # 5442] (https://github.com/scikit-learn/scikit-learn/issues/5442). Cách tiếp cận này khi sử dụng Mã hóa nhãn chuyển đổi thành các số nguyên mà 'DecisionTreeClassifier()' ** sẽ coi là số **. Nếu dữ liệu phân loại của bạn không phải là thứ tự, điều này là không tốt - bạn sẽ kết thúc với các phần tách không có ý nghĩa. Sử dụng 'OneHotEncoder' là cách duy nhất hợp lệ hiện tại, nhưng tốn kém tính toán. – kungfujam

+0

@Abhinav, Có thể áp dụng 'LabelEncoder' trên nhiều cột của một khung dữ liệu cùng một lúc không?Ví dụ, trong khung dữ liệu từ câu hỏi, chúng ta có thể làm một cái gì đó như 'le.fit_transform (dữ liệu [['A', 'B', 'C']])' để nhận nhãn cho tất cả các cột phân loại cùng một lúc không? Hoặc nên chỉ định các cột phân loại một cách rõ ràng để chỉ chuyển đổi các cột phân loại. – Minu

+0

@kungfujam, Ngoài ra, tôi muốn 'One-Hot Encode' các cột phân loại khi tôi 'LabelEncode' chúng - để giải quyết vấn đề mà @kungfujam chỉ ra. Làm thế nào tôi có thể làm điều đó một khi tôi nhận được mã hóa nhãn thực hiện? – Minu

1

Sklearn Quyết định Cây không xử lý chuyển đổi chuỗi phân loại thành số. Tôi đề nghị bạn tìm thấy một chức năng trong Sklearn (có thể this) mà nên hay tự viết một số mã như:

def cat2int(column): 
    vals = list(set(column)) 
    for i, string in enumerate(column): 
     column[i] = vals.index(string) 
    return column 
+0

Vâng, đó là một wat thường làm, nhưng để in nó không thực sự tốt. – 0xhfff

+0

Nếu bạn muốn đi từ số nguyên trở lại đại diện chuỗi, hãy tạo một từ điển giữ ánh xạ giữa chuỗi và số nguyên và sử dụng để "giải mã" biểu diễn số nguyên. – mrwyatt

+0

Tuyên bố không chính xác. Scikit-learn classifiers không ngầm xử lý mã hóa nhãn. Tuy nhiên, Scikit-learn cung cấp rất nhiều lớp để xử lý việc này. Tôi khuyên bạn nên sử dụng các công cụ tìm hiểu scikit vì chúng cũng có thể phù hợp với Đường ống học máy với nỗ lực tối thiểu. –

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