2015-05-26 26 views
0

我想在邏輯迴歸中使用sequentialfs以確定要包含的變量。我試圖修改從這裏Sequential feature selection Matlab的答案,以使其工作,但處理部分對我來說很棘手!在MATLAB中使用sequentialfs失敗?

以擬合模型,我使用

[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,8930 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

您使用sequentialfs功能應在四個變量。你只能接受兩個:

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

這是因爲,即使你只給兩個變量X和Y,sequentialfs拆分到這些訓練和測試集(直接從文檔):

從空白特徵集開始,sequentialfs通過順序添加所選特徵中尚未選定的所有特徵來創建候選特徵子集 。對於每個候選特徵的子集,sequentialfs通過反覆調用樂趣X和Y,XTRAIN和ytrain的不同 訓練子集,並且X 和y,XTEST的測試子集和ytest

執行 10倍交叉驗證

所以通過了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,你不必做一個匿名函數得到一個句柄。

+0

謝謝!還要注意它不一定是一個匿名函數! –