Класс: FeatureSelectionNCARegression
Спрогнозируйте ответы, используя регрессионую модель анализа компонентов окрестностей (NCA)
ypred = predict(mdl,X)
ypred = predict(mdl,X)
вычисляет предсказанные значения отклика, ypred
, соответствующий строкам X
, с использованием модели mdl
.
mdl
- Модель анализа компонентов соседства для регрессииFeatureSelectionNCARegression
объектМодель анализа компонента соседства для регрессии, заданная как FeatureSelectionNCARegression
объект.
X
- Значения переменных предиктораЗначения переменных предиктора, заданные как n -by - p матрица, где n - количество наблюдений, а p - количество переменных предиктора.
Типы данных: single
| double
ypred
- Предсказанные значения откликаПредсказанные значения отклика, заданные как вектор n -by-1, где n - количество наблюдений.
loss
и predict
Загрузите выборочные данные.
Загрузите данные корпуса [1] из репозитория машинного обучения UCI [2]. Набор данных имеет 506 наблюдений. Первые 13 столбцов содержат значения предиктора, а последний - значения отклика. Цель состоит в том, чтобы предсказать медианное значение домов, занятых владельцами в пригородном Бостоне, как функцию 13 предикторов.
Загрузите данные и задайте вектор отклика и матрицу предиктора.
load('housing.data');
X = housing(:,1:13);
y = housing(:,end);
Разделите данные на обучающие и тестовые наборы, используя 4-й предиктор в качестве сгруппированной переменной для стратифицированного разбиения. Это гарантирует, что каждое разбиение включает одинаковое количество наблюдений от каждой группы.
rng(1) % For reproducibility cvp = cvpartition(X(:,4),'Holdout',56); Xtrain = X(cvp.training,:); ytrain = y(cvp.training,:); Xtest = X(cvp.test,:); ytest = y(cvp.test,:);
cvpartition
случайным образом присвоения 56 наблюдений в тестовый набор, а остальная часть данных - в набор обучающих данных.
Выполните выбор признаков с помощью настроек по умолчанию
Выполните выбор признаков, используя модель NCA для регрессии. Стандартизируйте значения предиктора.
nca = fsrnca(Xtrain,ytrain,'Standardize',1);
Постройте график весов функций.
figure()
plot(nca.FeatureWeights,'ro')
Ожидается, что веса нерелевантных функций приблизятся к нулю. fsrnca
определяет две функции как нерелевантные.
Вычислите потери регрессии.
L = loss(nca,Xtest,ytest,'LossFunction','mad')
L = 2.5394
Вычислите предсказанные значения отклика для тестового набора и постройте график их зависимости от фактического отклика.
ypred = predict(nca,Xtest); figure() plot(ypred,ytest,'bo') xlabel('Predicted response') ylabel('Actual response')
Совершенная подгонка от фактических значений образует 45 степени прямой линии. На этом графике предсказанные и фактические значения отклика, по-видимому, рассеиваются вокруг этой линии. Настройка (параметр регуляризации) значение обычно помогает улучшить эффективность.
Настройте параметр регуляризации с помощью 10-кратной перекрестной валидации
Настройка означает нахождение значение, которое приведет к минимальным регрессионным потерям. Вот шаги настройки использование 10-кратной перекрестной валидации:
1. Сначала разбейте данные на 10 складок. Для каждой складки cvpartition
Присвоения 1/10-ю часть данных как набор обучающих данных и 9/10-ю часть данных как тестовый набор.
n = length(ytrain);
cvp = cvpartition(Xtrain(:,4),'kfold',10);
numvalidsets = cvp.NumTestSets;
Назначьте значения для поиска. Создайте массив для хранения значений потерь.
lambdavals = linspace(0,2,30)*std(ytrain)/n; lossvals = zeros(length(lambdavals),numvalidsets);
2. Обучите модель анализа компонентов по соседству (nca) для каждой значение с использованием набора обучающих данных в каждой складке.
3. Подбор модели регрессии Гауссова процесса (gpr) с помощью выбранных функций. Затем вычислите регрессионные потери для соответствующего тестового набора в складке с помощью модели gpr. Запишите значение потерь.
4. Повторите это для каждого значение и каждый сгиб.
for i = 1:length(lambdavals) for k = 1:numvalidsets X = Xtrain(cvp.training(k),:); y = ytrain(cvp.training(k),:); Xvalid = Xtrain(cvp.test(k),:); yvalid = ytrain(cvp.test(k),:); nca = fsrnca(X,y,'FitMethod','exact',... 'Lambda',lambdavals(i),... 'Standardize',1,'LossFunction','mad'); % Select features using the feature weights and a relative % threshold. tol = 1e-3; selidx = nca.FeatureWeights > tol*max(1,max(nca.FeatureWeights)); % Fit a non-ARD GPR model using selected features. gpr = fitrgp(X(:,selidx),y,'Standardize',1,... 'KernelFunction','squaredexponential','Verbose',0); lossvals(i,k) = loss(gpr,Xvalid(:,selidx),yvalid); end end
Вычислите средние потери, полученные из складок для каждого значение. Постройте график средних потерь по сравнению с значения.
meanloss = mean(lossvals,2); figure; plot(lambdavals,meanloss,'ro-'); xlabel('Lambda'); ylabel('Loss (MSE)'); grid on;
Найти значение, которое создает минимальное значение потерь.
[~,idx] = min(meanloss); bestlambda = lambdavals(idx)
bestlambda = 0.0251
Выполните выбор признаков для регрессии, используя лучшее значение. Стандартизируйте значения предиктора.
nca2 = fsrnca(Xtrain,ytrain,'Standardize',1,'Lambda',bestlambda,... 'LossFunction','mad');
Постройте график весов функций.
figure()
plot(nca.FeatureWeights,'ro')
Вычислите потери с помощью новой модели nca на тестовых данных, которая не используется для выбора функций.
L2 = loss(nca2,Xtest,ytest,'LossFunction','mad')
L2 = 2.0560
Настройка параметра регуляризации помогает идентифицировать соответствующие функции и уменьшает потерю.
Постройте график предсказанного от фактических значений отклика в тестовом наборе.
ypred = predict(nca2,Xtest);
figure;
plot(ypred,ytest,'bo');
Предсказанные значения отклика, по-видимому, также ближе к фактическим значениям.
Ссылки
[1] Харрисон, Д. и Д. Л., Рубинфельд. «Гедонические цены и спрос на чистый воздух». Дж. Энвирон. Экономика и менеджмент. Vol.5, 1978, с. 81-102.
[2] Лихман, M. UCI Machine Learning Repository, Irvine, CA: University of California, School of Information and Computer Science, 2013. https://archive.ics.uci.edu/ml.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.