microsoftml.rx_fast_linear:確率的双重座標上昇を用いた線形モデル

Usage

microsoftml.rx_fast_linear()

Description

線形二値分類および回帰のための確率的双重座標上昇(SDCA)最適化トレーナー。

詳細情報

rx_fast_linear は、凸目的関数の最先端の最適化手法である確率的双重座標上昇(SDCA)手法に基づくトレーナーです。 このアルゴリズムは、マルチスレッドをサポートする半非同期実装により、大規模なメモリ外データセットでの使用にスケール可能です。 収束は、プライマルとデュアル更新の同期を別のスレッドで定期的に強制することで支えられます。 損失関数の選択肢もいくつか用意されています。 SDCA法は、ロジスティック回帰とSVMアルゴリズムの優れた特性と機能をいくつか組み合わせています。 SDCAの詳細については、参考文献セクションの引用文献をご覧ください。

確率的勾配降下法(SGD)などの従来の最適化アルゴリズムは、経験的損失関数を直接最適化します。 SDCAは代わりに双対問題を最適化する別のアプローチを選択します。 双対損失関数は、例ごとに重みによってパラメータ化されます。 各反復では、訓練データセットから訓練例を読み取ると、対応する例の重みが調整され、現在の例に対して双対損失関数が最適化されます。 SDCAでは、さまざまな勾配降下法で求められるようなステップサイズを決定する学習率は必要ありません。

rx_fast_linear 現在、対数損失、ヒンジ損失、平滑化ヒンジ損失の3種類の損失関数で二値分類をサポートしています。 線形回帰は二乗損失関数もサポートします。 弾力ネット正則化は l2_weight および l1_weight パラメータによって指定できます。 l2_weightは収束率に影響を与えることに注意してください。 一般的に、 l2_weightが大きいほどSDCAの収束速度は速くなります。

rx_fast_linearは確率的かつストリーミング最適化アルゴリズムであることに注意してください。 結果は訓練データの順序によって異なります。 再現性の高い結果を得るには、 shuffleFalse に、 train_threads1に設定することが推奨されます。

引数

数式

revoscalepy.rx_formulaで説明された式。 相互作用の用語と F() は、 microsoftml では現在サポートされていません。

データ

.xdf ファイルまたはデータ フレーム オブジェクトを指定するデータ ソース オブジェクトまたは文字列。

メソッド

モデルタイプを文字文字列で指定します:デフォルトの二値分類には "binary" 、線形回帰には "regression"

loss_function

最適化するための経験的損失関数を指定します。 二値分類には以下の選択肢があります:

  • log_loss:ログロス。 これが既定値です。

  • hinge_loss:SVMヒンジの損失。 そのパラメータはマージンサイズを表します。

  • smooth_hinge_loss:滑らかにされたヒンジの損失。 そのパラメータは平滑化定数を表します。

線形回帰では、現在二乗損失 squared_loss がサポートされています。 このパラメータが 「None」に設定された場合、そのデフォルト値は学習の種類によって異なります:

以下の例はloss_functionを hinge_loss: rx_fast_linear(..., loss_function=hinge_loss())に変えます。

l1_weight

L1正則化重みを指定します。 値は非負または なしのいずれかでなければなりません。 「 なし 」が指定されている場合、実際の値はデータセットに基づいて自動的に計算されます。 ノーがデフォルトの値です。

l2_weight

L2正則化重みを指定します。 値は非負または なしのいずれかでなければなりません。 「 なし 」が指定されている場合、実際の値はデータセットに基づいて自動的に計算されます。 ノーがデフォルトの値です。

train_threads

アルゴリズムを実行するために使える同時スレッド数を指定します。 このパラメータを 「None」に設定すると、使用されるスレッド数はプロセスに利用可能な論理プロセッサの数とデータの希少性に基づいて決まります。 アルゴリズムを1スレッドで実行するために 1 に設定してください。

convergence_tolerance

収束基準として用いられる許容閾値を指定します。 0から1の間でなければなりません。 既定値は 0.1 です。 このアルゴリズムは、双対性ギャップとプライマル損失の比率である相対双対性ギャップが指定された収束許容範囲を下回る場合に収束したとみなされます。

max_iterations

訓練反復回数の上限を指定します。 このパラメータは正または なしでなければなりません。 「 なし 」が指定されている場合、実際の値はデータセットに基づいて自動的に計算されます。 各反復は訓練データの完全なパスを必要とします。 訓練は、反復回数が指定された上限に達するか、損失関数が収束した時点で終了します。

シャッフル

トレーニングデータをシャッフルするかどうかを指定します。 Trueをシャッフルするように設定し、Falseシャッフルしないように設定してください。 既定値は True です。 SDCAは確率的最適化アルゴリズムです。 シャッフルがオンにされている場合、トレーニングデータは各イテレーションでシャッフルされます。

check_frequency

損失関数が計算され、収束したかどうかを確認するまでの反復回数。 指定された値は正の整数、または Nでなければなりません。 もし「なし」の場合、実際の値はデータセットに基づいて自動的に計算されます。 そうでなければ、例えば checkFrequency = 5 が指定されている場合、損失関数を計算し、収束を5回の反復ごとにチェックします。 損失関数の計算には、訓練データに対して別途完全なパスが必要です。

正規化

使用する自動正規化の種類を指定します。

  • "Auto": 正規化が必要な場合は、自動的に実行されます。 これが既定の選択肢です。

  • "No": 正規化は実行されません。

  • "Yes": 正規化が実行されます。

  • "Warn": 正規化が必要な場合は、警告メッセージが表示されますが、正規化は実行されません。

正規化では、さまざまなデータ範囲が標準スケールに再スケーリングされます。 特徴量スケーリングは、データ ポイント間の距離が比例することを保証し、勾配降下などのさまざまな最適化方法がはるかに高速に収束できるようにします。 正規化を実行する場合は、 MaxMin ノーマライザーが使用されます。 間隔 [a, b] で値を正規化します。ここで、 -1 <= a <= 00 <= b <= 1b - a = 1。 このノーマライザーは、ゼロをゼロにマッピングすることで、スパーリティを維持します。

ml_transforms

トレーニング前にデータに対して実行する MicrosoftML 変換の一覧を指定します。変換を実行しない場合は None を指定します。 サポートされている変換については、「 featurize_textcategorical、および categorical_hash」を参照してください。 これらの変換は、指定した Python 変換の後に実行されます。 既定値は None です。

ml_transform_vars

ml_transformsで使用する変数名の文字ベクトルを指定します。使用しない場合は None を指定します。 既定値は None です。

row_selection

サポートされていません。 モデルで使用されるデータ セットの行 (観測値) を、データ セットの論理変数の名前 (引用符で囲む) またはデータ セット内の変数を使用する論理式で指定します。 例えば次が挙げられます。

  • row_selection = "old" では、変数 old の値が Trueされた観測値のみが使用されます。

  • row_selection = (age > 20) & (age < 65) & (log(income) > 10)は、age変数の値が 20 から 65 の範囲で、log変数のincomeの値が 10 より大きい観測値のみを使用します。

行の選択は、データ変換を処理した後に実行されます (引数 transforms または transform_functionを参照)。 すべての式と同様に、 row_selection は、 expression 関数を使用して関数呼び出しの外部で定義できます。

変換

サポートされていません。 変数変換の最初のラウンドを表すフォームの式。 すべての式と同様に、 transforms (または row_selection) は、 expression 関数を使用して関数呼び出しの外部で定義できます。

transform_objects

サポートされていません。 transformstransform_function、およびrow_selectionで参照できるオブジェクトを含む名前付きリスト。

transform_function

変数変換関数。

transform_variables

変換関数に必要な入力データ セット変数の文字ベクトル。

transform_packages

サポートされていません。 変数変換関数で使用するために使用可能にし、事前に読み込む追加の Python パッケージ ( RxOptions.get_option("transform_packages")で指定されているものの外部) を指定する文字ベクトル。 たとえば、引数とtransforms引数を使用して transform_function 関数で明示的に定義されたものや、formulaまたはrow_selection引数を使用して暗黙的に定義されたものなどです。 transform_packages引数には None を指定することもできます。これは、RxOptions.get_option("transform_packages")外部のパッケージがプリロードされていないことを示します。

transform_environment

サポートされていません。 内部で開発され、変数データ変換に使用されるすべての環境の親として機能するユーザー定義環境。 transform_environment = None場合は、代わりに親 revoscalepy.baseenv を持つ新しい "ハッシュ" 環境が使用されます。

blocks_per_read

データ ソースから読み取られたデータのチャンクごとに読み取るブロックの数を指定します。

report_progress

行処理の進行状況に関するレポートのレベルを指定する整数値。

  • 0: 進行状況は報告されません。

  • 1: 処理された行の数が印刷され、更新されます。

  • 2: 処理された行とタイミングが報告されます。

  • 3: 処理された行とすべてのタイミングが報告されます。

詳細

必要な出力量を指定する整数値。 0場合、計算中に詳細な出力は出力されません。 1から4までの整数値により、情報の量が増えます。

compute_context

有効な revoscalepy で指定された、計算が実行されるコンテキストを設定します。RxComputeContext。 現在、ローカルと revoscalepy。RxInSqlServer コンピューティング コンテキストがサポートされています。

アンサンブル

エンレンブリングの制御パラメーター。

返品

トレーニング済みモデルを持つ FastLinear オブジェクト。

Note

このアルゴリズムはマルチスレッドで、データセット全体をメモリにロードしようとはしません。

References

確率的双重座標上昇の拡大

正則化損失最小化のための確率的双重座標上昇法

二項分類の例

'''
Binary Classification.
'''
import numpy
import pandas
from microsoftml import rx_fast_linear, rx_predict
from revoscalepy.etl.RxDataStep import rx_data_step
from microsoftml.datasets.datasets import get_dataset

infert = get_dataset("infert")

import sklearn
if sklearn.__version__ < "0.18":
    from sklearn.cross_validation import train_test_split
else:
    from sklearn.model_selection import train_test_split

infertdf = infert.as_df()
infertdf["isCase"] = infertdf.case == 1
data_train, data_test, y_train, y_test = train_test_split(infertdf, infertdf.isCase)

forest_model = rx_fast_linear(
    formula=" isCase ~ age + parity + education + spontaneous + induced ",
    data=data_train)
    
# RuntimeError: The type (RxTextData) for file is not supported.
score_ds = rx_predict(forest_model, data=data_test,
                     extra_vars_to_write=["isCase", "Score"])
                     
# Print the first five rows
print(rx_data_step(score_ds, number_rows_read=5))

Output:

Automatically adding a MinMax normalization transform, use 'norm=Warn' or 'norm=No' to turn this behavior off.
Beginning processing data.
Rows Read: 186, Read Time: 0, Transform Time: 0
Beginning processing data.
Beginning processing data.
Rows Read: 186, Read Time: 0, Transform Time: 0
Beginning processing data.
Beginning processing data.
Rows Read: 186, Read Time: 0, Transform Time: 0
Beginning processing data.
Using 2 threads to train.
Automatically choosing a check frequency of 2.
Auto-tuning parameters: maxIterations = 8064.
Auto-tuning parameters: L2 = 2.666837E-05.
Auto-tuning parameters: L1Threshold (L1/L2) = 0.
Using best model from iteration 568.
Not training a calibrator because it is not needed.
Elapsed time: 00:00:00.5810985
Elapsed time: 00:00:00.0084876
Beginning processing data.
Rows Read: 62, Read Time: 0, Transform Time: 0
Beginning processing data.
Elapsed time: 00:00:00.0292334
Finished writing 62 rows.
Writing completed.
Rows Read: 5, Total Rows Processed: 5, Total Chunk Time: Less than .001 seconds 
  isCase PredictedLabel     Score  Probability
0   True           True  0.990544     0.729195
1  False          False -2.307120     0.090535
2  False          False -0.608565     0.352387
3   True           True  1.028217     0.736570
4   True          False -3.913066     0.019588

回帰の例

'''
Regression.
'''
import numpy
import pandas
from microsoftml import rx_fast_linear, rx_predict
from revoscalepy.etl.RxDataStep import rx_data_step
from microsoftml.datasets.datasets import get_dataset

attitude = get_dataset("attitude")

import sklearn
if sklearn.__version__ < "0.18":
    from sklearn.cross_validation import train_test_split
else:
    from sklearn.model_selection import train_test_split

attitudedf = attitude.as_df()
data_train, data_test = train_test_split(attitudedf)

model = rx_fast_linear(
    formula="rating ~ complaints + privileges + learning + raises + critical + advance",
    method="regression",
    data=data_train)
    
# RuntimeError: The type (RxTextData) for file is not supported.
score_ds = rx_predict(model, data=data_test,
                     extra_vars_to_write=["rating"])
                     
# Print the first five rows
print(rx_data_step(score_ds, number_rows_read=5))

Output:

Automatically adding a MinMax normalization transform, use 'norm=Warn' or 'norm=No' to turn this behavior off.
Beginning processing data.
Rows Read: 22, Read Time: 0.001, Transform Time: 0
Beginning processing data.
Beginning processing data.
Rows Read: 22, Read Time: 0.001, Transform Time: 0
Beginning processing data.
Beginning processing data.
Rows Read: 22, Read Time: 0, Transform Time: 0
Beginning processing data.
Using 2 threads to train.
Automatically choosing a check frequency of 2.
Auto-tuning parameters: maxIterations = 68180.
Auto-tuning parameters: L2 = 0.01.
Auto-tuning parameters: L1Threshold (L1/L2) = 0.
Using best model from iteration 54.
Not training a calibrator because it is not needed.
Elapsed time: 00:00:00.1114324
Elapsed time: 00:00:00.0090901
Beginning processing data.
Rows Read: 8, Read Time: 0, Transform Time: 0
Beginning processing data.
Elapsed time: 00:00:00.0330772
Finished writing 8 rows.
Writing completed.
Rows Read: 5, Total Rows Processed: 5, Total Chunk Time: Less than .001 seconds 
   rating      Score
0    71.0  72.630440
1    67.0  56.995350
2    67.0  52.958641
3    72.0  80.894539
4    50.0  38.375427

損失関数