Share This Post

Scikit-learn是什麼?

<aside> ❓ Scikit-learn是一個基於Numpy及Scipy的python開放原始碼的機器學習套件

</aside>

特色

  • 一致性
    • 了解其中一個模型的使用方法及語法,就可以輕鬆的切換到其他的模型
  • 簡潔性
  • 最新的API

Scikit-learn中的資料表示法

<aside> 💭 將資料當成表格,資料列代表樣本 (sample),欄位代表特徵(feature)

</aside>

  • 特徵矩陣(feature matrix)
    • 通常被存於X變數中
    • 形狀為 [n_samples, n_features] 的二維陣列
      • sample(列)
      • feature(欄)
    • 大部分被放在Numpy陣列或Pandas DataFrame中
  • 目標陣列(target vector)
    • 通常是我們要從資料去預測的值
    • 通常稱為y
    • 長度為n_samples的一維陣列
    • 通常被放在Numpy陣列或Pandas Series中
Untitled

Scikit-learn的Estimator API

設計原則

  • 一致性
    • 所有的物件共享一個共同的介面連接一組方法及統一的文件
  • 可觀察性
    • 所有指定的參數值皆被當作公用的屬性
  • 限制物件的層級
    • 演算法被以python類別表示
    • 資料集被用標準的格式表示(Numpy陣列、Pandas DataFrame)
    • 參數名稱使用標準的python字串
  • 合成的
    • Scikit-learn盡可能將機器學習的工作表示成一系列更基本的演算法
  • 合理的預設值
    • 當模型需要使用者指定參數時,scikit-learn會自訂一個適當的預設值

使用步驟

  1. 透過Scikit-learn匯入適當的Estimator,選擇模型的種類
  2. 用合適的資料值對模型進行實例化,以選擇模型的超參數(hyperparameters)
  3. 將資料安排至特徵矩陣及目標向量
  4. 呼叫模型實例的**fit()**方法對資料進行擬合
  5. 套用模型至新資料
    1. 監督式學習
      1. 通常使用predict()方法預測未知資料的標籤
    2. 非監督式學習
      1. 通常使用transform()或predict()方法,轉換或推理出資料的特性

實作 – 手寫字元分類

Isomap(等距特徵映射)

<aside> 🧵 Isomap是一個非線性的降維方法

</aside>

  • 下載資料集 %pip install -U scikit-learn %pip install matplotlib # import 一組已處理過的字元集 from sklearn.datasets import load_digits digits = load_digits() digits.images.shape import matplotlib.pyplot as plt fig, axes = plt.subplots(10,10, figsize =(8,8), subplot_kw = {"xticks":[], "yticks":[]},) for i, ax in enumerate(axes.flat): ax.imshow(digits.images[i], cmap="binary", interpolation = "nearest") ax.text(0.05, 0.05, str(digits.target[i]),transform = ax.transAxes, color = "green")
Untitled
  • 非監督式學習 → 降維
    • 在64維度的空間視覺化資料點太困難,因此使用非監督式學習將維度降低為2
      • 使用I**somap,一種流行學習(manifold learning)**演算法
      from sklearn.manifold import Isomap iso = Isomap(n_components = 2) iso.fit(digits.data) data_projected = iso.transform(digits.data) data_projected.shape
    plt.scatter(data_projected[:, 0], data_projected[:, 1], c=digits.target, edgecolor='none', alpha=0.5, cmap=plt.cm.get_cmap('spectral', 10)) plt.colorbar(label='digit label', ticks=range(10)) plt.clim(-0.5, 9.5); 資料分群圖 Untitled

T-SNE(t-隨機鄰近嵌入法)

<aside> 💭 T-SNE 是一種非線性的機器學習降維法

</aside>

import numpy as np
import matplotlib.pyplot as plt
from sklearn import manifold, datasets
#Prepare the data
digits = datasets.load_digits(n_class=6)
X, y = digits.data, digits.target
n_samples, n_features = X.shape
n = 20  
img = np.zeros((10 * n, 10 * n))
for i in range(n):
    ix = 10 * i + 1
    for j in range(n):
        iy = 10 * j + 1
        img[ix:ix + 8, iy:iy + 8] = X[i * n + j].reshape((8, 8))
plt.figure(figsize=(8, 8))
plt.imshow(img, cmap=plt.cm.binary)
plt.xticks([])
plt.yticks([])
plt.show()
Untitled
#t-SNE
X_tsne = manifold.TSNE(n_components=2, init='random', random_state=5, verbose=1).fit_transform(X)

# 資料視覺化
x_min, x_max = X_tsne.min(0), X_tsne.max(0)
X_norm = (X_tsne - x_min) / (x_max - x_min)  # 正規化
plt.figure(figsize=(8, 8))
for i in range(X_norm.shape[0]):
    plt.text(X_norm[i, 0], X_norm[i, 1], str(y[i]), color=plt.cm.Set1(y[i]), 
             fontdict={'weight': 'bold', 'size': 9})
plt.xticks([])
plt.yticks([])
plt.show()
  • TSNE()函數內的重要參數
    • n_components → 要降低成多少維度
    • perplexity → 資料量越大,perplexity就越大,預設為30,建議值為5~50
    • n_iter → 欲迭代的次數,預設為1000
    • verbose → 是否要看訓練過程
    • random_state → 控制隨機數的生成
Untitled

實作- SVM

SVM(Support Vector Machine, 支持向量機)

<aside> 🍔 SVM是一種監督式學習的方法,可用來找到一個完美的邊界將不同類別分隔

</aside>

  • 線性SVM
    • 原始資料集 Untitled
    • 利用傳統分類器找出可能的分類線(此資料有三條) Untitled
    • 利用線性SVM找出最佳分類線(最大化邊界
      • 此三條線的邊界 Untitled
      • 最佳分類線 Untitled
  • 線性SVM無法解決的問題
    • 原始資料集 Untitled
    • 解決辦法
      • 非線性SVM → kernel SVM
        • 以另一種角度觀察資料集 Untitled
        • kernel SVM作法 <aside> 🥊 將資料集從原始維度投影到高維度的空間,並以**超平面(hyperplane)**的方式將資料集分隔 </aside> Untitled
        • 以kernel SVM分隔出的資料集
        Untitled

Colab實作連結

Google Colaboratory

遇到的問題

module 'XXX' has no attribute 'XXX'
python -m pip install -U XXX

[資料分析&機器學習] 第3.4講:支援向量機(Support Vector Machine)介紹

PythonDataScienceHandbook/05.07-Support-Vector-Machines.ipynb at master · jakevdp/PythonDataScienceHandbook

訂閱研究文章

Get updates and learn from the best

More To Explore

Scroll to Top

hurry up !

軟體工程師培訓

限時免費報名中

藉由與「真實世界軟體專案」相同的技術、工具與開發流程,化簡成與商業機密無關、門檻較低更容易上手的「模擬專案」,讓你有機會在職場前輩的陪伴下,完成真槍實彈的練習,動手解決真實的問題,快速累積個人的經驗與作品,而不只是「學習技術」而已。