Initial featurizers project - #4413

Merged
michaelgsharp merged 9 commits into
dotnet:masterfrom
michaelgsharp:featurizers-project
Dec 3, 2019
Merged

Initial featurizers project#4413
michaelgsharp merged 9 commits into
dotnet:masterfrom
michaelgsharp:featurizers-project

Conversation

@michaelgsharp

Copy link
Copy Markdown
Contributor

This is the initial featurizers PR to split apart PR #4157 and get all the common code into master.
Once this code goes in, I will create separate PR's for each of the 5 featurizers.

This is the common code for the featurizers. Its mostly changes to project files and solution files. Common.cs is for all the shared code for the featurizers. The change in Utils.cs is to allow Marshal.Invoke with multiple type parameters. The RowToRowMapperTransform.cs change has it create a new mapper when possible. This helps with thread safety/local caching of the mappers when run in a multi threaded approach.

@michaelgsharp
michaelgsharp requested a review from a teamOctober 29, 2019 23:31
@michaelgsharpmichaelgsharp self-assigned this Oct 29, 2019
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
Comment threadDirectory.Build.props
// Not all these types are currently supported. This is so the ordering will allign with the native code.
internal enum TypeId : uint
{
String = 1, SByte, Short, Int, Long, Byte, UShort,

@eerhardteerhardtOct 30, 2019

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.

Typical C# code has these be on separate lines. #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.

Good to know. Put them all on their own line.


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

@justinormontjustinormontNov 18, 2019

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.

Should we have a int next to each? This will assist with long term compatibility by allowing for inserting new values, and in case someone decides to sort the enum differently later (more important if serialized in a model). #Resolved

@michaelgsharpmichaelgsharpNov 19, 2019

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.

Yeah, you are correct. I have added an int next to each one now. #Resolved

@justinormontjustinormontNov 19, 2019

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.

Thanks #Resolved

Comment threadsrc/Microsoft.ML.Featurizers/Common.cs
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
var meth = MarshalActionInvokeCheckAndCreate(func, genArgs);
if (meth.ReturnType != typeof(TRet))
throw Contracts.ExceptParam(nameof(func), "Cannot be generic on return type");
return meth;

@justinormontjustinormontNov 18, 2019

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 don't think method is a reserved keyword in C#. Recommend the longer name.

Suggested change
returnmeth;
returnmethod;
``` #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.

I kept it as meth because that is consistent with all the other methods here that do this same thing. I think if we want it to be method then we need to change them all.


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


<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<PackageDescription>Additional ML.NET featurizers</PackageDescription>

@codemzscodemzsNov 18, 2019

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.

Additional ML.NET featurizers [](start = 24, length = 29)

ML .NET featurizers with native code implementation. #Resolved

return meth;
}

private static MethodInfo MarshalInvokeCheckAndCreate<TRet>(Delegate func, Type[] genArgs)

@codemzscodemzsNov 18, 2019

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.

Delegate func, Type[] genArgs) [](start = 68, length = 30)

lets keep the order consistent types then delegate #Resolved

return meth;
}

private static MethodInfo MarshalActionInvokeCheckAndCreate(Delegate func, params Type[] typeArguments)

@codemzscodemzsNov 18, 2019

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.

(Delegate func, params Type[] typeArguments) [](start = 67, length = 44)

same here, lets keep the order consistent, types then delegate #Resolved


internal enum FitResult : byte
{
Complete = 1, Continue, ResetAndContinue

@codemzscodemzsNov 18, 2019

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.

Complete = 1, Continue, ResetAndContinue [](start = 8, length = 40)

put each on its own line and explicitly define values. #Resolved

Tabular = 0x1001 | LastStaticValue + 3,
Nullable = 0x1001 | LastStaticValue + 4,
Vector = 0x1001 | LastStaticValue + 5,
MapId = 0x1002 | LastStaticValue + 6

@codemzscodemzsNov 18, 2019

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.

MapId = 0x1002 | LastStaticValue + 6 [](start = 8, length = 36)

please add comments for this #Resolved

@justinormontjustinormontNov 19, 2019

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.

Why does this add LastStaticValue? In the future, this will shift all of the uint values by 1, as a new type is inserted to the top section.

Why the math? Seems more simple to directly map to the values.

Why is the base of the last one 0x1002? That skips a value. #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.

All of these are taken directly as is from the Native code base. They are here just so we have a correct mapping on our side.

LastStaticValue is supposed to represent the last stand alone type. All the types that follow after it are compound types. There is probably a more appropriate name, but since I want to keep this identical to the Native code I left it as is.

The math is there just to keep it identical to the native code. I could directly map the values, but then I would have to map the values every time I need to check if it has changed in the native code. Leaving it like this makes comparisons much easier.

The number at the end of 0x100N represents how many types come after it that are associated to it. So Tabular, Nullable, and Vector, end in 1 meaning only 1 type follows it. The Map ends in 2 because we need types for the Keys and for the Values.


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

return Encoding.UTF8.GetString(buffer);
}
}
}

@codemzscodemzsNov 18, 2019

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.

} [](start = 8, length = 1)

new line #Resolved

return TypeId.Int;
else if (type == typeof(long))
return TypeId.Long;
else if (type == typeof(byte))

@codemzscodemzsNov 18, 2019

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.

(byte)) [](start = 35, length = 7)

sbyte #Resolved

else if (type == typeof(long))
return TypeId.Long;
else if (type == typeof(byte))
return TypeId.Byte;

@codemzscodemzsNov 18, 2019

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.

Byte [](start = 30, length = 4)

SByte #Resolved

@codemzs

codemzs commented Nov 18, 2019

Copy link
Copy Markdown
Member

Can you please add comments for these functions? and how they are used? #Resolved


Refers to: src/Microsoft.ML.Featurizers/Common.cs:205 in 49f3798. [](commit_id = 49f3798, deletion_comment = False)

@codemzscodemzs 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.

:shipit:

: base(provider, input)
{
var pred = parent.GetActiveOutputColumns(active);
_getters = parent._mapper.CreateGetters(input, pred, out _disposer);

@codemzscodemzsNov 18, 2019

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.

_getters = parent._mapper.CreateGetters(input, pred, out _disposer); [](start = 16, length = 68)

lets revert this and use a thread safe dictionary for now. I want to think a little more on this. #Resolved

@codecov

codecovBot commented Nov 19, 2019

Copy link
Copy Markdown

Codecov Report

❗ No coverage uploaded for pull request base (master@1fa6cb5). Click here to learn what that means.
The diff coverage is n/a.

@@ Coverage Diff @@## master #4413 +/- ##
=========================================
Coverage ? 74.86% =========================================
Files ? 908 Lines ? 159862 Branches ? 17214 =========================================
Hits ? 119688 Misses ? 35354 Partials ? 4820
FlagCoverage Δ
#Debug74.86% <ø> (?)
#production70.22% <ø> (?)
#test90.19% <ø> (?)

@codemzs

Copy link
Copy Markdown
Member

@michaelgsharp Can you please sync to master?

ToStringTransformer is done.
CatagoryImputer is done.
TimeSeriesImputer is done.
RobustScaler is done.
Adding in samples and documentation. General code cleanup. Made the RowToRowMapperTransform create a new mapper if possible for each cursor.
michaelgsharpand others added 2 commits November 22, 2019 14:14
Added line in Directory.Build.Props that was removed during the rebase process. The line already exists in master and shouldn't be removed.
@michaelgsharp
michaelgsharp merged commit 8d20cdd into dotnet:masterDec 3, 2019
@michaelgsharp
michaelgsharp deleted the featurizers-project branch December 3, 2019 22:38
@ghostghost locked as resolved and limited conversation to collaborators Mar 20, 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

@michaelgsharp@codemzs@justinormont@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

Initial featurizers project - #4413

Merged
michaelgsharp merged 9 commits into
dotnet:masterfrom
michaelgsharp:featurizers-project
Dec 3, 2019
Merged

Initial featurizers project#4413
michaelgsharp merged 9 commits into
dotnet:masterfrom
michaelgsharp:featurizers-project

Conversation

@michaelgsharp

Copy link
Copy Markdown
Contributor

This is the initial featurizers PR to split apart PR #4157 and get all the common code into master.
Once this code goes in, I will create separate PR's for each of the 5 featurizers.

This is the common code for the featurizers. Its mostly changes to project files and solution files. Common.cs is for all the shared code for the featurizers. The change in Utils.cs is to allow Marshal.Invoke with multiple type parameters. The RowToRowMapperTransform.cs change has it create a new mapper when possible. This helps with thread safety/local caching of the mappers when run in a multi threaded approach.

@michaelgsharp
michaelgsharp requested a review from a teamOctober 29, 2019 23:31
@michaelgsharpmichaelgsharp self-assigned this Oct 29, 2019
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
Comment threadDirectory.Build.props
// Not all these types are currently supported. This is so the ordering will allign with the native code.
internal enum TypeId : uint
{
String = 1, SByte, Short, Int, Long, Byte, UShort,

@eerhardteerhardtOct 30, 2019

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.

Typical C# code has these be on separate lines. #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.

Good to know. Put them all on their own line.


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

@justinormontjustinormontNov 18, 2019

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.

Should we have a int next to each? This will assist with long term compatibility by allowing for inserting new values, and in case someone decides to sort the enum differently later (more important if serialized in a model). #Resolved

@michaelgsharpmichaelgsharpNov 19, 2019

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.

Yeah, you are correct. I have added an int next to each one now. #Resolved

@justinormontjustinormontNov 19, 2019

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.

Thanks #Resolved

Comment threadsrc/Microsoft.ML.Featurizers/Common.cs
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
var meth = MarshalActionInvokeCheckAndCreate(func, genArgs);
if (meth.ReturnType != typeof(TRet))
throw Contracts.ExceptParam(nameof(func), "Cannot be generic on return type");
return meth;

@justinormontjustinormontNov 18, 2019

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 don't think method is a reserved keyword in C#. Recommend the longer name.

Suggested change
returnmeth;
returnmethod;
``` #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.

I kept it as meth because that is consistent with all the other methods here that do this same thing. I think if we want it to be method then we need to change them all.


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


<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<PackageDescription>Additional ML.NET featurizers</PackageDescription>

@codemzscodemzsNov 18, 2019

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.

Additional ML.NET featurizers [](start = 24, length = 29)

ML .NET featurizers with native code implementation. #Resolved

return meth;
}

private static MethodInfo MarshalInvokeCheckAndCreate<TRet>(Delegate func, Type[] genArgs)

@codemzscodemzsNov 18, 2019

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.

Delegate func, Type[] genArgs) [](start = 68, length = 30)

lets keep the order consistent types then delegate #Resolved

return meth;
}

private static MethodInfo MarshalActionInvokeCheckAndCreate(Delegate func, params Type[] typeArguments)

@codemzscodemzsNov 18, 2019

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.

(Delegate func, params Type[] typeArguments) [](start = 67, length = 44)

same here, lets keep the order consistent, types then delegate #Resolved


internal enum FitResult : byte
{
Complete = 1, Continue, ResetAndContinue

@codemzscodemzsNov 18, 2019

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.

Complete = 1, Continue, ResetAndContinue [](start = 8, length = 40)

put each on its own line and explicitly define values. #Resolved

Tabular = 0x1001 | LastStaticValue + 3,
Nullable = 0x1001 | LastStaticValue + 4,
Vector = 0x1001 | LastStaticValue + 5,
MapId = 0x1002 | LastStaticValue + 6

@codemzscodemzsNov 18, 2019

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.

MapId = 0x1002 | LastStaticValue + 6 [](start = 8, length = 36)

please add comments for this #Resolved

@justinormontjustinormontNov 19, 2019

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.

Why does this add LastStaticValue? In the future, this will shift all of the uint values by 1, as a new type is inserted to the top section.

Why the math? Seems more simple to directly map to the values.

Why is the base of the last one 0x1002? That skips a value. #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.

All of these are taken directly as is from the Native code base. They are here just so we have a correct mapping on our side.

LastStaticValue is supposed to represent the last stand alone type. All the types that follow after it are compound types. There is probably a more appropriate name, but since I want to keep this identical to the Native code I left it as is.

The math is there just to keep it identical to the native code. I could directly map the values, but then I would have to map the values every time I need to check if it has changed in the native code. Leaving it like this makes comparisons much easier.

The number at the end of 0x100N represents how many types come after it that are associated to it. So Tabular, Nullable, and Vector, end in 1 meaning only 1 type follows it. The Map ends in 2 because we need types for the Keys and for the Values.


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

return Encoding.UTF8.GetString(buffer);
}
}
}

@codemzscodemzsNov 18, 2019

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.

} [](start = 8, length = 1)

new line #Resolved

return TypeId.Int;
else if (type == typeof(long))
return TypeId.Long;
else if (type == typeof(byte))

@codemzscodemzsNov 18, 2019

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.

(byte)) [](start = 35, length = 7)

sbyte #Resolved

else if (type == typeof(long))
return TypeId.Long;
else if (type == typeof(byte))
return TypeId.Byte;

@codemzscodemzsNov 18, 2019

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.

Byte [](start = 30, length = 4)

SByte #Resolved

@codemzs

codemzs commented Nov 18, 2019

Copy link
Copy Markdown
Member

Can you please add comments for these functions? and how they are used? #Resolved


Refers to: src/Microsoft.ML.Featurizers/Common.cs:205 in 49f3798. [](commit_id = 49f3798, deletion_comment = False)

@codemzscodemzs 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.

:shipit:

: base(provider, input)
{
var pred = parent.GetActiveOutputColumns(active);
_getters = parent._mapper.CreateGetters(input, pred, out _disposer);

@codemzscodemzsNov 18, 2019

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.

_getters = parent._mapper.CreateGetters(input, pred, out _disposer); [](start = 16, length = 68)

lets revert this and use a thread safe dictionary for now. I want to think a little more on this. #Resolved

@codecov

codecovBot commented Nov 19, 2019

Copy link
Copy Markdown

Codecov Report

❗ No coverage uploaded for pull request base (master@1fa6cb5). Click here to learn what that means.
The diff coverage is n/a.

@@ Coverage Diff @@## master #4413 +/- ##
=========================================
Coverage ? 74.86% =========================================
Files ? 908 Lines ? 159862 Branches ? 17214 =========================================
Hits ? 119688 Misses ? 35354 Partials ? 4820
FlagCoverage Δ
#Debug74.86% <ø> (?)
#production70.22% <ø> (?)
#test90.19% <ø> (?)

@codemzs

Copy link
Copy Markdown
Member

@michaelgsharp Can you please sync to master?

ToStringTransformer is done.
CatagoryImputer is done.
TimeSeriesImputer is done.
RobustScaler is done.
Adding in samples and documentation. General code cleanup. Made the RowToRowMapperTransform create a new mapper if possible for each cursor.
michaelgsharpand others added 2 commits November 22, 2019 14:14
Added line in Directory.Build.Props that was removed during the rebase process. The line already exists in master and shouldn't be removed.
@michaelgsharp
michaelgsharp merged commit 8d20cdd into dotnet:masterDec 3, 2019
@michaelgsharp
michaelgsharp deleted the featurizers-project branch December 3, 2019 22:38
@ghostghost locked as resolved and limited conversation to collaborators Mar 20, 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

@michaelgsharp@codemzs@justinormont@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

Initial featurizers project - #4413

Merged
michaelgsharp merged 9 commits into
dotnet:masterfrom
michaelgsharp:featurizers-project
Dec 3, 2019
Merged

Initial featurizers project#4413
michaelgsharp merged 9 commits into
dotnet:masterfrom
michaelgsharp:featurizers-project

Conversation

@michaelgsharp

Copy link
Copy Markdown
Contributor

This is the initial featurizers PR to split apart PR #4157 and get all the common code into master.
Once this code goes in, I will create separate PR's for each of the 5 featurizers.

This is the common code for the featurizers. Its mostly changes to project files and solution files. Common.cs is for all the shared code for the featurizers. The change in Utils.cs is to allow Marshal.Invoke with multiple type parameters. The RowToRowMapperTransform.cs change has it create a new mapper when possible. This helps with thread safety/local caching of the mappers when run in a multi threaded approach.

@michaelgsharp
michaelgsharp requested a review from a teamOctober 29, 2019 23:31
@michaelgsharpmichaelgsharp self-assigned this Oct 29, 2019
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
Comment threadDirectory.Build.props
// Not all these types are currently supported. This is so the ordering will allign with the native code.
internal enum TypeId : uint
{
String = 1, SByte, Short, Int, Long, Byte, UShort,

@eerhardteerhardtOct 30, 2019

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.

Typical C# code has these be on separate lines. #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.

Good to know. Put them all on their own line.


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

@justinormontjustinormontNov 18, 2019

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.

Should we have a int next to each? This will assist with long term compatibility by allowing for inserting new values, and in case someone decides to sort the enum differently later (more important if serialized in a model). #Resolved

@michaelgsharpmichaelgsharpNov 19, 2019

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.

Yeah, you are correct. I have added an int next to each one now. #Resolved

@justinormontjustinormontNov 19, 2019

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.

Thanks #Resolved

Comment threadsrc/Microsoft.ML.Featurizers/Common.cs
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
var meth = MarshalActionInvokeCheckAndCreate(func, genArgs);
if (meth.ReturnType != typeof(TRet))
throw Contracts.ExceptParam(nameof(func), "Cannot be generic on return type");
return meth;

@justinormontjustinormontNov 18, 2019

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 don't think method is a reserved keyword in C#. Recommend the longer name.

Suggested change
returnmeth;
returnmethod;
``` #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.

I kept it as meth because that is consistent with all the other methods here that do this same thing. I think if we want it to be method then we need to change them all.


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


<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<PackageDescription>Additional ML.NET featurizers</PackageDescription>

@codemzscodemzsNov 18, 2019

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.

Additional ML.NET featurizers [](start = 24, length = 29)

ML .NET featurizers with native code implementation. #Resolved

return meth;
}

private static MethodInfo MarshalInvokeCheckAndCreate<TRet>(Delegate func, Type[] genArgs)

@codemzscodemzsNov 18, 2019

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.

Delegate func, Type[] genArgs) [](start = 68, length = 30)

lets keep the order consistent types then delegate #Resolved

return meth;
}

private static MethodInfo MarshalActionInvokeCheckAndCreate(Delegate func, params Type[] typeArguments)

@codemzscodemzsNov 18, 2019

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.

(Delegate func, params Type[] typeArguments) [](start = 67, length = 44)

same here, lets keep the order consistent, types then delegate #Resolved


internal enum FitResult : byte
{
Complete = 1, Continue, ResetAndContinue

@codemzscodemzsNov 18, 2019

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.

Complete = 1, Continue, ResetAndContinue [](start = 8, length = 40)

put each on its own line and explicitly define values. #Resolved

Tabular = 0x1001 | LastStaticValue + 3,
Nullable = 0x1001 | LastStaticValue + 4,
Vector = 0x1001 | LastStaticValue + 5,
MapId = 0x1002 | LastStaticValue + 6

@codemzscodemzsNov 18, 2019

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.

MapId = 0x1002 | LastStaticValue + 6 [](start = 8, length = 36)

please add comments for this #Resolved

@justinormontjustinormontNov 19, 2019

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.

Why does this add LastStaticValue? In the future, this will shift all of the uint values by 1, as a new type is inserted to the top section.

Why the math? Seems more simple to directly map to the values.

Why is the base of the last one 0x1002? That skips a value. #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.

All of these are taken directly as is from the Native code base. They are here just so we have a correct mapping on our side.

LastStaticValue is supposed to represent the last stand alone type. All the types that follow after it are compound types. There is probably a more appropriate name, but since I want to keep this identical to the Native code I left it as is.

The math is there just to keep it identical to the native code. I could directly map the values, but then I would have to map the values every time I need to check if it has changed in the native code. Leaving it like this makes comparisons much easier.

The number at the end of 0x100N represents how many types come after it that are associated to it. So Tabular, Nullable, and Vector, end in 1 meaning only 1 type follows it. The Map ends in 2 because we need types for the Keys and for the Values.


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

return Encoding.UTF8.GetString(buffer);
}
}
}

@codemzscodemzsNov 18, 2019

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.

} [](start = 8, length = 1)

new line #Resolved

return TypeId.Int;
else if (type == typeof(long))
return TypeId.Long;
else if (type == typeof(byte))

@codemzscodemzsNov 18, 2019

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.

(byte)) [](start = 35, length = 7)

sbyte #Resolved

else if (type == typeof(long))
return TypeId.Long;
else if (type == typeof(byte))
return TypeId.Byte;

@codemzscodemzsNov 18, 2019

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.

Byte [](start = 30, length = 4)

SByte #Resolved

@codemzs

codemzs commented Nov 18, 2019

Copy link
Copy Markdown
Member

Can you please add comments for these functions? and how they are used? #Resolved


Refers to: src/Microsoft.ML.Featurizers/Common.cs:205 in 49f3798. [](commit_id = 49f3798, deletion_comment = False)

@codemzscodemzs 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.

:shipit:

: base(provider, input)
{
var pred = parent.GetActiveOutputColumns(active);
_getters = parent._mapper.CreateGetters(input, pred, out _disposer);

@codemzscodemzsNov 18, 2019

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.

_getters = parent._mapper.CreateGetters(input, pred, out _disposer); [](start = 16, length = 68)

lets revert this and use a thread safe dictionary for now. I want to think a little more on this. #Resolved

@codecov

codecovBot commented Nov 19, 2019

Copy link
Copy Markdown

Codecov Report

❗ No coverage uploaded for pull request base (master@1fa6cb5). Click here to learn what that means.
The diff coverage is n/a.

@@ Coverage Diff @@## master #4413 +/- ##
=========================================
Coverage ? 74.86% =========================================
Files ? 908 Lines ? 159862 Branches ? 17214 =========================================
Hits ? 119688 Misses ? 35354 Partials ? 4820
FlagCoverage Δ
#Debug74.86% <ø> (?)
#production70.22% <ø> (?)
#test90.19% <ø> (?)

@codemzs

Copy link
Copy Markdown
Member

@michaelgsharp Can you please sync to master?

ToStringTransformer is done.
CatagoryImputer is done.
TimeSeriesImputer is done.
RobustScaler is done.
Adding in samples and documentation. General code cleanup. Made the RowToRowMapperTransform create a new mapper if possible for each cursor.
michaelgsharpand others added 2 commits November 22, 2019 14:14
Added line in Directory.Build.Props that was removed during the rebase process. The line already exists in master and shouldn't be removed.
@michaelgsharp
michaelgsharp merged commit 8d20cdd into dotnet:masterDec 3, 2019
@michaelgsharp
michaelgsharp deleted the featurizers-project branch December 3, 2019 22:38
@ghostghost locked as resolved and limited conversation to collaborators Mar 20, 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

@michaelgsharp@codemzs@justinormont@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

Initial featurizers project - #4413

Merged
michaelgsharp merged 9 commits into
dotnet:masterfrom
michaelgsharp:featurizers-project
Dec 3, 2019
Merged

Initial featurizers project#4413
michaelgsharp merged 9 commits into
dotnet:masterfrom
michaelgsharp:featurizers-project

Conversation

@michaelgsharp

Copy link
Copy Markdown
Contributor

This is the initial featurizers PR to split apart PR #4157 and get all the common code into master.
Once this code goes in, I will create separate PR's for each of the 5 featurizers.

This is the common code for the featurizers. Its mostly changes to project files and solution files. Common.cs is for all the shared code for the featurizers. The change in Utils.cs is to allow Marshal.Invoke with multiple type parameters. The RowToRowMapperTransform.cs change has it create a new mapper when possible. This helps with thread safety/local caching of the mappers when run in a multi threaded approach.

@michaelgsharp
michaelgsharp requested a review from a teamOctober 29, 2019 23:31
@michaelgsharpmichaelgsharp self-assigned this Oct 29, 2019
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
Comment threadDirectory.Build.props
// Not all these types are currently supported. This is so the ordering will allign with the native code.
internal enum TypeId : uint
{
String = 1, SByte, Short, Int, Long, Byte, UShort,

@eerhardteerhardtOct 30, 2019

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.

Typical C# code has these be on separate lines. #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.

Good to know. Put them all on their own line.


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

@justinormontjustinormontNov 18, 2019

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.

Should we have a int next to each? This will assist with long term compatibility by allowing for inserting new values, and in case someone decides to sort the enum differently later (more important if serialized in a model). #Resolved

@michaelgsharpmichaelgsharpNov 19, 2019

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.

Yeah, you are correct. I have added an int next to each one now. #Resolved

@justinormontjustinormontNov 19, 2019

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.

Thanks #Resolved

Comment threadsrc/Microsoft.ML.Featurizers/Common.cs
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
var meth = MarshalActionInvokeCheckAndCreate(func, genArgs);
if (meth.ReturnType != typeof(TRet))
throw Contracts.ExceptParam(nameof(func), "Cannot be generic on return type");
return meth;

@justinormontjustinormontNov 18, 2019

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 don't think method is a reserved keyword in C#. Recommend the longer name.

Suggested change
returnmeth;
returnmethod;
``` #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.

I kept it as meth because that is consistent with all the other methods here that do this same thing. I think if we want it to be method then we need to change them all.


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


<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<PackageDescription>Additional ML.NET featurizers</PackageDescription>

@codemzscodemzsNov 18, 2019

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.

Additional ML.NET featurizers [](start = 24, length = 29)

ML .NET featurizers with native code implementation. #Resolved

return meth;
}

private static MethodInfo MarshalInvokeCheckAndCreate<TRet>(Delegate func, Type[] genArgs)

@codemzscodemzsNov 18, 2019

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.

Delegate func, Type[] genArgs) [](start = 68, length = 30)

lets keep the order consistent types then delegate #Resolved

return meth;
}

private static MethodInfo MarshalActionInvokeCheckAndCreate(Delegate func, params Type[] typeArguments)

@codemzscodemzsNov 18, 2019

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.

(Delegate func, params Type[] typeArguments) [](start = 67, length = 44)

same here, lets keep the order consistent, types then delegate #Resolved


internal enum FitResult : byte
{
Complete = 1, Continue, ResetAndContinue

@codemzscodemzsNov 18, 2019

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.

Complete = 1, Continue, ResetAndContinue [](start = 8, length = 40)

put each on its own line and explicitly define values. #Resolved

Tabular = 0x1001 | LastStaticValue + 3,
Nullable = 0x1001 | LastStaticValue + 4,
Vector = 0x1001 | LastStaticValue + 5,
MapId = 0x1002 | LastStaticValue + 6

@codemzscodemzsNov 18, 2019

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.

MapId = 0x1002 | LastStaticValue + 6 [](start = 8, length = 36)

please add comments for this #Resolved

@justinormontjustinormontNov 19, 2019

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.

Why does this add LastStaticValue? In the future, this will shift all of the uint values by 1, as a new type is inserted to the top section.

Why the math? Seems more simple to directly map to the values.

Why is the base of the last one 0x1002? That skips a value. #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.

All of these are taken directly as is from the Native code base. They are here just so we have a correct mapping on our side.

LastStaticValue is supposed to represent the last stand alone type. All the types that follow after it are compound types. There is probably a more appropriate name, but since I want to keep this identical to the Native code I left it as is.

The math is there just to keep it identical to the native code. I could directly map the values, but then I would have to map the values every time I need to check if it has changed in the native code. Leaving it like this makes comparisons much easier.

The number at the end of 0x100N represents how many types come after it that are associated to it. So Tabular, Nullable, and Vector, end in 1 meaning only 1 type follows it. The Map ends in 2 because we need types for the Keys and for the Values.


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

return Encoding.UTF8.GetString(buffer);
}
}
}

@codemzscodemzsNov 18, 2019

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.

} [](start = 8, length = 1)

new line #Resolved

return TypeId.Int;
else if (type == typeof(long))
return TypeId.Long;
else if (type == typeof(byte))

@codemzscodemzsNov 18, 2019

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.

(byte)) [](start = 35, length = 7)

sbyte #Resolved

else if (type == typeof(long))
return TypeId.Long;
else if (type == typeof(byte))
return TypeId.Byte;

@codemzscodemzsNov 18, 2019

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.

Byte [](start = 30, length = 4)

SByte #Resolved

@codemzs

codemzs commented Nov 18, 2019

Copy link
Copy Markdown
Member

Can you please add comments for these functions? and how they are used? #Resolved


Refers to: src/Microsoft.ML.Featurizers/Common.cs:205 in 49f3798. [](commit_id = 49f3798, deletion_comment = False)

@codemzscodemzs 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.

:shipit:

: base(provider, input)
{
var pred = parent.GetActiveOutputColumns(active);
_getters = parent._mapper.CreateGetters(input, pred, out _disposer);

@codemzscodemzsNov 18, 2019

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.

_getters = parent._mapper.CreateGetters(input, pred, out _disposer); [](start = 16, length = 68)

lets revert this and use a thread safe dictionary for now. I want to think a little more on this. #Resolved

@codecov

codecovBot commented Nov 19, 2019

Copy link
Copy Markdown

Codecov Report

❗ No coverage uploaded for pull request base (master@1fa6cb5). Click here to learn what that means.
The diff coverage is n/a.

@@ Coverage Diff @@## master #4413 +/- ##
=========================================
Coverage ? 74.86% =========================================
Files ? 908 Lines ? 159862 Branches ? 17214 =========================================
Hits ? 119688 Misses ? 35354 Partials ? 4820
FlagCoverage Δ
#Debug74.86% <ø> (?)
#production70.22% <ø> (?)
#test90.19% <ø> (?)

@codemzs

Copy link
Copy Markdown
Member

@michaelgsharp Can you please sync to master?

ToStringTransformer is done.
CatagoryImputer is done.
TimeSeriesImputer is done.
RobustScaler is done.
Adding in samples and documentation. General code cleanup. Made the RowToRowMapperTransform create a new mapper if possible for each cursor.
michaelgsharpand others added 2 commits November 22, 2019 14:14
Added line in Directory.Build.Props that was removed during the rebase process. The line already exists in master and shouldn't be removed.
@michaelgsharp
michaelgsharp merged commit 8d20cdd into dotnet:masterDec 3, 2019
@michaelgsharp
michaelgsharp deleted the featurizers-project branch December 3, 2019 22:38
@ghostghost locked as resolved and limited conversation to collaborators Mar 20, 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

@michaelgsharp@codemzs@justinormont@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

Initial featurizers project - #4413

Merged
michaelgsharp merged 9 commits into
dotnet:masterfrom
michaelgsharp:featurizers-project
Dec 3, 2019
Merged

Initial featurizers project#4413
michaelgsharp merged 9 commits into
dotnet:masterfrom
michaelgsharp:featurizers-project

Conversation

@michaelgsharp

Copy link
Copy Markdown
Contributor

This is the initial featurizers PR to split apart PR #4157 and get all the common code into master.
Once this code goes in, I will create separate PR's for each of the 5 featurizers.

This is the common code for the featurizers. Its mostly changes to project files and solution files. Common.cs is for all the shared code for the featurizers. The change in Utils.cs is to allow Marshal.Invoke with multiple type parameters. The RowToRowMapperTransform.cs change has it create a new mapper when possible. This helps with thread safety/local caching of the mappers when run in a multi threaded approach.

@michaelgsharp
michaelgsharp requested a review from a teamOctober 29, 2019 23:31
@michaelgsharpmichaelgsharp self-assigned this Oct 29, 2019
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
Comment threadDirectory.Build.props
// Not all these types are currently supported. This is so the ordering will allign with the native code.
internal enum TypeId : uint
{
String = 1, SByte, Short, Int, Long, Byte, UShort,

@eerhardteerhardtOct 30, 2019

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.

Typical C# code has these be on separate lines. #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.

Good to know. Put them all on their own line.


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

@justinormontjustinormontNov 18, 2019

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.

Should we have a int next to each? This will assist with long term compatibility by allowing for inserting new values, and in case someone decides to sort the enum differently later (more important if serialized in a model). #Resolved

@michaelgsharpmichaelgsharpNov 19, 2019

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.

Yeah, you are correct. I have added an int next to each one now. #Resolved

@justinormontjustinormontNov 19, 2019

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.

Thanks #Resolved

Comment threadsrc/Microsoft.ML.Featurizers/Common.cs
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
var meth = MarshalActionInvokeCheckAndCreate(func, genArgs);
if (meth.ReturnType != typeof(TRet))
throw Contracts.ExceptParam(nameof(func), "Cannot be generic on return type");
return meth;

@justinormontjustinormontNov 18, 2019

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 don't think method is a reserved keyword in C#. Recommend the longer name.

Suggested change
returnmeth;
returnmethod;
``` #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.

I kept it as meth because that is consistent with all the other methods here that do this same thing. I think if we want it to be method then we need to change them all.


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


<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<PackageDescription>Additional ML.NET featurizers</PackageDescription>

@codemzscodemzsNov 18, 2019

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.

Additional ML.NET featurizers [](start = 24, length = 29)

ML .NET featurizers with native code implementation. #Resolved

return meth;
}

private static MethodInfo MarshalInvokeCheckAndCreate<TRet>(Delegate func, Type[] genArgs)

@codemzscodemzsNov 18, 2019

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.

Delegate func, Type[] genArgs) [](start = 68, length = 30)

lets keep the order consistent types then delegate #Resolved

return meth;
}

private static MethodInfo MarshalActionInvokeCheckAndCreate(Delegate func, params Type[] typeArguments)

@codemzscodemzsNov 18, 2019

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.

(Delegate func, params Type[] typeArguments) [](start = 67, length = 44)

same here, lets keep the order consistent, types then delegate #Resolved


internal enum FitResult : byte
{
Complete = 1, Continue, ResetAndContinue

@codemzscodemzsNov 18, 2019

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.

Complete = 1, Continue, ResetAndContinue [](start = 8, length = 40)

put each on its own line and explicitly define values. #Resolved

Tabular = 0x1001 | LastStaticValue + 3,
Nullable = 0x1001 | LastStaticValue + 4,
Vector = 0x1001 | LastStaticValue + 5,
MapId = 0x1002 | LastStaticValue + 6

@codemzscodemzsNov 18, 2019

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.

MapId = 0x1002 | LastStaticValue + 6 [](start = 8, length = 36)

please add comments for this #Resolved

@justinormontjustinormontNov 19, 2019

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.

Why does this add LastStaticValue? In the future, this will shift all of the uint values by 1, as a new type is inserted to the top section.

Why the math? Seems more simple to directly map to the values.

Why is the base of the last one 0x1002? That skips a value. #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.

All of these are taken directly as is from the Native code base. They are here just so we have a correct mapping on our side.

LastStaticValue is supposed to represent the last stand alone type. All the types that follow after it are compound types. There is probably a more appropriate name, but since I want to keep this identical to the Native code I left it as is.

The math is there just to keep it identical to the native code. I could directly map the values, but then I would have to map the values every time I need to check if it has changed in the native code. Leaving it like this makes comparisons much easier.

The number at the end of 0x100N represents how many types come after it that are associated to it. So Tabular, Nullable, and Vector, end in 1 meaning only 1 type follows it. The Map ends in 2 because we need types for the Keys and for the Values.


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

return Encoding.UTF8.GetString(buffer);
}
}
}

@codemzscodemzsNov 18, 2019

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.

} [](start = 8, length = 1)

new line #Resolved

return TypeId.Int;
else if (type == typeof(long))
return TypeId.Long;
else if (type == typeof(byte))

@codemzscodemzsNov 18, 2019

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.

(byte)) [](start = 35, length = 7)

sbyte #Resolved

else if (type == typeof(long))
return TypeId.Long;
else if (type == typeof(byte))
return TypeId.Byte;

@codemzscodemzsNov 18, 2019

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.

Byte [](start = 30, length = 4)

SByte #Resolved

@codemzs

codemzs commented Nov 18, 2019

Copy link
Copy Markdown
Member

Can you please add comments for these functions? and how they are used? #Resolved


Refers to: src/Microsoft.ML.Featurizers/Common.cs:205 in 49f3798. [](commit_id = 49f3798, deletion_comment = False)

@codemzscodemzs 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.

:shipit:

: base(provider, input)
{
var pred = parent.GetActiveOutputColumns(active);
_getters = parent._mapper.CreateGetters(input, pred, out _disposer);

@codemzscodemzsNov 18, 2019

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.

_getters = parent._mapper.CreateGetters(input, pred, out _disposer); [](start = 16, length = 68)

lets revert this and use a thread safe dictionary for now. I want to think a little more on this. #Resolved

@codecov

codecovBot commented Nov 19, 2019

Copy link
Copy Markdown

Codecov Report

❗ No coverage uploaded for pull request base (master@1fa6cb5). Click here to learn what that means.
The diff coverage is n/a.

@@ Coverage Diff @@## master #4413 +/- ##
=========================================
Coverage ? 74.86% =========================================
Files ? 908 Lines ? 159862 Branches ? 17214 =========================================
Hits ? 119688 Misses ? 35354 Partials ? 4820
FlagCoverage Δ
#Debug74.86% <ø> (?)
#production70.22% <ø> (?)
#test90.19% <ø> (?)

@codemzs

Copy link
Copy Markdown
Member

@michaelgsharp Can you please sync to master?

ToStringTransformer is done.
CatagoryImputer is done.
TimeSeriesImputer is done.
RobustScaler is done.
Adding in samples and documentation. General code cleanup. Made the RowToRowMapperTransform create a new mapper if possible for each cursor.
michaelgsharpand others added 2 commits November 22, 2019 14:14
Added line in Directory.Build.Props that was removed during the rebase process. The line already exists in master and shouldn't be removed.
@michaelgsharp
michaelgsharp merged commit 8d20cdd into dotnet:masterDec 3, 2019
@michaelgsharp
michaelgsharp deleted the featurizers-project branch December 3, 2019 22:38
@ghostghost locked as resolved and limited conversation to collaborators Mar 20, 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

@michaelgsharp@codemzs@justinormont@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

Initial featurizers project - #4413

Merged
michaelgsharp merged 9 commits into
dotnet:masterfrom
michaelgsharp:featurizers-project
Dec 3, 2019
Merged

Initial featurizers project#4413
michaelgsharp merged 9 commits into
dotnet:masterfrom
michaelgsharp:featurizers-project

Conversation

@michaelgsharp

Copy link
Copy Markdown
Contributor

This is the initial featurizers PR to split apart PR #4157 and get all the common code into master.
Once this code goes in, I will create separate PR's for each of the 5 featurizers.

This is the common code for the featurizers. Its mostly changes to project files and solution files. Common.cs is for all the shared code for the featurizers. The change in Utils.cs is to allow Marshal.Invoke with multiple type parameters. The RowToRowMapperTransform.cs change has it create a new mapper when possible. This helps with thread safety/local caching of the mappers when run in a multi threaded approach.

@michaelgsharp
michaelgsharp requested a review from a teamOctober 29, 2019 23:31
@michaelgsharpmichaelgsharp self-assigned this Oct 29, 2019
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
Comment threadDirectory.Build.props
// Not all these types are currently supported. This is so the ordering will allign with the native code.
internal enum TypeId : uint
{
String = 1, SByte, Short, Int, Long, Byte, UShort,

@eerhardteerhardtOct 30, 2019

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.

Typical C# code has these be on separate lines. #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.

Good to know. Put them all on their own line.


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

@justinormontjustinormontNov 18, 2019

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.

Should we have a int next to each? This will assist with long term compatibility by allowing for inserting new values, and in case someone decides to sort the enum differently later (more important if serialized in a model). #Resolved

@michaelgsharpmichaelgsharpNov 19, 2019

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.

Yeah, you are correct. I have added an int next to each one now. #Resolved

@justinormontjustinormontNov 19, 2019

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.

Thanks #Resolved

Comment threadsrc/Microsoft.ML.Featurizers/Common.cs
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
var meth = MarshalActionInvokeCheckAndCreate(func, genArgs);
if (meth.ReturnType != typeof(TRet))
throw Contracts.ExceptParam(nameof(func), "Cannot be generic on return type");
return meth;

@justinormontjustinormontNov 18, 2019

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 don't think method is a reserved keyword in C#. Recommend the longer name.

Suggested change
returnmeth;
returnmethod;
``` #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.

I kept it as meth because that is consistent with all the other methods here that do this same thing. I think if we want it to be method then we need to change them all.


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


<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<PackageDescription>Additional ML.NET featurizers</PackageDescription>

@codemzscodemzsNov 18, 2019

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.

Additional ML.NET featurizers [](start = 24, length = 29)

ML .NET featurizers with native code implementation. #Resolved

return meth;
}

private static MethodInfo MarshalInvokeCheckAndCreate<TRet>(Delegate func, Type[] genArgs)

@codemzscodemzsNov 18, 2019

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.

Delegate func, Type[] genArgs) [](start = 68, length = 30)

lets keep the order consistent types then delegate #Resolved

return meth;
}

private static MethodInfo MarshalActionInvokeCheckAndCreate(Delegate func, params Type[] typeArguments)

@codemzscodemzsNov 18, 2019

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.

(Delegate func, params Type[] typeArguments) [](start = 67, length = 44)

same here, lets keep the order consistent, types then delegate #Resolved


internal enum FitResult : byte
{
Complete = 1, Continue, ResetAndContinue

@codemzscodemzsNov 18, 2019

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.

Complete = 1, Continue, ResetAndContinue [](start = 8, length = 40)

put each on its own line and explicitly define values. #Resolved

Tabular = 0x1001 | LastStaticValue + 3,
Nullable = 0x1001 | LastStaticValue + 4,
Vector = 0x1001 | LastStaticValue + 5,
MapId = 0x1002 | LastStaticValue + 6

@codemzscodemzsNov 18, 2019

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.

MapId = 0x1002 | LastStaticValue + 6 [](start = 8, length = 36)

please add comments for this #Resolved

@justinormontjustinormontNov 19, 2019

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.

Why does this add LastStaticValue? In the future, this will shift all of the uint values by 1, as a new type is inserted to the top section.

Why the math? Seems more simple to directly map to the values.

Why is the base of the last one 0x1002? That skips a value. #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.

All of these are taken directly as is from the Native code base. They are here just so we have a correct mapping on our side.

LastStaticValue is supposed to represent the last stand alone type. All the types that follow after it are compound types. There is probably a more appropriate name, but since I want to keep this identical to the Native code I left it as is.

The math is there just to keep it identical to the native code. I could directly map the values, but then I would have to map the values every time I need to check if it has changed in the native code. Leaving it like this makes comparisons much easier.

The number at the end of 0x100N represents how many types come after it that are associated to it. So Tabular, Nullable, and Vector, end in 1 meaning only 1 type follows it. The Map ends in 2 because we need types for the Keys and for the Values.


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

return Encoding.UTF8.GetString(buffer);
}
}
}

@codemzscodemzsNov 18, 2019

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.

} [](start = 8, length = 1)

new line #Resolved

return TypeId.Int;
else if (type == typeof(long))
return TypeId.Long;
else if (type == typeof(byte))

@codemzscodemzsNov 18, 2019

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.

(byte)) [](start = 35, length = 7)

sbyte #Resolved

else if (type == typeof(long))
return TypeId.Long;
else if (type == typeof(byte))
return TypeId.Byte;

@codemzscodemzsNov 18, 2019

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.

Byte [](start = 30, length = 4)

SByte #Resolved

@codemzs

codemzs commented Nov 18, 2019

Copy link
Copy Markdown
Member

Can you please add comments for these functions? and how they are used? #Resolved


Refers to: src/Microsoft.ML.Featurizers/Common.cs:205 in 49f3798. [](commit_id = 49f3798, deletion_comment = False)

@codemzscodemzs 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.

:shipit:

: base(provider, input)
{
var pred = parent.GetActiveOutputColumns(active);
_getters = parent._mapper.CreateGetters(input, pred, out _disposer);

@codemzscodemzsNov 18, 2019

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.

_getters = parent._mapper.CreateGetters(input, pred, out _disposer); [](start = 16, length = 68)

lets revert this and use a thread safe dictionary for now. I want to think a little more on this. #Resolved

@codecov

codecovBot commented Nov 19, 2019

Copy link
Copy Markdown

Codecov Report

❗ No coverage uploaded for pull request base (master@1fa6cb5). Click here to learn what that means.
The diff coverage is n/a.

@@ Coverage Diff @@## master #4413 +/- ##
=========================================
Coverage ? 74.86% =========================================
Files ? 908 Lines ? 159862 Branches ? 17214 =========================================
Hits ? 119688 Misses ? 35354 Partials ? 4820
FlagCoverage Δ
#Debug74.86% <ø> (?)
#production70.22% <ø> (?)
#test90.19% <ø> (?)

@codemzs

Copy link
Copy Markdown
Member

@michaelgsharp Can you please sync to master?

ToStringTransformer is done.
CatagoryImputer is done.
TimeSeriesImputer is done.
RobustScaler is done.
Adding in samples and documentation. General code cleanup. Made the RowToRowMapperTransform create a new mapper if possible for each cursor.
michaelgsharpand others added 2 commits November 22, 2019 14:14
Added line in Directory.Build.Props that was removed during the rebase process. The line already exists in master and shouldn't be removed.
@michaelgsharp
michaelgsharp merged commit 8d20cdd into dotnet:masterDec 3, 2019
@michaelgsharp
michaelgsharp deleted the featurizers-project branch December 3, 2019 22:38
@ghostghost locked as resolved and limited conversation to collaborators Mar 20, 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

@michaelgsharp@codemzs@justinormont@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

Initial featurizers project - #4413

Merged
michaelgsharp merged 9 commits into
dotnet:masterfrom
michaelgsharp:featurizers-project
Dec 3, 2019
Merged

Initial featurizers project#4413
michaelgsharp merged 9 commits into
dotnet:masterfrom
michaelgsharp:featurizers-project

Conversation

@michaelgsharp

Copy link
Copy Markdown
Contributor

This is the initial featurizers PR to split apart PR #4157 and get all the common code into master.
Once this code goes in, I will create separate PR's for each of the 5 featurizers.

This is the common code for the featurizers. Its mostly changes to project files and solution files. Common.cs is for all the shared code for the featurizers. The change in Utils.cs is to allow Marshal.Invoke with multiple type parameters. The RowToRowMapperTransform.cs change has it create a new mapper when possible. This helps with thread safety/local caching of the mappers when run in a multi threaded approach.

@michaelgsharp
michaelgsharp requested a review from a teamOctober 29, 2019 23:31
@michaelgsharpmichaelgsharp self-assigned this Oct 29, 2019
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
Comment threadDirectory.Build.props
// Not all these types are currently supported. This is so the ordering will allign with the native code.
internal enum TypeId : uint
{
String = 1, SByte, Short, Int, Long, Byte, UShort,

@eerhardteerhardtOct 30, 2019

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.

Typical C# code has these be on separate lines. #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.

Good to know. Put them all on their own line.


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

@justinormontjustinormontNov 18, 2019

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.

Should we have a int next to each? This will assist with long term compatibility by allowing for inserting new values, and in case someone decides to sort the enum differently later (more important if serialized in a model). #Resolved

@michaelgsharpmichaelgsharpNov 19, 2019

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.

Yeah, you are correct. I have added an int next to each one now. #Resolved

@justinormontjustinormontNov 19, 2019

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.

Thanks #Resolved

Comment threadsrc/Microsoft.ML.Featurizers/Common.cs
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
var meth = MarshalActionInvokeCheckAndCreate(func, genArgs);
if (meth.ReturnType != typeof(TRet))
throw Contracts.ExceptParam(nameof(func), "Cannot be generic on return type");
return meth;

@justinormontjustinormontNov 18, 2019

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 don't think method is a reserved keyword in C#. Recommend the longer name.

Suggested change
returnmeth;
returnmethod;
``` #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.

I kept it as meth because that is consistent with all the other methods here that do this same thing. I think if we want it to be method then we need to change them all.


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


<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<PackageDescription>Additional ML.NET featurizers</PackageDescription>

@codemzscodemzsNov 18, 2019

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.

Additional ML.NET featurizers [](start = 24, length = 29)

ML .NET featurizers with native code implementation. #Resolved

return meth;
}

private static MethodInfo MarshalInvokeCheckAndCreate<TRet>(Delegate func, Type[] genArgs)

@codemzscodemzsNov 18, 2019

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.

Delegate func, Type[] genArgs) [](start = 68, length = 30)

lets keep the order consistent types then delegate #Resolved

return meth;
}

private static MethodInfo MarshalActionInvokeCheckAndCreate(Delegate func, params Type[] typeArguments)

@codemzscodemzsNov 18, 2019

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.

(Delegate func, params Type[] typeArguments) [](start = 67, length = 44)

same here, lets keep the order consistent, types then delegate #Resolved


internal enum FitResult : byte
{
Complete = 1, Continue, ResetAndContinue

@codemzscodemzsNov 18, 2019

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.

Complete = 1, Continue, ResetAndContinue [](start = 8, length = 40)

put each on its own line and explicitly define values. #Resolved

Tabular = 0x1001 | LastStaticValue + 3,
Nullable = 0x1001 | LastStaticValue + 4,
Vector = 0x1001 | LastStaticValue + 5,
MapId = 0x1002 | LastStaticValue + 6

@codemzscodemzsNov 18, 2019

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.

MapId = 0x1002 | LastStaticValue + 6 [](start = 8, length = 36)

please add comments for this #Resolved

@justinormontjustinormontNov 19, 2019

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.

Why does this add LastStaticValue? In the future, this will shift all of the uint values by 1, as a new type is inserted to the top section.

Why the math? Seems more simple to directly map to the values.

Why is the base of the last one 0x1002? That skips a value. #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.

All of these are taken directly as is from the Native code base. They are here just so we have a correct mapping on our side.

LastStaticValue is supposed to represent the last stand alone type. All the types that follow after it are compound types. There is probably a more appropriate name, but since I want to keep this identical to the Native code I left it as is.

The math is there just to keep it identical to the native code. I could directly map the values, but then I would have to map the values every time I need to check if it has changed in the native code. Leaving it like this makes comparisons much easier.

The number at the end of 0x100N represents how many types come after it that are associated to it. So Tabular, Nullable, and Vector, end in 1 meaning only 1 type follows it. The Map ends in 2 because we need types for the Keys and for the Values.


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

return Encoding.UTF8.GetString(buffer);
}
}
}

@codemzscodemzsNov 18, 2019

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.

} [](start = 8, length = 1)

new line #Resolved

return TypeId.Int;
else if (type == typeof(long))
return TypeId.Long;
else if (type == typeof(byte))

@codemzscodemzsNov 18, 2019

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.

(byte)) [](start = 35, length = 7)

sbyte #Resolved

else if (type == typeof(long))
return TypeId.Long;
else if (type == typeof(byte))
return TypeId.Byte;

@codemzscodemzsNov 18, 2019

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.

Byte [](start = 30, length = 4)

SByte #Resolved

@codemzs

codemzs commented Nov 18, 2019

Copy link
Copy Markdown
Member

Can you please add comments for these functions? and how they are used? #Resolved


Refers to: src/Microsoft.ML.Featurizers/Common.cs:205 in 49f3798. [](commit_id = 49f3798, deletion_comment = False)

@codemzscodemzs 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.

:shipit:

: base(provider, input)
{
var pred = parent.GetActiveOutputColumns(active);
_getters = parent._mapper.CreateGetters(input, pred, out _disposer);

@codemzscodemzsNov 18, 2019

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.

_getters = parent._mapper.CreateGetters(input, pred, out _disposer); [](start = 16, length = 68)

lets revert this and use a thread safe dictionary for now. I want to think a little more on this. #Resolved

@codecov

codecovBot commented Nov 19, 2019

Copy link
Copy Markdown

Codecov Report

❗ No coverage uploaded for pull request base (master@1fa6cb5). Click here to learn what that means.
The diff coverage is n/a.

@@ Coverage Diff @@## master #4413 +/- ##
=========================================
Coverage ? 74.86% =========================================
Files ? 908 Lines ? 159862 Branches ? 17214 =========================================
Hits ? 119688 Misses ? 35354 Partials ? 4820
FlagCoverage Δ
#Debug74.86% <ø> (?)
#production70.22% <ø> (?)
#test90.19% <ø> (?)

@codemzs

Copy link
Copy Markdown
Member

@michaelgsharp Can you please sync to master?

ToStringTransformer is done.
CatagoryImputer is done.
TimeSeriesImputer is done.
RobustScaler is done.
Adding in samples and documentation. General code cleanup. Made the RowToRowMapperTransform create a new mapper if possible for each cursor.
michaelgsharpand others added 2 commits November 22, 2019 14:14
Added line in Directory.Build.Props that was removed during the rebase process. The line already exists in master and shouldn't be removed.
@michaelgsharp
michaelgsharp merged commit 8d20cdd into dotnet:masterDec 3, 2019
@michaelgsharp
michaelgsharp deleted the featurizers-project branch December 3, 2019 22:38
@ghostghost locked as resolved and limited conversation to collaborators Mar 20, 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

@michaelgsharp@codemzs@justinormont@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

Initial featurizers project - #4413

Merged
michaelgsharp merged 9 commits into
dotnet:masterfrom
michaelgsharp:featurizers-project
Dec 3, 2019
Merged

Initial featurizers project#4413
michaelgsharp merged 9 commits into
dotnet:masterfrom
michaelgsharp:featurizers-project

Conversation

@michaelgsharp

Copy link
Copy Markdown
Contributor

This is the initial featurizers PR to split apart PR #4157 and get all the common code into master.
Once this code goes in, I will create separate PR's for each of the 5 featurizers.

This is the common code for the featurizers. Its mostly changes to project files and solution files. Common.cs is for all the shared code for the featurizers. The change in Utils.cs is to allow Marshal.Invoke with multiple type parameters. The RowToRowMapperTransform.cs change has it create a new mapper when possible. This helps with thread safety/local caching of the mappers when run in a multi threaded approach.

@michaelgsharp
michaelgsharp requested a review from a teamOctober 29, 2019 23:31
@michaelgsharpmichaelgsharp self-assigned this Oct 29, 2019
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
Comment threadDirectory.Build.props
// Not all these types are currently supported. This is so the ordering will allign with the native code.
internal enum TypeId : uint
{
String = 1, SByte, Short, Int, Long, Byte, UShort,

@eerhardteerhardtOct 30, 2019

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.

Typical C# code has these be on separate lines. #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.

Good to know. Put them all on their own line.


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

@justinormontjustinormontNov 18, 2019

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.

Should we have a int next to each? This will assist with long term compatibility by allowing for inserting new values, and in case someone decides to sort the enum differently later (more important if serialized in a model). #Resolved

@michaelgsharpmichaelgsharpNov 19, 2019

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.

Yeah, you are correct. I have added an int next to each one now. #Resolved

@justinormontjustinormontNov 19, 2019

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.

Thanks #Resolved

Comment threadsrc/Microsoft.ML.Featurizers/Common.cs
Comment threadpkg/Microsoft.ML.Featurizers/Microsoft.ML.Featurizers.nupkgproj Outdated
var meth = MarshalActionInvokeCheckAndCreate(func, genArgs);
if (meth.ReturnType != typeof(TRet))
throw Contracts.ExceptParam(nameof(func), "Cannot be generic on return type");
return meth;

@justinormontjustinormontNov 18, 2019

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 don't think method is a reserved keyword in C#. Recommend the longer name.

Suggested change
returnmeth;
returnmethod;
``` #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.

I kept it as meth because that is consistent with all the other methods here that do this same thing. I think if we want it to be method then we need to change them all.


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


<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<PackageDescription>Additional ML.NET featurizers</PackageDescription>

@codemzscodemzsNov 18, 2019

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.

Additional ML.NET featurizers [](start = 24, length = 29)

ML .NET featurizers with native code implementation. #Resolved

return meth;
}

private static MethodInfo MarshalInvokeCheckAndCreate<TRet>(Delegate func, Type[] genArgs)

@codemzscodemzsNov 18, 2019

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.

Delegate func, Type[] genArgs) [](start = 68, length = 30)

lets keep the order consistent types then delegate #Resolved

return meth;
}

private static MethodInfo MarshalActionInvokeCheckAndCreate(Delegate func, params Type[] typeArguments)

@codemzscodemzsNov 18, 2019

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.

(Delegate func, params Type[] typeArguments) [](start = 67, length = 44)

same here, lets keep the order consistent, types then delegate #Resolved


internal enum FitResult : byte
{
Complete = 1, Continue, ResetAndContinue

@codemzscodemzsNov 18, 2019

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.

Complete = 1, Continue, ResetAndContinue [](start = 8, length = 40)

put each on its own line and explicitly define values. #Resolved

Tabular = 0x1001 | LastStaticValue + 3,
Nullable = 0x1001 | LastStaticValue + 4,
Vector = 0x1001 | LastStaticValue + 5,
MapId = 0x1002 | LastStaticValue + 6

@codemzscodemzsNov 18, 2019

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.

MapId = 0x1002 | LastStaticValue + 6 [](start = 8, length = 36)

please add comments for this #Resolved

@justinormontjustinormontNov 19, 2019

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.

Why does this add LastStaticValue? In the future, this will shift all of the uint values by 1, as a new type is inserted to the top section.

Why the math? Seems more simple to directly map to the values.

Why is the base of the last one 0x1002? That skips a value. #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.

All of these are taken directly as is from the Native code base. They are here just so we have a correct mapping on our side.

LastStaticValue is supposed to represent the last stand alone type. All the types that follow after it are compound types. There is probably a more appropriate name, but since I want to keep this identical to the Native code I left it as is.

The math is there just to keep it identical to the native code. I could directly map the values, but then I would have to map the values every time I need to check if it has changed in the native code. Leaving it like this makes comparisons much easier.

The number at the end of 0x100N represents how many types come after it that are associated to it. So Tabular, Nullable, and Vector, end in 1 meaning only 1 type follows it. The Map ends in 2 because we need types for the Keys and for the Values.


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

return Encoding.UTF8.GetString(buffer);
}
}
}

@codemzscodemzsNov 18, 2019

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.

} [](start = 8, length = 1)

new line #Resolved

return TypeId.Int;
else if (type == typeof(long))
return TypeId.Long;
else if (type == typeof(byte))

@codemzscodemzsNov 18, 2019

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.

(byte)) [](start = 35, length = 7)

sbyte #Resolved

else if (type == typeof(long))
return TypeId.Long;
else if (type == typeof(byte))
return TypeId.Byte;

@codemzscodemzsNov 18, 2019

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.

Byte [](start = 30, length = 4)

SByte #Resolved

@codemzs

codemzs commented Nov 18, 2019

Copy link
Copy Markdown
Member

Can you please add comments for these functions? and how they are used? #Resolved


Refers to: src/Microsoft.ML.Featurizers/Common.cs:205 in 49f3798. [](commit_id = 49f3798, deletion_comment = False)

@codemzscodemzs 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.

:shipit:

: base(provider, input)
{
var pred = parent.GetActiveOutputColumns(active);
_getters = parent._mapper.CreateGetters(input, pred, out _disposer);

@codemzscodemzsNov 18, 2019

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.

_getters = parent._mapper.CreateGetters(input, pred, out _disposer); [](start = 16, length = 68)

lets revert this and use a thread safe dictionary for now. I want to think a little more on this. #Resolved

@codecov

codecovBot commented Nov 19, 2019

Copy link
Copy Markdown

Codecov Report

❗ No coverage uploaded for pull request base (master@1fa6cb5). Click here to learn what that means.
The diff coverage is n/a.

@@ Coverage Diff @@## master #4413 +/- ##
=========================================
Coverage ? 74.86% =========================================
Files ? 908 Lines ? 159862 Branches ? 17214 =========================================
Hits ? 119688 Misses ? 35354 Partials ? 4820
FlagCoverage Δ
#Debug74.86% <ø> (?)
#production70.22% <ø> (?)
#test90.19% <ø> (?)

@codemzs

Copy link
Copy Markdown
Member

@michaelgsharp Can you please sync to master?

ToStringTransformer is done.
CatagoryImputer is done.
TimeSeriesImputer is done.
RobustScaler is done.
Adding in samples and documentation. General code cleanup. Made the RowToRowMapperTransform create a new mapper if possible for each cursor.
michaelgsharpand others added 2 commits November 22, 2019 14:14
Added line in Directory.Build.Props that was removed during the rebase process. The line already exists in master and shouldn't be removed.
@michaelgsharp
michaelgsharp merged commit 8d20cdd into dotnet:masterDec 3, 2019
@michaelgsharp
michaelgsharp deleted the featurizers-project branch December 3, 2019 22:38
@ghostghost locked as resolved and limited conversation to collaborators Mar 20, 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

@michaelgsharp@codemzs@justinormont@eerhardt