指定した数に分割して、そのうちの一つを検証用に残りを学習用に使います。numFoldsは今回5にしたので検証用と学習用のデータの組み合わせは5個あります。したがって全部で160回学習が行われます。交差検証の実行は以下のように行います。160回学習を行うため処理時間は長くなります。今回は約90分ほどかかりました。160回の学習を順番にしていた場合、ひとつ4分ほどで終了したとしても640分かかっていたと予想されるので並列化の効果はかなりあると考えられます。以下のようにベストの学習モデルを取得することができます。bestModel.stages(0).asInstanceOf[Word2VecModel]ベストのモデルのF値等を見てみます。「関連するデータ」のF値が大きく改善していることがわかります。ベストモデルのハイパーパラメータは以下のように確認することが出来ます。ついてはベクトルの次元数が多いほうが良いことがわかりました。は小さい方が良いようです。指定した中で一番小さい値が選択されました。第2正則項のみのほうが良い値が出たようです。最後に再利用可能なようにモデルを保存します。cvModel.write.overwrite.save("保存先のパス")上記では上書きOKで保存しています。保存することもできます。F値等を残しておきたい場合は自前で記録しておく必要があるようです。予測をしてみる交差検証を行うことでそこそこの精度のモデルを作ることができました。このモデルを使って実際に予測を行うには以下のようにします。取得することが出来ます。処理時間ですが、400万弱のデータに対して上記の予測する部分については10分以下で実行できました。説明文を単語リストに変換する部分には7,8時間程度かかっていました。形態素解析の処理は重いですね。17096717万件ほどのデータを取ることが出来ました。これらのうち真の「関連するデータ」はどれくらいあるのでしょうか?ランダムに20件を抽出して目で見て評価してみました。20件中15件が「関連するデータ」と判断できました。したがって適合率は75%程度と考えられます。事前に行ったデータのランダム抽出とその評価で全データのうち5.5%くらいが「関連するデータ」ではないかと予測していたので、400万件だと22万件の「関連するデータ」があると推測されます。一方でモデルによって抽出された件数は17万件で適合率75%だと大体13万件弱の真の「関連するデータ」を抽出していると考えられます。したがって大体60%弱程度の再現率と判断しました。期待していたより少し低いかなという印象です。F値が高いにもかかわらず実データの結果があまり良くない原因としては過学習が考えられるかもしれません。学習データの取得方法から考えて学習データが十分ではない、偏りがある、また学習データを特徴ベクトルに変換する部分で不十分なところもあるのかもしれません。使って機械学習を試してみましたが、実行しているとジョブが落ちたり性能が極端に落ちたり安定して実行させるのが意外と手間でした。ここでは気がついたポイントなどを簡単に書いておきたいと思います。以下は、弊社のクラスタの環境や使用した学習アルゴリズムに依存している可能性があります。コードを修正しながらトライ&エラーで実行していて気がついたのですが、速度が大きく異なる場合がありました。パーティション数が大きく関係していることがわかりました。パーティション数が多くなるにつれ性能が大幅に落ちていきました。実際にどの程度影響するか確認するため、学習データの数を減らすなどして比較的短い時間で終わるようにしたコードで処理時間を計測してみました。2193実行しているクラスタが他のジョブを実行している場合もあるため厳密なものではありませんが、傾向としてパーティション数が増えると処理時間が大きく増えていることがわかります。自分の場合、安定稼働を期待してパーティション数を大きくすることが多いのですが、少なくとも今回使ったアルゴリズムでは安定して動く範囲内でパーティション数を小さくしたほうが良いようです。落ちることがよくありました。GCまわりのオプションを追加するなどして調整をしてみました。ともにメモリを多めに取るようにしています。多く取るようにしています。実装はメモリをかなり必要とするようでその辺が原因なのかもしれません。機械学習ではよく言われるように学習データの収集がとても重要だなということを実感しました。Re:dashで集めた学習データの精査をしていなかったため、実際にモデルで予測してみると思っていた以上にノイズが除去できていない感じでした。したがって手間はかかっても学習データの品質向上は重要だと思います。精査などデータを見ていくという作業がどうしても避けられないので泥臭い根気がいる作業だと思いました。学習結果の評価やさらなる改善には学習アルゴリズムや統計などの知識が必要でありその辺が自分は不十分で難しさを感じました。使うのがメジャーなようで、情報が少ないようにも思えます。学習アルゴリズムのカバー範囲ももう少し広がるとうれしいです。特定の学習アルゴリズムやあるアルゴリズムの特定のメソッドが大量にメモリを必要としたりするようで分散システムを有効に使えてない感じもありその辺を改善してほしいと思いました。一方で交差検証などを並列化で高速化出来きたりするところは分散システムの大きなメリットな気がします。様々な書籍やサイトなどを参照させてもらっていますが、いくつか参考に載せておきます。CIを四倍速にした話chotaroです。豊洲PITでたくさんの人と頭の中のOMOIDEを共有し...2019-05-08Scalaから始めるRust入門お久しぶりでございます。