在MATLAB中使用sequentialfs时失败?

时间:2015-05-26 12:21:28

标签: matlab

我试图在逻辑回归中使用sequentialfs来确定要包含的变量。我试图从这里修改答案Sequential feature selection Matlab以使其工作,但句柄部分对我来说很棘手!

我正在使用

[b, dev, stats] = glmfit(X_train,y_train,'binomial','link','logit')

为了适应模型,然后我使用

y_hat = glmval(b,X_test,'logit');

评估模型输出。我试图做一个句柄

 f = @(X_test, y_test)...     
     (sum(y_test ~= round(glmval(b,X_test,'logit'))))

当我使用

时,我只说“输入参数太多”
sequentialfs(f,X,y)

任何人都可以帮助识别相关变量吗?下面是一个数据集,其中所有变量都被认为是相关的,但真正的问题是规模大得多,导致模型的过度参数化。

X =

0,0305780001742986  0,0293310740486058  0,0289653631914407  0,0313646568650811  0,0308948854477814  0,0298740323895053
0,0221062699789144  0,0213746063391538  0,0196872068542263  0,0209915418572080  0,0206064713419377  0,0198587113064423
0,0275588428138312  0,0273957214651399  0,0291622596392042  0,0313729847567230  0,0314439993783026  0,0307137185244424
0,0262451954064372  0,0230629198767100  0,0251192876802874  0,0243459679829053  0,0235752627390268  0,0245208219450122
0,0232074343987232  0,0272778269415268  0,0288725913067116  0,0274565324127577  0,0283032894902223  0,0287391056368953
0,0237589488887855  0,0251929947662669  0,0209989755767701  0,0146662148369109  0,0193830305676060  0,0198900627308170
0,0275142606053146  0,0311683593689258  0,0287109246912083  0,0307544961383919  0,0293964246310913  0,0291758079280418
0,0284337063240141  0,0249820611584738  0,0261664330153102  0,0270312804219022  0,0269178494606530  0,0273467522864029
0,0279150521116060  0,0314021886143824  0,0291020356476994  0,0278247389567505  0,0294200854382611  0,0306460336509255
0,0270622115094110  0,0317795784913586  0,0278283619288299  0,0307757941373800  0,0292513615541838  0,0283900407512898
0,0270275432108930  0,0330384417745352  0,0323886885104962  0,0330255939800101  0,0329789138848656  0,0333091935226094
0,0263417729025468  0,0243442097895390  0,0253328659546050  0,0270828343149025  0,0262845355278762  0,0257915212526289
0,0247503544929709  0,0282150822748136  0,0282408722769508  0,0306907484707723  0,0284025718962319  0,0280291257508206
0,0282116130443164  0,0259317921438547  0,0316179116969559  0,0300579055064814  0,0315134680888256  0,0299693403497154
0,0221040769734790  0,0232354360252008  0,0231588261739581  0,0240414200785524  0,0209509517094598  0,0223174875964419
0,0264965936690525  0,0312918915850473  0,0297480867085914  0,0349060220702562  0,0307640365732823  0,0299291946182921
0,0283027112468824  0,0288419304885060  0,0275801208398665  0,0239401671924088  0,0263296648119700  0,0260497226349653
0,0298063469363023  0,0253535298515575  0,0245113899712628  0,0158158669753461  0,0228044538675689  0,0221885556611738
0,0276409442724517  0,0283430130710139  0,0303893043659674  0,0314511518633802  0,0315673022208602  0,0302375851656905
0,0270849987059202  0,0312381323489334  0,0301662309393833  0,0290482017036615  0,0299207348490636  0,0295746114571195
0,0225683074444599  0,0297455473987182  0,0241145950178924  0,0233857691372279  0,0259911200866772  0,0248345888658664
0,0267870191916224  0,0254332496269710  0,0270915983261551  0,0263567311441536  0,0267470932454238  0,0279742674970829
0,0271933786309775  0,0274722435013798  0,0249484244285920  0,0301299698898670  0,0255527349811283  0,0263901147510067
0,0262114755708772  0,0168593285634855  0,0205147916736994  0,0227484518393022  0,0187327306255277  0,0197581601499656
0,0314796048983783  0,0281771847088388  0,0318159664952504  0,0325586660052902  0,0315277330661507  0,0324593871738733
0,0265694239044569  0,0239306067986609  0,0263341531447523  0,0277011505766640  0,0274385429019891  0,0258861916796922
0,0248731179403750  0,0253801474063385  0,0258606627949811  0,0234446644496543  0,0262626821946271  0,0265908368467206
0,0268335079060221  0,0327877888534457  0,0292050848084788  0,0286811931594028  0,0288058286572012  0,0297311873407772
0,0289655102183149  0,0297912585631799  0,0289955796469846  0,0301374575223736  0,0286017508461882  0,0294957275181626
0,0291599221376467  0,0284752300175276  0,0294302899166185  0,0291600417637315  0,0304544724881292  0,0299842921064845
0,0306574107981617  0,0282562949634004  0,0290757741762068  0,0266759231631069  0,0276079132984815  0,0283490628634946
0,0251419690541645  0,0190208495552799  0,0219740565645893  0,0229700198654972  0,0231913971059666  0,0218104715761714
0,0279646047804379  0,0213712975401601  0,0266486742241442  0,0282351537040943  0,0256010069497723  0,0254151479565295
0,0291819765619095  0,0274841050997730  0,0277287252877124  0,0253910521460239  0,0270103968729900  0,0280719282161061
0,0267034888169756  0,0230641558482702  0,0254891453796317  0,0246876229024146  0,0232209026694445  0,0255548967304529
0,0282525579813869  0,0275995431014968  0,0263616638576222  0,0282844384170093  0,0262147272435204  0,0257109782177451
0,0293098464976821  0,0323503780295293  0,0266630772869637  0,0228075737924046  0,0263296732877124  0,0254313353506367

Y =

1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

1 个答案:

答案 0 :(得分:1)

您用于sequentialfs的函数应该包含四个变量。你的只接受两个:

criterion = fun(XTRAIN,ytrain,XTEST,ytest)

这是因为,即使您只提供两个变量X和y,sequentialfs也会将这些变量分成训练和测试子集(直接来自文档):

  

从空功能集开始,sequentialfs创建候选   通过顺序添加尚未添加的每个功能来设置子集   选择。对于每个候选特征子集,sequentialfs执行   通过反复调用不同的乐趣进行10倍交叉验证   训练X和y,XTRAIN和ytrain的子集,以及测试X的子集   和y,XTEST和ytest

因此,为sequentialfs传递的函数必须同时采用训练和测试子集,例如:

function criterion = my_function(X_train,y_train,X_test,y_test)

    [b, dev, stats] = glmfit(X_train,y_train,'binomial','link','logit')
    y_hat = glmval(b,X_test,'logit');
    criterion = sum(y_test ~= round(y_hat));

end

如果此功能在您的路径中,您可以将其作为@my_function传递,您不必使用匿名函数来获取句柄。