Labとは、アスタミューゼのエンジニアとデザイナーのブログです。アスタミューゼの事業・サービスを支えている知識と舞台裏の今を発信しています。夏休みの宿題のようにブログの当番が回ってきました。機械学習が非常に注目を浴びている今日このごろですが、私もデータ関連を扱うソフトエンジニアの端くれとして機械学習について学んだり、機械学習のアルゴリズムを時々試したりしています。機械学習は面白いとは思うのですが、いざ実際に業務に適用しようとするとなかなか難しいなあと感じることもあります。試してみると思ったような精度が出なかったり、機械学習でできないかというような要望と、機械学習できそうなこと(自分自身の知識的な問題も含む)に隔たりがある気がします。今回は比較的扱いやすそうな課題があったので、ものは試しに機械学習でやってみました的なところを書いてみたいと思います。使っているのでそのあたりについても書いてみました。残念ながら機械学習や統計などについての十分な知識や経験があるわけではないので、おかしなことをやっている可能性もありますのでその点ご了承ください。何をするか弊社では特許を含めて様々なデータを収集し、Webサービスやコンサルティングに活用しています。その中の一つとしてクラウドファンディングサービスのデータがあります。海外も含めたクラウドファンディングのサービスのデータを集積したデータベースです。以前、コンサルティングチームとのミーティングでクラウドファンディングのデータは彼らのコンサルティング業務に関連しないデータが多数あるのでそういったものを除去できないか、という話がでました。その時は学習データを用意するのが難しいということで実際に進めるところまではいきませんでした。問題はデータを2つに分類する2値分類であることから機械学習を適用するには良い問題かなと思っていました。そこで今回は「クラウドファンディングのデータを自社業務に役立ちそうなデータとそうでないデータに分類する」という問題に取り組んでみました。様々なデータ項目があります。データは多言語で格納されています。サービス名、獲得金額などはデータを分類する上で重要な情報になりそうですが、今回はシンプルに説明文だけを特徴データとして使うことにしました。対象となる言語は英語のみにして、原文が英語、または英語の翻訳があるデータについてのみを対象としました。このようなデータは500万件のうち400万件程度でした。分類の定義を決めるデータを業務に関連するデータとそうでないデータに分けるのが今回の課題ですが、関連する、しないはどう定義すれば良いでしょうか?本来はきちんと検討して決める必要がありますが、今回は試験的なものでもあるので私自身がざっくりと決めました。今回は「関連するデータ」を「何らかの製品やサービスなどの開発をしているもの」と定義してみました。芸術系(音楽、映像、ゲーム)などは除きます。ランダムにデータを取得して確認する作業をしました。200件中11件の「関連するデータ」を見つけることができました。「関連するデータ」と推測されます。2値分類をする上で分類が大きく偏っているのが気になりますがとりあえずこれで進めました。学習データを集める上記で分類を定義したので、それに基づき機械学習に使う学習データを収集する必要があります。一件一件データを見て分類していくのが確実ではありますが、それでは手間がかかりすぎます。そこで別の方法を考えました。経由で見れるようにしてあります。BigQueryで試行錯誤しながらデータを集めることにしました。説明文データにそれっぽいキーワードで検索をかけたり逆にキーワードを除外する、また調達金額などの属性情報を利用して絞り込みました。ダウンロードして間違っているデータの除外作業を行いました。この作業はなかなか大変でした。これらの作業により最終的に「関連するデータ」4517件、「関連しないデータ」9257件、計13774件の学習データを作りました。分類問題を扱う様々なアルゴリズムが実装されていますが、今回はロジスティック回帰を使いました。分類・回帰アルゴリズムのドキュメントでも一番始めに記述されているのでまずはこれで、という感じです。十分な精度が出ないなら他のも試そうということで気軽に決めました。特徴データとしては説明文のテキストデータを使います。より特徴データを作ります。実際に学習するまでの流れは次のとおりです。ファイルに保存しています。次にロジスティック回帰に使う特徴ベクトルを作成します。入力データに出来るように単語のリストに変換する必要があります。記号などのストップワードを除去したり、数字を固定文字列に置き換えるなどの処理をしました。いう単語リストに変換されます。インスタンスを生成します。メインとなっているのでこちらを使います。いうカラムに保存されています。いうカラムに保存します。ハイパーパラメータを適当に決めています。インスタンスであるモデルデータを得ることが出来ます。メソッドを呼ぶことで特徴ベクトルを生成することが出来ます。対しては類似語を表示させたりすることが出来ます。|0.5960714817047119|+-------+------------------+特徴ベクトルが出来たのでロジスティック回帰を定義します。labelになります。0(正則項無し)です。正則項として第一正則項と第二正則項というものがあり、その割合を指定します。デフォルトは0で第二正則項のみを使う設定になっています。指定するのが良いのかわからないのでとりあえずドキュメントのサンプルの値をそのまま指定します。学習は以下のように行われます。Pipelineとして定義して一括して実行することができます。使って実行してみます。実行環境は以下のようになっています。(total)実行時間は5分以下でした。定義したアルゴリズムのモデルを保存しています。学習モデルを取得することが出来ます。pmodel.stages(1).asInstanceOf[LogisticRegressionModel]F値等の値は以下のようになりました。「関連するデータ」になりますが、F値がかなり低くこれでは使い物になりません。交差検証でハイパーパラメータを決める上記の学習では各アルゴリズムに使うハイパーパラメータを適当に固定したものを使っていました。実際にはどういう値が適切なのかはわかりません。そこで性能を改善するため交差検証によりパラメータの最適化を試みます。いう交差検証をするクラスが提供されています。交差検証で調べたいパラメータのリストを渡すことでそれらのパラメータの組み合わせについて学習をして性能を評価し、最適なパラメータを決めてくれます。使って、交差検証で検証したいハイパーパラメータとその値を指定します。上記のパラメータの組み合わせ等を指定します。