genrfeatures
функция позволяет вам автоматизировать процесс разработки функции в контексте рабочего процесса машинного обучения. Прежде, чем передать табличные обучающие данные модели регрессии, можно создать новые возможности из предикторов в данных при помощи genrfeatures
. Используйте возвращенные данные, чтобы обучить модель.
Генерируйте новые признаки на основе своего рабочего процесса машинного обучения.
Чтобы генерировать признаки для поддающейся толкованию модели регрессии, используйте TargetLearner
по умолчанию значение
"linear"
в вызове genrfeatures
. Можно затем использовать возвращенные данные, чтобы обучить модель линейной регрессии. Для примера смотрите, Интерпретируют Линейную Модель с Генерированными Признаками.
Чтобы генерировать признаки, которые могут привести к лучшему предсказанию модели, задайте TargetLearner="bag"
в вызове genrfeatures
. Можно затем использовать возвращенные данные, чтобы обучить сложенную в мешок модель регрессии ансамбля. Для примера смотрите, Генерируют Новые признаки, чтобы Улучшать Сложенную в мешок Производительность Ансамбля.
Чтобы лучше изучить генерированные признаки, используйте describe
функция FeatureTransformer
объект. Чтобы применить те же преобразования функции набора обучающих данных к тесту или набору валидации, используйте transform
функция FeatureTransformer
объект.
Используйте автоматизированную разработку функции, чтобы генерировать новые признаки. Обучите модель линейной регрессии использование генерированных признаков. Интерпретируйте отношение между генерированными признаками и обученной моделью.
Загрузите patients
набор данных. Составьте таблицу от подмножества переменных. Отобразите первые несколько строк таблицы.
load patients Tbl = table(Age,Diastolic,Gender,Height,SelfAssessedHealthStatus, ... Smoker,Weight,Systolic); head(Tbl)
ans=8×8 table
Age Diastolic Gender Height SelfAssessedHealthStatus Smoker Weight Systolic
___ _________ __________ ______ ________________________ ______ ______ ________
38 93 {'Male' } 71 {'Excellent'} true 176 124
43 77 {'Male' } 69 {'Fair' } false 163 109
38 83 {'Female'} 64 {'Good' } false 131 125
40 75 {'Female'} 67 {'Fair' } false 133 117
49 80 {'Female'} 64 {'Good' } false 119 122
46 70 {'Female'} 68 {'Good' } false 142 121
33 88 {'Female'} 64 {'Good' } true 142 130
40 82 {'Male' } 68 {'Good' } false 180 115
Генерируйте 10 новых признаков от переменных в Tbl
. Задайте Systolic
переменная как ответ. По умолчанию, genrfeatures
принимает, что новые функции будут использованы, чтобы обучить модель линейной регрессии.
rng("default") % For reproducibility [T,NewTbl] = genrfeatures(Tbl,"Systolic",10)
T = FeatureTransformer with properties: Type: 'regression' TargetLearner: 'linear' NumEngineeredFeatures: 10 NumOriginalFeatures: 0 TotalNumFeatures: 10
NewTbl=100×11 table
zsc(d(Smoker)) q8(Age) eb8(Age) zsc(sin(Height)) zsc(kmd8) q6(Height) eb8(Diastolic) q8(Diastolic) zsc(fenc(c(SelfAssessedHealthStatus))) q10(Weight) Systolic
______________ _______ ________ ________________ _________ __________ ______________ _____________ ______________________________________ ___________ ________
1.3863 4 5 1.1483 -0.56842 6 8 8 0.27312 7 124
-0.71414 6 6 -0.3877 -2.0772 5 2 2 -1.4682 6 109
-0.71414 4 5 1.1036 -0.21519 2 4 5 0.82302 3 125
-0.71414 5 6 -1.4552 -0.32389 4 2 2 -1.4682 4 117
-0.71414 8 8 1.1036 1.2302 2 3 4 0.82302 1 122
-0.71414 7 7 -1.5163 -0.88497 4 1 1 0.82302 5 121
1.3863 3 3 1.1036 -1.1434 2 6 6 0.82302 5 130
-0.71414 5 6 -1.5163 -0.3907 4 4 5 0.82302 8 115
-0.71414 1 2 -1.5163 0.4278 4 3 3 0.27312 9 115
-0.71414 2 3 -0.26055 -0.092621 3 5 6 0.27312 3 118
-0.71414 7 7 -1.5163 0.16737 4 2 2 0.27312 2 114
-0.71414 6 6 -0.26055 -0.32104 3 1 1 -1.8348 5 115
-0.71414 1 1 1.1483 -0.051074 6 1 1 -1.8348 7 127
1.3863 5 5 0.14351 2.3695 6 8 8 0.27312 10 130
-0.71414 3 4 0.96929 0.092962 2 3 4 0.82302 3 114
1.3863 8 8 1.1483 -0.049336 6 7 8 0.82302 8 130
⋮
T
FeatureTransformer
объект, который может использоваться, чтобы преобразовать новые данные и newTbl
содержит новые признаки, генерированные от Tbl
данные.
Чтобы лучше изучить генерированные признаки, используйте describe
объектная функция FeatureTransformer
объект. Например, смотрите первые два генерированных признака.
describe(T,1:2)
Type IsOriginal InputVariables Transformations ___________ __________ ______________ ___________________________________________________________ zsc(d(Smoker)) Numeric false Smoker Variable of type double converted from an integer data type Standardization with z-score (mean = 0.34, std = 0.4761) q8(Age) Categorical false Age Equiprobable binning (number of bins = 8)
Первая функция в newTbl
числовая переменная, созданная первым преобразованием значений Smoker
переменная к числовой переменной типа double
и затем преобразовывая результаты к z-баллам. Вторая функция в newTbl
категориальная переменная, созданная раскладыванием значения Age
переменная в 8 равновероятных интервалов.
Используйте генерированные признаки, чтобы подбирать модель линейной регрессии без любой регуляризации.
Mdl = fitrlinear(NewTbl,"Systolic",Lambda=0);
Постройте коэффициенты предикторов, используемых, чтобы обучить Mdl
. Обратите внимание на то, что fitrlinear
расширяет категориальные предикторы прежде, чем подобрать модель.
p = length(Mdl.Beta); [sortedCoefs,expandedIndex] = sort(Mdl.Beta,ComparisonMethod="abs"); sortedExpandedPreds = Mdl.ExpandedPredictorNames(expandedIndex); bar(sortedCoefs,Horizontal="on") yticks(1:2:p) yticklabels(sortedExpandedPreds(1:2:end)) xlabel("Coefficient") ylabel("Expanded Predictors") title("Coefficients for Expanded Predictors")
Идентифицируйте предикторы, коэффициенты которых имеют большие абсолютные значения.
bigCoefs = abs(sortedCoefs) >= 4; flip(sortedExpandedPreds(bigCoefs))
ans = 1x6 cell
Columns 1 through 3
{'eb8(Diastolic)...'} {'zsc(d(Smoker))'} {'q8(Age) >= 2'}
Columns 4 through 6
{'q10(Weight) >= 9'} {'q6(Height) >= 5'} {'eb8(Diastolic)...'}
Можно использовать частичные графики зависимости анализировать категориальные функции, уровни которых имеют большие коэффициенты в терминах абсолютного значения. Например, смотрите частичный график зависимости для eb8(Diastolic)
переменная, чьи уровни eb8(Diastolic) >= 5
и eb8(Diastolic) >= 6
имейте коэффициенты с большими абсолютными значениями. Эти два уровня соответствуют значимым изменениям в предсказанном Systolic
значения.
plotPartialDependence(Mdl,"eb8(Diastolic)",NewTbl);
Используйте genrfeatures
к новым возможностям инженера перед обучением сложенная в мешок модель регрессии ансамбля. Прежде, чем сделать предсказания на новых данных, примените те же преобразования функции к новому набору данных. Сравните эффективность набора тестов ансамбля, который использует спроектированные функции к эффективности набора тестов ансамбля, который использует исходные функции.
Считайте данные об отключении электроэнергии в рабочую область как таблица. Удалите наблюдения с отсутствующими значениями и отобразите первые несколько строк таблицы.
outages = readtable("outages.csv");
Tbl = rmmissing(outages);
head(Tbl)
ans=8×6 table
Region OutageTime Loss Customers RestorationTime Cause
_____________ ________________ ______ __________ ________________ ___________________
{'SouthWest'} 2002-02-01 12:18 458.98 1.8202e+06 2002-02-07 16:50 {'winter storm' }
{'SouthEast'} 2003-02-07 21:15 289.4 1.4294e+05 2003-02-17 08:14 {'winter storm' }
{'West' } 2004-04-06 05:44 434.81 3.4037e+05 2004-04-06 06:10 {'equipment fault'}
{'MidWest' } 2002-03-16 06:18 186.44 2.1275e+05 2002-03-18 23:23 {'severe storm' }
{'West' } 2003-06-18 02:49 0 0 2003-06-18 10:54 {'attack' }
{'NorthEast'} 2003-07-16 16:23 239.93 49434 2003-07-17 01:12 {'fire' }
{'MidWest' } 2004-09-27 11:09 286.72 66104 2004-09-27 16:37 {'equipment fault'}
{'SouthEast'} 2004-09-05 17:48 73.387 36073 2004-09-05 20:46 {'equipment fault'}
Некоторые переменные, такие как OutageTime
и RestorationTime
, имейте типы данных, которые не поддерживаются функциями обучения модели регрессии как fitrensemble
.
Разделите данные в наборы обучающих данных и наборы тестов. Используйте приблизительно 70% наблюдений как обучающие данные и 30% наблюдений как тестовые данные. Разделите данные с помощью cvpartition
.
rng("default") % For reproducibility of the partition c = cvpartition(size(Tbl,1),Holdout=0.30); TrainTbl = Tbl(training(c),:); TestTbl = Tbl(test(c),:);
Используйте обучающие данные, чтобы генерировать 30 новых признаков, чтобы соответствовать уволенному ансамблю. По умолчанию 30 функций включают исходные функции, которые могут быть использованы как предикторы уволенным ансамблем.
[Transformer,NewTrainTbl] = genrfeatures(TrainTbl,"Loss",30, ... TargetLearner="bag"); Transformer
Transformer = FeatureTransformer with properties: Type: 'regression' TargetLearner: 'bag' NumEngineeredFeatures: 27 NumOriginalFeatures: 3 TotalNumFeatures: 30
Создайте NewTestTbl
путем применения преобразований сохранен в объекте Transformer
к тестовым данным.
NewTestTbl = transform(Transformer,TestTbl);
Обучите уволенный ансамбль, использующий исходный набор обучающих данных TrainTbl
, и вычислите среднеквадратическую ошибку (MSE) модели на исходном наборе тестов TestTbl
. Задайте только три переменных предиктора, которые могут использоваться fitrensemble
(Region
, Customers
, и Cause
), и не используйте два datetime
переменные предикторы (OutageTime
и RestorationTime
). Затем обучите уволенный ансамбль, использующий преобразованный набор обучающих данных NewTrainTbl
, и вычислите MSE модели на преобразованном наборе тестов NewTestTbl
.
originalMdl = fitrensemble(TrainTbl,"Loss ~ Region + Customers + Cause", ... Method="bag"); originalTestMSE = loss(originalMdl,TestTbl)
originalTestMSE = 1.8999e+06
newMdl = fitrensemble(NewTrainTbl,"Loss",Method="bag"); newTestMSE = loss(newMdl,NewTestTbl)
newTestMSE = 1.8617e+06
newTestMSE
меньше originalTestMSE
, который предполагает, что уволенный ансамбль, обученный на преобразованных данных, выполняет немного лучше, чем уволенный ансамбль, обученный на исходных данных.
Сравните предсказанные значения отклика набора тестов с истинными значениями отклика для обеих моделей. Постройте журнал предсказанного ответа вдоль вертикальной оси и журнал истинного ответа (Loss
) вдоль горизонтальной оси. Точки на ссылочной линии указывают на правильные предсказания. Хорошая модель производит предсказания, которые рассеиваются около линии.
predictedTestY = predict(originalMdl,TestTbl); newPredictedTestY = predict(newMdl,NewTestTbl); plot(log(TestTbl.Loss),log(predictedTestY),".") hold on plot(log(TestTbl.Loss),log(newPredictedTestY),".") hold on plot(log(TestTbl.Loss),log(TestTbl.Loss)) hold off xlabel("log(True Response)") ylabel("log(Predicted Response)") legend(["Original Model Results","New Model Results","Reference Line"], ... Location="southeast") xlim([-1 10]) ylim([-1 10])
genrfeatures
| FeatureTransformer
| describe
| transform
| fitrlinear
| fitrensemble
| plotPartialDependence
| gencfeatures