2011-12-29 37 views
6

Tôi biết tính năng băm (hashing-trick) được sử dụng để giảm kích thước và xử lý thưa thớt các vectơ bit nhưng tôi không hiểu nó hoạt động như thế nào. Bất cứ ai có thể giải thích điều này với tôi.Is có bất kỳ thư viện python có sẵn để làm tính năng băm?Tính năng băm (băm nhỏ) là gì?

Cảm ơn bạn.

+0

Bạn đang tìm kiếm nội dung như thế này? http://www.shogun-toolbox.org/ –

Trả lời

5

On Pandas, bạn có thể sử dụng một cái gì đó như thế này:

import pandas as pd 
import numpy as np 

data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'], 
     'year': [2000, 2001, 2002, 2001, 2002], 
     'pop': [1.5, 1.7, 3.6, 2.4, 2.9]} 

data = pd.DataFrame(data) 

def hash_col(df, col, N): 
    cols = [col + "_" + str(i) for i in range(N)] 
    def xform(x): tmp = [0 for i in range(N)]; tmp[hash(x) % N] = 1; return pd.Series(tmp,index=cols) 
    df[cols] = df[col].apply(xform) 
    return df.drop(col,axis=1) 

print hash_col(data, 'state',4) 

Kết quả sẽ là

pop year state_0 state_1 state_2 state_3 
0 1.5 2000  0  1  0  0 
1 1.7 2001  0  1  0  0 
2 3.6 2002  0  1  0  0 
3 2.4 2001  0  0  0  1 
4 2.9 2002  0  0  0  1 

Cũng trên mức Series, bạn có thể

nhập khẩu NumPy như np, os import sys, pandas as pd

def hash_col(df, col, N): 
    df = df.replace('',np.nan) 
    cols = [col + "_" + str(i) for i in range(N)] 
    tmp = [0 for i in range(N)] 
    tmp[hash(df.ix[col]) % N] = 1 
    res = df.append(pd.Series(tmp,index=cols)) 
    return res.drop(col) 

a = pd.Series(['new york',30,''],index=['city','age','test']) 
b = pd.Series(['boston',30,''],index=['city','age','test']) 

print hash_col(a,'city',10) 
print hash_col(b,'city',10) 

Điều này sẽ hoạt động trên một Series, tên cột sẽ được giả định là chỉ mục Pandas. Nó cũng thay thế các chuỗi trống bằng nan và nổi tất cả mọi thứ.

age  30 
test  NaN 
city_0  0 
city_1  0 
city_2  0 
city_3  0 
city_4  0 
city_5  0 
city_6  0 
city_7  1 
city_8  0 
city_9  0 
dtype: object 
age  30 
test  NaN 
city_0  0 
city_1  0 
city_2  0 
city_3  0 
city_4  0 
city_5  1 
city_6  0 
city_7  0 
city_8  0 
city_9  0 
dtype: object 

Tuy nhiên, nếu có một vốn từ vựng, và bạn chỉ muốn một hot-mã hóa, bạn có thể sử dụng

import numpy as np 
import pandas as pd, os 
import scipy.sparse as sps 

def hash_col(df, col, vocab): 
    cols = [col + "=" + str(v) for v in vocab] 
    def xform(x): tmp = [0 for i in range(len(vocab))]; tmp[vocab.index(x)] = 1; return pd.Series(tmp,index=cols) 
    df[cols] = df[col].apply(xform) 
    return df.drop(col,axis=1) 

data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'], 
     'year': [2000, 2001, 2002, 2001, 2002], 
     'pop': [1.5, 1.7, 3.6, 2.4, 2.9]} 

df = pd.DataFrame(data) 

df2 = hash_col(df, 'state', ['Ohio','Nevada']) 

print sps.csr_matrix(df2) 

mà sẽ cung cấp cho

pop year state=Ohio state=Nevada 
0 1.5 2000   1    0 
1 1.7 2001   1    0 
2 3.6 2002   1    0 
3 2.4 2001   0    1 
4 2.9 2002   0    1 

Tôi cũng đã thêm sparsification của dataframe cuối cùng là tốt. Trong thiết lập gia tăng mà chúng ta có thể không gặp phải tất cả các giá trị trước đó (nhưng bằng cách nào đó chúng ta có được danh sách tất cả các giá trị có thể bằng cách nào đó), cách tiếp cận trên có thể được sử dụng. Các phương thức ML tăng dần sẽ cần cùng một số tính năng ở mỗi lần tăng, do đó mã hóa một nóng phải tạo cùng một số hàng tại mỗi lô.

+0

Thật không may, điều này không đáng tin cậy vì Python 'hash' có thể sử dụng một hạt giống ngẫu nhiên (khi được gọi là 'python -R', theo mặc định trong Python 3.x mới hơn). Kết quả có thể khác nhau giữa các lần chạy tập lệnh. Xem câu trả lời của tôi cho một triển khai mạnh mẽ hơn. –

+0

Vui lòng sử dụng bất kỳ hàm băm() nào khác thay cho hàm băm đơn giản được hiển thị ở trên. Bên cạnh đó đoạn trích làm mọi thứ tôi cần - là Pandas dựa trên việc đổi tên cột, mã hóa một nóng dựa trên N, v.v. – user423805

+0

Bạn có thể nhận xét về việc chọn số thứ nguyên để chọn cho băm tính năng không? – chandresh

1

Tính năng thưa thớt lớn có thể bắt nguồn từ tương tác, U là người dùng và X dưới dạng email, do đó kích thước của U x X là bộ nhớ chuyên sâu. Thông thường, nhiệm vụ như lọc spam cũng có giới hạn về thời gian.

Bí quyết băm giống như các bit nhị phân lưu trữ hàm băm khác (chỉ mục) giúp đào tạo quy mô lớn khả thi. Về lý thuyết, độ dài băm được tăng thêm hiệu suất, như minh họa trong bài báo gốc.

Nó phân bổ tính năng gốc vào các nhóm khác nhau (độ dài hữu hạn của không gian đối tượng) để giữ ngữ nghĩa của chúng. Ngay cả khi spammer sử dụng typo để bỏ lỡ trên radar. Mặc dù có lỗi méo mó, nhưng dạng thừa kế băm vẫn ở gần.

Ví dụ,

"con cáo nâu nhanh chóng" chuyển đến:

h(the) mod 5 = 0 

h(quick) mod 5 = 1 

h(brown) mod 5 = 1 

h(fox) mod 5 = 3 

Sử dụng chỉ số thay vì sau đó giá trị văn bản, tiết kiệm không gian.

Để tóm tắt một số ứng dụng: giảm

  • chiều cho chiều cao vector đặc trưng

    • văn bản trong nhiệm vụ phân loại email, cộng tác lọc theo thư rác
  • sparsification

  • túi-of-từ trên bay

  • chéo sản phẩm đặc trưng

  • đa nhiệm vụ học tập

tham khảo:

  • giấy Xuất xứ:

    1. Feature Băm cho quy mô lớn hiện đa Learning

    2. Shi, Q., PETTERSON, J., Dror, G., Langford, J., Smøla, A., Strehl, A., & Vishwanathan , V. (2009). Hash hạt nhân

  • What is the hashing trick

  • Quora

  • Gionis, A., Indyk, P., & Motwani, R. (1999). tìm kiếm sự tương đồng về kích thước cao qua băm

Thực hiện:

  • Langford, J., Li, L., & Strehl, A. (2007). Dự án học tập trực tuyến wow Vow- pal (Báo cáo kỹ thuật). http://hunch.net/?p=309.
+0

Bạn có thể nhận xét về tác động của băm tính năng trên mô hình đã học không? vì sẽ có xung đột băm. Vâng, tôi biết chúng không thể xảy ra và tối thiểu, nhưng những va chạm sẽ xảy ra; tác động của những va chạm này lên mô hình học được là gì? bất kỳ con trỏ nào để nghiên cứu nhìn vào câu hỏi này đều được đánh giá cao. Một điều rõ ràng, mô hình rút ra từ các tính năng băm không được bảo đảm để được giống mẫu bạn nhận được từ các tính năng un-băm gốc. Làm thế nào để chúng khác nhau và mức độ nào? – Kai

+0

@Kai I'v đã thêm tài liệu gốc về chủ đề này. Ranh giới lỗi đã được phân tích nên kết quả thực nghiệm. Xin vui lòng xem qua. – CodeFarmer

+0

được nhiều người đánh giá cao, cảm ơn bạn. – Kai

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