iT邦幫忙

0

Jupyter Notebook 輸入欄位設計(1)

  • 分享至 

  • xImage
  •  

前言

撰寫機器學習/深度學習相關程式時,我們常要調整超參數(Hyperparameters),觀察模型的準確度或其他效能指標的變化,如果能設計各式輸入欄位,就很容易說明 what-if 或將程式提供他人使用。

讓我們搞定它吧

ipywidgets套件提供我們在 Jupyter Notebook 內設計各式輸入欄位,安裝指令如下:

pip install ipywidgets

之後啟動 Jupyter Notebook 確定是否安裝成功:
https://ithelp.ithome.com.tw/upload/images/20220122/20001976Z3UYfNcJMk.png

如果未現該擴充程式,執行以下指令,並確定有打勾:
jupyter nbextension enable --py widgetsnbextension

測試

  1. 本篇先介紹 interact 函數的用法。
# 載入套件
from ipywidgets import interact

# 定義一個簡單函數
def f(x):
    return x
    
# 呼叫 interact 函數,如 x 為整數則輸入欄位為一拉桿(slider)
interact(f, x=10)    

執行結果如下,拖曳拉桿,可改變輸入值:
https://ithelp.ithome.com.tw/upload/images/20220122/20001976oc9PlbqcqP.png

  1. 產生其他類型的輸入欄位。
# 如 x 為boolean則輸入欄位為 checkbox
interact(f, x=True)
# 如 x 為字串則輸入欄位為文字框
interact(f, x='')
# 如 x 為list則輸入欄位為下拉式欄位
interact(f, x=[1,2,3])

interact 會視 x 參數資料型態產生各式輸入欄位。

  1. 直接使用裝飾器(Decorator),不須呼叫interact函數。也可以同時可設定多個欄位。
# 使用裝飾器(Decorator)
@interact(x=20, y=1.0)
def g(x, y):
    return x + y

應用

雖然在畫面上可以看到我們輸入值,但沒辦法在下面的程式碼抓到它,筆者一度腦筋打結,後來google一下,才了解必須要在函數中使用輸入值,以下介紹兩種應用。

  1. 篩選資料:指定鳶尾花(Iris)類別,篩選 Pandas Data Frame。
# 篩選資料
import pandas as pd
import numpy as np
from sklearn import datasets

@interact(x=[0,1,2])
def f(x):
    # 載入鳶尾花資料
    ds = datasets.load_iris()
    df=pd.DataFrame(ds.data, columns=ds.feature_names)
    df['y'] = ds.target
    
    # 依據輸入值篩選資料
    return df.query(f'y == {x}')

執行結果如下,改變輸入值可篩選資料:
https://ithelp.ithome.com.tw/upload/images/20220122/200019762GHLgP7Tsg.png

  1. 參數調校(tuning):以下利用 interact 指定參數值,進行參數調校,函數會傳回準確度。
import pandas as pd
import numpy as np
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

@interact(x=(3,11))
def f(x):
    # 載入鳶尾花資料
    ds = datasets.load_iris()
    X=pd.DataFrame(ds.data, columns=ds.feature_names)
    y=ds.target

    # 切割訓練及測試資料
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = .2)

    # KNN 模型的 n_neighbors 參數調校
    clf = KNeighborsClassifier(n_neighbors = x)
    clf.fit(X_train, y_train)
    return f'score={clf.score(X_test, y_test)}'

https://ithelp.ithome.com.tw/upload/images/20220122/20001976OvYNyszgYT.png

結語

夠簡單吧? 美中不足的是,沒辦法在函數外抓到輸入值,還好有人解決這個問題,請待下回分解。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言