microsoftml.rx_fast_linear:带有随机对偶坐标上升的线性模型

Usage

microsoftml.rx_fast_linear()

Description

一种用于线性二元分类和回归的随机双坐标上升(SDCA)优化训练器。

详细信息

rx_fast_linear 是基于随机双坐标上升(SDCA)方法的训练器,这是一种针对凸目标函数的先进优化技术。 由于采用半同步实现支持多线程,该算法可扩展用于大型内存外数据集。 收敛的基础是定期在独立线程中强制执行原始更新和双重更新同步。 还提供了多种损失函数的选择。 SDCA方法结合了逻辑回归和SVM算法的若干最佳特性和功能。 有关SDCA的更多信息,请参阅参考文献部分的引用。

传统的优化算法,如随机梯度下降(SGD),直接优化经验损失函数。 SDCA选择了另一种方法,以优化对偶问题。 对偶损失函数通过每个例子的权重参数化。 在每次迭代中,当从训练数据集读取训练样本时,相应的示例权重会被调整,使对偶损失函数相对于当前样本得到优化。 SDCA不需要学习率来确定步长,而这些步长则不同于各种梯度下降方法。

rx_fast_linear 目前支持三类损耗函数的二元分类:对数损耗、铰链损耗和平滑铰链损耗。 线性回归也支持平方损失函数。 弹性净正则化可以通过和l1_weight参数来指定l2_weight。 注意,这 l2_weight 会影响收敛率。 一般来说,SDCA收 l2_weight敛速度越大。

注意,这是一个 rx_fast_linear 随机和流优化算法。 结果取决于训练数据的顺序。 为了获得可重复的结果,建议将 设shuffleFalsetrain_threads1

Arguments

公式

revoscalepy.rx_formula中描述的公式。 交互术语, F() 目前在 microsoftml 中不受支持。

数据

指定 .xdf 文件或数据帧对象的数据源对象或字符串。

方法

用字符字符串指定模型类型: "binary" 用于默认的二元分类或 "regression" 线性回归。

loss_function

指定用于优化的经验损失函数。 对于二元分类,有以下选项:

  • log_loss:对数损失。 这是默认值。

  • hinge_loss:SVM铰链损失。 其参数表示边距大小。

  • smooth_hinge_loss:光滑的铰接丢失。 其参数表示平滑常数。

对于线性回归,目前支持平方损失 squared_loss 。 当该参数设置为 时,其默认值取决于学习类型:

以下示例将loss_function hinge_loss变为: rx_fast_linear(..., loss_function=hinge_loss())

l1_weight

指定L1正则化权重。 该值必须是非负或 。 如果指定 为“无” ,则根据数据集自动计算实际值。 是默认值。

l2_weight

指定L2正则化权重。 该值必须是非负或 。 如果指定 为“无” ,则根据数据集自动计算实际值。 是默认值。

train_threads

指定可用于运行算法的并发线程数量。 当该参数设置为 时,线程数量根据进程可用的逻辑处理器数量以及数据稀疏度决定。 设置为 以 1 在单线程内运行算法。

convergence_tolerance

指定作为收敛标准的容忍阈值。 它必须在0到1之间。 默认值为 0.1。 如果相对对偶性差距(即对偶性差距与原始损失的比值)低于规定的收敛容差,则该算法被视为收敛。

max_iterations

规定训练迭代次数的上限。 该参数必须为正或 。 如果指定 为“无” ,则根据数据集自动计算实际值。 每次迭代都需要对训练数据进行完整处理。 训练在迭代总数达到规定上限或损失函数收敛时终止,以较早者为准。

洗牌

指定是否洗牌训练数据。 设置为 True 洗牌数据; False 而不是洗牌。 默认值为 True。 SDCA是一种随机优化算法。 如果开启了洗牌,训练数据会在每次迭代中重新洗牌。

check_frequency

计算损失函数后,计算并检查是否收敛的迭代次数。 指定的值必须是正整数或无。 如果 无,则根据数据集自动计算实际值。 否则,例如,如果 checkFrequency = 5 指定了,则计算损失函数,每5次迭代检查收敛性。 损失函数的计算需要对训练数据进行一次单独的完整处理。

规范化

指定使用的自动规范化类型:

  • "Auto":如果需要规范化,则会自动执行。 这是默认选项。

  • "No":不执行规范化。

  • "Yes":执行规范化。

  • "Warn":如果需要规范化,则会显示警告消息,但不执行规范化。

规范化将不同的数据范围重新缩放为标准规模。 特征缩放可确保数据点之间的距离成正比,并使各种优化方法(如梯度下降)的聚合速度要快得多。 如果执行规范化, MaxMin 则使用规范化器。 它以间隔 [a, b] 将值规范化,其中 -1 <= a <= 00 <= b <= 1b - a = 1。 此规范化器通过将零映射到零来保留稀疏性。

ml_transforms

指定要在训练之前对数据执行的 MicrosoftML 转换的列表;如果未执行任何转换,则为 None 。 有关支持的转换,请参阅 >>。 这些转换在任何指定的 Python 转换之后执行。 默认值为

ml_transform_vars

指定要用于 ml_transforms 变量名称的字符向量;如果未使用,则为 None 。 默认值为

row_selection

不支持。 指定数据集中的行(观察值),这些行(观察值)由模型使用数据集(以引号为单位)中的逻辑变量的名称,或使用数据集中的变量的逻辑表达式。 例如:

  • row_selection = "old" 将仅使用变量 old 值所在的 True观察值。

  • row_selection = (age > 20) & (age < 65) & (log(income) > 10)仅使用变量值age介于 20 和 65 之间的观察值,而变量的值logincome大于 10。

在处理任何数据转换后执行行选择(请参阅参数 transformstransform_function)。 与所有表达式一样, row_selection 可以使用函数在函数调用 expression 外部定义。

变换

不支持。 表示第一轮变量转换的窗体的表达式。 与所有表达式一样, transforms 可以使用函数在函数调用row_selection外部定义(或expression)。

transform_objects

不支持。 一个命名列表,其中包含可由 <a0/> 和引用的对象。

transform_function

变量转换函数。

transform_variables

转换函数所需的输入数据集变量的字符向量。

transform_packages

不支持。 一个字符向量,用于指定其他 Python 包(在指定 RxOptions.get_option("transform_packages")包之外)可供使用并预加载,以便在变量转换函数中使用。 例如,在 revoscalepy 函数中显式定义的函数通过参数transformstransform_function参数或通过参数formularow_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 计算上下文。

集成

用于集成的控制参数。

Returns

具有 FastLinear 已训练模型的对象。

注释

该算法是多线程的,不会尝试将整个数据集加载到内存中。

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

输出:

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

输出:

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

损失函数