Camp d'été DataWhale AI - Apprentissage automatique

enregistrement d'apprentissage un

Défi de régulation des paramètres de production de batteries au lithium et de prévision de la température de production

L'environnement a été configuré, la base de référence a été parcourue et une simple analyse des données a été réalisée sur cette base.

1. Analyse des valeurs aberrantes

Analyser les valeurs manquantes et les valeurs aberrantes dans l'ensemble de formation

train_data.info()  
train_data.describe()

Observez qu'il n'y a pas de valeurs manquantes ni de valeurs aberrantes dans les données train_dataset['下部温度9'] == -32768.000000]. Supprimez la valeur manquante.

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

2. Visualisation en boîte à moustaches univariée

La distribution des données sur le débit, la température de consigne supérieure et la température de consigne inférieure dans l'ensemble d'entraînement et l'ensemble de test a été visualisée sous forme de boîte à moustaches. Il a été observé qu'il y avait des valeurs aberrantes dans les données de température de consigne supérieure et inférieure, correspondant
Veuillez ajouter une description en image
à 2023/1/7 dans les données, 2023/1/8, 2023/1/9 données pendant trois jours.
Veuillez ajouter une description en image


Deux modifications ont été apportées sur la base de la ligne de base (6.29551) :

  1. Suppression d'une valeur incorrecte dans les données (6.72811)
  2. Supprimer les données du 7/1/2023, du 8/1/2023, du 9/1/2023 (6.73844)

insérer la description de l'image ici


3. Analyse de l'importance des fonctionnalités

Ensuite, une tentative a été faite pour analyser l'analyse propre efficace pour une seule variable prédictive

  1. Calculer la matrice de corrélation
df = pd.concat([X, y.iloc[:,0]], axis = 1) # X是处理后的训练数据,y是标签
corr_matrix = df.corr()
corr_matrix['上部温度1'].sort_values(ascending=False)
  1. lightgbmL'importance des fonctionnalités pour
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}")

La matrice de corrélation calcule une corrélation linéaire, de sorte que les résultats observés sont quelque peu différents des résultats de l'importance des caractéristiques de lightgbm.

L'étape suivante consiste à construire différentes fonctionnalités et à effectuer un filtrage des fonctionnalités pour les résultats de chaque sortie de prédiction.

Dossier d'étude 2 (mis à jour le 2023.07.27)

Ces derniers jours, il s’agissait principalement d’une lutte avec Baseline, puis tout a échoué. Des tentatives ont été faites au niveau des données, de l'ingénierie des fonctionnalités, des méthodes de division des données et du post-traitement.

1. Plan de données

Il y a des valeurs manquantes (0) et des valeurs aberrantes dans les données trouvées la dernière fois, et elles sont filtrées et modifiées par la recherche. Récemment, grâce à la visualisation, il existe des valeurs aberrantes dans presque toutes les fonctionnalités. Cela se reflète particulièrement dans les caractéristiques du trafic.

Veuillez ajouter une description en image
La figure ci-dessus est un graphique linéaire de 17 caractéristiques du trafic dans les données d'entraînement. On peut voir qu'il existe encore de grandes fluctuations.
Veuillez ajouter une description en image
Résultats obtenus en utilisant la médiane pour le filtrage par fenêtre glissante, où la courbe rouge est le résultat du filtrage de l'ensemble de test.
Code utilisé pour le filtrage :

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

Résultats : Les données filtrées ne réduisent pas le MAE sur l'ensemble de test.

2. Ingénierie des fonctionnalités

Principalement sous trois aspects :

  1. Caractéristiques du trafic : la variance, la moyenne et le coefficient de variation dans une certaine plage horaire (un jour) sont construits. Parmi eux, le coefficient de variation fonctionnait bien et le score de l'importance des caractéristiques du modèle arborescent était supérieur à celui de la fonctionnalité de trafic d'origine, mais les performances sur l'ensemble de test après l'entraînement avec cette fonctionnalité n'étaient pas meilleures, et comment conserver et supprimer la fonctionnalité était encore quelque peu déroutant.
  2. Caractéristiques de réglage de la température : ces caractéristiques ont une forte corrélation linéaire avec la cible dans la corrélation corr, mais elles fonctionnent mal dans l'évaluation de l'importance des caractéristiques du modèle d'arbre, et la valeur est relativement stable, il n'est donc pas facile de construire des caractéristiques dérivées. J'ai essayé de l'intégrer dans des fonctionnalités discrètes, en remplaçant toutes les valeurs par le plus de n valeurs et en utilisant 1, 0, -1 pour créer les modifications avant et après. Mais ces fonctionnalités fonctionnent mal.
  3. Ensuite, j'ai essayé d'utiliser le générateur de fonctionnalités entièrement automatique openFE. L'effet est également moyen.
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. Méthode de division des données

Parce qu'il s'agit de données de séries chronologiques, train_test_splitil y a un voyage dans le temps lorsqu'elles sont utilisées directement, donc l'effet de l'utilisation des données de séries chronologiques est très faible et les performances ne sont pas aussi bonnes que TimeSeriesSplitleur utilisation .KFoldtrain_test_split

4. Post-traitement

  1. Bibliothèque Hillclimbing - pour la fusion de modèles
    J'ai trouvé une bibliothèque pour la fusion de modèles, mais comme seul lightgbm est actuellement utilisé, je ne l'ai pas encore essayée.
!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. Technique de post-traitement
    J'ai trouvé une technique de traitement intéressante, mais elle n'est pas applicable à cet ensemble de données, mais j'ai utilisé cette idée pour construire un codage discret de la fonction de réglage de la température, bien que l'effet soit également très médiocre.
# 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]

Dossier d'étude 3 (mis à jour le 2023.07.30)

Après avoir regardé la diffusion en direct de Yulao, j'ai beaucoup gagné. J'ai passé beaucoup de temps sur la sélection des fonctionnalités auparavant, mais j'ai découvert plus tard que la quantité de fonctionnalités construites était loin de la quantité de sélection de fonctionnalités. De plus, lorsque le score ne s’améliore pas, commencez par l’analyse des données. Par conséquent, les données ont été soigneusement analysées au cours des deux derniers jours et de nouvelles découvertes ont été faites.

Tout d'abord, nous avons compté l'enregistrement des données pour chaque heure de 2022-11-06 09:00:00à à sur l'ensemble d'entraînement . L'exemple de données est le suivant :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
......

insérer la description de l'image ici
L'ensemble de formation est divisé en cinq parties en fonction de la fréquence d'échantillonnage des données chaque heure. Par exemple, les données de 2022-11-7et 2022-11-8sont échantillonnées environ 48 fois par heure, puis les données sont divisées en 4 parties avec quatre étapes, de sorte qu'environ 12 échantillons par heure sont obtenus. Des opérations similaires sont effectuées sur le reste de l’ensemble d’apprentissage, de sorte que les données globales soient maintenues à environ 12 échantillons par heure.
insérer la description de l'image ici
Le but est que l'ensemble de test maintient tous une fréquence d'échantillonnage de 11 ou 12 fois par heure.
insérer la description de l'image ici

Après un tel traitement, des pas de temps égaux sur l'ensemble d'apprentissage et l'ensemble de test sont obtenus. C’est pratique pour la construction ultérieure de fonctionnalités de synchronisation.
De plus, le fractionnement de l’ensemble de formation évite également efficacement l’impact du temps vacant.

De plus, la sélection manuelle de l'ensemble de validation garantit la cohérence de la distribution de l'ensemble de validation et de l'ensemble de test, permettant un meilleur ajustement en ligne et hors ligne.

Les caractéristiques de corrélation des séries chronologiques des tentatives précédentes ont ensuite été reconstruites en utilisant les données traitées avec des pas de temps égaux. Et utilisez la méthode de base pour une vérification simple. Cette fois, j'ai changé pour une machine plus rapide, et à la fin le MAE 7.52était encore pire. Ensuite, j'ai réexécuté la ligne de base et j'ai constaté que la ligne de base avait changé cette fois 8.51et que le score de la ligne de base précédente restait le même 6.29.


Résumé : Ces deux jours de traitement des données ont pris trop de temps et il n'est pas facile d'évaluer la qualité du programme. J'ai l'impression que les résultats sont affectés par de nombreux facteurs et qu'il n'est pas facile de contrôler les variables. L'ensemble de la programmation Le processus est également chaotique et doit être renforcé ultérieurement. Certaines des idées apprises lors de la diffusion en direct de Yulao n'ont pas encore été mises en pratique, je vais donc réessayer ces derniers jours.

Je suppose que tu aimes

Origine blog.csdn.net/qq_38869560/article/details/131873308
conseillé
Classement