ExpressionEstimator 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
此估計器會將使用者提供的表達式(指定為字串)套用到輸入欄位值,產生新的輸出欄位值。
public sealed class ExpressionEstimator : Microsoft.ML.IEstimator<Microsoft.ML.Transforms.ExpressionTransformer>
type ExpressionEstimator = class
interface IEstimator<ExpressionTransformer>
Public NotInheritable Class ExpressionEstimator
Implements IEstimator(Of ExpressionTransformer)
- 繼承
-
ExpressionEstimator
- 實作
備註
估算器特性
| 這個估計器需要查看資料來訓練參數嗎? | No |
| 輸入欄位資料型別 | float、double、int、long、bool 或 text。 |
| 輸出欄位資料型態 | 可以是浮點、雙重、int、long、bool 或文字,視表達式而定。 |
結果的 ExpressionTransformer 會建立一個新的欄位,名稱依輸出欄位名稱參數指定,並將該運算式套用到輸入值上。 最多一個輸入欄位可為 VectorDataViewType 型別,當輸入包含向量欄位時,會對向量的每個元素獨立計算表達式,以產生與該輸入長度相同的向量輸出。
表達式語言
該詞彙估算器的語言應讓廣泛使用者感到舒適。 它與一些流行語言有許多相似之處。 它區分大小寫,支援多種類型,並擁有豐富的運算子與功能集合。 它是純函數式的,意即語言中沒有可變的值或變異操作。 它沒有也不需要任何例外機制,當正常值不合時會產生 NA 值。 它是靜態型別的,但所有類型都是由編譯器推斷的。
語法
lambda 的語法由參數列表後接冒號(:) 或箭頭(=>)接著表達式組成。 參數清單可以是單一識別碼,或是以逗號分隔、包含一個或多個識別碼並以括號包圍的清單。
lambda:
- Parameter-List : 表達式
- Parameter-List => 表達式
參數列表:
- 識別碼
- (參數名稱)
參數名稱:
- 識別碼
- 識別碼 、 參數名稱
這個表達式可以使用參數、字面值、運算子、帶有表達式和函式。
Literals
- 布林字面值是真與假。
- 整數字面值可以是十進位或十六進位(例如 0x1234ABCD)。 它們可以加上 u 或 U 後綴,表示未簽名,也可以加上 l 或 L,表示長(Int64)。 使用 you 或 U 很少見,且僅影響某些 32 位元十六進位值的升調,決定該常數是負 Int32 值還是正 Int64 值。
- 浮點數文字使用標準語法,包括指數符號(123.45e-37)。 它們可以加上 f 或 F,表示單精度,或 d 或 D,表示雙精度。 與 C# 不同,浮點數字面的預設精度是單精度。 若要指定雙精度,請加上 d 或 D。
- 文字文字以雙引號包圍,並支援標準的逃逸機制。
Operators
表達式語言的運算子依先次順序列於下表。 除非另有說明,二元運算子為左結合運算子,並傳播 NA 值(若任一運算元值為 NA,則結果為 NA)。 一般來說,整數值溢位產生 NA,而浮點數溢位產生無限大。
| Operator | Meaning | Arating | 評論 |
|---|---|---|---|
| ? : | 條件式 | 三元組 | 表達條件? value1 : value2 若條件為真,則解析為 value1;若條件為假,則解析為 value2。 條件必須是布林值,而 value1 和 value2 必須是相容型態。 |
| ?? | 凝聚 | 二進位 | 那個表達 x ?? 若 x 非 NA,y 解析為 x,否則 則解析為 y。 操作數必須同時是單運算元,或兩個運算元皆為雙運算元。 這個運算子是右聯想的。 |
| | |或 | 邏輯或 | 二進位 | 運算元和結果是布林運算。 若一個運算元為真,則結果為真,否則為假。 |
| && 和 | 邏輯與 | 二進位 | 運算元和結果是布林運算。 若某一運算元為假,則結果為假,否則為真。 |
| ==, = !=, <> <, = < >, = > |
equals 不是平等的 小於或等於 大於或等於 |
多重 | - 比較運算子是多元運算子,意即可應用於兩個或更多運算元。 例如,若 a、b 和 c 的值相同,則 a == b == c 為真。 不相等算子要求所有運算元皆不同,因此 1 != 2 != 1 為假。 要測試 x 是否非負但小於 10,使用 0 <= x < 10。 無需寫成 0 = x & x < 10,且寫成 10 <的表現會較差。 同一行上的運算子可以合併成一個表達式,因此 > b >= c 是合法的,但 < b >= c 則不是。 - 相等與不等於適用於任何運算元類型,而有序運算子則需要數值運算元。 |
| + - | 加法與減法 | 二進位 | 數值加減與NA傳播。 |
| * / % | 乘法、除法與模數 | 二進位 | 數值乘法、除法與數值模數與 NA 傳播。 |
| - ! 不是 | 數值否定與邏輯否定 | 一元數 | 這些是一元前綴運算子,否定(-)需要數值運算元,而非(!)需要布林運算元。 |
| ^ | 動力 | 二進位 | 這就是右聯想指數法。 它需要數值運算元。 對於整數運算元,0^0 會產生 1。 |
| ( ) | 括號分組 | 一元數 | 標準意義。 |
The With Expression
with表達式的語法為:
with-expression:
- with( assignment-list ; expression)
分配清單:
- 指派
- 分配 , 分配列表
任務分配:
- 識別符號 = 表達式
with-expression 會引入一個或多個命名值。 例如,以下表達式將攝氏度溫度轉換為華氏度,然後根據華氏度是過低還是過高產生訊息。
c => with(f = c * 9 / 5 + 32 ; f < 60 ? "Too Cold!" : f > 90 ? "Too Hot!" : "Just Right!")
某個指派的表達式可能會參考先前指派引入的識別碼,例如此例回傳 -1、0 或 1,而非訊息:
c : with(f = c * 9 / 5 + 32, cold = f < 60, hot = f > 90 ; -float(cold) + float(hot))
如上所示,當一個表達式值在較大的表達式中需要多次時,with-expression 非常有用。 在處理複雜或顯著常數時,它也很有用:
ticks => with(
ticksPerSecond = 10000000L,
ticksPerHour = ticksPerSecond \* 3600,
ticksPerDay = ticksPerHour \* 24,
day = ticks / ticksPerDay,
dayEpoch = 1 ;
(day + dayEpoch) % 7)
此方法根據自標準 .Net DateTime 紀元(理想化格里曆 01/01/0001)以來的刻數(作為 Int64)計算出星期幾。 賦值用於秒內的刻數、一小時的刻數、一年的刻數,以及該紀元的星期幾。 在這個例子中,我們想將 Sunday 映射為零,因此,因為 epoch 是 Monday,我們將 dayEpoch 設為 1。 如果紀元被更改,或我們想將另一週的星期幾映射為零,我們只需將 dayEpoch 改為 day。 請注意,ticksPerSecond 定義為 10000000L,使其成為 Int64 值(8 位元組整數)。 如果沒有 L 後綴,ticksPerDay 會溢出 Int32 的範圍。
Functions
表達式轉換支援許多實用功能。
以下表格列出了可接受任意型運算數的一般一元函數。
| 名稱 | 意義 | 留言 |
|---|---|---|
| 伊斯娜 | NA測試 | 回傳一個布林值,表示該運算元是否為 NA 值。 |
| 那 | NA 值 | 回傳與運算元相同類型的 NA 值(可為浮點數或雙重運算元)。 請注意,這不會評估運算元,它只用運算元來決定要回傳的 NA 類型,且判定是在編譯時完成的。 |
| 預設 | 預設值 | 回傳與運算元相同類型的預設值。 例如,要將 NA 值映射到預設值,請使用 x ?? default(x)。 請注意,這不會評估操作數,它只是用操作數來決定要回傳的預設值類型,且判定是在編譯時進行的。 對於數字型別,預設為零。 對於布林值,預設值為假。 對於文字,預設是空的。 |
一元轉換函數列於下表。 NA 運算元會產生 NA,或如果型別不支援 NA,則會拋出。 轉換失敗或溢出也會導致 NA 或例外。 最常見的情況是從文字轉換時,使用標準的轉換解析法。 當從浮點數值(浮點數或雙點數)轉換成整數值(Int32 或 Int64)時,轉換會進行截斷運算(四捨五入至零)。
| 名稱 | 意義 | 留言 |
|---|---|---|
| 布爾 | 轉換為布林值 | 運算元必須是文字或布林。 |
| 智力 | 轉換為 Int32 | 輸入可以是任何類型。 |
| 長篇 | 轉換為 Int64 | 輸入可以是任何類型。 |
| 單曲,浮動 | 轉換為 Single | 輸入可以是任何類型。 |
| 雙重 | 轉換為 Double | 輸入可以是任何類型。 |
| 正文 | 轉換為 文字 | 輸入可以是任何類型。 這會產生預設的文字表示方式。 |
需要數值運算元的一元函數列於下表。 結果型別與運算元型別相同。 NA 運算數值會產生 NA。
| 名稱 | 意義 | 留言 |
|---|---|---|
| 腹肌 | 絕對值 | 產生運算元的絕對值。 |
| 標誌 | 符號 (-1, 0, 1) | 根據運算元是負、零或正,會產生 -1、0 或 1。 |
需要數值運算元的二元函數列於下表。 當運算元類型不相同時,運算元會被提升到適當的類型。 結果型別與升調的運算元型別相同。 NA 運算數值會產生 NA。
| 名稱 | 意義 | 留言 |
|---|---|---|
| Min | 最低限度 | 產生最小的運算元。 |
| 麥克斯 | 最高限度 | 產生最大運算元。 |
需要浮點運算元的一元函數列於下表。 結果型別與運算元型別相同。 溢出產生無限。 輸入值無效則產生 NA。
| 名稱 | 意義 | 留言 |
|---|---|---|
| SQRT | 平方根 | 負運算元產生 NA。 |
| trunc,截斷 | 截斷為整數 | 向零四捨五入到最近的整數值。 |
| 樓層 | 樓層 | 四捨五入至負無限大,取為最接近的整數值。 |
| 天花板 | 天花板 | 四捨五入至正無限大,取出最接近的整數值。 |
| 輪 | 無偏四捨五入 | 四捨五入至最接近的整數值。 當運算元介於兩個整數值之間時,會產生偶數整數。 |
| 經驗 | 指數級 | 將 e 提升到運算元。 |
| 在日誌中 | 對數 | 產生自然(以e為底)對數。 還有一個雙運算元版本的對數,用於使用不同的基底。 |
| DEG,度數 | 弧度與度數 | 從弧度到度數的映射。 |
| 拉德,拉迪安 | 度數到弧度 | 從度數到弧度的映射。 |
| 罪惡,信德 | 正弦 | 取角度的正弦。 正弦函數假設運算元以弧度為單位,而 sind 函數則假設運算元以度為單位。 |
| COS,COSD | 餘弦 | 取角度的餘弦值。 cos 函數假設運算元以弧度為單位,而 cosd 函數則假設運算元以度數為單位。 |
| 坦,坦德 | 切題 | 取角度的切線。 tan函數假設運算數以弧度為單位,而tand函數則假設運算數以度為單位。 |
| 成 | 雙曲正弦 | 取其運算元的雙曲正弦。 |
| 科什 | 雙曲餘弦 | 取其運算元的雙曲餘弦。 |
| 坦 | 雙曲切線 | 採取運算元的雙曲切線。 |
| 阿辛 | 逆正弦 | 取其運算元的逆正弦。 |
| ACOS | 反餘弦 | 取其運算元的反餘弦值。 |
| 阿坦 | 反切線 | 會取其運算元的反切線。 |
需要浮點運算元的二元函式列於下表。 當運算元類型不相同時,運算元會被提升到適當的類型。 結果型別與升調的運算元型別相同。 NA 運算數值會產生 NA。
| 名稱 | 意義 | 留言 |
|---|---|---|
| 日誌 | 給定底數的對數 | 第二個運算元是基底。 第一個是取對數的值。 |
| Atan2,Atanyx | 確定角度 | 根據給定的 y 和 x 值,決定 -pi 與 π 之間的夾角。 注意 y 是第一個運算元。 |
文字函式列於下表。
| 名稱 | 意義 | 留言 |
|---|---|---|
| len(x) | 文字長度 | 運算元必須是文字。 結果是 I4 表示運算元長度。 若運算元為 NA,則結果為 NA。 |
| lower(x)、upper (x) | 小寫或大寫 | 將文字映射為小寫或大寫。 |
| 左(x, k), 右(x, k) | 子字串 | 第一個運算元必須是文字,第二個運算元必須是 Int32。 如果第二個運算元為負數,則視為文本結尾的偏移量。 調整後的指數再夾為0與len(x)。 結果就是該位置左邊或右邊的字元。 |
| 中(x, a, b) | 子字串 | 第一個運算元必須是文字,另外兩個運算元必須是 Int32。 索引的轉換方式與左、右函數相同:負值被視為文本末尾的偏移量;這些調整後的指數會被夾在0到len(x)。 第二個夾緊的折痕也夾在第一個夾緊的折度下方。 結果就是這兩個壓縮指標之間的字元。 |
| concat(x1, x2, ..., xn) | 串接 | 此方法接受任意數量的運算元(包括零)。 所有運算元必須是文字。 結果是所有運算元依序串接。 |
方法
| 名稱 | Description |
|---|---|
| Fit(IDataView) |
此估計器會將使用者提供的表達式(指定為字串)套用到輸入欄位值,產生新的輸出欄位值。 |
| GetOutputSchema(SchemaShape) |
此估計器會將使用者提供的表達式(指定為字串)套用到輸入欄位值,產生新的輸出欄位值。 |
擴充方法
| 名稱 | Description |
|---|---|
| AppendCacheCheckpoint<TTrans>(IEstimator<TTrans>, IHostEnvironment) |
在估計鏈中附加一個「快取檢查點」。 這將確保下游估計器能針對快取資料進行訓練。 在訓練師接受多次資料通行前設置快取檢查點會很有幫助。 |
| WithOnFitDelegate<TTransformer>(IEstimator<TTransformer>, Action<TTransformer>) |
給定一個估計器,回傳一個包裹物件,該物件會呼叫一次 Fit(IDataView) 代理。 估計器通常回傳擬合的資訊很重要,因此該 Fit(IDataView) 方法回傳一個特定型別的物件,而非一般 ITransformer的 。 然而,同時, IEstimator<TTransformer> 通常會被組成包含許多物件的管線,因此我們可能需要建立一條估計鏈,將 EstimatorChain<TLastTransformer> 我們想要取得變壓器的估計器埋藏在這條鏈的某處。 在這種情況下,我們可以透過此方法附加一個代理,當 fit 被呼叫時會被呼叫。 |