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中

Scikit-learn的Estimator API
設計原則
- 一致性
- 所有的物件共享一個共同的介面連接一組方法及統一的文件
- 可觀察性
- 所有指定的參數值皆被當作公用的屬性
- 限制物件的層級
- 演算法被以python類別表示
- 資料集被用標準的格式表示(Numpy陣列、Pandas DataFrame)
- 參數名稱使用標準的python字串
- 合成的
- Scikit-learn盡可能將機器學習的工作表示成一系列更基本的演算法
- 合理的預設值
- 當模型需要使用者指定參數時,scikit-learn會自訂一個適當的預設值
使用步驟
- 透過Scikit-learn匯入適當的Estimator,選擇模型的種類
- 用合適的資料值對模型進行實例化,以選擇模型的超參數(hyperparameters)
- 將資料安排至特徵矩陣及目標向量
- 呼叫模型實例的**fit()**方法對資料進行擬合
- 套用模型至新資料
- 監督式學習
- 通常使用predict()方法預測未知資料的標籤
- 非監督式學習
- 通常使用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")

- 非監督式學習 → 降維
- 在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);
資料分群圖 - 在64維度的空間視覺化資料點太困難,因此使用非監督式學習將維度降低為2
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()

#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 → 控制隨機數的生成

實作- SVM
SVM(Support Vector Machine, 支持向量機)
<aside> 🍔 SVM是一種監督式學習的方法,可用來找到一個完美的邊界將不同類別分隔
</aside>
- 線性SVM
- 原始資料集
- 利用傳統分類器找出可能的分類線(此資料有三條)
- 利用線性SVM找出最佳分類線(最大化邊界)
- 此三條線的邊界
- 最佳分類線
- 此三條線的邊界
- 原始資料集
- 線性SVM無法解決的問題
- 原始資料集
- 解決辦法
- 非線性SVM → kernel SVM
- 以另一種角度觀察資料集
- kernel SVM作法 <aside> 🥊 將資料集從原始維度投影到高維度的空間,並以**超平面(hyperplane)**的方式將資料集分隔 </aside>
- 以kernel SVM分隔出的資料集
- 以另一種角度觀察資料集
- 非線性SVM → kernel SVM
- 原始資料集
Colab實作連結
遇到的問題
module 'XXX' has no attribute 'XXX'
python -m pip install -U XXX