Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/Microsoft.ML/Runtime/EntryPoints/TrainTestSplit.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,8 @@ public static string CreateStratificationColumn(IHost host, ref IDataView data,
new HashJoinTransform.Arguments
{
Column = new[] { new HashJoinTransform.Column { Name = stratCol, Source = stratificationColumn } },
Join = true
Join = true,
HashBits = 30
}, data);
}

Expand Down
68 changes: 68 additions & 0 deletions test/Microsoft.ML.Core.Tests/UnitTests/TestCSharpApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -330,5 +330,73 @@ public void TestCrossValidationMacro()
}
}
}

[Fact]
public void TestCrossValidationMacroWithStratification()
{
var dataPath = GetDataPath(@"breast-cancer.txt");
using (var env = new TlcEnvironment())
{
var subGraph = env.CreateExperiment();

var nop = new ML.Transforms.NoOperation();
var nopOutput = subGraph.Add(nop);

var learnerInput = new ML.Trainers.StochasticDualCoordinateAscentBinaryClassifier
{
TrainingData = nopOutput.OutputData,
NumThreads = 1
};
var learnerOutput = subGraph.Add(learnerInput);

var modelCombine = new ML.Transforms.ManyHeterogeneousModelCombiner
{
TransformModels = new ArrayVar<ITransformModel>(nopOutput.Model),
PredictorModel = learnerOutput.PredictorModel
};
var modelCombineOutput = subGraph.Add(modelCombine);

var experiment = env.CreateExperiment();
var importInput = new ML.Data.TextLoader(dataPath);
importInput.Arguments.Column = new ML.Data.TextLoaderColumn[]
{
new ML.Data.TextLoaderColumn { Name = "Label", Source = new[] { new ML.Data.TextLoaderRange { Min = 0, Max = 0 } }, Type = DataKind.R4 },

@TomFinley TomFinley May 23, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

ML.Data.TextLoaderRange [](start = 88, length = 23)

I think for these scalar columns you can just use the simpler new ML.Data.TextLoaderRange(0) constructor. #Resolved

new ML.Data.TextLoaderColumn { Name = "Strat", Source = new[] { new ML.Data.TextLoaderRange { Min = 1, Max = 1 } }, Type = DataKind.Text },
new ML.Data.TextLoaderColumn { Name = "Features", Source = new[] { new ML.Data.TextLoaderRange { Min = 2, Max = 9 } }, Type = DataKind.R4 }
};
var importOutput = experiment.Add(importInput);

var crossValidate = new ML.Models.CrossValidator
{
Data = importOutput.Data,
Nodes = subGraph,
TransformModel = null,
StratificationColumn = "Strat"
};
crossValidate.Inputs.Data = nop.Data;
crossValidate.Outputs.Model = modelCombineOutput.PredictorModel;
var crossValidateOutput = experiment.Add(crossValidate);

experiment.Compile();
experiment.SetInput(importInput.InputFile, new SimpleFileHandle(env, dataPath, false, false));
experiment.Run();
var data = experiment.GetOutput(crossValidateOutput.OverallMetrics[0]);

var schema = data.Schema;
var b = schema.TryGetColumnIndex("AUC", out int metricCol);
Assert.True(b);
using (var cursor = data.GetRowCursor(col => col == metricCol))
{
var getter = cursor.GetGetter<double>(metricCol);
b = cursor.MoveNext();
Assert.True(b);
double val = 0;
getter(ref val);
Assert.Equal(0.99, val, 2);
b = cursor.MoveNext();
Assert.False(b);
}
}
}
}
}