{"id":20345,"date":"2018-12-04T08:00:11","date_gmt":"2018-12-04T15:00:11","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/dotnet\/?p=20345"},"modified":"2024-01-12T11:31:54","modified_gmt":"2024-01-12T19:31:54","slug":"announcing-ml-net-0-8-machine-learning-for-net","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/dotnet\/announcing-ml-net-0-8-machine-learning-for-net\/","title":{"rendered":"Announcing ML.NET 0.8 &#8211; Machine Learning for .NET"},"content":{"rendered":"<p><a href=\"https:\/\/user-images.githubusercontent.com\/1712635\/49342385-0c159d00-f65b-11e8-9a26-7b1eec61c069.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" style=\"max-width: 100%;\" title=\"ML.NET logo\" src=\"https:\/\/user-images.githubusercontent.com\/1712635\/49342385-0c159d00-f65b-11e8-9a26-7b1eec61c069.png\" alt=\"alt text\" \/><\/a><\/p>\n<p><a href=\"http:\/\/dot.net\/ml\" rel=\"nofollow\">ML.NET<\/a> is an open-source and cross-platform framework (Windows, Linux, macOS) which makes machine learning accessible for .NET developers.<\/p>\n<p>ML.NET allows you to create and use machine learning models targeting scenarios to achieve common tasks such as sentiment analysis, issue classification, forecasting, recommendations, fraud detection, image classification and more. You can\u00a0\u00a0check out these common tasks at our\u00a0\u00a0<a href=\"https:\/\/github.com\/dotnet\/machinelearning-samples\">GitHub repo with ML.NET samples<\/a>.<\/p>\n<p>Today we\u2019re happy to announce the release of ML.NET 0.8. (<a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/introducing-ml-net-cross-platform-proven-and-open-source-machine-learning-framework\/\" rel=\"nofollow\">ML.NET 0.1 was released at \/\/Build 2018<\/a>). This release focuses on adding improved support for recommendation scenarios, model explainability in the form of feature importance, debuggability by previewing your in-memory datasets, API improvements such as caching, filtering, and more.<\/p>\n<p>This blog post provides details about the following topics in the ML.NET 0.8 release:<\/p>\n<ul>\n<li><a href=\"#enhanced-support-for-recommendation\" rel=\"nofollow\">New Recommendation scenarios <\/a><\/li>\n<li><a href=\"#improved-debuggability-by-previewing-the-data\" rel=\"nofollow\">Improved debuggability<\/a><\/li>\n<li><a href=\"#model-explainability\" rel=\"nofollow\">Model explainability<\/a><\/li>\n<li><a href=\"#additional-api-improvements-in-mlnet-08\" rel=\"nofollow\">Additional API improvements<\/a><\/li>\n<\/ul>\n<h2><a id=\"enhanced-support-for-recommendation\" class=\"anchor\" href=\"#enhanced-support-for-recommendation\"><\/a>New Recommendation Scenarios (e.g. Frequently Bought Together)<\/h2>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" style=\"max-width: 100%;\" title=\"Binary recomendation icon\" src=\"https:\/\/user-images.githubusercontent.com\/1712635\/49342489-564b4e00-f65c-11e8-8f66-62b0ccebeac0.png\" alt=\"alt text\" \/><\/a><\/p>\n<p>Recommender systems enable producing a list of recommendations for products in a product catalog, songs, movies, and more. Products like Netflix, Amazon, Pinterest have democratized use of Recommendation like scenarios over the last decade.<\/p>\n<p>ML.NET uses Matrix Factorization and\u00a0 Field Aware Factorization machines based approach for recommendation which enable the following scenarios.\u00a0In general Field Aware Factorization machines is the more generalized case of Matrix Factorization and allows for passing additional meta data.<\/p>\n<p>With ML.NET 0.8 we have added another scenario for Matrix Factorization which enables recommendations.<\/p>\n<table style=\"border-collapse: collapse; width: 100%;\">\n<tbody>\n<tr>\n<td style=\"width: 33.3333%;\"><strong>Recommendation Scenarios<\/strong><\/td>\n<td style=\"width: 33.3333%;\"><strong>Recommended solution<\/strong><\/td>\n<td style=\"width: 33.3333%;\"><strong>Link to Sample<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 33.3333%;\">Product Recommendations based upon Product Id, Rating, User Id, and additional meta data like Product Description, User Demographics (age, country etc.)<\/td>\n<td style=\"width: 33.3333%;\">Field Aware Factorization Machines<\/td>\n<td style=\"width: 33.3333%;\">Since ML.NET 0.3\n<a href=\"https:\/\/github.com\/dotnet\/machinelearning-samples\/tree\/master\/samples\/csharp\/end-to-end-apps\/Recommendation-MovieRecommender\" target=\"_blank\" rel=\"noopener noreferrer\">(Sample here)<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 33.3333%;\">Product Recommendations based upon Product Id, Rating and User Id only<\/td>\n<td style=\"width: 33.3333%;\">Matrix Factorization<\/td>\n<td style=\"width: 33.3333%;\">Since ML.NET 0.7\n<a href=\"https:\/\/github.com\/dotnet\/machinelearning-samples\/tree\/master\/samples\/csharp\/getting-started\/MatrixFactorization_MovieRecommendation\" target=\"_blank\" rel=\"noopener noreferrer\">(Sample here)<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 33.3333%;\">Product Recommendations based upon Product Id and Co-Purchased Product IDs<\/td>\n<td style=\"width: 33.3333%;\">One Class Matrix Factorization<\/td>\n<td style=\"width: 33.3333%;\">New in ML.NET 0.8\n<a href=\"https:\/\/github.com\/dotnet\/machinelearning-samples\/tree\/master\/samples\/csharp\/getting-started\/MatrixFactorization_ProductRecommendation\" target=\"_blank\" rel=\"noopener noreferrer\">(Sample here)<\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Yes! product recommendations are still possible even if you only have historical order purchasing data for your store.<\/p>\n<p>This is a popular scenario as in many situations you might not have ratings available to you.<\/p>\n<p>With historical purchasing data you can still build recommendations by providing your users a list of &#8220;Frequently Bought Together&#8221; product items.<\/p>\n<p>The below snapshot is from Amazon.com where its recommending a set of products based upon the product selected by the user.<\/p>\n<p><a href=\"https:\/\/github.com\/dotnet\/machinelearning-samples\/raw\/master\/samples\/csharp\/getting-started\/MatrixFactorization_ProductRecommendation\/ProductRecommender\/Data\/frequentlyboughttogether.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" style=\"max-width: 100%;\" title=\"Product items recommendations\" src=\"https:\/\/github.com\/dotnet\/machinelearning-samples\/raw\/master\/samples\/csharp\/getting-started\/MatrixFactorization_ProductRecommendation\/ProductRecommender\/Data\/frequentlyboughttogether.png\" alt=\"alt text\" \/><\/a><\/p>\n<p>We now support this scenario in ML.NET 0.8, and you can <a href=\"https:\/\/github.com\/dotnet\/machinelearning-samples\/tree\/master\/samples\/csharp\/getting-started\/MatrixFactorization_ProductRecommendation\">try out this sample<\/a> which performs product recommendations based upon an <a href=\"https:\/\/snap.stanford.edu\/data\/amazon0302.html\">Amazon Co-purchasing dataset<\/a>.<\/p>\n<h2><a id=\"improved-debuggability-by-previewing-the-data\" class=\"anchor\" href=\"#improved-debuggability-by-previewing-the-data\"><\/a>Improved debuggability by previewing the data<\/h2>\n<p><a href=\"https:\/\/user-images.githubusercontent.com\/1712635\/49342583-8e9f5c00-f65d-11e8-8916-da1ebfaf0f25.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" style=\"max-width: 100%;\" title=\"Data debug icon\" src=\"https:\/\/user-images.githubusercontent.com\/1712635\/49342583-8e9f5c00-f65d-11e8-8916-da1ebfaf0f25.png\" alt=\"alt text\" \/><\/a><\/p>\n<p>In most of the cases when starting to work with your pipeline and loading your dataset it is very useful to peek at the data that was loaded into an ML.NET DataView and even look at it after some intermediate transformation steps to ensure the data is transformed as expected.<\/p>\n<p>First what you can do is to review schema of your DataView.\nAll you need to do is hover over IDataView object, expand it, and look for the Schema property.<\/p>\n<p><a href=\"https:\/\/user-images.githubusercontent.com\/1712635\/49342600-cd351680-f65d-11e8-80cc-149ecd032afa.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" style=\"max-width: 100%;\" title=\"Debugging schema screenshot\" src=\"https:\/\/user-images.githubusercontent.com\/1712635\/49342600-cd351680-f65d-11e8-80cc-149ecd032afa.png\" alt=\"alt text\" \/><\/a><\/p>\n<p>If you want to take a look to the actual data loaded in the DataView, you can do following steps shown in the animation below.<\/p>\n<p><a href=\"https:\/\/github.com\/CESARDELATORRE\/Images-For-Blog-Posts\/raw\/master\/dataPreview-gif-animated.gif\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" style=\"max-width: 100%;\" title=\"Debugging data animation\" src=\"https:\/\/github.com\/CESARDELATORRE\/Images-For-Blog-Posts\/raw\/master\/dataPreview-gif-animated.gif\" alt=\"alt text\" \/><\/a><\/p>\n<p>The steps are:<\/p>\n<ul>\n<li>While debugging, open a <strong>Watch window<\/strong>.<\/li>\n<li>Enter variable name of you DataView object (in this case <code>testDataView<\/code>) and call <code>Preview()<\/code> method for it.<\/li>\n<li>Now, click over the rows you want to inspect. That will show you actual data loaded in the DataView.<\/li>\n<\/ul>\n<p>By default we output first 100 values in ColumnView and RowView. But that can be changed by passing the amount of rows you interested into the to Preview() function as argument, such as <code>Preview(500)<\/code>.<\/p>\n<h2><a id=\"model-explainability\" class=\"anchor\" href=\"#model-explainability\"><\/a>Model explainability<\/h2>\n<p><a href=\"https:\/\/user-images.githubusercontent.com\/1712635\/49342767-9cee7780-f65f-11e8-9c8e-88f446f1cc2b.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" style=\"max-width: 100%;\" title=\"Features importance chart\" src=\"https:\/\/user-images.githubusercontent.com\/1712635\/49342767-9cee7780-f65f-11e8-9c8e-88f446f1cc2b.png\" alt=\"alt text\" \/><\/a><\/p>\n<p>In ML.NET 0.8 release, we have included APIs for model explainability that we use internally at Microsoft to help machine learning developers better understand the feature importance of models (&#8220;Overall Feature Importance&#8221;) and create high-capacity models that can be interpreted by others (&#8220;Generalized Additive Models&#8221;).<\/p>\n<p><strong>Overall feature importance<\/strong> gives a sense of which features are overall most important for the model. When creating Machine Learning models, it is often not enough to simply make predictions and evaluate its accuracy. As illustrated in the previous image, feature importance helps you understand which data features are most valuable to the model for making a good prediction. For instance, when predicting the price of a car, some features are more important like mileage and make\/brand, while other features might impact less, like the car&#8217;s color.<\/p>\n<p>The &#8220;Overall feature importance&#8221; of a model is enabled through a technique named &#8220;Permutation Feature Importance&#8221; (PFI). PFI measures feature importance by asking the question, <em>&#8220;What would the effect on the model be if the values for a feature were set to a random value (permuted across the set of examples)?&#8221;<\/em>.<\/p>\n<p>The advantage of the PFI method is that it is model agnostic \u2014 it works with any model that can be evaluated \u2014 and it can use any dataset, not just the training set, to compute feature importance.<\/p>\n<p>You can use PFI like so to produce feature importances with code like the following:<\/p>\n<div class=\"highlight highlight-source-cs\">\n<pre class=\"lang:default decode:true\">\/\/ Compute the feature importance using PFI\r\nvar permutationMetrics = mlContext.Regression.PermutationFeatureImportance(model, data);\r\n\r\n\/\/ Get the feature names from the training set\r\nvar featureNames = data.Schema.GetColumns()\r\n                .Select(tuple =&gt; tuple.column.Name) \/\/ Get the column names\r\n                .Where(name =&gt; name != labelName) \/\/ Drop the Label\r\n                .ToArray();\r\n\r\n\/\/ Write out the feature names and their importance to the model's R-squared value\r\nfor (int i = 0; i &lt; featureNames.Length; i++)\r\n  Console.WriteLine($\"{featureNames[i]}\\t{permutationMetrics[i].rSquared:G4}\");<\/pre>\n<\/div>\n<p>You would get a similar output in the console than the metrics below:<\/p>\n<div class=\"highlight highlight-source-cs\">\n<pre class=\"lang:default decode:true\">Console output:\r\n\r\n    Feature            Model Weight    Change in R - Squared\r\n    --------------------------------------------------------\r\n    RoomsPerDwelling      50.80             -0.3695\r\n    EmploymentDistance   -17.79             -0.2238\r\n    TeacherRatio         -19.83             -0.1228\r\n    TaxRate              -8.60              -0.1042\r\n    NitricOxides         -15.95             -0.1025\r\n    HighwayDistance        5.37             -0.09345\r\n    CrimesPerCapita      -15.05             -0.05797\r\n    PercentPre40s         -4.64             -0.0385\r\n    PercentResidental      3.98             -0.02184\r\n    CharlesRiver           3.38             -0.01487\r\n    PercentNonRetail      -1.94             -0.007231<\/pre>\n<\/div>\n<p>Note that in current ML.NET v0.8, PFI only works for binary classification and regression based models, but we&#8217;ll expand to additional ML tasks in the upcoming versions.<\/p>\n<p>See the <a href=\"https:\/\/github.com\/dotnet\/machinelearning\/\">sample in the ML.NET repository<\/a> for a complete example using PFI to analyze the feature importance of a model.<\/p>\n<p><strong>Generalized Additive Models<\/strong>, or (<strong>GAMs<\/strong>) have very explainable predictions. They are similar to <a href=\"https:\/\/en.wikipedia.org\/wiki\/Linear_model\" rel=\"nofollow\">linear models<\/a> in terms of ease of understanding but are more flexible and can have better performance and and could also be visualized\/plotted for easier analysis.<\/p>\n<p>Example usage of how to train a GAM model, inspect and interpret the results, can be found <a href=\"https:\/\/github.com\/dotnet\/machinelearning\/\">here<\/a>.<\/p>\n<p><!-- VS TEMPLATES section --><\/p>\n<h2><a id=\"additional-api-improvements-in-mlnet-08\" class=\"anchor\" href=\"#additional-api-improvements-in-mlnet-08\"><\/a>Additional API improvements in ML.NET 0.8<\/h2>\n<p>In this release we have also added other enhancements to our APIs which help with filtering rows in DataViews, caching data, allowing users to save data to the IDataView (IDV) binary format. You can learn about these features here.<\/p>\n<h3><a id=\"user-content-filtering-rows-in-a-dataview\" class=\"anchor\" href=\"#filtering-rows-in-a-dataview\"><\/a>Filtering rows in a DataView<\/h3>\n<p><a href=\"https:\/\/user-images.githubusercontent.com\/1712635\/49342876-e8555580-f660-11e8-8c98-b76f67d0257b.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" style=\"max-width: 100%;\" title=\"Filtering rows icon\" src=\"https:\/\/user-images.githubusercontent.com\/1712635\/49342876-e8555580-f660-11e8-8c98-b76f67d0257b.png\" alt=\"alt text\" \/><\/a><\/p>\n<p>Sometimes you might need to filter the data used for training a model. For example, you might need to remove rows where a certain column&#8217;s value is lower or higher than certain boundaries because of any reason like &#8216;outliers&#8217; data.<\/p>\n<p>This can now be done with additional filters like <code>FilterByColumn()<\/code> API such as in the following code from this <a href=\"https:\/\/github.com\/dotnet\/machinelearning-samples\/blob\/master\/samples\/csharp\/getting-started\/Regression_TaxiFarePrediction\/TaxiFarePrediction\/TaxiFarePredictionConsoleApp\/Program.cs#L74\">sample app at ML.NET samples<\/a>, where we want to keep only payment rows between $1 and $150 because for this particular scenario, because higher than $150 are considered &#8220;outliers&#8221; (extreme data distorting the model) and lower than $1 might be errors in data:<\/p>\n<div class=\"highlight highlight-source-cs\">\n<pre class=\"lang:default decode:true\">IDataView trainingDataView = mlContext.Data.FilterByColumn(baseTrainingDataView, \"FareAmount\", lowerBound: 1, upperBound: 150);<\/pre>\n<\/div>\n<p>Thanks to the added DataView preview in Visual Studio previously mentioned above, you could now inspect the filtered data in your DataView.<\/p>\n<p>Additional sample code can be check-out <a href=\"https:\/\/github.com\/dotnet\/machinelearning\/blob\/71d58fa83f77abb630d815e5cf8aa9dd3390aa65\/test\/Microsoft.ML.Tests\/RangeFilterTests.cs#L30\">here<\/a>.<\/p>\n<h3><a id=\"user-content-caching-apis\" class=\"anchor\" href=\"#caching-apis\"><\/a>Caching APIs<\/h3>\n<p><a href=\"https:\/\/user-images.githubusercontent.com\/1712635\/49342897-2a7e9700-f661-11e8-9a8c-c8a3b12896d7.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" style=\"max-width: 100%;\" title=\"Cache icon\" src=\"https:\/\/user-images.githubusercontent.com\/1712635\/49342897-2a7e9700-f661-11e8-9a8c-c8a3b12896d7.png\" alt=\"alt text\" \/><\/a><\/p>\n<p>Some estimators iterate over the data multiple times. Instead of always reading from file, you can choose to cache the data to sometimes speed training execution.<\/p>\n<p>A good example is the following when the training is using an OVA (One Versus All) trainer which is running multiple iterations against the same data. By eliminating the need to read data from disk multiple times you can reduce model training time by up to 50%:<\/p>\n<div class=\"highlight highlight-source-cs\">\n<pre class=\"lang:default decode:true\">var dataProcessPipeline = mlContext.Transforms.Conversion.MapValueToKey(\"Area\", \"Label\")\r\n        .Append(mlContext.Transforms.Text.FeaturizeText(\"Title\", \"TitleFeaturized\"))\r\n        .Append(mlContext.Transforms.Text.FeaturizeText(\"Description\", \"DescriptionFeaturized\"))\r\n        .Append(mlContext.Transforms.Concatenate(\"Features\", \"TitleFeaturized\", \"DescriptionFeaturized\"))\r\n        \/\/Example Caching the DataView \r\n        .AppendCacheCheckpoint(mlContext) \r\n        .Append(mlContext.BinaryClassification.Trainers.AveragedPerceptron(DefaultColumnNames.Label,                                  \r\n                                                                          DefaultColumnNames.Features,\r\n                                                                          numIterations: 10));<\/pre>\n<\/div>\n<p>This example code is implemented and execution time measured in <a href=\"https:\/\/github.com\/dotnet\/machinelearning-samples\/blob\/master\/samples\/csharp\/end-to-end-apps\/MulticlassClassification-GitHubLabeler\/GitHubLabeler\/GitHubLabelerConsoleApp\/Program.cs#L79\">this sample app<\/a> at the ML.NET Samples repo.<\/p>\n<p>An additional test example can be found <a href=\"https:\/\/github.com\/dotnet\/machinelearning\/blob\/71d58fa83f77abb630d815e5cf8aa9dd3390aa65\/test\/Microsoft.ML.Tests\/CachingTests.cs#L56\">here<\/a>.<\/p>\n<h3><a id=\"user-content-enabled-saving-and-loading-data-in-idvidataview-binary-format-for-improved-performance\" class=\"anchor\" href=\"#enabled-saving-and-loading-data-in-idvidataview-binary-format-for-improved-performance\"><\/a>Enabled saving and loading data in IDataView (IDV) binary format for improved performance<\/h3>\n<p><a href=\"https:\/\/user-images.githubusercontent.com\/1712635\/49342929-76c9d700-f661-11e8-8a4c-bf33fd6fee90.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" style=\"max-width: 100%;\" title=\"Binary file format icon\" src=\"https:\/\/user-images.githubusercontent.com\/1712635\/49342929-76c9d700-f661-11e8-8a4c-bf33fd6fee90.png\" alt=\"alt text\" \/><\/a><\/p>\n<p>It is sometimes useful to save data after it has been transformed. For example, you might have featurized all the text into sparse vectors and want to perform repeated experimentation with different trainers without continuously repeating the data transformation.<\/p>\n<p><a href=\"https:\/\/github.com\/dotnet\/machinelearning\/blob\/master\/docs\/code\/IdvFileFormat.md\">IDV format<\/a> is a binary dataview file format provided by ML.NET.<\/p>\n<p>Saving and loading files in <a href=\"https:\/\/github.com\/dotnet\/machinelearning\/blob\/master\/docs\/code\/IdvFileFormat.md\">IDV format<\/a> is often significantly faster than using a text format because it is compressed.<\/p>\n<p>In addtion, because it is already schematized &#8216;in-file&#8217;, you don&#8217;t need to specify the column types like you need to do when using a regular TextLoader, so the code to use is simpler in addition to faster.<\/p>\n<p>Reading a binary data file can be done using this simple line of code:<\/p>\n<div class=\"highlight highlight-source-cs\">\n<pre class=\"lang:default decode:true\">mlContext.Data.ReadFromBinary(\"pathToFile\");<\/pre>\n<\/div>\n<p>Writing a binary data file can be done using this code:<\/p>\n<div class=\"highlight highlight-source-cs\">\n<pre class=\"lang:default decode:true \">mlContext.Data.SaveAsBinary(\"pathToFile\");<\/pre>\n<\/div>\n<h3><a id=\"user-content-enabled-stateful-prediction-engine-for-time-series-problems-such-as-anomaly-detection\" class=\"anchor\" href=\"#enabled-stateful-prediction-engine-for-time-series-problems-such-as-anomaly-detection\"><\/a>Enabled stateful prediction engine for time series problems such as anomaly detection<\/h3>\n<p><a href=\"https:\/\/user-images.githubusercontent.com\/1712635\/49342945-b8f31880-f661-11e8-8fed-79fc4ddabc93.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" style=\"max-width: 100%;\" title=\"Stateful time series\" src=\"https:\/\/user-images.githubusercontent.com\/1712635\/49342945-b8f31880-f661-11e8-8fed-79fc4ddabc93.png\" alt=\"alt text\" \/><\/a><\/p>\n<p>ML.NET 0.7 enabled anomaly detection scenarios based on Time Series. However, the prediction engine was stateless, which means that every time you want to figure out whether the latest data point is anomolous, you need to provide historical data as well. This is unnatural.<\/p>\n<p>The prediction engine can now keep state of time series data seen so far, so you can now get predictions by just providing the latest data point. This is enabled by using <code>CreateTimeSeriesPredictionFunction()<\/code> instead of <code>CreatePredictionFunction()<\/code>.<\/p>\n<p>Example usage can be found <a href=\"https:\/\/github.com\/dotnet\/machinelearning\/blob\/3d33e20f33da70cdd3da2ad9e0b2b03df929bef4\/test\/Microsoft.ML.TimeSeries.Tests\/TimeSeriesDirectApi.cs#L141\">here<\/a><\/p>\n<h2><a id=\"user-content-get-started\" class=\"anchor\" href=\"#get-started\"><\/a>Get started!<\/h2>\n<p><a href=\"https:\/\/user-images.githubusercontent.com\/1712635\/49342959-dd4ef500-f661-11e8-9edb-0bb4a6e32976.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" style=\"max-width: 100%;\" title=\"Get started icon\" src=\"https:\/\/user-images.githubusercontent.com\/1712635\/49342959-dd4ef500-f661-11e8-9edb-0bb4a6e32976.png\" alt=\"alt text\" \/><\/a><\/p>\n<p>If you haven\u2019t already get started with <a href=\"https:\/\/www.microsoft.com\/net\/learn\/apps\/machine-learning-and-ai\/ml-dotnet\/get-started\" rel=\"nofollow\">ML.NET here<\/a>.<\/p>\n<p>Next, going further explore some other resources:<\/p>\n<ul>\n<li>Tutorials and resources at the <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/machine-learning\/\" rel=\"nofollow\">Microsoft Docs ML.NET Guide<\/a><\/li>\n<li>Code samples at the <a href=\"https:\/\/github.com\/dotnet\/machinelearning-samples\">machinelearning-samples GitHub repo<\/a><\/li>\n<li>Important ML.NET concepts for understanding the new API are introduced <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/machine-learning\/basic-concepts-model-training-in-mldotnet\" rel=\"nofollow\">here<\/a><\/li>\n<li>&#8220;How to&#8221; guides that show how to use these APIs for a variety of scenarios can be found <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/machine-learning\/how-to-guides\/\" rel=\"nofollow\">here<\/a><\/li>\n<\/ul>\n<p>We will appreciate your feedback by filing issues with any suggestions or enhancements in the <a href=\"https:\/\/github.com\/dotnet\/machinelearning\">ML.NET GitHub repo<\/a> to help us shape ML.NET and make .NET a great platform of choice for Machine Learning.<\/p>\n<p>Thanks,<\/p>\n<p>The ML.NET Team.<\/p>\n<p><em>This blog was authored by Cesar de la Torre, Gal Oshri, Rogan Carr plus additional contributions from the ML.NET team<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>ML.NET is an open-source and cross-platform framework (Windows, Linux, macOS) which makes machine learning accessible for .NET developers. ML.NET allows you to create and use machine learning models targeting scenarios to achieve common tasks such as sentiment analysis, issue classification, forecasting, recommendations, fraud detection, image classification and more. You can\u00a0\u00a0check out these common tasks at [&hellip;]<\/p>\n","protected":false},"author":362,"featured_media":21752,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[685,328,688],"tags":[310],"class_list":["post-20345","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-aiml","category-machine-learning","tag-mlnet-machinelearning-dotnetcore"],"acf":[],"blog_post_summary":"<p>ML.NET is an open-source and cross-platform framework (Windows, Linux, macOS) which makes machine learning accessible for .NET developers. ML.NET allows you to create and use machine learning models targeting scenarios to achieve common tasks such as sentiment analysis, issue classification, forecasting, recommendations, fraud detection, image classification and more. You can\u00a0\u00a0check out these common tasks at [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts\/20345","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/users\/362"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/comments?post=20345"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts\/20345\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/media\/21752"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/media?parent=20345"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/categories?post=20345"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/tags?post=20345"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}