機械学習で記事のタイトルから閲覧数を予測したかった

はじめまして、s.nagasawaです。

今回は、記事のタイトルから閲覧数を予測しようとした話です。 タイトルを見てわかるように実際にできなかった話ですので、ご了承ください。 一応分析結果みたいなのを追記しました。

やりたかったこと

今回のモチベーションは単語から閲覧者数推定するモデルを作成することで、どの単語が閲覧者を多く獲得できるかなどを確認し、ハックノート内でのトレンドのような単語を探すことでした。

単語分割については機械学習前にデータ成形をしてみたの時のように形態素解析を行いました。 今回はデータが10000以上とそこそこ多かったため、取得する品詞は名詞のみに絞りました。

とりあえず作ってみる

今回もsklearnで実装しました。 前処理のベクトル化として,CountVectorizerを、推定は線形モデルの回帰であるLinearRegrissionで行いました。

訓練データとテストデータのそれぞれを決定係数で計算したlossの値を以下に示します。 決定係数は推論の結果が良ければよいほど1に近づき、悪ければマイナスになることもあります。

データloss
訓練データ0.2825
テストデータ-0.4815

んーだめ 機械学習タスクをちょこちょことやってきましたが、これは初ですね。

一応それぞれ単語の重みの大きい、小さい単語を見ていきたいと思います。

重みの大きい単語重みの値
連結9647.86
空文字8134.89
int6227.59
typeerror6139.56
グレード4860.48
重みの小さい単語重みの値
order-2071.35
unable-2248.58
redux-2371.61
ポップ-2505.76
database-2575.30

何も関係ありそうにないですね、databaseについての記事書いたら閲覧数減るってどういう事。 これではなんにもできていません、これからなんでこうなったかの考察をしていきたいと思います。

考察

考察というか反省会みたなものです。 まず最初に確認すべきだったこと、それはデータの可視化です。 今回のデータを閲覧者数で、ヒストグラムを作成したところこんな感じになりました。

データ偏りすぎい、、、 このグラフのx軸は40000まであるのですがその外れ値がこの記事です。 シェルスクリプトで文字列と変数を連結する

これは外れ値にめちゃくちゃ値が引っ張っれてるぞぉ! これでは流石にうまくいきません しっかりデータを確認していればここまでの凡ミスはなかったですね、反省。

データを少し無視して新しく作ってみます!! 範囲を200までに絞って再度同じ手法で行ってみました。以下のグラフがヒストグラムです。

まあ先よりは全然いい感じです。

全体のときと同じように推論を行いました。

データloss
訓練データ0.320
テストデータ-0.2887

良くはなりましたが良い精度のモデルとは流石に言えません。 やっぱり未知データには弱いな、、 次に単語ごとの重みです。

重みの大きい単語重みの値
must216.63
フレーム187.04
mtif173.36
問い合わせ172.38
encrypt158.09
重みの小さい単語重みの値
javaphpruby-128.20
スキップ-128.21
大文字-131.38
経験-132.81
you-145.63

んー、これもなんとも言えない、、僕の希望的にはここの単語に「機械学習」とか「Wordpress」とか入ってくれると嬉しいんだけど、、、

java php rubyはだめなんですか、、、、、

データを減らしてうまくいくかな思ったけどそんなことは無いですな。 単語ごとの閲覧者数に特に関係性が無いのかもしれません。

最後に

今回は精度の良い推論モデルを作成できませんでした。 データを弄るのはやっぱりむずかしいですね。 機械学習も全知全能では無いため、機械学習の恩恵が受けれるタスクかどうかを確認する必要があります。 今回はまだそこがわからなったため判断ができず、このような結果になってしまったと思います。 もっと経験を積んでそのへんをすぐわかったり、適切なモデルとかわかるようになりたいなあああ。

あと今回はタグとかでgroup-K-foldしたほうが良かったのかな?? 後は公開からの期間とかでデータに優劣がついたとかもありそうだからそのへんの正規化もやったほうがいいのかな(むずそう) 以上!!!!

追記

何も成果出せないだと悲しいので、いろいろといじくり回しました。

気になる単語ごとにヒストグラムを出したりしてみましたが、偏りというかばらつきが、、、、はい

今回出したのは各単語の平均閲覧数です。トレンドというか調べられやすい単語を探すみたいなモチベーションです。 データの外れ値に引っ張られないよう、データをソートして各単語の真ん中の50%の平均を取りました。 また、出現頻度が少ない単語(100以下)はデータ不足として消しました。

その結果がこんなかんじです。

単語平均値標準偏差
eclipse230.87166.67
jquery187.6794.09
python165.1178.07
出力142.9382.80
エラー140.0092.30
windows138.8975.91

上手いこと値は表せてそうです。

簡単に言うと「eclipce」が一番平均値としては高いです。けど標準偏差も高いため、「python」が一番安定して閲覧者数を獲得できそうです。