Обучение и оценка модели
Из этой статьи вы узнаете, как создавать модели машинного обучения, собирать метрики и измерять производительность с помощью ML.NET. Несмотря на то что код в этом примере обучает модель регрессии, те же принципы действуют и в большинстве других алгоритмов.
Разделение данных на обучающий и проверочный наборы
Цель модели машинного обучения — обнаружить закономерности в обучающих данных. Эти закономерности используются для создания прогнозов на основе новых данных.
Можно моделировать данные с помощью класса, например HousingData
.
public class HousingData
{
[LoadColumn(0)]
public float Size { get; set; }
[LoadColumn(1, 3)]
[VectorType(3)]
public float[] HistoricalPrices { get; set; }
[LoadColumn(4)]
[ColumnName("Label")]
public float CurrentPrice { get; set; }
}
Используйте следующие данные, которые загружаются в IDataView
.
HousingData[] housingData = new HousingData[]
{
new HousingData
{
Size = 600f,
HistoricalPrices = new float[] { 100000f ,125000f ,122000f },
CurrentPrice = 170000f
},
new HousingData
{
Size = 1000f,
HistoricalPrices = new float[] { 200000f, 250000f, 230000f },
CurrentPrice = 225000f
},
new HousingData
{
Size = 1000f,
HistoricalPrices = new float[] { 126000f, 130000f, 200000f },
CurrentPrice = 195000f
},
new HousingData
{
Size = 850f,
HistoricalPrices = new float[] { 150000f,175000f,210000f },
CurrentPrice = 205000f
},
new HousingData
{
Size = 900f,
HistoricalPrices = new float[] { 155000f, 190000f, 220000f },
CurrentPrice = 210000f
},
new HousingData
{
Size = 550f,
HistoricalPrices = new float[] { 99000f, 98000f, 130000f },
CurrentPrice = 180000f
}
};
Разделите данные на обучающий и проверочный наборы с помощью метода TrainTestSplit
. В результате появится объект TrainTestData
, содержащий два члена IDataView
— один для обучающего набора данных, другой для проверочного. Распределение данных определяется параметром testFraction
. В приведенном ниже фрагменте кода для проверочного набора удерживаются 20 процентов исходных данных.
DataOperationsCatalog.TrainTestData dataSplit = mlContext.Data.TrainTestSplit(data, testFraction: 0.2);
IDataView trainData = dataSplit.TrainSet;
IDataView testData = dataSplit.TestSet;
Подготовка данных
Перед обучением модели машинного обучения данные необходимо подвергнуть предварительной обработке. Дополнительные сведения о подготовке данных см. в инструкции по подготовке данных, а также в transforms page
.
Алгоритмы ML.NET имеют ограничения на типы входных столбцов. Кроме того, если значения не указаны, в качестве имен входных и выходных столбцов используются значения по умолчанию.
Работа с ожидаемыми типами столбцов
Алгоритмы машинного обучения в ML.NET в качестве входных данных ожидают вектор с плавающей запятой известного размера. Если все данные уже переведены в числовой формат и предназначены для одновременной обработки (пиксели изображения), примените к модели данных атрибут VectorType
.
Если не все данные являются числовыми, а вы хотите к каждому столбцу применить отдельное преобразование данных, используйте метод Concatenate
после обработки каждого столбца — в результате все отдельные столбцы будут объединены в единый вектор компонентов, который будет выходными данными нового столбца.
В следующем фрагменте кода столбцы Size
и HistoricalPrices
объединены в один вектор компонентов, который служит выходными данными для нового столбца с именем Features
. Поскольку нет разницы в масштабах, NormalizeMinMax
применяется к столбцу Features
для нормализации данных.
// Define Data Prep Estimator
// 1. Concatenate Size and Historical into a single feature vector output to a new column called Features
// 2. Normalize Features vector
IEstimator<ITransformer> dataPrepEstimator =
mlContext.Transforms.Concatenate("Features", "Size", "HistoricalPrices")
.Append(mlContext.Transforms.NormalizeMinMax("Features"));
// Create data prep transformer
ITransformer dataPrepTransformer = dataPrepEstimator.Fit(trainData);
// Apply transforms to training data
IDataView transformedTrainingData = dataPrepTransformer.Transform(trainData);
Работа с именами столбцов по умолчанию
Если имена столбцов не указаны, алгоритмы ML.NET используют имена по умолчанию. Все инструкторы имеют параметр с именем featureColumnName
для входных данных, алгоритма, а там, где это применимо, еще и параметр с именем labelColumnName
для ожидаемого значения. По умолчанию используются значения Features
и Label
соответственно.
Если во время предварительной обработки используется метод Concatenate
, который создает столбец с именем Features
, имя столбца компонентов в параметрах алгоритма указывать необязательно, поскольку он уже существует в предварительно обработанных данных IDataView
. Столбец меток — CurrentPrice
, но в связи с тем, что атрибут ColumnName
используется в модели данных, ML.NET переименовывает столбец CurrentPrice
в Label
и таким образом устраняет необходимость предоставлять параметр labelColumnName
для средства оценки алгоритма машинного обучения.
Если вы не хотите использовать имена столбцов по умолчанию, передайте имена столбцов компонентов и меток в виде параметров при определении средства оценки алгоритма машинного обучения, как показано в следующем фрагменте кода:
var UserDefinedColumnSdcaEstimator = mlContext.Regression.Trainers.Sdca(labelColumnName: "MyLabelColumnName", featureColumnName: "MyFeatureColumnName");
Кэширование данных
По умолчанию при обработке данных их загрузка или потоковая передача осуществляется отложенным образом. Это означает, что во время обучения алгоритмы обучения могут несколько раз загружать данные с диска и выполнять их итерацию. Поэтому чтобы сократить количество загрузок данных с диска, рекомендуется кэшировать помещаемые в память наборы данных. Кэширование выполняется как часть EstimatorChain
с помощью AppendCacheCheckpoint
.
Рекомендуется использовать AppendCacheCheckpoint
до алгоритмов обучения в конвейере.
Используя следующий класс EstimatorChain
для добавления метода AppendCacheCheckpoint
перед классом StochasticDualCoordinateAscent
, алгоритм обучения кэширует результаты предыдущих средств оценки для последующего использования.
// 1. Concatenate Size and Historical into a single feature vector output to a new column called Features
// 2. Normalize Features vector
// 3. Cache prepared data
// 4. Use Sdca trainer to train the model
IEstimator<ITransformer> dataPrepEstimator =
mlContext.Transforms.Concatenate("Features", "Size", "HistoricalPrices")
.Append(mlContext.Transforms.NormalizeMinMax("Features"))
.AppendCacheCheckpoint(mlContext);
.Append(mlContext.Regression.Trainers.Sdca());
Обучение модели машинного обучения
Когда данные пройдут предварительную обработку, используйте метод Fit
для обучения модели машинного обучения с алгоритмом регрессии StochasticDualCoordinateAscent
.
// Define StochasticDualCoordinateAscent regression algorithm estimator
var sdcaEstimator = mlContext.Regression.Trainers.Sdca();
// Build machine learning model
var trainedModel = sdcaEstimator.Fit(transformedTrainingData);
Извлечение параметров модели
После обучения модели извлеките полученные ModelParameters
для проверки или повторного обучения. LinearRegressionModelParameters
предоставляют смещение и полученные коэффициенты или вес обученной модели.
var trainedModelParameters = trainedModel.Model as LinearRegressionModelParameters;
Примечание.
Другие модели включают параметры, характерные для их задач. Например, алгоритм K-средних помещает данные в кластер на основе центроидов, а KMeansModelParameters
содержит свойство, в котором хранятся полученные центроиды. Чтобы узнать больше, изучите Microsoft.ML.Trainers
документацию по API и выполните поиск классов, в именах которых есть ModelParameters
.
Оценка качества модели
Чтобы выбрать наиболее эффективную модель, необходимо оценить ее производительность на основе проверочных данных. Для измерения различных метрик обученной модели используйте метод Evaluate
.
Примечание.
Метод Evaluate
создает различные метрики в зависимости от того, на каком компьютере выполнялась задача машинного обучения. Чтобы узнать больше, изучите Microsoft.ML.Data
документацию по API и выполните поиск классов, в именах которых есть Metrics
.
// Measure trained model performance
// Apply data prep transformer to test data
IDataView transformedTestData = dataPrepTransformer.Transform(testData);
// Use trained model to make inferences on test data
IDataView testDataPredictions = trainedModel.Transform(transformedTestData);
// Extract model metrics and get RSquared
RegressionMetrics trainedModelMetrics = mlContext.Regression.Evaluate(testDataPredictions);
double rSquared = trainedModelMetrics.RSquared;
В приведенном выше фрагменте кода:
- Проверочный набор данных подвергается предварительной обработке с использованием предварительно заданных преобразований для подготовки данных.
- В обученной модели машинного обучения формируются прогнозы на основе проверочных данных.
- В методе
Evaluate
значения в столбцуCurrentPrice
проверочного набора данных сравниваются со столбцомScore
, куда сохраняются новые полученные прогнозы, и рассчитываются метрики модели регрессии, одна из которых, R-квадрат, хранится в переменнойrSquared
.
Примечание.
В этом небольшом примере из-за ограниченного объема данных значение R-квадрат не попадает в диапазон от 0 до 1. В реальной ситуации его значение должно быть в диапазоне от 0 до 1.