Ответ 1
Вес класса с Spark ML
По состоянию на этот момент вес класса для алгоритма Random Forest все еще находится в разработке (см. здесь)
Но если вы захотите попробовать другие классификаторы - эта функциональность уже добавлена в Логистическая регрессия,
Рассмотрим случай, когда мы имеем 80% положительных результатов (метка == 1) в наборе данных, поэтому теоретически мы хотим "недооценивать" положительный класс. Целевая функция логистической потери должна относиться к отрицательному классу (метка == 0) с более высоким весом.
Вот пример в Scala для генерации этого веса, мы добавляем новый столбец к кадру данных для каждой записи в наборе данных:
def balanceDataset(dataset: DataFrame): DataFrame = {
// Re-balancing (weighting) of records to be used in the logistic loss objective function
val numNegatives = dataset.filter(dataset("label") === 0).count
val datasetSize = dataset.count
val balancingRatio = (datasetSize - numNegatives).toDouble / datasetSize
val calculateWeights = udf { d: Double =>
if (d == 0.0) {
1 * balancingRatio
}
else {
(1 * (1.0 - balancingRatio))
}
}
val weightedDataset = dataset.withColumn("classWeightCol", calculateWeights(dataset("label")))
weightedDataset
}
Затем мы создаем класс следующим образом:
new LogisticRegression().setWeightCol("classWeightCol").setLabelCol("label").setFeaturesCol("features")
Подробнее см. здесь: https://issues.apache.org/jira/browse/SPARK-9610
- Предиктивная мощность
Другая проблема, которую вы должны проверить - есть ли у ваших возможностей "интеллектуальная мощность" для метки, которую вы пытаетесь предсказать. В случае, когда после выборочной выборки у вас все еще низкая точность, возможно, это не имеет никакого отношения к тому факту, что ваш набор данных несбалансирован по своей природе.
Я бы сделал анализ поисковых данных. Если классификатор не работает лучше, чем случайный выбор, существует риск, что просто нет связи между функциями и классом.
- Выполните корреляционный анализ для каждой функции с меткой.
- Создание гистограмм для конкретных объектов для конкретных объектов (например, построение гистограмм данных для каждого класса для заданного функция на той же оси) также может быть хорошим способом показать, функция хорошо различает два класса.
Overfitting - низкая ошибка в вашем обучающем наборе и высокая ошибка в вашем тестовом наборе могут быть признаком того, что вы наложили на карту чрезмерно гибкий набор функций.
Отклонение смещения - проверьте, страдает ли ваш классификатор от высокой проблемы с отклонениями или высокой дисперсией.
- Ошибка обучения против ошибки проверки - нарисуйте ошибку проверки и ошибку набора обучения, как функцию примеров обучения (выполните дополнительное обучение)
- Если строки, похоже, сходятся к одному и тому же значению и близки к концу, то ваш классификатор имеет высокий уровень смещения. В таком случае добавление большего количества данных не поможет. Измените классификатор для более высокой дисперсии или просто уменьшите параметр регуляризации текущего.
- Если, с другой стороны, линии довольно далеко друг от друга, и у вас есть небольшая ошибка набора тестов, но высокая ошибка проверки, то ваш классификатор имеет слишком высокую дисперсию. В этом случае получение большего количества данных, скорее всего, поможет. Если после получения большего количества данных дисперсия будет по-прежнему слишком высокой, вы можете увеличить параметр регуляризации.