microsoftml.rx_logistic_regression: ロジスティック回帰

使用法

microsoftml.rx_logistic_regression(formula: str,
    data: [revoscalepy.datasource.RxDataSource.RxDataSource,
    pandas.core.frame.DataFrame], method: ['binary',
    'multiClass'] = 'binary', l2_weight: float = 1,
    l1_weight: float = 1, opt_tol: float = 1e-07,
    memory_size: int = 20, init_wts_diameter: float = 0,
    max_iterations: int = 2147483647,
    show_training_stats: bool = False, sgd_init_tol: float = 0,
    train_threads: int = None, dense_optimizer: bool = False,
    normalize: ['No', 'Warn', 'Auto', 'Yes'] = 'Auto',
    ml_transforms: list = None, ml_transform_vars: list = None,
    row_selection: str = None, transforms: dict = None,
    transform_objects: dict = None, transform_function: str = None,
    transform_variables: list = None,
    transform_packages: list = None,
    transform_environment: dict = None, blocks_per_read: int = None,
    report_progress: int = None, verbose: int = 1,
    ensemble: microsoftml.modules.ensemble.EnsembleControl = None,
    compute_context: revoscalepy.computecontext.RxComputeContext.RxComputeContext = None)

説明

Machine Learning ロジスティック回帰

説明

ロジスティック回帰は、ロジスティック分布を持つと見なされる 1 つ以上の独立変数とのリレーションシップから、カテゴリ従属変数の値を予測するために使用される分類方法です。 従属変数に有効な値が 2 つしかない場合 (成功/失敗)、ロジスティック回帰は二項です。 従属変数に 3 つ以上の値が含まれている場合 (血液型診断テストの結果)、ロジスティック回帰は多項です。

rx_logistic_regression で使用される最適化手法は、限定メモリ Broyden-Fletcher-Goldfarb-Shanno (L-BFGS) です。 L-BFGS アルゴリズムと通常の BFGS アルゴリズムでは、どちらも準ニュートン法を使用して、ステップを計算するためにニュートン法で使用される式の中で計算量の多いヘッセ行列を推定します。 ただし、L-BFGS 近似では、限られた量のメモリのみを使用して次のステップ方向を計算します。これにより、多数の変数に関する問題に特に適しています。 memory_size パラメーターでは、次のステップの計算で使用するために保存する過去の位置と傾きの数を指定します。

この学習器では、L1 (なげなわ) と L2 (ねじ山) の正則化の線形組み合わせであるエラスティック ネット型の正則化を使用できます。 正則化とは、データを補完するための情報を提供する制約を課すことで、不適切に表現された問題を扱いやすく表示でき、極端な係数の値を備えるモデルにペナルティを与えることでオーバーフィットを防止する手法です。 これにより、バイアスと変位のトレードオフに最適な複雑さを選択して、学習したモデルの一般化を向上させることができます。 正則化は、仮説の誤りに対し、係数値に関連付けられているペナルティを加算することによって機能します。 極端な係数の値を持った正確なモデルにはより大きなペナルティが与えられる一方、相対的に値が控えめで正確でないモデルに与えられるペナルティは小さくなります。 L1 と L2 の正則化には、特定の点で補完的に使用されるさまざまな効果と用途があります。

  • l1_weight: 高次元のデータを扱う際に、疎なモデルに適用できます。 比較的重要ではない特徴に関連する小さな重みを 0 に引き寄せます。

  • l2_weight: スパースでないデータに適しています。 大きな重みを 0 に引き寄せます。

ねじ山のペナルティを正則化に追加すると、いくらかのなげなわの制限が解消されます。 たとえば予測子の数がサンプル サイズを超える場合などに、予測精度を向上させることができます。 x = l1_weight かつ y = l2_weight である場合、正則化項の線形包が ax + by = c で定義されます。 x と y の既定値は両方とも 1 です。 積極的な正則化では、モデルから重要な変数を除外することで予測能力に悪影響を与える可能性があります。 そのため、ロジスティック回帰モデルのパフォーマンスを向上させるために、正則化パラメーターに最適な値を選択することが重要です。

引数

formula

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

data

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

method

ロジスティック回帰の種類を指定する文字列。既定の二項分類ロジスティック回帰の場合は "binary"、多項ロジスティック回帰の場合は "multiClass"

l2_weight

L2 正則化の重み。 値は 0 以上である必要があり、既定値は 1 に設定されています。

l1_weight

L1 正則化の重み。 値は 0 以上である必要があり、既定値は 1 に設定されています。

opt_tol

オプティマイザーの収束のしきい値。 イテレーション間の改善がしきい値を下回った場合に、アルゴリズムが終了して現在のモデルが返されます。 値が小さいほど低速ですが、精度は高くなります。 既定値は 1e-07 です。

memory_size

L-BFGS のメモリ サイズ。次のステップの計算用に保存する過去の位置と傾きの数を指定します。 この最適化パラメーターによって、次のステップの規模と方向の計算に使用されるメモリ量が制限されます。 指定するメモリ量を小さくすると、トレーニングにかかる時間は短縮されますが、正確さが低下します。 1 以上である必要があり、既定値は 20 です。

max_iterations

イテレーションの最大数を設定します。 この数のステップを実行すると、収束条件を満たしていなくてもアルゴリズムは停止します。

show_training_stats

トレーニング データの統計とトレーニング済みモデルを表示する場合は True、それ以外の場合は False を指定します。 既定値は False です。 モデルの統計の詳細については、summary.ml_model() を参照してください。

sgd_init_tol

確率的勾配降下法 (SGD) を使用して初期パラメーターを検索する場合は、0 より大きい数値に設定します。 0 以外の値を設定すると、収束を決定するために SGD で使用される許容範囲が指定されます。 既定値は 0 であり、SGD を使用しないことを指定します。

init_wts_diameter

初期重みの値の範囲を指定する初期の重みの直径を設定します。 これらの重みは、この範囲内からランダムに初期化されます。 たとえば、直径が d に指定されている場合、重みは -d/2d/2 の間で一様に分布します。 既定値は 0 で、すべての重みが 0 に初期化されることを指定します。

train_threads

モデルのトレーニングに使用するスレッドの数。 これは、コンピューターのコア数に設定する必要があります。 L-BFGS マルチスレッドでは、データ セットをメモリに読み込もうとすることに注意してください。 メモリ不足の問題が発生した場合は、train_threads1 に設定してマルチスレッド処理をオフにします。 None が指定された場合、使用するスレッドの数は内部的に決定されます。 既定値は None です。

dense_optimizer

True の場合、内部最適化ベクターを強制的に高密度化します。 False の場合、ロジスティック回帰オプティマイザーで適切と見なされたスパースまたは高密度の内部状態を使用できるようにします。 denseOptimizerTrue に設定するには、内部オプティマイザーで高密度の内部状態を使用する必要があります。これにより、大きな問題が発生した場合に、ガベージ コレクターの負荷を軽減することができます。

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

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

戻り値

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

Note

このアルゴリズムでは、train_threads > 1 (マルチスレッド) の場合、データ セット全体をメモリに読み込もうとします。

関連項目

rx_predict

リファレンス

Wikipedia: L-BFGS

Wikipedia: ロジスティック回帰

L1 正規化ログ線形モデルのスケーラブルなトレーニング

テスト実行 - 機械学習向けの L1 および L2 正規化

二項分類の例

'''
Binary Classification.
'''
import numpy
import pandas
from microsoftml import rx_logistic_regression, 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)

model = rx_logistic_regression(
    formula=" isCase ~ age + parity + education + spontaneous + induced ",
    data=data_train)

print(model.coef_)
    
# RuntimeError: The type (RxTextData) for file is not supported.
score_ds = rx_predict(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.001, Transform Time: 0
Beginning processing data.
Beginning processing data.
Rows Read: 186, Read Time: 0, Transform Time: 0
Beginning processing data.
LBFGS multi-threading will attempt to load dataset into memory. In case of out-of-memory issues, turn off multi-threading by setting trainThreads to 1.
Beginning optimization
num vars: 6
improvement criterion: Mean Improvement
L1 regularization selected 5 of 6 weights.
Not training a calibrator because it is not needed.
Elapsed time: 00:00:00.0646405
Elapsed time: 00:00:00.0083991
OrderedDict([('(Bias)', -1.2366217374801636), ('spontaneous', 1.9391206502914429), ('induced', 0.7497404217720032), ('parity', -0.31517016887664795), ('age', -3.162723260174971e-06)])
Beginning processing data.
Rows Read: 62, Read Time: 0, Transform Time: 0
Beginning processing data.
Elapsed time: 00:00:00.0287290
Finished writing 62 rows.
Writing completed.
Rows Read: 5, Total Rows Processed: 5, Total Chunk Time: 0.001 seconds 
  isCase PredictedLabel     Score  Probability
0  False          False -1.341681     0.207234
1   True           True  0.597440     0.645070
2  False           True  0.544912     0.632954
3  False          False -1.289152     0.215996
4  False          False -1.019339     0.265156

多クラス分類の例

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

iris = get_dataset("iris")

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

irisdf = iris.as_df()
irisdf["Species"] = irisdf["Species"].astype("category")
data_train, data_test, y_train, y_test = train_test_split(irisdf, irisdf.Species)

model = rx_logistic_regression(
    formula="  Species ~ Sepal_Length + Sepal_Width + Petal_Length + Petal_Width ",
    method="multiClass",
    data=data_train)

print(model.coef_)
    
# RuntimeError: The type (RxTextData) for file is not supported.
score_ds = rx_predict(model, data=data_test,
                     extra_vars_to_write=["Species", "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: 112, Read Time: 0, Transform Time: 0
Beginning processing data.
Beginning processing data.
Rows Read: 112, Read Time: 0, Transform Time: 0
Beginning processing data.
Beginning processing data.
Rows Read: 112, Read Time: 0, Transform Time: 0
Beginning processing data.
LBFGS multi-threading will attempt to load dataset into memory. In case of out-of-memory issues, turn off multi-threading by setting trainThreads to 1.
Beginning optimization
num vars: 15
improvement criterion: Mean Improvement
L1 regularization selected 9 of 15 weights.
Not training a calibrator because it is not needed.
Elapsed time: 00:00:00.0493224
Elapsed time: 00:00:00.0080558
OrderedDict([('setosa+(Bias)', 2.074636697769165), ('versicolor+(Bias)', 0.4899507164955139), ('virginica+(Bias)', -2.564580202102661), ('setosa+Petal_Width', -2.8389241695404053), ('setosa+Petal_Length', -2.4824044704437256), ('setosa+Sepal_Width', 0.274869441986084), ('versicolor+Sepal_Width', -0.2645561397075653), ('virginica+Petal_Width', 2.6924400329589844), ('virginica+Petal_Length', 1.5976412296295166)])
Beginning processing data.
Rows Read: 38, Read Time: 0, Transform Time: 0
Beginning processing data.
Elapsed time: 00:00:00.0331861
Finished writing 38 rows.
Writing completed.
Rows Read: 5, Total Rows Processed: 5, Total Chunk Time: 0.001 seconds 
      Species   Score.0   Score.1   Score.2
0   virginica  0.044230  0.364927  0.590843
1      setosa  0.767412  0.210586  0.022002
2      setosa  0.756523  0.221933  0.021543
3      setosa  0.767652  0.211191  0.021157
4  versicolor  0.116369  0.498615  0.385016