03_数据的特征抽取,sklearn特征抽取API,字典特征抽取DictVectorizer,文本特征抽取CountVectorizer,TF-IDF(TfidfVectorizer),详细案例
數(shù)據(jù)的特征抽取
A:特征抽取實(shí)例演示
通過演示得出結(jié)論:
- 特征抽取針對(duì)非連續(xù)型數(shù)據(jù)
- 特征抽取對(duì)文本等進(jìn)行特征值化
注:特征值化是為了計(jì)算機(jī)更好的去理解數(shù)據(jù)。
B:sklearn特征抽取API
sklearn.feature_extraction模塊,可以用于從包含文本和圖片的數(shù)據(jù)集中提取特征,以便支持機(jī)器學(xué)習(xí)算法使用。
注意:Feature extraction與Feature Selection是完全不同的:前者將專有數(shù)據(jù)(文本或圖片)轉(zhuǎn)換成機(jī)器學(xué)習(xí)中可用的數(shù)值型特征;后者則是用在這些特征上的機(jī)器學(xué)習(xí)技術(shù)。
C:字典特征抽取
作用:對(duì)字典數(shù)據(jù)進(jìn)行特征值化
類:sklearn.feature_extraction.DictVectorizer
以下來(lái)自:https://www.cnblogs.com/hufulinblog/p/10591339.html
將特征與值的映射字典組成的列表轉(zhuǎn)換成向量。
DictVectorizer通過使用scikit-learn的estimators,將特征名稱與特征值組成的映射字典構(gòu)成的列表轉(zhuǎn)換成Numpy數(shù)組或者Scipy.sparse矩陣。
當(dāng)特征的值是字符串時(shí),這個(gè)轉(zhuǎn)換器將進(jìn)行一個(gè)二進(jìn)制One-hot編碼。One-hot編碼是將特征所有可能的字符串值構(gòu)造成布爾型值。
例如:特征f有一個(gè)值ham,一個(gè)值spam,轉(zhuǎn)換后會(huì)變成兩個(gè)特征f=ham和f=spam.
注意:轉(zhuǎn)換器只會(huì)將字符串形式的特征轉(zhuǎn)換成One-hot編碼,數(shù)值型的不會(huì)轉(zhuǎn)換。
一個(gè)字典中樣本沒有的特征在結(jié)果矩陣中的值是0.
構(gòu)造參數(shù):
class sklearn.feature_extraction.DictVectorizer(dtype=<class‘numpy.float64’>, separator=’=’, sparse=True, sort=True)
dtype:callable, 可選參數(shù), 默認(rèn)為float。特征值的類型,傳遞給Numpy.array或者Scipy.sparse矩陣構(gòu)造器作為dtype參數(shù)。
separator:string,可選參數(shù),默認(rèn)為"="。當(dāng)構(gòu)造One-hot編碼的特征值時(shí)要使用的分割字符串。分割傳入字典數(shù)據(jù)的鍵與值的字符串,生成的字符串會(huì)作為特征矩陣的列名。
sparse: boolearn, 可選參數(shù),默認(rèn)為True。transform是否要使用scipy產(chǎn)生一個(gè)sparse矩陣。DictVectorizer的內(nèi)部實(shí)現(xiàn)是將數(shù)據(jù)直接轉(zhuǎn)換成sparse矩陣,如果sparse為False, 再把sparse矩陣轉(zhuǎn)換成numpy.ndarray型數(shù)組。
sort:boolearn,可選參數(shù),默認(rèn)為True。在擬合時(shí)是否要多feature_names和vocabulary_進(jìn)行排序。
屬性:
vocabulary_: 特征名稱和特征索引的映射字典。
feature_names_: 一個(gè)包含所有特征名稱的,長(zhǎng)度為特征名稱個(gè)數(shù)的列表。
方法:
fit(X,y=None): 計(jì)算出轉(zhuǎn)換結(jié)果中feature name與列索引之間的對(duì)照字典vocabulary_,同時(shí)會(huì)計(jì)算出特征名稱列表 feature_names_。這里的參數(shù)y沒有任何作用。(X:字典或者包含字典的迭代器,返回值:返回sparse矩陣)
fit_transform(X,y=None): 包含fit函數(shù)的功能,并且會(huì)將X轉(zhuǎn)換成矩陣。
get_feature_names(): 返回feature_names_ (返回類別名稱)
get_params(deep=True): 返回當(dāng)前DictVectorizer對(duì)象的構(gòu)造參數(shù)。
inverse_transform(X[,dict_type]): 將矩陣還原成特征字典列表。還原出來(lái)的字典跟原數(shù)據(jù)并不是完全一樣。傳入的X必須是這個(gè)DictVectorizer經(jīng)過transform或者fit_transform產(chǎn)生的X。(X:array數(shù)組或者sparse矩陣,返回值:轉(zhuǎn)換之前數(shù)據(jù)格式)
restrict(support, indicies=False): 根據(jù)傳入的support參數(shù),對(duì)特征矩陣進(jìn)行篩選。
**set_params(params): 設(shè)置DictVectorizer的參數(shù)
transform(X): 將X轉(zhuǎn)換為numpy.ndarray或者Scipy.sparse (按照原先的標(biāo)準(zhǔn)轉(zhuǎn)換)
流程:
1、實(shí)例化類DictVectorizer。
2、調(diào)用fit_transform方法輸入數(shù)據(jù)并轉(zhuǎn)換。
案例1:
from sklearn.feature_extraction import DictVectorizerdef dictvec():"""字典數(shù)據(jù)抽取:return:"""#實(shí)例化dict = DictVectorizer(sparse=False)#調(diào)用fit_transformdata = dict.fit_transform([{'city': '北京','temperature': 100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature': 30}])print("--------------get_feature_names-----------------------------------------------")print(dict.get_feature_names())print("--------------data,含有該feature_names的為1,否則為0,最終的目標(biāo)值是實(shí)際的值-----")print(data)print("--------------inverse_transform:通過特征抽取的結(jié)果還原原來(lái)的數(shù)據(jù)---------------")print(dict.inverse_transform(data))return Noneif __name__ == "__main__":dictvec()輸出結(jié)果:
--------------get_feature_names----------------------------------------------- ['city=上海', 'city=北京', 'city=深圳', 'temperature'] --------------data,含有該feature_names的為1,否則為0,最終的目標(biāo)值是實(shí)際的值----- [[ 0. 1. 0. 100.] 0. 1. 0:表示有'city=北京'這個(gè)特征,'temperature'的值為100.[ 1. 0. 0. 60.][ 0. 0. 1. 30.]] --------------inverse_transform:通過特征抽取的結(jié)果還原原來(lái)的數(shù)據(jù)--------------- [{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 60.0}, {'city=深圳': 1.0, 'temperature': 30.0}]案例2:
from sklearn.feature_extraction import DictVectorizer# 設(shè)置sparse=False獲得numpy ndarray形式的結(jié)果 v = DictVectorizer(sparse=False) D = [{"foo": 1, "bar": 2}, {"foo": 3, "baz": 1}]# 對(duì)字典列表D進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換成特征矩陣 X = v.fit_transform(D) # 特征矩陣的行代表數(shù)據(jù),列代表特征,0表示該數(shù)據(jù)沒有該特征 print(X) # 獲取特征列名 print(v.get_feature_names())# inverse_transform可以將特征矩陣還原成原始數(shù)據(jù) print(v.inverse_transform(X) == D)# 直接進(jìn)行轉(zhuǎn)換,不先進(jìn)行擬合的話,無(wú)法識(shí)別新的特征 print(v.transform([{"foo": 4, "unseen_feature": 3}]))輸出結(jié)果:
[[2. 0. 1.][0. 1. 3.]] ['bar', 'baz', 'foo'] True [[0. 0. 4.]]配合特征選擇:
from sklearn.feature_extraction import DictVectorizer from sklearn.feature_selection import SelectKBest,chi2# 設(shè)置sparse=False獲得numpy ndarray形式的結(jié)果 v = DictVectorizer(sparse=False) D = [{"foo": 1, "bar": 2}, {"foo": 3, "baz": 1}]# 對(duì)字典列表D進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換成特征矩陣 X = v.fit_transform(D) # 特征矩陣的行代表數(shù)據(jù),列代表特征,0表示該數(shù)據(jù)沒有該特征 print(X) # 獲取特征列名 print(v.get_feature_names())# 得到一個(gè)篩選器,使用卡方統(tǒng)計(jì)篩選出最好的2個(gè)特征 support = SelectKBest(chi2, k=2).fit(X, [0, 1])# 進(jìn)行篩選,篩選的結(jié)果會(huì)自動(dòng)覆蓋原有的特征矩陣 print(v.restrict(support.get_support())) print(v.get_feature_names())輸出結(jié)果為:
[[2. 0. 1.][0. 1. 3.]] ['bar', 'baz', 'foo'] DictVectorizer(dtype=<class 'numpy.float64'>, separator='=', sort=True,sparse=False) ['bar', 'foo']D:文本特征抽取
作用:對(duì)文本數(shù)據(jù)進(jìn)行特征值化
類:sklearn.feature_extraction.text.CountVectorizer
CountVectorizer()函數(shù)只考慮每個(gè)單詞出現(xiàn)的頻率;然后構(gòu)成一個(gè)特征矩陣,每一行表示一個(gè)訓(xùn)練文本的詞頻統(tǒng)計(jì)結(jié)果。其思想是,先根據(jù)所有訓(xùn)練文本,不考慮其出現(xiàn)順序,只將訓(xùn)練文本中每個(gè)出現(xiàn)過的詞匯單獨(dú)視為一列特征,構(gòu)成一個(gè)詞匯表(vocabulary list),該方法又稱為詞袋法(Bag of Words)。
CountVectorizer語(yǔ)法:
CountVectorizer(max_df=1.0,min_df=1,…)
-
返回詞頻矩陣
-
CountVectorizer.fit_transform(X,y)
X:文本或者包含文本字符串的可迭代對(duì)象
返回值:返回sparse矩陣 -
CountVectorizer.inverse_transform(X)
X: array數(shù)組或者sparse矩陣
**返回值:**轉(zhuǎn)換之前數(shù)據(jù)格式 -
CountVectorizer.get_feature_names()
**返回值:**單詞列表
流程:
1、實(shí)例化類CountVectorizer
2、調(diào)用fit_transform方法輸入數(shù)據(jù)并轉(zhuǎn)換
注意返回格式,利用toarray()進(jìn)行sparse矩陣轉(zhuǎn)換array數(shù)組
案例:
from sklearn.feature_extraction.text import CountVectorizertexts = ["orange banana apple grape","banana apple apple","grape", "orange apple"] cv = CountVectorizer() cv_fit = cv.fit_transform(texts)print("------------cv.get_feature_names()-----------------") print(cv.get_feature_names()) """ 結(jié)果為: ['apple', 'banana', 'grape', 'orange'] """print("-----------------cv.vocabulary_--------------------") print(cv.vocabulary_) """ 結(jié)果是: {'orange': 3, 'banana': 1, 'apple': 0, 'grape': 2} 這里是根據(jù)首字母順序,將texts變量中所有單詞進(jìn)行排序,按照單詞首字母排序的順序: apple 序號(hào):0 banana 序號(hào):1 grape 序號(hào):2 orange 序號(hào):3 """print("-----------------cv_fit----------------------------") print(cv_fit) """ 結(jié)果是:(0, 3) 1(0, 1) 1(0, 0) 1(0, 2) 1(1, 1) 1(1, 0) 2(2, 2) 1(3, 3) 1(3, 0) 1其中括號(hào)里面的第一列表示的是字符串的序號(hào),以下針對(duì)第一列進(jìn)行說(shuō)明 0:表示字符串"orange banana apple grape" 1:表示字符串"banana apple apple" 2:表示字符串"grape" 3:表示字符串"orange apple"組合起來(lái):(0, 3) 1 表示第一個(gè)字符串"orange banana apple grape"中出現(xiàn)orange的次數(shù)是1(0, 1) 1 表示第一個(gè)字符串"orange banana apple grape"中出現(xiàn)banana的次數(shù)是1依次類推(1, 0) 2 表示第一個(gè)字符串"banana apple apple"中出現(xiàn)apple的次數(shù)是2... """print("--------------cv_fit.toarray()---------------------") print(cv_fit.toarray()) """ 結(jié)果為: [[1 1 1 1][2 1 0 0][0 0 1 0][1 0 0 1]]可以理解為: {'orange': 3, 'banana': 1, 'apple': 0, 'grape': 2}'apple' 'banana' 'grape' 'orange' "orange banana apple grape" [[1 1 1 1] "banana apple apple" [ 2 1 0 0] "grape" [ 0 0 1 0] "orange apple" [ 1 0 0 1]]即行表示字符串,列表示單詞 """再如案例:
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizerX_test = ['I am a student','You can’t even make this stuff up'] # stop_words=None表示不去掉停用詞,若改為stop_words='english'則去掉停用詞 count_vec=CountVectorizer(stop_words=None) #訓(xùn)練count_vec中的屬性,并返回?cái)?shù)組 arr = count_vec.fit_transform(X_test).toarray()print('vocabulary list:\n', count_vec.get_feature_names()) """ 輸出的結(jié)果為: ['am', 'can', 'even', 'make', 'student', 'stuff', 'this', 'up', 'you'] """print('result array:\n',arr) """ 輸出結(jié)果為:[[1 0 0 0 1 0 0 0 0] #這里表示am和student都出現(xiàn)了1次,其它的出現(xiàn)了0次[0 1 1 1 0 1 1 1 1]] #這里表示am和student沒出現(xiàn),其它的單詞都出現(xiàn)了一次上面的數(shù)組的列對(duì)應(yīng):['am', 'can', 'even', 'make', 'student', 'stuff', 'this', 'up', 'you']上面的數(shù)組有兩行,表示有2段字符串 """print('vocabulary_:\n', count_vec.vocabulary_) """ 結(jié)果是:{'am': 0, 'student': 4, 'you': 8, 'can': 1, 'even': 2, 'make': 3, 'this': 6, 'stuff': 5, 'up': 7}0 4 8 1 等這些數(shù)值表示在單詞在count_vec.get_feature_names()的順序 """########################################################## ########## CountVectorizer同樣適用于中文 ################## ##########################################################X_test = ['中國(guó) 你 是 城市 都是 小區(qū)', '中國(guó) 你 小區(qū) 旅行 飲食 學(xué)校'] ## 默認(rèn)將所有單個(gè)漢字視為停用詞; count_vec=CountVectorizer(token_pattern=r"(?u)\b\w\w+\b") arr = count_vec.fit_transform(X_test).toarray()print('vocabulary list:\n', count_vec.get_feature_names()) """ 輸出結(jié)果為: vocabulary list:['中國(guó)', '城市', '學(xué)校', '小區(qū)', '旅行', '都是', '飲食'] """print('result array:\n', arr) """ 輸出結(jié)果為: result array:[[1 1 0 1 0 1 0][1 0 1 1 1 0 1]] """print('vocabulary_:\n', count_vec.vocabulary_) """ 輸出結(jié)果為: vocabulary_:{'中國(guó)': 0, '城市': 1, '都是': 5, '小區(qū)': 3, '旅行': 4, '飲食': 6, '學(xué)校': 2} """再如:
# 文檔進(jìn)行特征值化 # 導(dǎo)入包 from sklearn.feature_extraction.text import CountVectorizerdef countvec():"""對(duì)文本進(jìn)行特征值化:return:"""cv = CountVectorizer()data = cv.fit_transform(["人生 苦短,我 喜歡 python","人生漫長(zhǎng),不用 python"])print(cv.get_feature_names())print(data.toarray())return Noneif __name__ == "__main__":countvec()輸出結(jié)果為:
['python', '不用', '人生', '人生漫長(zhǎng)', '喜歡', '苦短'] [[1 0 1 0 1 1][1 1 0 1 0 0]]注意:不支持單個(gè)中文字
另外如果文本是一段連續(xù)的話,這時(shí)候就需要對(duì)中文進(jìn)行分詞才能詳細(xì)的進(jìn)行特征值化
中文分詞,使用:jieba分詞
下載:
使用方法:
import jieba jieba.cut("我是一個(gè)好程序員")注意:
返回值:詞語(yǔ)生成器案例:
from sklearn.feature_extraction.text import CountVectorizer import jieba def cutword():con1 = jieba.cut("今天很殘酷,明天更殘酷,后天很美好,但絕大部分是死在明天晚上,所以每個(gè)人不要放棄今天")con2 = jieba.cut("我們看到的從很遠(yuǎn)星系來(lái)的光是在幾百萬(wàn)年之前發(fā)出的,這樣當(dāng)我們看到宇宙時(shí),我們是在看它的過去。")con3 = jieba.cut("如果只用一種方式了解某樣事物,你就才會(huì)真正了解它。")# 轉(zhuǎn)換成列表content1 = list(con1)content2 = list(con2)content3 = list(con3)# 把列表轉(zhuǎn)換成字符串c1 = ' '.join(content1)c2 = ' '.join(content2)c3 = ' '.join(content3)return c1,c2,c3def hanzivec():"""中文特征值化:return:"""c1,c2,c3 = cutword()print("----------------------c1,c2,c3--------------------------------")print(c1,c2,c3)cv = CountVectorizer()data = cv.fit_transform([c1,c2,c3])print("----------------------get_feature_names:----------------------")print(cv.get_feature_names())print("----------------------data.toarray:---------------------------")print(data.toarray())return Noneif __name__ == "__main__":hanzivec()輸出結(jié)果:
----------------------c1,c2,c3-------------------------------- 今天 很 殘酷 , 明天 更 殘酷 , 后天 很 美好 , 但 絕大部分 是 死 在 明天 晚上 , 所以 每個(gè) 人 不要 放棄 今天 我們 看到 的 從 很 遠(yuǎn) 星系 來(lái) 的 光是在 幾百萬(wàn)年 之前 發(fā)出 的 , 這樣 當(dāng) 我們 看到 宇宙 時(shí) , 我們 是 在 看 它 的 過去 。 如果 只用 一種 方式 了解 某樣 事物 , 你 就 才 會(huì) 真正 了解 它 。 ----------------------get_feature_names:---------------------- ['一種', '不要', '之前', '了解', '事物', '今天', '光是在', '幾百萬(wàn)年', '發(fā)出', '只用', '后天', '如果', '宇宙', '我們', '所以', '放棄', '方式', '明天', '星系', '晚上', '某樣', '殘酷', '每個(gè)', '看到', '真正', '絕大部分', '美好', '過去', '這樣'] ----------------------data.toarray:--------------------------- [[0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 1 0 2 0 1 0 2 1 0 0 1 1 0 0][0 0 1 0 0 0 1 1 1 0 0 0 1 3 0 0 0 0 1 0 0 0 0 2 0 0 0 1 1][1 0 0 2 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0]]TF-IDF
**TF-IDF的主要思想是:**如果某個(gè)詞或短語(yǔ)在一篇文章中出現(xiàn)的概率高,并且在其他文章中很少出現(xiàn),則認(rèn)為此詞或者短語(yǔ)具有很好的類別區(qū)分能力,適合用來(lái)分類。
TF-IDF作用:用以評(píng)估一個(gè)字詞對(duì)于一個(gè)文件集或一個(gè)語(yǔ)料庫(kù)中的其中一份文件的重要程度。
類:sklearn.feature_extraction.text.TfidfVectorizer
語(yǔ)法:
TfidfVectorizer(stop_words=None,…)
- 返回詞的權(quán)重矩陣
TfidfVectorizer.fit_transform(X,y)
- **X:**文本或者包含文本字符串的可迭代對(duì)象
- **返回值:**返回sparse矩陣
TfidfVectorizer.inverse_transform(X)
X: array數(shù)組或者sparse矩陣
返回值: 轉(zhuǎn)換之前數(shù)據(jù)格式
TfidfVectorizer.get_feature_names()
**返回值:**單詞列表
案例:
from sklearn.feature_extraction.text import TfidfVectorizerX_test = ['中國(guó) 你 是 城市 都是 小區(qū)', '中國(guó) 你 小區(qū) 旅行 飲食 學(xué)校']# 默認(rèn)將所有單個(gè)漢字視為停用詞: tfidf_vec=TfidfVectorizer(token_pattern=r"(?u)\b\w\w+\b") arr = tfidf_vec.fit_transform(X_test).toarray()print('vocabulary list:\n',tfidf_vec.get_feature_names()) """ 輸出結(jié)果: 下面相當(dāng)于是特征值 vocabulary list:['中國(guó)', '城市', '學(xué)校', '小區(qū)', '旅行', '都是', '飲食'] """print('result array:\n',arr) """ 下面的列代表是:['中國(guó)', '城市', '學(xué)校', '小區(qū)', '旅行', '都是', '飲食'] 下面矩陣中有兩行,即詞的權(quán)重矩陣。 result array:[[0.40993715 0.57615236 0. 0.40993715 0. 0.57615236 0. ][0.35520009 0. 0.49922133 0.35520009 0.49922133 0. 0.49922133]] """機(jī)器學(xué)習(xí)原理這本書的介紹:
詞頻-逆向文件頻率(TF-IDF)是一種在文本挖掘中廣泛使用的特征向量化方法,它可以體現(xiàn)一個(gè)文檔中詞語(yǔ)在語(yǔ)料庫(kù)中的重要程度。
詞語(yǔ)由t表示,文檔由d表示,語(yǔ)料庫(kù)由D表示。詞頻TF(t,d)是詞語(yǔ)t在文檔d中出現(xiàn)的次數(shù)。文件頻率DF(t,D)是包含詞語(yǔ)的文檔的個(gè)數(shù)。如果我們只使用詞頻來(lái)衡量重要性,很容易過度強(qiáng)調(diào)在文檔中經(jīng)常出現(xiàn)而并沒有包含太多與文檔有關(guān)的信息的詞語(yǔ),比如“a”,“the”以及“of”。如果一個(gè)詞語(yǔ)經(jīng)常出現(xiàn)在語(yǔ)料庫(kù)中,它意味著它并沒有攜帶特定的文檔的特殊信息。逆向文檔頻率數(shù)值化衡量詞語(yǔ)提供多少信息:
其中,|D|是語(yǔ)料庫(kù)中的文檔總數(shù)。由于采用了對(duì)數(shù),如果一個(gè)詞出現(xiàn)在所有的文件,其IDF值變?yōu)?。
TFIDF(t,d,D)=TF(t,d) *
總結(jié)
以上是生活随笔為你收集整理的03_数据的特征抽取,sklearn特征抽取API,字典特征抽取DictVectorizer,文本特征抽取CountVectorizer,TF-IDF(TfidfVectorizer),详细案例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 02_混淆矩阵、准确率(Accuracy
- 下一篇: 蔚来et5座椅通风多少钱?