Xử Lý Dữ Liệu Khiếm Khuyết Trong Dữ Liệu Chuỗi Thời Gian Sử Dụng Phương Pháp Linear Regression - Machine Learning Techniques for Mising Data in Time-Serials Using Liner Regression

Dữ liệu bị thiếu trong phân tích chuỗi thời gian là một thách thức phổ biến, thường xảy ra do cảm biến hỏng, lỗi truyền dữ liệu hoặc các vấn đề bảo trì. Những khoảng trống trong dữ liệu này có thể làm gián đoạn dự báo và làm lệch kết quả phân tích, khiến cho thông tin trở nên không đáng tin cậy.

Các kỹ thuật đơn giản như forward fill hoặc interpolation thường là giải pháp mặc định để xử lý dữ liệu thiếu. Tuy nhiên, khi đối mặt với các mẫu dữ liệu phức tạp, xu hướng phi tuyến tính hoặc độ biến thiên cao, các phương pháp này thường thất bại và tạo ra kết quả không ổn định.

Sử Dụng Học Máy Cho Việc tái tạo Dữ Liệu Thiếu Trong Chuỗi Thời Gian

Học máy (ML) cung cấp một phương pháp mạnh mẽ để tái tạo dữ liệu thiếu bằng cách nhận diện các mẫu và mối quan hệ trong dữ liệu. Khác với các phương pháp truyền thống thường dựa vào các giả định về xu hướng tuyến tính, học máy có thể phát hiện các mối quan hệ phi tuyến tính và đa biến phức tạp, dẫn đến việc tái tạo dữ liệu thiếu chính xác hơn.

Khi Nào sử dụng học máy

1. Mẫu dữ liệu Phi Tuyến Tính:

Các phương pháp truyền thống thường giả định rằng dữ liệu có xu hướng tuyến tính, nhưng nhiều bộ dữ liệu chuỗi thời gian thực tế có các mẫu phi tuyến mà các phương pháp này không thể nắm bắt. Các thuật toán học máy có thể học và mô hình hóa những mẫu phức tạp này, cải thiện độ chính xác của việc tái tạo dữ liệu thiếu.

2. Bộ Dữ Liệu Có Nhiều Chiều:

Khi làm việc với các bộ dữ liệu có nhiều đặc trưng hoặc biến số, các phương pháp tái tạo dữ liệu truyền thống có thể gặp khó khăn. Các kỹ thuật học máy có thể tận dụng các đặc trưng bổ sung trong bộ dữ liệu có nhiều chiều, giúp tái tạo dữ liệu thiếu hiệu quả hơn bằng cách xem xét đồng thời nhiều biến.

3. Khoảng Trống Lớn Trong Dữ Liệu:

Đối với các bộ dữ liệu có khoảng trống lớn, các phương pháp đơn giản như tái tạo giá trị trước có thể không đủ hiệu quả. Học máy có thể học được xu hướng tổng thể và các mẫu trong dữ liệu, giúp tái tạo các khoảng trống lớn một cách có ý nghĩa và chính xác hơn.

4. Dữ Liệu bị Thiếu Không Ngẫu Nhiên:

Trong các trường hợp dữ liệu thiếu không ngẫu nhiên (MNAR), các phương pháp tái tạo dữ liệu truyền thống, vốn giả định rằng dữ liệu thiếu là ngẫu nhiên, có thể dẫn đến kết quả sai lệch. Các phương pháp học máy có thể học cách xử lý những sai lệch này bằng cách hiểu các mối quan hệ tiềm ẩn trong dữ liệu, làm cho chúng trở nên mạnh mẽ và chính xác hơn.

5. Tính Chắc Chắn:

  • Các phương pháp học máy thường mạnh mẽ hơn, đặc biệt khi dữ liệu có các mẫu phức tạp hoặc dữ liệu thiếu tuân theo các cơ chế không xác định. Chúng có thể thích nghi với các loại dữ liệu thiếu khác nhau, giúp xử lý các nhiệm vụ tái tạo dữ liệu thiếu trong chuỗi thời gian đầy thử thách.

Những Đánh Đổi khi sử dụng học máy thay cho các phương pháp truyền thống:

Mặc dù các phương pháp học máy thường mang lại kết quả chính xác hơn, nhưng chúng yêu cầu nhiều tài nguyên tính toán hơn so với các phương pháp truyền thống. Tuy nhiên, tính linh hoạt và sức mạnh của chúng khiến chúng trở thành lựa chọn lý tưởng để xử lý các nhiệm vụ tái tạo dữ liệu thiếu trong chuỗi thời gian, nơi độ chính xác là yếu tố quan trọng.

Ngữ cảnh, chẩn bị dữ liệu giả lập

Mô tả dữ liệu:

  • Một chuỗi thời gian từ ngày 1 tháng 1 năm 2025 đến ngày 30 tháng 4 năm 2025 được tạo ra với các khoảng thời gian 10 phút.
  • chuỗi thời gian có chu kỳ ngày-đêm: cao vào ban ngày (từ 6 AM đến 6 PM) và thấp vào ban đêm.

Mô tả Dữ Liệu Thiếu:

  • 10% giá trị năng lượng được chọn ngẫu nhiên và thay thế bằng NaN để mô phỏng dữ liệu bị thiếu.

Code mẫu bằng python

 1import pandas as pd
 2import numpy as np
 3from datetime import datetime
 4import matplotlib.pyplot as plt
 5
 6# Simulate mock energy production dataset
 7def simulate_energy_data(start_date, end_date, freq='10min'):
 8    # Create a datetime index with 10-minute intervals
 9    datetime_index = pd.date_range(start=start_date, end=end_date, freq=freq)
10
11    # Simulate energy production with day-night cycles
12    np.random.seed(42)  # For reproducibility
13    hours = datetime_index.hour
14    day_energy = np.random.normal(loc=300, scale=30, size=len(hours))
15    night_energy = np.random.normal(loc=50, scale=15, size=len(hours))
16    energy_values = np.where((hours >= 6) & (hours <= 18), day_energy, night_energy)
17
18    # Introduce missing values (10% of the dataset)
19    num_missing = int(0.1 * len(energy_values))  # 10% of data will be missing
20    missing_indices = np.random.choice(len(energy_values), num_missing, replace=False)
21    energy_values[missing_indices] = np.nan  # Set randomly selected indices to NaN
22
23    # Create DataFrame with the simulated energy data
24    energy_data = pd.DataFrame({
25        'Datetime': datetime_index,
26        'Energy_Production': energy_values
27    })
28
29    return energy_data
30
31
32def plot_origin_data(energy_data_with_missing):
33    plt.figure(figsize=(24, 6))
34    plt.plot(energy_data_with_missing['Datetime'], energy_data_with_missing['Energy_Production'], label='Energy Production')
35    plt.xlabel('Datetime')
36    plt.ylabel('Energy Production')
37    plt.title('Simulated Energy Production Over Time')
38    plt.legend()
39
40    plt.grid(True)
41    plt.show()
42# Main script
43if __name__ == "__main__":
44    start_date = datetime(2025, 1, 1)
45    end_date = datetime(2025, 4, 40)
46
47    # Generate the simulated dataset
48    energy_data_with_missing = simulate_energy_data(start_date, end_date)
49
50    # Display the first few rows of the dataset
51    print(energy_data_with_missing.head())
52
53
54    plot_origin_data(energy_data_with_missing)

Hình ảnh mô tả dữ liệu mẫu của chuỗi thời gian chu kỳ 10 phút lấy mẫu một lần, với 10% dữ liệu được thay thế thành NA, trong khoảng thời gian từ 1/1/2025 đến 30/4/2025

Phương Pháp tái tạo Dữ Liệu Dựa Trên Hồi Quy

Phương pháp tái tạo dữ liệu dựa trên hồi quy sử dụng các mô hình dự đoán — một lớp thuật toán học máy, chẳng hạn như hồi quy tuyến tính hoặc các bộ hồi quy cây quyết định — để ước tính giá trị từ các mối quan hệ đã biết giữa các đặc trưng khác hoặc các mẫu thời gian, như giá trị trễ trong chuỗi thời gian.

Mô hình tái tạo vào các khoảng trống bằng cách sử dụng các xu hướng và mối quan hệ tiềm ẩn đã học từ dữ liệu.

Ở bài viết này, chúng ta sẽ tìm hiểu cách tái tạo dữ liệu bị thiếu sử dụng mô hình hồi quy tuyến tính với thư viện LinearRegression của sklearn

 1
 2from sklearn.linear_model import LinearRegression
 3
 4# Impute missing values using linear regression
 5def impute_missing_values(data):
 6    # Extract the non-missing data
 7    non_missing_data = data.dropna()
 8
 9    # Prepare the features (X) and target (y)
10    X = non_missing_data.index.values.reshape(-1, 1)
11    y = non_missing_data['Energy_Production'].values
12
13    # Fit the linear regression model
14    model = LinearRegression()
15    model.fit(X, y)
16
17    # Predict the missing values
18    missing_data = data[data['Energy_Production'].isna()]
19    X_missing = missing_data.index.values.reshape(-1, 1)
20    predicted_values = model.predict(X_missing)
21
22    # Create a DataFrame for the imputed data
23    imputed_data = data.copy()
24    imputed_data.loc[data['Energy_Production'].isna(), 'Energy_Production'] = predicted_values
25
26    return imputed_data
27
28
29def plot_full_data(energy_data_imputed,energy_data_with_missing):
30    plt.figure(figsize=(24, 6))
31
32    plt.plot(energy_data_imputed['Datetime'], energy_data_imputed['Energy_Production'], label='Imputed Data', color='blue' )
33    plt.plot(energy_data_with_missing['Datetime'], energy_data_with_missing['Energy_Production'], label='Original Data', color='red')
34    plt.xlabel('Datetime')
35    plt.ylabel('Energy Production')
36    plt.title('Simulated Energy Production Over Time (Original vs Imputed)')
37    plt.legend()
38    plt.grid(True)
39    plt.show()
40
41# Main script
42if __name__ == "__main__":
43
44    start_date = datetime(2024, 1, 1)
45    end_date = datetime(2024, 4, 30)
46
47    # Generate the simulated dataset
48    energy_data_with_missing = simulate_energy_data(start_date, end_date)
49
50
51    plot_origin_data(energy_data_with_missing)
52
53
54    # Impute the missing values
55    energy_data_imputed = impute_missing_values(energy_data_with_missing.copy())
56
57    # Display the first few rows of the dataset
58    print(energy_data_imputed.head())
59
60    plot_full_data(energy_data_imputed,energy_data_with_missing)

Đồ thị trực quan hoá missing data sử dụng regression

Code đơn giản phải không các bạn, nhìn vào đồ thị thì chúng ta tháy rằng xu hướng của missing data đã giống gần như i sì với xu hướng của dữ liệu gốc rồi đó.

Mặc dù chúng ta có thể quan sát rằng các giá trị tái tạo theo xu hướng chung của dữ liệu gốc, nhưng điều này không đủ để đánh giá mức độ hiệu quả của phương pháp tái tạo dữ liệu. Chúng ta cần đưa ra các phương pháp định lượng để chứng minh mô hình này ổn, ở mức chấp nhận được

Đánh giá hiệu quả của việc tái tạo dữ liệu

1.Statistical Comparison - So sánh thống kê

So sánh các chỉ số thống kê (trung bình, độ lệch chuẩn, giá trị nhỏ nhất, giá trị lớn nhất) để đảm bảo dữ liệu tái tạo phù hợp với phân phối dữ liệu gốc.

 1
 2# Statistical comparison function using describe
 3def statistical_comparison(original_data, imputed_data):
 4    original_stats = original_data['Energy_Production'].describe()
 5    imputed_stats = imputed_data['Energy_Production'].describe()
 6    comparison = pd.DataFrame({
 7        'Metric': original_stats.index,
 8        'Original Data': original_stats.values,
 9        'Imputed Data': imputed_stats.values
10    })
11    return comparison
12
13comparison = statistical_comparison(energy_data_with_missing.dropna(), energy_data_imputed)
14print(comparison)

Kết quả

1  Metric  Original Data  Imputed Data
20  count   15553.000000  17281.000000
31   mean     185.155737    185.155865
42    std     127.062030    120.541640
53    min     -16.984058    -16.984058
64    25%      51.260972     53.436820
75    50%     257.313693    185.404682
86    75%     302.393653    298.653209
97    max     415.581945    415.581945

Từ bảng so sánh thống kê ở trên , chúng ta có thể rút ra những kết luận sau:

Số Lượng (Count): Bộ dữ liệu tái tạo chứa nhiều điểm dữ liệu hơn, 17281, so với bộ dữ liệu gốc, 15553, do việc tái tạo các giá trị thiếu để đảm bảo dữ liệu đầy đủ.

Trung Bình (Mean): Trung bình của dữ liệu tái tạo là 185.1558, gần giống với giá trị trung bình của dữ liệu gốc 185.1557, điều này có nghĩa là xu hướng trung tâm của dữ liệu đã được duy trì trong quá trình tái tạo dữ liệu.

Độ Lệch Chuẩn (Standard Deviation): Dữ liệu tái tạo có sự phân tán thấp hơn (độ lệch chuẩn = 120.54 so với 127.06 của dữ liệu gốc). Điều này có thể cho thấy rằng trong quá trình tái tạo dữ liệu, các giá trị đã trở nên mượt mà hơn, giảm bớt sự phân tán. Hồi quy tuyến tính đã làm “phép màu dự đoán” của mình bằng cách luôn trả về các giá trị gần với trung bình.

Giá Trị Tối Thiểu và Tối Đa: Giá trị tối thiểu (-16.984058) và tối đa (415.581945) là giống nhau, điều này gợi ý rằng quá trình tái tạo dữ liệu không tạo ra các giá trị ngoại lai cực đoan hoặc không đi ra ngoài phạm vi của dữ liệu gốc.

Các Phân Vị (Quartiles 25%, 50%, 75%):

  • Phân vị thứ 25 (quartile thấp) cao hơn một chút trong dữ liệu tái tạo , 53.43 so với 51.26 của dữ liệu gốc, cho thấy các giá trị tái tạo đã lấp đầy nhiều khoảng trống ở phạm vi thấp.
  • Trung vị (50%) đã thay đổi đáng kể từ 257.31 trong dữ liệu gốc thành 185.40 trong dữ liệu tái tạo , cho thấy các giá trị tái tạo đã giảm độ lệch dữ liệu của các phần tử dữ liệu cao.
  • Phân vị thứ 75 (quartile cao) 302.39 và 298.65 , gần như tương đương nhau, phản ánh rằng các giá trị cao đã được bảo tồn tốt.

Kết luận: Phương pháp hồi quy tuyến tính đã bảo tồn phân phối tổng thể và phạm vi của dữ liệu, trong khi làm giảm sự biến thiên và làm mượt dữ liệu một chút.

2.Autocorrelation

Kiểm tra xem tự tương quan của chuỗi có được duy trì sau khi tái tạo dữ liệu hay không.

1
2
3# Autocorrelation analysis function
4def autocorrelation_analysis(original_data, imputed_data):
5    fig, axes = plt.subplots(1, 2, figsize=(15, 6))
6    plot_acf(original_data['Energy_Production'].dropna(), ax=axes[0], title='ACF of Original Data')
7    plot_acf(imputed_data['Energy_Production'], ax=axes[1], title='ACF of Imputed Data')
8    plt.tight_layout()
9    plt.show()

đồ thị Autocorrelation so sánh giữa data gốc và data tái tạo

Quan sát đồ thị ACF trên, chúng ta có thể rút ra các ý chính sau

Bảo Tồn Các Phụ Thuộc - Preservation of Temporal Dependencies:

Hình dạng và sự suy giảm của ACF trong dữ liệu tái tạo có sự tương đồng đáng kể với dữ liệu gốc. Điều này cho thấy rằng các phụ thuộc thời gian đã được bảo tồn khá tốt sau quá trình tái tạo dữ liệu.

Hiệu Ứng Làm Mịn - Slight Smoothing Effect:

ACF trên dữ liệu tái tạo cho thấy giá trị ở một số độ trễ (lags) thấp hơn so với dữ liệu gốc. Điều này có thể là do mô hình hồi quy tuyến tính làm mịn các cực trị, dẫn đến giảm nhẹ mức độ biến động.

Các Mẫu Chu Kỳ Trong ACF - Cyclic Patterns:

Các đỉnh chu kỳ trong ACF, chẳng hạn như tính mùa vụ hàng ngày, dường như được duy trì giữa dữ liệu gốc và dữ liệu tái tạo . Điều này cho thấy rằng quá trình tái tạo dữ liệu đã bảo tồn các hành vi tuần hoàn trong tập dữ liệu.

Tính Ổn Định Chung:

Sự tương đồng giữa hai biểu đồ ACF là một dấu hiệu tích cực, cho thấy phương pháp tái tạo dữ liệu bằng hồi quy tuyến tính đã giữ lại tốt cấu trúc cốt lõi trong dữ liệu.

Kết Luận:

Phương pháp hồi quy tuyến tính không chỉ bảo tồn mối liên hệ thời gian trong dữ liệu mà còn duy trì các mẫu chu kỳ, mặc dù có một chút hiệu ứng làm mịn.

3. Phân tích xu hướng và mùa vụ - STL Decomposition (Trend and Seasonality)

So Sánh Xu Hướng (Trend Comparison)

 1
 2# STL decomposition function to extract and plot trend component
 3def stl_decomposition_trend(original_data, imputed_data, period):
 4    stl_original = STL(original_data['Energy_Production'] , period=period)
 5    result_original = stl_original.fit()
 6    trend_original = result_original.trend
 7
 8    stl_imputed = STL(imputed_data['Energy_Production'], period=period)
 9    result_imputed = stl_imputed.fit()
10    trend_imputed = result_imputed.trend
11
12    plt.figure(figsize=(24, 6))
13    plt.plot(original_data['Datetime'], trend_original, label='Trend of Original Data', color='red')
14    plt.plot(imputed_data['Datetime'], trend_imputed, label='Trend of Imputed Data', color='blue')
15    plt.xlabel('Datetime')
16    plt.ylabel('Trend')
17    plt.title('STL Decomposition Trend of Original and Imputed Data')
18    plt.legend()
19    plt.grid(True)
20    plt.show()
21
22stl_decomposition_trend(energy_data_with_missing.dropna(), energy_data_imputed, period=144)  # Daily seasonality (144 10-min intervals in a day)

đồ thị trực quan hoá Trend data sử dụng linear regression

  • Bảo Tồn Xu Hướng Dài Hạn:

    Đường Xu hướng tái tạo (màu xanh dương) nhìn chung phù hợp với xu hướng gốc (màu đỏ), cho thấy phương pháp tái tạo hồi quy tuyến tính đã bảo tồn được chuyển động dài hạn trong dữ liệu.

  • Hiệu Ứng Làm Mịn:

    Đường Xu hướng tái tạo mượt mà hơn so với xu hướng gốc, đặc biệt ở những nơi xu hướng gốc có nhiều biến động. Điều này là đặc điểm của hồi quy tuyến tính, vốn có xu hướng không phản ánh tốt các biến động mạnh và làm mịn các cực trị.

So Sánh Tính Mùa Vụ (Seasonality Comparison)

 1
 2
 3def stl_decomposition_seasonality(original_data, imputed_data, period):
 4    stl_original = STL(original_data['Energy_Production'], period=period)
 5    result_original = stl_original.fit()
 6    seasonality_original = result_original.seasonal
 7
 8    stl_imputed = STL(imputed_data['Energy_Production'], period=period)
 9    result_imputed = stl_imputed.fit()
10    seasonality_imputed = result_imputed.seasonal
11
12    plt.figure(figsize=(24, 6))
13    plt.plot(original_data['Datetime'], seasonality_original, label='Seasonality of Original Data', color='red')
14    plt.plot(imputed_data['Datetime'], seasonality_imputed, label='Seasonality of Imputed Data', color='blue')
15    plt.xlabel('Datetime')
16    plt.ylabel('Seasonality')
17    plt.title('STL Decomposition Seasonality of Original and Imputed Data')
18    plt.legend()
19    plt.grid(True)
20    plt.show()
21stl_decomposition_seasonality(energy_data_with_missing.dropna(), energy_data_imputed, period=144)  # Daily seasonality (144 10-min intervals in a day)

đồ thị trực quan hoá Seasonality data sử dụng linear regression

  • Bảo Tồn tính Chu Kỳ:

    Đường mùa vụ tái tạo thể hiện ra các mẫu chu kỳ tương đối gần giống với chu kỳ của đường mùa vụ gốc, phản ánh rằng dữ liệu các chu kỳ sản xuất ngày-đêm đã được duy trì khá tốt.

  • Giảm Biên Độ Chu Kỳ:

    Biên độ của đường mùa vụ tái tạo bị giảm nhẹ so với gốc, đặc biệt tại các đỉnh và đáy. Điều này cho thấy quá trình tái tạo dữ liệu đã làm cho các biến động chu kỳ ở cực trị trở nên ít mạnh mẽ hơn.

Hạn Chế Của tái tạo Dữ Liệu Bằng linear regression

Làm Mịn Các cực trị:

  • Từ so sánh thống kê, độ lệch chuẩn thấp hơn ở dữ liệu tái tạo cho thấy tính biến động đã bị giảm.

  • Từ so sánh xu hướng, xu hướng tái tạo mượt hơn và thiếu một số biến động gốc trong các mẫu dài hạn.

Giả Định Tuyến Tính:

  • Hiệu ứng làm mịn trong so sánh xu hướng cho thấy phương pháp này khó bắt kịp các thay đổi phi tuyến tính trong dữ liệu, đặc biệt tại các giai đoạn có sự thay đổi đột ngột.

Giảm Biên Độ Mùa Vụ:

  • So sánh tính mùa vụ cho thấy biên độ chu kỳ tái tạo thấp hơn so với gốc, với các đỉnh và đáy bị làm mịn. Điều này phù hợp với xu hướng của hồi quy trong việc kéo các giá trị cực đoan về trung bình.

Kết luận

Phương pháp tái tạo hồi quy tuyến tính bảo tồn được các xu hướng tổng thể và các mẫu chu kỳ, nhưng làm giảm tính biến động và làm mịn các giá trị cực đoan. Ngoài ra, nó thể hiện sự giảm nhẹ cường độ của các chu kỳ mùa vụ, điều này được phản ánh trong cả phân tích thống kê và phân rã dữ liệu.

Cảm ơn các bạn đã theo dõi bài viết. Xin cảm ơn và hẹn gặp lại.

Tài liệu tham khảo

https://www.geeksforgeeks.org/managing-missing-data-in-linear-regression/

https://towardsdatascience.com/missing-data-in-time-series-machine-learning-techniques-6b2273ff8b45

https://www.geeksforgeeks.org/dataset-for-linear-regression/

https://www.geeksforgeeks.org/ml-handling-missing-values/

https://codezup.com/mastering-linear-regression-time-series-forecasting/

Comments