Skip to content
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

Modify API for advanced settings (RandomizedPcaTrainer) #2390

Merged
merged 11 commits into from
Feb 13, 2019
39 changes: 39 additions & 0 deletions src/Microsoft.ML.Data/Evaluators/AnomalyDetectionEvaluator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using Microsoft.ML;
using Microsoft.ML.CommandLine;
using Microsoft.ML.Data;
using Microsoft.ML.Data.Evaluators.Metrics;
using Microsoft.ML.EntryPoints;
using Microsoft.ML.Internal.Utilities;
using Microsoft.ML.Transforms;
Expand Down Expand Up @@ -576,6 +577,44 @@ public void Finish()
FinishOtherMetrics();
}
}

/// <summary>
/// Evaluates scored anomaly detection data.
/// </summary>
/// <param name="data">The scored data.</param>
/// <param name="label">The name of the label column in <paramref name="data"/>.</param>
/// <param name="score">The name of the score column in <paramref name="data"/>.</param>
/// <param name="predictedLabel">The name of the predicted label column in <paramref name="data"/>.</param>
/// <returns>The evaluation results for these outputs.</returns>
internal AnomalyDetectionMetrics Evaluate(IDataView data, string label = DefaultColumnNames.Label, string score = DefaultColumnNames.Score,
string predictedLabel = DefaultColumnNames.PredictedLabel)
{
Host.CheckValue(data, nameof(data));
Host.CheckNonEmpty(label, nameof(label));
Host.CheckNonEmpty(score, nameof(score));
Host.CheckNonEmpty(predictedLabel, nameof(predictedLabel));

var roles = new RoleMappedData(data, opt: false,
RoleMappedSchema.ColumnRole.Label.Bind(label),
RoleMappedSchema.CreatePair(MetadataUtils.Const.ScoreValueKind.Score, score),
RoleMappedSchema.CreatePair(MetadataUtils.Const.ScoreValueKind.PredictedLabel, predictedLabel));

var resultDict = ((IEvaluator)this).Evaluate(roles);
Host.Assert(resultDict.ContainsKey(MetricKinds.OverallMetrics));
var overall = resultDict[MetricKinds.OverallMetrics];

AnomalyDetectionMetrics result;
using (var cursor = overall.GetRowCursorForAllColumns())
{
var moved = cursor.MoveNext();
Host.Assert(moved);
result = new AnomalyDetectionMetrics(Host, cursor);
moved = cursor.MoveNext();
Host.Assert(!moved);
}
return result;
}

}

[BestFriend]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System;
using Microsoft.Data.DataView;

namespace Microsoft.ML.Data.Evaluators.Metrics
{
/// <summary>
/// Evaluation results for anomaly detection.
/// </summary>
public sealed class AnomalyDetectionMetrics
{
/// <summary>
/// Gets the area under the ROC curve.
/// </summary>
/// <remarks>
/// The area under the ROC curve is equal to the probability that the algorithm ranks
/// a randomly chosen positive instance higher than a randomly chosen negative one
/// (assuming 'positive' ranks higher than 'negative').
/// </remarks>
public double Auc { get; }
Copy link
Contributor

@rogancarr rogancarr Feb 11, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summaries, Remarks, and links to relevant documentation. #Resolved

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added basic summaries for now.

wanted to also add the remarks from TLC website., but the explanations there were not clear esp. for the detection rate metrics.


In reply to: 255583277 [](ancestors = 255583277)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For these summaries, check in with @shmoradims ; he's building a set of generic docs for things like AUC, F1, RMSE, etc.


In reply to: 255703503 [](ancestors = 255703503,255583277)


/// <summary>
/// Detection rate at K false positives.
/// </summary>
/// <remarks>
/// This is computed as follows:
/// 1.Sort the test examples by the output of the anomaly detector in descending order of scores.
/// 2.Among the top K False Positives, compute ratio : (True Positive @ K) / (Total anomalies in test data)
/// Example confusion matrix for anomaly detection:
/// Anomalies (in test data) | Non-Anomalies (in test data)
/// Predicted Anomalies : TP | FP
/// Predicted Non-Anomalies : FN | TN
/// </remarks>
public double DrAtK { get; }

internal AnomalyDetectionMetrics(IExceptionContext ectx, Row overallResult)
{
double FetchDouble(string name) => RowCursorUtils.Fetch<double>(ectx, overallResult, name);
Auc = FetchDouble(BinaryClassifierEvaluator.Auc);
DrAtK = FetchDouble(AnomalyDetectionEvaluator.OverallMetrics.DrAtK);
}
}
}
6 changes: 6 additions & 0 deletions src/Microsoft.ML.Data/MLContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ public sealed class MLContext : IHostEnvironment
/// </summary>
public RankingCatalog Ranking { get; }

/// <summary>
/// Trainers and tasks specific to anomaly detection problems.
/// </summary>
public AnomalyDetectionCatalog AnomalyDetection { get; }

/// <summary>
/// Data processing operations.
/// </summary>
Expand Down Expand Up @@ -83,6 +88,7 @@ public MLContext(int? seed = null, int conc = 0)
Regression = new RegressionCatalog(_env);
Clustering = new ClusteringCatalog(_env);
Ranking = new RankingCatalog(_env);
AnomalyDetection = new AnomalyDetectionCatalog(_env);
Transforms = new TransformsCatalog(_env);
Model = new ModelOperationsCatalog(_env);
Data = new DataOperationsCatalog(_env);
Expand Down
50 changes: 50 additions & 0 deletions src/Microsoft.ML.Data/TrainCatalog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using System.Linq;
using Microsoft.Data.DataView;
using Microsoft.ML.Data;
using Microsoft.ML.Data.Evaluators.Metrics;
using Microsoft.ML.Transforms;
using Microsoft.ML.Transforms.Conversions;

Expand Down Expand Up @@ -646,4 +647,53 @@ public RankerMetrics Evaluate(IDataView data, string label, string groupId, stri
return eval.Evaluate(data, label, groupId, score);
}
}

/// <summary>
/// The central catalog for anomaly detection tasks and trainers.
/// </summary>
public sealed class AnomalyDetectionCatalog : TrainCatalogBase
{
/// <summary>
/// The list of trainers for anomaly detection.
/// </summary>
public AnomalyDetectionTrainers Trainers { get; }

internal AnomalyDetectionCatalog(IHostEnvironment env)
: base(env, nameof(AnomalyDetectionCatalog))
{
Trainers = new AnomalyDetectionTrainers(this);
}

public sealed class AnomalyDetectionTrainers : CatalogInstantiatorBase
{
internal AnomalyDetectionTrainers(AnomalyDetectionCatalog catalog)
: base(catalog)
{
}
}

/// <summary>
/// Evaluates scored anomaly detection data.
/// </summary>
/// <param name="data">The scored data.</param>
/// <param name="label">The name of the label column in <paramref name="data"/>.</param>
/// <param name="score">The name of the score column in <paramref name="data"/>.</param>
/// <param name="predictedLabel">The name of the predicted label column in <paramref name="data"/>.</param>
/// <param name="k">The number of false positives to compute the <see cref="AnomalyDetectionMetrics.DrAtK"/> metric. </param>
/// <returns>Evaluation results.</returns>
public AnomalyDetectionMetrics Evaluate(IDataView data, string label = DefaultColumnNames.Label, string score = DefaultColumnNames.Score,
string predictedLabel = DefaultColumnNames.PredictedLabel, int k = 10)
{
Environment.CheckValue(data, nameof(data));
Environment.CheckNonEmpty(label, nameof(label));
Environment.CheckNonEmpty(score, nameof(score));
Environment.CheckNonEmpty(predictedLabel, nameof(predictedLabel));

var args = new AnomalyDetectionEvaluator.Arguments();
args.K = k;

var eval = new AnomalyDetectionEvaluator(Environment, args);
return eval.Evaluate(data, label, score, predictedLabel);
}
}
}
38 changes: 37 additions & 1 deletion src/Microsoft.ML.PCA/PCACatalog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@
// See the LICENSE file in the project root for more information.

using Microsoft.ML.Data;
using Microsoft.ML.Trainers.PCA;
using Microsoft.ML.Transforms.Projections;
using static Microsoft.ML.Trainers.PCA.RandomizedPcaTrainer;

namespace Microsoft.ML
{
public static class PcaCatalog
{

/// <summary>Initializes a new instance of <see cref="PrincipalComponentAnalysisEstimator"/>.</summary>
/// <param name="catalog">The transform's catalog.</param>
/// <param name="outputColumnName">Name of the column resulting from the transformation of <paramref name="inputColumnName"/>.</param>
Expand All @@ -35,5 +36,40 @@ public static PrincipalComponentAnalysisEstimator ProjectToPrincipalComponents(t
/// <param name="columns">Input columns to apply PrincipalComponentAnalysis on.</param>
public static PrincipalComponentAnalysisEstimator ProjectToPrincipalComponents(this TransformsCatalog.ProjectionTransforms catalog, params PrincipalComponentAnalysisEstimator.ColumnInfo[] columns)
=> new PrincipalComponentAnalysisEstimator(CatalogUtils.GetEnvironment(catalog), columns);

/// <summary>
/// Trains an approximate PCA using Randomized SVD algorithm.
/// </summary>
/// <param name="catalog">The anomaly detection catalog trainer object.</param>
/// <param name="featureColumn">The features, or independent variables.</param>
/// <param name="weights">The optional example weights.</param>
/// <param name="rank">The number of components in the PCA.</param>
/// <param name="oversampling">Oversampling parameter for randomized PCA training.</param>
/// <param name="center">If enabled, data is centered to be zero mean.</param>
/// <param name="seed">The seed for random number generation.</param>
public static RandomizedPcaTrainer RandomizedPca(this AnomalyDetectionCatalog.AnomalyDetectionTrainers catalog,
Copy link
Contributor

@rogancarr rogancarr Feb 11, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Needs xml docs with remarks and links to a sample. Here or add to #1209 . #Resolved

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added xml docs.

sample adding can be part of overall documentation effort #1209


In reply to: 255585449 [](ancestors = 255585449)

string featureColumn = DefaultColumnNames.Features,
string weights = null,
int rank = Options.Defaults.NumComponents,
int oversampling = Options.Defaults.OversamplingParameters,
bool center = Options.Defaults.IsCenteredZeroMean,
int? seed = null)
{
Contracts.CheckValue(catalog, nameof(catalog));
var env = CatalogUtils.GetEnvironment(catalog);
return new RandomizedPcaTrainer(env, featureColumn, weights, rank, oversampling, center, seed);
}

/// <summary>
/// Trains an approximate PCA using Randomized SVD algorithm.
/// </summary>
/// <param name="catalog">The anomaly detection catalog trainer object.</param>
/// <param name="options">Advanced options to the algorithm.</param>
public static RandomizedPcaTrainer RandomizedPca(this AnomalyDetectionCatalog.AnomalyDetectionTrainers catalog, Options options)
{
Contracts.CheckValue(catalog, nameof(catalog));
var env = CatalogUtils.GetEnvironment(catalog);
return new RandomizedPcaTrainer(env, options);
}
}
}
45 changes: 26 additions & 19 deletions src/Microsoft.ML.PCA/PcaTrainer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
using Microsoft.ML.Trainers.PCA;
using Microsoft.ML.Training;

[assembly: LoadableClass(RandomizedPcaTrainer.Summary, typeof(RandomizedPcaTrainer), typeof(RandomizedPcaTrainer.Arguments),
[assembly: LoadableClass(RandomizedPcaTrainer.Summary, typeof(RandomizedPcaTrainer), typeof(RandomizedPcaTrainer.Options),
new[] { typeof(SignatureAnomalyDetectorTrainer), typeof(SignatureTrainer) },
RandomizedPcaTrainer.UserNameValue,
RandomizedPcaTrainer.LoadNameValue,
Expand Down Expand Up @@ -48,24 +48,31 @@ public sealed class RandomizedPcaTrainer : TrainerEstimatorBase<AnomalyPredictio
internal const string Summary = "This algorithm trains an approximate PCA using Randomized SVD algorithm. "
+ "This PCA can be made into Kernel PCA by using Random Fourier Features transform.";

public class Arguments : UnsupervisedLearnerInputBaseWithWeight
public class Options : UnsupervisedLearnerInputBaseWithWeight
Copy link
Member

@sfilipi sfilipi Feb 6, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Options [](start = 21, length = 7)

xml docs are coming later? #Pending

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeap.


In reply to: 254353429 [](ancestors = 254353429)

{
[Argument(ArgumentType.AtMostOnce, HelpText = "The number of components in the PCA", ShortName = "k", SortOrder = 50)]
[TGUI(SuggestedSweeps = "10,20,40,80")]
[TlcModule.SweepableDiscreteParam("Rank", new object[] { 10, 20, 40, 80 })]
public int Rank = 20;
public int Rank = Defaults.NumComponents;

[Argument(ArgumentType.AtMostOnce, HelpText = "Oversampling parameter for randomized PCA training", SortOrder = 50)]
[TGUI(SuggestedSweeps = "10,20,40")]
[TlcModule.SweepableDiscreteParam("Oversampling", new object[] { 10, 20, 40 })]
public int Oversampling = 20;
public int Oversampling = Defaults.OversamplingParameters;

[Argument(ArgumentType.AtMostOnce, HelpText = "If enabled, data is centered to be zero mean", ShortName = "center")]
[TlcModule.SweepableDiscreteParam("Center", null, isBool: true)]
public bool Center = true;
public bool Center = Defaults.IsCenteredZeroMean;

[Argument(ArgumentType.AtMostOnce, HelpText = "The seed for random number generation", ShortName = "seed")]
public int? Seed;

internal static class Defaults
{
public const int NumComponents = 20;
public const int OversamplingParameters = 20;
public const bool IsCenteredZeroMean = true;
}
}

private readonly int _rank;
Expand All @@ -90,35 +97,35 @@ public class Arguments : UnsupervisedLearnerInputBaseWithWeight
/// <param name="oversampling">Oversampling parameter for randomized PCA training.</param>
/// <param name="center">If enabled, data is centered to be zero mean.</param>
/// <param name="seed">The seed for random number generation.</param>
public RandomizedPcaTrainer(IHostEnvironment env,
internal RandomizedPcaTrainer(IHostEnvironment env,
Copy link
Contributor

@rogancarr rogancarr Feb 6, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't we just make the class Internal/BestFriend and keep this public? #Resolved

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not really.

we would want to expose these through mlcontext. not via constructors


In reply to: 254391018 [](ancestors = 254391018)

Copy link
Contributor

@rogancarr rogancarr Feb 11, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Resolved. I hadn't seen the pattern for trainable transforms where the class is public and methods are internal. #Resolved

Copy link
Member Author

@abgoswam abgoswam Feb 11, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i believe in ML.NET terms, this is "trainer estimator" (for anomaly detection tasks)

most other "trainer estimator"s follow the same pattern e.g. KMeansPlusPlusTrainer


In reply to: 255587702 [](ancestors = 255587702)

string features,
string weights = null,
int rank = 20,
int oversampling = 20,
bool center = true,
int rank = Options.Defaults.NumComponents,
int oversampling = Options.Defaults.OversamplingParameters,
bool center = Options.Defaults.IsCenteredZeroMean,
int? seed = null)
: this(env, null, features, weights, rank, oversampling, center, seed)
{

}

internal RandomizedPcaTrainer(IHostEnvironment env, Arguments args)
:this(env, args, args.FeatureColumn, args.WeightColumn)
internal RandomizedPcaTrainer(IHostEnvironment env, Options options)
Copy link
Contributor

@artidoro artidoro Feb 3, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RandomizedPcaTrainer [](start = 17, length = 20)

It's strange... I noticed that renaming Arguments to Options did not modify anything in the mlContext catalog. #Resolved

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I looked it up, and I don't think there is an entry for this trainer in mlContext. Can you add it?


In reply to: 253319239 [](ancestors = 253319239)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah. i noticed couple more components which do not have mlcontext extension.

will add


In reply to: 253319255 [](ancestors = 253319255,253319239)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i added mlcontext extension for this. Also added a test for it that exercises the Fit() and Transform() APIs.

Evaluate() API currently missing from Anomaly Detection. i will create a separate issue for that.


In reply to: 253584603 [](ancestors = 253584603,253319255,253319239)

:this(env, options, options.FeatureColumn, options.WeightColumn)
{

}

private RandomizedPcaTrainer(IHostEnvironment env, Arguments args, string featureColumn, string weightColumn,
private RandomizedPcaTrainer(IHostEnvironment env, Options options, string featureColumn, string weightColumn,
int rank = 20, int oversampling = 20, bool center = true, int? seed = null)
: base(Contracts.CheckRef(env, nameof(env)).Register(LoadNameValue), TrainerUtils.MakeR4VecFeature(featureColumn), default, TrainerUtils.MakeR4ScalarWeightColumn(weightColumn))
{
// if the args are not null, we got here from maml, and the internal ctor.
if (args != null)
if (options != null)
{
_rank = args.Rank;
_center = args.Center;
_oversampling = args.Oversampling;
_seed = args.Seed ?? Host.Rand.Next();
_rank = options.Rank;
_center = options.Center;
_oversampling = options.Oversampling;
_seed = options.Seed ?? Host.Rand.Next();
}
else
{
Expand Down Expand Up @@ -346,14 +353,14 @@ protected override AnomalyPredictionTransformer<PcaModelParameters> MakeTransfor
Desc = "Train an PCA Anomaly model.",
UserName = UserNameValue,
ShortName = ShortName)]
internal static CommonOutputs.AnomalyDetectionOutput TrainPcaAnomaly(IHostEnvironment env, Arguments input)
internal static CommonOutputs.AnomalyDetectionOutput TrainPcaAnomaly(IHostEnvironment env, Options input)
Copy link
Contributor

@rogancarr rogancarr Feb 6, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as above; these can be kept public and the whole class can be made internal/BestFriend. #Resolved

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Options class above should be public. Hence we cannot make entire class internal.


In reply to: 254391534 [](ancestors = 254391534)

{
Contracts.CheckValue(env, nameof(env));
var host = env.Register("TrainPCAAnomaly");
host.CheckValue(input, nameof(input));
EntryPointUtils.CheckInputArgs(host, input);

return LearnerEntryPointsUtils.Train<Arguments, CommonOutputs.AnomalyDetectionOutput>(host, input,
return LearnerEntryPointsUtils.Train<Options, CommonOutputs.AnomalyDetectionOutput>(host, input,
() => new RandomizedPcaTrainer(host, input),
getWeight: () => LearnerEntryPointsUtils.FindColumn(host, input.TrainingData.Schema, input.WeightColumn));
}
Expand Down
1 change: 1 addition & 0 deletions src/Microsoft.ML.PCA/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.Runtime.CompilerServices;
using Microsoft.ML;

[assembly: InternalsVisibleTo(assemblyName: "Microsoft.ML.Tests" + PublicKey.TestValue)]
[assembly: InternalsVisibleTo(assemblyName: "Microsoft.ML.StaticPipe" + PublicKey.Value)]
[assembly: InternalsVisibleTo(assemblyName: "Microsoft.ML.Core.Tests" + PublicKey.TestValue)]

Expand Down
2 changes: 1 addition & 1 deletion test/BaselineOutput/Common/EntryPoints/core_ep-list.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ Trainers.LogisticRegressionClassifier Logistic Regression is a method in statist
Trainers.NaiveBayesClassifier Train a MultiClassNaiveBayesTrainer. Microsoft.ML.Trainers.MultiClassNaiveBayesTrainer TrainMultiClassNaiveBayesTrainer Microsoft.ML.Trainers.MultiClassNaiveBayesTrainer+Options Microsoft.ML.EntryPoints.CommonOutputs+MulticlassClassificationOutput
Trainers.OnlineGradientDescentRegressor Train a Online gradient descent perceptron. Microsoft.ML.Trainers.Online.OnlineGradientDescentTrainer TrainRegression Microsoft.ML.Trainers.Online.OnlineGradientDescentTrainer+Options Microsoft.ML.EntryPoints.CommonOutputs+RegressionOutput
Trainers.OrdinaryLeastSquaresRegressor Train an OLS regression model. Microsoft.ML.Trainers.HalLearners.OlsLinearRegressionTrainer TrainRegression Microsoft.ML.Trainers.HalLearners.OlsLinearRegressionTrainer+Options Microsoft.ML.EntryPoints.CommonOutputs+RegressionOutput
Trainers.PcaAnomalyDetector Train an PCA Anomaly model. Microsoft.ML.Trainers.PCA.RandomizedPcaTrainer TrainPcaAnomaly Microsoft.ML.Trainers.PCA.RandomizedPcaTrainer+Arguments Microsoft.ML.EntryPoints.CommonOutputs+AnomalyDetectionOutput
Trainers.PcaAnomalyDetector Train an PCA Anomaly model. Microsoft.ML.Trainers.PCA.RandomizedPcaTrainer TrainPcaAnomaly Microsoft.ML.Trainers.PCA.RandomizedPcaTrainer+Options Microsoft.ML.EntryPoints.CommonOutputs+AnomalyDetectionOutput
Trainers.PoissonRegressor Train an Poisson regression model. Microsoft.ML.Trainers.PoissonRegression TrainRegression Microsoft.ML.Trainers.PoissonRegression+Options Microsoft.ML.EntryPoints.CommonOutputs+RegressionOutput
Trainers.StochasticDualCoordinateAscentBinaryClassifier Train an SDCA binary model. Microsoft.ML.Trainers.Sdca TrainBinary Microsoft.ML.Trainers.SdcaBinaryTrainer+Options Microsoft.ML.EntryPoints.CommonOutputs+BinaryClassificationOutput
Trainers.StochasticDualCoordinateAscentClassifier The SDCA linear multi-class classification trainer. Microsoft.ML.Trainers.Sdca TrainMultiClass Microsoft.ML.Trainers.SdcaMultiClassTrainer+Options Microsoft.ML.EntryPoints.CommonOutputs+MulticlassClassificationOutput
Expand Down
2 changes: 1 addition & 1 deletion test/Microsoft.ML.Core.Tests/UnitTests/TestEntryPoints.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3414,7 +3414,7 @@ public void EntryPointPcaPredictorSummary()
InputFile = inputFile,
}).Data;

var pcaInput = new RandomizedPcaTrainer.Arguments
var pcaInput = new RandomizedPcaTrainer.Options
{
TrainingData = dataView,
};
Expand Down
Loading