2015-12-28 34 views
1

任何二進制單熱編碼都只知道在訓練中看到的值,所以在擬合過程中未遇到的功能將被忽略。 對於實時,一秒鐘內有數百萬條記錄,並且功能具有非常高的基數,您需要使用數據更新hasher/Mapper。在實時系統中使用sklearn DictVectorizer

我們如何對散列函數進行增量更新(而不是每次創建新的特徵值對時計算整個fit())?這裏建議的方法是什麼?

回答

0

sklearn.feature_extraction.FeatureHasher的美是它不需要調用fit。它是無狀態的,並在事先不知道詞彙的情況下轉換字典。

例子:

from sklearn.feature_extraction import FeatureHasher 

print "Feature Hasher 1" 
f = FeatureHasher() 
mat = f.transform([{"A":1, "B":2}]) 
print "Indicies:",mat.indices 
print "Values:", mat.data 

print 

print "Feature Hasher 2" 
f = FeatureHasher() 
mat = f.transform([{"B":2, "C":3}]) 
print "Indicies:",mat.indices 
print "Values:", mat.data 

產地:

Feature Hasher 1 
Indicies: [628086 849870] 
Values: [-2. 1.] 

Feature Hasher 2 
Indicies: [196981 628086] 
Values: [-3. -2.] 

正如你所看到的,即使有一個新的功能散列器"B"始終映射到628086

要避免與大量功能發生散列衝突,應該使用FeatureHasher以及較大的n_features值。

f = FeatureHasher(n_features=2**30) 

另外,如果你重新實例FeatureHasher後,它使用了兼容的功能映射相同n_features值是非常重要的。

這確實需要您的模型支持稀疏特徵集。對於SGDClassifier,這是使用sparsify()方法設置的。

請參見:http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html#sklearn.linear_model.SGDClassifier.sparsify

+0

我熟悉FeatureHasher,但不會是產生(有一些高概率)哈希衝突的影響? – Serendipity

+0

省略我的評論,我現在看到,對於少數功能它可能會導致散列衝突,這不是我的情況。但是,我認爲sklearn有一個bug(見這裏[鏈接](http://stackoverflow.com/questions/33982717/typeerror-a-float-is-required-in-sklearn-feature-extraction-featurehasher)和在這裏[鏈接](https://github.com/scikit-learn/scikit-learn/issues/4878) – Serendipity

+0

我剛剛回答了這個問題,查看我的答案。:-) –