Field-aware factorization machine to estimator - #912

Merged
sfilipi merged 13 commits into
dotnet:masterfrom
sfilipi:ffmEstimator
Sep 20, 2018
Merged

Field-aware factorization machine to estimator#912
sfilipi merged 13 commits into
dotnet:masterfrom
sfilipi:ffmEstimator

Conversation

@sfilipi

@sfilipisfilipi commented Sep 14, 2018

Copy link
Copy Markdown
Member

FAFM now extends TrainerEstimatorBase

@sfilipisfilipi self-assigned this Sep 14, 2018
@sfilipisfilipi added the API Issues pertaining the friendly API label Sep 14, 2018
@sfilipisfilipi added this to the 0918 milestone Sep 14, 2018
@Zruty0Zruty0 mentioned this pull request Sep 14, 2018
@sfilipisfilipi changed the title [WIP] FAFM to extend TrainerEstimatorBase FAFM to estimatorSep 18, 2018
@sfilipi
sfilipi requested a review from wschinSeptember 18, 2018 00:45
protected readonly ISchema TrainSchema;

public string FeatureColumn { get; }
public string[] FeatureColumn { get; }

@Zruty0Zruty0Sep 18, 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.

FeatureColumn [](start = 24, length = 13)

oh no... I don' like this change already.

Forcing ALL predictors to expose parallel arrays of feature columns is not a great change #Closed

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I don't think there's much overhead from it. Do you think it will cause problems? #Closed


IEstimator<ITransformer> est = new FieldAwareFactorizationMachineTrainer(Env, "Label", new[] { "Feature1", "Feature2", "Feature3", "Feature4" });

//var result = est.Fit(data);

@Zruty0Zruty0Sep 18, 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.

// [](start = 12, length = 2)

remove commented out code #Resolved

namespace Microsoft.ML.Tests.TrainerEstimators
{
public sealed class OnlineLinearTests : TestDataPipeBase
public partial class TrainerEstimators

@Zruty0Zruty0Sep 18, 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.

TrainerEstimators [](start = 25, length = 17)

thanks for making this change #ByDesign


namespace Microsoft.ML.Runtime
{
public interface IPredictionTransformer<out TModel> : ITransformer

@Zruty0Zruty0Sep 18, 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.

IPredictionTransformer [](start = 21, length = 22)

I don't think we even need an interface for FFM, since for the time being it's the only trainer that accepts multiple feature columns. #Closed

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

If we want to inquire about all trainers, it is useful to have them extend one interface. #Closed

@Zruty0Zruty0 left a comment

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.

🕐

…tures.
Splitting IPredictionTransformer into two interfaces
Creating a transformer wrapping the FAFM predictor.
{
public partial class TrainerEstimators : TestDataPipeBase
{
[Fact]

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

[Fact] [](start = 7, length = 7)

The test is failing to check whether the input is valid for fit. Resolve before check in. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Thanks @Zruty0 for fixing the mismatch between the active and inactive columns.


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

TModel Model { get; }
}

public interface IClassicPredictionTransformer<out TModel> : IPredictionTransformer<TModel>

@Zruty0Zruty0Sep 19, 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.

Classic [](start = 22, length = 7)

'Classic' sounds a bit wacky, even though it was my suggestion. Maybe 'SingleInput' ?.. #Resolved

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.

Classic is weird.


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


protected void SaveModel(ModelSaveContext ctx)
{
// *** Binary format ***

@Zruty0Zruty0Sep 19, 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.

*** Binary format *** [](start = 15, length = 21)

whenever you save or load, need *** Binary format *** #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

?


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

{
public interface ITrainerEstimator<out TTransformer, out TPredictor>: IEstimator<TTransformer>
where TTransformer: IPredictionTransformer<TPredictor>
where TTransformer: IClassicPredictionTransformer<TPredictor>

@Zruty0Zruty0Sep 19, 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.

IClassicPredictionTransformer [](start = 28, length = 29)

I believe this change is incorrect, isn't it? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No, maybe i named in reverse, but this is the old interface.


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

public string[] FeatureColumns { get; }

/// <summary>
/// The type of the prediction transformer

@Zruty0Zruty0Sep 19, 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.

The type of the prediction transformer [](start = 12, length = 38)

fix the comment #Resolved

loaderSignature: LoaderSignature);
}

private static FieldAwareFactorizationMachinePredictionTransformer Create(IHostEnvironment env, ModelLoadContext ctx)

@Zruty0Zruty0Sep 19, 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.

private [](start = 8, length = 7)

this is just to avoid having a public ctor? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Didn't load through the ctor; i think bc for the ctor the loadable class signature requires the args.


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

@Zruty0Zruty0 left a comment

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.

:shipit:

protected void SaveModel(ModelSaveContext ctx)
{
// *** Binary format ***
// model: prediction model.

@TomFinleyTomFinleySep 19, 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.

model: prediction model. [](start = 15, length = 24)

Technically the model isn't part of this format, since you're not writing it to the stream, you're writing it somewhere else entirely, but that's OK. Consider fixing if you have to change the code anyway. #Resolved

@sfilipisfilipiSep 19, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

@tfinley@gmail.com fixing it == remove the comment?


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

}
}

public abstract class ClassicPredictionTransformerBase<TModel> : PredictionTransformerBase<TModel>, IClassicPredictionTransformer<TModel>, ICanSaveModel

@TomFinleyTomFinleySep 19, 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.

I guess by "classic" this just means a prediction transformer base that takes a single features column as its input. Classic is a bit of a funny word, but then again SinlgeFeaturesPredictionTransformerBase might be a bit of a mouthful and itself potentially confusing. #Resolved


using TDistPredictor = IDistPredictorProducing<float, float>;
using TScalarTrainer = ITrainerEstimator<IPredictionTransformer<IPredictorProducing<float>>, IPredictorProducing<float>>;
using TScalarTrainer = ITrainerEstimator<IClassicPredictionTransformer<IPredictorProducing<float>>, IPredictorProducing<float>>;

@TomFinleyTomFinleySep 19, 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.

Classic [](start = 46, length = 7)

Yes after seeing this a bit I think the word "classic" is just going to confuse the heck out of a lot of people. Please consider doing something else. #Resolved

TModel Model { get; }
}

public interface IClassicPredictionTransformer<out TModel> : IPredictionTransformer<TModel>

@TomFinleyTomFinleySep 19, 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.

IClassicPredictionTransformer [](start = 21, length = 29)

I sort of feel like an interface called IClassicPredictionTransformer needs some XML comment on it. All public interfaces should, but especially one with the word "classic" in the name.

I am choosing to interpret this interface as it gives me classic coke whenever I use it. #Resolved

CheckSameValues(scoredTrain, scoredTrain2);
CheckSameSchemas(scoredTrain.Schema, scoredTrain2.Schema);
CheckSameValues(scoredTrain, scoredTrain2);
};

@TomFinleyTomFinleySep 19, 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.

Somehow these got indented two spaces for no obvious reason. #Resolved

/// Base class for transformers with no feature column, or more than one feature columns.
/// </summary>
/// <typeparam name="TModel"></typeparam>
public abstract class PredictionTransformerBase<TModel> : IPredictionTransformer<TModel>

@TomFinleyTomFinleySep 19, 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.

No documentation? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

it is there? Are you looking at iteration 10?


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

@TomFinleyTomFinley left a comment

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.

Looks pretty good thanks @sfilipi

@sfilipi

Copy link
Copy Markdown
MemberAuthor

close-reopen to trigger build

@sfilipisfilipi closed this Sep 20, 2018
@sfilipisfilipi reopened this Sep 20, 2018
@sfilipi
sfilipi merged commit 044a6d3 into dotnet:masterSep 20, 2018
@sfilipi
sfilipi deleted the ffmEstimator branch September 20, 2018 19:39
@wschinwschin changed the title FAFM to estimator Field-aware factorization machine to estimatorOct 15, 2018
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

APIIssues pertaining the friendly API

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@sfilipi@TomFinley@Zruty0
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Field-aware factorization machine to estimator - #912

Merged
sfilipi merged 13 commits into
dotnet:masterfrom
sfilipi:ffmEstimator
Sep 20, 2018
Merged

Field-aware factorization machine to estimator#912
sfilipi merged 13 commits into
dotnet:masterfrom
sfilipi:ffmEstimator

Conversation

@sfilipi

@sfilipisfilipi commented Sep 14, 2018

Copy link
Copy Markdown
Member

FAFM now extends TrainerEstimatorBase

@sfilipisfilipi self-assigned this Sep 14, 2018
@sfilipisfilipi added the API Issues pertaining the friendly API label Sep 14, 2018
@sfilipisfilipi added this to the 0918 milestone Sep 14, 2018
@Zruty0Zruty0 mentioned this pull request Sep 14, 2018
@sfilipisfilipi changed the title [WIP] FAFM to extend TrainerEstimatorBase FAFM to estimatorSep 18, 2018
@sfilipi
sfilipi requested a review from wschinSeptember 18, 2018 00:45
protected readonly ISchema TrainSchema;

public string FeatureColumn { get; }
public string[] FeatureColumn { get; }

@Zruty0Zruty0Sep 18, 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.

FeatureColumn [](start = 24, length = 13)

oh no... I don' like this change already.

Forcing ALL predictors to expose parallel arrays of feature columns is not a great change #Closed

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I don't think there's much overhead from it. Do you think it will cause problems? #Closed


IEstimator<ITransformer> est = new FieldAwareFactorizationMachineTrainer(Env, "Label", new[] { "Feature1", "Feature2", "Feature3", "Feature4" });

//var result = est.Fit(data);

@Zruty0Zruty0Sep 18, 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.

// [](start = 12, length = 2)

remove commented out code #Resolved

namespace Microsoft.ML.Tests.TrainerEstimators
{
public sealed class OnlineLinearTests : TestDataPipeBase
public partial class TrainerEstimators

@Zruty0Zruty0Sep 18, 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.

TrainerEstimators [](start = 25, length = 17)

thanks for making this change #ByDesign


namespace Microsoft.ML.Runtime
{
public interface IPredictionTransformer<out TModel> : ITransformer

@Zruty0Zruty0Sep 18, 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.

IPredictionTransformer [](start = 21, length = 22)

I don't think we even need an interface for FFM, since for the time being it's the only trainer that accepts multiple feature columns. #Closed

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

If we want to inquire about all trainers, it is useful to have them extend one interface. #Closed

@Zruty0Zruty0 left a comment

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.

🕐

…tures.
Splitting IPredictionTransformer into two interfaces
Creating a transformer wrapping the FAFM predictor.
{
public partial class TrainerEstimators : TestDataPipeBase
{
[Fact]

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

[Fact] [](start = 7, length = 7)

The test is failing to check whether the input is valid for fit. Resolve before check in. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Thanks @Zruty0 for fixing the mismatch between the active and inactive columns.


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

TModel Model { get; }
}

public interface IClassicPredictionTransformer<out TModel> : IPredictionTransformer<TModel>

@Zruty0Zruty0Sep 19, 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.

Classic [](start = 22, length = 7)

'Classic' sounds a bit wacky, even though it was my suggestion. Maybe 'SingleInput' ?.. #Resolved

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.

Classic is weird.


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


protected void SaveModel(ModelSaveContext ctx)
{
// *** Binary format ***

@Zruty0Zruty0Sep 19, 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.

*** Binary format *** [](start = 15, length = 21)

whenever you save or load, need *** Binary format *** #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

?


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

{
public interface ITrainerEstimator<out TTransformer, out TPredictor>: IEstimator<TTransformer>
where TTransformer: IPredictionTransformer<TPredictor>
where TTransformer: IClassicPredictionTransformer<TPredictor>

@Zruty0Zruty0Sep 19, 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.

IClassicPredictionTransformer [](start = 28, length = 29)

I believe this change is incorrect, isn't it? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No, maybe i named in reverse, but this is the old interface.


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

public string[] FeatureColumns { get; }

/// <summary>
/// The type of the prediction transformer

@Zruty0Zruty0Sep 19, 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.

The type of the prediction transformer [](start = 12, length = 38)

fix the comment #Resolved

loaderSignature: LoaderSignature);
}

private static FieldAwareFactorizationMachinePredictionTransformer Create(IHostEnvironment env, ModelLoadContext ctx)

@Zruty0Zruty0Sep 19, 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.

private [](start = 8, length = 7)

this is just to avoid having a public ctor? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Didn't load through the ctor; i think bc for the ctor the loadable class signature requires the args.


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

@Zruty0Zruty0 left a comment

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.

:shipit:

protected void SaveModel(ModelSaveContext ctx)
{
// *** Binary format ***
// model: prediction model.

@TomFinleyTomFinleySep 19, 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.

model: prediction model. [](start = 15, length = 24)

Technically the model isn't part of this format, since you're not writing it to the stream, you're writing it somewhere else entirely, but that's OK. Consider fixing if you have to change the code anyway. #Resolved

@sfilipisfilipiSep 19, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

@tfinley@gmail.com fixing it == remove the comment?


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

}
}

public abstract class ClassicPredictionTransformerBase<TModel> : PredictionTransformerBase<TModel>, IClassicPredictionTransformer<TModel>, ICanSaveModel

@TomFinleyTomFinleySep 19, 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.

I guess by "classic" this just means a prediction transformer base that takes a single features column as its input. Classic is a bit of a funny word, but then again SinlgeFeaturesPredictionTransformerBase might be a bit of a mouthful and itself potentially confusing. #Resolved


using TDistPredictor = IDistPredictorProducing<float, float>;
using TScalarTrainer = ITrainerEstimator<IPredictionTransformer<IPredictorProducing<float>>, IPredictorProducing<float>>;
using TScalarTrainer = ITrainerEstimator<IClassicPredictionTransformer<IPredictorProducing<float>>, IPredictorProducing<float>>;

@TomFinleyTomFinleySep 19, 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.

Classic [](start = 46, length = 7)

Yes after seeing this a bit I think the word "classic" is just going to confuse the heck out of a lot of people. Please consider doing something else. #Resolved

TModel Model { get; }
}

public interface IClassicPredictionTransformer<out TModel> : IPredictionTransformer<TModel>

@TomFinleyTomFinleySep 19, 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.

IClassicPredictionTransformer [](start = 21, length = 29)

I sort of feel like an interface called IClassicPredictionTransformer needs some XML comment on it. All public interfaces should, but especially one with the word "classic" in the name.

I am choosing to interpret this interface as it gives me classic coke whenever I use it. #Resolved

CheckSameValues(scoredTrain, scoredTrain2);
CheckSameSchemas(scoredTrain.Schema, scoredTrain2.Schema);
CheckSameValues(scoredTrain, scoredTrain2);
};

@TomFinleyTomFinleySep 19, 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.

Somehow these got indented two spaces for no obvious reason. #Resolved

/// Base class for transformers with no feature column, or more than one feature columns.
/// </summary>
/// <typeparam name="TModel"></typeparam>
public abstract class PredictionTransformerBase<TModel> : IPredictionTransformer<TModel>

@TomFinleyTomFinleySep 19, 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.

No documentation? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

it is there? Are you looking at iteration 10?


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

@TomFinleyTomFinley left a comment

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.

Looks pretty good thanks @sfilipi

@sfilipi

Copy link
Copy Markdown
MemberAuthor

close-reopen to trigger build

@sfilipisfilipi closed this Sep 20, 2018
@sfilipisfilipi reopened this Sep 20, 2018
@sfilipi
sfilipi merged commit 044a6d3 into dotnet:masterSep 20, 2018
@sfilipi
sfilipi deleted the ffmEstimator branch September 20, 2018 19:39
@wschinwschin changed the title FAFM to estimator Field-aware factorization machine to estimatorOct 15, 2018
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

APIIssues pertaining the friendly API

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@sfilipi@TomFinley@Zruty0
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Field-aware factorization machine to estimator - #912

Merged
sfilipi merged 13 commits into
dotnet:masterfrom
sfilipi:ffmEstimator
Sep 20, 2018
Merged

Field-aware factorization machine to estimator#912
sfilipi merged 13 commits into
dotnet:masterfrom
sfilipi:ffmEstimator

Conversation

@sfilipi

@sfilipisfilipi commented Sep 14, 2018

Copy link
Copy Markdown
Member

FAFM now extends TrainerEstimatorBase

@sfilipisfilipi self-assigned this Sep 14, 2018
@sfilipisfilipi added the API Issues pertaining the friendly API label Sep 14, 2018
@sfilipisfilipi added this to the 0918 milestone Sep 14, 2018
@Zruty0Zruty0 mentioned this pull request Sep 14, 2018
@sfilipisfilipi changed the title [WIP] FAFM to extend TrainerEstimatorBase FAFM to estimatorSep 18, 2018
@sfilipi
sfilipi requested a review from wschinSeptember 18, 2018 00:45
protected readonly ISchema TrainSchema;

public string FeatureColumn { get; }
public string[] FeatureColumn { get; }

@Zruty0Zruty0Sep 18, 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.

FeatureColumn [](start = 24, length = 13)

oh no... I don' like this change already.

Forcing ALL predictors to expose parallel arrays of feature columns is not a great change #Closed

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I don't think there's much overhead from it. Do you think it will cause problems? #Closed


IEstimator<ITransformer> est = new FieldAwareFactorizationMachineTrainer(Env, "Label", new[] { "Feature1", "Feature2", "Feature3", "Feature4" });

//var result = est.Fit(data);

@Zruty0Zruty0Sep 18, 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.

// [](start = 12, length = 2)

remove commented out code #Resolved

namespace Microsoft.ML.Tests.TrainerEstimators
{
public sealed class OnlineLinearTests : TestDataPipeBase
public partial class TrainerEstimators

@Zruty0Zruty0Sep 18, 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.

TrainerEstimators [](start = 25, length = 17)

thanks for making this change #ByDesign


namespace Microsoft.ML.Runtime
{
public interface IPredictionTransformer<out TModel> : ITransformer

@Zruty0Zruty0Sep 18, 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.

IPredictionTransformer [](start = 21, length = 22)

I don't think we even need an interface for FFM, since for the time being it's the only trainer that accepts multiple feature columns. #Closed

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

If we want to inquire about all trainers, it is useful to have them extend one interface. #Closed

@Zruty0Zruty0 left a comment

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.

🕐

…tures.
Splitting IPredictionTransformer into two interfaces
Creating a transformer wrapping the FAFM predictor.
{
public partial class TrainerEstimators : TestDataPipeBase
{
[Fact]

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

[Fact] [](start = 7, length = 7)

The test is failing to check whether the input is valid for fit. Resolve before check in. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Thanks @Zruty0 for fixing the mismatch between the active and inactive columns.


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

TModel Model { get; }
}

public interface IClassicPredictionTransformer<out TModel> : IPredictionTransformer<TModel>

@Zruty0Zruty0Sep 19, 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.

Classic [](start = 22, length = 7)

'Classic' sounds a bit wacky, even though it was my suggestion. Maybe 'SingleInput' ?.. #Resolved

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.

Classic is weird.


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


protected void SaveModel(ModelSaveContext ctx)
{
// *** Binary format ***

@Zruty0Zruty0Sep 19, 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.

*** Binary format *** [](start = 15, length = 21)

whenever you save or load, need *** Binary format *** #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

?


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

{
public interface ITrainerEstimator<out TTransformer, out TPredictor>: IEstimator<TTransformer>
where TTransformer: IPredictionTransformer<TPredictor>
where TTransformer: IClassicPredictionTransformer<TPredictor>

@Zruty0Zruty0Sep 19, 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.

IClassicPredictionTransformer [](start = 28, length = 29)

I believe this change is incorrect, isn't it? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No, maybe i named in reverse, but this is the old interface.


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

public string[] FeatureColumns { get; }

/// <summary>
/// The type of the prediction transformer

@Zruty0Zruty0Sep 19, 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.

The type of the prediction transformer [](start = 12, length = 38)

fix the comment #Resolved

loaderSignature: LoaderSignature);
}

private static FieldAwareFactorizationMachinePredictionTransformer Create(IHostEnvironment env, ModelLoadContext ctx)

@Zruty0Zruty0Sep 19, 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.

private [](start = 8, length = 7)

this is just to avoid having a public ctor? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Didn't load through the ctor; i think bc for the ctor the loadable class signature requires the args.


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

@Zruty0Zruty0 left a comment

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.

:shipit:

protected void SaveModel(ModelSaveContext ctx)
{
// *** Binary format ***
// model: prediction model.

@TomFinleyTomFinleySep 19, 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.

model: prediction model. [](start = 15, length = 24)

Technically the model isn't part of this format, since you're not writing it to the stream, you're writing it somewhere else entirely, but that's OK. Consider fixing if you have to change the code anyway. #Resolved

@sfilipisfilipiSep 19, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

@tfinley@gmail.com fixing it == remove the comment?


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

}
}

public abstract class ClassicPredictionTransformerBase<TModel> : PredictionTransformerBase<TModel>, IClassicPredictionTransformer<TModel>, ICanSaveModel

@TomFinleyTomFinleySep 19, 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.

I guess by "classic" this just means a prediction transformer base that takes a single features column as its input. Classic is a bit of a funny word, but then again SinlgeFeaturesPredictionTransformerBase might be a bit of a mouthful and itself potentially confusing. #Resolved


using TDistPredictor = IDistPredictorProducing<float, float>;
using TScalarTrainer = ITrainerEstimator<IPredictionTransformer<IPredictorProducing<float>>, IPredictorProducing<float>>;
using TScalarTrainer = ITrainerEstimator<IClassicPredictionTransformer<IPredictorProducing<float>>, IPredictorProducing<float>>;

@TomFinleyTomFinleySep 19, 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.

Classic [](start = 46, length = 7)

Yes after seeing this a bit I think the word "classic" is just going to confuse the heck out of a lot of people. Please consider doing something else. #Resolved

TModel Model { get; }
}

public interface IClassicPredictionTransformer<out TModel> : IPredictionTransformer<TModel>

@TomFinleyTomFinleySep 19, 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.

IClassicPredictionTransformer [](start = 21, length = 29)

I sort of feel like an interface called IClassicPredictionTransformer needs some XML comment on it. All public interfaces should, but especially one with the word "classic" in the name.

I am choosing to interpret this interface as it gives me classic coke whenever I use it. #Resolved

CheckSameValues(scoredTrain, scoredTrain2);
CheckSameSchemas(scoredTrain.Schema, scoredTrain2.Schema);
CheckSameValues(scoredTrain, scoredTrain2);
};

@TomFinleyTomFinleySep 19, 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.

Somehow these got indented two spaces for no obvious reason. #Resolved

/// Base class for transformers with no feature column, or more than one feature columns.
/// </summary>
/// <typeparam name="TModel"></typeparam>
public abstract class PredictionTransformerBase<TModel> : IPredictionTransformer<TModel>

@TomFinleyTomFinleySep 19, 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.

No documentation? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

it is there? Are you looking at iteration 10?


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

@TomFinleyTomFinley left a comment

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.

Looks pretty good thanks @sfilipi

@sfilipi

Copy link
Copy Markdown
MemberAuthor

close-reopen to trigger build

@sfilipisfilipi closed this Sep 20, 2018
@sfilipisfilipi reopened this Sep 20, 2018
@sfilipi
sfilipi merged commit 044a6d3 into dotnet:masterSep 20, 2018
@sfilipi
sfilipi deleted the ffmEstimator branch September 20, 2018 19:39
@wschinwschin changed the title FAFM to estimator Field-aware factorization machine to estimatorOct 15, 2018
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

APIIssues pertaining the friendly API

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@sfilipi@TomFinley@Zruty0
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Field-aware factorization machine to estimator - #912

Merged
sfilipi merged 13 commits into
dotnet:masterfrom
sfilipi:ffmEstimator
Sep 20, 2018
Merged

Field-aware factorization machine to estimator#912
sfilipi merged 13 commits into
dotnet:masterfrom
sfilipi:ffmEstimator

Conversation

@sfilipi

@sfilipisfilipi commented Sep 14, 2018

Copy link
Copy Markdown
Member

FAFM now extends TrainerEstimatorBase

@sfilipisfilipi self-assigned this Sep 14, 2018
@sfilipisfilipi added the API Issues pertaining the friendly API label Sep 14, 2018
@sfilipisfilipi added this to the 0918 milestone Sep 14, 2018
@Zruty0Zruty0 mentioned this pull request Sep 14, 2018
@sfilipisfilipi changed the title [WIP] FAFM to extend TrainerEstimatorBase FAFM to estimatorSep 18, 2018
@sfilipi
sfilipi requested a review from wschinSeptember 18, 2018 00:45
protected readonly ISchema TrainSchema;

public string FeatureColumn { get; }
public string[] FeatureColumn { get; }

@Zruty0Zruty0Sep 18, 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.

FeatureColumn [](start = 24, length = 13)

oh no... I don' like this change already.

Forcing ALL predictors to expose parallel arrays of feature columns is not a great change #Closed

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I don't think there's much overhead from it. Do you think it will cause problems? #Closed


IEstimator<ITransformer> est = new FieldAwareFactorizationMachineTrainer(Env, "Label", new[] { "Feature1", "Feature2", "Feature3", "Feature4" });

//var result = est.Fit(data);

@Zruty0Zruty0Sep 18, 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.

// [](start = 12, length = 2)

remove commented out code #Resolved

namespace Microsoft.ML.Tests.TrainerEstimators
{
public sealed class OnlineLinearTests : TestDataPipeBase
public partial class TrainerEstimators

@Zruty0Zruty0Sep 18, 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.

TrainerEstimators [](start = 25, length = 17)

thanks for making this change #ByDesign


namespace Microsoft.ML.Runtime
{
public interface IPredictionTransformer<out TModel> : ITransformer

@Zruty0Zruty0Sep 18, 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.

IPredictionTransformer [](start = 21, length = 22)

I don't think we even need an interface for FFM, since for the time being it's the only trainer that accepts multiple feature columns. #Closed

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

If we want to inquire about all trainers, it is useful to have them extend one interface. #Closed

@Zruty0Zruty0 left a comment

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.

🕐

…tures.
Splitting IPredictionTransformer into two interfaces
Creating a transformer wrapping the FAFM predictor.
{
public partial class TrainerEstimators : TestDataPipeBase
{
[Fact]

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

[Fact] [](start = 7, length = 7)

The test is failing to check whether the input is valid for fit. Resolve before check in. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Thanks @Zruty0 for fixing the mismatch between the active and inactive columns.


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

TModel Model { get; }
}

public interface IClassicPredictionTransformer<out TModel> : IPredictionTransformer<TModel>

@Zruty0Zruty0Sep 19, 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.

Classic [](start = 22, length = 7)

'Classic' sounds a bit wacky, even though it was my suggestion. Maybe 'SingleInput' ?.. #Resolved

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.

Classic is weird.


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


protected void SaveModel(ModelSaveContext ctx)
{
// *** Binary format ***

@Zruty0Zruty0Sep 19, 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.

*** Binary format *** [](start = 15, length = 21)

whenever you save or load, need *** Binary format *** #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

?


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

{
public interface ITrainerEstimator<out TTransformer, out TPredictor>: IEstimator<TTransformer>
where TTransformer: IPredictionTransformer<TPredictor>
where TTransformer: IClassicPredictionTransformer<TPredictor>

@Zruty0Zruty0Sep 19, 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.

IClassicPredictionTransformer [](start = 28, length = 29)

I believe this change is incorrect, isn't it? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No, maybe i named in reverse, but this is the old interface.


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

public string[] FeatureColumns { get; }

/// <summary>
/// The type of the prediction transformer

@Zruty0Zruty0Sep 19, 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.

The type of the prediction transformer [](start = 12, length = 38)

fix the comment #Resolved

loaderSignature: LoaderSignature);
}

private static FieldAwareFactorizationMachinePredictionTransformer Create(IHostEnvironment env, ModelLoadContext ctx)

@Zruty0Zruty0Sep 19, 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.

private [](start = 8, length = 7)

this is just to avoid having a public ctor? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Didn't load through the ctor; i think bc for the ctor the loadable class signature requires the args.


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

@Zruty0Zruty0 left a comment

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.

:shipit:

protected void SaveModel(ModelSaveContext ctx)
{
// *** Binary format ***
// model: prediction model.

@TomFinleyTomFinleySep 19, 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.

model: prediction model. [](start = 15, length = 24)

Technically the model isn't part of this format, since you're not writing it to the stream, you're writing it somewhere else entirely, but that's OK. Consider fixing if you have to change the code anyway. #Resolved

@sfilipisfilipiSep 19, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

@tfinley@gmail.com fixing it == remove the comment?


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

}
}

public abstract class ClassicPredictionTransformerBase<TModel> : PredictionTransformerBase<TModel>, IClassicPredictionTransformer<TModel>, ICanSaveModel

@TomFinleyTomFinleySep 19, 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.

I guess by "classic" this just means a prediction transformer base that takes a single features column as its input. Classic is a bit of a funny word, but then again SinlgeFeaturesPredictionTransformerBase might be a bit of a mouthful and itself potentially confusing. #Resolved


using TDistPredictor = IDistPredictorProducing<float, float>;
using TScalarTrainer = ITrainerEstimator<IPredictionTransformer<IPredictorProducing<float>>, IPredictorProducing<float>>;
using TScalarTrainer = ITrainerEstimator<IClassicPredictionTransformer<IPredictorProducing<float>>, IPredictorProducing<float>>;

@TomFinleyTomFinleySep 19, 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.

Classic [](start = 46, length = 7)

Yes after seeing this a bit I think the word "classic" is just going to confuse the heck out of a lot of people. Please consider doing something else. #Resolved

TModel Model { get; }
}

public interface IClassicPredictionTransformer<out TModel> : IPredictionTransformer<TModel>

@TomFinleyTomFinleySep 19, 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.

IClassicPredictionTransformer [](start = 21, length = 29)

I sort of feel like an interface called IClassicPredictionTransformer needs some XML comment on it. All public interfaces should, but especially one with the word "classic" in the name.

I am choosing to interpret this interface as it gives me classic coke whenever I use it. #Resolved

CheckSameValues(scoredTrain, scoredTrain2);
CheckSameSchemas(scoredTrain.Schema, scoredTrain2.Schema);
CheckSameValues(scoredTrain, scoredTrain2);
};

@TomFinleyTomFinleySep 19, 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.

Somehow these got indented two spaces for no obvious reason. #Resolved

/// Base class for transformers with no feature column, or more than one feature columns.
/// </summary>
/// <typeparam name="TModel"></typeparam>
public abstract class PredictionTransformerBase<TModel> : IPredictionTransformer<TModel>

@TomFinleyTomFinleySep 19, 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.

No documentation? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

it is there? Are you looking at iteration 10?


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

@TomFinleyTomFinley left a comment

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.

Looks pretty good thanks @sfilipi

@sfilipi

Copy link
Copy Markdown
MemberAuthor

close-reopen to trigger build

@sfilipisfilipi closed this Sep 20, 2018
@sfilipisfilipi reopened this Sep 20, 2018
@sfilipi
sfilipi merged commit 044a6d3 into dotnet:masterSep 20, 2018
@sfilipi
sfilipi deleted the ffmEstimator branch September 20, 2018 19:39
@wschinwschin changed the title FAFM to estimator Field-aware factorization machine to estimatorOct 15, 2018
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

APIIssues pertaining the friendly API

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@sfilipi@TomFinley@Zruty0
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Field-aware factorization machine to estimator - #912

Merged
sfilipi merged 13 commits into
dotnet:masterfrom
sfilipi:ffmEstimator
Sep 20, 2018
Merged

Field-aware factorization machine to estimator#912
sfilipi merged 13 commits into
dotnet:masterfrom
sfilipi:ffmEstimator

Conversation

@sfilipi

@sfilipisfilipi commented Sep 14, 2018

Copy link
Copy Markdown
Member

FAFM now extends TrainerEstimatorBase

@sfilipisfilipi self-assigned this Sep 14, 2018
@sfilipisfilipi added the API Issues pertaining the friendly API label Sep 14, 2018
@sfilipisfilipi added this to the 0918 milestone Sep 14, 2018
@Zruty0Zruty0 mentioned this pull request Sep 14, 2018
@sfilipisfilipi changed the title [WIP] FAFM to extend TrainerEstimatorBase FAFM to estimatorSep 18, 2018
@sfilipi
sfilipi requested a review from wschinSeptember 18, 2018 00:45
protected readonly ISchema TrainSchema;

public string FeatureColumn { get; }
public string[] FeatureColumn { get; }

@Zruty0Zruty0Sep 18, 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.

FeatureColumn [](start = 24, length = 13)

oh no... I don' like this change already.

Forcing ALL predictors to expose parallel arrays of feature columns is not a great change #Closed

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I don't think there's much overhead from it. Do you think it will cause problems? #Closed


IEstimator<ITransformer> est = new FieldAwareFactorizationMachineTrainer(Env, "Label", new[] { "Feature1", "Feature2", "Feature3", "Feature4" });

//var result = est.Fit(data);

@Zruty0Zruty0Sep 18, 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.

// [](start = 12, length = 2)

remove commented out code #Resolved

namespace Microsoft.ML.Tests.TrainerEstimators
{
public sealed class OnlineLinearTests : TestDataPipeBase
public partial class TrainerEstimators

@Zruty0Zruty0Sep 18, 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.

TrainerEstimators [](start = 25, length = 17)

thanks for making this change #ByDesign


namespace Microsoft.ML.Runtime
{
public interface IPredictionTransformer<out TModel> : ITransformer

@Zruty0Zruty0Sep 18, 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.

IPredictionTransformer [](start = 21, length = 22)

I don't think we even need an interface for FFM, since for the time being it's the only trainer that accepts multiple feature columns. #Closed

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

If we want to inquire about all trainers, it is useful to have them extend one interface. #Closed

@Zruty0Zruty0 left a comment

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.

🕐

…tures.
Splitting IPredictionTransformer into two interfaces
Creating a transformer wrapping the FAFM predictor.
{
public partial class TrainerEstimators : TestDataPipeBase
{
[Fact]

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

[Fact] [](start = 7, length = 7)

The test is failing to check whether the input is valid for fit. Resolve before check in. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Thanks @Zruty0 for fixing the mismatch between the active and inactive columns.


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

TModel Model { get; }
}

public interface IClassicPredictionTransformer<out TModel> : IPredictionTransformer<TModel>

@Zruty0Zruty0Sep 19, 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.

Classic [](start = 22, length = 7)

'Classic' sounds a bit wacky, even though it was my suggestion. Maybe 'SingleInput' ?.. #Resolved

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.

Classic is weird.


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


protected void SaveModel(ModelSaveContext ctx)
{
// *** Binary format ***

@Zruty0Zruty0Sep 19, 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.

*** Binary format *** [](start = 15, length = 21)

whenever you save or load, need *** Binary format *** #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

?


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

{
public interface ITrainerEstimator<out TTransformer, out TPredictor>: IEstimator<TTransformer>
where TTransformer: IPredictionTransformer<TPredictor>
where TTransformer: IClassicPredictionTransformer<TPredictor>

@Zruty0Zruty0Sep 19, 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.

IClassicPredictionTransformer [](start = 28, length = 29)

I believe this change is incorrect, isn't it? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No, maybe i named in reverse, but this is the old interface.


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

public string[] FeatureColumns { get; }

/// <summary>
/// The type of the prediction transformer

@Zruty0Zruty0Sep 19, 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.

The type of the prediction transformer [](start = 12, length = 38)

fix the comment #Resolved

loaderSignature: LoaderSignature);
}

private static FieldAwareFactorizationMachinePredictionTransformer Create(IHostEnvironment env, ModelLoadContext ctx)

@Zruty0Zruty0Sep 19, 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.

private [](start = 8, length = 7)

this is just to avoid having a public ctor? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Didn't load through the ctor; i think bc for the ctor the loadable class signature requires the args.


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

@Zruty0Zruty0 left a comment

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.

:shipit:

protected void SaveModel(ModelSaveContext ctx)
{
// *** Binary format ***
// model: prediction model.

@TomFinleyTomFinleySep 19, 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.

model: prediction model. [](start = 15, length = 24)

Technically the model isn't part of this format, since you're not writing it to the stream, you're writing it somewhere else entirely, but that's OK. Consider fixing if you have to change the code anyway. #Resolved

@sfilipisfilipiSep 19, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

@tfinley@gmail.com fixing it == remove the comment?


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

}
}

public abstract class ClassicPredictionTransformerBase<TModel> : PredictionTransformerBase<TModel>, IClassicPredictionTransformer<TModel>, ICanSaveModel

@TomFinleyTomFinleySep 19, 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.

I guess by "classic" this just means a prediction transformer base that takes a single features column as its input. Classic is a bit of a funny word, but then again SinlgeFeaturesPredictionTransformerBase might be a bit of a mouthful and itself potentially confusing. #Resolved


using TDistPredictor = IDistPredictorProducing<float, float>;
using TScalarTrainer = ITrainerEstimator<IPredictionTransformer<IPredictorProducing<float>>, IPredictorProducing<float>>;
using TScalarTrainer = ITrainerEstimator<IClassicPredictionTransformer<IPredictorProducing<float>>, IPredictorProducing<float>>;

@TomFinleyTomFinleySep 19, 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.

Classic [](start = 46, length = 7)

Yes after seeing this a bit I think the word "classic" is just going to confuse the heck out of a lot of people. Please consider doing something else. #Resolved

TModel Model { get; }
}

public interface IClassicPredictionTransformer<out TModel> : IPredictionTransformer<TModel>

@TomFinleyTomFinleySep 19, 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.

IClassicPredictionTransformer [](start = 21, length = 29)

I sort of feel like an interface called IClassicPredictionTransformer needs some XML comment on it. All public interfaces should, but especially one with the word "classic" in the name.

I am choosing to interpret this interface as it gives me classic coke whenever I use it. #Resolved

CheckSameValues(scoredTrain, scoredTrain2);
CheckSameSchemas(scoredTrain.Schema, scoredTrain2.Schema);
CheckSameValues(scoredTrain, scoredTrain2);
};

@TomFinleyTomFinleySep 19, 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.

Somehow these got indented two spaces for no obvious reason. #Resolved

/// Base class for transformers with no feature column, or more than one feature columns.
/// </summary>
/// <typeparam name="TModel"></typeparam>
public abstract class PredictionTransformerBase<TModel> : IPredictionTransformer<TModel>

@TomFinleyTomFinleySep 19, 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.

No documentation? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

it is there? Are you looking at iteration 10?


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

@TomFinleyTomFinley left a comment

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.

Looks pretty good thanks @sfilipi

@sfilipi

Copy link
Copy Markdown
MemberAuthor

close-reopen to trigger build

@sfilipisfilipi closed this Sep 20, 2018
@sfilipisfilipi reopened this Sep 20, 2018
@sfilipi
sfilipi merged commit 044a6d3 into dotnet:masterSep 20, 2018
@sfilipi
sfilipi deleted the ffmEstimator branch September 20, 2018 19:39
@wschinwschin changed the title FAFM to estimator Field-aware factorization machine to estimatorOct 15, 2018
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

APIIssues pertaining the friendly API

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@sfilipi@TomFinley@Zruty0
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Field-aware factorization machine to estimator - #912

Merged
sfilipi merged 13 commits into
dotnet:masterfrom
sfilipi:ffmEstimator
Sep 20, 2018
Merged

Field-aware factorization machine to estimator#912
sfilipi merged 13 commits into
dotnet:masterfrom
sfilipi:ffmEstimator

Conversation

@sfilipi

@sfilipisfilipi commented Sep 14, 2018

Copy link
Copy Markdown
Member

FAFM now extends TrainerEstimatorBase

@sfilipisfilipi self-assigned this Sep 14, 2018
@sfilipisfilipi added the API Issues pertaining the friendly API label Sep 14, 2018
@sfilipisfilipi added this to the 0918 milestone Sep 14, 2018
@Zruty0Zruty0 mentioned this pull request Sep 14, 2018
@sfilipisfilipi changed the title [WIP] FAFM to extend TrainerEstimatorBase FAFM to estimatorSep 18, 2018
@sfilipi
sfilipi requested a review from wschinSeptember 18, 2018 00:45
protected readonly ISchema TrainSchema;

public string FeatureColumn { get; }
public string[] FeatureColumn { get; }

@Zruty0Zruty0Sep 18, 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.

FeatureColumn [](start = 24, length = 13)

oh no... I don' like this change already.

Forcing ALL predictors to expose parallel arrays of feature columns is not a great change #Closed

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I don't think there's much overhead from it. Do you think it will cause problems? #Closed


IEstimator<ITransformer> est = new FieldAwareFactorizationMachineTrainer(Env, "Label", new[] { "Feature1", "Feature2", "Feature3", "Feature4" });

//var result = est.Fit(data);

@Zruty0Zruty0Sep 18, 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.

// [](start = 12, length = 2)

remove commented out code #Resolved

namespace Microsoft.ML.Tests.TrainerEstimators
{
public sealed class OnlineLinearTests : TestDataPipeBase
public partial class TrainerEstimators

@Zruty0Zruty0Sep 18, 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.

TrainerEstimators [](start = 25, length = 17)

thanks for making this change #ByDesign


namespace Microsoft.ML.Runtime
{
public interface IPredictionTransformer<out TModel> : ITransformer

@Zruty0Zruty0Sep 18, 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.

IPredictionTransformer [](start = 21, length = 22)

I don't think we even need an interface for FFM, since for the time being it's the only trainer that accepts multiple feature columns. #Closed

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

If we want to inquire about all trainers, it is useful to have them extend one interface. #Closed

@Zruty0Zruty0 left a comment

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.

🕐

…tures.
Splitting IPredictionTransformer into two interfaces
Creating a transformer wrapping the FAFM predictor.
{
public partial class TrainerEstimators : TestDataPipeBase
{
[Fact]

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

[Fact] [](start = 7, length = 7)

The test is failing to check whether the input is valid for fit. Resolve before check in. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Thanks @Zruty0 for fixing the mismatch between the active and inactive columns.


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

TModel Model { get; }
}

public interface IClassicPredictionTransformer<out TModel> : IPredictionTransformer<TModel>

@Zruty0Zruty0Sep 19, 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.

Classic [](start = 22, length = 7)

'Classic' sounds a bit wacky, even though it was my suggestion. Maybe 'SingleInput' ?.. #Resolved

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.

Classic is weird.


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


protected void SaveModel(ModelSaveContext ctx)
{
// *** Binary format ***

@Zruty0Zruty0Sep 19, 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.

*** Binary format *** [](start = 15, length = 21)

whenever you save or load, need *** Binary format *** #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

?


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

{
public interface ITrainerEstimator<out TTransformer, out TPredictor>: IEstimator<TTransformer>
where TTransformer: IPredictionTransformer<TPredictor>
where TTransformer: IClassicPredictionTransformer<TPredictor>

@Zruty0Zruty0Sep 19, 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.

IClassicPredictionTransformer [](start = 28, length = 29)

I believe this change is incorrect, isn't it? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No, maybe i named in reverse, but this is the old interface.


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

public string[] FeatureColumns { get; }

/// <summary>
/// The type of the prediction transformer

@Zruty0Zruty0Sep 19, 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.

The type of the prediction transformer [](start = 12, length = 38)

fix the comment #Resolved

loaderSignature: LoaderSignature);
}

private static FieldAwareFactorizationMachinePredictionTransformer Create(IHostEnvironment env, ModelLoadContext ctx)

@Zruty0Zruty0Sep 19, 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.

private [](start = 8, length = 7)

this is just to avoid having a public ctor? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Didn't load through the ctor; i think bc for the ctor the loadable class signature requires the args.


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

@Zruty0Zruty0 left a comment

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.

:shipit:

protected void SaveModel(ModelSaveContext ctx)
{
// *** Binary format ***
// model: prediction model.

@TomFinleyTomFinleySep 19, 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.

model: prediction model. [](start = 15, length = 24)

Technically the model isn't part of this format, since you're not writing it to the stream, you're writing it somewhere else entirely, but that's OK. Consider fixing if you have to change the code anyway. #Resolved

@sfilipisfilipiSep 19, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

@tfinley@gmail.com fixing it == remove the comment?


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

}
}

public abstract class ClassicPredictionTransformerBase<TModel> : PredictionTransformerBase<TModel>, IClassicPredictionTransformer<TModel>, ICanSaveModel

@TomFinleyTomFinleySep 19, 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.

I guess by "classic" this just means a prediction transformer base that takes a single features column as its input. Classic is a bit of a funny word, but then again SinlgeFeaturesPredictionTransformerBase might be a bit of a mouthful and itself potentially confusing. #Resolved


using TDistPredictor = IDistPredictorProducing<float, float>;
using TScalarTrainer = ITrainerEstimator<IPredictionTransformer<IPredictorProducing<float>>, IPredictorProducing<float>>;
using TScalarTrainer = ITrainerEstimator<IClassicPredictionTransformer<IPredictorProducing<float>>, IPredictorProducing<float>>;

@TomFinleyTomFinleySep 19, 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.

Classic [](start = 46, length = 7)

Yes after seeing this a bit I think the word "classic" is just going to confuse the heck out of a lot of people. Please consider doing something else. #Resolved

TModel Model { get; }
}

public interface IClassicPredictionTransformer<out TModel> : IPredictionTransformer<TModel>

@TomFinleyTomFinleySep 19, 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.

IClassicPredictionTransformer [](start = 21, length = 29)

I sort of feel like an interface called IClassicPredictionTransformer needs some XML comment on it. All public interfaces should, but especially one with the word "classic" in the name.

I am choosing to interpret this interface as it gives me classic coke whenever I use it. #Resolved

CheckSameValues(scoredTrain, scoredTrain2);
CheckSameSchemas(scoredTrain.Schema, scoredTrain2.Schema);
CheckSameValues(scoredTrain, scoredTrain2);
};

@TomFinleyTomFinleySep 19, 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.

Somehow these got indented two spaces for no obvious reason. #Resolved

/// Base class for transformers with no feature column, or more than one feature columns.
/// </summary>
/// <typeparam name="TModel"></typeparam>
public abstract class PredictionTransformerBase<TModel> : IPredictionTransformer<TModel>

@TomFinleyTomFinleySep 19, 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.

No documentation? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

it is there? Are you looking at iteration 10?


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

@TomFinleyTomFinley left a comment

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.

Looks pretty good thanks @sfilipi

@sfilipi

Copy link
Copy Markdown
MemberAuthor

close-reopen to trigger build

@sfilipisfilipi closed this Sep 20, 2018
@sfilipisfilipi reopened this Sep 20, 2018
@sfilipi
sfilipi merged commit 044a6d3 into dotnet:masterSep 20, 2018
@sfilipi
sfilipi deleted the ffmEstimator branch September 20, 2018 19:39
@wschinwschin changed the title FAFM to estimator Field-aware factorization machine to estimatorOct 15, 2018
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

APIIssues pertaining the friendly API

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@sfilipi@TomFinley@Zruty0
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Field-aware factorization machine to estimator - #912

Merged
sfilipi merged 13 commits into
dotnet:masterfrom
sfilipi:ffmEstimator
Sep 20, 2018
Merged

Field-aware factorization machine to estimator#912
sfilipi merged 13 commits into
dotnet:masterfrom
sfilipi:ffmEstimator

Conversation

@sfilipi

@sfilipisfilipi commented Sep 14, 2018

Copy link
Copy Markdown
Member

FAFM now extends TrainerEstimatorBase

@sfilipisfilipi self-assigned this Sep 14, 2018
@sfilipisfilipi added the API Issues pertaining the friendly API label Sep 14, 2018
@sfilipisfilipi added this to the 0918 milestone Sep 14, 2018
@Zruty0Zruty0 mentioned this pull request Sep 14, 2018
@sfilipisfilipi changed the title [WIP] FAFM to extend TrainerEstimatorBase FAFM to estimatorSep 18, 2018
@sfilipi
sfilipi requested a review from wschinSeptember 18, 2018 00:45
protected readonly ISchema TrainSchema;

public string FeatureColumn { get; }
public string[] FeatureColumn { get; }

@Zruty0Zruty0Sep 18, 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.

FeatureColumn [](start = 24, length = 13)

oh no... I don' like this change already.

Forcing ALL predictors to expose parallel arrays of feature columns is not a great change #Closed

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I don't think there's much overhead from it. Do you think it will cause problems? #Closed


IEstimator<ITransformer> est = new FieldAwareFactorizationMachineTrainer(Env, "Label", new[] { "Feature1", "Feature2", "Feature3", "Feature4" });

//var result = est.Fit(data);

@Zruty0Zruty0Sep 18, 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.

// [](start = 12, length = 2)

remove commented out code #Resolved

namespace Microsoft.ML.Tests.TrainerEstimators
{
public sealed class OnlineLinearTests : TestDataPipeBase
public partial class TrainerEstimators

@Zruty0Zruty0Sep 18, 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.

TrainerEstimators [](start = 25, length = 17)

thanks for making this change #ByDesign


namespace Microsoft.ML.Runtime
{
public interface IPredictionTransformer<out TModel> : ITransformer

@Zruty0Zruty0Sep 18, 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.

IPredictionTransformer [](start = 21, length = 22)

I don't think we even need an interface for FFM, since for the time being it's the only trainer that accepts multiple feature columns. #Closed

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

If we want to inquire about all trainers, it is useful to have them extend one interface. #Closed

@Zruty0Zruty0 left a comment

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.

🕐

…tures.
Splitting IPredictionTransformer into two interfaces
Creating a transformer wrapping the FAFM predictor.
{
public partial class TrainerEstimators : TestDataPipeBase
{
[Fact]

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

[Fact] [](start = 7, length = 7)

The test is failing to check whether the input is valid for fit. Resolve before check in. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Thanks @Zruty0 for fixing the mismatch between the active and inactive columns.


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

TModel Model { get; }
}

public interface IClassicPredictionTransformer<out TModel> : IPredictionTransformer<TModel>

@Zruty0Zruty0Sep 19, 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.

Classic [](start = 22, length = 7)

'Classic' sounds a bit wacky, even though it was my suggestion. Maybe 'SingleInput' ?.. #Resolved

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.

Classic is weird.


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


protected void SaveModel(ModelSaveContext ctx)
{
// *** Binary format ***

@Zruty0Zruty0Sep 19, 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.

*** Binary format *** [](start = 15, length = 21)

whenever you save or load, need *** Binary format *** #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

?


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

{
public interface ITrainerEstimator<out TTransformer, out TPredictor>: IEstimator<TTransformer>
where TTransformer: IPredictionTransformer<TPredictor>
where TTransformer: IClassicPredictionTransformer<TPredictor>

@Zruty0Zruty0Sep 19, 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.

IClassicPredictionTransformer [](start = 28, length = 29)

I believe this change is incorrect, isn't it? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No, maybe i named in reverse, but this is the old interface.


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

public string[] FeatureColumns { get; }

/// <summary>
/// The type of the prediction transformer

@Zruty0Zruty0Sep 19, 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.

The type of the prediction transformer [](start = 12, length = 38)

fix the comment #Resolved

loaderSignature: LoaderSignature);
}

private static FieldAwareFactorizationMachinePredictionTransformer Create(IHostEnvironment env, ModelLoadContext ctx)

@Zruty0Zruty0Sep 19, 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.

private [](start = 8, length = 7)

this is just to avoid having a public ctor? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Didn't load through the ctor; i think bc for the ctor the loadable class signature requires the args.


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

@Zruty0Zruty0 left a comment

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.

:shipit:

protected void SaveModel(ModelSaveContext ctx)
{
// *** Binary format ***
// model: prediction model.

@TomFinleyTomFinleySep 19, 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.

model: prediction model. [](start = 15, length = 24)

Technically the model isn't part of this format, since you're not writing it to the stream, you're writing it somewhere else entirely, but that's OK. Consider fixing if you have to change the code anyway. #Resolved

@sfilipisfilipiSep 19, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

@tfinley@gmail.com fixing it == remove the comment?


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

}
}

public abstract class ClassicPredictionTransformerBase<TModel> : PredictionTransformerBase<TModel>, IClassicPredictionTransformer<TModel>, ICanSaveModel

@TomFinleyTomFinleySep 19, 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.

I guess by "classic" this just means a prediction transformer base that takes a single features column as its input. Classic is a bit of a funny word, but then again SinlgeFeaturesPredictionTransformerBase might be a bit of a mouthful and itself potentially confusing. #Resolved


using TDistPredictor = IDistPredictorProducing<float, float>;
using TScalarTrainer = ITrainerEstimator<IPredictionTransformer<IPredictorProducing<float>>, IPredictorProducing<float>>;
using TScalarTrainer = ITrainerEstimator<IClassicPredictionTransformer<IPredictorProducing<float>>, IPredictorProducing<float>>;

@TomFinleyTomFinleySep 19, 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.

Classic [](start = 46, length = 7)

Yes after seeing this a bit I think the word "classic" is just going to confuse the heck out of a lot of people. Please consider doing something else. #Resolved

TModel Model { get; }
}

public interface IClassicPredictionTransformer<out TModel> : IPredictionTransformer<TModel>

@TomFinleyTomFinleySep 19, 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.

IClassicPredictionTransformer [](start = 21, length = 29)

I sort of feel like an interface called IClassicPredictionTransformer needs some XML comment on it. All public interfaces should, but especially one with the word "classic" in the name.

I am choosing to interpret this interface as it gives me classic coke whenever I use it. #Resolved

CheckSameValues(scoredTrain, scoredTrain2);
CheckSameSchemas(scoredTrain.Schema, scoredTrain2.Schema);
CheckSameValues(scoredTrain, scoredTrain2);
};

@TomFinleyTomFinleySep 19, 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.

Somehow these got indented two spaces for no obvious reason. #Resolved

/// Base class for transformers with no feature column, or more than one feature columns.
/// </summary>
/// <typeparam name="TModel"></typeparam>
public abstract class PredictionTransformerBase<TModel> : IPredictionTransformer<TModel>

@TomFinleyTomFinleySep 19, 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.

No documentation? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

it is there? Are you looking at iteration 10?


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

@TomFinleyTomFinley left a comment

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.

Looks pretty good thanks @sfilipi

@sfilipi

Copy link
Copy Markdown
MemberAuthor

close-reopen to trigger build

@sfilipisfilipi closed this Sep 20, 2018
@sfilipisfilipi reopened this Sep 20, 2018
@sfilipi
sfilipi merged commit 044a6d3 into dotnet:masterSep 20, 2018
@sfilipi
sfilipi deleted the ffmEstimator branch September 20, 2018 19:39
@wschinwschin changed the title FAFM to estimator Field-aware factorization machine to estimatorOct 15, 2018
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

APIIssues pertaining the friendly API

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@sfilipi@TomFinley@Zruty0
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Field-aware factorization machine to estimator - #912

Merged
sfilipi merged 13 commits into
dotnet:masterfrom
sfilipi:ffmEstimator
Sep 20, 2018
Merged

Field-aware factorization machine to estimator#912
sfilipi merged 13 commits into
dotnet:masterfrom
sfilipi:ffmEstimator

Conversation

@sfilipi

@sfilipisfilipi commented Sep 14, 2018

Copy link
Copy Markdown
Member

FAFM now extends TrainerEstimatorBase

@sfilipisfilipi self-assigned this Sep 14, 2018
@sfilipisfilipi added the API Issues pertaining the friendly API label Sep 14, 2018
@sfilipisfilipi added this to the 0918 milestone Sep 14, 2018
@Zruty0Zruty0 mentioned this pull request Sep 14, 2018
@sfilipisfilipi changed the title [WIP] FAFM to extend TrainerEstimatorBase FAFM to estimatorSep 18, 2018
@sfilipi
sfilipi requested a review from wschinSeptember 18, 2018 00:45
protected readonly ISchema TrainSchema;

public string FeatureColumn { get; }
public string[] FeatureColumn { get; }

@Zruty0Zruty0Sep 18, 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.

FeatureColumn [](start = 24, length = 13)

oh no... I don' like this change already.

Forcing ALL predictors to expose parallel arrays of feature columns is not a great change #Closed

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I don't think there's much overhead from it. Do you think it will cause problems? #Closed


IEstimator<ITransformer> est = new FieldAwareFactorizationMachineTrainer(Env, "Label", new[] { "Feature1", "Feature2", "Feature3", "Feature4" });

//var result = est.Fit(data);

@Zruty0Zruty0Sep 18, 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.

// [](start = 12, length = 2)

remove commented out code #Resolved

namespace Microsoft.ML.Tests.TrainerEstimators
{
public sealed class OnlineLinearTests : TestDataPipeBase
public partial class TrainerEstimators

@Zruty0Zruty0Sep 18, 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.

TrainerEstimators [](start = 25, length = 17)

thanks for making this change #ByDesign


namespace Microsoft.ML.Runtime
{
public interface IPredictionTransformer<out TModel> : ITransformer

@Zruty0Zruty0Sep 18, 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.

IPredictionTransformer [](start = 21, length = 22)

I don't think we even need an interface for FFM, since for the time being it's the only trainer that accepts multiple feature columns. #Closed

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

If we want to inquire about all trainers, it is useful to have them extend one interface. #Closed

@Zruty0Zruty0 left a comment

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.

🕐

…tures.
Splitting IPredictionTransformer into two interfaces
Creating a transformer wrapping the FAFM predictor.
{
public partial class TrainerEstimators : TestDataPipeBase
{
[Fact]

@sfilipisfilipiSep 18, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

[Fact] [](start = 7, length = 7)

The test is failing to check whether the input is valid for fit. Resolve before check in. #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Thanks @Zruty0 for fixing the mismatch between the active and inactive columns.


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

TModel Model { get; }
}

public interface IClassicPredictionTransformer<out TModel> : IPredictionTransformer<TModel>

@Zruty0Zruty0Sep 19, 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.

Classic [](start = 22, length = 7)

'Classic' sounds a bit wacky, even though it was my suggestion. Maybe 'SingleInput' ?.. #Resolved

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.

Classic is weird.


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


protected void SaveModel(ModelSaveContext ctx)
{
// *** Binary format ***

@Zruty0Zruty0Sep 19, 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.

*** Binary format *** [](start = 15, length = 21)

whenever you save or load, need *** Binary format *** #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

?


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

{
public interface ITrainerEstimator<out TTransformer, out TPredictor>: IEstimator<TTransformer>
where TTransformer: IPredictionTransformer<TPredictor>
where TTransformer: IClassicPredictionTransformer<TPredictor>

@Zruty0Zruty0Sep 19, 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.

IClassicPredictionTransformer [](start = 28, length = 29)

I believe this change is incorrect, isn't it? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No, maybe i named in reverse, but this is the old interface.


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

public string[] FeatureColumns { get; }

/// <summary>
/// The type of the prediction transformer

@Zruty0Zruty0Sep 19, 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.

The type of the prediction transformer [](start = 12, length = 38)

fix the comment #Resolved

loaderSignature: LoaderSignature);
}

private static FieldAwareFactorizationMachinePredictionTransformer Create(IHostEnvironment env, ModelLoadContext ctx)

@Zruty0Zruty0Sep 19, 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.

private [](start = 8, length = 7)

this is just to avoid having a public ctor? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Didn't load through the ctor; i think bc for the ctor the loadable class signature requires the args.


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

@Zruty0Zruty0 left a comment

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.

:shipit:

protected void SaveModel(ModelSaveContext ctx)
{
// *** Binary format ***
// model: prediction model.

@TomFinleyTomFinleySep 19, 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.

model: prediction model. [](start = 15, length = 24)

Technically the model isn't part of this format, since you're not writing it to the stream, you're writing it somewhere else entirely, but that's OK. Consider fixing if you have to change the code anyway. #Resolved

@sfilipisfilipiSep 19, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

@tfinley@gmail.com fixing it == remove the comment?


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

}
}

public abstract class ClassicPredictionTransformerBase<TModel> : PredictionTransformerBase<TModel>, IClassicPredictionTransformer<TModel>, ICanSaveModel

@TomFinleyTomFinleySep 19, 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.

I guess by "classic" this just means a prediction transformer base that takes a single features column as its input. Classic is a bit of a funny word, but then again SinlgeFeaturesPredictionTransformerBase might be a bit of a mouthful and itself potentially confusing. #Resolved


using TDistPredictor = IDistPredictorProducing<float, float>;
using TScalarTrainer = ITrainerEstimator<IPredictionTransformer<IPredictorProducing<float>>, IPredictorProducing<float>>;
using TScalarTrainer = ITrainerEstimator<IClassicPredictionTransformer<IPredictorProducing<float>>, IPredictorProducing<float>>;

@TomFinleyTomFinleySep 19, 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.

Classic [](start = 46, length = 7)

Yes after seeing this a bit I think the word "classic" is just going to confuse the heck out of a lot of people. Please consider doing something else. #Resolved

TModel Model { get; }
}

public interface IClassicPredictionTransformer<out TModel> : IPredictionTransformer<TModel>

@TomFinleyTomFinleySep 19, 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.

IClassicPredictionTransformer [](start = 21, length = 29)

I sort of feel like an interface called IClassicPredictionTransformer needs some XML comment on it. All public interfaces should, but especially one with the word "classic" in the name.

I am choosing to interpret this interface as it gives me classic coke whenever I use it. #Resolved

CheckSameValues(scoredTrain, scoredTrain2);
CheckSameSchemas(scoredTrain.Schema, scoredTrain2.Schema);
CheckSameValues(scoredTrain, scoredTrain2);
};

@TomFinleyTomFinleySep 19, 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.

Somehow these got indented two spaces for no obvious reason. #Resolved

/// Base class for transformers with no feature column, or more than one feature columns.
/// </summary>
/// <typeparam name="TModel"></typeparam>
public abstract class PredictionTransformerBase<TModel> : IPredictionTransformer<TModel>

@TomFinleyTomFinleySep 19, 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.

No documentation? #Pending

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

it is there? Are you looking at iteration 10?


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

@TomFinleyTomFinley left a comment

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.

Looks pretty good thanks @sfilipi

@sfilipi

Copy link
Copy Markdown
MemberAuthor

close-reopen to trigger build

@sfilipisfilipi closed this Sep 20, 2018
@sfilipisfilipi reopened this Sep 20, 2018
@sfilipi
sfilipi merged commit 044a6d3 into dotnet:masterSep 20, 2018
@sfilipi
sfilipi deleted the ffmEstimator branch September 20, 2018 19:39
@wschinwschin changed the title FAFM to estimator Field-aware factorization machine to estimatorOct 15, 2018
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

APIIssues pertaining the friendly API

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@sfilipi@TomFinley@Zruty0