經過前人的努力,現在已經有很多的機器學習的工具可以讓我們使用。

Scikit-Learn

Scikit-Learn是一套很常被使用的機器學習工具,若要在Python使用,其include函式庫的名稱為sklearn。

Classifier

每個classifier都對應著一套機器學習的演算法,Scikit-Learn裡面有很多個classifier。若要使用某個classifier,則在使用前,我們需要先從sklearn的ensemble裡去引用該classifier,然後呼叫它,就可以使用fit()、predict()等函數,進行訓練以及測試,在機器學習世界的潛規則(?中,一堆資料裡,有80% 會拿來訓練,剩下的20% 則用來測試。

至於要怎麼取得訓練用的資料測試用的資料,這裡提供兩種方式:
1.使用Scikit-Learn裡提供的train_test_split函式來分類
用法如下:

  • 先放入data,target
  • 設定test_size或是train_size(只要其中一個就好)
    • 如果值為小數,代表比例。
    • 如果值為整數,代表數量。
  • random_state就是該組隨機數的編號,如果填一個非零的整數 ,則在需要重複試驗的時候,保證得到一組一樣的隨機數。但填0或不填,每次呼叫產生出來的結果都會不一樣。
1
2
3
4
5
6
7
8
9
10
11
12
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

x = data
y = target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)

cls = GradientBoostingClassifier()
cls.fit(x_train, y_train)

prediction = cls.predict(x_test)
print(accuracy_score(y_test, prediction))

2.運用list的概念,自己手動分。

1
2
3
4
5
6
7
8
9
from sklearn.metrics import accuracy_score

leng = len(data)

cls = GradientBoostingClassifier()
cls.fit(data[:int(leng*0.8)], target[:int(leng*0.8)])

prediction = cls.predict(data[int(leng*0.8):])
print(accuracy_score(target[int(leng*0.8):], prediction))

我個人是比較喜歡第一種方法,因為第一種比較直觀,還能隨機取樣,而第二種就是固定取list的前80%當作訓練資料,剩下的用來測試。

Fit

這個函式會將要訓練的資料放進classifier並訓練。假設我們令一變數cls等於GradientBoostingClassifier,而且要投入訓練的資料集dataTrain和訓練的特徵集targetTrain讓機器學習辨識,則我們可以這樣寫。

1
2
cls = GradientBoostingClassifier()
cls.fit(x_train), y_train)

Predict

這個函式會將測試的資料集dataTest丟入來預測出targetTest,我們可以用targetTest和原本的target比對,來了解機器學習後的準確率。

1
y_test = cls.predict(x_test)

這裡有一些classifier可以使用

GradientBoostingClassifier()

1
from sklearn.ensemble import GradientBoostingClassifier

RandomForestClassifier()
使用前,需要先引用sklearn的ensemble。

1
from sklearn.ensemble import RandomForestClassifier

Metrics

metrics這個函式庫主要是用來評估運算出來的資料實際資料 的誤差,要使用的話需要先引用sklearn。

1
from sklearn import metrics

Accuracy Score

這個函式會比較預測結果和實際結果,來算出準確率。

  • 前兩項分別放實際結果、預測結果(順序也可調換)
  • 第三項為normalize,可以決定要輸出準確率,還是預測正確的樣本數(預設為True)。
    • True輸出準確率,False預測正確的樣本數。

如果要使用這個函式的話,需要先從sklearn的metrics引入。

1
2
from sklearn import metrics
print(metrics.accuracy_score(y_test, prediction))

或是

1
2
from sklearn.metrics import accuracy_score
print(accuracy_score(y_test, prediction))

Confusion Matrix

這邊舉一個例子,令y_true = [0, 1, 2, 2, 2]和y_pred = [0, 0, 2, 2, 1]。

  • 綠色豎行放的是預測的類別
  • 橘色橫行放的是正確的類別
  • x座標對應到實際資料、y座標對應到預測資料

根據上面的規則,繪製成如下圖:


如果要使用這個函式的話,需要先從sklearn的metrics引入。

1
2
from sklearn import metrics
print(metrics.classification_report(true, prediction))

或是

1
2
from sklearn.metrics import classification_report
print(classification_report(true, prediction))

Classification Report


名詞解釋:
support:某個類別在測試資料中占了多少樣本
precision:某個類別的準確率
recall:某個類別的召回率
f1-score:某個類別的F-score,F-score的計算方式如下:

micro avg:比對所有類別的test和prediction來計算出準確率
macro avg:每個類別加總後平均
weighted avg:每個類別乘上加權(也就是上面提到的support)後平均

這邊以上面介紹Confusion Matrix所舉的例子加以延伸

1
2
3
4
5
6
7
8
9
10
print(classification_report(y_true, y_pred, target_names=target_names))
precision recall f1-score support

class 0 0.50 1.00 0.67 1
class 1 0.00 0.00 0.00 1
class 2 1.00 0.67 0.80 3

micro avg 0.60 0.60 0.60 5
macro avg 0.50 0.56 0.49 5
weighted avg 0.70 0.60 0.61 5

計算小撇步:
precision:分子就是藍色區域的數字、分母就是該類別橫行所有的數量加總
recall:分子就是藍色區域的數字、分母就是該類別豎行所有的數量加總
support:代表y_true的某個類別有多少筆資料
f1-score = (2 * recall * precision) / (recall + precision)

如果要使用這個函式的話,需要先從sklearn的metrics引入。

1
2
from sklearn import metrics
print(metrics.classification_report(true, prediction))

或是

1
2
from sklearn.metrics import classification_report
print(classification_report(true, prediction))

參考資料:
1.读懂 sklearn 的 classification_report

封面圖源:Pixiv