sklearn.featture_extraction.DictVectorizer:
將特征與值的映射字典組成的列表轉換成向量。
DictVectorizer通過使用scikit-learn的estimators,將特征名稱與特征值組成的映射字典構成的列表轉換成Numpy數組或者Scipy.sparse矩陣。
當特征的值是字符串時,這個轉換器將進行一個二進制One-hot編碼。One-hot編碼是將特征所有可能的字符串值構造成布爾型值。例如: 特征f有一個值ham,一個值spam,轉換后會變成兩個特征f=ham和f=spam。
注意,轉換器只會將字符串形式的特征值轉換成One-hot編碼,數值型的不會轉換。
一個字典中樣本沒有的特征在結果矩陣中的值是0.
構造參數:
class sklearn.feature_extraction.DictVectorizer(dtype=<class‘numpy.float64’>, separator=’=’, sparse=True, sort=True)
dtype:callable, 可選參數, 默認為float。特征值的類型,傳遞給Numpy.array或者Scipy.sparse矩陣構造器作為dtype參數。
separator: string, 可選參數, 默認為"="。當構造One-hot編碼的特征值時要使用的分割字符串。分割傳入字典數據的鍵與值的字符串,生成的字符串會作為特征矩陣的列名。
sparse: boolearn, 可選參數,默認為True。transform是否要使用scipy產生一個sparse矩陣。DictVectorizer的內部實現是將數據直接轉換成sparse矩陣,如果sparse為False, 再把sparse矩陣轉換成numpy.ndarray型數組。
sort:boolearn,可選參數,默認為True。在擬合時是否要多feature_names和vocabulary_進行排序。
屬性:
vocabulary_: 特征名稱和特征列索引的映射字典。
feature_names_: 一個包含所有特征名稱的,長度為特征名稱個數的列表。
方法:
fit(X,y=None): 計算出轉換結果中feature name與 列索引之間的對照字典vocabulary_,同時會計算出特征名稱列表 feature_names_。這里的參數y沒有任何作用。
fit_transform(X,y=None): 包含fit函數的功能,並且會將X轉換成矩陣。
get_feature_names(): 返回feature_names_
get_params(deep=True): 返回當前DictVectorizer對象的構造參數。
inverse_transform(X[,dict_type]): 將矩陣還原成特征字典列表。還原出來的字典跟原數據並不是完全一樣。傳入的X必須是這個DictVectorizer經過transform或者fit_transform產生的X。
restrict(support, indicies=False): 根據傳入的support參數,對特征矩陣進行篩選。
set_params(**params): 設置DictVectorizer的參數
transform(X): 將X轉換為numpy.ndarray或者Scipy.sparse
使用樣例:
from sklearn.feature_extraction import DictVectorizer # 設置sparse=False獲得numpy ndarray形式的結果 v = DictVectorizer(sparse=False) D = [{"foo": 1, "bar": 2}, {"foo": 3, "baz": 1}] # 對字典列表D進行轉換,轉換成特征矩陣 X = v.fit_transform(D) # 特征矩陣的行代表數據,列代表特征,0表示該數據沒有該特征 print(X) # 獲取特征列名 print(v.get_feature_names()) # inverse_transform可以將特征矩陣還原成原始數據 print(v.inverse_transform(X) == D) # 直接進行轉換,不先進行擬合的話,無法識別新的特征 print(v.transform([{"foo": 4, "unseen_feature": 3}]))
輸出:
[[2. 0. 1.] [0. 1. 3.]] ['bar', 'baz', 'foo'] True [[0. 0. 4.]]
配合特征選擇:
from sklearn.feature_selection import SelectKBest, chi2 # 得到一個篩選器,使用卡方統計篩選出最好的2個特征 support = SelectKBest(chi2, k=2).fit(X, [0, 1]) # 進行篩選,篩選的結果會自動覆蓋原有的特征矩陣 print(v.restrict(support.get_support())) print(v.get_feature_names())
輸出:
DictVectorizer(dtype=<class 'numpy.float64'>, separator='=', sort=True, sparse=False) ['bar', 'foo']