1. 程式人生 > >利用sklearn實現多分類demo

利用sklearn實現多分類demo

常見的文字分類中,二分類問題居多,多分類問題其實也挺常見的,這裡簡單給出一個多分類的實驗demo。

1 引入相應的庫

# 引入必要的庫
import numpy as np
import matplotlib.pyplot as plt
from itertools import cycle
from sklearn import svm, datasets
from sklearn.metrics import roc_curve, auc
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import
label_binarize from sklearn.multiclass import OneVsRestClassifier from scipy import interp % matplotlib inline

2 載入資料及資料格式轉化

實驗資料直接使用sklearn中的鳶尾花(iris)資料

(1) 載入資料
iris = datasets.load_iris()
X = iris.data
y = iris.target

(2) 標籤二值化

# 檢視原來標籤資料格式
print(y.shape)
print(y)
# 標籤轉化
y = label_binarize(y, classes=[0
, 1, 2]) print(y[:3])
(150,)
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]
[[1 0 0]
 [1 0 0]
 [1 0 0]]

轉化示意圖
標籤轉化

(3)劃分訓練集和測試集

# 設定種類
n_classes = y.shape[1]

# 訓練模型並預測
random_state = np.random.RandomState(0)
n_samples, n_features = X.shape
# 隨機化資料,並劃分訓練資料和測試資料
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5,random_state=0)

3 訓練模型

# Learn to predict each class against the other
model = OneVsRestClassifier(svm.SVC(kernel='linear', probability=True,random_state=random_state))
clt = model.fit(X_train, y_train)

4 效能評估

(1)分別在訓練集和測試集上檢視得分

在訓練集上檢視分類得分

clt.score(X_train, y_train)
0.8133333333333334

在測試集上檢視得分

clt.score(X_test,y_test)
0.6533333333333333

(2)檢視預測的各類別情況

①利用SVM的方法decision_function給每個樣本中的每個類一個評分

y_preds_scores=clt.decision_function(X_test)
y_preds_scores[:5]
array([[-3.58459897, -0.3117717 ,  1.78242707],
       [-2.15411929,  1.11394949, -2.393737  ],
       [ 1.89199335, -3.89592195, -6.29685764],
       [-4.52609987, -0.63396965,  1.96065819],
       [ 1.39684192, -1.77722963, -6.26300472]])

根據評分將其轉化為原始標籤格式

np.argmax(clt.decision_function(X_test), axis=1)[:5]
array([2, 1, 0, 2, 0])

②利用predict_proba檢視每一類的預測概率

clt.predict_proba(X_test)[:4]
array([[3.80289117e-03, 4.01872348e-01, 9.31103883e-01],
       [4.57780355e-02, 7.88455913e-01, 3.39207219e-02],
       [9.81843900e-01, 8.97766449e-03, 1.27447369e-04],
       [7.34898836e-04, 3.12667406e-01, 9.45766977e-01]])
np.argmax(clt.predict_proba(X_test),axis=1)[:5]
array([2, 1, 0, 2, 0])

參考