1. 程式人生 > >Sklearn學習之路(1)——從20newsgroups開始講起

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也有一個類似的案例。因此我們先拿這個下手了。整個過程概括起來分為以下幾步:

  1. 資料採集
  2. 特徵提取
  3. 模型訓練
  4. 模型評估

接下來我們對這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 小結

從這幾個簡單的程式碼裡,我們大概獲知了這麼幾個知識點:

  1. Sklearn的優勢
  2. 一個機器學習的大致流程,當然這個案例會比較特殊,我們在以後的講解中再詳細介紹。
  3. 知道了如何獲取sklearn自帶的資料集
  4. 知道了如何進行TFIDF特徵抽取
  5. 知道了如何進行樸素貝葉斯分類的學習和預測過程
  6. 知道了如何評估一個機器學習演算法的優劣

相比較而言,收穫還是挺多的,接下來我們會進一步認識Sklearn裡的一些很重要的部分。