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
相关产品推荐
相关产品推荐

