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。 |
輸出數據行數據類型 | 可以是 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> 會在此鏈結的某處放置。 在該案例中,我們可以透過這個方法附加呼叫一次會呼叫的委派。 |