update.概要データ解析くらぶ第一回に向けて準備してたら抽選で落ちてしまったので用意してた内容を記事にしてみました。learningを用いるそうです。Generalization[3]を実装して、その効果を試してみます。allこれは機械学習を少しかじったことがある人なら誰でもやったことがあるかと思います。精度が高いモデルを採用するという方法です。複数の分類器の結果を平均する簡単だけど効果が高い方法です。Kaggleのあるcompetitionの上位15人のユーザーの予測結果を平均するだけで、1位のスコアを遥かに上回る結果を得られることもあります[1]。相加平均だけでなく相乗平均や重み付き平均を使う場合もあるようです[1]。Generalizationの特別な場合となっています。下位の複数の分類器のout-of-the-fold(後述)データの予測結果を、再び上位の分類器に学習データとして与えるもので、これにより下位の分類器の汎化誤差を抑え、分類器同士で弱点を補完しあうような作用を生むことができます。基本的に、データは図の下から上に流れます。学習をすることができます。以降は主にその設計についての説明になります。図のように、train_dataとして学習データ(入力データ+教師ラベル)とtest_dataとして予測するべきデータ(入力データのみ)が与えられているとします。Generalizationのために、まずはtrain_dataを幾つかのfoldに分けます(図は3個)。これらのfoldはtrain_data全体をカバーしていて、尚且つダブっていない必要があります。0でout-of-the-foldデータを予測します。ここではtrain_dataしか使いませんが、学習に使っているデータ外のデータ(out-of-the-fold)を予測している点がポイントで、これによって汎化能力を加味したデータを出力することになります。この処理をそれぞれの分類器で実施し、結果を列方向につなげます。dataの予測結果を出力します。1の予測のための入力として使います。前項と同様に、分類器毎の結果を列方向につなげます。dataの予測結果」を入力として最終的な予測結果とします。分類器の汎化誤差があれば、その誤差を少なくするような学習をすることができ、精度向上につながるというわけです。Generalizationの特別なケースであると見ることができます。実装dustinstansburyさんとnamakemonoさんのリポジトリを参考にさせていただきました。Generalizer抽象クラス元論文[3]に従って、これまで「分類器」と呼んできたモデルはGeneralizerの具象クラスとして扱います(なぜGeneralizerというかは[3]参照)。必要な機能はtrain、predictです。Regressionを使うのでそれぞれwrapしておきます。return(self.model.predict_proba(data))学習データの分割sklearn.cross_validation.StratifiedKFoldがその実装の一つでしょう。ただのKFoldだと、教師ラベルに偏りがでてしまうのでStratifiedKFoldの方が有利です[1]。:])各generalizer毎に上のメソッドを適用します。StratifiedKFoldによってデータの行の順序が変わってしまっているので最後に並べなおします。return(generalizer.predict(self.test_data))これは何も捻りはなく、そのまま。return(generalizer.predict(test_data))上のメソッドをこんな感じで呼び出します。numpy.hstack(layer0_whole_guess))全コードgithubに載せておきました。0.39416表のように、単純な2個のモデルを組み合わせるだけで高い精度を得られました。数十個、数百個の分類器を用いるようです[1][4]。黒魔術のパラドックスアルゴリズムを考える立場の人たちの間では、任意性が低く一意的な誰でも使うことができる手法がいいものであるという前提があるような気がします。art")的な側面が強いかと思います。Kaggleのようなコンペティションで黒魔術がよく使われるかというと、一意的なアルゴリズムでは他の参加者と差別化が難しく、黒魔術を使っても手間をかけてチューニングをすれば高スコアを出すことができるからでしょう。入門で勉強するアルゴリズム表の「画期的な何か」が提案されたらKaggleのようなコンペティションもあまり面白くなくなるのか、それとも必ず黒魔術でスコアを高める余地は残るのか・・・。upLoginユーザーは見つかりませんでした。