Skip to content

Re-enabling MatrixFactorizationSimpleTrainAndPredict() #4846

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

Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,6 @@ public void MatrixFactorization_Estimator()
}

[MatrixFactorizationFact]
//Skipping test temporarily. This test will be re-enabled once the cause of failures has been determined
[Trait("Category", "SkipInCI")]
public void MatrixFactorizationSimpleTrainAndPredict()
{
var mlContext = new MLContext(seed: 1);
Expand Down Expand Up @@ -94,7 +92,7 @@ public void MatrixFactorizationSimpleTrainAndPredict()
var rightMatrix = model.Model.RightFactorMatrix;
Assert.Equal(leftMatrix.Count, model.Model.NumberOfRows * model.Model.ApproximationRank);
Assert.Equal(rightMatrix.Count, model.Model.NumberOfColumns * model.Model.ApproximationRank);
// MF produce different matrixes on different platforms, so at least test thier content on windows.
// MF produce different matrixes on different platforms, so at least test their content on windows.
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
Assert.Equal(0.33491, leftMatrix[0], 5);
Expand Down Expand Up @@ -124,12 +122,14 @@ public void MatrixFactorizationSimpleTrainAndPredict()
var metrices = mlContext.Recommendation().Evaluate(prediction, labelColumnName: labelColumnName, scoreColumnName: scoreColumnName);

// Determine if the selected metric is reasonable for different platforms
double tolerance = Math.Pow(10, -7);
double windowsTolerance = Math.Pow(10, -7);
// 1e-7 is too small for Linux, so we try 1e-4
double linuxTolerance = Math.Pow(10, -4);
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
// Linux case
var expectedUnixL2Error = 0.614457914950479; // Linux baseline
Copy link
Contributor

Choose a reason for hiding this comment

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

614457914950479 [](start = 44, length = 15)

I tried several run, below is my test result:

CenterOS:
Expected: 0.614457914950479 +- 1e-7
Passed: 0.6144579149504698
Failed: 0.6144409592507726

Ubuntu:
Expected: 0.614457914950479 +- 1e-7
Passed: 0.61445791495047
Failed: 0.614440959250773

builds:
https://dev.azure.com/dnceng/public/_build/results?buildId=521052&view=logs&j=887d69fe-3a72-535d-d1ef-c8cd8825499f&t=22ac88eb-9536-588d-9093-3c6614becdd0
https://dev.azure.com/dnceng/public/_build/results?buildId=521051&view=logs&j=5aa5c7df-492a-5eaf-973a-62b7b0f0ee3b&t=ffdbd604-f3e2-5332-cf61-c8dd00799b47
https://dev.azure.com/dnceng/public/_build/results?buildId=521050&view=logs&j=28859320-f5de-51e0-1fd2-7bea8c11cf7a
https://dev.azure.com/dnceng/public/_build/results?buildId=521049&view=logs&j=ac97a0ee-ee90-5a55-af17-a5a589fa545f

I'm not sure how the tolerance was set as before but seems we do have a certain failed value that like not caused by numbrical randomness, can you investigate further the root cause?

Assert.InRange(metrices.MeanSquaredError, expectedUnixL2Error - tolerance, expectedUnixL2Error + tolerance);
Assert.InRange(metrices.MeanSquaredError, expectedUnixL2Error - linuxTolerance, expectedUnixL2Error + linuxTolerance);
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
Expand All @@ -142,7 +142,7 @@ public void MatrixFactorizationSimpleTrainAndPredict()
{
// Windows case
var expectedWindowsL2Error = 0.6098110249191965; // Windows baseline
Assert.InRange(metrices.MeanSquaredError, expectedWindowsL2Error - tolerance, expectedWindowsL2Error + tolerance);
Assert.InRange(metrices.MeanSquaredError, expectedWindowsL2Error - windowsTolerance, expectedWindowsL2Error + windowsTolerance);
}

var modelWithValidation = pipeline.Fit(data, testData);
Expand Down