sklearn 多分類任務與多標籤分類任務的計算



```python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Feb 12 16:11:26 2018

@author: zhangll
"""
from sklearn import svm
import matplotlib.pyplot as plt #

from sklearn import datasets # 數據源類(裏面包含各種可用的數據類)
import numpy as np # numpy 包與scikitlearning包緊密聯繫在一起,因爲所有數據的存儲結構一般是以numpy array類型存儲的
from sklearn.svm import SVC # 這個是svm算法中的svc評估(estimator)器
from sklearn.multiclass import OneVsRestClassifier # 這個一般可用於多分類模型訓練,顧名思義:一個分類vs剩餘的其他分類分類器

#加載sklean包中的所有數據源存儲在datasets中,我們加載0-9數字組成的訓練樣本集合

digits = datasets.load_digits()
#一般而言 可以用datasets.load_數據樣本名()獲取你想要的數據集合,比如常用的鳶尾花數據集合的加載 datasets.load_iris()
#獲取的每一種數據集合都會以字典dict(key,value)的形式存儲
#比如:圖像digits格式是以{data:..;images:..;target:..;target_names:..;descr:..}
#由五個key:value組成,所以顧明思議,data就是存儲圖片數據的,格式是(1797,64)也就是1797個樣本,64維度(變量)的值
# images存儲的shape大小爲1797,8,8,它是以8*8的矩陣形式存儲的64維data
# target 就是標籤數據,shape大小爲(1979,1),就是對一個的每個樣本所屬的類別
# target_names就是set(target),
# descr 就是對這個集合的描述,我們做一下訓練需要用到data,target以及畫圖的時候需要用到image
# multiclass (多分類器(y只有一維))vs multilabel(多標籤分類器) fitting

#本文的分類目標就是對1797個樣本中的前1796個樣本與target作爲訓練樣本,然後對最後一個樣本做評估
# 1. multiclass (用到是是target),代碼很簡單因爲sklearn做了很多的封裝處理

#a)X代表前1796具有(64,1)維度的矩陣 Y代表對應的標籤(1796,1)
X = digits.data[:-1]
Y = digits.target[:-1]
#b) OneVsRestClassifier內部聚合了svc評估器,OneVsRestClassifier內部封裝了fit,predict等等方法
multiC = OneVsRestClassifier(estimator=SVC(random_state=0))
#c.1) fit代表喂x,y數據,返回的是OneVsRestClassifier類對象,然後對這個評估器類做預測(輸入數據),返回的是一個array([])對象
# 在sklearn包中爲了開發方便,沿用了pipline工作方式,也就是每個評估器,fit器都會返回評估器類,因此可以寫成如下格式
predict1 = multiC.fit(X,Y).predict(digits.data[-1:])
#predict1 存儲的是預測的結果[3]

#c.2).multilabel (需要對target做個變換,變換成具有位置信息的指示向量)
# 標籤數據可以簡單分成2種類型的y,[1.單分類標籤 2.多分類標籤

# 先介紹 單分類標籤,這裏指的是每個圖像樣本對應的分類具有且只有一種標籤
# 這裏的含義是對原先的一維的標籤target做個指示變量的變換,在統計術語上就是對數做Dummy Variables(啞變量)轉換,
# 是屬於"預處理"模塊中的
# 所以需要調取sklearn預處理模塊(正在進行時)中的binarizer器
from sklearn.preprocessing import LabelBinarizer as lbb
# y返回的類型是numpy.array類型
y = lbb().fit_transform(Y)

predict2 = multiC.fit(X,y).predict(digits.data[-1:])
#predict2 存儲的是預測的結果
%matplotlib inline
#d)畫個圖看看是不是自己想要的結果 最後畫出來的是一個類似與8的圖案
plt.matshow(digits.images[-1:][0])
```
output_0_1.png
```python
print(predict1);print(predict2)
```
[3]
[[0 0 0 0 0 0 0 0 0 0]]

```python
#多標籤分類器
from sklearn.preprocessing import MultiLabelBinarizer as mlb
ym = mlb().fit_transform(np.array([[x,y+1] for x,y in zip(Y,Y)]))
print(ym.shape)
print(y.shape)
#%who#在jupyter中的變量名,有包含類元素,也包含變量元素
ym[0]
```
(1796, 11)
(1796, 10)
No variables match your requested type.
array([1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0])

```python
# 多標籤分類器 如下
labely = [["e","b"],["b","c"],["c","d"],["e","f"],["a","i"]]
labely_mult = mlb().fit_transform(labely)
# 多分類標籤可以在多分類器中自動地進行指示向量的變換
# 變換的標準是以多分類標籤中的a元素對應的ascci碼的秩序作爲序列的先後標記
labely_mult

```
array([[0, 1, 0, 0, 1, 0, 0],
[0, 1, 1, 0, 0, 0, 0],
[0, 0, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 0],
[1, 0, 0, 0, 0, 0, 1]])

```python
type(y)
```
numpy.ndarray



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章