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
は確率的なストリーミング最適化アルゴリズムであることに注意してください。 結果はトレーニング データの順序によって異なります。 再現可能な結果を得るには、shuffle
を False
に、train_threads
を 1
に設定することをお勧めします。
引数
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 に設定されている場合、既定値は学習の種類によって異なります。
log_loss
: 二項分類の場合。線形回帰の場合は
squared_loss
。
次の例では、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_text
、categorical
、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 の間で、変数income
のlog
の値が 10 を超える観測値のみを使用します。
行の選択は、データ変換を処理した後に実行されます (引数 transforms
または transform_function
を参照してください)。 すべての式と同様に、row_selection
は、expression
関数を使用して関数呼び出しの外部で定義できます。
変換
サポートされていません。 変数変換の最初のラウンドを表すフォームの式。 すべての式と同様に、transforms
(または row_selection
) は、expression
関数を使用して関数呼び出しの外部で定義できます。
transform_objects
サポートされていません。
transforms
、transform_function
、row_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