1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-linfa

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
CONTRIBUTE.md 12 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 11:51 75edd97

Параметры. Подгонка под набор данных (dataset)

params.fit(&dataset);

Общие типы с плавающей точкой

Каждый алгоритм должен быть реализован для f32 и f64 типов с плавающей точкой. Это может быть достигнуто с помощью признака linfa::Float, который по сути является просто комбинацией ndarray::NdFloat и num_traits::Float. Вы можете найти большинство констант (например, ноль, один, PI) в документации num_traits. Вот небольшой пример функции, общей для Float:

use linfa::Float;
fn div_capped<F: Float>(num: F) {
    F::one() / (num + F::from(1e-5).unwrap())
}

Реализовать признаки предсказания

Существует два разных признака для предсказаний: Predict и PredictInplace. PredictInplace принимает ссылку на записи и записывает предсказание в целевой параметр. Это должно быть реализовано новыми алгоритмами, например:

impl<F: Float, D: Data<Elem = F>> PredictInplace<ArrayBase<D, Ix2>, Array1<F>> for Svm<F, F> {
    fn predict_inplace(&self, data: &ArrayBase<D, Ix2>, targets: &mut Array1<F>) {
        assert_eq!(data.n_rows(), targets.len(), "Количество точек данных должно соответствовать количеству выходных целей.");

        for (data, target) in data.outer_iter().zip(targets.iter_mut()) {
            *target = self.normal.dot(&data) - self.rho;
        }
    }

    fn default_target(&self, data: &ArrayBase<D, Ix2>) -> Array1<F> {
        Array1::zeros(data.nrows())
    }
}

Эта реализация затем используется Predict, чтобы предоставить следующие комбинации записей и целей:

  • Dataset -> Dataset;
  • &Dataset -> Array1;
  • Array2 -> Dataset;
  • &Array2 -> Array1.

И должна быть импортирована пользователем.

Сделать serde опциональным

Если вы хотите реализовать Serialize и Deserialize для своих параметров, пожалуйста, сделайте это за флагом функции. Вы можете добавить в свой манифест Cargo:

[features]
serde = ["serde_crate", "ndarray/serde"]

[dependencies.serde_crate]
package = "serde"
optional = true
version = "1.0"

Который по существу переименовывает ящик serde в serde_crate и добавляет признак serde. В вашей структуре параметров переместите определение макроса за признак serde:

#[cfg(feature = "serde")]
use serde_crate::{Deserialize, Serialize};

#[cfg_attr(
    feature = "serde",
    derive(Serialize, Deserialize),
    serde(crate = "serde_crate")
)]
#[derive(Clone, Debug, PartialEq)]
pub struct HyperParams {
...
}

Добавить набор данных

Когда вы хотите добавить набор данных в ящик linfa-datasets, вам необходимо сделать следующее:

  • создать архив с вашим набором данных в виде файла CSV, разделённого точкой с запятой, и переместить его в linfa-datasets/data/?.csv.gz;
  • добавить признак с именем вашего набора данных в linfa-datasets;
  • создайте новую функцию в linfa-datasets/src/lib.rs, которая будет носить имя вашего набора данных и загружать его как двоичный файл.

Для последнего шага вы можете посмотреть на похожие реализации, например, набор данных Iris. Идея здесь состоит в том, чтобы поместить набор данных непосредственно в создаваемую библиотеку и проанализировать его из памяти. Очевидно, это возможно только для небольших наборов данных.

После добавления его в ящик linfa-datasets вы можете включить соответствующую функцию в ваш файл Cargo.toml:

linfa-datasets = { version = "0.3.0", path = "../datasets", features = ["winequality"] }

А затем использовать его в вашем примере или тестах следующим образом:

fn main() {
    let (train, valid) = linfa_datasets::winequality()
        .split_with_ratio(0.8);
    /// ...
}

Использовать ограничение признака lapack

Когда вы хотите реализовать алгоритм, который требует ограничения Lapack, вы можете добавить ограничение признака к стандартному ограничению linfa::Float, например, F: Float + Scalar + Lapack. Если вы сделаете это, то сейчас столкнётесь с конфликтующими определениями функций num_traits::Float и cauchy::Scalar: первое определено для вещественных значений, а второе — для комплексных значений.

Если вы хотите избежать этого, вы можете использовать: Черты linfa::dataset::{WithLapack, WithoutLapack}, которые в основном добавляют признак Lapack для блока, а затем снова удаляют его, чтобы избежать конфликтов.

Например:

let decomp = covariance.with_lapack().cholesky(UPLO::Lower)?;
let sol = decomp
     .solve_triangular(UPLO::Lower, Diag::NonUnit, &Array::eye(n_features))?
     .without_lapack();

Бенчмаркинг

Создание бенчмарков

Для проекта важно иметь в наличии бенчмарки, чтобы оценить пользу от изменений, связанных с производительностью. Чтобы упростить этот процесс, мы предоставляем некоторые рекомендации по написанию бенчмарков.

  1. Тестируйте для различных размеров выборки для большинства алгоритмов [1_000, 10_000, 20_000]. Для алгоритмов, где это не слишком медленно, используйте 100k вместо 20k.
  2. Тестируйте для разных размерностей признаков. Обычно двух достаточно для большинства алгоритмов. Предлагаются следующие размерности признаков для использования для разных типов алгоритмов:
    • Пространственные алгоритмы: [3, 8]
    • Алгоритмы уменьшения размерности: [10, 20, 50]
    • Другие: [5, 10]
  3. Используйте Criterion. Другой популярный инструмент для бенчмаркинга в настоящее время активно не поддерживается, и на момент написания этой статьи он не обновлялся с 25 февраля 2021 года.
  4. Протестируйте различные реализации алгоритмов, например, Pls имеет следующие алгоритмы: Nipals и Svd.
  5. Для алгоритмов, требующих RNG или случайное начальное значение в качестве входных данных, используйте постоянное начальное значение для воспроизводимости.
  6. При тестировании многоцелевых целей количество целей должно быть в следующем диапазоне: [2, 4].
  7. В BenchmarkId включите значения, используемые для параметризации бенчмарка. Например, если мы делаем Pls, у нас может быть что-то вроде Canonical-Nipals-5feats-1_000samples.
  8. Передавайте данные в качестве аргумента функции, которую вы тестируете. Это предотвратит включение времени создания данных в бенчмарк.
  9. Добавьте профилировщик, см. здесь для примера того, как это сделать с pprof, Criterion и Flamegraph.
  10. Используйте функцию benchmarks в ящике linfa для настройки групп бенчмарков и профилировщика. См. bench в linfa-pls в качестве примера этого. В большинстве случаев вы можете просто скопировать и вставить части конфигурации кода. Если требуются другие конфигурации, их всё равно легко настроить и объяснить в документации pprof и Criterion.

Не стесняйтесь использовать bench pls в качестве руководства. Обратите внимание, что он использует функции config::set_default_benchmark_configs и config::get_default_profiling_configs для настройки бенчмаркинга и профилирования соответственно.

Запуск бенчмарков

При запуске бенчмарков иногда вам потребуется профилировать выполнение кода. Предполагая, что вы выполнили шаг 9, чтобы добавить хук профилирования pprof для пакета linfa-ica, вы можете запустить следующее, чтобы получить результаты профилирования в виде flamegraph. Имейте в виду, что на момент написания этого профилирование не будет работать на компьютерах с Windows.

cargo bench -p linfa-ica --bench fast_ica -q -- --profile-time 30

Если вы заинтересованы в запуске обычного критерия bench для linfa-ica, то вы можете выполнить следующее:

cargo bench -p linfa-ica

Отчётность о показателях бенчмарков

Важно, чтобы у нас была согласованная методология отчётности о бенчмарках. Ниже приведён шаблон, который должен помочь рецензентам.

### Контекст
В списке пунктов опишите следующее:
1. Работа от батареи или при подключении к сети
2. Режим энергосбережения
3. Был ли компьютер бездействующим во время бенчмарка
4. Перегревался ли компьютер
5. Аппаратные характеристики

### Команда запуска бенчмарка
Результаты бенчмарка (формат кода)

[Прикреплённые Flamegraphs, если также были выполнены прогоны профиля]

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-linfa.git
git@api.gitlife.ru:oschina-mirror/mirrors-linfa.git
oschina-mirror
mirrors-linfa
mirrors-linfa
master