用机器学习k均值聚类算法解析用电量

机器学习在能源领域有着广泛的应用。在本文中,我将向您展示如何使用K-means聚类算法在单个家庭的日常负载概要中找到常见模式。

该数据集包含了从2006年12月到2010年11月(47个月)收集的2075259个测量值。你可以在这里找到:https://archive.ics.uci.edu/ml/datasets/individual+household+electric+power+consumption

首先,让我们整理一下聚类算法的数据

Python代码如下:

%matplotlib inline
 
import pandas as pd
import matplotlib.pyplot as plt
 
plt.style.use('seaborn')
 
data_path = 'data/household_power_consumption.txt'
cols_to_use = ['Date', 'Time','Global_active_power']
 
df_uci = pd.read_csv(data_path, sep=';', usecols=cols_to_use)
 
# this takes a while
df_uci['datetime'] = pd.to_datetime(df_uci['Date'] + ' '+ df_uci['Time'])
df_uci = df_uci.drop(['Date','Time'], axis=1)
df_uci = df_uci.set_index('datetime')
 
df_uci = df_uci.replace('?', np.nan)
 
df_uci['Global_active_power'] = df_uci['Global_active_power'].astype(float).fillna(method='ffill')
 
# For simplication, I'm going to resample the data into daily granularity. 
df_uci_hourly = df_uci.resample('H').sum()
df_uci_hourly['hour'] = df_uci_hourly.index.hour
df_uci_hourly.index = df_uci_hourly.index.date
 
# this create a dataframe where each row is a complete day
# and the columns the hours of the day (1 to 24)
df_uci_pivot = df_uci_hourly.pivot(columns='hour')
df_uci_pivot = df_uci_pivot.dropna()

用机器学习k均值聚类算法解析用电量

通过观察较暗的区域(更多的曲线被集中),可以看到一些清晰的能量行为模式。

使用K-means进行聚类

K-means是一种无监督的机器学习算法,其中必须先定义clusters的数量。这留下了要挑选多少clusters的问题。

解决此问题的常用方法是使用silhouette值。它衡量一个点与其自己的cluster相比与其他clusters的相似程度。它的范围是-1到1,其中一个高值表示一个点与它所属的cluster匹配良好。

我们采用所有样本的silhouette的平均值,以便全面了解算法的执行情况。

在下面的Python代码中,我尝试不同的clusters值(从2到19)在相同的范围内对每个周期进行缩放是很重要的,这样能量负荷的大小就不会干扰cluster的选择。

from sklearn.cluster import KMeans
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import silhouette_score
 
sillhoute_scores = []
n_cluster_list = np.arange(2,20)
for n_cluster in n_cluster_list:
 
 kmeans = KMeans(n_clusters=n_cluster)
 
 X = df_uci_pivot.copy()
 sc = MinMaxScaler()
 X = sc.fit_transform(X)
 
 res = kmeans.fit_predict(X)
sillhoute_scores.append(silhouette_score(X, kmeans.labels_))

用机器学习k均值聚类算法解析用电量

当只有2个clusters时,会出现最大平均silhouette。让我们看看它们在单独绘制时的外观:

用机器学习k均值聚类算法解析用电量

两个clusters中的负载之间的主要差异似乎是下午时段的能耗。cluster0可能包含指向工作日的负载,cluster1包含周末负载。

使用t-SNE验证结果

我们可以验证聚类算法结果的一种方法是使用一种降维方法来绘制2D平面中的点。然后,我们可以根据它们所属的cluster对点进行着色。

用于此目的的流行算法称为t-SNE。

需要记住的是,t-SNE对clusters一无所知。Python代码如下:

from sklearn.manifold import TSNE
import matplotlib.colors
 
tsne = TSNE()
res_tnse = tsne.fit_transform(X)
 
cmap = matplotlib.colors.LinearSegmentedColormap.from_list(cluster_values, color_list)
 
plt.figure(figsize=(10,10))
 
plt.scatter(
 res_tnse[:,0], 
 res_tnse[:,1],
 c=df_uci_pivot.index.get_level_values('cluster'),
 cmap=cmap, alpha=0.6
)

用机器学习k均值聚类算法解析用电量

由k-means指定的簇组成的日能量负荷的t-SNE

在上面的图中,每个点代表一个每日负载概要。样品从24维降为2维。接近的点似乎与k-means算法分配的clusters重合。

最后

在本文中,我向您展示了如何使用机器学习k-means算法对每日负载配置文件进行聚类。我们使用silhouette分数来找到最佳clusters数和t-SNE以验证结果。

相关推荐