microsoftml.rx_fast_trees: ブースティング ツリー
使用法
microsoftml.rx_fast_trees(formula: str,
data: [revoscalepy.datasource.RxDataSource.RxDataSource,
pandas.core.frame.DataFrame], method: ['binary',
'regression'] = 'binary', num_trees: int = 100,
num_leaves: int = 20, learning_rate: float = 0.2,
min_split: int = 10, example_fraction: float = 0.7,
feature_fraction: float = 1, split_fraction: float = 1,
num_bins: int = 255, first_use_penalty: float = 0,
gain_conf_level: float = 0, unbalanced_sets: bool = False,
train_threads: int = 8, random_seed: int = None,
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 高速ツリー
説明
rx_fast_trees は FastRank の実装です。 FastRank は、MART 勾配ブースティング アルゴリズムの効率的な実装です。 勾配ブースティングは、回帰問題のための機械学習手法です。 事前定義された損失関数を使用して各段階のエラーを計測し、次の段階でそれを修正するという方法で各回帰ツリーを段階的に構築します。 したがって、この予測モデルは実際、弱い予測モデルのアンサンブルになります。 回帰の問題では、ブースティングによってこのような一連のツリーが段階的に構築され、任意の微分可能な損失関数を使用して最適なツリーが選択されます。
MART では回帰ツリーのアンサンブルを学習します。これは、そのリーフにスカラー値を持つデシジョン ツリーです。 デシジョン (または回帰) ツリーはバイナリ ツリーのようなフロー チャートです。内部の各ノードで、入力されたいずれかの特徴の値に基づいて、2 つの子ノードのうちでいずれを継続するかを決定します。 各リーフ ノードでは、値が返されます。 内部ノードで、意思決定は、テスト "x <= v"
に基づいて行われます。ここで、x
は入力サンプルの特徴の値で、v
はこの特徴の有効な値の 1 つです。 回帰ツリーによって生成することができる関数はすべて区分的定数関数です。
ツリーのアンサンブルは、損失関数の勾配に近似する回帰ツリーを各ステップで計算し、それを新しいツリーの損失を最小限に抑える係数を付けて前のツリーに追加することで生成されます。 特定のインスタンスで MART によって生成されるアンサンブルの出力は、ツリー出力の合計です。
二項分類問題の場合、出力は何らかの調整形式を使用して確率に変換されます。
回帰問題の場合、出力は関数の予測された値です。
順位付け問題の場合、インスタンスはアンサンブルの出力値で並べ替えられます。
method
が "regression"
に設定されている場合は、FastTree の回帰バージョンが使用されます。
"ranking"
に設定されている場合は、FastTree の順位付けバージョンが使用されます。 順位付けの場合、インスタンスはツリー アンサンブルの出力によって並べ替える必要があります。 これらのバージョンの設定の唯一の違いは、分類にのみ必要な調整設定です。
引数
formula
formula は revoscalepy.rx_formula で記述されます。
相互作用項と F()
は、現在、microsoftml ではサポートされていません。
data
.xdf ファイルまたはデータ フレーム オブジェクトを指定するデータ ソース オブジェクトまたは文字列。
method
高速ツリーの種類を指定する文字列。既定の高速ツリー二項分類の場合は "binary"
、高速ツリー回帰の場合は "regression"
です。
num_trees
アンサンブルで作成するデシジョン ツリーの総数を指定します。作成するデシジョン ツリーを増やすと、カバレッジが向上する可能性がありますが、トレーニング時間は増加します。 既定値は 100 です。
num_leaves
ツリーに作成できるリーフ (終端ノード) の最大数。 値を大きくすると、ツリーのサイズが大きくなって精度が向上する可能性がありますが、オーバーフィットが発生し、トレーニング時間が長くなるリスクがあります。 既定値は 20 です。
learning_rate
学習プロセスの各ステップで、勾配の方向に対して実行されるステップのサイズを決定します。 これにより、学習器がどの程度の速さ (遅さ) で最適解に収束するかが決まります。 ステップ サイズが大きすぎると、最適解から離れていってしまう可能性があります。 ステップ サイズが小さすぎると、トレーニングが最適解に収束するまでの時間が長くなります。
min_split
リーフを形成するために必要なトレーニング インスタンスの最小数。 つまり、サブサンプリングされたデータから、回帰ツリーのリーフで許可されるドキュメントの最小数です。 "分割" とは、ツリー (ノード) の各レベルの特徴がランダムに分割されることを意味します。 既定値は 10 です。インスタンスが重み付けされた場合でも、インスタンスの数だけがカウントされます。
example_fraction
各ツリーに使用するランダムに選択されたインスタンスの割合。 既定値は 0.7 です。
feature_fraction
各ツリーに使用するランダムに選択された特徴の割合。 既定値は 1 です。
split_fraction
各分割に使用するランダムに選択された特徴の割合。 既定値は 1 です。
num_bins
特徴ごとの個別の値 (ビン) の最大数。 特徴の値が指定された数よりも小さい場合、それぞれの値が独自のビンに配置されます。 値が多い場合、アルゴリズムによって numBins
個のビンが作成されます。
first_use_penalty
特徴の初回使用ペナルティ係数。 これは、ツリーの作成時に新しい特徴を使用するとペナルティが発生する正則化の形式です。 この値を大きくすると、多数の特徴を使用しないツリーが作成されます。 既定値は 0 です。
gain_conf_level
ツリー フィット ゲイン信頼度要件 ([0, 1) の範囲内である必要があります)。 既定値は 0 です。
unbalanced_sets
True
の場合、不均衡セットに最適化された導関数が使用されます。
type
が "binary"
に等しい場合にのみ適用されます。
既定値は False
です。
train_threads
トレーニングで使用するスレッドの数。 既定値は 8 です。
random_seed
ランダム シードを指定します。 既定値は None です。
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
アンサンブルの制御パラメーター。
戻り値
トレーニング済みモデルを持つ FastTrees
オブジェクト。
Note
このアルゴリズムはマルチスレッドであり、常にデータ セット全体をメモリに読み込もうとします。
関連項目
リファレンス
Wikipedia: 勾配ブースティング (勾配ツリー ブースティング)
二項分類の例
'''
Binary Classification.
'''
import numpy
import pandas
from microsoftml import rx_fast_trees, 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)
trees_model = rx_fast_trees(
formula=" isCase ~ age + parity + education + spontaneous + induced ",
data=data_train)
# RuntimeError: The type (RxTextData) for file is not supported.
score_ds = rx_predict(trees_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:
Not adding a normalizer.
Making per-feature arrays
Changing data from row-wise to column-wise
Beginning processing data.
Rows Read: 186, Read Time: 0, Transform Time: 0
Beginning processing data.
Processed 186 instances
Binning and forming Feature objects
Reserved memory for tree learner: 7020 bytes
Starting to train ...
Not training a calibrator because it is not needed.
Elapsed time: 00:00:00.0949161
Elapsed time: 00:00:00.0112103
Beginning processing data.
Rows Read: 62, Read Time: 0.001, Transform Time: 0
Beginning processing data.
Elapsed time: 00:00:00.0230457
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 -4.722279 0.131369
1 False False -11.550012 0.009757
2 False False -7.312314 0.050935
3 True True 3.889991 0.825778
4 False False -6.361800 0.072782
回帰の例
'''
Regression.
'''
import numpy
import pandas
from microsoftml import rx_fast_trees, rx_predict
from revoscalepy.etl.RxDataStep import rx_data_step
from microsoftml.datasets.datasets import get_dataset
airquality = get_dataset("airquality")
import sklearn
if sklearn.__version__ < "0.18":
from sklearn.cross_validation import train_test_split
else:
from sklearn.model_selection import train_test_split
airquality = airquality.as_df()
######################################################################
# Estimate a regression fast forest
# Use the built-in data set 'airquality' to create test and train data
df = airquality[airquality.Ozone.notnull()]
df["Ozone"] = df.Ozone.astype(float)
data_train, data_test, y_train, y_test = train_test_split(df, df.Ozone)
airFormula = " Ozone ~ Solar_R + Wind + Temp "
# Regression Fast Forest for train data
ff_reg = rx_fast_trees(airFormula, method="regression", data=data_train)
# Put score and model variables in data frame
score_df = rx_predict(ff_reg, data=data_test, write_model_vars=True)
print(score_df.head())
# Plot actual versus predicted values with smoothed line
# Supported in the next version.
# rx_line_plot(" Score ~ Ozone ", type=["p", "smooth"], data=score_df)
Output:
'unbalanced_sets' ignored for method 'regression'
Not adding a normalizer.
Making per-feature arrays
Changing data from row-wise to column-wise
Beginning processing data.
Rows Read: 87, Read Time: 0.001, Transform Time: 0
Beginning processing data.
Warning: Skipped 4 instances with missing features during training
Processed 83 instances
Binning and forming Feature objects
Reserved memory for tree learner: 21528 bytes
Starting to train ...
Not training a calibrator because it is not needed.
Elapsed time: 00:00:00.0512720
Elapsed time: 00:00:00.0094435
Beginning processing data.
Rows Read: 29, Read Time: 0, Transform Time: 0
Beginning processing data.
Elapsed time: 00:00:00.0229873
Finished writing 29 rows.
Writing completed.
Solar_R Wind Temp Score
0 115.0 7.4 76.0 26.003876
1 307.0 12.0 66.0 18.057747
2 230.0 10.9 75.0 10.896211
3 259.0 9.7 73.0 13.726607
4 92.0 15.5 84.0 37.972855