rxFastLinear:快速线性模型 - 随机双坐标上升
用于线性二元分类和回归的随机双坐标上升 (SDCA) 优化训练器。
rxFastLinear
是基于随机双坐标上升 (SDCA) 方法的训练器,这是一种用于凸目标函数的先进的优化技术。 由于支持多线程的半异步实现,该算法可进行缩放以用于内存不足的大型数据集。
原始更新和双重更新都在一个单独的线程中进行。 此外还有多种损失函数可供选择。 SDCA 方法结合了逻辑回归和 SVM 算法的几个最佳属性和功能。
有关 SDCA 的详细信息,请参阅参考部分中的引文。
传统的优化算法(如随机梯度下降 (SGD))可以直接优化经验损失函数。 SDCA 选择了一种不同的方法来优化对偶问题。 双重损失函数由每个示例的权重进行参数化。 在每次迭代中,当训练数据集中的训练示例被读取时,相应示例的权重会调整,从而针对当前示例优化双重损失函数。 SDCA 无需学习速率也可确定各种梯度下降方法所需的步长。
rxFastLinear
目前支持三类损失函数的二元分类:对数损失、合页损失和平滑合页损失。
线性回归还支持平方损失函数。 可以通过 l2Weight
和 l1Weight
参数指定弹性网络正则化。 请注意,l2Weight
对收敛速度有影响。 通常,l2Weight
越大,SDCA 收敛速度越快。
请注意,rxFastLinear
是一种随机的流式处理优化算法。 结果取决于训练数据的顺序。 若要获得可重现的结果,建议将 shuffle
设置为 FALSE
,并将 trainThreads
设置为 1
。
用法
rxFastLinear(formula = NULL, data, type = c("binary", "regression"),
lossFunction = NULL, l2Weight = NULL, l1Weight = NULL,
trainThreads = NULL, convergenceTolerance = 0.1, maxIterations = NULL,
shuffle = TRUE, checkFrequency = NULL, normalize = "auto",
mlTransforms = NULL, mlTransformVars = NULL, rowSelection = NULL,
transforms = NULL, transformObjects = NULL, transformFunc = NULL,
transformVars = NULL, transformPackages = NULL, transformEnvir = NULL,
blocksPerRead = rxGetOption("blocksPerRead"),
reportProgress = rxGetOption("reportProgress"), verbose = 1,
computeContext = rxGetOption("computeContext"),
ensemble = ensembleControl(), ...)
参数
formula
rxFormula 中所述的公式。 MicrosoftML 目前不支持交互项和 F()
。
data
指定 .xdf 文件或数据帧对象的数据源对象或字符串。
type
使用字符串指定模型类型:"binary"
用于默认二元分类,而 "regression"
用于线性回归。
lossFunction
指定要优化的经验损失函数。 对于二元分类,可以选择以下选项:
- logLoss:对数损失。 这是默认值。
- hingeLoss:SVM 合页损失。 该函数的参数表示差额大小。
-
smoothHingeLoss:平滑合页损失。 该函数的参数表示平滑常数。
对于线性回归,目前支持平方损失 squaredLoss。 如果将此参数设置为NULL
,其默认值取决于学习类型: - logLoss 用于二元分类。
- squaredLoss 用于线性回归。
l2Weight
指定 L2 正则化权重。 该值必须为非负数或 NULL
。 如果指定了 NULL
,将根据数据集自动计算实际值。 默认值为 NULL
。
l1Weight
指定 L1 正则化权重。 该值必须为非负数或 NULL
。 如果指定了 NULL
,将根据数据集自动计算实际值。 默认值为 NULL
。
trainThreads
指定可用于运行算法的并发线程数。 如果将此参数设置为 NULL
,则根据进程可用的逻辑处理器数以及数据的稀疏度来确定所使用的线程数。 如果要在单个线程中运行算法,请将其设置为 1
。
convergenceTolerance
指定用作收敛标准的容差阈值。 该值必须介于 0 和 1 之间。 默认值是 0.1
。 如果相对对偶间隙(对偶间隙与原始损失之间的比率)低于指定的收敛容差,则认为该算法已经收敛。
maxIterations
指定训练迭代次数的上限。 该参数值必须为正数或 NULL
。 如果指定了 NULL
,将根据数据集自动计算实际值。 每次迭代都需要对训练数据进行一次完整传递。 训练在总迭代次数达到指定上限或损失函数收敛后终止(以较早发生者为准)。
shuffle
指定是否随机选择训练数据。 如果要随机选择训练数据,请将其设置为 TRUE
;否则设置为 FALSE
。 默认值是 TRUE
。 SDCA 是一种随机优化算法。 如果启用随机选择,则每次迭代时都会随机选择训练数据。
checkFrequency
迭代次数,迭代后计算和检查损失函数以确定是否收敛。 指定的值必须是正整数或 NULL
。 如果指定为 NULL
,则根据数据集自动计算实际值。 否则,例如,如果指定了 checkFrequency = 5
,则每 5 次迭代计算一次损失函数并检查收敛性。 若要计算损失函数,则需要对训练数据执行单独的完整传递。
normalize
指定使用的自动规范化类型:
-
"auto"
:如果需要规范化,会自动执行规范化。 这是默认值。 -
"no"
:不执行任何规范化。 -
"yes"
:执行规范化。 -
"warn"
:如果需要规范化,则会显示一条警告消息,但不执行规范化。
规范化将不同的数据范围重新缩放为标准规模。 特征缩放可确保数据点之间的距离成比例,使各种优化方法(如梯度下降)的收敛速度更快。 如果执行规范化,则使用MaxMin
规范化程序。 它对区间 [a, b] 中的值进行规范化,其中-1 <= a <= 0
、0 <= b <= 1
并且b - a = 1
。 此规范化程序通过将 0 映射到 0 来保持稀疏度。
mlTransforms
指定在训练前要对数据执行的 MicrosoftML 转换的列表;如果不需要执行任何转换,则指定为 NULL
。 有关支持的转换,请参阅 featurizeText、categorical 和 categoricalHash。 这些转换在任何指定的 R 转换之后执行。 默认值是 NULL
。
mlTransformVars
指定要在 mlTransforms
中使用的变量名称的字符向量;如果不使用任何变量名称,则指定为 NULL
。 默认值是 NULL
。
rowSelection
使用数据集中的逻辑变量名称(带引号)或通过使用数据集中的变量的逻辑表达式指定模型要使用的数据集中的行(观察值)。 例如,rowSelection = "old"
将仅使用变量 old
的值为 TRUE
的观察值。
rowSelection = (age > 20) & (age < 65) & (log(income) > 10)
仅使用 age
变量值介于 20 和 65 之间且 income
变量的 log
值大于 10 的观察值。 在处理任何数据转换之后执行行选择(请参阅参数 transforms
或 transformFunc
)。 与所有表达式一样,可以使用表达式函数在函数调用之外定义 rowSelection
。
transforms
表示第一轮变量转换的窗体 list(name = expression, ``...)
的表达式。 与所有表达式一样,可以使用表达式函数在函数调用之外定义 transforms
(或 rowSelection
)。
transformObjects
一个命名列表,其中包含可由 transforms
、transformsFunc
和 rowSelection
引用的对象。
transformFunc
变量转换函数。 有关详细信息,请参阅 rxTransform。
transformVars
转换函数所需的输入数据集变量的字符向量。 有关详细信息,请参阅 rxTransform。
transformPackages
一个字符向量,用于指定将提供和预加载以在变量转换函数中使用的附加 R 包(在 rxGetOption("transformPackages")
中指定的包之外)。 例如,在 RevoScaleR 函数中通过 transforms
和 transformFunc
参数显式定义的那些包,或者通过 formula
或 rowSelection
参数隐式定义的包。
transformPackages
参数也可能为 NULL
,表示未预加载 rxGetOption("transformPackages")
以外的包。
transformEnvir
用户定义环境,充当内部开发并用于变量数据转换的所有环境的父级。 如果为 transformEnvir = NULL
,则改用具有父级 baseenv()
的新“哈希”环境。
blocksPerRead
为从数据源读取的每个数据块指定要读取的块数。
reportProgress
一个整数值,指定行处理进度的报告级别:
-
0
:不报告进度。 -
1
:打印并更新已处理的行数。 -
2
:报告已处理的行数和计时。 -
3
:报告已处理的行数和所有计时。
verbose
一个整数值,指定需要的输出量。 如果为 0
,则计算期间不会打印详细输出。 从 1
到 4
的整数值表示提供的信息量逐步增加。
computeContext
设置执行计算的上下文,使用有效的 RxComputeContext 指定。 目前支持本地和 RxInSqlServer 计算上下文。
ensemble
控制用于集成的参数。
...
要直接传递到 Microsoft 计算引擎的其他参数。
值
rxFastLinear
:具有已训练模型的 rxFastLinear
对象。
FastLinear
:快速线性训练程序的类 maml
的学习器规范对象。
备注
该算法是多线程的,不会尝试将整个数据集加载到内存中。
作者
Microsoft Corporation Microsoft Technical Support
参考
Scaling Up Stochastic Dual Coordinate Ascent
Stochastic Dual Coordinate Ascent Methods for Regularized Loss Minimization
另请参阅
logLoss、hingeLoss、smoothHingeLoss、squaredLoss、rxFastTrees、rxFastForest、rxLogisticRegression、rxNeuralNet、rxOneClassSvm、featurizeText、categorical、categoricalHash、rxPredict.mlModel。
示例
# Train a binary classification model with rxFastLinear
res1 <- rxFastLinear(isCase ~ age + parity + education + spontaneous + induced,
transforms = list(isCase = case == 1),
data = infert,
type = "binary")
# Print a summary of the model
summary(res1)
# Score to a data frame
scoreDF <- rxPredict(res1, data = infert,
extraVarsToWrite = "isCase")
# Compute and plot the Radio Operator Curve and AUC
roc1 <- rxRoc(actualVarName = "isCase", predVarNames = "Probability", data = scoreDF)
plot(roc1)
rxAuc(roc1)
#########################################################################
# rxFastLinear Regression
# Create an xdf file with the attitude data
myXdf <- tempfile(pattern = "tempAttitude", fileext = ".xdf")
rxDataStep(attitude, myXdf, rowsPerRead = 50, overwrite = TRUE)
myXdfDS <- RxXdfData(file = myXdf)
attitudeForm <- rating ~ complaints + privileges + learning +
raises + critical + advance
# Estimate a regression model with rxFastLinear
res2 <- rxFastLinear(formula = attitudeForm, data = myXdfDS,
type = "regression")
# Score to data frame
scoreOut2 <- rxPredict(res2, data = myXdfDS,
extraVarsToWrite = "rating")
# Plot the rating versus the score with a regression line
rxLinePlot(rating~Score, type = c("p","r"), data = scoreOut2)
# Clean up
file.remove(myXdf)