(追記予定)こんにちわ。高火力コンピューティングの長谷川です。Conpetitionについて、続きってわけでもないのですが、続編をお届けします。同コンペティションを開催したCpawの伊東さんは高火力コンピューティングにチームでアルバイトしてくれていまして、ある日のこと。「え?ウチ使えるよ」ということで、さくらインターネットの西新宿セミナールームで開催することになりました。当日は台風が接近していたこともあり、参加者が少なくなってしまうのではないかと心配したのですが、悪天候のなか歩留まり6割というのは最近の機械学習系のイベントとしては良い意味で裏切られた気持ちでした。サイトから提出します。1ポイントとして加算されます。ポイント獲得できるわけですね。時間ボケっとしているのは、ちょっと暇です。「伊東くん、私にも問題解かせてよ」とお願いして、他の参加者と同じように問題を解いてみることにしました。下記は、実際に問題を解いた手順を再現したものですが、当時書いたコードは既に失ってしまったので、書き直した「再現コード」で解説します。手を出したのは芸能人ブログの分類問題(entertainer_blog)です。皆さんがあらかじめスクレイプ、1記事1テキストファイルに変換されたものです。ブログエントリの教師データを用いて分類器を訓練し、クラスラベルが与えられていないブログエントリを分類することが目標です。訓練用データセットは下記のとおりの構成でした。1972データセットを数ファイル覗いてみると、これらの芸能人が誰なのか正直全然わからないですけども、クラスによっては特定の締め方があったり、顔文字の傾向があったり、ということがわかりました。用いることにしました。用いた特徴量への変換などが標準で備わっていますので、今回のようなデータセットなら、簡単に「とりあえず」食わせられるからです。以下のようなファイルを作成します。しましたが、ここには強い理由はありません(とりあえずノリで決めました)。記述する学習&予測プログラムから利用します。jubaclassifier.jsonそして訓練用データセットがクラスラベルごとにディレクトリで分けられていること、データセットサイズに対してインスタンスのメモリ容量が十分なことから、下記関数でデータセットを読み込むことにしました。出力するソースコードです。用いてオンライン学習し、テストデータを分類します。ここで、標準出力に表示される結果の例を示します。ラベルで提出した場合のスコアと大差がない。駄目!!正直、高火力コンピューティングをお客様に紹介して回ったり、プレゼンして回ったりする立場の私がコレなのは本当に恥ずかしてお客様などに顔向けできないなぁ、と思い、動揺し、死にたくなりました。クエリを叩き込んでしまいたいという気持ちになりましたが、個人的な感情でそんなことをするわけにもいきません。上げたのですが、これだけで、精度はあがりません。あきらめて、とりあえず他のデータセットに取り組むことにします。次に取り組んだのは、マルウェアURLの分類問題です。下記URLで取得できる、URLデータセットが先と同じように1サンプル1テキストファイルとして用意されており、オリジナルデータからラベルが取り除かれたテストデータが正常なURLか、グレイゾーンなURLかを判断することが目標です。URLhttp://malwareurls.joxeankoret.com/データセットのディレクトリ/ファイル構造train/normal/train/normal//1007.txttrain/normal//101.txttrain/normal//1011.txttrain/normal//1013.txttrain/malicious/train/malicious//0.txttrain/malicious//1.txttrain/malicious//10.txttrain/malicious//100.txt...あるデータファイルの中身の例テキストファイルの中が芸能人のブログ記事からURLにかわり、ラベルが変わっただけで、基本的にデータフォーマットは一緒です。値はそこそこ大きい必要があるでしょう。芸能人ブログの学習データを持っているので、ここでいったん同プロセスを再起動しておきます(もっといい方法があるのでしょうか?使い慣れているわけではないので、よくわかっていません)。実行した結果がこちら。及びません(2クラス分類なので全く駄目な結果ということです)。運営側から採点システムの不具合があり、正確な採点がされていないので,データを再提出するようにという指示。先の芸能人ブログ分類、マルウェアURL分類の結果を再提出した結果、こんな感じになりました。83.7%なんだぁ〜〜〜〜。分類できてるんじゃん!本当に焦って泣きそうでしたよ!!よかった。次はマルウェア分析問題にとりかかっていきます。先と同様のフォーマット(ただしJSON)に変換されているものです。Learninghttps://github.com/marcoramilli/MalwareTrainingSetsデータセットのディレクトリ/ファイル構造train/APT1/1046.jsontrain/APT1/1051.jsontrain/APT1/1063.jsontrain/APT1/1065.jsontrain/Crypto/0.jsontrain/Crypto/100.jsontrain/Crypto/1000.jsontrain/Crypto/1002.jsontrain/Locker/1004.jsontrain/Locker/1012.jsontrain/Locker/1037.jsontrain/Locker/1048.jsontrain/Zeus/1.jsontrain/Zeus/10.jsontrain/Zeus/1001.jsontrain/Zeus/1005.json...あるデータファイルの中身の例Cpawからデータセットのフォーマットが事実上先程と同じなので、遠慮なく分類器にかけていきます。すると、当日では、JSONを解析して特定の値のみを評価したかもしれません(よく憶えていません)。得られた結果は以下のとおり。達成することができました。精度が出せる点が、機械学習のメリットだと思います。ニューラルネットワークで"ファッションMNI?T"さてさて!気分がよくなってきたところで、次のデータセットに取り組んでいきましょう。ここまではテキストのデータセットばかりを選んできましたが、残っているデータセットは「ファッションMNI?T」と「古代文字」のふたつ。どちらかを先に試すか?と思ったら、まずは前者かな、と思いました。クラス分類問題で、名前から想像するに同じような要領でいけるのではないか、と思い、データセットを覗いてみることに。データセットでは黒塗りマスクがないのですが、今回のは黒塗りマスクのイタズラがされているデータでした。これはイケる、という確信を得ます。MNIST同様、28x28のモノクロサイズの10クラス分類。データセットをひと目みるとわかりますが、全ての画像に同一パターンの黒塗りがかかっています。リサイズされた状態である、と解釈できるのではないでしょうか。使いまくっていいので(畳み込んでいるとあっという間に時間が過ぎてしまいそうですが)線形結合で殴るぐらいの計算リソースと残り時間はあります。畳み込むと上にかぶっているマスクが邪魔になるだろうでしょうから、結果が予測できません。線形結合モデルでいくことにします。Chainerフレームワークをインストールします。chainerデータセットはこれまで通り各クラスがディレクトリで分けられて提供されていましたが、テキストファイルではなく画像なので、データセット読み込みを実装します。ほうが使い慣れているのですが、cv2モジュールがすぐインポートできなかったので、今回はPILを使ってみました。使ってニューラルネットワークを訓練し、テストデータを予測するためのコードの例です。精度が得られ、私は大会で暫定首位に躍り出ました。これは引っ掛けデータセットな「古代文字」さて、残りは古代文字データセットです。このデータセットは下記URLから入手できる古代文字画像が、一文字ごと、画像ファイルに分割された状態で提供されました。コンペティションの中で扱うデータセットとしては非常に重いです。ファッションMNISTのようにある程度の正規化がされているわけでもなく、さすがに畳み込みニューラルネットワークなどのアプローチで、きちんと回さないと、精度が出ないのではないか?という気がします。いえ、この段階で残り1時間ほど。チャレンジできるところまでチャレンジしましょう。カーテンコール......と思ったところで、運営からその時点の暫定順位の発表があり、運営の伊東さんから下記の案内がありました。散って終わったのでした。今回のブログ記事執筆のために作成しなおしたコードでは、下記のスコアが得られました。勝ち取っていたかもしれません。miniもちろん、今回はたまたまデータセットと私のとった手段がうまくはまってスコアが伸びただけしかありません。会場には、スコアを伸ばすことを重きにおくのではなく、フルスクラッチで機械学習アルゴリズムを実装するところからスコアを積み上げていた方もいらっしゃるようで、本当に頭がさがります。次の機会には、もし会場スポンサーの立場であっても、きちんと参加登録してコンペティションに臨んでみたいと思います。終わりに機械学習って、聞いたことがあるけど未だ試していなかったり、もしくはちょっと勉強してみたという方も増えてきているのではないでしょうか。コースを受講した程度の知識しかありません。1年ほどスプラトゥーンの画像データに取り組んだ経験がある以外は、機械学習について凡人レベル、もしくはそこに毛が生えた程度の知識しかありません。機械学習は、ちょっとモチベーションがあると、その状況なりの使い道や楽しみ方が見つかります。今回のような問題で7割8割の精度が出せれば、業務上でも自分の仕事の手間を削減したり、ちょっとした業務効率化で効いたりするものです。用いたオペレーション業務の効率化にも取り組んだりもしています。今後とも同様のオンラインイベントやオフラインイベントを開催すると伺っています。機会があれば、このようなイベントにぜひとも参加してみてください。