microsoftml.rx_fast_linear: 確率的双対座標上昇法を使用した線形モデル

使用法

microsoftml.rx_fast_linear()

説明

線形二項分類および回帰用の確率的双対座標上昇法 (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 に設定することをお勧めします。

引数

formula

formula は revoscalepy.rx_formula で記述されます。 相互作用項と F() は、現在、microsoftml ではサポートされていません。

data

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

method

文字列を使用してモデルの種類を指定します: 既定の二項分類の場合は "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 正則化の重みを指定します。 この値は、負以外または None とする必要があります。 None を指定した場合、実際の値はデータ セットに基づいて自動的に計算されます。 None が既定値です。

l2_weight

L2 正則化の重みを指定します。 この値は、負以外または None とする必要があります。 None を指定した場合、実際の値はデータ セットに基づいて自動的に計算されます。 None が既定値です。

train_threads

アルゴリズムを実行するために使用できる同時実行スレッドの数を指定します。 このパラメーターが None に設定されている場合、使用されるスレッドの数は、プロセスで使用できる論理プロセッサの数と、データの密度に基づいて決定されます。 アルゴリズムを 1 つのスレッドで実行するには、1 に設定します。

convergence_tolerance

収束条件として使用される許容しきい値を指定します。 0 から 1 の範囲である必要があります。 既定値は 0.1 です。 このアルゴリズムは、相対的な双対ギャップ (双対ギャップとプライマル損失の間の比率) が指定した収束許容値を下回った場合に、収束していると見なされます。

max_iterations

トレーニングの反復数の上限を指定します。 このパラメーターは正の値または None にする必要があります。 None を指定した場合、実際の値はデータ セットに基づいて自動的に計算されます。 反復のたびにトレーニング データを完全に渡す必要があります。 反復の合計数が指定した上限に達した後、または損失関数が収束したときのいずれか早い方でトレーニングが終了します。

シャッフル

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

check_frequency

損失関数が計算され、収束したかどうかを判断するためにチェックされるまでの反復回数。 正の整数または None を指定する必要があります。 None の場合、実際の値はデータ セットに基づいて自動的に計算されます。 それ以外の場合、たとえば checkFrequency = 5 を指定すると、5 回反復するごとに損失関数が計算され、収束がチェックされます。 損失関数の計算のためには、個別にトレーニング データを完全に渡す必要があります。

normalize

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

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

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

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

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

正規化では、異なるデータ範囲が標準スケールに再スケーリングされます。 特徴のスケーリングにより、データ ポイント間の距離が比例し、勾配降下などのさまざまな最適化方法がはるかに高速に収束するようになります。 正規化が実行される場合は、MaxMin ノーマライザーが使用されます。 区間 [a, b] で値を正規化します。ただし、-1 <= a <= 0 かつ 0 <= b <= 1 かつ b - a = 1 です。 このノーマライザーでは、0 から 0 にマッピングすることで、低密度を維持します。

ml_transforms

トレーニング前にデータに対して実行される MicrosoftML 変換の一覧を指定します。変換を実行しない場合は None を指定します。 サポートされている変換については、featurize_textcategoricalcategorical_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 の間で、変数 incomelog の値が 10 を超える観測値のみを使用します。

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

変換

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

transform_objects

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

transform_function

変数変換関数。

transform_variables

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

transform_packages

サポートされていません。 変数変換関数で使用するために事前に読み込まれる追加の Python パッケージ (RxOptions.get_option("transform_packages") で指定されているもの以外) を指定する文字ベクトル。 たとえば、transforms および transform_function 引数を使用して revoscalepy 関数で明示的に定義されているものや、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: 処理された行とすべてのタイミングがレポートされます。

verbose

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

compute_context

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

ensemble

アンサンブルの制御パラメーター。

戻り値

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

Note

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

関連項目

hinge_loss, log_loss, smoothed_hinge_loss, squared_loss, rx_predict

リファレンス

確率的双対座標上昇法のスケールアップ

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

二項分類の例

'''
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

損失関数