
初めての機械学習とデータセットと、頭の悪い私
初めて機械学習をしてみよう!ということで、
データセットを作ってみたので、その感想戦。
あと本当に頭の悪いことをし続けているだけなので、偉い人は見る必要がないです。
ありとあらゆる情報が間違ったことしか言っていません。
簡単に言うと、自分が間違ったプロセスを垂れ流しています、、
使用したデータセット
UCI machine learning repositoryから配布されている、以下のデータセットを使ってみた。
Online Retail Data Set
英国を拠点とする、登録された非店舗オンライン小売の2010年12月1日から2011年9月12日の間に発生したすべてのトランザクションを含む国境を越えたデータセットです。会社は主にユニークなオールギフトを販売しています。同社の多くの顧客は卸売業者です。
https://archive.ics.uci.edu/ml/datasets/online+retail
データセットに入っている項目はこちら
InvoiceNo 請求番号 文字列
StockCode 商品コード 文字列
Description 商品名 文字列
Quantity 購入数量 整数
InvoiceDate 請求日時 実数
UnitPrice 単価 実数
CustomerID 顧客識別コード 文字列
Country 国名 文字列
最初に立てた目標
このデータセットを使用した理由は、数値分類をしてみたく、
その一番最初に思いついた例が優良顧客抽出だったためです
優良顧客抽出なら、この情報からだけでもRFM分析ができそうですし、
簡単にスコアリングして、そのスコアを学習させて、優良な顧客か、そうでない顧客かを分類できるかなと思っていました
というわけで、顧客の情報を入れたら、優良顧客かどうかを分類してくれるAIを作成しようと思いました
最初のつまづき
今回使用するデータセットの項目は先ほど述べた通りで、
これをRFM分析できるようにきれいにしていきます。
まずそもそもRFM分析とは何かというと、
以下の3項目の頭文字をとっていて、この3項目から顧客をランク付けするものです。
Recency ある基準日から最新購入日までの日数をスコア化したもの。
Frequency 一定期間に何回の来店があったか、その回数をスコア化したもの。
Monetary 一定期間に購入した総金額をスコア化したもの。
今回のデータセットは卸売業のものなので、一定期間の範囲は広めに1年間としてこの3種類のデータを作っていきました
その時にまず第一のつまづきに気が付きました
あれ、RFM分析の3項目のスコア全部埋めて、機械学習させて、合計のスコアを予測させるのは、ただのあほじゃね?エクセルでやれよ
これに気づくのに3時間くらいかかりました。
次に立てた目標
3項目のスコアを使って、合計のスコアを予測して、優良顧客を分類するのはただのあほだと気づいたので、目標を変えました。
今回は、顧客のRecency(最近の来店)・Frequency(購入頻度)から、顧客をMonetary(購入総額)のスコア別に分類しようと思いました。
そこでできたデータセットの項目はこちら
CustomerID:顧客識別番号
Recency:データセットにある最終日の「2011-12-09」から見て、CustomerIDが現れるのが何日前か、を整数で表している
Frequency:CustomerIDの登場回数
Country:もしかしたら何かの相関見れるかもの淡い期待を込めていれた
正解ラベルは
MonetaryScore:CustomerIDの購入総額の散らばりがかなり大きかったので、四分位を使って以下のようにスコアを出した
スコア1 < 25% < スコア2 < 中央値 < スコア3 < 75% < スコア4
これでいいのかわかりませんでしたが、モノは試しという気持ちだったので、まずはこれでやってみようと思いました。
また、さすがに購入総額の実数値を学習データとするような、あほではありませんでした。そのぐらいはさすがに分かりました。
一人のあほ、ようやく自分のあほさに気づく
上の項目には入っていませんが、あほな項目を最初は入れていました
入れていたあほな項目は以下の通り
Quantity:CustomerIDの購入総数
QuantityAverage:CustomerIDが一回の購入した商品数の平均
なんとなく、購入総額に影響してそうな数値だよね、
と思い、最初は入れていました。
ここで気づきました。
購入総数とか影響しまくるにきまってんじゃん。
というよりも、それがわかるなら、購入総額出てんじゃん、スコアつけるのエクセルでやったらいいじゃん
現実の世界の中で、顧客の購入総数を学習データとしていれる、ということは、分類したい顧客がすでに商品を買っていて、その購入総数を学習データに使うことになります。
つまり、すでに商品を買っているなら、当然購入総額もわかります、購入総額がわかるなら、エクセルでスコア出せばいいじゃんとなります。
簡単に言うと、購入総額のスコアを分類するために、購入総額の実数値を学習データにするような、あほでした
そしてこれに気づいたとき、さらに自分の頭の悪さに気が付きました。
これ他の項目にも同じこと言えね??
今回学習データにしようとしたデータは、すでに顧客が存在して、その顧客が何かしら商品を購入している前提のデータです。
例えば購入頻度なんか、名前の通りですね。
すべての学習データが、すでに購入をした顧客のデータでした。
つまり、この学習データが存在する次点で、購入総額はわかるはずで、購入総額からスコアをエクセルでだしたら、優良顧客分類の完了です。
つまり、この分類をするAIの意味なくね?ということです
これに気づくのに5時間ぐらいかかりました。
終わりに
今回の反省はとにかく、AIで何かしたい、程度のことしか考えていなかったことですね。
そして、練習に優良顧客分類をする!といっても、それにあったデータを用意しなければならなくて、そのデータがちゃんと目的にあったものじゃないといけない、ということがわかりました。
そして、優良顧客分類をしたいなら、何をもって優良顧客とするのかをしっかり考えないと、必要なデータもそろわないように思いました。
例えば、優良顧客を来店頻度の高い顧客として、
Recency(最近の購入日)のスコアを、正解ラベルとして、
顧客の年齢や性別・住所・過去の購入価格などから分類する
とかならまだ意味がありそうですね。
これも間違ってたらぜひ教えてほしい、、、
とにかくまあ、一番理解したポイントは、
やりたいことに沿ったデータ用意するのすごく大変
という当たり前のことでした
まあ、わかっただけましということで、
今日はここまで。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
せっかくだから、とりあえずやってみた
先ほど述べたことに気づいたときには、
Python書く気力はすでになくなっていました。
というよりも、Pythonなんか書けないし、アルゴリズムもわかりません。
もともと、AI構築プラットフォームでうわさのMatrixFlowというサービスを使ってみたい、という目的で始めていました。
Python書いてAI作る必要がないので、とりあえずやってみようとした自分には最適でした。
ほんとは、優良顧客分類のAIだ!というものになっていればいいんですが、今回のデータではそうはならないので、、
各項目の正解ラベルの判定への影響度合いが見れるようなので、それだけでもしてみようと思いました。
データの学習結果は以下のようになりました。
無料アカウントなので、最初からある数値分類のテンプレートをつかってみました。
使ったアルゴリズムはそれぞれほとんど、どんなものなのかわかっていませんが、どれもだいたい分類できているのかな?と思います。
(下の方に僕の各アルゴリズムへの理解度を書いておきます。こんな程度の知識でも、ちゃんと分類できるAIを作ることができたみたいです)
また、今回の主題の正解ラベル(購入総額)の判定への影響度合いについては、以下のようになっていました
購入総額への影響度は、
Frequency(購入頻度)>>Recency(最近の購入日)>イギリス人>他
と影響しているようです。
購入頻度が一番影響しているのは、当然ですね、購入回数が多ければ、購入総額も増えるでしょうし。
最近の購入日との影響度の差についても納得です。
ほとんど知識がない人間ですが、AI(学習データ的にはAIとは言えないが、、)を作れましたし、影響度もみれて、いいサービスっすねという感想です。
今度はもうちょっとましなデータセットを、入れてあげられるようにしたいです。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
以下、上で話した、私が今回MatrixFlowというサービスで使用した、アルゴリズムの理解度を記載しています。
ほんとにこの程度の知識で、AIの作成を試してみることができました。
サポートベクターマシーン分類器
各データ点との距離が最大になるような境界線を求めて、パターン分類する手法です
カーネル関数とか使うらしいですが、僕はよくわかっていません
あと名前がかっこいいですね
ロジスティック回帰
二つの項目に分類するなら、シグモイド関数(任意の値を0から1の間におく関数)を使って、閾値を0.5などに設定して、それ以上なら正、それ以下なら負などと2種に分類できます。
今回は4つに分類するので、ソフトマックス関数が使われているんですかね、そっちの関数は僕には理解できませんでした(苦笑)
LightGBM分類器
条件に基づいてデータを分類していく、決定木を使う手法らしいです。
よくわかっていませんが、各データの影響度合いがみやすいそうです。
あとすごく名前がかっこいいですね。
以上になります。
今日はここまで。