You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ML.NET AutoML实验无法完成,RunAsync方法持续挂起求助

AutoML.NET回归实验卡在RunAsync()的解决思路

问题背景

使用AutoML.NET构建回归问题控制台应用,代码无语法错误,但实验始终卡在RunAsync()方法无法完成。使用的库版本:

  • Microsoft.ML = 2.0.1
  • Microsoft.ML.AutoML = 0.20.1
  • Microsoft.ML.LightGbm = 2.0.1

已在项目Data文件夹中存放出租车费预测数据集,代码如下:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using Microsoft.ML;
using Microsoft.ML.AutoML;
using Microsoft.ML.Data;
using Microsoft.ML.Trainers;
using Microsoft.ML.Transforms;
using Microsoft.ML.Trainers.LightGbm;
using static Microsoft.ML.DataOperationsCatalog;
using System.Data;
using System.Threading.Tasks;
   
namespace TaxiFairPrediction
{
    class Program
    {
        static async Task Main(string[] args)
        {
            Console.WriteLine("--------- Preparing AutoML experiment ---------");
            var mlContext = new MLContext(seed: 1);
            var projectDirectory = Directory.GetParent(Environment.CurrentDirectory).Parent.Parent.FullName;
            Console.WriteLine($"PROJECT DIR :{projectDirectory}");

            var TrainDataRelativePath = Path.Combine(projectDirectory, "Data", "taxi-fare-train.csv");
            var TestDataRelativePath = Path.Combine(projectDirectory, "Data", "taxi-fare-test.csv");
            var TrainData = mlContext.Data.LoadFromTextFile<TaxiFare>(TrainDataRelativePath, hasHeader: true, separatorChar: ',');
            var TestData = mlContext.Data.LoadFromTextFile<TaxiFare>(TestDataRelativePath, hasHeader: true, separatorChar: ',');
            var TrainSchema = TrainData.Schema;
            Console.WriteLine($"Input schema: {TrainSchema}");

            Console.WriteLine("Transforming data...");

            // Infer column information
            Console.WriteLine("Step #1 ----> Infering column information");
            ColumnInferenceResults columnInference =
                mlContext.Auto().InferColumns(TrainDataRelativePath,
                                              labelColumnName: "fare_amount",
                                              groupColumns: false);

            //Define pipeline
            Console.WriteLine("Step #2 ----> Creating pipeline");
            SweepablePipeline pipeline =
            mlContext.Auto().Featurizer(TrainData,
                                        columnInformation: columnInference.ColumnInformation)
                            .Append(mlContext.Auto().Regression(labelColumnName: columnInference.ColumnInformation.LabelColumnName));

            // Create AutoML experiment
            Console.WriteLine("Step #3 ----> Creating experiment");
            AutoMLExperiment experiment = mlContext.Auto().CreateExperiment();

            // Configure experiment
            experiment
                .SetPipeline(pipeline)
                .SetRegressionMetric(RegressionMetric.RSquared,
                                     labelColumn: columnInference.ColumnInformation.LabelColumnName)
                .SetTrainingTimeInSeconds(10)
                .SetRandomSearchTuner()
                .SetDataset(TrainData);

            // Run experiment
            Console.WriteLine("Step #4 ----> Run experiment");
            TrialResult experimentResults = await experiment.RunAsync();
            Console.WriteLine("Step #5 ----> Training Completed");

            // Get best model
            var bestRun = experimentResults.Model;
            string bestModelName = experimentResults.Model.GetType().FullName.ToString();
            Console.WriteLine($"Best Model Name: {bestModelName}");
            Console.WriteLine($"Rsquared on train data: {experimentResults.Metric.ToString()}");

            IDataView testDataViewWithBestScore = bestRun.Transform(TestData);
            RegressionMetrics testMetrics = mlContext.Regression.Evaluate(testDataViewWithBestScore,
                                                                          labelColumnName: "fare_amount");
            Console.WriteLine($"Rsquared on validation data: {testMetrics.RSquared}");

            Console.ReadKey();
        }
        public class TaxiFare
        {
            [LoadColumn(0)]
            public string vendor_id;

            [LoadColumn(1)]
            public float rate_code;

            [LoadColumn(2)]
            public float passenger_count;

            [LoadColumn(3)]
            public float trip_time_in_secs;

            [LoadColumn(4)]
            public float trip_distance;

            [LoadColumn(5)]
            public string payment_type;

            [LoadColumn(6)]
            public float fare_amount;
        }
    }
}

解决思路

1. 修复版本兼容性问题

Microsoft.ML.AutoML 0.20.1与Microsoft.ML 2.0.1版本不匹配,AutoML.NET版本需和ML.NET主版本保持一致。将Microsoft.ML.AutoML升级到2.0.1版本,避免API差异导致的执行停滞。

2. 统一数据处理逻辑

代码中同时通过LoadFromTextFile<TaxiFare>加载数据,又调用InferColumns从文件路径推断列信息,可能引发冲突。改为使用已加载的TrainData进行列推断:

ColumnInferenceResults columnInference =
    mlContext.Auto().InferColumns(TrainData,
                                  labelColumnName: "fare_amount",
                                  groupColumns: false);

同时添加数据校验代码,确认数据是否正确加载:

Console.WriteLine($"训练数据行数: {mlContext.Data.Count(TrainData)}");

3. 调整AutoML实验配置

  • 延长训练时间:SetTrainingTimeInSeconds(10)时间过短,部分模型训练无法完成,建议调整为30秒或更长时间测试。
  • 更换调优器:SetRandomSearchTuner()可能出现搜索停滞,尝试移除该调用使用默认调优器,或改用GridSearchTuner。
  • 指定验证集:手动拆分训练集为训练/验证集,明确告知AutoML验证数据,避免自动拆分异常:
var trainValidationSplit = mlContext.Data.TrainTestSplit(TrainData, testFraction: 0.2);
experiment.SetDataset(trainValidationSplit.TrainSet, trainValidationSplit.TestSet);

4. 启用监控日志定位问题

自定义控制台监控类,实时输出实验进度,定位停滞阶段:

public class ConsoleMonitor : IAutoMLMonitor
{
    public void ReportBestTrial(TrialResult result)
    {
        Console.WriteLine($"当前最佳模型R²: {result.Metric}");
    }

    public void ReportTrialStart(TrialSettings settings)
    {
        Console.WriteLine($"开始训练模型: {settings.TrainerName}");
    }

    public void ReportTrialProgress(TrialProgress progress)
    {
        Console.WriteLine($"训练进度: {progress.ProgressPercentage}%");
    }

    public void ReportTrialComplete(TrialResult result)
    {
        Console.WriteLine($"模型训练完成,R²: {result.Metric}");
    }
}

在实验配置中添加监控:

var monitor = new ConsoleMonitor();
experiment.SetMonitor(monitor);

5. 修复异步Main方法的执行问题

控制台应用的async Task Main在部分环境下可能导致主线程异常退出,改为同步调用异步方法:

static void Main(string[] args)
{
    MainAsync(args).Wait();
}

static async Task MainAsync(string[] args)
{
    // 原代码逻辑
}

内容的提问来源于stack exchange,提问作者AndCh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 15:55:01