機械学習で抜きゲーか非抜きゲーかを判断させる試み お試し版
ErogameScapeの欠損を機械学習で補完できないかという試み。名づけて、エロスケ欠損補完計画!
今回は単層パーセプトロンにより、gamelistのokazu列の欠損の補完を試みます。つまりは、抜きゲーか非抜きゲーかの判定をさせようというわけです。
まだまだ機械学習もpythonもビギナーなので、探り探りのお試し版です。
特徴量にはPOV入力割合を使います。
過去の同人誌の結果も踏まえつつ、今回は
「女の子に襲われちゃう」「SMのあるゲーム」の入力割合の和
「シナリオがいいゲーム」「キャラを取り巻く世界観がよいゲーム」の入力割合の和
の2つを特徴量として使います。
学習の対象データは「どちらの特徴量もその値が0でない」「okazuがNULLでない」ものとしました。該当が5891件あり、このうち、300件を学習データに、残る5591件をテストデータとして使います。
5891件について特徴量をSQLで入手し、値を標準化。ランダムに300件を抽出して学習データとしました。
学習データ300件について散布図をみてみましょう。
横軸は「女の子に襲われちゃう」「SMのあるゲーム」のPOV入力割合の基準値、縦軸は「シナリオがいいゲーム」「キャラを取り巻く世界観がよいゲーム」のPOV入力割合の基準値です。
青い○は抜きゲー、橙の△は非抜きゲーを指します。
シナリオ系のPOVが多い右側は、青い非抜きゲーが多く、
エロ系のPOVが多い上側は、橙の抜きゲーが多くなっています。
ここで、抜きと非抜きを分けれるような境界線をパーセプトロンで探します。
アルゴリズムおよびソースコードは、『夢見る機械学習 回帰・パーセプトロンpython実装入門』(著:金城俊哉/秀和システム)のダウンロードデータをほぼそのまま拝借しました。重みの更新ループ数を変えたくらいでほとんどそのままです。相場もよくわからないので適当に3000回ループさせてます。
データがはっきり線形分離できるようなものでないからなのか、はたまたそういうものなのか、3000回更新しても値に再現性はありません。ひとまず3000ループでの学習を3回個別に記録しました。
毎回微妙に傾きが異なり、再現性はないですが、まあそれっぽく分けれそうなところに境界線を引くことができました。
得られた境界線で、テストデータ5591件を分類し、正解率を調べます。
各回とも微妙に傾きは違いますが、正解率やF値に劇的に変化はありません。
正解率は75%程度、F値は78%程度です。相場はわかりませんが、たぶんこのままでは使い物にならんでしょう。
でも、正直もっと正解率は低いと思っていました。
特徴量を工夫すれば、もっと高い正解率は出せそうな気がします。
ただ、単層パーセプトロンで粘るよりは、いろんな手法を一通り経験したほうがいろいろとよさそうです。ロジスティック回帰か、ニューラルネットか、SVMか、ランダムフォレストか……。
オレはようやくのぼりはじめたばかりだからな このはてしなく遠い機械学習坂をよ……。