クラスタリングの最近の記事

機械学習を利用して「エントリーシート自己PR分析サービス」を作成しました。

エントリーシートの評価や言いたいことが伝わるか、心配ですよね。
また、企業の採用担当者は膨大な数のエントリーシートを確認することはかなりの業務量かと思います。

「エントリーシート自己PR分析サービス」では、自己PRの内容を入力すると点数や頻出単語を表示します。


[2020年2月21日追記:デモ動画]

機能追加しました!
・自己PRそのものの採点ができるようになりました。


スクリーンショット 2020-01-23 11.53.29.png

サービスのポイント

  • 文章の特徴を可視化する
  • キーワードとの適合度を判定
  • 文章のカテゴリーを判定
  • 過去合格した自己PRと比較して採点


サービス内容を紹介します。


エントリーシート自己PRの例

私は、アルバイトの中で最も時給がアップしたという実績を持っています。

コンビニエンスストアで3年間勤務していますが、ただ働くのではなく、計画性を持って働くことができるという点が時給アップにつながりました。

具体的には、3つのポイントがあります。

お店の繁忙期をプライベートの予定と照合し、あらかじめお店が忙しい時にはいつでも残業できるようにしていたことです。一緒に働くスタッフの性格を把握しておき、一緒にシフトに入る人によって、自分の立ち位置を変えていたことです。集中力が必要となる発注作業がある日の前後には、徹夜するなどの無理なことはせず、身体的にも余裕をもっておくことです。

これら3つをすべて実行することで、他のスタッフは通常1度に30円しか昇給しないところ、前例のない100円の昇給に成功しました。

この計画性を活かし、御社でも先を見据えたスケジューリングと自己管理で、生産性の向上だけではなく、業務のクオリティをあげることにもつなげて参りたいと考えております。

(【例文多数掲載!】自己PRで計画性を伝えるときのポイントをご紹介から引用したものを少し修正)


ワードクラウド


wordcloud


結果を見ると「時給」や「計画」「アップ」などの頻度が高いことがわかります。
ワードクラウドとは与えられた文章を元に、出現頻度が高い単語ほど大きなサイズで表示するものです。文章内使われた単語を視覚的に捉えることで、エントリーシートなどの文章作成でも役立ちます。


キーワードと自己PRの適合度を判定

キーワード: 計画性 昇給
点数:77.7 点

キーワード:真面目 研究
点数:24.9 点

言いたいことを表現しているか採点するために文章内の頻出単語と自分で付けたキーワードを照合します。

就活において自分の強みなどを記述する際は、「計画性」や「行動力」、「部活」や「研究」などキーワードとなる言葉を意識して文章を組み立てますよね。これがどれぼど的確に出来ているかを採点するために、ワードクラウドの結果 (単語の頻度) とキーワードとなる単語との類似度を点数化しました。

例えば先程の自己PRでは、計画性やアルバイトに関するキーワードを選ぶと点数が高くなり、部活や協調性など関係のないキーワードを選ぶと低い点数になります。


単語の分散表現

キーワードとの適合度を判定するために単語の分散表現を用いました。
分散表現とは簡単に言うと単語を200次元などの高次元のベクトルで表現したものです。分散表現では似た単語同士は類似度が高く算出されます。

さらに、単語の意味も捉えることもできるため、
king - man + woman = queen
といった分散表現の足し引きをすることも可能です。
分散表現を使って、入力文章中の上位10個の頻出単語とキーワードを比べ、最大の類似度から点数を算出しています。
より適切に採点するために、類似度は文章中の出現頻度によって重み付けをしています。例えば、最も頻度が高い単語とキーワードの類似度は計算結果の値をそのまま使い、単語の頻度が1位の半分の場合は、類似度も計算結果の半分の値を使います。
キーワードも複数設定できるようにし、ユーザーの意図を汲み取りやすくしています。


自己PRを100点満点で点数化

自然言語処理において強力なBERTを使って自己PRを点数化しました。
ざっくりとしたBERTの解説については以下の記事をご参照ください。

Googleを理解する!文脈を読み取る最新の機械学習(BERT, ELMo)

自己PRを点数化する方針は良い自己PRを1とラベル付けし、悪い自己PRを0とラベル付けした後に2値分類を行います。2値分類の結果は0以上1以下の連続値で得られるので、その値に100をかけて点数化しました。

このときBERTをいちから学習させようと思うと大量のデータが必要になります。しかし、手元にあるデータ量は限られていたため事前に学習されたモデル(BERT日本語Pretrainedモデル)を利用しました。

最終的なモデルの構成は以下のようになりました。
BERTのEncoder-12-FeedForward-Norm層までを取り出しBidirectional層とDropout層を加えた後、全結合層を追加し2値分類できるモデルを作成しました。

BERT model structure


自己PRの点数化

上で例示した自己PRの点数を出してみましょう。

点数:84 点


次に悪い自己PRの例を用いて点数を出してみましょう。

エントリーシート自己PRの悪い例

私の強みは辛いことも諦めずに立ち向かう粘り強さです。わたしは大学の時にコンビニエンスストアでアルバイトをしていました。

コンビニでは担当する業務が思ったより多く、なかなかすべてを覚えることができなかったので、最初は店長やアルバイトの先輩に叱られてばかりでした。何度も辞めてしまいたいと思うことがありましたが、せっかく始めたからには諦めたくないという気持ちが強く、もっと前向きに仕事に取り組もうと考えました。

そこで、家に帰ってからもアルバイト先で学んだことをしっかり復習し、どの仕事も任せてもらえるような知識を身に付けました。また、気持ちよくお客様に接する事を心掛けて、どんなに疲れている時でも、どんなに忙しい時でも笑顔を絶やさないようにしてきました。今では店長や他のアルバイトの人にも認めてもらえるようになり、そのアルバイトを続けていくことができています。

これからもどんな仕事も諦めずに取り組む姿勢を大事にしたいです。

(自己PRの例文【悪い例:400文字、コンビニでのアルバイト①】から引用)

この自己PRはマイナスなことを書いている部分が多かったり、数字や具体的な内容が欠けておい良くない自己PRだと言えます。実際に点数を出すと

点数:52 点

冒頭の自己PRと比べて30点以上も低い点数となりました。

今回は良い自己PRと悪い自己PRの例をそれぞれ約50件ずつしか用意できなかったにも関わらず、2値分類のAccuracyでは75%以上の良い性能を出すことができました。やはり自然言語処理においてBERTは強力ですね。


まとめ

まだデータ量が少ないので精度にバラツキはありますが、大量のデータがあれば更に実用的なサービスになります。
現在はMicrosoft社などが提供するAPIを利用すれば機械学習を用いた様々なサービスを作ることが可能です。今後も多くのサービスがリリースされていくと予想されます。


Twitter・Facebookで定期的に情報発信しています!

はじめに

クラスタリングはマーケティング手法としても使われている。
見込み顧客へ適切な施策を行うために、似た顧客同士をカテゴリ分けする必要があり、それをセグメンテーションという。
セグメンテーションのために機械学習の手法としてクラスタリングが使用されている。

k-meansクラスタリング(以下、k-means法)は複数個のデータをcentroids(重点)からの距離に応じて、あらかじめ決めたk個のクラスタに分ける非階層クラスタリング、及び、ハードクラスタリングの手法の1つである。

階層・非階層クラスタリングの詳細については以下のブログを参考にしてほしい。 (アクセルユニバース株式会社技術ブログ、富田、2019

クラスタリングのため目的変数無し(ラベル無し)の場合のみこの手法は利用可能である。本記事は「k-means法とはどういったものか」に焦点を当て、方法やその過程について書いている。そのため数学的な要素は最小限に留めている(k-means++法やシルエット関数の計算方法等)。これらの数学的アプローチは今後の記事、もしくは、後述の参考文献をご覧いただきたい。

k-means法の実行方法

まず最初に各データからそれらが属するクラスタの重点までの距離を定義しなければならない。クラスタは全データの中で似たもの同士の集合体であり、その判断は各データから重点の距離を基に行われる。これにはsquared Euclidean distance (ユークリッド距離の2乗)がよく使われる。他にもユークリッド距離を用いたクラスタ内誤差平方和(SSE)を最小化する方法や、マンハッタン距離、マハラノビス距離等も使われており、データ分析の当事者が最適だと考えるものを選ぶ。

Alt text 各データから重点のユークリッド距離の誤差を最小限にする方法の一例。引用元: (https://data-flair.training/blogs/k-means-clustering-tutorial/)

次にクラスタの数を決める。K-means法を行う際にはあらかじめ全データを何個のクラスタに分けるか定める必要がある。この個数に関して最適解は無く、データ分析者自身が判断しなければならない。極端に言えば、データ分布を観た後に直感的に個数を決めてもそれが間違っているのかどうか分からない。しかしながら、もちろんそれでは説得力に著しくかける。求められているのはクラスタ内誤差平方和(SSE)を最小化するなどして、できるだけ類似度の高いデータを集めたクラスタ数を決める。以下のような方法がより良いクラスタ数を導き出すために使われている。

・エルボー法(elbow method) SSEから判明する歪みに基づき、最も適したkの個数を導き出す方法である。歪みの最も大きくなった地点のkを最適解と見なす。下記の場合はk=4。

Alt text

・シルエット法 (silhouette method) シルエット分析(silhouette analysis)とも呼ばれ、クラスタ内のデータの密度をプロット化し、最適なkの数を判断する。シルエット係数(silhouette coefficient)は−1から1の範囲で表され、1に近いほどクラスター間の距離が遠く、しっかりとクラスターが分けられていることを表す。各バーがおよそ均等な幅になるようにクラスタ数を設定する。

Alt text

以上のような方法でクラスタ数を決めたら、各クラスタの重点が動かなくなるまでになればk-means法は終了である。

k-means法のためのPythonコード(Hastie *et al*., 2017 参照)

#ランダムにデータセットを作成。
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
X,y = make_blobs(n_samples=300,
                 centers=4,
                 cluster_std=0.6,
                 random_state=0)
plt.scatter (X[:,0], X[:,1], c='white', marker='o', edgecolor='black', s=50)
plt.grid()
plt.tight_layout()
plt.show()

Alt text

#エルボー法を使い適したクラスタ数を求める。
from sklearn.cluster import KMeans
distortions = []
for i in range(1, 10):
    km = KMeans(n_clusters=i, 
                init='k-means++', 
                n_init=10, 
                max_iter=350, 
                random_state=0)
    y_km = km.fit_predict(X)
    km.fit(X)
    distortions.append(km.inertia_)
plt.plot(range(1, 10), distortions, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('Distortion')
plt.tight_layout()
plt.show()
#シルエット法を使い適したクラスタ数を求める。
import numpy as np
from matplotlib import cm
from sklearn.metrics import silhouette_samples

km = KMeans(n_clusters=4, 
            init='k-means++', 
            n_init=10, 
            max_iter=350,
            tol=1e-04,
            random_state=0)
y_km = km.fit_predict(X)

cluster_labels = np.unique(y_km)
n_clusters = cluster_labels.shape[0]
silhouette_vals = silhouette_samples(X, y_km, metric='euclidean')
y_ax_lower, y_ax_upper = 0, 0
yticks = []
for i, c in enumerate(cluster_labels):
    c_silhouette_vals = silhouette_vals[y_km == c]
    c_silhouette_vals.sort()
    y_ax_upper += len(c_silhouette_vals)
    color = cm.jet(float(i) / n_clusters)
    plt.barh(range(y_ax_lower, y_ax_upper), c_silhouette_vals, height=1.0, 
             edgecolor='none', color=color)

    yticks.append((y_ax_lower + y_ax_upper) / 2.)
    y_ax_lower += len(c_silhouette_vals)

silhouette_avg = np.mean(silhouette_vals)
plt.axvline(silhouette_avg, color="red", linestyle="--")

plt.yticks(yticks, cluster_labels + 1)
plt.ylabel('Cluster')
plt.xlabel('Silhouette coefficient')
plt.tight_layout()
plt.show()

シルエット係数の計算

silhouette_vals = silhouette_samples(X, y_km, metric='euclidean') y_ax_lower, y_ax_upper = 0, 0 yticks = [] for i, c in enumerate(cluster_labels): c_silhouette_vals = silhouette_vals[y_km == c] c_silhouette_vals.sort() y_ax_upper += len(c_silhouette_vals) color = cm.jet(float(i) / n_clusters) plt.barh(range(y_ax_lower, y_ax_upper), c_silhouette_vals, height=1.0, edgecolor='none', color=color) yticks.append((y_ax_lower + y_ax_upper) / 2.) y_ax_lower += len(c_silhouette_vals) silhouette_avg = np.mean(silhouette_vals) plt.axvline(silhouette_avg, color="red", linestyle="--") plt.yticks(yticks, cluster_labels + 1) plt.ylabel('Cluster') plt.xlabel('Silhouette coefficient') plt.tight_layout() plt.show()
#k-means法によるクラスタリングのプロット
from sklearn.cluster import KMeans
km=KMeans(n_clusters=4,
          init='k-means++',      
          n_init=15,
          max_iter=350,
          tol=1e-04,
          random_state=0)
y_km=km.fit_predict(X)

plt.scatter(X[y_km==0,0],
            X[y_km==0,1],
            s=50,
            c='lightgreen',
            edgecolor='black',
            marker='s',
            label='cluster 1')
plt.scatter(X[y_km==1,0],
            X[y_km==1,1],
            s=50,
            c='orange',
            edgecolor='black',
            marker='o',
            label='cluster 2')
plt.scatter(X[y_km==2,0],
            X[y_km==2,1],
            s=50,
            c='lightblue',
            edgecolor='black',
            marker='v',
            label='cluster 3')
plt.scatter(X[y_km==3,0],
            X[y_km==3,1],
            s=50,
            c='coral',
            edgecolor='black',
            marker='x',
            label='cluster 4')
plt.scatter(km.cluster_centers_[:,0],
            km.cluster_centers_[:,1],
            s=200,
            marker='*',
            c='red',
            edgecolor='black',
            label='centroids')
plt.legend(scatterpoints=1)
plt.grid()
plt.tight_layout()
plt.show()

Alt text

k-means法の欠点

  1. 初期値に依存する。
  2. 外れ値の影響を受けやすい。
  3. 各データが1つのクラスタにしか所属できない。
  4. クラスタの個数をあらかじめ決定しなければならない。(クラスタの個数に正解はない。)

さいごに

以上がk-means法についてである。今回は数学的要素を最小限に抑え、同手法がどのように成り立っているかに重きを置き紹介した。クラスタリングの中で最も有名と言っても過言ではないk-means法は、データサイエンスや機械学習をやる上で必ず目にするだろう。加えて、クラスタリングはWebマーケティングや画像処理等にも活用できるなど利用用途は幅広く知っておいて損はない手法だろう。


定期的にメルマガでも情報配信をしています。
ご希望の方は問い合わせページに「メルマガ登録希望」とご連絡ください。

参考文献

DATAFLAIR TEAM (2019) 『Data Science K-means Clustering: In-depth Tutorial with Example』Retrieved from LINK .

Hastie, Trevor et al. (2009)『The Elements of Statistical Learning: Data Mining, Inference, and Prediction Second Edition』. (杉山将 他 訳)

Pelleg, Dan and Moore, Andrew (2000) 『X-means: Extending k-means with efficient estimation of the number of clusters』. Morgan Kaufmann.

Raschka, Sebastian and Mirjalili, Vahid (2017)『Python 機械学習プログラミング』. (株式会社クイーブ 訳). インプレス.

VanderPlas, Jake (2016) 『Python Data Science Handbook: Essential Tools for Working with Data』.

平井有三(2012)『はじめてのパターン認識』. 森北出版株式会社.

クラスタリングとは

 クラスタリングとは、異なる性質を持った多くのデータから類似性を見て自動的に分類する、機械学習の教師なし学習における手法のこと。(複数のコンピュータを連動させることにより、1台のコンピュータとして利用できるようにする技術を言うこともある)
 マーケティングでは、顧客層の特性分析や店舗取り扱い商品の構成分析に利用されており、多くの顧客や商品を分類し、どのような顧客が多いのかを明確にし、ターゲットを決定する。

 クラスタリングとクラス分類は混同しやすいが、別々のものである。大きな違いは、クラスタリングは教師なし学習で、クラス分類は教師あり学習という点である。
教師あり学習であるクラス分類は、どのグループに属するかという"ラベル"がついている既知データが手元にあり、それを用いてモデルを作って、"ラベル"がついていないデータの分類に用いるという手法であることに対し、
教師なし学習であるクラスタリングは、ラベル付きデータがない状態で、あるデータを分類するような手法である。

クラスタリングの手法の種類

 クラスタリングはデータ同士が「似ている」、「似ていない」かを基準に分類する。この「似ているかどうか」という尺度は人間の感覚的な部分があるため、これまで多くの研究者が様々な手法や考え方を提唱してきた。それらは未だ一本化されておらず、ここではその種類を紹介する。

  1. 「階層的クラスタリング」と「非階層的クラスタリング」
  2. 「ハードクラスタリング」と「ソフトクラスタリング」

image

階層的クラスタリング

 階層的クラスタリングとは、 各データを1つのクラスタとして、最も似ている2つのクラスタを合併すること(近いものから順番にくくる)を繰り返していく手法。最終的にクラスタが1つになるまで合併を繰り返す。(※1)

image (※1)

 クラスタの合併をしていくと、樹形図のようなデータの階層構造が得られ、デンドログラムで表現することができる。(※2)

image (※2)

非階層的クラスタリング

 非階層的クラスタリングとは、事前にいくつのクラスタに分けるかを決め、サンプルを決めたクラスタ数に分割していく手法。階層的でないクラスタリングである。そのため、木構造のデンドログラムでは表現されない。階層的クラスタリングでは分類するデータが多いと、計算量が多くなってしまったり、階層構造が複雑になってしまったりする。それに対して非階層的クラスタリングは、分類するデータが多くなってしまう場合でも対応することができる。

 また、非階層的クラスタリングの代表的な手法はk-meansという手法である。

image

ハードクラスタリング

 ハードクラスタリングとは、各データが1つのクラスのみに所属するようなクラスタリング。

 一般的にクラスタリングといえばハードクラスタリングをさす。

image

ソフトクラスタリング

 ソフトクラスタリングとは、各データが複数のクラスタに所属することを許すようなクラスタリング。   image

あとがき

 今回は、クラスタリングとはどんなものなのかについて広く浅く扱ってきた。

 次回は、今回詳しく説明することができなかったk-means、ウォード法、メディアン法など、クラスタリングの手法の種類の一つ一つをより具体的に説明していく。

(2019/11/28 追記)
k-means法について

1.クラスタリングの定義

クラスタリングとは、機械学習の目的物を分類する一つである。
与えられたデータを外的基準なしに自動的に分類する手法の事である。
簡単に言えば、データの集合体をカテゴリに分けることである。

2.クラスタリングの特徴

機械学習には教師あり学習と教師なし学習に大別される。
1.教師あり学習
人が正解を提示してそれを元に観測したデータから予測する事である。
2.教師なし学習
観測データのみを分析する。
クラスタリングは教師なし学習に分類される。
そのため、分類の基準が明確ではない。
分類の外的な基準が与えられていない場合にはどうしてそのように機械が分類したか分析する必要がある。

3.クラスタリングの目的

クラスタリングの目的は、まとまりのないデータを分類してマーケティング等で応用することである。

4.クラスタリングのアルゴリズム

クラスタリングを行うためには以下の2つのアルゴリズムを利用する。
1.断層クラスター分析
グラフ(例)

image 2.非断層クラスター分析
グラフ(例)

image

5.断層クラスター分析

断層クラスターとは、集合体のデータのうち最も類似している組み合わせにまとめて分類する手法である。
この手法は、結果を出すのに繰り返しデータを計算して断層的に併合するので樹形図のような形に見える。

6.断層クラスターのメリット・デメリット

断層クラスターは予めクラスターの数を決める必要がないので便利である。
しかし、断層が増えるたびに計算量が増加していき実行に時間がかかるので、膨大なデータを扱うのには向いていない。

7.非断層クラスター分析

非断層クラスターとは、異なるデータの集合体の中から対象のものを集めて分類する手法である。
ビッグデータを解析して大量のデータを分類する際に行う。

8.非断層クラスター分析のメリット・デメリット

非断層クラスターはデータの数が多いものでも取り扱う事ができる。
しかし、予めクラスターの数を決めておかなければならない。

9.クラスタリングの注意点

クラスタリングを行う際には、何らかの主観的視点に基づいているため客観的な証拠とする事ができない。
そのため、クラスタリングの結果を使う際は、その結果が妥当なのか検証しなければならない。

10.まとめ

クラスタリングは教師なし学習であり、似ているデータを分類する手法である。
クラスタリングは、断層クラスター分析と非断層クラスター分析のアルゴリズムを使用して分類を行う。

このアーカイブについて

このページには、過去に書かれた記事のうちクラスタリングカテゴリに属しているものが含まれています。

前のカテゴリはニューラルネットワークです。

次のカテゴリは分類です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。