2015-05-16 25 views
6

Tôi có tập dữ liệu chứa cả cột phân loại và số và cột mục tiêu của tôi cũng là phân loại. Tôi đang sử dụng thư viện Scikit trong Python34. Tôi biết rằng Scikit cần tất cả các giá trị phân loại để được chuyển thành các giá trị số trước khi thực hiện bất kỳ phương pháp học máy nào.Tính năng phân loại & số - Mục tiêu phân loại - Tìm hiểu Scikit - Python

Làm cách nào để chuyển đổi các cột phân loại thành giá trị bằng số? Tôi đã thử rất nhiều điều nhưng tôi nhận được các lỗi khác nhau như "str" ​​đối tượng không có 'numpy.ndarray' đối tượng không có thuộc tính 'mục'.

Here is an example of my data: 
UserID LocationID AmountPaid ServiceID Target 
29876  IS345  23.9876  FRDG  JFD 
29877  IS712  135.98  WERS  KOI 

bộ dữ liệu của tôi được lưu trong một file CSV, đây là mã nhỏ tôi đã viết để cung cấp cho bạn một ý tưởng về những gì tôi muốn làm:

#reading my csv file 
data_dir = 'C:/Users/davtalab/Desktop/data/' 
train_file = data_dir + 'train.csv' 
train = pd.read_csv(train_file) 

#numeric columns: 
x_numeric_cols = train['AmountPaid'] 

#Categrical columns: 
categorical_cols = ['UserID' + 'LocationID' + 'ServiceID'] 
x_cat_cols = train[categorical_cols].as_matrix() 


y_target = train['Target'].as_matrix() 

Tôi cần x_cat_cols được chuyển đổi sang số các giá trị và thêm chúng vào x_numeric_cols và do đó có các giá trị đầu vào (x) đầy đủ của tôi.

Sau đó, tôi cần phải chuyển đổi hàm mục tiêu của mình thành giá trị số cũng như làm cho cột mục tiêu cuối cùng của tôi (y).

Sau đó, tôi muốn làm một rừng ngẫu nhiên sử dụng hai bộ hoàn chỉnh như:

rf = RF(n_estimators=n_trees,max_features=max_features,verbose =verbose, n_jobs =n_jobs) 
rf.fit(x_train, y_train) 

Nhờ sự giúp đỡ của bạn!

Trả lời

0

Điều này là do cách tôi liệt kê dữ liệu. Nếu tôi in dữ liệu (sử dụng mẫu khác), bạn sẽ thấy:

>>> import pandas as pd 
>>> train = pd.DataFrame({'a' : ['a', 'b', 'a'], 'd' : ['e', 'e', 'f'], 
...      'b' : [0, 1, 1], 'c' : ['b', 'c', 'b']}) 
>>> samples = [dict(enumerate(sample)) for sample in train] 
>>> samples 
[{0: 'a'}, {0: 'b'}, {0: 'c'}, {0: 'd'}] 

Đây là danh sách các lệnh. Thay vào đó, chúng tôi nên thực hiện điều này:

>>> train_as_dicts = [dict(r.iteritems()) for _, r in train.iterrows()] 
    >>> train_as_dicts 
    [{'a': 'a', 'c': 'b', 'b': 0, 'd': 'e'}, 
    {'a': 'b', 'c': 'c', 'b': 1, 'd': 'e'}, 
    {'a': 'a', 'c': 'b', 'b': 1, 'd': 'f'}] 
Now we need to vectorize the dicts: 

>>> from sklearn.feature_extraction import DictVectorizer 

>>> vectorizer = DictVectorizer() 
>>> vectorized_sparse = vectorizer.fit_transform(train_as_dicts) 
>>> vectorized_sparse 
<3x7 sparse matrix of type '<type 'numpy.float64'>' 
    with 12 stored elements in Compressed Sparse Row format> 

>>> vectorized_array = vectorized_sparse.toarray() 
>>> vectorized_array 
array([[ 1., 0., 0., 1., 0., 1., 0.], 
     [ 0., 1., 1., 0., 1., 1., 0.], 
     [ 1., 0., 1., 1., 0., 0., 1.]]) 
To get the meaning of each column, ask the vectorizer: 

>>> vectorizer.get_feature_names() 
['a=a', 'a=b', 'b', 'c=b', 'c=c', 'd=e', 'd=f'] 
4

Đối với mục tiêu, bạn có thể sử dụng số LabelEncoder của sklearn. Điều này sẽ cung cấp cho bạn một công cụ chuyển đổi từ các nhãn chuỗi thành các nhãn số (và cũng là một ánh xạ ngược). Ví dụ trong liên kết.

Đối với các tính năng, thuật toán học nói chung mong đợi (hoặc làm việc tốt nhất với) dữ liệu thứ tự. Vì vậy, lựa chọn tốt nhất là sử dụng OneHotEncoder để chuyển đổi các tính năng phân loại. Điều này sẽ tạo ra một tính năng nhị phân mới cho mỗi thể loại, biểu thị on/off cho mỗi thể loại. Một lần nữa, ví dụ sử dụng trong liên kết.

+3

Đối với mục tiêu phân loại, bạn thực sự không cần phải sử dụng bất kỳ chuyển đổi nào. Tất cả các trình phân loại có thể xử lý các nhãn tùy ý. –

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