特征提取
目的:將數字化的信號數據、符號化的文本轉化成特征向量。
- 字典儲存的數據,用DictVectorizer進行特征抽取與向量化。
from sklearn.feature_extraction import DictVectorizer
measurements = [{'city':'Dubai','temperature':33},{'city':'London','temperature':12},{'city':'San Fransisco','temperature':18}]
vec = DictVectorizer()
print vec.fit_transform(measurements).toarray()
print vec.get_feature_names()
- 文本數據
(1). 文本特征表示方法--詞袋法(Bag of Words)
將不重復的詞匯集合成詞表,每條訓練文本都可以在詞表上映射一個特征向量。
(2). 特征數值的計算方法
CountVectorizer
考慮每種詞匯在該條訓練文本中的頻率。
#coding:utf-8
from sklearn.datasets import fetch_20newsgroups
from sklearn.cross_validation import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report
news = fetch_20newsgroups(subset='all')
x_train,x_test,y_train,y_test = train_test_split(news.data,news.target,test_size=0.25,random_state=33)
#默認不去除英文停用詞
count_vec = CountVectorizer()
#訓練特征向量
x_count_train = count_vec.fit_transform(x_train)
x_count_test = count_vec.transform(x_test)
#對樸素貝葉斯分類器進行初始化
mnb_count = MultinomialNB()
#對訓練樣本參數學習
mnb_count.fit(x_count_train,y_train)
print '20組新聞數據使用樸素貝葉斯count',mnb_count.score(x_count_test,y_test)
y_count_predict = mnb_count.predict(x_count_test)
print classification_report(y_test,y_count_predict,target_names=news.target_names)
TfidfVectorizer
不僅關注本條訓練數據,還關注其他數據。
#coding:utf-8
from sklearn.datasets import fetch_20newsgroups
from sklearn.cross_validation import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report
news = fetch_20newsgroups(subset='all')
x_train,x_test,y_train,y_test =train_test_split(news.data,news.target,test_size=0.25,random_state=33)
tfidf_vec = TfidfVectorizer()
x_tfidf_train = tfidf_vec.fit_transform(x_train)
x_tfidf_test = tfidf_vec.transform(x_test)
mnb_tfidf = MultinomialNB()
mnb_tfidf.fit(x_tfidf_train,y_train)
print '20組新聞數據使用樸素貝葉斯tfidf:',mnb_tfidf.score(x_tfidf_test,y_test)
y_tfidf_predict = mnb_tfidf.predict(x_tfidf_test)
print classification_report(y_test,y_tfidf_predict,target_names=news.target_names)
在訓練文本量較多的時候,利用Tfidf提升模型性能作用。