PySparkでのk-meanクラスタリング


関係記事:クラスター数の決め方の1つシルエット分析、 k-means++

ビッグデータ処理や機械学習の場合は、巨大データの取り扱いを目的とした分散処理のフレームワークが必要です。特定のアプリケーションに関する実行性能はSpark MLです。今回の記事はSpark MLでk-meanのクラスタリングを解説します。

目次

1. PySparkのクラスタリング
2. 実験・コード
__2.1 ライブラリーのインポート
__2.2 データ処理
__2.3. シルエットスコアの比較
__2.4. クラスタリングのモデルを作成
__2.5. 可視化

1. Spark MLのk-meanクラスタリング

Spark MLはSparkの統計処理、機械学習を分散処理するライブラリです。k-meanはは最も一般的に使われる、事前に定義したクラスタ数までデータを群にする、クラスタリング アルゴリズムです。
spark.mlでのパラメータ:
– k は要求するクラスタの数です。
– maxIterations は実行の繰り返しの最大数です。
– initializationMode はランダム初期化
– initializationSteps は k-meansアルゴリズム内でのステップ数を決定します。
– epsilon はk-meansが収束したと見なす距離の閾値を決定します。
– initialModel は初期化に使用されるクラスタの中心点の任意のセットです。

2. 実験・コード

概要
データセット: UCI機械学習リポジトリの白ワインの属性
環境: Databricks
Runtime Version: 6.0 ML (includes Apache Spark 2.4.3, Scala 2.11)
モデル:K-meanクラスタリング K 2 ~ K 7

2.1 ライブラリーのインポート

from pyspark.ml.clustering import KMeans
from pyspark.ml.evaluation import ClusteringEvaluator
from pyspark.sql import SparkSession

データのダウンロード

import urllib 
urllib.request.urlretrieve("http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv", "/dbfs/data/winequality-red.csv")

2.2 データ処理

データフォーマットを作成

sp_path = '/data/winequality-red.csv'
sdf = spark.read.csv(sp_path, header=True, sep=';', inferSchema=True)

sdf:pyspark.sql.dataframe.DataFrame
fixed acidity:double
volatile acidity:double
citric acid:double
residual sugar:double
chlorides:double
free sulfur dioxide:double
total sulfur dioxide:double
density:double
pH:double
sulphates:double
alcohol:double
quality:integer

データを表示

display(sdf)

ベクトルアセンブラーを作成

from pyspark.ml.feature import VectorAssembler
train = VectorAssembler(inputCols = sdf.columns,
outputCol = "features").transform(sdf)

2.3 シルエットスコアの比較

for k in range(2,8):
kmeans = KMeans().setK(k).setSeed(1)
model = kmeans.fit(train)
predictions = model.transform(train)
evaluator = ClusteringEvaluator()
silhouette = evaluator.evaluate(predictions)
print("With K={}".format(k))
print("Silhouette with squared euclidean distance = " + str(silhouette))
print('--'*30)
print("High value indicates that the object is well matched to its own cluster")

With K=2
Silhouette with squared euclidean distance = 0.7743418116498192
————————————————————
With K=3
Silhouette with squared euclidean distance = 0.6900419073907927
————————————————————
With K=4
Silhouette with squared euclidean distance = 0.6731241279450502
————————————————————
With K=5
Silhouette with squared euclidean distance = 0.6212314629242999
————————————————————
With K=6
Silhouette with squared euclidean distance = 0.5917531394311327
————————————————————
With K=7
Silhouette with squared euclidean distance = 0.5546944597705324
————————————————————
High value indicates that the object is well matched to its own cluster

 

2.4 モデルを作成 (2k)

# Trains a k-means model.
kmeans = KMeans().setK(2).setSeed(1)
model = kmeans.fit(train)

推論

# Make predictions
predictions = model.transform(train)

2.5 可視化

クラスタリングの結果

countByCluster = predictions.groupBy("prediction").count()
display(countByCluster)

クラスタリングの分布図

display(predictions)