Normalization API helpers - #446

Merged
TomFinley merged 5 commits into
dotnet:masterfrom
TomFinley:tfinley/NormalHelpers
Jul 3, 2018
Merged

Normalization API helpers#446
TomFinley merged 5 commits into
dotnet:masterfrom
TomFinley:tfinley/NormalHelpers

Conversation

@TomFinley

Copy link
Copy Markdown
Contributor

In which I introduce some helpers for normalization, and generally try to clean up the code-base. Addresses #433 . Hopefully will be used in #424, though I've changed the code here to use some of it where it made sense.

  • The Microsoft.ML.Data transform had a "hidden" dependency on Microsoft.ML.Transform project via dependency injection, for its existing "helper" for normalization (the console-app centric version). This has been resolved and replaced with direct instantiation. It required moving the normalizer files, however.

  • Introduction of helpers on NormalizeTransform for API-centric operations. (Not necessarily useful directly for console-application/GUI usage.)

  • Some documentation changes on RoleMappedSchema and RoleMappedData, though more non-cosmetic changes I'd expected would come with Direct API: RoleMappedSchema/Data Cleanup, Improvement #445 .

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
// REVIEW: This verbose constructor should be replaced with zeahmed's enhancements once #405 is committed.

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

As mentioned, can be made more brief with #405. #Closed

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
// REVIEW: This verbose constructor should be replaced with zeahmed's enhancements once #405 is committed.

@Ivanidzo4kaIvanidzo4kaJun 28, 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.

zeahmed [](start = 76, length = 7)

I though we have tendency to remove aliases from codebase... #Resolved

@Ivanidzo4ka

Ivanidzo4ka commented Jun 28, 2018

Copy link
Copy Markdown
Contributor
 groupInfo = ColumnInfo.CreateFromName(data.Schema, convCol.Name, "converted group id");

do we also need this line? it just if you remove labelInfo, groupInfo looks weird if it remaind untouched. #Resolved


Refers to: src/Microsoft.ML.FastTree/FastTree.cs:1361 in 08c9001. [](commit_id = 08c9001, deletion_comment = False)

@Ivanidzo4kaIvanidzo4ka 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:

@TomFinley

Copy link
Copy Markdown
ContributorAuthor
 groupInfo = ColumnInfo.CreateFromName(data.Schema, convCol.Name, "converted group id");

Yes, I should definitely get rid of it -- it's not actually used for anything.


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


Refers to: src/Microsoft.ML.FastTree/FastTree.cs:1361 in 08c9001. [](commit_id = 08c9001, deletion_comment = False)

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
IDataView ApplyNormalizer(IHostEnvironment innerEnv, IDataView input)

@zeahmedzeahmedJun 28, 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.

If my PR goes in first, you will be able to use convenience constructor here...:) #Closed

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I know, I even had a comment about that. :) But Ivan made me remove it. #Closed

@zeahmed

zeahmed commented Jun 28, 2018

Copy link
Copy Markdown
Contributor

I have bunch of changes in NormalizeColumn.cs which is being moved to different location in this PR. The best way to avoid extra work for me would be to let PR #405 go first and then this one.

What do you say? Can you hold this PR until #405 is merged? #Closed

/// This contains information about a column in an <see cref="IDataView"/>. It is essentially a convenience cache
/// containing the name, column index, and column type for the column. The intended usage is that users of <see cref="RoleMappedSchema"/>
/// will have a convenient method of getting the index and type without having to separately query it through the <see cref="ISchema"/>,
/// since practically the first thing a consumer of a <see cref="RoleMappedSchema"/> will want to do once they get a mappping is

@zeahmedzeahmedJun 28, 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 feel comment/summary is not complete here as sentence is ending in is? #Resolved

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sure. You go first then I'll adjust. This work in some ways will be helped by what you're doing as well, as you have noted. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Hmmm I do that sometimes don't I.


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

/// This method will not modify <paramref name="data"/> if the return from that is <c>null</c> or
/// <c>false</c>.</param>
/// <returns>True if the normalizer was applied and <paramref name="data"/> was modified</returns>
public static bool CreateIfNeeded(IHostEnvironment env, ref RoleMappedData data, ITrainer trainer)

@zeahmedzeahmedJun 28, 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.

Great! I will be using this method in #424 just before calling train method, correct? #Closed

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think so. Also probably before the hypothetical cache-if-needed. #Closed

@TomFinleyTomFinley changed the title [WIP] Normalization API helpersNormalization API helpersJul 2, 2018

@zeahmedzeahmed 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:

{
// REVIEW: The role mapped data has the ability to have multiple columns fill the role of features, which is
// useful in some trainers that are nonetheless parameteric and can therefore benefit from normalization.
var featInfo = schema.Feature;

@eerhardteerhardtJul 2, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(nit) check schema for null? #Resolved

}

/// <summary>
/// Returns whether a column has the <see cref="Kinds.IsNormalized"/> metadata set to true.

@eerhardteerhardtJul 2, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(minor) Do we instead want to document what IsNormalized means? "Returns whether a column <insert what IsNormalized means>". #Resolved

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sure, I can add a bit more information. Though that information, I might prefer to make that part of the Kinds static class, since the documentation of those are the primary source of truth. This is just something we added as a convenience on top of that.


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

@eerhardteerhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM. Just some minor questions.

@TomFinley
TomFinleyforce-pushed the tfinley/NormalHelpers branch from d9e0b4d to 3f1e454CompareJuly 2, 2018 21:23
@TomFinley
TomFinley merged commit 53c2a15 into dotnet:masterJul 3, 2018
@TomFinley
TomFinley deleted the tfinley/NormalHelpers branch July 5, 2018 20:07
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request Jul 27, 2018
* API conveniences for the Normalize transform
@ghostghost locked as resolved and limited conversation to collaborators Mar 30, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TomFinley@Ivanidzo4ka@zeahmed@eerhardt
, '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

Normalization API helpers - #446

Merged
TomFinley merged 5 commits into
dotnet:masterfrom
TomFinley:tfinley/NormalHelpers
Jul 3, 2018
Merged

Normalization API helpers#446
TomFinley merged 5 commits into
dotnet:masterfrom
TomFinley:tfinley/NormalHelpers

Conversation

@TomFinley

Copy link
Copy Markdown
Contributor

In which I introduce some helpers for normalization, and generally try to clean up the code-base. Addresses #433 . Hopefully will be used in #424, though I've changed the code here to use some of it where it made sense.

  • The Microsoft.ML.Data transform had a "hidden" dependency on Microsoft.ML.Transform project via dependency injection, for its existing "helper" for normalization (the console-app centric version). This has been resolved and replaced with direct instantiation. It required moving the normalizer files, however.

  • Introduction of helpers on NormalizeTransform for API-centric operations. (Not necessarily useful directly for console-application/GUI usage.)

  • Some documentation changes on RoleMappedSchema and RoleMappedData, though more non-cosmetic changes I'd expected would come with Direct API: RoleMappedSchema/Data Cleanup, Improvement #445 .

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
// REVIEW: This verbose constructor should be replaced with zeahmed's enhancements once #405 is committed.

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

As mentioned, can be made more brief with #405. #Closed

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
// REVIEW: This verbose constructor should be replaced with zeahmed's enhancements once #405 is committed.

@Ivanidzo4kaIvanidzo4kaJun 28, 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.

zeahmed [](start = 76, length = 7)

I though we have tendency to remove aliases from codebase... #Resolved

@Ivanidzo4ka

Ivanidzo4ka commented Jun 28, 2018

Copy link
Copy Markdown
Contributor
 groupInfo = ColumnInfo.CreateFromName(data.Schema, convCol.Name, "converted group id");

do we also need this line? it just if you remove labelInfo, groupInfo looks weird if it remaind untouched. #Resolved


Refers to: src/Microsoft.ML.FastTree/FastTree.cs:1361 in 08c9001. [](commit_id = 08c9001, deletion_comment = False)

@Ivanidzo4kaIvanidzo4ka 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:

@TomFinley

Copy link
Copy Markdown
ContributorAuthor
 groupInfo = ColumnInfo.CreateFromName(data.Schema, convCol.Name, "converted group id");

Yes, I should definitely get rid of it -- it's not actually used for anything.


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


Refers to: src/Microsoft.ML.FastTree/FastTree.cs:1361 in 08c9001. [](commit_id = 08c9001, deletion_comment = False)

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
IDataView ApplyNormalizer(IHostEnvironment innerEnv, IDataView input)

@zeahmedzeahmedJun 28, 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.

If my PR goes in first, you will be able to use convenience constructor here...:) #Closed

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I know, I even had a comment about that. :) But Ivan made me remove it. #Closed

@zeahmed

zeahmed commented Jun 28, 2018

Copy link
Copy Markdown
Contributor

I have bunch of changes in NormalizeColumn.cs which is being moved to different location in this PR. The best way to avoid extra work for me would be to let PR #405 go first and then this one.

What do you say? Can you hold this PR until #405 is merged? #Closed

/// This contains information about a column in an <see cref="IDataView"/>. It is essentially a convenience cache
/// containing the name, column index, and column type for the column. The intended usage is that users of <see cref="RoleMappedSchema"/>
/// will have a convenient method of getting the index and type without having to separately query it through the <see cref="ISchema"/>,
/// since practically the first thing a consumer of a <see cref="RoleMappedSchema"/> will want to do once they get a mappping is

@zeahmedzeahmedJun 28, 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 feel comment/summary is not complete here as sentence is ending in is? #Resolved

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sure. You go first then I'll adjust. This work in some ways will be helped by what you're doing as well, as you have noted. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Hmmm I do that sometimes don't I.


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

/// This method will not modify <paramref name="data"/> if the return from that is <c>null</c> or
/// <c>false</c>.</param>
/// <returns>True if the normalizer was applied and <paramref name="data"/> was modified</returns>
public static bool CreateIfNeeded(IHostEnvironment env, ref RoleMappedData data, ITrainer trainer)

@zeahmedzeahmedJun 28, 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.

Great! I will be using this method in #424 just before calling train method, correct? #Closed

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think so. Also probably before the hypothetical cache-if-needed. #Closed

@TomFinleyTomFinley changed the title [WIP] Normalization API helpersNormalization API helpersJul 2, 2018

@zeahmedzeahmed 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:

{
// REVIEW: The role mapped data has the ability to have multiple columns fill the role of features, which is
// useful in some trainers that are nonetheless parameteric and can therefore benefit from normalization.
var featInfo = schema.Feature;

@eerhardteerhardtJul 2, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(nit) check schema for null? #Resolved

}

/// <summary>
/// Returns whether a column has the <see cref="Kinds.IsNormalized"/> metadata set to true.

@eerhardteerhardtJul 2, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(minor) Do we instead want to document what IsNormalized means? "Returns whether a column <insert what IsNormalized means>". #Resolved

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sure, I can add a bit more information. Though that information, I might prefer to make that part of the Kinds static class, since the documentation of those are the primary source of truth. This is just something we added as a convenience on top of that.


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

@eerhardteerhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM. Just some minor questions.

@TomFinley
TomFinleyforce-pushed the tfinley/NormalHelpers branch from d9e0b4d to 3f1e454CompareJuly 2, 2018 21:23
@TomFinley
TomFinley merged commit 53c2a15 into dotnet:masterJul 3, 2018
@TomFinley
TomFinley deleted the tfinley/NormalHelpers branch July 5, 2018 20:07
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request Jul 27, 2018
* API conveniences for the Normalize transform
@ghostghost locked as resolved and limited conversation to collaborators Mar 30, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TomFinley@Ivanidzo4ka@zeahmed@eerhardt
, '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

Normalization API helpers - #446

Merged
TomFinley merged 5 commits into
dotnet:masterfrom
TomFinley:tfinley/NormalHelpers
Jul 3, 2018
Merged

Normalization API helpers#446
TomFinley merged 5 commits into
dotnet:masterfrom
TomFinley:tfinley/NormalHelpers

Conversation

@TomFinley

Copy link
Copy Markdown
Contributor

In which I introduce some helpers for normalization, and generally try to clean up the code-base. Addresses #433 . Hopefully will be used in #424, though I've changed the code here to use some of it where it made sense.

  • The Microsoft.ML.Data transform had a "hidden" dependency on Microsoft.ML.Transform project via dependency injection, for its existing "helper" for normalization (the console-app centric version). This has been resolved and replaced with direct instantiation. It required moving the normalizer files, however.

  • Introduction of helpers on NormalizeTransform for API-centric operations. (Not necessarily useful directly for console-application/GUI usage.)

  • Some documentation changes on RoleMappedSchema and RoleMappedData, though more non-cosmetic changes I'd expected would come with Direct API: RoleMappedSchema/Data Cleanup, Improvement #445 .

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
// REVIEW: This verbose constructor should be replaced with zeahmed's enhancements once #405 is committed.

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

As mentioned, can be made more brief with #405. #Closed

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
// REVIEW: This verbose constructor should be replaced with zeahmed's enhancements once #405 is committed.

@Ivanidzo4kaIvanidzo4kaJun 28, 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.

zeahmed [](start = 76, length = 7)

I though we have tendency to remove aliases from codebase... #Resolved

@Ivanidzo4ka

Ivanidzo4ka commented Jun 28, 2018

Copy link
Copy Markdown
Contributor
 groupInfo = ColumnInfo.CreateFromName(data.Schema, convCol.Name, "converted group id");

do we also need this line? it just if you remove labelInfo, groupInfo looks weird if it remaind untouched. #Resolved


Refers to: src/Microsoft.ML.FastTree/FastTree.cs:1361 in 08c9001. [](commit_id = 08c9001, deletion_comment = False)

@Ivanidzo4kaIvanidzo4ka 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:

@TomFinley

Copy link
Copy Markdown
ContributorAuthor
 groupInfo = ColumnInfo.CreateFromName(data.Schema, convCol.Name, "converted group id");

Yes, I should definitely get rid of it -- it's not actually used for anything.


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


Refers to: src/Microsoft.ML.FastTree/FastTree.cs:1361 in 08c9001. [](commit_id = 08c9001, deletion_comment = False)

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
IDataView ApplyNormalizer(IHostEnvironment innerEnv, IDataView input)

@zeahmedzeahmedJun 28, 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.

If my PR goes in first, you will be able to use convenience constructor here...:) #Closed

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I know, I even had a comment about that. :) But Ivan made me remove it. #Closed

@zeahmed

zeahmed commented Jun 28, 2018

Copy link
Copy Markdown
Contributor

I have bunch of changes in NormalizeColumn.cs which is being moved to different location in this PR. The best way to avoid extra work for me would be to let PR #405 go first and then this one.

What do you say? Can you hold this PR until #405 is merged? #Closed

/// This contains information about a column in an <see cref="IDataView"/>. It is essentially a convenience cache
/// containing the name, column index, and column type for the column. The intended usage is that users of <see cref="RoleMappedSchema"/>
/// will have a convenient method of getting the index and type without having to separately query it through the <see cref="ISchema"/>,
/// since practically the first thing a consumer of a <see cref="RoleMappedSchema"/> will want to do once they get a mappping is

@zeahmedzeahmedJun 28, 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 feel comment/summary is not complete here as sentence is ending in is? #Resolved

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sure. You go first then I'll adjust. This work in some ways will be helped by what you're doing as well, as you have noted. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Hmmm I do that sometimes don't I.


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

/// This method will not modify <paramref name="data"/> if the return from that is <c>null</c> or
/// <c>false</c>.</param>
/// <returns>True if the normalizer was applied and <paramref name="data"/> was modified</returns>
public static bool CreateIfNeeded(IHostEnvironment env, ref RoleMappedData data, ITrainer trainer)

@zeahmedzeahmedJun 28, 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.

Great! I will be using this method in #424 just before calling train method, correct? #Closed

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think so. Also probably before the hypothetical cache-if-needed. #Closed

@TomFinleyTomFinley changed the title [WIP] Normalization API helpersNormalization API helpersJul 2, 2018

@zeahmedzeahmed 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:

{
// REVIEW: The role mapped data has the ability to have multiple columns fill the role of features, which is
// useful in some trainers that are nonetheless parameteric and can therefore benefit from normalization.
var featInfo = schema.Feature;

@eerhardteerhardtJul 2, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(nit) check schema for null? #Resolved

}

/// <summary>
/// Returns whether a column has the <see cref="Kinds.IsNormalized"/> metadata set to true.

@eerhardteerhardtJul 2, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(minor) Do we instead want to document what IsNormalized means? "Returns whether a column <insert what IsNormalized means>". #Resolved

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sure, I can add a bit more information. Though that information, I might prefer to make that part of the Kinds static class, since the documentation of those are the primary source of truth. This is just something we added as a convenience on top of that.


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

@eerhardteerhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM. Just some minor questions.

@TomFinley
TomFinleyforce-pushed the tfinley/NormalHelpers branch from d9e0b4d to 3f1e454CompareJuly 2, 2018 21:23
@TomFinley
TomFinley merged commit 53c2a15 into dotnet:masterJul 3, 2018
@TomFinley
TomFinley deleted the tfinley/NormalHelpers branch July 5, 2018 20:07
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request Jul 27, 2018
* API conveniences for the Normalize transform
@ghostghost locked as resolved and limited conversation to collaborators Mar 30, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TomFinley@Ivanidzo4ka@zeahmed@eerhardt
, '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

Normalization API helpers - #446

Merged
TomFinley merged 5 commits into
dotnet:masterfrom
TomFinley:tfinley/NormalHelpers
Jul 3, 2018
Merged

Normalization API helpers#446
TomFinley merged 5 commits into
dotnet:masterfrom
TomFinley:tfinley/NormalHelpers

Conversation

@TomFinley

Copy link
Copy Markdown
Contributor

In which I introduce some helpers for normalization, and generally try to clean up the code-base. Addresses #433 . Hopefully will be used in #424, though I've changed the code here to use some of it where it made sense.

  • The Microsoft.ML.Data transform had a "hidden" dependency on Microsoft.ML.Transform project via dependency injection, for its existing "helper" for normalization (the console-app centric version). This has been resolved and replaced with direct instantiation. It required moving the normalizer files, however.

  • Introduction of helpers on NormalizeTransform for API-centric operations. (Not necessarily useful directly for console-application/GUI usage.)

  • Some documentation changes on RoleMappedSchema and RoleMappedData, though more non-cosmetic changes I'd expected would come with Direct API: RoleMappedSchema/Data Cleanup, Improvement #445 .

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
// REVIEW: This verbose constructor should be replaced with zeahmed's enhancements once #405 is committed.

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

As mentioned, can be made more brief with #405. #Closed

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
// REVIEW: This verbose constructor should be replaced with zeahmed's enhancements once #405 is committed.

@Ivanidzo4kaIvanidzo4kaJun 28, 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.

zeahmed [](start = 76, length = 7)

I though we have tendency to remove aliases from codebase... #Resolved

@Ivanidzo4ka

Ivanidzo4ka commented Jun 28, 2018

Copy link
Copy Markdown
Contributor
 groupInfo = ColumnInfo.CreateFromName(data.Schema, convCol.Name, "converted group id");

do we also need this line? it just if you remove labelInfo, groupInfo looks weird if it remaind untouched. #Resolved


Refers to: src/Microsoft.ML.FastTree/FastTree.cs:1361 in 08c9001. [](commit_id = 08c9001, deletion_comment = False)

@Ivanidzo4kaIvanidzo4ka 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:

@TomFinley

Copy link
Copy Markdown
ContributorAuthor
 groupInfo = ColumnInfo.CreateFromName(data.Schema, convCol.Name, "converted group id");

Yes, I should definitely get rid of it -- it's not actually used for anything.


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


Refers to: src/Microsoft.ML.FastTree/FastTree.cs:1361 in 08c9001. [](commit_id = 08c9001, deletion_comment = False)

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
IDataView ApplyNormalizer(IHostEnvironment innerEnv, IDataView input)

@zeahmedzeahmedJun 28, 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.

If my PR goes in first, you will be able to use convenience constructor here...:) #Closed

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I know, I even had a comment about that. :) But Ivan made me remove it. #Closed

@zeahmed

zeahmed commented Jun 28, 2018

Copy link
Copy Markdown
Contributor

I have bunch of changes in NormalizeColumn.cs which is being moved to different location in this PR. The best way to avoid extra work for me would be to let PR #405 go first and then this one.

What do you say? Can you hold this PR until #405 is merged? #Closed

/// This contains information about a column in an <see cref="IDataView"/>. It is essentially a convenience cache
/// containing the name, column index, and column type for the column. The intended usage is that users of <see cref="RoleMappedSchema"/>
/// will have a convenient method of getting the index and type without having to separately query it through the <see cref="ISchema"/>,
/// since practically the first thing a consumer of a <see cref="RoleMappedSchema"/> will want to do once they get a mappping is

@zeahmedzeahmedJun 28, 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 feel comment/summary is not complete here as sentence is ending in is? #Resolved

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sure. You go first then I'll adjust. This work in some ways will be helped by what you're doing as well, as you have noted. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Hmmm I do that sometimes don't I.


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

/// This method will not modify <paramref name="data"/> if the return from that is <c>null</c> or
/// <c>false</c>.</param>
/// <returns>True if the normalizer was applied and <paramref name="data"/> was modified</returns>
public static bool CreateIfNeeded(IHostEnvironment env, ref RoleMappedData data, ITrainer trainer)

@zeahmedzeahmedJun 28, 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.

Great! I will be using this method in #424 just before calling train method, correct? #Closed

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think so. Also probably before the hypothetical cache-if-needed. #Closed

@TomFinleyTomFinley changed the title [WIP] Normalization API helpersNormalization API helpersJul 2, 2018

@zeahmedzeahmed 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:

{
// REVIEW: The role mapped data has the ability to have multiple columns fill the role of features, which is
// useful in some trainers that are nonetheless parameteric and can therefore benefit from normalization.
var featInfo = schema.Feature;

@eerhardteerhardtJul 2, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(nit) check schema for null? #Resolved

}

/// <summary>
/// Returns whether a column has the <see cref="Kinds.IsNormalized"/> metadata set to true.

@eerhardteerhardtJul 2, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(minor) Do we instead want to document what IsNormalized means? "Returns whether a column <insert what IsNormalized means>". #Resolved

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sure, I can add a bit more information. Though that information, I might prefer to make that part of the Kinds static class, since the documentation of those are the primary source of truth. This is just something we added as a convenience on top of that.


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

@eerhardteerhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM. Just some minor questions.

@TomFinley
TomFinleyforce-pushed the tfinley/NormalHelpers branch from d9e0b4d to 3f1e454CompareJuly 2, 2018 21:23
@TomFinley
TomFinley merged commit 53c2a15 into dotnet:masterJul 3, 2018
@TomFinley
TomFinley deleted the tfinley/NormalHelpers branch July 5, 2018 20:07
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request Jul 27, 2018
* API conveniences for the Normalize transform
@ghostghost locked as resolved and limited conversation to collaborators Mar 30, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TomFinley@Ivanidzo4ka@zeahmed@eerhardt
, '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

Normalization API helpers - #446

Merged
TomFinley merged 5 commits into
dotnet:masterfrom
TomFinley:tfinley/NormalHelpers
Jul 3, 2018
Merged

Normalization API helpers#446
TomFinley merged 5 commits into
dotnet:masterfrom
TomFinley:tfinley/NormalHelpers

Conversation

@TomFinley

Copy link
Copy Markdown
Contributor

In which I introduce some helpers for normalization, and generally try to clean up the code-base. Addresses #433 . Hopefully will be used in #424, though I've changed the code here to use some of it where it made sense.

  • The Microsoft.ML.Data transform had a "hidden" dependency on Microsoft.ML.Transform project via dependency injection, for its existing "helper" for normalization (the console-app centric version). This has been resolved and replaced with direct instantiation. It required moving the normalizer files, however.

  • Introduction of helpers on NormalizeTransform for API-centric operations. (Not necessarily useful directly for console-application/GUI usage.)

  • Some documentation changes on RoleMappedSchema and RoleMappedData, though more non-cosmetic changes I'd expected would come with Direct API: RoleMappedSchema/Data Cleanup, Improvement #445 .

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
// REVIEW: This verbose constructor should be replaced with zeahmed's enhancements once #405 is committed.

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

As mentioned, can be made more brief with #405. #Closed

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
// REVIEW: This verbose constructor should be replaced with zeahmed's enhancements once #405 is committed.

@Ivanidzo4kaIvanidzo4kaJun 28, 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.

zeahmed [](start = 76, length = 7)

I though we have tendency to remove aliases from codebase... #Resolved

@Ivanidzo4ka

Ivanidzo4ka commented Jun 28, 2018

Copy link
Copy Markdown
Contributor
 groupInfo = ColumnInfo.CreateFromName(data.Schema, convCol.Name, "converted group id");

do we also need this line? it just if you remove labelInfo, groupInfo looks weird if it remaind untouched. #Resolved


Refers to: src/Microsoft.ML.FastTree/FastTree.cs:1361 in 08c9001. [](commit_id = 08c9001, deletion_comment = False)

@Ivanidzo4kaIvanidzo4ka 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:

@TomFinley

Copy link
Copy Markdown
ContributorAuthor
 groupInfo = ColumnInfo.CreateFromName(data.Schema, convCol.Name, "converted group id");

Yes, I should definitely get rid of it -- it's not actually used for anything.


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


Refers to: src/Microsoft.ML.FastTree/FastTree.cs:1361 in 08c9001. [](commit_id = 08c9001, deletion_comment = False)

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
IDataView ApplyNormalizer(IHostEnvironment innerEnv, IDataView input)

@zeahmedzeahmedJun 28, 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.

If my PR goes in first, you will be able to use convenience constructor here...:) #Closed

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I know, I even had a comment about that. :) But Ivan made me remove it. #Closed

@zeahmed

zeahmed commented Jun 28, 2018

Copy link
Copy Markdown
Contributor

I have bunch of changes in NormalizeColumn.cs which is being moved to different location in this PR. The best way to avoid extra work for me would be to let PR #405 go first and then this one.

What do you say? Can you hold this PR until #405 is merged? #Closed

/// This contains information about a column in an <see cref="IDataView"/>. It is essentially a convenience cache
/// containing the name, column index, and column type for the column. The intended usage is that users of <see cref="RoleMappedSchema"/>
/// will have a convenient method of getting the index and type without having to separately query it through the <see cref="ISchema"/>,
/// since practically the first thing a consumer of a <see cref="RoleMappedSchema"/> will want to do once they get a mappping is

@zeahmedzeahmedJun 28, 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 feel comment/summary is not complete here as sentence is ending in is? #Resolved

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sure. You go first then I'll adjust. This work in some ways will be helped by what you're doing as well, as you have noted. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Hmmm I do that sometimes don't I.


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

/// This method will not modify <paramref name="data"/> if the return from that is <c>null</c> or
/// <c>false</c>.</param>
/// <returns>True if the normalizer was applied and <paramref name="data"/> was modified</returns>
public static bool CreateIfNeeded(IHostEnvironment env, ref RoleMappedData data, ITrainer trainer)

@zeahmedzeahmedJun 28, 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.

Great! I will be using this method in #424 just before calling train method, correct? #Closed

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think so. Also probably before the hypothetical cache-if-needed. #Closed

@TomFinleyTomFinley changed the title [WIP] Normalization API helpersNormalization API helpersJul 2, 2018

@zeahmedzeahmed 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:

{
// REVIEW: The role mapped data has the ability to have multiple columns fill the role of features, which is
// useful in some trainers that are nonetheless parameteric and can therefore benefit from normalization.
var featInfo = schema.Feature;

@eerhardteerhardtJul 2, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(nit) check schema for null? #Resolved

}

/// <summary>
/// Returns whether a column has the <see cref="Kinds.IsNormalized"/> metadata set to true.

@eerhardteerhardtJul 2, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(minor) Do we instead want to document what IsNormalized means? "Returns whether a column <insert what IsNormalized means>". #Resolved

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sure, I can add a bit more information. Though that information, I might prefer to make that part of the Kinds static class, since the documentation of those are the primary source of truth. This is just something we added as a convenience on top of that.


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

@eerhardteerhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM. Just some minor questions.

@TomFinley
TomFinleyforce-pushed the tfinley/NormalHelpers branch from d9e0b4d to 3f1e454CompareJuly 2, 2018 21:23
@TomFinley
TomFinley merged commit 53c2a15 into dotnet:masterJul 3, 2018
@TomFinley
TomFinley deleted the tfinley/NormalHelpers branch July 5, 2018 20:07
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request Jul 27, 2018
* API conveniences for the Normalize transform
@ghostghost locked as resolved and limited conversation to collaborators Mar 30, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TomFinley@Ivanidzo4ka@zeahmed@eerhardt
, '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

Normalization API helpers - #446

Merged
TomFinley merged 5 commits into
dotnet:masterfrom
TomFinley:tfinley/NormalHelpers
Jul 3, 2018
Merged

Normalization API helpers#446
TomFinley merged 5 commits into
dotnet:masterfrom
TomFinley:tfinley/NormalHelpers

Conversation

@TomFinley

Copy link
Copy Markdown
Contributor

In which I introduce some helpers for normalization, and generally try to clean up the code-base. Addresses #433 . Hopefully will be used in #424, though I've changed the code here to use some of it where it made sense.

  • The Microsoft.ML.Data transform had a "hidden" dependency on Microsoft.ML.Transform project via dependency injection, for its existing "helper" for normalization (the console-app centric version). This has been resolved and replaced with direct instantiation. It required moving the normalizer files, however.

  • Introduction of helpers on NormalizeTransform for API-centric operations. (Not necessarily useful directly for console-application/GUI usage.)

  • Some documentation changes on RoleMappedSchema and RoleMappedData, though more non-cosmetic changes I'd expected would come with Direct API: RoleMappedSchema/Data Cleanup, Improvement #445 .

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
// REVIEW: This verbose constructor should be replaced with zeahmed's enhancements once #405 is committed.

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

As mentioned, can be made more brief with #405. #Closed

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
// REVIEW: This verbose constructor should be replaced with zeahmed's enhancements once #405 is committed.

@Ivanidzo4kaIvanidzo4kaJun 28, 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.

zeahmed [](start = 76, length = 7)

I though we have tendency to remove aliases from codebase... #Resolved

@Ivanidzo4ka

Ivanidzo4ka commented Jun 28, 2018

Copy link
Copy Markdown
Contributor
 groupInfo = ColumnInfo.CreateFromName(data.Schema, convCol.Name, "converted group id");

do we also need this line? it just if you remove labelInfo, groupInfo looks weird if it remaind untouched. #Resolved


Refers to: src/Microsoft.ML.FastTree/FastTree.cs:1361 in 08c9001. [](commit_id = 08c9001, deletion_comment = False)

@Ivanidzo4kaIvanidzo4ka 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:

@TomFinley

Copy link
Copy Markdown
ContributorAuthor
 groupInfo = ColumnInfo.CreateFromName(data.Schema, convCol.Name, "converted group id");

Yes, I should definitely get rid of it -- it's not actually used for anything.


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


Refers to: src/Microsoft.ML.FastTree/FastTree.cs:1361 in 08c9001. [](commit_id = 08c9001, deletion_comment = False)

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
IDataView ApplyNormalizer(IHostEnvironment innerEnv, IDataView input)

@zeahmedzeahmedJun 28, 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.

If my PR goes in first, you will be able to use convenience constructor here...:) #Closed

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I know, I even had a comment about that. :) But Ivan made me remove it. #Closed

@zeahmed

zeahmed commented Jun 28, 2018

Copy link
Copy Markdown
Contributor

I have bunch of changes in NormalizeColumn.cs which is being moved to different location in this PR. The best way to avoid extra work for me would be to let PR #405 go first and then this one.

What do you say? Can you hold this PR until #405 is merged? #Closed

/// This contains information about a column in an <see cref="IDataView"/>. It is essentially a convenience cache
/// containing the name, column index, and column type for the column. The intended usage is that users of <see cref="RoleMappedSchema"/>
/// will have a convenient method of getting the index and type without having to separately query it through the <see cref="ISchema"/>,
/// since practically the first thing a consumer of a <see cref="RoleMappedSchema"/> will want to do once they get a mappping is

@zeahmedzeahmedJun 28, 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 feel comment/summary is not complete here as sentence is ending in is? #Resolved

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sure. You go first then I'll adjust. This work in some ways will be helped by what you're doing as well, as you have noted. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Hmmm I do that sometimes don't I.


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

/// This method will not modify <paramref name="data"/> if the return from that is <c>null</c> or
/// <c>false</c>.</param>
/// <returns>True if the normalizer was applied and <paramref name="data"/> was modified</returns>
public static bool CreateIfNeeded(IHostEnvironment env, ref RoleMappedData data, ITrainer trainer)

@zeahmedzeahmedJun 28, 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.

Great! I will be using this method in #424 just before calling train method, correct? #Closed

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think so. Also probably before the hypothetical cache-if-needed. #Closed

@TomFinleyTomFinley changed the title [WIP] Normalization API helpersNormalization API helpersJul 2, 2018

@zeahmedzeahmed 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:

{
// REVIEW: The role mapped data has the ability to have multiple columns fill the role of features, which is
// useful in some trainers that are nonetheless parameteric and can therefore benefit from normalization.
var featInfo = schema.Feature;

@eerhardteerhardtJul 2, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(nit) check schema for null? #Resolved

}

/// <summary>
/// Returns whether a column has the <see cref="Kinds.IsNormalized"/> metadata set to true.

@eerhardteerhardtJul 2, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(minor) Do we instead want to document what IsNormalized means? "Returns whether a column <insert what IsNormalized means>". #Resolved

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sure, I can add a bit more information. Though that information, I might prefer to make that part of the Kinds static class, since the documentation of those are the primary source of truth. This is just something we added as a convenience on top of that.


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

@eerhardteerhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM. Just some minor questions.

@TomFinley
TomFinleyforce-pushed the tfinley/NormalHelpers branch from d9e0b4d to 3f1e454CompareJuly 2, 2018 21:23
@TomFinley
TomFinley merged commit 53c2a15 into dotnet:masterJul 3, 2018
@TomFinley
TomFinley deleted the tfinley/NormalHelpers branch July 5, 2018 20:07
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request Jul 27, 2018
* API conveniences for the Normalize transform
@ghostghost locked as resolved and limited conversation to collaborators Mar 30, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TomFinley@Ivanidzo4ka@zeahmed@eerhardt
, '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

Normalization API helpers - #446

Merged
TomFinley merged 5 commits into
dotnet:masterfrom
TomFinley:tfinley/NormalHelpers
Jul 3, 2018
Merged

Normalization API helpers#446
TomFinley merged 5 commits into
dotnet:masterfrom
TomFinley:tfinley/NormalHelpers

Conversation

@TomFinley

Copy link
Copy Markdown
Contributor

In which I introduce some helpers for normalization, and generally try to clean up the code-base. Addresses #433 . Hopefully will be used in #424, though I've changed the code here to use some of it where it made sense.

  • The Microsoft.ML.Data transform had a "hidden" dependency on Microsoft.ML.Transform project via dependency injection, for its existing "helper" for normalization (the console-app centric version). This has been resolved and replaced with direct instantiation. It required moving the normalizer files, however.

  • Introduction of helpers on NormalizeTransform for API-centric operations. (Not necessarily useful directly for console-application/GUI usage.)

  • Some documentation changes on RoleMappedSchema and RoleMappedData, though more non-cosmetic changes I'd expected would come with Direct API: RoleMappedSchema/Data Cleanup, Improvement #445 .

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
// REVIEW: This verbose constructor should be replaced with zeahmed's enhancements once #405 is committed.

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

As mentioned, can be made more brief with #405. #Closed

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
// REVIEW: This verbose constructor should be replaced with zeahmed's enhancements once #405 is committed.

@Ivanidzo4kaIvanidzo4kaJun 28, 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.

zeahmed [](start = 76, length = 7)

I though we have tendency to remove aliases from codebase... #Resolved

@Ivanidzo4ka

Ivanidzo4ka commented Jun 28, 2018

Copy link
Copy Markdown
Contributor
 groupInfo = ColumnInfo.CreateFromName(data.Schema, convCol.Name, "converted group id");

do we also need this line? it just if you remove labelInfo, groupInfo looks weird if it remaind untouched. #Resolved


Refers to: src/Microsoft.ML.FastTree/FastTree.cs:1361 in 08c9001. [](commit_id = 08c9001, deletion_comment = False)

@Ivanidzo4kaIvanidzo4ka 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:

@TomFinley

Copy link
Copy Markdown
ContributorAuthor
 groupInfo = ColumnInfo.CreateFromName(data.Schema, convCol.Name, "converted group id");

Yes, I should definitely get rid of it -- it's not actually used for anything.


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


Refers to: src/Microsoft.ML.FastTree/FastTree.cs:1361 in 08c9001. [](commit_id = 08c9001, deletion_comment = False)

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
IDataView ApplyNormalizer(IHostEnvironment innerEnv, IDataView input)

@zeahmedzeahmedJun 28, 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.

If my PR goes in first, you will be able to use convenience constructor here...:) #Closed

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I know, I even had a comment about that. :) But Ivan made me remove it. #Closed

@zeahmed

zeahmed commented Jun 28, 2018

Copy link
Copy Markdown
Contributor

I have bunch of changes in NormalizeColumn.cs which is being moved to different location in this PR. The best way to avoid extra work for me would be to let PR #405 go first and then this one.

What do you say? Can you hold this PR until #405 is merged? #Closed

/// This contains information about a column in an <see cref="IDataView"/>. It is essentially a convenience cache
/// containing the name, column index, and column type for the column. The intended usage is that users of <see cref="RoleMappedSchema"/>
/// will have a convenient method of getting the index and type without having to separately query it through the <see cref="ISchema"/>,
/// since practically the first thing a consumer of a <see cref="RoleMappedSchema"/> will want to do once they get a mappping is

@zeahmedzeahmedJun 28, 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 feel comment/summary is not complete here as sentence is ending in is? #Resolved

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sure. You go first then I'll adjust. This work in some ways will be helped by what you're doing as well, as you have noted. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Hmmm I do that sometimes don't I.


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

/// This method will not modify <paramref name="data"/> if the return from that is <c>null</c> or
/// <c>false</c>.</param>
/// <returns>True if the normalizer was applied and <paramref name="data"/> was modified</returns>
public static bool CreateIfNeeded(IHostEnvironment env, ref RoleMappedData data, ITrainer trainer)

@zeahmedzeahmedJun 28, 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.

Great! I will be using this method in #424 just before calling train method, correct? #Closed

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think so. Also probably before the hypothetical cache-if-needed. #Closed

@TomFinleyTomFinley changed the title [WIP] Normalization API helpersNormalization API helpersJul 2, 2018

@zeahmedzeahmed 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:

{
// REVIEW: The role mapped data has the ability to have multiple columns fill the role of features, which is
// useful in some trainers that are nonetheless parameteric and can therefore benefit from normalization.
var featInfo = schema.Feature;

@eerhardteerhardtJul 2, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(nit) check schema for null? #Resolved

}

/// <summary>
/// Returns whether a column has the <see cref="Kinds.IsNormalized"/> metadata set to true.

@eerhardteerhardtJul 2, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(minor) Do we instead want to document what IsNormalized means? "Returns whether a column <insert what IsNormalized means>". #Resolved

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sure, I can add a bit more information. Though that information, I might prefer to make that part of the Kinds static class, since the documentation of those are the primary source of truth. This is just something we added as a convenience on top of that.


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

@eerhardteerhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM. Just some minor questions.

@TomFinley
TomFinleyforce-pushed the tfinley/NormalHelpers branch from d9e0b4d to 3f1e454CompareJuly 2, 2018 21:23
@TomFinley
TomFinley merged commit 53c2a15 into dotnet:masterJul 3, 2018
@TomFinley
TomFinley deleted the tfinley/NormalHelpers branch July 5, 2018 20:07
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request Jul 27, 2018
* API conveniences for the Normalize transform
@ghostghost locked as resolved and limited conversation to collaborators Mar 30, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TomFinley@Ivanidzo4ka@zeahmed@eerhardt
, '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

Normalization API helpers - #446

Merged
TomFinley merged 5 commits into
dotnet:masterfrom
TomFinley:tfinley/NormalHelpers
Jul 3, 2018
Merged

Normalization API helpers#446
TomFinley merged 5 commits into
dotnet:masterfrom
TomFinley:tfinley/NormalHelpers

Conversation

@TomFinley

Copy link
Copy Markdown
Contributor

In which I introduce some helpers for normalization, and generally try to clean up the code-base. Addresses #433 . Hopefully will be used in #424, though I've changed the code here to use some of it where it made sense.

  • The Microsoft.ML.Data transform had a "hidden" dependency on Microsoft.ML.Transform project via dependency injection, for its existing "helper" for normalization (the console-app centric version). This has been resolved and replaced with direct instantiation. It required moving the normalizer files, however.

  • Introduction of helpers on NormalizeTransform for API-centric operations. (Not necessarily useful directly for console-application/GUI usage.)

  • Some documentation changes on RoleMappedSchema and RoleMappedData, though more non-cosmetic changes I'd expected would come with Direct API: RoleMappedSchema/Data Cleanup, Improvement #445 .

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
// REVIEW: This verbose constructor should be replaced with zeahmed's enhancements once #405 is committed.

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

As mentioned, can be made more brief with #405. #Closed

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
// REVIEW: This verbose constructor should be replaced with zeahmed's enhancements once #405 is committed.

@Ivanidzo4kaIvanidzo4kaJun 28, 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.

zeahmed [](start = 76, length = 7)

I though we have tendency to remove aliases from codebase... #Resolved

@Ivanidzo4ka

Ivanidzo4ka commented Jun 28, 2018

Copy link
Copy Markdown
Contributor
 groupInfo = ColumnInfo.CreateFromName(data.Schema, convCol.Name, "converted group id");

do we also need this line? it just if you remove labelInfo, groupInfo looks weird if it remaind untouched. #Resolved


Refers to: src/Microsoft.ML.FastTree/FastTree.cs:1361 in 08c9001. [](commit_id = 08c9001, deletion_comment = False)

@Ivanidzo4kaIvanidzo4ka 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:

@TomFinley

Copy link
Copy Markdown
ContributorAuthor
 groupInfo = ColumnInfo.CreateFromName(data.Schema, convCol.Name, "converted group id");

Yes, I should definitely get rid of it -- it's not actually used for anything.


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


Refers to: src/Microsoft.ML.FastTree/FastTree.cs:1361 in 08c9001. [](commit_id = 08c9001, deletion_comment = False)

view = CompositeDataLoader.Create(env, loader,
new KeyValuePair<string, SubComponent<IDataTransform, SignatureDataTransform>>(null, component));
}
IDataView ApplyNormalizer(IHostEnvironment innerEnv, IDataView input)

@zeahmedzeahmedJun 28, 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.

If my PR goes in first, you will be able to use convenience constructor here...:) #Closed

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I know, I even had a comment about that. :) But Ivan made me remove it. #Closed

@zeahmed

zeahmed commented Jun 28, 2018

Copy link
Copy Markdown
Contributor

I have bunch of changes in NormalizeColumn.cs which is being moved to different location in this PR. The best way to avoid extra work for me would be to let PR #405 go first and then this one.

What do you say? Can you hold this PR until #405 is merged? #Closed

/// This contains information about a column in an <see cref="IDataView"/>. It is essentially a convenience cache
/// containing the name, column index, and column type for the column. The intended usage is that users of <see cref="RoleMappedSchema"/>
/// will have a convenient method of getting the index and type without having to separately query it through the <see cref="ISchema"/>,
/// since practically the first thing a consumer of a <see cref="RoleMappedSchema"/> will want to do once they get a mappping is

@zeahmedzeahmedJun 28, 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 feel comment/summary is not complete here as sentence is ending in is? #Resolved

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sure. You go first then I'll adjust. This work in some ways will be helped by what you're doing as well, as you have noted. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Hmmm I do that sometimes don't I.


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

/// This method will not modify <paramref name="data"/> if the return from that is <c>null</c> or
/// <c>false</c>.</param>
/// <returns>True if the normalizer was applied and <paramref name="data"/> was modified</returns>
public static bool CreateIfNeeded(IHostEnvironment env, ref RoleMappedData data, ITrainer trainer)

@zeahmedzeahmedJun 28, 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.

Great! I will be using this method in #424 just before calling train method, correct? #Closed

@TomFinleyTomFinleyJun 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I think so. Also probably before the hypothetical cache-if-needed. #Closed

@TomFinleyTomFinley changed the title [WIP] Normalization API helpersNormalization API helpersJul 2, 2018

@zeahmedzeahmed 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:

{
// REVIEW: The role mapped data has the ability to have multiple columns fill the role of features, which is
// useful in some trainers that are nonetheless parameteric and can therefore benefit from normalization.
var featInfo = schema.Feature;

@eerhardteerhardtJul 2, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(nit) check schema for null? #Resolved

}

/// <summary>
/// Returns whether a column has the <see cref="Kinds.IsNormalized"/> metadata set to true.

@eerhardteerhardtJul 2, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(minor) Do we instead want to document what IsNormalized means? "Returns whether a column <insert what IsNormalized means>". #Resolved

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Sure, I can add a bit more information. Though that information, I might prefer to make that part of the Kinds static class, since the documentation of those are the primary source of truth. This is just something we added as a convenience on top of that.


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

@eerhardteerhardt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM. Just some minor questions.

@TomFinley
TomFinleyforce-pushed the tfinley/NormalHelpers branch from d9e0b4d to 3f1e454CompareJuly 2, 2018 21:23
@TomFinley
TomFinley merged commit 53c2a15 into dotnet:masterJul 3, 2018
@TomFinley
TomFinley deleted the tfinley/NormalHelpers branch July 5, 2018 20:07
eerhardt pushed a commit to eerhardt/machinelearning that referenced this pull request Jul 27, 2018
* API conveniences for the Normalize transform
@ghostghost locked as resolved and limited conversation to collaborators Mar 30, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@TomFinley@Ivanidzo4ka@zeahmed@eerhardt