DataWhale AI 여름 캠프 - 기계 학습

학습 기록 1

리튬 배터리 생산 매개변수 규제 및 생산 온도 예측 과제

환경이 구성되고, 기준선이 실행되었으며, 이를 기반으로 간단한 데이터 분석이 수행되었습니다.

1. 이상치 분석

훈련 세트의 누락된 값과 이상값을 분석합니다.

train_data.info()  
train_data.describe()

데이터에 누락된 값과 이상값이 없는지 확인합니다 train_dataset['下部温度9'] == -32768.000000]. 누락된 값을 제거합니다.

train_dataset.drop(train_dataset[train_dataset['下部温度9'] == -32768.000000].index).reset_index(drop=True)

2. 일변량 상자 그림 시각화

훈련 세트와 테스트 세트의 유량, 상한 설정 온도, 하한 설정 온도의 데이터 분포를 상자 그림으로 시각화했으며, 상한 설정 온도 데이터와 하한 설정 온도 데이터에 일부 아웃라이어가 있는 것을 관찰할 수 있었습니다
사진 설명을 추가해주세요
. 2023년 1월 7일 데이터, 2023년 1월 8일, 2023년 1월 9일 3일간의 데이터입니다.
사진 설명을 추가해주세요


Baseline(6.29551)을 기반으로 두 가지 변경 사항이 적용되었습니다.

  1. 데이터에서 잘못된 값을 제거했습니다(6.72811).
  2. 2023년 1월 7일, 2023년 1월 8일, 2023년 1월 9일 데이터 삭제(6.73844)

여기에 이미지 설명을 삽입하세요


3. 기능 중요도 분석

다음으로 단일 예측변수에 대한 효율적인 고유분석을 분석하려는 시도가 이루어졌습니다.

  1. 상관 행렬 계산
df = pd.concat([X, y.iloc[:,0]], axis = 1) # X是处理后的训练数据,y是标签
corr_matrix = df.corr()
corr_matrix['上部温度1'].sort_values(ascending=False)
  1. 에 대한 lightgbm기능 중요성
feature_importance = model.feature_importance()
sorted_features = sorted(zip(X.columns, feature_importance), key=lambda x: x[1], reverse=True)

# 打印按照feature_importance值降序排列的特征列表
for feature, importance in sorted_features:
    print(f"{
      
      feature}: {
      
      importance}")

상관행렬은 선형 상관관계를 계산하기 때문에 관찰된 결과는 lightgbm의 특징 중요도 결과와 다소 다릅니다.

다음 단계는 다양한 특성을 구성하고 각 예측 출력 결과에 대한 특성 스크리닝을 수행하는 것입니다.

연구기록 2 (2023.07.27 갱신)

지난 며칠간 주로 Baseline과의 싸움이었는데 모두 실패했습니다. 데이터 수준, 기능 엔지니어링, 데이터 분할 방법 및 후처리에서 시도가 이루어졌습니다.

1. 데이터 플레인

지난번에 찾아낸 데이터에는 결측값(0)과 이상값이 있어 검색을 통해 걸러내고 수정하였습니다. 최근에는 시각화를 통해 거의 모든 특성에 이상치가 존재합니다. 특히 교통 특성에 반영됩니다.

사진 설명을 추가해주세요
위 그림은 학습 데이터의 17개 교통 특성을 선 차트로 나타낸 것으로, 여전히 변동폭이 큰 것을 확인할 수 있습니다.
사진 설명을 추가해주세요
슬라이딩 윈도우 필터링에 중앙값을 사용하여 얻은 결과입니다. 여기서 빨간색 곡선은 테스트 세트를 필터링한 결과입니다.
필터링에 사용되는 코드:

def smooth_t(df, cols):
    df = df.copy()

    window_size = 5
    for col in cols:
        df[f'smoothed_{
      
      col}'] = df[col].rolling(window=window_size, center=True).median()
        outlier_threshold = 5.0
        df['absolute_diff'] = abs(df[col] - df[f'smoothed_{
      
      col}'])
        outliers = df['absolute_diff'] > outlier_threshold
        df.loc[outliers, col] = df.loc[outliers, f'smoothed_{
      
      col}']
        df.drop(columns=[f'smoothed_{
      
      col}', 'absolute_diff'], inplace=True)
    return df

결과 : 필터링된 데이터는 테스트 세트의 MAE를 감소시키지 않습니다.

2. 기능 엔지니어링

주로 세 가지 측면에서:

  1. 교통특성: 특정 시간 범위(1일) 내 분산, 평균, 변동계수를 구성합니다. 그 중 변동계수는 잘 수행되었으며, 트리 모델의 특성 중요도 점수는 원래 트래픽 특성보다 높았지만, 이 특성으로 훈련한 후 테스트 세트에서는 성능이 좋지 않았으며, 기능을 유지하고 삭제하는 것은 여전히 ​​다소 혼란스럽습니다.
  2. 온도 설정 특성: 이러한 특성은 corr 상관에서 대상과 강한 선형 상관 관계를 가지지만 트리 모델의 특성 중요도 평가에서는 성능이 좋지 않으며 값이 상대적으로 안정적이므로 파생 특성을 구성하기가 쉽지 않습니다. 모든 값을 가장 많은 n개 값으로 대체하고 1, 0, -1을 사용하여 전후의 변경 사항을 빌드하는 방식으로 개별 특성으로 빌드해 보았습니다. 그러나 이러한 기능은 제대로 작동하지 않습니다.
  3. 그런 다음 완전 자동 기능 생성기 openFE를 사용해 보았습니다. 효과도 평균입니다.
from openfe import OpenFE, transform, tree_to_formula

ofe = OpenFE()
features = ofe.fit(data = train_x, label = train_y, n_jobs=12) # n_jobs:指定CPU内核数
train_x_feature, test_dataset_feture = transform(train_x, test_x, features[:20], n_jobs = 12)

# 查看前20个高分特征
for feature in ofe.new_features_list[:20]:
    print(tree_to_formula(feature))

3. 데이터 분할 방법

시계열 데이터이기 때문에 train_test_split직접 사용하면 시간 이동이 있기 때문에 시계열 데이터를 사용하는 효과가 매우 좋지 않고, TimeSeriesSplit사용하는 것만 KFold큼 성능도 좋지 않습니다 train_test_split.

4. 후처리

  1. Hillclimbing 라이브러리 - 모델 융합을 위해
    모델 융합을 위한 라이브러리를 찾았는데 현재는 lightgbm만 사용하고 있어서 아직 시도해보지 못했습니다.
!pip install hillclimbers

from hillclimbers import climb, partial

def climb_hill(
    train=None, 
    oof_pred_df=None, 
    test_pred_df=None, 
    target=None, 
    objective=None, 
    eval_metric=None,
    negative_weights=False, 
    precision=0.01, 
    plot_hill=True, 
    plot_hist=False
) -> np.ndarray: # Returns test predictions resulting from hill climbing
  1. 후처리 기술
    흥미로운 처리 기술을 찾았지만 이 데이터 세트에는 적용할 수 없습니다. 그러나 효과도 매우 낮지만 이 아이디어를 사용하여 온도 설정 기능의 개별 인코딩을 구성했습니다.
# 1. 存储target唯一值
unique_targets = np.unique(trian['yield'])
# 2. 完成对训练和测试数据的预测
off_preds = model.prdict(X_val[features])
test_preds += model.predict(test[features]) / n_splits
# 四舍五入到最接近的唯一目标值
off_preds = [min(unique_targets, key = lambda x: abs(x-pred)) for pred in oof_preds]
test_preds = [min(unique_targets, key = lambda x: abs(x-pred)) for pred in test_preds]

연구기록 3 (2023.07.30 갱신)

Yulao의 라이브 방송을 보고 많은 것을 얻었습니다. 이전에는 기능 선택에 많은 시간을 보냈지만 나중에 구성한 기능의 양이 기능 선택의 양과 거리가 멀다는 것을 알게 되었습니다. 그리고 점수가 향상되지 않으면 데이터 분석부터 시작하세요. 따라서 지난 이틀 동안 데이터를 면밀히 분석하여 새로운 발견이 이루어졌습니다.

먼저 훈련 세트에서 매 시간 2022-11-06 09:00:00마다 2023-03-01 04:00:00데이터 기록을 세었습니다.
데이터 예시는 다음과 같습니다.

2022-11-06 09:00:00,40
2022-11-06 10:00:00,47
2022-11-06 11:00:00,46
2022-11-06 12:00:00,47
2022-11-06 13:00:00,47
2022-11-06 14:00:00,48
2022-11-06 15:00:00,47
......

여기에 이미지 설명을 삽입하세요
훈련 세트는 매 시간 데이터의 샘플링 빈도에 따라 5개 부분으로 나뉩니다. 예를 들어, 2022-11-7와 의 데이터 2022-11-8는 시간당 약 48회 샘플링된 후, 데이터를 4단계로 4부분으로 나누어 시간당 약 12개의 샘플을 얻는다. 나머지 훈련 세트에도 비슷한 작업이 수행되므로 전체 데이터는 시간당 약 12개 샘플로 유지됩니다.
여기에 이미지 설명을 삽입하세요
그 목적은 테스트 세트가 모두 시간당 11~12회의 샘플링 빈도를 유지하기 때문입니다.
여기에 이미지 설명을 삽입하세요

이러한 처리 후에 훈련 세트와 테스트 세트의 동일한 시간 단계가 달성됩니다. 이후의 타이밍 기능 구성에 편리합니다.
또한 훈련 세트를 분할하면 빈 시간의 영향을 효과적으로 피할 수 있습니다.

또한 검증 세트를 수동으로 선택하면 검증 세트와 테스트 세트의 분포 일관성이 보장되어 더 나은 온라인 및 오프라인 피팅이 가능합니다.

이전 시도의 시계열 상관 기능은 동일한 시간 간격으로 처리된 데이터를 사용하여 재구성되었습니다. 그리고 간단한 검증을 위해 기본 방법을 사용합니다. 이번에 더 빠른 머신으로 바꿨더니 결국에는 MAE가 7.52더 심해지더군요.. 그러다가 다시 베이스라인을 실행해 보니 이번에는 베이스라인이 바뀌었는데 8.51, 이전 베이스라인의 점수는 그대로 유지되었습니다 6.29.


요약 : 이틀간의 데이터 처리에 시간이 너무 많이 걸리고 프로그램의 품질을 평가하기가 쉽지 않습니다. 결과가 여러 요소에 영향을 받고 변수를 제어하는 ​​것이 쉽지 않다는 것을 느낍니다. 전체 프로그래밍 프로세스도 혼란스럽고 나중에 연습을 강화해야 합니다. Yulao의 라이브 방송에서 배운 아이디어 중 일부는 아직 실행되지 않았으므로 지난 며칠 동안 다시 시도하겠습니다.

추천

출처blog.csdn.net/qq_38869560/article/details/131873308