---
# System prepended metadata

title: AI Maker 案例教學 - 表格式資料機器學習：迴歸應用
tags: [' Draft', ' OneAI', 案例教學]

---

---
title: AI Maker 案例教學 - 表格式資料機器學習：迴歸應用
description: OneAI 文件
tags: 案例教學, OneAI, Draft
---
[OneAI 文件](/s/xKNcU3O5D)

# [202210]AI Maker 案例教學 - 表格式資料機器學習：迴歸應用

[TOC]

## 0. 前言
在監督式學習中，當預測的目標值為非連續數值 (亦即離散)，稱其為「**分類 (Classification)**」；若目標值為連續數值，則稱為「**迴歸 (Regression)**」。

| 分類 (Classification) | 迴歸 (Regression) |
| :------------------: | :--------------: |
| ![分類問題](https://docs.oneai.twcc.aihttps://docs.oneai.twcc.ai/uploads/GW1CwXh.png) | ![迴歸問題](https://docs.oneai.twcc.ai/uploads/EaZtiab.png) |
| 在分類問題中，找到一條能將不同類別資料分開的函數 | 在迴歸問題中，找到一條符合資料分佈的函數 |

在這份範例中，我們將使用「表格式資料」進行迴歸講解，從無到有逐步建立表格式資料機器學習的應用，其步驟如下：

1. [**準備資料集**](#1-準備資料集並上傳)  
    在此階段，我們會從 Kaggle 下載資料集，並上傳到指定位置，其中 Kaggle 是目前最大的資料科學競賽平台。
2. [**訓練模型**](#2-訓練分類任務模型)  
    在此階段，我們將配置相關訓練任務，以進行指定演算法的訓練與擬合，並將訓練好的模型儲存，以供推論服務使用。
3. [**建立推論服務**](#3-建立推論服務)  
    在此階段，我們將儲存下來的模型，建立該模型的 Web 服務，以執行推論。
4. [**[進階操作] 調整演算法的參數**](#4-進階操作-調整演算法的參數)
	在此階段，我們將學習當機器學習結果不符合預期時，如何進一步調整演算法參數。
	
本教學提供一個名為 **`ml-sklearn-regression`** 的範本，您只需上傳欲訓練的資料集、配置訓練所需的環境變數，即可進行訓練與驗證。

## 1. 準備資料集並上傳
### 1.1 資料格式說明
使用 **表格式資料 (tabular data)**，表格式資料是由欄 (Column) 與列 (Row) 所組成的二維資料，並以 **.csv** 作為副檔名，如下表所示。

sample_dataset.csv
|       | Column 1 | Column 2 | Column 3 | ... | Column 9 |
| ----- | -------- | -------- | -------- | --- | -------- |
| **Row 1** | A1       | B1       | C1       |     | I1       |
| **Row 2** | A2       | B2       | C2       |     | I2       |
| **Row 3** | A2       | B3       | C3       |     | I3       |
| **...**   |          |          |          |     |          |
| **Row 9** | A9       | B9       | C9       |     | I9       |

原始表格資料，需拆成 **特徵資料 (檔名：train_x.csv)** 與 **目標值資料 (檔名：train_y.csv)** 才能作為訓練模型的輸入。
- **特徵資料 (檔名：train_x.csv)**  
    為已知欄位資料，將用於預測目標值資料。
- **目標值資料 (檔名：train_y.csv，只有一欄資料)**  
    為真實的目標值資料，作為訓練和與預測做對照之用。

:::info
:bulb: **提示：分割資料的工具**
一般可以透過試算表軟體快速處理，例如 **Microsoft Excel**、[**Google Sheets**](https://docs.google.com/spreadsheets/)、**LibreOffice Calc** ... 等工具，藉由刪除欄位，再另存新檔，即可完成。
:::

### 1.2 準備資料
本教學使用 Kaggle 提供的公開資料集： **[房價資料 (house prices data)](https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data)** 作為講解範例。

#### 1.2.1 資料下載
從 **Data** 頁籤進入，可以看到 **train.csv** 和 **test.csv** (無目標值資料)，可各別下載。

![House Prices / Data](https://docs.oneai.twcc.ai/uploads/mafeaCR.png)

將頁面捲動到最下面，可以看到 **`Download All`** 按鈕，點擊此按鈕下載全部資料。

![](https://docs.oneai.twcc.ai/uploads/mNrekWp.png)

#### 1.2.2 資料拆解
以迴歸任務為例，無論是範例資料集或是自定義的資料集，在資料集中會包含兩大類資訊：
1. **特徵 (特徵資料)**：  
    如住宅類型、建造年份、屋頂類型、地下室狀況、街道類型... 等資訊。
2. **迴歸結果 (目標值資料)**：  
    如房屋銷售價格 **SalePrice**。

請依照下列步驟重新分割資料集，並將資料集轉換成訓練模型所能接收的格式：
- **train.csv (有 1460 筆資料，共 81 個欄位)**  
    最後一欄位 **SalePrice** 為要預測的目標變量。我們將 train.csv 拆成：  
    - train_x.csv (不含 SalePrice 欄位)
    - train_y.csv (只有 SalePrice 欄位)
- **test.csv (有 1459 筆資料，共 80 個欄位)**  
    因 test.csv 不含目標值資料，我們將 test.csv 重新命名為 test_x.csv。此範例無 test_y.csv。

最終的資料檔案如下所示：
|               | 特徵         | 迴歸結果     |
| ------------- | ----------- | ----------- |
|train.csv | train_x.csv | train_y.csv |
| test.csv  | test_x.csv  | - |

隨後準備上傳 train_x.csv、train_y.csv 這兩個檔案。

最後，我們會使用本地端的測試集 **test_x.csv** 作為測試，並將預測結果 **test_y.csv** 上傳到 Kaggle 平台比對，Kaggle 平台將使用 **RMSE（Root-Mean-Squared-Error，均方根誤差）** 評價指標來評分迴歸結果。

![HousePrices-Evaluation](https://docs.oneai.twcc.ai/uploads/a02bNIa.png)

#### 1.2.3 欄位說明

欄位說明可參考：
- [**線上說明**](https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data) (只有欄位說明)
- 下載的檔案 data_description.txt，內有：
    - 各欄位說明
    - 類別欄位中的代碼所對應的意義

#### 1.2.4 資料內容 (示範)

[![](https://docs.oneai.twcc.ai/uploads/QmGfSMv.png)](https://docs.oneai.twcc.ai/uploads/QmGfSMv.png)

### 1.3 建立儲存體
資料備妥後，即可前往「**儲存服務**」服務進行上傳資料集。
1. **進入「**儲存服務**」服務**
	從 OneAI 服務列表選擇「**儲存服務**」，進入儲存服務管理頁面。

2. **建立儲存體**  
    接著點擊「**+建立**」，新增一個名為 **`house-prices`** 的儲存體，此儲存體會用來存放訓練用的資料集。

    ![](https://docs.oneai.twcc.ai/uploads/upload_f96ad13967a6e88b7cbdf2b1a008d2e1.png)
    
3. **檢視儲存體**
    完成儲存體的建立後，重新回到儲存服務管理頁面，此時會看到新增的儲存體已建立完成，點擊建立好的儲存體 **`penguin`**，準備上傳資料集。
    
    ![](https://docs.oneai.twcc.ai/uploads/upload_476363b73fa72e3a4ac66a85d3edbcef.png)

### 1.4 上傳資料集
完成儲存體的建立後，即可以開始上傳房價資料集 train_x.csv、train_y.csv 兩個檔案，上傳完成後結果如下：

    ![](https://docs.oneai.twcc.ai/uploads/xrt3QuE.png)

## 2. 訓練迴歸任務模型
完成 [**資料集的上傳**](#1-準備資料集並上傳) 後，就可以使用這些資料來訓練與擬合我們的分類任務模型。

### 2.1 建立訓練任務
從 OneAI 服務列表選擇「**AI Maker**」，再點擊「**訓練任務**」，進入訓練任務管理頁面後，切換至「**一般訓練任務**」頁籤，接著點擊「**+建立**」，新增一個訓練任務。

![](https://docs.oneai.twcc.ai/uploads/upload_f26b3ed06845df8740f3c9dc9c6f037a.png)

建立訓練任務可分成五個步驟，詳細的建立說明請參考 [**AI Maker 使用手冊**](/s/QFn7N5R-H)。

#### 2.1.1  基本資訊
第一步是基本資訊的設定，依序輸入名稱、描述、選擇方法，並選擇 **`ml-sklearn-regression`** 範本，此範本會自動帶出公用映像檔 **`ml-sklearn:v1`** 以及後續步驟的各項參數設定。

![](https://docs.oneai.twcc.ai/uploads/upload_75b0a65e05f88a80aca84aa3fbcf3044.png)

:::info
:bulb: **提示：範本功能**
AI Maker 提供的範本功能，定義了各階段任務所使用的預設參數與設定。透過範本功能，可以快速套用各項任務所需使用的參數或設定，為機器學習的工作流程與訓練環境提供了便利性。
:::

#### 2.1.2 硬體設定
此範例所使用的機器學習演算法，可使用 CPU 或 GPU 運算資源，請依目前的可用配額與運算需求，從列表中挑選出合適的硬體資源。
    
#### 2.1.3 儲存設定
此步驟需掛載之前上傳資料集的儲存體 **`house-price`**。

![](https://docs.oneai.twcc.ai/uploads/upload_06f31d5b120dc7d06d2f119851591cc0.png)

#### 2.1.4 變數設定
接下來進行環境變數及命令的設定，若是在填寫基本資訊，選擇套用 **`ml-sklearn-regression`** 範本，下列變數及設定值會自動帶入，各參數說明如下，可依照需求自行調整。

![](https://docs.oneai.twcc.ai/uploads/upload_c294649ac362e1f85c44c5ed45733b0a.png)

|參數|預設值|介紹|
|---|-----|---|
| [DEBUG](#DEBUG) | `false` | 是否啟用更多的日誌 (log)，以便於檢視機器學習在執行中的細節。若要啟用，將值設為 `true`；反之，則將此值設為 `false`。 |
| [TASK](#TASK) <sup style="color:red"><b>*</b></sup> | `regression` | 機器學習要處理的任務類型。當機器學習要處理的問題為 **分類問題** 時，將值設為 **`classification`**；若是 **迴歸問題** ，則將此值設為 **`regression`**。<br>|
| INPUT_TRAIN_X_FILE_NAME | `train_x.csv` | 要訓練用的特徵資料之檔名。 |
| INPUT_TRAIN_Y_FILE_NAME | `train_y.csv` | 要訓練用的迴歸結果之檔名。 |
| <span style="white-space: nowrap">[INPUT_CSV_WITH_HEADER](#INPUT_CSV_WITH_HEADER) <sup style="color:red"><b>*</b></sup></span> | `true` | 要訓練的資料集是否有欄位名稱，若有欄位名稱，將值設為 `true`；反之，則將此值設為 `false`。 |
| [MODEL_ALGORITHM](#MODEL_ALGORITHM) <sup style="color:red"><b>*</b></sup> | `RandomForest` | 機器學習所使用的演算法。 |
| [MODEL_METRICS](#MODEL_METRICS) | `r2, mse, rmse` | 用於評估迴歸模型的多項指標，列舉時請使用 `,`(逗號) 隔開，目前僅限於日誌輸出。 |

<sup style="color:red"><b>\*</b></sup> 一般情況下，使用機器學習需注意的參數有 **TASK**、**INPUT_CSV_WITH_HEADER** 及 **MODEL_ALGORITHM**，更多的參數細節，詳述如下：

- #### DEBUG  
    是否啟用更多的日誌 (log)，以便於檢視機器學習在執行中的細節，包括：檔案的輸出入資訊、資料表格的欄位資訊與頭尾資料、資料表格使用記憶體多寡的資訊、特徵處理過程、模型的多個評價指標。
    | 值 | 說明      |
    | -- | -------- |
    | `true`<br>`1` | 啟用更多日誌 (建議使用) |
    | 其餘的值 | 關閉日誌 |

- #### TASK  
    機器學習要處理的任務類型。
    | 值 | 說明      |
    | -- | -------- |
    | `regression`     | 機器學習將使用 **迴歸** 的演算法，參見 [**`MODEL_ALGORITHM`**](#MODEL_ALGORITHM) 說明 |
    | `classification` | 機器學習將使用 **分類** 的演算法，參見 [**`MODEL_ALGORITHM`**](#MODEL_ALGORITHM) 說明 |

- #### INPUT_CSV_WITH_HEADER  
    要訓練的資料集是否有欄位名稱。
    | 值 | 說明      |
    | -- | -------- |
    | `true`<br>`1` | 表示 csv 檔裡，首列(第一列)為欄位名稱 |
    | 其餘的值 | 表示 csv 檔裡，首列沒有欄位名稱，直接就是數據 |

- #### MODEL_ALGORITHM  
    機器學習使用的演算法。
    | 值 | 支援分類 | 支援迴歸 | 補充說明<br>詳細說明見表格下方說明 |
    | --------------------- |:--------:|:--------:| -------- |
    | `Auto`                | ✔ | ✔ | 自動化機器學習 (Auto-ML)，能自動 **挑選演算法** 與 **調校超參數** |
    | `AutoGluon`           | ✔ | ✔ | 一種 AutoML 工具，可支援 CPU & GPU |
    | `AutoSklearn`         | ✔ | ✔ | 一種 AutoML 工具，不支援 GPU，但仍可以在 GPU 環境下執行 |
    | `AdaBoost`           | ✔ | ✔ | 自適應增強 |
    | `ExtraTree`          | ✔ | ✔ | 極限隨機樹 |
    | `DecisionTree`       | ✔ | ✔ | 決策樹 |
    | <span style="white-space: nowrap">`GradientBoosting`</span>   | ✔ | ✔ | 梯度提升 |
    | `KNeighbors`          | ✔ | ✔ | k 個最近的鄰居 |
    | `LightGBM`            | ✔ | ✔ | 高效的梯度提升決策樹 |
    | <span style="white-space: nowrap">`LinearRegression`</span>   | ✘ | ✔ | 線性迴歸 |
    | <span style="white-space: nowrap">`LogisticRegression`</span> | ✔ | ✘ | 羅吉斯迴歸/邏輯斯迴歸 |
    | `RandomForest`       | ✔ | ✔ | 隨機森林 |
    | `SGD`                 | ✔ | ✔ | 隨機梯度下降法 |
    | `SVM`                 | ✔ | ✔ | 支援向量機 |
    | `XGBoost`             | ✔ | ✔ | 極限梯度提升 |

    :::spoiler **值設為 `Auto` 時的作用**
    當機器學習演算法設為`Auto`時，`ml-sklearn` 映像檔所提供的程式會根據當前的硬體資源有無 GPU 來做選擇：
    - 若硬體資源有含 GPU 時，會採用 [`AutoGluon`](https://auto.gluon.ai/stable/tutorials/tabular_prediction/index.html) 這一套 AutoML 工具；
    - 反之，若硬體資源不含 GPU 時，也就是只有 CPU 情況下，則會採用 [`AutoSklearn`](https://automl.github.io/auto-sklearn/master/index.html) 這一套 AutoML 工具。
    - 在使用上，使用者亦可以自行抉擇要使用[`AutoGluon`](https://auto.gluon.ai/stable/tutorials/tabular_prediction/index.html)或是[`AutoSklearn`](https://automl.github.io/auto-sklearn/master/index.html)。<br><br>
    :::

    :::spoiler **值設為 `AutoGluon` 時的作用**
    - `ml-sklearn` 映像檔所提供的程式會直接採用 `AutoGluon` 這一套 AutoML 工具。
    - `AutoGluon` 在訓練時，預設會將底下的機器學習演算法整合在一起，並產生一個更強大的模型。
        | 演算法名稱 | 支援GPU | 文件 |
        | -------- | ------ | ---- |
        | CatBoost       | ✔ | [查看](https://catboost.ai/) |
        | ExtraTrees     |   | [查看](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.ExtraTreesClassifier.html) |
        | KNeightbors    |   | [查看](https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html) |
        | LightGBM       |   | [查看](https://lightgbm.readthedocs.io/en/latest/) |
        | NeuralNetFast  | ✔ | [查看](https://docs.fast.ai/tabular.models.html) |
        | NeuralNetTorch | ✔ | - |
        | RandomForest   |   | [查看](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html) |
        | XGBoost        | ✔ | [查看](https://xgboost.readthedocs.io/en/latest/) |
    - `AutoGluon` 預設會啟用 GPU 模式。在 GPU 環境下，若演算法有支援 GPU，則會採用 GPU 加速；若不支援 GPU，則使用 CPU 進行運算。若使用者在沒有 GPU 環境下選擇 `AutoGluon`，則會採用 CPU 模式。
    - 更多詳細的介紹可參考[官方文件](https://auto.gluon.ai/stable/tutorials/tabular_prediction/index.html)。<br>
    :::

    :::spoiler **值設為 `AutoSklearn` 時的作用**
    - `ml-sklearn` 映像檔所提供的程式會直接採用 `AutoSklearn` 這一套 AutoML 工具。
    - `AutoSklearn` 不支援 GPU，但該工具亦可以在 GPU 環境下執行，只是不會使用到 GPU 資源。
    - 更多詳細的介紹可參考[官方文件](https://automl.github.io/auto-sklearn/master/index.html)。 
    :::

    :::spoiler **更多其他機器學習演算法**
    <span id="footnote_experimental_algorithm_class_list"></span>若使用的機器學習演算法並未出現在上述清單，使用者可從下面清單選取。底下列舉迴歸模型演算法所能使用的全部**值**(按字母順序排序)：
    - `AdaBoostRegressor`
    - `ARDRegression`
    - `AutoGluonRegressor`
    - `AutoSklearnRegressor`
    - `BaggingRegressor`
    - `BayesianRidge`
    - `DecisionTreeRegressor`
    - `DummyRegressor`
    - `ExtraTreeRegressor`
    - `ExtraTreesRegressor`
    - `GammaRegressor`
    - `GaussianProcessRegressor`
    - `GradientBoostingRegressor`
    - `HuberRegressor`
    - `KernelRidge`
    - `KNeighborsRegressor`
    - `LGBMRegressor`
    - `LinearRegression`
    - `LinearSVR`
    - `MLPRegressor`
    - `NuSVR`
    - `PassiveAggressiveRegressor`
    - `PoissonRegressor`
    - `RadiusNeighborsRegressor`
    - `RandomForestRegressor`
    - `RANSACRegressor`
    - `Ridge`
    - `RidgeCV`
    - `SGDRegressor`
    - `SVR`
    - `TheilSenRegressor`
    - `TransformedTargetRegressor`
    - `TweedieRegressor`
    - `XGBRegressor`
    :::

- #### MODEL_METRICS
    用於評估迴歸模型的多項指標，列舉時請使用 `,`(逗號) 隔開，目前僅限於日誌輸出。若沒有定義此項環境變數，預設評估指標會使用 `r2`。
    
    設定範例：
    - `r2`
    - `rmse`
    - `r2, rmse, mse`
    
    <br>
    
    | 值 | 說明      |
    | -- | -------- |
    | `r2` | [使用說明](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.r2_score.html) |
    | `explained_variance` | [使用說明](https://scikit-learn.org/stable/modules/model_evaluation.html#explained-variance-score) |
    | `max_error` | [使用說明](https://scikit-learn.org/stable/modules/model_evaluation.html#max-error) |
    | `neg_mean_absolute_error` | [使用說明](https://scikit-learn.org/stable/modules/model_evaluation.html#mean-absolute-error) |
    | `neg_mean_squared_error` 或 `mse` | [使用說明](https://scikit-learn.org/stable/modules/model_evaluation.html#mean-squared-error) |
    | `neg_root_mean_squared_error` 或 `rmse` | [使用說明](https://scikit-learn.org/stable/modules/model_evaluation.html#mean-squared-error) |
    | `neg_mean_squared_log_error` | [使用說明](https://scikit-learn.org/stable/modules/model_evaluation.html#mean-squared-log-error) |
    | `neg_median_absolute_error` | [使用說明](https://scikit-learn.org/stable/modules/model_evaluation.html#median-absolute-error) |
    | `neg_mean_poisson_deviance` | [使用說明](https://scikit-learn.org/stable/modules/model_evaluation.html#mean-tweedie-deviance) |
    | `neg_mean_gamma_deviance` | [使用說明](https://scikit-learn.org/stable/modules/model_evaluation.html#mean-tweedie-deviance) |
    | `neg_mean_absolute_percentage_error` | [使用說明](https://scikit-learn.org/stable/modules/model_evaluation.html#mean-absolute-percentage-error) |

#### 2.1.5 檢閱 + 建立
最後，確認所設定的資訊無誤後，就可按下「**+建立**」。

### 2.2 啟動訓練任務
完成訓練任務的設定後，回到訓練任務管理頁面，可以看到剛剛建立的任務，點擊該任務，可檢視訓練任務的詳細設定。若此時任務的狀態顯示為 **`Ready`** ，即可點擊 **啟動** 圖示，執行訓練任務。

![](https://docs.oneai.twcc.ai/uploads/upload_d9d888e17d2f6fde4ba08c674bedde75.png)

![](https://docs.oneai.twcc.ai/uploads/upload_39e9bc07a9a73f66390187512a685602.png)

啟動後，點擊上方的「**運行列表**」頁籤，可以在列表中查看該任務的執行狀況與排程。

![](https://docs.oneai.twcc.ai/uploads/upload_df303f48149fc86db681cc48ce24a5ed.png)

在訓練進行中，可以點擊任務右側選單中的 **查看日誌**、**查看詳細狀態**，查看目前任務執行的詳細資訊。

![](https://docs.oneai.twcc.ai/uploads/upload_4a40a666578c8a472f4303917e25427c.png)

### 2.3 檢視訓練結果
#### 2.3.1 模型評估分數
當訓練完成後，會出現此任務用的機器學習演算法 **`RandomForest`** 所得到的結果。如果符合預期，可點選「**儲存為模型**」將其儲存至 **模型儲存庫** 中；若無，則重新調整環境變數與超參數的數值或數值範圍。

![](https://docs.oneai.twcc.ai/uploads/upload_3d880ed6a92db15b3bbaf6ff3dda7201.png)

評估機器學習模型的好壞，可以採用下列方法：
1. 採用未看過的測試集（如：test_x.csv 和 test_y.csv）來評估模型；若是沒有測試集，則可從訓練集（train_x.csv 和 train_y.csv）再抽樣劃分出測試集。
2. 模型的評估指標，以 **環境變數** 中 [**MODEL_METRICS**](#MODEL_METRICS) 設定的指標清單中的第一項作為評估指標，參考下表：
    
    |      | MODEL_METRICS 設定範例 | 回報的評估指標 |
    | ---- | --------------------- | ----------- |
    | 範例1 | `r2`  | `r2`  | 
    | 範例2 | `rmse` | `rmse` |
    | 範例3 | `r2, rmse, mse` | `r2` |
    | 範例4 | `rmse, mse, r2` | `rmse` |
    | 範例5 | (沒有指定評估指標、或未設定該環境變數)  | `r2`  | 

#### 2.3.2 機器學習的執行日誌
點擊任務右側選單中的「**查看日誌**」。

![](https://docs.oneai.twcc.ai/uploads/upload_01af60565b34d34baac91011395bd820.png)

將日誌捲動到最底部，可以取得 **環境變數** 中，[**MODEL_METRICS**](#MODEL_METRICS) 設定的所有評估指標分數。

![](https://docs.oneai.twcc.ai/uploads/T3zQUy6.png)

### 2.4 嘗試變更不同的演算法，再重新訓練
如果訓練後的模型結果不符合預期，嘗試變更不同的演算法，再重新訓練。
1. 點擊「**配置**」頁籤，回到訓練任務的配置頁面，再點擊命令列上的 **編輯**，修改設定。  

![](https://docs.oneai.twcc.ai/uploads/upload_9cb133de0e30319bd1a2e6dd65a6a8da.png)

2. 將 **環境變數** 中 [**`MODEL_ALGORITHM`**](#MODEL_ALGORITHM) 修改為 **`XGBoost`**，儲存後再重新啟動訓練任務。

![](https://docs.oneai.twcc.ai/uploads/zGimveO.png)

嘗試多種不同的演算法後，接著回到「**運行列表**」頁面，可看到多筆任務的執行結果。

![](https://docs.oneai.twcc.ai/uploads/upload_d1ab048fb86368b03061eb0abc7b36c6.png)

| ID   | [`MODEL_ALGORITHM`](#MODEL_ALGORITHM) | 模型的 r2 評估分數 |
| ---- | ----------------- | ------ |
| 329 | `LinearRegression` | 0.8532 |
| 328 | `DecisionTree`     | 1.0    |
| 327 | `XGBoost`          | 0.9997 |
| 325 | `RandomForest`     | 0.9813 |

### 2.5 儲存模型
在嘗試不同的演算法後，可以從中挑選符合預期的結果，將其模型儲存至 **模型儲存庫** 中。

![](https://docs.oneai.twcc.ai/uploads/upload_2ff702285c305a4cce7d105bfa96b356.png)

![](https://docs.oneai.twcc.ai/uploads/mToXuTy.png)

註：`dt-100` 在此用於表示模型演算法為 `DecisionTree`，其 `r2` 為 100%。

在這個例子中，可以儲存一個或多個模型。

| ID   | [`MODEL_ALGORITHM`](#MODEL_ALGORITHM) | 模型的 r2 評估分數 | 模型名稱 |
| ---- | ----------------------- | ------ | ------- |
| 329 | `LinearRegression`   | 0.8532 | `house-prices:lr-085` |
| 328 | `DecisionTree`       | 1.0    | `house-prices:dt-100` |
| 327 | `XGBoost`            | 0.9997 | `house-prices:xgb-099` |
| 325 | `RandomForest`       | 0.9813 | `house-prices:rf-098` |

儲存模型後，前往「**模型管理**」頁面，點選 `house-prices` 目錄即可在模型版本列表中找到該模型。

![](https://docs.oneai.twcc.ai/uploads/UacfyN8.png)

![](https://docs.oneai.twcc.ai/uploads/PglmjKF.png)

## 3. 建立推論服務
當您訓練好迴歸模型，並將適合的模型儲存下來後，接著可藉由 **推論功能** 將模型部署為 Web 服務，以供應用程式或服務執行推論。

### 3.1 建立推論服務
從 OneAI 服務列表選擇「**AI Maker**」，再點擊「**推論**」，進入推論管理頁面，並按下「**+建立**」，建立一個推論服務。推論服務的建立步驟說明如下：

#### 3.1.1 **基本資訊**
與訓練任務的基本資訊的設定相似，我們也是使用 **`ml-sklearn-regression`** 的推論範本，方便快速設定。範本會自動帶入 **來源模型** 的基本設定，不過，所要載入的模型名稱與版號仍須手動設定，如下圖所示。

![](https://docs.oneai.twcc.ai/uploads/upload_7d341b4877d5af5aeb4c48c223566712.png)


:::info
:bulb: **提示：來源模型資訊**

參考步驟 [**2.5 儲存模型**](#25-儲存模型) 所儲存下來的模型。

| ID   | [`MODEL_ALGORITHM`](#MODEL_ALGORITHM) | 模型的 r2 評估分數 | 模型名稱 |
| ---- | ----------------------- | ------ | ------- |
| 329 | `LinearRegression`   | 0.8532 | `house-prices:lr-085` |
| 328 | `DecisionTree`       | 1.0    | ==`house-prices:dt-100`== |
| 327 | `XGBoost`            | 0.9997 | `house-prices:xgb-099` |
| 325 | `RandomForest`       | 0.9813 | `house-prices:rf-098` |
:::

#### 3.1.2 **硬體設定**    
參考目前的可用配額與需求，從列表中選出合適的硬體資源。
    
#### 3.1.3 **儲存設定**  
此步驟無須設定。

#### 3.1.4 **變數設定**
在變數設定頁面，這些指令與參數，會在套用範本時自動帶入。

![](https://docs.oneai.twcc.ai/uploads/upload_04e48aed2b4e9aa027a5da7f67edfef3.png)

此推論範本在 **環境變數** 中所設定的參數說明如下：
|參數|預設值|介紹|
|---|-----|---|
| [DEBUG](#DEBUG) | `false` | 是否啟用更多的日誌 (log)，以便於檢視推論服務的日誌。若要啟用，將值設為 `true`；反之，則將此值設為 `false`。 |
| <span style="white-space: nowrap">[INPUT_CSV_WITH_HEADER](#INPUT_CSV_WITH_HEADER) <sup style="color:red"><b>*</b></sup></span> | `true` | 要推論的資料集是否有欄位名稱，若有欄位名稱，將值設為 `true`；反之，則將此值設為 `false`。 |

<sup style="color:red"><b>\*</b></sup> 一般情況下，使用推論需要注意的參數為 **INPUT_CSV_WITH_HEADER**，更多的參數細節詳述如下：

- #### `DEBUG`  
    是否啟用更多的日誌（log），以便於檢視推論服務的日誌。
    | 值 | 說明      |
    | -- | -------- |
    | `true`<br>`1` | 啟用更多日誌（建議使用） |
    | 其餘的值 | 關閉日誌 |
- #### `INPUT_CSV_WITH_HEADER`  
    要推論的資料集是否有欄位名稱。此參數是用來設定推論服務的預設選項，隨後的推論測試就不需要攜帶此參數，即可簡化推論測試所需的指令或程式碼。
    | 值 | 說明      |
    | -- | -------- |
    | `true`<br>`1` | 表示 csv 檔裡，首列（第一列）為欄位名稱 |
    | 其餘的值 | 表示 csv 檔裡，首列沒有欄位名稱，直接就是數據 |

#### 3.1.5 進階設定
此步驟無須設定。

#### 3.1.6. **檢閱 + 建立**
最後，確認填寫的資訊，就可按下建立。

### 3.2 檢視推論服務的狀態與端點
完成推論服務的設定後，回到推論管理頁面可以看到剛剛建立的服務，點擊建立好的推論服務，可查看基本資訊。當服務的狀態顯示為 **`Ready`**，即可以開始連線到推論服務進行推論。

![](https://docs.oneai.twcc.ai/uploads/upload_3a13e4fe2600a84ca2e8b2e97f266084.png)


也可點擊「**查看日誌**」，若在日誌中有看到以下訊息，表示推論服務已經在運作中。

![](https://docs.oneai.twcc.ai/uploads/7gMjVWF.png)

此處須注意的是日誌中所顯示的網址 http://{ip}:{port} 只是容器的內部網址，並無法從外部存取。由於目前推論服務為了安全性考量沒有開放對外埠服務，但我們可以透過容器服務來跟已經建立好的推論服務溝通，溝通的方式就是靠「**推論詳細資料**」頁面下方 **網路** 區塊所顯示的網址。
:::warning
:warning: **請注意：** 文件中的網址僅供參考，您所取得的網址名稱可能會與文件中的不同。
:::	
![](https://docs.oneai.twcc.ai/uploads/upload_67b8d14cb00f92c467b4d644a8957d82.png)

:::info 
:bulb: **提示：推論服務網址**
- 為安全性考量，目前推論服務提供的 **網址** 僅能在系統的內部網路中使用，無法透過外部的網際網路存取。
- 若要對外提供此推論服務，需要透過 [**容器服務**](/s/yGbG4JJyi) 轉接到推論服務以提供對外服務。
:::

若要查看推論監控，可點擊「**監控**」頁籤，即可在監控頁面看到相關資訊，經過一段時間，監控頁面可呈現過去期間內呼叫推論服務 API 的統計資訊。

![](https://docs.oneai.twcc.ai/uploads/upload_d10dc8b3eb4dc0d69928e604c941be93.png)

點選期間選單可篩選特定期間呼叫推論 API 的統計資訊，例如：1 小時、3 小時、6 小時、12 小時、1 天、7 天、14 天、1 個月、3 個月、6 個月、1 年或自訂。

![](https://docs.oneai.twcc.ai/uploads/upload_bb450670ec8f6dc17ebff28f0bc73357.png)

:::info
:bulb: **關於觀測期間的起始與結束時間**

例如當前時間為 15:10，則：
- **1 小時** 的範圍是指 15:00 ~ 16:00（並非指過去一小時 14:10 ~ 15:10）
- **3 小時** 的範圍是指 13:00 ~ 16:00
- **6 小時** 的範圍是指 10:00 ~ 16:00
- 以此類推
:::

### 3.3 啟動 JupyterLab
JupyterLab 是提供一個基於 Web 的互動式計算環境，使用者可以在該 Web 服務上撰寫程式語言，像是 Python、R 等。以下將說明如何使用系統內建的 **`ml-sklearn:v1`** 映像檔來啟動 JupyterLab 服務。

1. 從服務列表中選擇「**容器服務**」，進入容器服務管理頁面後點擊「**+建立**」。
2. 輸入容器名稱，接著挑選 **`ml-sklearn`** 映像檔。

    ![](https://docs.oneai.twcc.ai/uploads/upload_db5f5932a70837aef935d7298ef386d4.png)

3. 在硬體設定步驟選擇最基本的硬體資源即可，不用配置 GPU。

4. 在儲存設定步驟設定存放資料集的儲存體及掛載路徑。

    ![](https://docs.oneai.twcc.ai/uploads/upload_f0042840dadd6de22025fb5f68ae27fb.png)
    
5. 為了能順利從外部存取此服務，在網路設定步驟需設定 JupyterLab 服務的連線埠為 `8888`，選擇自動產生對外服務的連線埠，並勾選 **提供網址連結**。
    
    ![](https://docs.oneai.twcc.ai/uploads/upload_1878358adfecb83a1f43305670c63018.png)

6. 在使用 JupyterLab 時，會需要輸入密碼，因此在變數設定步驟，可以使用映像檔中所預設的環境變數 **`PASSWORD`**，設定您的 JupyterLab 密碼。

    ![](https://docs.oneai.twcc.ai/uploads/upload_b301e1ba6cfbce78cb22c58a027db7ab.png)

7. 最後，檢視所設定的內容，確認無誤後即可按下「**建立**」。

8. 容器建立成功後會出現在容器服務管理列表，點擊該列表進入容器的詳細資訊頁面。

9. 點擊網路區塊中 8888 連接埠對應的網址連結，即可開啟 JupyterLab。

    ![](https://docs.oneai.twcc.ai/uploads/upload_21fbe577195ea5d5cb4423ecce204fa1.png)

10. 在 JupyterLab 的登入頁面中輸入密碼並按下 **Log in** 即可進入 **Launcher** 頁面。
    
    ![](https://docs.oneai.twcc.ai/uploads/upload_16a2a95fe6db8c59cb4dccde433b67ac.png)

### 3.4 使用 curl 指令，測試推論服務
登入 JupyterLab 後，點擊 **Launcher** 頁面下方的 **Terminal** 圖示可開啟 **終端機（Terminal）**。

![](https://docs.oneai.twcc.ai/uploads/k7pfy59.png)
    
在 **終端機（Terminal）** 中輸入 **`curl`** 指令來確認推論服務是否正常啟動。
```bash=
# "house-prices-i:9999" 為推論服務的網址
$> curl house-prices-i:9999
Start Inference API!

# or
$> curl -X GET house-prices-i:9999
Start Inference API!
```
若服務啟動成功，即可呼叫 `predict` 的 API，來進行推論。
```bash=
$> curl -X POST \
    house-prices-i:9999/predict \
    -F file=@/house-prices/test_x.csv \
    -F INPUT_CSV_WITH_HEADER=true
```
其中
- **`-X POST`**  
    表示 HTTP 請求方法為 POST。  
- **`-F file=@<資料集在本地端的位置>`**  
    表示要上傳本地端的資料集檔案到推論服務，以進行推論；  
    資料集的檔案，可選擇使用 `train_x.csv` 或 `test_x.csv` 作為測試。    
- **`-F INPUT_CSV_WITH_HEADER=true`**  
    表示上傳的資料集中，首列（第一列）有欄位名稱。  
    （可參考變數設定 [**INPUT_CSV_WITH_HEADER**](#INPUT_CSV_WITH_HEADER) 的說明）

當推論服務收到資料集後便會進行 predict，最終返回資料集的推論結果。
```json
{
  "y_pred": [
    129000.0, 
    130000.0, 
    192000.0, 
    ...
    137500.0, 
    105000.0, 
    219500.0
  ]
}
```

### 3.5 使用 Python 的 `requests` 模組，測試推論服務
除了使用終端機測試外，亦可以透過 **容器服務** 來啟動 Python 環境或是 Python Notebook 服務，並藉由執行底下的 Python 程式碼來測試推論服務。

點擊 JupyterLab Launcher 頁面上方的 **Notebook > Python 3** 圖示可開啟 **Notebook**。

![](https://docs.oneai.twcc.ai/uploads/KnqPenD.png)
    
![](https://docs.oneai.twcc.ai/uploads/upload_8265dbc8daa98673beabc6f1215217e9.png)

使用 **`requests`** 模組來連線測試：

```python=
import requests
import json

# prepare the post body
my_data = {'INPUT_CSV_WITH_HEADER': True}

# read the local dataset
my_files = None
with open('/house-prices/test_x.csv', 'r') as f:
    my_files = {'file': f.read()}

# send the post request
response = requests.post(
    'http://house-prices-i:9999/predict', 
    data=my_data, files=my_files)

# show the response
print('status_code:', response.status_code)
print('text:', response.text)
print('json:', json.loads(response.text))
```
執行結果：
```
status_code: 200
text: {
  "y_pred": [
    129000.0, 
    130000.0, 
    192000.0, 
    ...
    ]
}

json: {'y_pred': [129000.0, 130000.0, 192000.0, ...]}
```

:::info
:bulb: **注意**：目前並無 `test_y.csv` 檔案。
:::

### 3.6 透過推論服務，上傳結果到 Kaggle
由於目前並無 **test_y.csv** 檔案，真實的目標值資料由 Kaggle 平台保管。我們可以參考 [**1.2.1 資料下載**](#121-資料下載) 所下載的檔案 **`sample_submission.csv`**，資料範本如下所示：
```csv
Id,SalePrice
1461,169277.0524984
1462,187758.393988768
1463,183583.683569555
...
2917,219222.423400059
2918,184924.279658997
2919,187741.866657478
```

透過推論服務的結果，組裝出上述的 **`Id`** 和 **`SalePrice`** 欄位資訊，可參考底下完整程式碼：

:::spoiler **完整程式碼**（包含：發送請求、接受回應、產生 **test_y.csv**）
```python=
import os

# install related packages (if needed):
os.system('pip install requests')
os.system('pip install pandas')

import requests
import json

# prepare the post body
my_data = {'INPUT_CSV_WITH_HEADER': True}

# read the local dataset
my_files = None
with open('/house-prices/test_x.csv', 'r') as f:
    my_files = {'file': f.read()}

# send the post request
response = requests.post(
    'http://house-prices-i:9999/predict', 
    data=my_data, files=my_files)

# show the response
print('status_code:', response.status_code)
#print('text:', response.text)
#print('json:', json.loads(response.text)['y_pred'])


# ---
# write the prediction results to the file 'test_y.csv'
import pandas

df_x = pandas.read_csv('/house-prices/test_x.csv', header=0)['Id']
y_pred = json.loads(response.text)['y_pred']

with open('/house-prices/test_y.csv', 'w') as f:
    f.write('Id,SalePrice')
    for idx in range(len(y_pred)):
        f.write("\n%s,%s" % (df_x.values[idx], y_pred[idx]))

# ---
print("Next step: upload 'test_y.csv' to Kaggle")
```
:::

<br>

前往 House Prices 的 [**上傳頁面**](https://www.kaggle.com/c/house-prices-advanced-regression-techniques/submit)，透過以下三個步驟完成上傳：
1. 將 **test_y.csv** 檔案上傳
2. 簡易描述上傳事項，例如： **predicted the house prices via AI Maker/ Decision Tree**
3. 按下 **Make Submissions**

如下圖範例所示：

![Make Submission](https://docs.oneai.twcc.ai/uploads/FCoIGOX.png)

接著會出現評分結果：

![](https://docs.oneai.twcc.ai/uploads/vPJkkSz.png)

此推論結果得到的 [**Root-Mean-Squared-Error (RMSE)**](https://www.kaggle.com/c/house-prices-advanced-regression-techniques/overview/evaluation) 評估分數為 0.23339。

可點選 **`Jump to your position on the leaderboard`** 查看您的排名。

:::info
:bulb: **提示：嘗試使用其他已註冊的模型，並比較結果**

參考 [**2.5 儲存模型**](#25-儲存模型) 所儲存下來的模型：

| ID   | [`MODEL_ALGORITHM`](#MODEL_ALGORITHM) | 模型的 r2 評估分數 | 模型名稱 | Kaggle 的 RMSE 評估分數 |
| ---- | ----------------------- | ------ | ------- | ----- 
| 329 | `LinearRegression` | 0.8532 | `house-prices:lr-085` |0.45732 |
| 328 | `DecisionTree`     | 1.0    | `house-prices:dt-100` | 0.23339 |
| 327 | `XGBoost`          | 0.9997 | `house-prices:xgb-099` | 0.14806 |
| 325 | `RandomForest`     | 0.9813 | `house-prices:rf-098` | 0.14654 |
:::

:::info
:bulb: **提示：持續改善推論結果**

除了透過 **特徵工程 (Feature Engineering)** 去產生更多額外特徵之外，也可以從演算法著手。

若不計時間與金錢等成本考量之下，[**`MODEL_ALGORITHM`**](#MODEL_ALGORITHM) 可選擇使用 `Auto` 選項。詳細的用法，可參考下一章節 [**4-3-1**](#431-想花更多時間尋找最適演算法與超參數，需增加演算時間) 的設定。


下表為使用上述演算法訓練後的詳細評估指標。

| MODEL_ALGORITHM     | r2     | mse | rmse | Kaggle 的 RMSE 評估分數 |
| ------------------- | ------ | ---: | ----: | --------------------- |
| `LinearRegression` | 0.8532 | 926033367.3 | 30430.8 | 0.45732 |
| `DecisionTree`     | 1.0    |         0.0 |     0.0 | 0.23339 |
| `XGBoost`           | 0.9997 |  2076001.2  |  1440.8 | 0.14806 |
| `RandomForest`     | 0.9813 | 117670079.1 | 10847.6 | 0.14654 |
| `Auto` (執行 24 小時)| 0.9643 | 225401086.1 | 15013.4 | ==0.12742== :+1: |
:::

## 4. [進階操作] 調整演算法的參數
:::info
:bulb:**提示**  
這一章節為進階操作，若機器學習結果不符合預期時，想要進一步設定或調整演算法參數，可參考此篇說明。
:::

在 [**2.1.4 變數設定**](#214-變數設定) 章節中，有提及設定機器學習所要使用的 [**演算法 (MODEL_ALGORITHM)**](#MODEL_ALGORITHM)。當演算法的預設參數、或訓練結果，無法滿足實際的需求時，例如：
1. 想花更多時間尋找最適演算法與超參數，需增加演算時間。
2. 迭代次數不夠，模型尚無法擬合定型，需加大迭代次數。
3. 單一演算法中有不同的演算方式，想要選擇不同的演算方式來擬合資料。
4. 以多項式為核心的演算法，可藉由變更冪次（指數部份），來提高模型的複雜度。
5. 更改懲罰程度（罰分）... 等等。

基於需求，可以透過參數調整來滿足實際的需求。此參數調整，亦稱為超參數調整（調校）。

### 4.1 參數調整方式
在 [**變數設定**](#214-變數設定) 頁面，新增一組或多組鍵值，來變更模型演算法的預設參數。

### 4.2 參數語法規則
設定演算法參數的規則為：所填寫的 [MODEL_ALGORITHM](#MODEL_ALGORITHM) 值，再加上**參數名稱**和**參數值**。

範本：
```
{MODEL_ALGORITHM}_param_{參數名稱}：{參數值}
```
:::info
:pencil: **範例1**
- 演算法名稱：`AutoSklearn`
- 參數1
    - 名稱：`time_left_for_this_task`
    - 值：`60*5` (執行總時間，限制為 5 分鐘)
- 參數2
    - 名稱：`per_run_time_limit`
    - 值：`30` (單次測試時間，限制為 30 秒)<br><br>

套入上述範本後為：
```
AutoSklearn_param_time_left_for_this_task：60*5
AutoSklearn_param_per_run_time_limit：30
```
並將其設定到環境變數：
![](https://i.imgur.com/uZephaT.png)
:::

:::info
:pencil: **範例2**
- 演算法類別：`AutoSklearnRegressor`
- 參數1
    - 名稱：`time_left_for_this_task`
    - 值：`60*5` (執行總時間，限制為 5 分鐘)
- 參數2
    - 名稱：`per_run_time_limit`
    - 值：`30` (單次測試時間，限制為 30 秒)<br><br>

套入上述範本後為：
```
AutoSklearnRegressor_param_time_left_for_this_task：60*5
AutoSklearnRegressor_param_per_run_time_limit：30
```
並將其設定到環境變數：
![](https://i.imgur.com/Yn9bF72.png)
:::

以下列出各演算法的**名稱**，及其對應的**類別**與**參數說明**：
| 演算法名稱 | 演算法類別 | 參數說明<br>(參數名稱 & 參數值) |
| --------------------- | -------- | -------- |
| `Auto`                | [^註1^](#footnote_auto_algorithm_class) | - |
| `AutoSklearn`         | AutoSklearnRegressor | [查看參數](https://automl.github.io/auto-sklearn/master/api.html#regression) |
| `AutoGluon` | AutoGluonRegressor | 查看參數：[init](https://auto.gluon.ai/0.1.0/api/autogluon.task.html#autogluon.tabular.TabularPredictor), [fit](https://auto.gluon.ai/0.1.0/api/autogluon.task.html#autogluon.tabular.TabularPredictor.fit) [^註2^](#footnote_autogluon_parameters) |
| `AdaBoost`           | AdaBoostRegressor | [查看參數](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostRegressor.html) |
| `ExtraTree`          | ExtraTreeRegressor | [查看參數](https://scikit-learn.org/stable/modules/generated/sklearn.tree.ExtraTreeRegressor.html) |
| `DecisionTree`       | DecisionTreeRegressor | [查看參數](https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeRegressor.html) |
| <span style="white-space: nowrap">`GradientBoosting`</span>   | GradientBoostingRegressor | [查看參數](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html) |
| `KNeighbors`          | KNeighborsRegressor | [查看參數](https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsRegressor.html) |
| `LightGBM`            | LGBMRegressor | [查看參數](https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.LGBMRegressor.html) |
| <span style="white-space: nowrap">`LinearRegression`</span> | LinearRegression | [查看參數](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html) |
| `RandomForest`       | RandomForestRegressor | [查看參數](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html) |
| `SGD`                 | SGDRegressor | [查看參數](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDRegressor.html) |
| `SVM`                 | SVR | [查看參數](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html) |
| `XGBoost`             | XGBRegressor | [查看參數](https://xgboost.readthedocs.io/en/latest/python/python_api.html#xgboost.XGBRegressor) |

- <span id="footnote_auto_algorithm_class"></span>**註1**：不建議使用，使用者需確實了解 `Auto` 在執行時，是動態綁定到 `AutoSklearnRegressor` 還是 `AutoGluonRegressor`？
    - 無 GPU 環境，`Auto` 會綁定到 `AutoSklearnRegressor` 
    - 有 GPU 環境，`Auto` 會綁定到 `AutoGluonRegressor` 
- <span id="footnote_autogluon_parameters"></span>**註2**：AutoGluon 當前都使用預設參數。
    - 若要調整參數，其參數來源有兩個：
        - 一個來源是 [init 參數](https://auto.gluon.ai/0.1.0/api/autogluon.task.html#autogluon.tabular.TabularPredictor)；
        - 另一個來源是 [fit 參數](https://auto.gluon.ai/0.1.0/api/autogluon.task.html#autogluon.tabular.TabularPredictor.fit)。
    - 若要限制執行總時間，可以這麼做：
        - 使用演算法名稱
            ```
            AutoGluon_param_time_limit：60*5
            ```
        - 明確指定演算法類別
            ```
            AutoGluonRegressor_param_time_limit：60*5
            ```
    - 其餘參數的導入，目前仍然在開發中。
- <span id="footnote_experimental_algorithm_name"></span>**Q & A**：
    - **針對不在上述表格中的機器學習演算法要如何設定參數？**
        使用不在上述表格中的機器學習演算法，使用者需要明確地指定 `ml-sklearn` 映像檔所提供的[演算法類別](#footnote_experimental_algorithm_class_list)。以所使用的演算法類別作為關鍵字，在 [scikit-learn 官方文件](https://scikit-learn.org/stable/modules/classes.html)中可以找到對應的演算法類別，再點進去即可找到該演算法類別所能使用的參數。<br>
        例如，想使用 `MLPRegressor`，在該頁面搜尋關鍵字就可以找到，如下所示：
        ![](https://i.imgur.com/hGHVOlF.png)<br>
        接著再點進去，就能看到相關參數用法。
        ![](https://i.imgur.com/zRXJIV8.png)


### 4.3 實際範例

實際操作過程，將以第 1 個範例作為主要說明；隨後的範例，將簡單陳述說明。

#### 4.3.1 想花更多時間尋找最適演算法與超參數，需增加演算時間
此章節是針對 [**MODEL_ALGORITHM**](#MODEL_ALGORITHM) 設為 `Auto` 選項時的補充說明。在 **AutoRegressor** 的 [**參數說明**](https://automl.github.io/auto-sklearn/master/api.html) 中，有提及：

- **`time_left_for_this_task` (該次任務的總時間)**
    > 預設時間為 3600 秒 (1小時)，以秒為單位。
    > 
    > 搜尋最佳模型的總時間限制。藉由增加該值，AutoRegressor 更有可能找到更好的模型。
- **`per_run_time_limit` (單次執行的時間限制)**
    > 預設時間為 360 秒 (6分鐘)，以秒為單位。
    > 
    > 選定一個模型與一組參數，進行單次測試的時間限制。
    > 
    > 有些演算法(如 MLP )在單次測試時，有可能會花費比較久的時間來擬合模型，一旦執行時間超過預設 6 分鐘，此演算法就會被記為失敗，不列入參考模型清單。
    
    何時該調整此參數？
    > 透過 [**2.3.2 機器學習的執行日誌**](#232-機器學習的執行日誌) 章節，可了解如何查看日誌。當逾時的演算法比例過高，在不計時間與金錢等成本考量之下，可考慮放寬單次執行的時間限制。
    > ![](https://docs.oneai.twcc.ai/uploads/r6rYFLs.png)

為了增加演算時間，可以這麼做：

| 參數 | 設定值 | 說明 |
| --- | ----- | --- |
| `AutoRegressor_param_time_left_for_this_task` | `60*60*24` | 以秒為單位。<br>總時間設定為 24 小時，亦可填入 `86400`。 |
| `AutoRegressor_param_per_run_time_limit` | `60*30` | 以秒為單位。<br>單次測試時間設定為 30 分鐘，亦可填入 `1800`。 |

在 [**變數設定**](#214-變數設定) 階段的 **環境變數** 表格中，實際填入兩筆鍵值：

![](https://docs.oneai.twcc.ai/uploads/vSD0pp3.png)

隨後啟動的訓練任務，將採用此設定。

:::info
:bulb: **提示：更多的設定與配置**
在 [**2.1.2 硬體設定**](#212-硬體設定) 章節中，有提及自身需求的硬體資源。為了發揮所配置到硬體資源，可以這麼做：

| 參數 | 設定值 | 說明 |
| --- | ----- | --- |
| `AutoRegressor_param_n_jobs` | `-1` | 使用所有 CPU 。原預設值為單一核心。 |
| `AutoRegressor_param_memory_limit`|`1024*40` |將記憶體上限調高為 40GB，以應付千萬筆的表格數據。|
:::
:::warning
:warning: **注意事項**
演算法參數的設定，需跟 **`MODEL_ALGORITHM`** 參數一起搭配使用；否則演算法參數的設定將會被忽略。
:::

#### 4.3.2 迭代次數不夠，模型尚無法擬合定型，需加大迭代次數
| 參數 | 設定值 | 說明 |
| --- | ----- | --- |
| `SGDRegressor_param_max_iter` | `5000` | SGDRegressor 的預設值為 1000。 |

#### 4.3.3 單一演算法中有不同的演算方式，想要選擇不同的演算方式來擬合資料

| SVR 參數 | 設定值 | 說明 |
| ------- | ----- | --- |
| `SVR_param_kernel` | `linear` | 將 SVR (SVM) 的核心設為 `linear` |
| `SVR_param_kernel` | `poly` | 將 SVR (SVM) 的核心設為 `poly` |
| `SVR_param_kernel` | `sigmoid` | 將 SVR (SVM) 的核心設為 `sigmoid` |

#### 4.3.4 以多項式為核心的演算法，可藉由變更冪次 (次數、指數部份)，來提高模型的複雜度

針對 SVR 做設定，底下 3 個設定為一組，需一起搭配使用：
| SVR 參數 | 設定值 | 說明 |
| ------- | ----- | --- |
| `MODEL_ALGORITHM` | `SVM` | 使用 SVM 演算法 |
| `SVR_param_kernel` | `poly` | 將 SVR (SVM) 的核心設為 `poly` |
| `SVR_param_degree` | `5` | 將  [多項式](https://zh.wikipedia.org/wiki/%E5%A4%9A%E9%A0%85%E5%BC%8F) 的冪次，從預設為 3 變更為 5 |

#### 4.3.5 更改懲罰程度（罰分）
懲罰 (penalty) 亦稱為正規化項 (regularization term)，一般有 L1、L2、ElasticNet 可以選擇。

| 參數 | 設定值 | 說明 |
| --- | ----- | --- |
| `SGDRegressor_param_penalty` | `elasticnet` |  |
| `SVR_param_C` | `2` | 設定懲罰係數，從預設為 `1` 變更為 `2`；`C` 值越高，越不能容忍出現誤差，但可能會過擬合。 |
