有益な特城の遞択に関する方法論的泚蚘特城遞択

みなさんこんにちは

私の名前はアレクセむ・バヌナコフです。 私はAlign Technologyのデヌタサむ゚ンティストです。 この蚘事では、デヌタ分析の実隓䞭に実践する機胜遞択のアプロヌチに぀いお説明したす。

圓瀟では、統蚈孊者ず機械孊習゚ンゞニアが、患者の治療に関連する倧量の臚床情報を分析しおいたす。 䞀蚀で蚀えば、この蚘事の意味は、私たちが利甚できるノむズの倚い冗長なギガバむトのデヌタのごく䞀郚に含たれる貎重な知識を抜出するこずに絞るこずができたす。

この蚘事は、デヌタセットの䟝存関係を芋぀けるこずに関心のある統蚈孊者、機械孊習゚ンゞニア、および専門家を察象ずしおいたす。 たた、この蚘事に蚘茉されおいる資料は、デヌタマむニングに無関心でない幅広い読者にずっお興味深いものです。 この資料では、フィヌチャ゚ンゞニアリングの問題、特に䞻芁コンポヌネントの分析などの方法の適甚に぀いおは取り䞊げたせん。

画像
出所



倚数の入力倉数を持぀セットには冗長な情報が含たれ、モデルに正則化機胜が組み蟌たれおいない堎合、機械孊習モデルの再トレヌニングに぀ながる可胜性があるこずが確立されおいたす。 有益な特城以降IPR を遞択する段階は、実隓䞭のデヌタの前凊理で必芁なステップであるこずがよくありたす。



蚘事で行われた実隓は、特定の方法の最適性に察する分析的正圓化が䞎えられないずいう事実のために科孊的であるふりをせず、読者はより詳现で数孊的に正確なプレれンテヌションのために情報源を参照したす。 さらに、免責事項は、特定のメ゜ッドの倀が他のデヌタで倉わるため、タスク党䜓が知的に魅力的であるずいう事実に基づいおいたす。

蚘事の最埌に、実隓結果がたずめられ、Gitの完党なRコヌドぞのリンクが䜜成されたす。

出版前にこの資料を読んでくれたすべおの人々、特にVlad ShcherbininずAlexey Seleznevに感謝したす。

1有益な機胜を遞択する方法ず方法。


Wikiに連絡しお、IPRメ゜ッドを分類する䞀般的なアプロヌチを芋おみたしょう。

有益な機胜を遞択するためのアルゎリズムは、ラッパヌラッピング、フィルタヌフィルタリング、および組み蟌み組み蟌みマシンのグルヌプで衚すこずができたす。 ロシア語圏のコミュニティに察する音の曖昧さを考慮しお、これらの甚語を正確な翻蚳なしで残したす-私のコメント。

ラッピングアルゎリズムは、可胜な入力倉数の空間での怜玢を䜿甚しおサブセットを䜜成し、利甚可胜なデヌタで完党なモデルをトレヌニングするこずにより、入力の結果のサブセットを評䟡したす。 ラッピングアルゎリズムは非垞に高䟡であり、モデルを再トレヌニングするリスクがありたす。 怜蚌サンプリングが䜿甚されおいない堎合-私のコメント。

フィルタリングアルゎリズムは、入力デヌタのサブセットも怜玢するずいう点でラッピングアルゎリズムず䌌おいたすが、完党なモデルを起動する代わりに、より単玔なフィルタリングアルゎリズムを䜿甚しお出力倉数のサブセットの重芁性を掚定したす。

マシンに組み蟌たれたアルゎリズムは、トレヌニングで事前定矩されたヒュヌリスティックの助けを借りお、入力機胜の重芁性を評䟡したす。


出所

䟋。

IPRラッピングアルゎリズムは、遞択されたデヌタで入力倉数のサブセットを怜玢し、その埌のトレヌニングランダムフォレストなどを実行したり、亀差怜蚌でその゚ラヌを評䟡したりするなど、メ゜ッドの組み合わせず呌ぶこずができたす。 ぀たり、反埩ごずにマシン党䜓をトレヌニングしたすすでに実際に䜿甚できる状態になっおいたす。

IPRのフィルタリングアルゎリズムは入力倉数の列挙ず呌ばれ、遞択された倉数ず出力の間の関係の統蚈的怜定によっお補完されたす。 入力ず出力がカテゎリカルである堎合、入力たたは入力の組み合わせセットず出力ずの間の独立性に぀いおカむ二乗怜定を実行しお、p倀、および結果ずしお、遞択された属性セットの重芁性たたは重芁性に関するバむナリ結論を行うこずができたす。 フィルタリングアルゎリズムの他の䟋は次のずおりです。

組み蟌みのIPRアルゎリズムは、たずえば、線圢回垰係数に察応するp倀です。 この堎合、p倀により、係数ずれロの有意差に぀いおバむナリの結論を出すこずもできたす。 モデルのすべおの入力をスケヌリングするず、重みのモゞュヌルは重芁性の指暙ずしお解釈できたす。 R ^ 2モデルを䜿甚するこずもできたす。これは、シミュレヌトされた倀でプロセスの分散を説明する尺床です。 別の䟋は、ランダムフォレストに組み蟌たれた入力倉数の重芁性を評䟡する関数です。 さらに、人工ニュヌラルネットワヌクの入力に察応する重みのモゞュヌルを䜿甚できたす。 このリストはこれで終わりではありたせん。

この段階では、この区別が実際にIPRのフィットネス関数の違い、぀たり、解決されおいる問題に関する入力フィヌチャの芋぀かったサブセットの関連性の尺床を瀺すこずを理解するこずが重芁です。 その埌、フィットネス関数を遞択する問題に戻りたす。

IPRメ゜ッドのメむングルヌプに少し焊点を合わせたので、入力倉数のサブセットを正確に列挙するためにどのメ゜ッドが䜿甚されるかに泚意を払うこずを提案したす。 wikiペヌゞに戻りたしょう。

スクリヌニングのアプロヌチは次のずおりです。
  • 完党怜玢
  • 最初の最高の候補者
  • シミュレヌテッドアニヌリング
  • 遺䌝的アルゎリズム
  • 包含の貪欲な怜玢
  • 貪欲な䟋倖怜玢
  • 粒子矀最適化
  • タヌゲットを絞った投圱远跡
  • 散垃怜玢
  • 可倉近傍怜玢


出所

ロシア語の解釈に粟通しおいないため、䞀郚のアルゎリズムの名前を意図的に翻蚳したせんでした。

出力で次の圢匏の入力むンデックスを衚す敎数のベクトルを取埗するため、予枬子のサブセットを芋぀けるこずは離散タスクです。

入力1 2 3 4 5 6 ... 1000
遞択0 0 1 1 1 0 ... 1

埌でこの機胜に戻り、実際にどこに぀ながるかを説明したす。

実隓党䜓の結果は、入力フィヌチャのサブセットの怜玢の構成方法に倧きく䟝存したす。 これらのアプロヌチの䞻な違いを盎感的に理解するために、読者にそれらを貪欲ず非貪欲の2぀のグルヌプに分けるこずをお勧めしたす。

貪欲な怜玢アルゎリズム。


これらは高速であり、倚くのタスクで良い結果をもたらすため、頻繁に䜿甚されたす。 アルゎリズムの欲求は、最終サブセットに入る候補の1぀が遞択たたは陀倖された堎合、その䞭に残る貪欲な包含の堎合か、氞久に存圚しない貪欲な䟋倖の堎合ずいう事実にありたす。 したがっお、候補Aが初期の反埩で遞択された堎合、埌の反埩でサブセットは垞に圌ず他の候補を含み、Aずずもに出力倉数のサブセットの重芁性のメトリックの改善を瀺したす。 反察の状況は陀倖です候補Aが陀倖された埌、重芁床枬定基準ぞの圱響が最も少ないか改善されたために削陀された堎合、研究者は重芁床枬定基準に関する情報を受信したせん。サブセットにはAず他の候補が埌で陀倖されたす。

倚次元空間で最倧倀最小倀の怜玢ず䞊行しお描画するず、貪欲アルゎリズムは局所的な最小倀ある堎合でスタックするか、単䞀の最小倀がある堎合グロヌバルに最適な゜リュヌションをすばやく芋぀けたす。

䞀方、すべおの貪欲なオプションの列挙は比范的高速であり、入力間の盞互䜜甚を考慮するこずができたす。

貪欲なアルゎリズムの䟋には、前方遞択、前方ぞのステップ、埌方ぞの陀去、埌方ぞのステップが含たれたす。 リストはこれに限定されたせん。

䞍芁な怜玢アルゎリズム。


非貪欲アルゎリズムの動䜜原理は、局所的最小倀を回避するために、完党にたたは郚分的に圢成された機胜のサブセット、サブセット間の組み合わせを砎棄し、サブセットにランダムな倉曎を加える機胜を意味したす。

倚次元空間でのフィットネス関数の最倧倀最小倀の怜玢ずの類䌌性を匕き出すず、非欲匵りアルゎリズムはより倚くの隣接ポむントを考慮し、ランダムな領域に倧きなゞャンプを行うこずさえできたす。

これらのタむプのアルゎリズムの䜜業をグラフィカルに衚瀺できたす。

最初の貪欲な包含


貪欲でない-確率的-怜玢


どちらの堎合も、むンデックスがグラフの軞に沿っおプロットされる2぀の入力の最適な組み合わせを1぀遞択する必芁がありたす。 貪欲なアルゎリズムは、最適な入力を1぀遞択し、むンデックスを氎平に䞊べ替えるこずから始たりたす。 そしお、遞択された入力に2番目の入力を远加しお、それらの合蚈関連性が最倧になるようにしたす。 しかし、考えられるすべおの組み合わせのうち、郚品の1/37のみを完党に通過するこずがわかりたす。 別の次元を远加するず、枡されるセルの数はさらに小さくなりたす玄1/37 ^ 2。

同時に、貪欲なアルゎリズムが芋぀けた最適な組み合わせではない堎合、実甚的な状況が可胜です。 これは、2぀の入力のそれぞれが個別にタスクに最適な関連性を瀺さない堎合および最初のステップで遞択されおいない堎合に発生する可胜性がありたす。

倱敗したアルゎリズムはもっず長く芋えたす

O= 2 ^ n


さらに可胜な入力の組み合わせを確認したす。 しかし、圌は、問題に察するすべおの倉曎を䞀気に怜玢するこずで、おそらく、さらに優れた入力のサブセットを芋぀ける機䌚がありたす。

貪欲/非欲匵りの確立された二分法を超える怜玢アルゎリズムがありたす。

このような個別の怜玢の䟋ずしおは、入力を個別に個別に゜ヌトし、出力倉数に察する個々の重芁性を評䟡するこずです。 ちなみに、最初の波は、倉数の貪欲な包含のためのアルゎリズムで始たりたす。 しかし、非垞に高速であるこずを陀いお、この゜ヌトで䜕が良いのでしょうか 各入力倉数は「真空䞭」に存圚し始めたす。぀たり、遞択した入力ず出力の間の接続に察する他の入力の圱響を考慮したせん。 同時に、アルゎリズムの完了埌、出力に察する個々の重芁性を瀺す入力の結果リストは、各予枬子の個々の重芁性に関する情報のみを提䟛したす。 このリストに埓っお、特定の数の最も重芁な予枬子を組み合わせるず、いく぀かの問題が発生する可胜性がありたす。



ご芧のずおり、問題はささいなものではありたせん。

IPR問題の䞻な問題は、サブセット怜玢法ずフィットネス関数の最適な組み合わせずしお定匏化されたす。

この声明をさらに詳しく考えおみたしょう。 IPR問題は、2぀の仮説で説明できたす。

a゚ラヌの衚面は単玔たたは耇雑です。
bデヌタに単玔な䟝存関係たたは耇雑な䟝存関係がある。

これらの質問に察する答えに応じお、怜玢方法ず遞択した機胜の関連性を刀断する方法の特定の組み合わせを遞択する必芁がありたす。

衚面゚ラヌ。

単玔な衚面の䟋
画像

出所

ここでは、2぀の入力の組み合わせを遞択し、出力ずの関連性を刀断しお、募配の方向に滑らかな衚面を䞋っお行き、ほが確実に最適なポむントに到達したす。

耇雑な衚面の䟋
画像

出所

この堎合、同じ問題を解くず、倚くの局所的最小倀に遭遇し、そこから貪欲なアルゎリズムが抜け出せなくなりたす。 同時に、確率的怜玢を䜿甚するアルゎリズムでは、より正確な解を芋぀ける可胜性が高くなりたす。

先ほど、予枬子のサブセットを芋぀けるこずは個別のタスクであるず述べたした。 入力ぞの出力の䟝存性に盞互䜜甚が含たれる堎合、空間内のある点から次の点ぞの遷移䞭に、フィットネス関数の倀の急激なゞャンプを芳察できたす。 私たちの堎合の゚ラヌ衚面は、倚くの堎合、滑らかではなく、埮分䞍可胜です。
画像

これは、2぀の入力のサブセットず、出力倉数のサブセットの関連性関数の察応する倀を芋぀ける䟋です。 衚面は滑らかではなく、ピヌクがあり、ほが同じ倀の凹凞のあるプラトヌも含たれおいるこずがわかりたす。 欲匵り募配降䞋法の悪倢。

䟝存関係。

問題の枬定数の増加に䌎い、出力倉数の䟝存性が非垞に耇雑な構造を持ち、倚くの入力を䌎うずいう理論䞊の可胜性が増加したす。 さらに、䟝存関係は線圢ず非線圢の䞡方になりたす。 䟝存関係が予枬子ず非線圢圢匏の盞互䜜甚を意味する堎合、たずえば、ランダムフォレストトレヌニングたたはニュヌラルネットワヌクを䜿甚しお、これらの䞡方のポむントのみを考慮しおそれを芋぀けるこずができたす。 䟝存関係が単玔で線圢である堎合、すべおの予枬倉数のごく䞀郚しか含たれおいないため、それを芋぀けるためのアプロヌチは、結果ずしおIPRに至るたで、モデルの品質を評䟡しお、線圢回垰モデルに1぀たたは耇数の入力を含めるこずに枛らすこずができたす。

単玔な䟝存関係の䟋
画像

この堎合、出力軞に沿った倀のinput1およびinput2の倀ぞの䟝存性は、空間内の平面によっお蚘述されたす。
出力=入力1 * 10 +入力2 * 10

この䟝存関係のモデルは非垞に単玔であり、線圢回垰で近䌌できたす。

耇雑な䟝存関係の䟋
画像

この非線圢䟝存性は、線圢モデルを構築しおも怜出できなくなりたした。 圌女の倖芳は次のずおりです。
出力=入力1 ^ 2 +入力2 ^ 2


問題の次元を考慮するこずも必芁です。

入力倉数の数が倚い堎合、可胜性のあるすべおのサブセットの総数は次の匏で䞎えられるため、確率的方法欲匵りでないによる最適なサブセットの怜玢は非垞に高䟡になる可胜性がありたす
m = 2 ^ n、
ここで、nはすべおの入力フィヌチャの数です。


したがっお、そのような倚様性の最小倀の怜玢は非垞に長くなる可胜性がありたす。 䞀方、貪欲な怜玢を䜿甚するず、たずえそれが局所的な最小倀であり、研究者がそれに぀いお知っおいるずしおも、劥圓な時間で最初の近䌌を行うこずが可胜になりたす。

調査䞭の珟象に関する客芳的な知識がない堎合、入力倉数ず出力の䟝存関係がどれほど耇雑になるか、入力の最適なサブセットを遞択する問題の近䌌たたは正確な解を芋぀けるために最適な入力の数を事前に蚀うこずは䞍可胜です。 たた、IPRの゚ラヌサヌフェスが滑らかで単玔であるか、耇雑で頑䞈であるかを予枬するこずも困難です。

たた、私たちは垞にリ゜ヌスに限りがあり、最適な決定を䞋さなければなりたせん。 IPRぞのアプロヌチを開発する際の小さな助けずしお、次の衚を䜿甚できたす。
画像

したがっお、入力のサブセットずフィットネス関連関数の怜玢方法のいく぀かの組み合わせを考慮する機䌚が垞にありたす。 最も高䟡で、おそらく最も効果的な組み合わせは、貪欲な怜玢ずラッパヌフィットネス関数です。 反埩ごずにトレヌニングされたモデルおよび怜蚌の粟床があるため、遞択した入力の関連性の最も正確な枬定倀を提䟛しながら、ロヌカルミニマムを回避できたす。

最も安䟡ですが、垞に最も効果的ではないアプロヌチは、貪欲な怜玢ずフィルタヌ関数の組み合わせです。これは、統蚈的怜定、盞関係数、たたは盞互情報量です。

さらに、組み蟌みメ゜ッドを䜿甚するず、シミュレヌションの粟床を倧幅に損なうこずなく、モデルのトレヌニング盎埌にアルゎリズムの芳点から䞍芁な倚数の入力を陀倖できたす。

問題をさたざたな方法で解決し、最適なものを遞択するために䜕床か詊しおみるのが良い方法です。

䞀般的に蚀えば、有益な特城の遞択は、倚次元空間での怜玢方法の最適な組み合わせず、出力倉数に関する遞択されたサブセットの関連性に察する最適なフィットネス関数の遞択です。

画像

出所

2合成デヌタに関する有益な特城の遞択に関する実隓。


実隓デヌタセットStanford Bunny
画像

りサギが倧奜きです。

ポむントの高さZ軞の緯床ず経床ぞの䟝存性を調べたす。 同時に、2぀の情報入力XずYの混合にほが察応する分垃を持぀10個のノむズ倉数をセットに远加したすが、倉数Zずは関係ありたせん。

倉数X、Y、Zおよびノむズ倉数の1぀の分垃密床のヒストグラムを芋おみたしょう。
画像

画像

画像

画像

任意のパラメヌタを持぀分垃が芋られたす。 さらに、すべおのノむズ倉数は、特定の範囲の倀に小さなピヌクがあるように分垃しおいたす。

さらに、デヌタセットは、トレヌニングず怜蚌の2぀の郚分にランダムに分割されたす。

デヌタ準備。

コヌド
library(onion) data(bunny) #XYZ point plot open3d() points3d(bunny, col=8, size=0.1) bunny_dat <- as.data.frame(bunny) inputs <- append(as.numeric(bunny_dat$x), as.numeric(bunny_dat$y)) for (i in 1:10){ naming <- paste('input_noise_', i, sep = '') bunny_dat[, eval(naming)] <- inputs[sample(length(inputs), nrow(bunny_dat), replace = T)] } 



実隓1重芁床を評䟡する線圢関数を䜿甚した入力のサブセットの貪欲怜玢フィットネス関数ずしお、怜蚌サンプルでトレヌニング枈みモデルの決定係数を掚定するラッパヌオプションを䜿甚したす

コヌド
 ### greedy search with filter function library(FSelector) sampleA <- bunny_dat[sample(nrow(bunny_dat), nrow(bunny_dat) / 2, replace = F), c("x", "y", "input_noise_1", "input_noise_2", "input_noise_3", "input_noise_4", "input_noise_5", "input_noise_6", "input_noise_7", "input_noise_8", "input_noise_9", "input_noise_10", "z")] sampleB <- bunny_dat[!row.names(bunny_dat) %in% rownames(sampleA), c("x", "y", "input_noise_1", "input_noise_2", "input_noise_3", "input_noise_4", "input_noise_5", "input_noise_6", "input_noise_7", "input_noise_8", "input_noise_9", "input_noise_10", "z")] linear_fit <- function(subset){ dat <- sampleA[, c(subset, "z")] lm_m <- lm(formula = z ~., data = dat, model = T) lm_predict <- predict(lm_m, newdata = sampleB) r_sq_validate <- 1 - sum((sampleB$z - lm_predict) ^ 2) / sum((sampleB$z - mean(sampleB$z)) ^ 2) print(subset) print(r_sq_validate) return(r_sq_validate) } #subset <- backward.search(attributes = names(sampleA)[1:(ncol(sampleA) - 1)], eval.fun = linear_fit) subset <- forward.search(attributes = names(sampleA)[1:(ncol(sampleA) - 1)], eval.fun = linear_fit) 



結果

 > subset <b>[1] "x" "y" "input_noise_2" "input_noise_5" "input_noise_6" "input_noise_8" "input_noise_9"</b> 


ノむズ倉数であるこずが刀明したした。

蚓緎されたモデルを芋おみたしょう

 > summary(lm_m) Call: lm(formula = z ~ ., data = dat, model = T) Residuals: Min 1Q Median 3Q Max -0.060613 -0.022650 -0.000173 0.024939 0.048544 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 0.0232453 0.0005581 41.651 < 2e-16 *** <b>x -0.0257686 0.0052998 -4.862 1.17e-06 *** y -0.1572786 0.0052585 -29.910 < 2e-16 ***</b> input_noise_2 -0.0017249 0.0027680 -0.623 0.533 input_noise_5 -0.0027391 0.0027848 -0.984 0.325 input_noise_6 0.0032417 0.0027907 1.162 0.245 input_noise_8 0.0044998 0.0027723 1.623 0.105 input_noise_9 0.0006839 0.0027808 0.246 0.806 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 0.02742 on 17965 degrees of freedom Multiple R-squared: 0.04937, Adjusted R-squared: 0.049 F-statistic: 133.3 on 7 and 17965 DF, p-value: < 2.2e-16 


実際には、元の入力ず方皋匏の自由項のみが統蚈的有意性を受け入れおいるこずがわかりたす。

次に、貪欲な倉数の陀倖を行いたす。

コヌド
 subset <- backward.search(attributes = names(sampleA)[1:(ncol(sampleA) - 1)], eval.fun = linear_fit) #subset <- forward.search(attributes = names(sampleA)[1:(ncol(sampleA) - 1)], eval.fun = linear_fit) 



結果
 > subset <b>[1] "x" "y" "input_noise_2" "input_noise_5" "input_noise_6" "input_noise_8" "input_noise_9"</b> 


モデルにはノむズも含たれおいたした。

蚓緎されたモデルを芋おみたしょう

 > summary(lm_m) Call: lm(formula = z ~ ., data = dat, model = T) Residuals: Min 1Q Median 3Q Max -0.060613 -0.022650 -0.000173 0.024939 0.048544 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 0.0232453 0.0005581 41.651 < 2e-16 *** <b>x -0.0257686 0.0052998 -4.862 1.17e-06 *** y -0.1572786 0.0052585 -29.910 < 2e-16 ***</b> input_noise_2 -0.0017249 0.0027680 -0.623 0.533 input_noise_5 -0.0027391 0.0027848 -0.984 0.325 input_noise_6 0.0032417 0.0027907 1.162 0.245 input_noise_8 0.0044998 0.0027723 1.623 0.105 input_noise_9 0.0006839 0.0027808 0.246 0.806 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 0.02742 on 17965 degrees of freedom Multiple R-squared: 0.04937, Adjusted R-squared: 0.049 F-statistic: 133.3 on 7 and 17965 DF, p-value: < 2.2e-16 


同様に、モデル内では元の入力のみが重芁であるこずがわかりたす。

倉数XおよびYのみでモデルをトレヌニングするず、次のようになりたす。

 > print(subset) <b>[1] "x" "y"</b> > print(r_sq_validate) <b>[1] 0.05185492</b> > summary(lm_m) Call: lm(formula = z ~ ., data = dat, model = T) Residuals: Min 1Q Median 3Q Max -0.059884 -0.022653 -0.000209 0.024955 0.048238 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 0.0233808 0.0005129 45.590 < 2e-16 *** <b>x -0.0257813 0.0052995 -4.865 1.15e-06 *** y -0.1573098 0.0052576 -29.920 < 2e-16 ***</b> --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 0.02742 on 17970 degrees of freedom Multiple R-squared: 0.04908, Adjusted R-squared: 0.04898 F-statistic: 463.8 on 2 and 17970 DF, p-value: < 2.2e-16 


事実、怜蚌では、ノむズ倉数をオフにしたずきのR ^ 2が高くなりたした。

奇劙な結果 おそらく、デヌタ構造により、ノむズはモデルに悪圱響を䞎えたせん。

しかし、予枬倉数の盞互䜜甚を考慮に入れようずはただしおいたせん。

コヌド
 lm_m <- lm(formula = z ~ x * y, data = dat, model = T) 



それはかなりうたくいった

 > summary(lm_m) Call: lm(formula = z ~ x * y, data = dat, model = T) Residuals: Min 1Q Median 3Q Max -0.057761 -0.023067 -0.000119 0.024762 0.049747 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 0.0196766 0.0006545 30.062 <2e-16 *** x -0.1513484 0.0148113 -10.218 <2e-16 *** y -0.1084295 0.0075183 -14.422 <2e-16 *** x:y 1.3771299 0.1517363 9.076 <2e-16 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 0.02736 on 17969 degrees of freedom Multiple R-squared: 0.05342, Adjusted R-squared: 0.05327 F-statistic: 338.1 on 3 and 17969 DF, p-value: < 2.2e-16 


XずYの盞互䜜甚は重芁です。 怜蚌に関するR ^ 2はどうですか

 > lm_predict <- predict(lm_m, + newdata = sampleB) > 1 - sum((sampleB$z - lm_predict) ^ 2) / sum((sampleB$z - mean(sampleB$z)) ^ 2) <b>[1] 0.05464066</b> 


これは私たちが芋た䞭で最高の倀です。 残念ながら、それはフィットネス関数に芏定されおいない盞互䜜甚オプションであり、この入力の組み合わせを逃したした。

実隓2重芁床を評䟡する線圢関数を䜿甚した入力のサブセットの貪欲怜玢埋め蟌みオプションはフィットネス関数ずしお䜿甚されたす-トレヌニングサンプルのトレヌニングモデルのf統蚈量。

コヌド
 linear_fit_f <- function(subset){ dat <- sampleA[, c(subset, "z")] lm_m <- lm(formula = z ~., data = dat, model = T) print(subset) print(summary(lm_m)$fstatistic[[1]]) return(summary(lm_m)$fstatistic[[1]]) } #subset <- backward.search(attributes = names(sampleA)[1:(ncol(sampleA) - 1)], eval.fun = linear_fit_f) subset <- forward.search(attributes = names(sampleA)[1:(ncol(sampleA) - 1)], eval.fun = linear_fit_f) 



倉数の順次包含の結果は、1぀の予枬子Yのみです。そのため、F統蚈は最倧化されたした。 ぀たり、この倉数は非垞に重芁です。 しかし、䜕らかの理由で倉数Xは忘れられおいたす。

そしお、倉数の順次陀倖。

結果は同様です-1぀の倉数のみがYです。

F-Statistic倚倉数モデルを最倧化するず、すべおのノむズがオヌバヌボヌドであり、モデルがロバストであるこずが刀明したした。怜蚌の決定係数は、実隓番号1の最良のモデルずほが同じです。

 > r_sq_validate <b>[1] 0.05034534</b> 


実隓3ピア゜ン盞関係数を䜿甚しお予枬倉数の個々の有意性を亀互に評䟡したすこのオプションは最も単玔で、盞互䜜甚を考慮せず、フィットネス関数も単玔です-線圢関係のみを評䟡したす。

コヌド
 correlation_arr <- data.frame() for (i in 1:12){ correlation_arr[i, 1] <- colnames(sampleA)[i] correlation_arr[i, 2] <- cor(sampleA[, i], sampleA[, 'z']) } 



結果

 > correlation_arr V1 V2 <b>1 x 0.0413782832 2 y -0.2187061876</b> 3 input_noise_1 -0.0097719425 4 input_noise_2 -0.0019297383 5 input_noise_3 0.0002143946 6 input_noise_4 -0.0142325764 7 input_noise_5 -0.0048206943 8 input_noise_6 0.0090877674 9 input_noise_7 -0.0152897433 10 input_noise_8 0.0143477495 11 input_noise_9 0.0027560459 12 input_noise_10 -0.0079526578 


最も高い盞関はZずYの間であり、2番目はXです。ただし、Xの盞関は顕著ではなく、各倉数の盞関係数ずれロの差の有意性の統蚈的怜定が必芁です。

䞀方、実行された3぀の実隓すべおで、予枬子の盞互䜜甚X * Yをたったく考慮したせんでした。 これは、ナニットの有意性の評䟡たたは方皋匏ぞの予枬倉数の線圢包含が明確な答えを䞎えないずいう事実を説明できたす。

そのような実隓者

 > cor(sampleA$x * sampleA$y, sampleA$z) <b>[1] 0.1211382</b> 


XずYの盞互䜜甚がZずかなり匷く盞関しおいるこずを瀺しおいたす。

実隓番号4マシンに組み蟌たれたアルゎリズムによる予枬子の重芁性の評䟡貪欲怜玢の倉圢ずGBMの入力の重芁性の埋め蟌みフィットネス関数。

Gradient Boosted Treesgbmをトレヌニングし、倉数の重芁性を調べたす。 GBMの䜿甚に関する詳现な蚘事 募配ブヌスティングマシン、チュヌトリアル。

倩井から孊習パラメヌタヌを取埗し、非垞に䜎い孊習速床を蚭定しお、匷い再トレヌニングを避けたす。 決定朚は貪欲であり、倚くのモデルを远加しおモデルを改善するこずは、芳枬倀ず入力をサンプリングするこずによっお達成されるこずに泚意しおください。

コヌド
 library(gbm) gbm_dat <- bunny_dat[, c("x", "y", "input_noise_1", "input_noise_2", "input_noise_3", "input_noise_4", "input_noise_5", "input_noise_6", "input_noise_7", "input_noise_8", "input_noise_9", "input_noise_10", "z")] gbm_fit <- gbm(formula = z ~., distribution = "gaussian", data = gbm_dat, n.trees = 500, interaction.depth = 12, n.minobsinnode = 100, shrinkage = 0.0001, bag.fraction = 0.9, train.fraction = 0.7, n.cores = 6) gbm.perf(object = gbm_fit, plot.it = TRUE, oobag.curve = F, overlay = TRUE) summary(gbm_fit) 



結果

 > summary(gbm_fit) var rel.inf <b>yy 69.7919 xx 30.2081</b> input_noise_1 input_noise_1 0.0000 input_noise_2 input_noise_2 0.0000 input_noise_3 input_noise_3 0.0000 input_noise_4 input_noise_4 0.0000 input_noise_5 input_noise_5 0.0000 input_noise_6 input_noise_6 0.0000 input_noise_7 input_noise_7 0.0000 input_noise_8 input_noise_8 0.0000 input_noise_9 input_noise_9 0.0000 input_noise_10 input_noise_10 0.0000 


このアプロヌチはタスクに完党に察応し、非ノむズ入力を匷調し、他のすべおの入力をたったく重芁ではありたせんでした。

さらに、この実隓の蚭定は非垞に高速であり、すべおがほずんどそのたたで機胜するこずに泚意しおください。 最適なトレヌニングパラメヌタヌを取埗するための亀差怜蚌を含む、この実隓のより綿密な蚈画はより耇雑ですが、実皌働環境で実際のモデルを準備するずきにこれを行う必芁がありたす。

実隓番号5重芁床を掚定する線圢関数を䜿甚した確率的怜玢を䜿甚しお予枬倉数の重芁床を掚定したすこれは入力空間での貪欲でない怜玢であり、ラッパヌオプションはフィットネス関数ずしお䜿甚されたす-怜蚌サンプルでトレヌニング枈みモデルの決定係数を掚定したす。

今回、孊習線圢モデルには、予枬子間のペアワむズ盞互䜜甚が含たれたす。

コヌド
 ### simulated annealing search with linear model interactions stats library(scales) library(GenSA) sampleA <- bunny_dat[sample(nrow(bunny_dat), nrow(bunny_dat) / 2, replace = F), c("x", "y", "input_noise_1", "input_noise_2", "input_noise_3", "input_noise_4", "input_noise_5", "input_noise_6", "input_noise_7", "input_noise_8", "input_noise_9", "input_noise_10", "z")] sampleB <- bunny_dat[!row.names(bunny_dat) %in% rownames(sampleA), c("x", "y", "input_noise_1", "input_noise_2", "input_noise_3", "input_noise_4", "input_noise_5", "input_noise_6", "input_noise_7", "input_noise_8", "input_noise_9", "input_noise_10", "z")] #calculate parameters predictor_number <- dim(sampleA)[2] - 1 sample_size <- dim(sampleA)[1] par_v <- runif(predictor_number, min = 0, max = 1) par_low <- rep(0, times = predictor_number) par_upp <- rep(1, times = predictor_number) ############### the fitness function sa_fit_f <- function(par){ indexes <- c(1:predictor_number) for (i in 1:predictor_number){ if (par[i] >= threshold) { indexes[i] <- i } else { indexes[i] <- 0 } } local_predictor_number <- 0 for (i in 1:predictor_number){ if (indexes[i] > 0) { local_predictor_number <- local_predictor_number + 1 } } if (local_predictor_number > 0) { sampleAf <- as.data.frame(sampleA[, c(indexes[], dim(sampleA)[2])]) lm_m <- lm(formula = z ~ .^2, data = sampleAf, model = T) lm_predict <- predict(lm_m, newdata = sampleB) r_sq_validate <- 1 - sum((sampleB$z - lm_predict) ^ 2) / sum((sampleB$z - mean(sampleB$z)) ^ 2) } else { r_sq_validate <- 0 } return(-r_sq_validate) } #stimating threshold for variable inclusion threshold <- 0.5 # do it simply #run feature selection start <- Sys.time() sao <- GenSA(par = par_v, fn = sa_fit_f, lower = par_low, upper = par_upp , control = list( #maxit = 10 max.time = 300 , smooth = F , simple.function = F)) trace_ff <- data.frame(sao$trace)$function.value plot(trace_ff, type = "l") percent(- sao$value) final_vector <- c((sao$par >= threshold), T) names(sampleA)[final_vector] final_sample <- as.data.frame(sampleA[, final_vector]) Sys.time() - start # check model lm_m <- lm(formula = z ~ .^2, data = sampleA[, final_vector], model = T) summary(lm_m) 



どうしたの

 <b>[1] "5.53%"</b> > final_vector <- c((sao$par >= threshold), T) > names(sampleA)[final_vector] <b>[1] "x" "y" "input_noise_7" "input_noise_8" "input_noise_9" "z" </b> > summary(lm_m) Call: lm(formula = z ~ .^2, data = sampleA[, final_vector], model = T) Residuals: Min 1Q Median 3Q Max -0.058691 -0.023202 -0.000276 0.024953 0.050618 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 0.0197777 0.0007776 25.434 <2e-16 *** <b>x -0.1547889 0.0154268 -10.034 <2e-16 *** y -0.1148349 0.0085787 -13.386 <2e-16 ***</b> input_noise_7 -0.0102894 0.0071871 -1.432 0.152 input_noise_8 -0.0013928 0.0071508 -0.195 0.846 input_noise_9 0.0026736 0.0071910 0.372 0.710 <b>x:y 1.3098676 0.1515268 8.644 <2e-16 ***</b> x:input_noise_7 0.0352997 0.0709842 0.497 0.619 x:input_noise_8 0.0653103 0.0714883 0.914 0.361 x:input_noise_9 0.0459939 0.0716704 0.642 0.521 y:input_noise_7 0.0512392 0.0710949 0.721 0.471 y:input_noise_8 0.0563148 0.0707809 0.796 0.426 y:input_noise_9 -0.0085022 0.0710267 -0.120 0.905 input_noise_7:input_noise_8 0.0129156 0.0374855 0.345 0.730 input_noise_7:input_noise_9 0.0519535 0.0376869 1.379 0.168 input_noise_8:input_noise_9 0.0128397 0.0379640 0.338 0.735 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 0.0274 on 17957 degrees of freedom Multiple R-squared: 0.05356, Adjusted R-squared: 0.05277 F-statistic: 67.75 on 15 and 17957 DF, p-value: < 2.2e-16 


芋逃しおいるこずがわかりたす。 ノむズが含たれおいたす。

ご芧のずおり、怜蚌甚の決定係数の最適倀は、ノむズ倉数を含めるこずで達成されたした。 さらに、怜玢アルゎリズムの収束は培底的です
画像

フィットネス関数を倉曎しお、怜玢方法を保存しおみたしょう。

実隓6重芁床を掚定する線圢関数を䜿甚した確率的怜玢を䜿甚しお予枬子の重芁床を評䟡したすこれは入力空間での欲匵りでない怜玢であり、適合床関数はモデル係数に察応するp倀が埋め蟌たれおいたす。

モデルに含たれる係数の平均p倀が最小になるような予枬子のセットを遞択したす。

コヌド
 # fittness based on p-values sa_fit_f2 <- function(par){ indexes <- c(1:predictor_number) for (i in 1:predictor_number){ if (par[i] >= threshold) { indexes[i] <- i } else { indexes[i] <- 0 } } local_predictor_number <- 0 for (i in 1:predictor_number){ if (indexes[i] > 0) { local_predictor_number <- local_predictor_number + 1 } } if (local_predictor_number > 0) { sampleAf <- as.data.frame(sampleA[, c(indexes[], dim(sampleA)[2])]) lm_m <- lm(formula = z ~ .^2, data = sampleAf, model = T) mean_val <- mean(summary(lm_m)$coefficients[, 4]) } else { mean_val <- 1 } return(mean_val) } #stimating threshold for variable inclusion threshold <- 0.5 # do it simply #run feature selection start <- Sys.time() sao <- GenSA(par = par_v, fn = sa_fit_f2, lower = par_low, upper = par_upp , control = list( #maxit = 10 max.time = 60 , smooth = F , simple.function = F)) trace_ff <- data.frame(sao$trace)$function.value plot(trace_ff, type = "l") percent(- sao$value) final_vector <- c((sao$par >= threshold), T) names(sampleA)[final_vector] final_sample <- as.data.frame(sampleA[, final_vector]) Sys.time() - start 



結果

 > percent(- sao$value) <b>[1] "-4.7e-208%"</b> > final_vector <- c((sao$par >= threshold), T) > names(sampleA)[final_vector] <b>[1] "y" "z"</b> 


今回はすべおがうたくいきたした。 元の予枬倀のみが遞択されたした。p倀が非垞に小さいためです。

アルゎリズムの収束は60秒で良奜です
画像

実隓7孊習枈みモデルの品質による重芁床の評䟡を䌎う貪欲怜玢を䜿甚しお予枬子の重芁床を評䟡したすこれは入力空間での貪欲な怜玢であり、適合床関数はラッパヌです。これは、怜蚌モデルでブヌストされた決定朚の決定係数に察応したす。

コヌド
 ### greedy search with wrapper GBM validation fitness library(FSelector) library(gbm) sampleA <- bunny_dat[sample(nrow(bunny_dat), nrow(bunny_dat) / 2, replace = F), c("x", "y", "input_noise_1", "input_noise_2", "input_noise_3", "input_noise_4", "input_noise_5", "input_noise_6", "input_noise_7", "input_noise_8", "input_noise_9", "input_noise_10", "z")] sampleB <- bunny_dat[!row.names(bunny_dat) %in% rownames(sampleA), c("x", "y", "input_noise_1", "input_noise_2", "input_noise_3", "input_noise_4", "input_noise_5", "input_noise_6", "input_noise_7", "input_noise_8", "input_noise_9", "input_noise_10", "z")] gbm_fit <- function(subset){ dat <- sampleA[, c(subset, "z")] gbm_fit <- gbm(formula = z ~., distribution = "gaussian", data = dat, n.trees = 50, interaction.depth = 10, n.minobsinnode = 100, shrinkage = 0.1, bag.fraction = 0.9, train.fraction = 1, n.cores = 7) gbm_predict <- predict(gbm_fit, newdata = sampleB, n.trees = 50) r_sq_validate <- 1 - sum((sampleB$z - gbm_predict) ^ 2) / sum((sampleB$z - mean(sampleB$z)) ^ 2) print(subset) print(r_sq_validate) return(r_sq_validate) } subset <- backward.search(attributes = names(sampleA)[1:(ncol(sampleA) - 1)], eval.fun = gbm_fit) subset <- forward.search(attributes = names(sampleA)[1:(ncol(sampleA) - 1)], eval.fun = gbm_fit) 



予枬子を貪欲に含む結果

 > subset <b>[1] "x" "y"</b> > r_sq_validate <b>[1] 0.2363794</b> 


ポむントを打぀

予枬子の貪欲な陀倖の結果

 > subset <b> [1] "x" "y" "input_noise_1" "input_noise_2" "input_noise_3" "input_noise_4" "input_noise_5" "input_noise_6" "input_noise_7" [10] "input_noise_9" "input_noise_10"</b> > r_sq_validate <b>[1] 0.2266737</b> 


悪化しおいたす。 モデルにノむズ予枬子を含めおも、怜蚌時の予枬の品質は倧幅に䜎䞋したせんでした。 たた、これには説明がありたす。ランダム決定フォレストには正芏化機胜が組み蟌たれおおり、孊習プロセスで非情報入力を無芖できたす。

これで、暙準的な方法を䜿甚しおIPRに関する実隓のセクションを完了したす。 そしお次のセクションでは、統蚈的に信頌でき、その仕事をうたく行っおいる、情報メトリックに基づいた方法の実甚的なアプリケヌションを正圓化しお瀺したす。

3IPRの適応床関数を構築するための情報理論の䜿甚。


このセクションの重芁な質問は、䟝存の抂念をどのように説明し、情報理論的な意味でそれを定匏化するかです。


画像

出所

情報゚ントロピヌの抂念から始める必芁がありたす。 ゚ントロピヌシャノンは䞍確実性の同矩語です。 ランダム倉数の倀に぀いお䞍確実であるほど、゚ントロピヌ情報の別の同矩語がこの倉数の実珟になりたす。 コむンフリップの䟋を考慮するず、他のすべおのコむンオプションの察称コむンは、次のフリップ結果で最倧の䞍確実性があるため、最倧の゚ントロピヌを持ちたす。

シャノン゚ントロピヌの匏

画像

䞭毒ずは䜕ですか


コむンを数回ひっくり返すず仮定したす。 前のスロヌの結果を芋た埌、スロヌの次の結果に関する䞍確実性が枛少したず蚀えたすか

頭を萜ずした埌、2/3の確率でむヌグルず着陞するコむンがあるずしたす。逆に、むヌグルを倱った埌、2/3の確率で着陞したす。 この堎合、ワシおよび尟の損倱の無条件の頻床は50/50のたたです。

そのようなコむンの堎合、ワシの損倱埌、尟の損倱の頻床は1/2でなくなり、その逆も同様です。 そのため、スロヌの次の結果に぀いおの䞍確実性は枛少したした50/50はもはや予想されたせん。

䟝存の珟象を理解するために、確率論では独立性を次のように定矩しおいるこずを思い出しおください。
px、y== px* py

したがっお、むベントの共同実珟の確率は、むベント自䜓の実珟の確率の積に等しくなりたす。

これが芳察される堎合、むベントは数孊的な意味で独立しおいたす。 もし
px、y= px* py

その堎合、むベントは数孊的に独立ではありたせん。

同じ原理が、情報理論における2぀たたはそれ以䞊の確率倉数間の関係を枬定するための公匏の基瀎になっおいたす。

ここでは、䟝存関係は確率的な意味で理解されるこずを匷調したす。 因果関係の分析には、より包括的なレビュヌが必芁です。これには、誀った盞関関係ず冗長性の分析盞互情報の䜿甚によるず、研究察象のオブゞェクトに関する専門知識の魅力の䞡方が含たれたす。

盞互情報

画像

盞互情報ぱントロピヌによっおも導出できたす。

画像

簡単な蚀葉で蚀えば、盞互情報量は、予枬倉数たたは耇数の倉数がある堎合にシステムから出る゚ントロピヌ䞍確実性の量です。 たずえば、ランダム倉数の゚ントロピヌは3ビットです。 盞互情報は2ビットです。 これは、ランダム倉数の実装に関する䞍確実性が2/3たでに予枬子の存圚によっお補償されるこずを意味したす。

盞互情報には、次のプロパティがありたす。



盞互情報は、次のように定匏化された、䟝存の理想的な尺床のいく぀かの芁件を満たしおいたす。

Granger、C、E。Maasoumi e J. Racine、「非線圢プロセスの可胜性がある䟝存メトリック」、Journal of Time Series Analysis 25、2004、649-669。


この枬定を適甚するずきに知っおおくず䟿利な盞互情報のプロパティ VI が1぀ありたす。



぀たり、入力倉数の゚ントロピヌが10ビットで、出力のビット数が3ビットの堎合、入力倉数が出力を送信できる最倧情報は3ビットです。 これは、そのようなシステムで䜿甚できる最倧のVIです。

別のオプションは、入力倉数が3ビットの゚ントロピヌを持ち、出力が10ビットを持぀こずです。 入力が出力に䌝えるこずができる情報の最倧倀は3ビットであり、これはVIの可胜な最倧倀です。

VIの倀を埓属倉数の゚ントロピヌで陀算するず、範囲[0、1]の倀が埗られたす。これは、盞関係数ず同様に、倀のスケヌルを考慮せずに、入力倉数が埓属倉数を決定する方法を瀺したす。

VIを䜿甚するこずが望たしいずいう倚くの議論がありたすが、倚くのトレヌドオフが䌎いたす。



.


, , . , , , .

— (Multiinformation) (Total Correlation).

゜ヌス

:

画像

:

Watanabe S (1960). Information theoretical analysis of multivariate correlation, IBM Journal of Research and Development 4, 66–82


( ) , . , ( 1 n) ( 1 m), . , - .

, .

, , . :

  • 1) . , — , , , — . , , 2. , , .
  • 2) . , , . , , , — .
  • 3) . , .


.

, , :
, . . , . ., , 1973 — 512 .

.. — « ».


, .


, , , , .

, n N.

. , .

100 .
画像

1000 .
画像

, , .

, , . , . .:

1.
2.

, , . . , ( ). , .

, .

. . , , . .

( ), .

. . , , , . , 1 000 51% , - . . .

- .




«» . — , :

optim_var_num < — log(x = sample_size / 100, base = round(mean_levels, 0))


, , , , , n , n 100. , , , .

, , .

, , ( ), :

threshold < — 1 — optim_var_num / predictor_number


, . .

, : , .

17 973 , 12 , 5 . , 3,226.

, 0,731.

?
画像

3 . , 5 ^ 3,226 178 , 100 .

.

№8 , () ( , - — ).

0,9 ( ) 10 -, 1 1 ( ). 10 .

コヌド
 ############## simlated annelaing search with mutual information fitness function library(infotheo) # measured in nats, converted to bits library(scales) library(GenSA) sampleA <- bunny_dat[sample(nrow(bunny_dat), nrow(bunny_dat) / 2, replace = F), c("x", "y", "input_noise_1", "input_noise_2", "input_noise_3", "input_noise_4", "input_noise_5", "input_noise_6", "input_noise_7", "input_noise_8", "input_noise_9", "input_noise_10", "z")] sampleB <- bunny_dat[!row.names(bunny_dat) %in% rownames(sampleA), c("x", "y", "input_noise_1", "input_noise_2", "input_noise_3", "input_noise_4", "input_noise_5", "input_noise_6", "input_noise_7", "input_noise_8", "input_noise_9", "input_noise_10", "z")] # discretize all variables dat <- sampleA disc_levels <- 5 for (i in 1:13){ naming <- paste(names(dat[i]), 'discrete', sep = "_") dat[, eval(naming)] <- discretize(dat[, eval(names(dat[i]))], disc = "equalfreq", nbins = disc_levels)[,1] } sampleA <- dat[, 14:26] #calculate parameters predictor_number <- dim(sampleA)[2] - 1 sample_size <- dim(sampleA)[1] par_v <- runif(predictor_number, min = 0, max = 1) par_low <- rep(0, times = predictor_number) par_upp <- rep(1, times = predictor_number) #load functions to memory shuffle_f_inp <- function(x = data.frame(), iterations_inp, quantile_val_inp){ mutins <- c(1:iterations_inp) for (count in 1:iterations_inp){ xx <- data.frame(1:dim(x)[1]) for (count1 in 1:(dim(x)[2] - 1)){ y <- as.data.frame(x[, count1]) y$count <- sample(1 : dim(x)[1], dim(x)[1], replace = F) y <- y[order(y$count), ] xx <- cbind(xx, y[, 1]) } mutins[count] <- multiinformation(xx[, 2:dim(xx)[2]]) } quantile(mutins, probs = quantile_val_inp) } shuffle_f <- function(x = data.frame(), iterations, quantile_val){ height <- dim(x)[1] mutins <- c(1:iterations) for (count in 1:iterations){ x$count <- sample(1 : height, height, replace = F) y <- as.data.frame(c(x[dim(x)[2] - 1], x[dim(x)[2]])) y <- y[order(y$count), ] x[dim(x)[2]] <- NULL x[dim(x)[2]] <- NULL x$dep <- y[, 1] rm(y) receiver_entropy <- entropy(x[, dim(x)[2]]) received_inf <- mutinformation(x[, 1 : dim(x)[2] - 1], x[, dim(x)[2]]) corr_ff <- received_inf / receiver_entropy mutins[count] <- corr_ff } quantile(mutins, probs = quantile_val) } ############### the fitness function fitness_f <- function(par){ indexes <- c(1:predictor_number) for (i in 1:predictor_number){ if (par[i] >= threshold) { indexes[i] <- i } else { indexes[i] <- 0 } } local_predictor_number <- 0 for (i in 1:predictor_number){ if (indexes[i] > 0) { local_predictor_number <- local_predictor_number + 1 } } if (local_predictor_number > 1) { sampleAf <- as.data.frame(sampleA[, c(indexes[], dim(sampleA)[2])]) pred_entrs <- c(1:local_predictor_number) for (count in 1:local_predictor_number){ pred_entrs[count] <- entropy(sampleAf[count]) } max_pred_ent <- sum(pred_entrs) - max(pred_entrs) pred_multiinf <- multiinformation(sampleAf[, 1:dim(sampleAf)[2] - 1]) pred_multiinf <- pred_multiinf - shuffle_f_inp(sampleAf, iterations_inp, quantile_val_inp) if (pred_multiinf < 0){ pred_multiinf <- 0 } pred_mult_perc <- pred_multiinf / max_pred_ent inf_corr_val <- shuffle_f(sampleAf, iterations, quantile_val) receiver_entropy <- entropy(sampleAf[, dim(sampleAf)[2]]) received_inf <- mutinformation(sampleAf[, 1:local_predictor_number], sampleAf[, dim(sampleAf)[2]]) if (inf_corr_val - (received_inf / receiver_entropy) < 0){ fact_ff <- (inf_corr_val - (received_inf / receiver_entropy)) * (1 - pred_mult_perc) } else { fact_ff <- inf_corr_val - (received_inf / receiver_entropy) } } else if (local_predictor_number == 1) { sampleAf<- as.data.frame(sampleA[, c(indexes[], dim(sampleA)[2])]) inf_corr_val <- shuffle_f(sampleAf, iterations, quantile_val) receiver_entropy <- entropy(sampleAf[, dim(sampleAf)[2]]) received_inf <- mutinformation(sampleAf[, 1:local_predictor_number], sampleAf[, dim(sampleAf)[2]]) fact_ff <- inf_corr_val - (received_inf / receiver_entropy) } else { fact_ff <- 0 } return(fact_ff) } ########## estimating threshold for variable inclusion iterations = 10 quantile_val = 0.9 iterations_inp = 1 quantile_val_inp = 1 levels_arr <- numeric() for (i in 1:predictor_number){ levels_arr[i] <- length(unique(sampleA[, i])) } mean_levels <- mean(levels_arr) optim_var_num <- log(x = sample_size / 100, base = round(mean_levels, 0)) if (optim_var_num / predictor_number < 1){ threshold <- 1 - optim_var_num / predictor_number } else { threshold <- 0.5 } #run feature selection start <- Sys.time() sao <- GenSA(par = par_v, fn = fitness_f, lower = par_low, upper = par_upp , control = list( #maxit = 10 max.time = 300 , smooth = F , simple.function = F)) trace_ff <- data.frame(sao$trace)$function.value plot(trace_ff, type = "l") percent(- sao$value) final_vector <- c((sao$par >= threshold), T) names(sampleA)[final_vector] final_sample <- as.data.frame(sampleA[, final_vector]) Sys.time() - start 



結果

 > percent(- sao$value) <b>[1] "18.1%"</b> > final_vector <- c((sao$par >= threshold), T) > names(sampleA)[final_vector] <b>[1] "x_discrete" "y_discrete" "input_noise_2_discrete" "z_discrete" </b> > final_sample <- as.data.frame(sampleA[, final_vector]) > > Sys.time() - start Time difference of 10.00453 mins 


ほずんど起こった。 . — .

20 , - 1 .

結果

 > percent(- sao$value) <b><b>[1] "18.2%"</b></b> > final_vector <- c((sao$par >= threshold), T) > names(sampleA)[final_vector] <b><b>[1] "x_discrete" "y_discrete" "input_noise_1_discrete" </b>"z_discrete" </b> > final_sample <- as.data.frame(sampleA[, final_vector]) > > Sys.time() - start Time difference of 20.00585 mins 


— .

18% . .

( ):
画像

Minimum-redundancy-maximum-relevance (mRMR)

. :

«Feature selection based on mutual information: criteria of max-dependency, max-relevance, and min-redundancy,»
Hanchuan Peng, Fuhui Long, and Chris Ding
IEEE Transactions on Pattern Analysis and Machine Intelligence,
Vol. 27, No. 8, pp.1226-1238, 2005


, ( ) . .

() , () .

() , , , . , .

() , . , ( ).

, , , , , ( ) , . , mRMR , .

() , — limited sampling bias.

mRMR . , , , , .

.
画像

, , GBM, p-values .

, . , , , . , XY-Noise1 . , ( ), Align Technology. , , , Gradient Boosted Trees ( . ).

, , , . , , , , .

, , . . , , .

. , , , , . , .

github: Git

:

Source: https://habr.com/ru/post/J303750/


All Articles