web-dev-qa-db-ja.com

Sklearn.KMeans():クラス重心ラベルとデータセットへの参照を取得します

Sci-KitはKmeansとPCAの次元削減を学習します

私は、200万行×7列のデータセットを持っており、各測定の日付とともに家庭の電力消費量のさまざまな測定値があります。

  • 日付、
  • Global_active_power、
  • Global_reactive_power、
  • 電圧、
  • Global_intensity、
  • Sub_metering_1、
  • Sub_metering_2、
  • Sub_metering_3

データセットをpandasデータフレームに入れ、日付列を除くすべての列を選択してから、交差検定分割を実行します。

import pandas as pd
from sklearn.cross_validation import train_test_split

data = pd.read_csv('household_power_consumption.txt', delimiter=';')
power_consumption = data.iloc[0:, 2:9].dropna()
pc_toarray = power_consumption.values
hpc_fit, hpc_fit1 = train_test_split(pc_toarray, train_size=.01)
power_consumption.head()

power table

K-means分類を使用し、続いてPCA次元削減を使用して表示します。

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
from sklearn.decomposition import PCA

hpc = PCA(n_components=2).fit_transform(hpc_fit)
k_means = KMeans()
k_means.fit(hpc)

x_min, x_max = hpc[:, 0].min() - 5, hpc[:, 0].max() - 1
y_min, y_max = hpc[:, 1].min(), hpc[:, 1].max() + 5
xx, yy = np.meshgrid(np.arange(x_min, x_max, .02), np.arange(y_min, y_max, .02))
Z = k_means.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.figure(1)
plt.clf()
plt.imshow(Z, interpolation='nearest',
          extent=(xx.min(), xx.max(), yy.min(), yy.max()),
          cmap=plt.cm.Paired,
          aspect='auto', Origin='lower')

plt.plot(hpc[:, 0], hpc[:, 1], 'k.', markersize=4)
centroids = k_means.cluster_centers_
inert = k_means.inertia_
plt.scatter(centroids[:, 0], centroids[:, 1],
           marker='x', s=169, linewidths=3,
           color='w', zorder=8)
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xticks(())
plt.yticks(())
plt.show()

PCA output

ここで、どの行が特定のクラスに該当し、どの日付が特定のクラスに該当するかを調べたいと思います。

  • PCAの後で、グラフ上のポイントをデータセット内のインデックスに関連付ける方法はありますか?
  • 私が知らないいくつかの方法?
  • それとも私のアプローチは根本的に欠陥がありますか?
  • 何かお勧めはありますか?

私はこの分野にかなり慣れておらず、たくさんのコードを読み通そうとしています。これは、私が文書化したいくつかの例をまとめたものです。

私の目標は、データを分類してから、クラスに該当する日付を取得することです。

ありがとうございました

10
flow

KMeans()。predict(X) .. docs here


Xの各サンプルが属する最も近いクラスターを予測します。

ベクトル量子化の文献では、cluster_centers_はコードブックと呼ばれ、predictによって返される各値は、コードブック内で最も近いコードのインデックスです。

Parameters: (New data to predict)

X : {array-like, sparse matrix}, shape = [n_samples, n_features]

Returns: (Index of the cluster each sample belongs to)  

labels : array, shape [n_samples,]

あなたが提出したコードに関する私が問題にしているのは、

train_test_split()

これは、データセット内のランダムな行の2つの配列を返し、データセットの順序を事実上台無しにして、KMeans分類から返されたラベルをデータセット内の連続する日付に関連付けることを困難にします。


次に例を示します。

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans

#read data into pandas dataframe
df = pd.read_csv('household_power_consumption.txt', delimiter=';')

Raw Dataset head

#convert merge date and time colums and convert to datetime objects
df['Datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])
df.set_index(pd.DatetimeIndex(df['Datetime'],inplace=True))
df.drop(['Date','Time'], axis=1, inplace=True)

#put last column first
cols = df.columns.tolist()
cols = cols[-1:] + cols[:-1]
df = df[cols]
df = df.dropna()

preprocessed dates

#convert dataframe to data array and removes date column not to be processed, 
sliced = df.iloc[0:, 1:8].dropna()
hpc = sliced.values

k_means = KMeans()
k_means.fit(hpc)

# array of indexes corresponding to classes around centroids, in the order of your dataset
classified_data = k_means.labels_

#copy dataframe (may be memory intensive but just for illustration)
df_processed = df.copy()
df_processed['Cluster Class'] = pd.Series(classified_data, index=df_processed.index)

Finished


  • これで、右側のデータセットと一致する結果を確認できます。
  • 分類されたので、意味を引き出すのはあなた次第です。
  • これは、最初から最後まで、どのように使用できるかを示す良い全体的な例です。
  • 結果を表示したり、PCAを確認したり、クラスに応じて他のグラフを作成したりします。
9
flow