#Sự kiện ngày hôm nay: Phân tích chuỗi thời gian về nhu cầu thực phẩm và giảm lãng phí thực phẩm
Trong bài viết này, tác giả Vitor Cerqueira đã thực hiện phân tích nhóm chuỗi thời gian về nhu cầu thực phẩm và giới thiệu cách giảm lãng phí thực phẩm bằng cách phân cụm. Bài viết mã đầy đủ đã được chia sẻ trên Github.
Trong quá trình phân tích, tác giả đã sử dụng tập dữ liệu về doanh số bán thực phẩm hàng tuần ở Hoa Kỳ được Bộ Nông nghiệp Hoa Kỳ thu thập. Tập dữ liệu này chứa thông tin về doanh số bán thực phẩm theo danh mục sản phẩm và danh mục phụ. Tác giả đã phân chia chuỗi thời gian theo tiểu bang và sử dụng tổng doanh số bán hàng quốc gia trong từng thời kỳ để thực hiện phân tích.
Để phân tích chuỗi thời gian, tác giả đã sử dụng cách tiếp cận dựa trên tính năng để phân cụm chuỗi thời gian. Quá trình bao gồm hai bước chính là tóm tắt mỗi chuỗi thời gian thành một tập hợp các tính năng và áp dụng thuật toán phân cụm thông thường cho bộ tính năng. Tác giả đã sử dụng thư viện tsfel để trích xuất tính năng chuỗi thời gian.
Sau khi tiền xử lý một tập dữ liệu, tác giả đã sử dụng thuật toán K-means để phân cụm chuỗi thời gian. Tác giả đã thực hiện quy trình lựa chọn tính năng bằng cách chuẩn hóa, lựa chọn theo phương sai và theo tương quan để loại bỏ các tính năng dư thừa.
Tác giả cũng đã sử dụng phương pháp phân cụm theo thứ bậc để giải quyết vấn đề phân cụm chuỗi thời gian. Kết quả của mô hình phân cụm theo thứ bậc được hiển thị rõ nhất với biểu đồ dendrogram.
Bài viết của tác giả Vitor Cerqueira là một ví dụ tốt về cách sử dụng phân tích chuỗi thời gian để giảm lãng phí thực phẩm và cũng giúp chúng ta hiểu hơn về nhu cầu thực phẩm. #phan_tich_chuoi_thoi_gian #giảm_lãng_phí_thực_phẩm #dendrogram #K-Means
bản tin
Sed ut perspiciatis unde.
Trong phần còn lại của bài viết này, chúng ta sẽ thực hiện phân tích nhóm chuỗi thời gian về nhu cầu thực phẩm. Bạn sẽ học cách:
- tóm tắt một tập hợp các chuỗi thời gian bằng cách sử dụng trích xuất tính năng;
- sử dụng K-Means và phương pháp phân cấp để phân cụm chuỗi thời gian.
Mã đầy đủ có sẵn trên Github:
tập dữ liệu
Chúng tôi sẽ sử dụng chuỗi thời gian bán hàng thực phẩm hàng tuần do Bộ Nông nghiệp Hoa Kỳ thu thập. Tập dữ liệu này chứa thông tin về doanh số bán thực phẩm theo danh mục sản phẩm và danh mục phụ. Chuỗi thời gian được phân chia theo tiểu bang, nhưng chúng tôi sẽ sử dụng tổng doanh số bán hàng quốc gia trong từng thời kỳ.
Dưới đây là một mẫu của tập dữ liệu:
Đây là toàn bộ dữ liệu trông như thế nào:
Phân cụm chuỗi thời gian dựa trên tính năng
Chúng tôi sẽ sử dụng cách tiếp cận dựa trên tính năng để phân cụm chuỗi thời gian. Quá trình này bao gồm hai bước chính:
- Tóm tắt mỗi chuỗi thời gian thành một tập hợp các tính năng, chẳng hạn như giá trị trung bình;
- Áp dụng thuật toán phân cụm thông thường cho bộ tính năng, chẳng hạn như K-means.
Hãy thực hiện lần lượt từng bước.
Trích xuất tính năng bằng cách sử dụng tsfel
Chúng tôi bắt đầu bằng cách trích xuất một bộ số liệu thống kê để tóm tắt từng chuỗi thời gian. Mục tiêu là chuyển đổi từng chuỗi thành một tập hợp các tính năng nhỏ.
Có một số công cụ để trích xuất tính năng chuỗi thời gian. chúng tôi sẽ sử dụng tsfel, cung cấp một hiệu suất cạnh tranh so với các phương pháp khác (3).
Đây là cách bạn có thể sử dụng tsfel:
import pandas as pd
import tsfel# get configuration
cfg = tsfel.get_features_by_domain()
# extract features for each food subcategory
features = col: tsfel.time_series_features_extractor(cfg, data(col))
for col in data
features_df = pd.concat(features, axis=0)
Quá trình này dẫn đến một số lượng lớn các tính năng. Một số trong số này có thể dư thừa, vì vậy chúng tôi thực hiện quy trình lựa chọn tính năng.
Dưới đây, chúng tôi áp dụng ba thao tác cho bộ tính năng:
- chuẩn hóa: chuyển đổi các biến thành phạm vi giá trị 0–1;
- lựa chọn theo phương sai: loại bỏ bất kỳ biến nào có phương sai bằng 0;
- lựa chọn theo tương quan: loại bỏ bất kỳ biến nào có tương quan cao với biến hiện có khác.
from sklearn.preprocessing import MinMaxScaler
from sklearn.feature_selection import VarianceThreshold
from src.correlation_filter import correlation_filter# normalizing the features
features_norm_df = pd.DataFrame(MinMaxScaler().fit_transform(features_df),
columns=features_df.columns)
# removing features with 0 variance
min_var = VarianceThreshold(threshold=0)
min_var.fit(features_norm_df)
features_norm_df = pd.DataFrame(min_var.transform(features_norm_df),
columns=min_var.get_feature_names_out())
# removing correlated features
features_norm_df = correlation_filter(features_norm_df, 0.9)
features_norm_df.index = data.columns
Phân cụm với K-Means
Sau khi tiền xử lý một tập dữ liệu, chúng tôi sẵn sàng phân cụm chuỗi thời gian. Chúng tôi tóm tắt từng chuỗi thành một nhóm nhỏ các tính năng không theo thứ tự. Vì vậy, chúng ta có thể sử dụng bất kỳ thuật toán thông thường nào để phân cụm. Một lựa chọn phổ biến là K-means.
Với K-means, chúng ta cần chọn số lượng cụm chúng ta muốn. Trừ khi chúng tôi có một số kiến thức về miền, không có giá trị tiên nghiệm rõ ràng nào cho tham số này. Tuy nhiên, chúng ta có thể thực hiện cách tiếp cận dựa trên dữ liệu để chọn số lượng cụm. Chúng tôi kiểm tra các giá trị khác nhau và chọn giá trị tốt nhất.
Dưới đây, chúng tôi kiểm tra K-means với tối đa 24 cụm. Sau đó, chúng tôi chọn số lượng cụm tối đa hóa điểm bóng. Số liệu này định lượng sự gắn kết của các cụm thu được.
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_scorekmeans_parameters =
'init': 'k-means++',
'n_init': 100,
'max_iter': 50,
n_clusters = range(2, 25)
silhouette_coef = ()
for k in n_clusters:
kmeans = KMeans(n_clusters=k, **kmeans_parameters)
kmeans.fit(features_norm_df)
score = silhouette_score(features_norm_df, kmeans.labels_)
silhouette_coef.append(score)
Điểm bóng được tối đa hóa cho 5 cụm như trong hình bên dưới.
Chúng ta có thể vẽ một biểu đồ tọa độ song song để hiểu cấu hình của từng cụm. Đây là một ví dụ với một mẫu gồm ba tính năng:
Chúng tôi cũng có thể sử dụng thông tin về các cụm để cải thiện các mô hình dự báo nhu cầu. Ví dụ, bằng cách xây dựng một mô hình cho mỗi cụm. Bài viết trong tài liệu tham khảo (5) là một ví dụ tốt về cách tiếp cận này.
phân cụm theo thứ bậc
Phân cụm theo thứ bậc là một giải pháp thay thế cho K-mean. Nó kết hợp các cặp cụm lặp đi lặp lại, dẫn đến cấu trúc giống như cây. Thư viện scipy cung cấp một triển khai cho phương pháp này.
import scipy.cluster.hierarchy as shc# hierarchical clustering using the ward method
clustering = shc.linkage(features_norm_df, method='ward')
# plotting the dendrogram
dend = shc.dendrogram(clustering,
labels=categories.values,
orientation='right',
leaf_font_size=7)
Kết quả của mô hình phân cụm theo thứ bậc được hiển thị rõ nhất với biểu đồ dendrogram:
Chúng ta có thể sử dụng dendrogram để hiểu cấu hình của các cụm. Ví dụ, chúng ta có thể thấy rằng hầu hết các mặt hàng đóng hộp đều được phân nhóm (màu cam). Cam cũng kết hợp với hỗn hợp bánh kếp / bánh ngọt. Hai món này thường đi cùng nhau trong bữa sáng của mọi người.
[ad_2]