51facebook0twittertはてぶ0はじめにクリエーションラインの藤田です。今回はSparkを使ってデータ解析を行いました。データサイエンティストのコミュニティであるKaggleで行われている競技に参加しました。Response』です。Kaggleとは今回とりあげたKaggleについて少し説明いたします。Kaggleとは世界中のデータサイエンティスト達が課題解決の最適モデルを競い合うコミュニティサイトです。サイトには様々なコンペティションが用意されており、新しいコンペティションも随時追加されています。コンペティションには色々な種類があり、中には賞金が付いているものもあります。各コンペティションの開催期限は月単位から長いものでは年単位で開催されているものがあります。コンペティションの結果によってランキング付けも行なわれ、NOVICE、KAGGLER、MASTERの順にあがっていきます。コンペティション以外にも自分のスクリプトを公開したり、他のユーザーに質問したり、自分のブログを書くことができる機能もあります。データ解析関係の求人ページもあるので、Kaggleで優秀なスコアを取っていればデータ分析会社に就職できるかもしれません。みなさまのなかでKaggleに興味を持たれた方がいたら、挑戦してみることをお勧めいたします。一部のコンペティションは何回かKaggleの一般コンペティションに参加していないと参加できないものもあります)。Response』に挑戦しました。その内容は金融会社であるSpringleaf社が数多くの個人宛に送る融資やローンについてのダイレクトメールの中で、実際に反応する人を見極めることができるかを、統計的に予測しようというものです。ダイレクトメール全体の中で反応する人が多くなるほど、Springleaf社はダイレクトメールを効率的に活用することができ、コストを削減することが可能です。このコンペティションでは、匿名化が施された顧客データを解析しそれぞれの顧客がダイレクトメールにどのような反応を示すかを予測します。Response』で用意されたデータはどのようなものになっているでしょうか。データの構造を以下の図にしてみました。0データ形式や、どのような種類のデータかわからない列が1934個もあります。列の性格を意識して分類することは不可能である、という状態になっています。データの行数も30万行あり、到底Excelで扱えるようなデータではありません。test.csvに分けられて配布されます(train.csvは”target”カラムに値が入っており、test.csvには値が入っていません)。このデータからユーザーの反応を予想するにはどうすればよいでしょうか。私は統計学やデータ解析には詳しくないのですが、以下のような戦略を立てました。test.csvの各ユーザーのtargetカラム値を予想する。targetカラム値はユーザーの他の特定のカラム値と依存関係がある。仮説よりtest.csvの各ユーザーがtrain.csvの反応の有ったユーザー群とどのくらい似ているかを計算すればよいのではないだろうかと考えた。具体的な手順としてはトレーニングデータを反応のあったグループと無かったグループに分ける。targetの値が0か1かで判断する。類似度の基準となるデータを作る。反応の有ったグループの平均値を出し基準とする。各パラメータの標準化のために分散・標準偏差も求めます。テストデータのユーザデータがどれくらい反応のあったグループに似ているかを調べる。Oceanのクラウド環境を使って分析を行いました。環境は以下の通りです。0.13.9データ解析を始めるそれではデータ解析を始めましょう。今回解析プログラムはSpark+Scalaで作成しました。データ(train.csv)の分割トレーニングデータの分割を行います。「データ構造と解析戦略」で図示したデータ構造の最後のカラム"target”の値がユーザーの反応を表わしています。targetの値が1であれば、そのユーザーはDMに反応をしています。値が0ならば反応をしていません。そこでtargetの値を使い、ユーザーを反応の有無で分割します。計算し、平均の差の割合も求めます(data0は反応の無かったグループ、data1は反応の有ったグループ)。それを各ユーザIDでまとめたRDDを作成します。data1の標準偏差}の要素を持ったRDDが作成されました。テストデータの各ユーザの類似度を調べる。トレーニングデータとテストデータが同じ母集団を持つとして、テストデータのユーザの要素を前述で求めたtrain1の平均と標準偏差で標準化を行う。標準化されたデータは平均が0で標準偏差が1なので、-3~3の間に99.74%のデータが存在することになります。類似度関数は定義域が-3≦x≦3で、x=±3でf(x)≒0、x=0でf(x)=1となるように定義すればよい。することによって1つの要素がどれだけ似ているかがパーセンテージでわかり、それを要素間で掛けあわせれば全体としてどれだけ類似しているかが分かるはずです。上記のような方法で関係が深そうな要素をいろいろ試す。+”\n”)}source.closefile.closediffsortはどの要素の類似度を計算するかを決定しています。この方法はどの要素を使うかが非常に重要になってきます。上記のプログラムではdiffsortで平均差が大きいものを選択して類似度を計算させました。計算結果result.csvの中身は以下のような形式になります。第1カラムがユーザーIDで、第2カラムが予測値になります。~(以下略)~計算結果を投稿してみる計算結果が出来たので、結果をKaggleに投稿してみましょう。投稿はKaggleの挑戦しているコンペティションのページで行なえます。submission”に移動し、提出したいファイルを選択しましょう。投稿するとすぐ答え合わせが自動で開始されます。(30秒くらい)待つと答え合わせが終了し、結果が表示されます。今回挑戦したコンペティションでは、結果は1以下で小数点第5位までの数で表示され、1に近いほど予測の精度が良く、得点が高いです。私の最終的な得点は0.55012でした。順位でいえば2226チーム中の2076位でした。1位のチームの得点は0.80427でした。参加者は自分が作成したscriptを公開して、他の参加者と意見を交換したり、アドバイスを貰ったりすることができ、他の人が公開している情報を見て自分のデータ解析に役立てることが可能です。今回私は平均を求めて関係のありそうなパラメータを調べて類似度として予測を導きましたが、他の参加者にはクラスタリングを行なってパラメータ間の関係を調べたり、匿名化されたデータの元の意味を探っている人もいました。まとめKaggleに挑戦することを決めた当初は入賞して賞金を頂こうと大きく息巻いていましたが、実際に挑戦してみるとデータ解析には様々な知識が必要とされ、あえなく無惨な結果に終わってしまいました。解析を進めるなかで色々と調べたことや、他の参加者のscriptを見たりと多くの得るものがありました。上位陣が公開している情報は初心者である私には難しかったですが、非常に為になるものが多かったです。他の参加者の多くはRやPythonを使用していました。Sparkでデータ解析を行なった感想としましては、RDDの操作に手こずりました。各RDDの行単位での処理が上手く扱えずに苦労して、結局Scalaのリストやファイル操作を使ってしまいました。なんでもかんでもSparkで処理するのではなく、分散処理などのSparkが得意とする分野で使ったりと、組み合わせが大切だと感じました。Sparkについての良い勉強にもなったと思います。LABの情報を逃さずチェックしよう!メールアドレスを登録すると記事が投稿されるとメールで通知します。※登録後メールに記載しているリンクをクリックして認証してください。LABの情報を逃さずチェックしよう!メールアドレスを登録すると記事が投稿されるとメールで通知します。※登録後メールに記載しているリンクをクリックして認証してください。