語言

ExpressionEstimator 類別

定義

此估計器會將使用者提供的表達式(指定為字串)套用到輸入欄位值,產生新的輸出欄位值。

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 被呼叫時會被呼叫。

適用於

另請參閱