特征抽取:特征字典向量化和特征哈希變換


注:本文是人工智能研究網的學習筆記

sklearn.feature_extaction模塊提供了從原始數據如文本,圖像等中抽取能夠被機器學習算法直接處理的特征向量。

Feature extraction和Feature selection是不同的:前者將任意的數據變換成機器學習算法可用的數值型特征;后者是一個作用於特征空間上的機器學習技術,是對特征空間的再次變換。

  • Loading Features From Dicts
  • Features hashing
  • Text Feature Extraction
  • Image Feature Extraction

Loading Features From Dicts

DictVectorizer類可以用來把標准Python dict對象表示的特征數組轉換成Numpy/Scipy的表示形式,以便於scikit-learn estimators的使用。

盡管速度不是很快,Python的dict使用起來還是相當方便的,而且還可以稀疏存儲(absent feature need not be stored);字典的形式便於將特征的取值和名稱一一對應起來。

DictVectorizer實現了one-of-K或者叫“one-hot”編碼對標稱型特征。標稱型特征(Categorical feature)是“attribute-value”pairs,其中value是屬性的可能的取值列表,必須是有限的離散的沒有大小順序的。(e.g 男女,話題類別)

下面的例子中,‘city’是一個categorical attribute而‘temperature’是一個典型的numerical feature。

measurements = [
    {'city': 'Dubai', 'temperature': 33.0},
    {'city': 'London', 'temperature': 12.0},
    {'city': 'San Fransisco', 'temperature': 18.0},
]

from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer()

print(vec.fit_transform(measurements).toarray())
print(vec.get_feature_names())

Features hashing

Features hashing是一個高速的,低存儲的向量化的類。
一般的vectorizer是為訓練過程中遇到的特征構建一個hash table,而FeatureHasher類則直接對特征應用一個hash函數來決定特征在樣本矩陣中的列索引。這樣的做法使得計算速度提升並且節省了內存,the hasher無法記住輸入特征的樣子,而且不遜在你想變換操作:inverse_transform。

因為哈希函數可能會導致本來不相關的特征之間發生沖突,所以使用了有符號的hash函數。對一個特征,其hash值的符號決定了被存儲到輸出矩陣中的值的符號。通過這種方式就能夠消除特征hash映射時發生的沖突而不是累計沖突。而且任意輸出的值的期望均值是0.

如果non_negative=True被傳入構造函數,將會取絕對值。這樣會發生一些沖突(collision)但是哈希特征映射的輸出就可以被傳入到一些只能接受非負特征的學習器對象比如:
sklearn.naive_bayes.MultinomialNB分類器和sklearn.feature_selection.chi2特征選擇器。

Features hashing接受參數類型可以使:mappings(字典或者其變體容器)或者(feature,value)對,或者strings。這取決於構造器參數:input_type。

Mapping被看做是由(feature,value)構成的一個列表,而單個字符串隱式的等於1,所以['feat1', 'feat2', 'feat3']被解釋成(feature,value)的列表:[('feat1', 1), ('feat2',2), ('feat3', 3)]。 如果一個特征在一個樣本中出現了多次,相關聯的值就會累加起來:(比如('feat', 2)和('feat', 3.5)會累計起來成為('feat', 5.5))。

FeatureHasher的輸出通常是CSR格式的scipy.sparse matrix。

Feature hashing 可被用於文檔分類中去,但是與text.CountVectorizer不同,FeatureHasher不做單詞切分或其他的預處理操作,除了Unicode-to-UTF-8編碼以外。

Text Feature Extraction

  • The Bag of Words represention 詞袋模型
  • Sparsity
  • Common Vectorizer usage
  • TF-idf term weighting
  • Decoding text files
  • Limitations of the Bag of Words represention 詞袋模型的局限性
  • Vertorizing a large text corpus with the hashing trick
  • Performing out-of-core scaling with HashingVectorizer
  • Customizing the vectorizer classes

The Bag of Words represention

Sparsity

Common Vectorizer usage

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(min_df=1)
print(vectorizer)
corpus = [
    'This is the first documents.',
    'This is the second documents.',
    'And the third document.',
    'Is this the first documents?',
]

X = vectorizer.fit_transform(corpus)
print(X)

在默認的設置中,提取的字符串長度至少要有兩個字符,低於兩個字符的會被忽略,比如'a'

analyze = vectorizer.build_analyzer()
analyze('This is a text document to analyze.') == (['this', 'is', 'text', 'document', 'to', 'analyze'])

在fit階段被analyser發現的每一個詞語(term)都會被分配一個獨特的整數索引(unique interger index), 該索引對應於特征向量矩陣中的一列,全部小寫化。

使用下面的方法獲取某一個詞語在矩陣中的第幾列。

因此,在訓練語料中沒有見到過的單詞將會被未來的轉換方法完全忽略。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM