Sklearn學習之路(1)——從20newsgroups開始講起
1. Sklearn 簡介
Sklearn是一個機器學習的python庫,裡面包含了幾乎所有常見的機器學習與資料探勘的各種演算法。
具體的,它常見的包括資料預處理(preprocessing)(正則化,歸一化等),特徵提取(feature_extraction)(TFIDF等),降維(decomposition)(PCA等),以及常見的機器學習演算法(分類、聚類、迴歸),更特別的,它也包括了評估(混淆矩陣與PRF及Acc值)和引數優化等(GridSearchCV),甚至是交叉驗證(cross_validation)等都包含在內,可謂是機器學習整個流程都有了。
2. 20newsgroups案例
下面我們從20新聞語料這個案例開始,熟悉這些我們應該會的部分。首先給出全部程式碼:
from sklearn.datasets import fetch_20newsgroups
categories = ['alt.atheism', 'soc.religion.christian', 'comp.graphics', 'sci.med']
twenty_train = fetch_20newsgroups(subset='train', categories=categories, shuffle=True, random_state=42)
'''
這是開始提取特徵,這裡的特徵是詞頻統計。
'''
from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(twenty_train.data)
'''
這是開始提取特徵,這裡的特徵是TFIDF特徵。
'''
from sklearn.feature_extraction.text import TfidfTransformer
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
'''
使用樸素貝葉斯分類,並做出簡單的預測
'''
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB().fit(X_train_tfidf, twenty_train.target)
docs_new = ['God is love', 'OpenGL on the GPU is fast']
X_new_counts = count_vect.transform(docs_new)
X_new_tfidf = tfidf_transformer.transform(X_new_counts)
predicted = clf.predict(X_new_tfidf)
for doc, category in zip(docs_new, predicted):
print('%r => %s' % (doc, twenty_train.target_names[category]))
'''
使用測試集來評估模型好壞。
'''
from sklearn import metrics
import numpy as np;
twenty_test = fetch_20newsgroups(subset='test',categories=categories, shuffle=True, random_state=42)
docs_test = twenty_test.data
X_test_counts = count_vect.transform(docs_test)
X_test_tfidf = tfidf_transformer.transform(X_test_counts)
predicted = clf.predict(X_test_tfidf)
print(metrics.classification_report(twenty_test.target, predicted,target_names=twenty_test.target_names))
print("accurary\t"+str(np.mean(predicted == twenty_test.target)))
這個案例是一個新聞標題分類的案例,NLPCC 2017 Shared Task也有一個類似的案例。因此我們先拿這個下手了。整個過程概括起來分為以下幾步:
- 資料採集
- 特徵提取
- 模型訓練
- 模型評估
接下來我們對這4個部分的程式碼進行詳細的講解。
2.1 資料採集
從上面的程式碼中,我們可以看到獲取資料很簡單:
from sklearn.datasets import fetch_20newsgroups
categories = ['alt.atheism', 'soc.religion.christian', 'comp.graphics', 'sci.med']
twenty_train = fetch_20newsgroups(subset='train', categories=categories, shuffle=True, random_state=42)
那麼這裡最重要的就是這個fetch_20newsgroups
方法了,下面我們來詳細講解:
##函式原型是這樣的。
'''
fetch_20newsgroups(data_home=None,subset='train',categories=None,shuffle=True,random_state=42,remove=(),download_if_missing=True)
'''
'''
data_home指的是資料集的地址,如果預設的話,所有的資料都會在'~/scikit_learn_data'資料夾下.
subset就是train,test,all三種可選,分別對應訓練集、測試集和所有樣本。
categories:是指類別,如果指定類別,就會只提取出目標類,如果是預設,則是提取所有類別出來。
shuffle:是否打亂樣本順序,如果是相互獨立的話。
random_state:打亂順序的隨機種子
remove:是一個元組,用來去除一些停用詞的,例如標題引用之類的。
download_if_missing: 如果資料缺失,是否去下載。
'''
經過測試可知
twenty_train.data是一個list型別,每一個元素是str型別,也就是一篇文章。
twenty_train.target則是它的標籤。
這樣資料集就基本採集好了。
2.2 特徵提取
資料採集完成以後,就要開始提取特徵了,我們這裡使用的是TFIDF特徵。
'''
這是開始提取特徵,這裡的特徵是詞頻統計。
'''
from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(twenty_train.data)
'''
這是開始提取特徵,這裡的特徵是TFIDF特徵。
'''
from sklearn.feature_extraction.text import TfidfTransformer
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
'''
這是用來轉換成矩陣的,裡面還有幾個能調節的引數tf最大值最小值,停用詞等。
轉換後的矩陣為係數矩陣,儲存方式為(x,y) 目標值。
'''
2.3 模型訓練
這裡我們使用樸素貝葉斯來進行訓練,而且使用的是預設值,官網上面有很多引數可以調節這個演算法。
'''
使用樸素貝葉斯分類,並做出簡單的預測
'''
from sklearn.naive_bayes import MultinomialNB
#這是進行訓練的過程。
clf = MultinomialNB().fit(X_train_tfidf, twenty_train.target)
docs_new = ['God is love', 'OpenGL on the GPU is fast']
X_new_counts = count_vect.transform(docs_new)
X_new_tfidf = tfidf_transformer.transform(X_new_counts)
#重要的一行在這裡,這是進行預測的過程。
predicted = clf.predict(X_new_tfidf)
for doc, category in zip(docs_new, predicted):
print('%r => %s' % (doc, twenty_train.target_names[category]))
其最終的測試結果我們也可以看到:
‘God is love’ => soc.religion.christian
‘OpenGL on the GPU is fast’ => comp.graphics
說明這個分類效果還是不錯的,但是我們評估一個模型的好壞不能靠一個2個樣例來決定。下面才是評估的正確方法。
2.4模型的評估
模型的評估一般使用PRF(精確率,召回率,F1值)和Acc值(準確值)來評估,因此我們使用以下程式碼:
'''
使用測試集來評估模型好壞。
'''
from sklearn import metrics
import numpy as np;
twenty_test = fetch_20newsgroups(subset='test',categories=categories, shuffle=True, random_state=42)
docs_test = twenty_test.data
X_test_counts = count_vect.transform(docs_test)
X_test_tfidf = tfidf_transformer.transform(X_test_counts)
predicted = clf.predict(X_test_tfidf)
#使用metrics.classification_report方法可以輕鬆獲取這些資訊。
print(metrics.classification_report(twenty_test.target, predicted,target_names=twenty_test.target_names))
#使用這個方法可以比較兩個target的差異。
print("accurary\t"+str(np.mean(predicted == twenty_test.target)))
3 小結
從這幾個簡單的程式碼裡,我們大概獲知了這麼幾個知識點:
- Sklearn的優勢
- 一個機器學習的大致流程,當然這個案例會比較特殊,我們在以後的講解中再詳細介紹。
- 知道了如何獲取sklearn自帶的資料集
- 知道了如何進行TFIDF特徵抽取
- 知道了如何進行樸素貝葉斯分類的學習和預測過程
- 知道了如何評估一個機器學習演算法的優劣
相比較而言,收穫還是挺多的,接下來我們會進一步認識Sklearn裡的一些很重要的部分。