-
Notifications
You must be signed in to change notification settings - Fork 28.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[MINOR][SPARKR][ML] Joint coefficients with intercept for SparkR linear SVM summary. #18035
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -46,15 +46,16 @@ setClass("MultilayerPerceptronClassificationModel", representation(jobj = "jobj" | |
#' @note NaiveBayesModel since 2.0.0 | ||
setClass("NaiveBayesModel", representation(jobj = "jobj")) | ||
|
||
#' linear SVM Model | ||
#' Linear SVM Model | ||
#' | ||
#' Fits an linear SVM model against a SparkDataFrame. It is a binary classifier, similar to svm in glmnet package | ||
#' Fits a linear SVM model against a SparkDataFrame, similar to svm in e1071 package. | ||
#' Currently only supports binary classification model with linear kernal. | ||
#' Users can print, make predictions on the produced model and save the model to the input path. | ||
#' | ||
#' @param data SparkDataFrame for training. | ||
#' @param formula A symbolic description of the model to be fitted. Currently only a few formula | ||
#' operators are supported, including '~', '.', ':', '+', and '-'. | ||
#' @param regParam The regularization parameter. | ||
#' @param regParam The regularization parameter. Only supports L2 regularization currently. | ||
#' @param maxIter Maximum iteration number. | ||
#' @param tol Convergence tolerance of iterations. | ||
#' @param standardization Whether to standardize the training features before fitting the model. The coefficients | ||
|
@@ -111,10 +112,10 @@ setMethod("spark.svmLinear", signature(data = "SparkDataFrame", formula = "formu | |
new("LinearSVCModel", jobj = jobj) | ||
}) | ||
|
||
# Predicted values based on an LinearSVCModel model | ||
# Predicted values based on a LinearSVCModel model | ||
|
||
#' @param newData a SparkDataFrame for testing. | ||
#' @return \code{predict} returns the predicted values based on an LinearSVCModel. | ||
#' @return \code{predict} returns the predicted values based on a LinearSVCModel. | ||
#' @rdname spark.svmLinear | ||
#' @aliases predict,LinearSVCModel,SparkDataFrame-method | ||
#' @export | ||
|
@@ -124,36 +125,27 @@ setMethod("predict", signature(object = "LinearSVCModel"), | |
predict_internal(object, newData) | ||
}) | ||
|
||
# Get the summary of an LinearSVCModel | ||
# Get the summary of a LinearSVCModel | ||
|
||
#' @param object an LinearSVCModel fitted by \code{spark.svmLinear}. | ||
#' @param object a LinearSVCModel fitted by \code{spark.svmLinear}. | ||
#' @return \code{summary} returns summary information of the fitted model, which is a list. | ||
#' The list includes \code{coefficients} (coefficients of the fitted model), | ||
#' \code{intercept} (intercept of the fitted model), \code{numClasses} (number of classes), | ||
#' \code{numFeatures} (number of features). | ||
#' \code{numClasses} (number of classes), \code{numFeatures} (number of features). | ||
#' @rdname spark.svmLinear | ||
#' @aliases summary,LinearSVCModel-method | ||
#' @export | ||
#' @note summary(LinearSVCModel) since 2.2.0 | ||
setMethod("summary", signature(object = "LinearSVCModel"), | ||
function(object) { | ||
jobj <- object@jobj | ||
features <- callJMethod(jobj, "features") | ||
labels <- callJMethod(jobj, "labels") | ||
coefficients <- callJMethod(jobj, "coefficients") | ||
nCol <- length(coefficients) / length(features) | ||
coefficients <- matrix(unlist(coefficients), ncol = nCol) | ||
intercept <- callJMethod(jobj, "intercept") | ||
features <- callJMethod(jobj, "rFeatures") | ||
coefficients <- callJMethod(jobj, "rCoefficients") | ||
coefficients <- as.matrix(unlist(coefficients)) | ||
colnames(coefficients) <- c("Estimate") | ||
rownames(coefficients) <- unlist(features) | ||
numClasses <- callJMethod(jobj, "numClasses") | ||
numFeatures <- callJMethod(jobj, "numFeatures") | ||
if (nCol == 1) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ML There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. why not label, intercept? i think they are common in R to include what goes into the model (although in many cases it just include the formula in the model summary) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @felixcheung The change here is to make |
||
colnames(coefficients) <- c("Estimate") | ||
} else { | ||
colnames(coefficients) <- unlist(labels) | ||
} | ||
rownames(coefficients) <- unlist(features) | ||
list(coefficients = coefficients, intercept = intercept, | ||
numClasses = numClasses, numFeatures = numFeatures) | ||
list(coefficients = coefficients, numClasses = numClasses, numFeatures = numFeatures) | ||
}) | ||
|
||
# Save fitted LinearSVCModel to the input path | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -38,9 +38,17 @@ private[r] class LinearSVCWrapper private ( | |
private val svcModel: LinearSVCModel = | ||
pipeline.stages(1).asInstanceOf[LinearSVCModel] | ||
|
||
lazy val coefficients: Array[Double] = svcModel.coefficients.toArray | ||
lazy val rFeatures: Array[String] = if (svcModel.getFitIntercept) { | ||
Array("(Intercept)") ++ features | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In R we stack |
||
} else { | ||
features | ||
} | ||
|
||
lazy val intercept: Double = svcModel.intercept | ||
lazy val rCoefficients: Array[Double] = if (svcModel.getFitIntercept) { | ||
Array(svcModel.intercept) ++ svcModel.coefficients.toArray | ||
} else { | ||
svcModel.coefficients.toArray | ||
} | ||
|
||
lazy val numClasses: Int = svcModel.numClasses | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you mean
kernel
instead ofkernal
?