Share via


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。
輸出數據行數據類型 可以是 float、double、int、long、bool 或 text,視運算式而定。

產生的 ExpressionTransformer 會建立名為 的新數據行,如輸出數據行名稱參數中所指定,其中表達式會套用至輸入值。 最多其中一個輸入數據行可以是 VectorDataViewType 類型,而且當輸入包含向量數據行時,表達式會在向量的每個元素上獨立計算,以建立長度與該輸入相同的向量輸出。

表達式語言

表達式估算器的語言應該適用於廣泛的使用者。 它與某些熱門語言共用許多相似之處。 其區分大小寫、支援多個類型,並具有一組豐富的運算符和函式。 它是單純的功能,也就是說,語言中沒有可變動的值或變動作業。 它不需要任何例外狀況機制,而是在一般值不適用時產生 NA 值。 它是靜態類型,但編譯程式會推斷所有類型。

Syntax

Lambda 的語法是由參數列表所組成,後面接著冒號 (:) 或箭號 (=>) 後面接著表達式。 參數清單可以是單一標識碼或以逗號分隔的一或多個標識符清單,並以括弧括住。

Lambda:

  • parameter-list expression
  • parameter-list => expression

parameter-list:

  • identifier
  • (參數名稱)

parameter-names:

  • identifier
  • identifier parameter-name

表達式可以使用參數、常值、運算子、搭配表達式和函式。

常值

  • 布爾常值為 true 和 false。
  • 整數常值可以是十進位或十六進位 (,例如0x1234ABCD) 。 它們可以後綴為您或 U,表示未簽署,以及 l 或 L,表示長 (Int64) 。 您或 U 的使用很少見,而且只會影響特定 32 位十六進位值的升階,判斷常數是否被視為負 Int32 值或正 Int64 值。
  • 浮點常值使用標準語法,包括指數表示法 (123.45e-37) 。 它們可以後綴為 f 或 F,表示單精度或 d 或 D,表示雙精確度。 不同於 C#,浮點常值的預設精確度是單精度。 若要指定雙精確度,請附加 d 或 D。
  • 文字常值會以雙引弧括住,並支持標準逸出機制。

運算子

表達式語言的運算符會依照前置順序列在下表中。 除非另有說明,否則二進位運算符會保持關聯,並在任一操作數值為 NA 時 (傳播 NA 值,結果為 NA) 。 一般而言,整數值的溢位會產生 NA,而浮點值的溢位會產生無限大。

運算子 意義 Arity 註解
​? : 條件 三元 運算式條件 ? value1 :如果 condition 為 true,value2 會解析為 value1,如果 condition 為 false,則會解析為 value2。 條件必須是布爾值,而 value1 和 value2 必須是相容的類型。
​?? 合併 二進位 表示式 x ?? 如果 x 不是 NA,y 會解析為 x,否則會解析為 y。 操作數必須是單一或兩個雙精度浮點數。 這個運算符是正確的關聯。
| |或 邏輯或 二進位 操作數和結果為布爾值。 如果一個操作數為 true,則結果為 true,否則為 false。
&& 和 邏輯和 二進位 操作數和結果為布爾值。 如果一個操作數為 false,則結果為 false,否則為 true。
​==, =
!=, <>
<, <=
>, >=
equals
不等於
小於或等於
大於或等於
多個 - 比較運算子是多重arity,這表示它們可以套用至兩個或多個操作數。 例如,如果 、b 和 c 具有相同的值,則 == b == c 會產生 true。 不相等運算符要求所有操作數都是相異的,因此 1 != 2 != 1 為 false。 若要測試 x 是否為非負數,但小於 10,請使用 0 <= x < 10。 不需要寫入 0 <= x && x < 10,因此不會同時執行。 在相同行上所列的運算符可以結合在單一表達式中,因此 > b >= c 是合法的,但 < b >= c 不是。
- 等於和不等於會套用至任何操作數類型,而已排序的運算符則需要數值操作數。
​+ - 加法和減法 二進位 具有 NA 傳播的數值加法和減法。
​* / % 乘法、除法和模數 二進位 具有 NA 傳播的數值乘法、除法和模數。
​- ! 否 數值負數和邏輯不是 這些是一元前置詞運算符, (-) 需要數值操作數,而且不需要 (!) 需要布爾操作數。
​^ 權力 二進位 這是正確的關聯指數。 它需要數值操作數。 針對整數操作數,0^0 會產生 1。
​( ) 括弧群組 標準意義。

含表達式的

with-expression 的語法為:

with-expression:

  • 搭配 ( assignment-list ; 表示式 )

assignment-list:

  • 指派
  • assignment assignment-list

分配:

  • 標識元 = 表達式

with-expression 引進了一或多個具名值。 例如,下列表達式會將 celcius 溫度轉換為 fahrenheit,然後根據fahrenheit 太低或高來產生訊息。

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 epoch (01/001/0001 的刻度數 (為 Int64) 的星期幾。 工作分派用於一秒中的刻度數目、一小時內的刻度數目、一年中的刻度數目,以及 epoch 的星期幾。 在此範例中,我們想要將星期日對應至零,因此,因為 epoch 是星期一,所以我們會將 dayEpoch 設定為 1。 如果 epoch 已變更,或我們想要將星期幾對應至零,我們只會變更 dayEpoch。 請注意,ticksPerSecond 定義為 10000000L,讓它成為 Int64 值 (8 位元組整數) 。 如果沒有 L 後綴,ticksPerDay 將會溢位 Int32 的範圍。

函式

表達式轉換支援許多有用的函式。

下表列出可接受任何類型操作數的一般一元函式。

名字 意義 評論
isna 測試 na 傳回布爾值,指出操作數是否為 NA 值。
na 值 傳回與操作數相同類型的 NA 值, (float 或 double) 。 請注意,這不會評估操作數,它只會使用操作數來判斷要傳回的 NA 類型,並在編譯時期進行判斷。
預設 預設值 傳回與操作數相同類型的預設值。 例如,若要將 NA 值對應至預設值,請使用 x ?? 默認 (x) 。 請注意,這不會評估操作數,它只會使用操作數來判斷要傳回的預設值類型,並在編譯時期進行判斷。 針對數值類型,預設值為零。 針對布爾值,預設值為 false。 針對文字,預設值是空的。

下表列出一元轉換函式。 NA 操作數會產生 NA,如果類型不支援,則擲回 。 無法成功或溢位的轉換也會導致 NA 或例外狀況。 最常見的情況是從文字轉換時,這會使用標準轉換剖析。 從浮點值 (float 或 double) 轉換成整數值 (Int32 或 Int64) 時,轉換會執行截斷作業, (四捨五入為零) 。

名字 意義 評論
Bool 轉換為布爾值 操作數必須是文字或布爾值。
Int 轉換為 Int32 輸入可以是任何類型的。
轉換為 Int64 輸入可以是任何類型的。
單一、浮點數 轉換為 Single 輸入可以是任何類型的。
轉換為 Double 輸入可以是任何類型的。
文本 轉換成 文字 輸入可以是任何類型的。 這會產生預設文字表示。

下表列出需要數值操作數的一元函式。 結果類型與操作數類型相同。 NA 操作數值會產生 NA。

名字 意義 評論
Abs 絕對值 產生操作數的絕對值。
標誌 sign (-1, 0, 1) 視操作數為負數、零或正數而定,產生 -1、0 或 1。

下表列出需要數值操作數的二進位函數。 當操作數類型不相同時,操作數會升階為適當的類型。 結果類型與升級的操作數類型相同。 NA 操作數值會產生 NA。

名字 意義 評論
min 最低 產生操作數的最小值。
麥克斯 maximum 產生操作數的最大值。

下表列出需要浮點操作數的一元函式。 結果類型與操作數類型相同。 溢位會產生無限大。 無效的輸入值會產生 NA。

名字 意義 評論
sqrt 平方根 負操作數會產生 NA。
trunc、truncate 截斷為整數 四捨五入至最接近的整數值。
地板 地板 向負無限大四捨五入為最接近的整數值。
ceil, ceiling 天花板 向正無限大四捨五入到最接近的整數值。
無偏捨入 四捨五入為最接近的整數值。 當操作數在兩個整數值之間的一半時,這會產生偶數整數。
exp 指數 將 e 引發至操作數。
ln, log 對數 產生自然 (對數 e) 對數。 另外還有兩個操作數版本的記錄,用於使用不同的基底。
deg, degrees 弧度到度 從弧度到度的對應。
rad,弧度 度到弧度 從度到弧度對應。
sin、sind 正弦 採用角度的正弦值。 sin 函式假設操作數為弧度,而sind函式則假設操作數為度數。
cos、 cosd 餘弦 採用角度的餘弦值。 cos 函式假設操作數為弧度,而 cosd 函式則假設操作數為度數。
tan、tand 切線 採用角度的正切值。 tan 函式假設操作數為弧度,而 tand 函式則假設操作數為度數。
sinh 雙曲正弦值 接受其操作數的雙曲正弦值。
cosh 雙曲餘弦值 採用其操作數的雙曲餘弦值。
tanh 雙曲正切值 採用其操作數的雙曲正切值。
asin 反正弦值 採用其操作數的反正弦值。
acos 反餘弦值 採用其操作數的反餘弦值。
atan 反正切值 採用其操作數的反正切值。

下表列出需要浮點操作數的二進位函式。 當操作數類型不相同時,操作數會升階為適當的類型。 結果類型與升級的操作數類型相同。 NA 操作數值會產生 NA。

名字 意義 評論
日誌 具有指定基底的對數 第二個操作數是基底。 第一個是要接受對數的值。
atan2、atanyx 判斷角度 從指定的 y 和 x 值決定 -pi 與 pi 之間的角度。 請注意,y 是第一個操作數。

下表列出文字函式。

名字 意義 評論
len (x) 文字長度 操作數必須是文字。 結果是I4,指出操作數的長度。 如果操作數為 NA,則結果為 NA。
lower (x) , upper (x) 小寫或大寫 將文字對應至小寫或大寫。
左 (x、k) 、右 (x、k) 第一個操作數必須是文字,而第二個操作數必須是Int32。 如果第二個操作數是負數,則會視為文字結尾的位移。 這個調整的索引接著會限制為 0 到 len (x) 。 結果是結果位置左邊或右邊的字元。
mid (x, a, b) 第一個操作數必須是文字,而其他兩個操作數必須是Int32。 索引的轉換方式與左右函式相同:負值會視為文字結尾的位移;這些調整的索引會限制為 0 到 len (x) 。 第二個固定索引也會限制在第一個限制的索引下方。 結果是這兩個限制索引之間的字元。
concat (x1, x2, ..., xn) 串聯 這會接受任意數目的操作數, (包括零) 。 所有操作數都必須是文字。 結果是依序串連所有操作數。

方法

Fit(IDataView)

此估算器會將使用者提供的表達式套用 (指定為字串) 輸入數據行值,以產生新的輸出數據行值。

GetOutputSchema(SchemaShape)

此估算器會將使用者提供的表達式套用 (指定為字串) 輸入數據行值,以產生新的輸出數據行值。

擴充方法

AppendCacheCheckpoint<TTrans>(IEstimator<TTrans>, IHostEnvironment)

將「快取檢查點」附加至估算器鏈結。 這可確保下游估算器會針對快取的數據定型。 在接受多個數據通過的定型器之前,先有快取檢查點會很有説明。

WithOnFitDelegate<TTransformer>(IEstimator<TTransformer>, Action<TTransformer>)

指定估算器時,傳回包裝物件,一旦 Fit(IDataView) 呼叫委派即可。 估算器通常務必傳回符合專案的相關信息,這就是 Fit(IDataView) 方法傳回特定型別物件的原因,而不是只傳回一般 ITransformer。 不過,同時, IEstimator<TTransformer> 通常會形成具有許多物件的管線,因此我們可能需要透過建置估算器的鏈結,而我們想要取得轉換器的估算器 EstimatorChain<TLastTransformer> 會在此鏈結的某處放置。 在該案例中,我們可以透過這個方法附加呼叫一次會呼叫的委派。

適用於

另請參閱