用机器学习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-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_))
当只有2个clusters时,会出现最大平均silhouette。让我们看看它们在单独绘制时的外观:
两个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-means指定的簇组成的日能量负荷的t-SNE
在上面的图中,每个点代表一个每日负载概要。样品从24维降为2维。接近的点似乎与k-means算法分配的clusters重合。
最后
在本文中,我向您展示了如何使用机器学习k-means算法对每日负载配置文件进行聚类。我们使用silhouette分数来找到最佳clusters数和t-SNE以验证结果。