HKUST IFLYTEK-Resumen personal del desafío de predicción de la temperatura del invernadero (no arriba)

Prefacio

Esta se considera la primera competencia de datos en la que el bloguero ha participado por completo. Realmente ha ganado muchas cosas, tiene una comprensión integral de la competencia de datos y ha sido testigo de la pelea entre los grandes jefes en la primera fila y los dioses. Este artículo puede considerarse como una revisión del curso de esta competencia, porque no hice mucho en las semifinales, aquí es principalmente para resumir los trucos que obtuve en la competencia preliminar, ¡bienvenidos amigos para intercambiar y aprender juntos! Consejos: ¡Por supuesto, también me gustaría agradecer a los dos grandes dioses Yumen y Aze por compartir sus líneas de base e ideas!

Estos son los principales miembros del equipo:

  • Yi Lei, segundo estudiante de Investigación de Operaciones y Cibernética en la Universidad Jiaotong de Beijing
  • yiyang, estudiante graduado de Estadística Aplicada en la Universidad de Donghua
  • Concentrado, estudiando el segundo año de especialización en tecnología informática en la Universidad Normal de Shanghai

1. Introducción a las preguntas de competencia: problemas de series de tiempo

Sitio web del concurso: http://challenge.xfyun.cn/topic/info?type=temperature

Debido a que las reglas de la preliminar y las semifinales son casi completamente diferentes, se puede decir que son dos juegos diferentes. La ronda preliminar se puede posicionar como un problema de regresión multivariante, mientras que la ronda semifinal se convierte en un problema de complementar los resultados basados ​​en el pronóstico de series de tiempo. Avergonzado, nuestro equipo estuvo ocupado con varias cosas durante los cuartos de final, y básicamente solo un compañero de equipo lo hizo ocasionalmente, por lo que este artículo es principalmente mi resumen de la ingeniería de características de la ronda preliminar.


2. Preliminar: Permitir utilizar valores y características actuales para atravesar

En la competencia preliminar, los miembros de nuestro equipo no se conocieron, por lo que modelamos por nuestra cuenta y usamos el modo único xgboost sin excepción. Los resultados finales fueron 0.104, 0.106 y 0.117. La ventaja de este enfoque es que nuestros respectivos modelos Hay ciertas diferencias, que también crearon condiciones para la integración posterior del modelo. Finalmente, después de la integración y el ajuste del modelo, el puntaje preliminar del equipo A de nuestro equipo se fijó en 0.10034, y finalmente la lista A se ubicó en el puesto 36. Cambie a la lista B y el ranking subió a 28. Nombre (28/771), calificado con éxito para la revancha.

Una lista

Lista B

A continuación, resumo principalmente el trabajo que he realizado en el procesamiento de datos y la ingeniería de características. Muchos de ellos han tomado prestados de la línea de base del tipo pez, y no han realizado la función de agrupamiento, y rara vez involucran el cruce de características. (Puntuación de modo único: 0,106, clasificación A: alrededor de 60, creo que debería haber una gran mejora en la clasificación B)

  1. Finalización de valor faltante (use la operación fillna)
# 缺失值补全
f = ['outdoorTemp','outdoorHum','outdoorAtmo','indoorHum','indoorAtmo']
train_df[f] = train_df[f].fillna(method='ffill')
test_df[f] = test_df[f].fillna(method='ffill')
  1. Truncamiento de valores atípicos (asumiendo que los datos obedecen a una distribución normal, use la regla 3σ para el truncamiento, que puede reemplazarse por la media antes y después)
# 气压异常值前后均值替换
for f in tqdm(['indoorAtmo', 'outdoorAtmo']):
    upper = data_df[f].mean()+ 3 * data_df[f].std()
    lower = data_df[f].mean()- 3 * data_df[f].std()
    for i in data_df[data_df[f] > upper].index:
        data_df.loc[i,f] = (data_df.loc[i-1,f] + data_df.loc[i+1,f])/2
    for i in data_df[data_df[f] < lower].index:
        data_df.loc[i,f] = (data_df.loc[i-1,f] + data_df.loc[i+1,f])/2
  1. Hace una hora, el valor de sincronización de minutos correspondiente y la diferencia (usando la operación de turno)
# 一小时前同期值
for f in tqdm(['outdoorTemp','outdoorHum','outdoorAtmo','indoorHum','indoorAtmo']):
    train_df['ago_1hour_{}'.format(f)] = train_df[f].shift(1*60)
    test_df['ago_1hour_{}'.format(f)] = test_df[f].shift(1*2)
  1. Promedio de datos de la ventana deslizante hace media hora (usando la operación de desplazamiento)
# 开窗
for f in tqdm(['outdoorTemp','outdoorHum','outdoorAtmo','indoorHum','indoorAtmo']):
    train_rolling = train_df[f].rolling(window=30)
    train_df['rolling_{}_mean'.format(f)] = train_rolling.mean()
    test_rolling = test_df[f].rolling(window=2)
    test_df['rolling_{}_mean'.format(f)] = test_rolling.mean()
  1. Características básicas de agregación por mes, día y hora, incluyendo media, mediana, etc. (grupo por, hay cruce característico)
# 按月日小时基本聚合特征
group_feats = []
for f in tqdm(['outdoorTemp','outdoorHum','outdoorAtmo','indoorHum','indoorAtmo']):
    data_df['MDH_{}_medi'.format(f)] = data_df.groupby(['month','day','hour'])[f].transform('median')
    data_df['MDH_{}_mean'.format(f)] = data_df.groupby(['month','day','hour'])[f].transform('mean')
	......(各种统计量)
    group_feats.append('MDH_{}_mean'.format(f))
  1. Características cruzadas básicas (suma, resta, multiplicación y división, principalmente razón y diferencia)
# 基本交叉特征比值
for f1 in tqdm(['outdoorTemp','outdoorHum','outdoorAtmo','indoorHum','indoorAtmo'] + group_feats):
    for f2 in ['outdoorTemp','outdoorHum','outdoorAtmo','indoorHum','indoorAtmo']+group_feats:
        if f1 != f2:
            colname = '{}_{}_ratio'.format(f1, f2)
            data_df[colname] = data_df[f1].values / data_df[f2].values

# 基本交叉特征差值(大-小)
for f1 in tqdm(['outdoorTemp','outdoorHum','outdoorAtmo','indoorHum','indoorAtmo']):
    for f2 in ['outdoorTemp','outdoorHum','outdoorAtmo','indoorHum','indoorAtmo']:
        if (f1 != f2) & (data_df[f1].mean() > data_df[f2].mean()):
            colname = '{}_{}_differ'.format(f1, f2)
            data_df[colname] = data_df[f1].values - data_df[f2].values          
  1. Características cruzadas básicas del mismo período hace una hora
# 一小时前同期值基本交叉特征
for f1 in tqdm(['ago_1hour_outdoorTemp','ago_1hour_outdoorHum','ago_1hour_outdoorAtmo','ago_1hour_indoorHum','ago_1hour_indoorAtmo']):  
    for f2 in ['ago_1hour_outdoorTemp','ago_1hour_outdoorHum','ago_1hour_outdoorAtmo','ago_1hour_indoorHum','ago_1hour_indoorAtmo']:
        if f1 != f2:
            colname = 'ago_1hour_{}_{}_ratio'.format(f1, f2)
            data_df[colname] = data_df[f1].values / data_df[f2].values
  1. Extracción de información histórica: la media (dt) de características básicas (incluidas características iniciales y características cruzadas) a la misma hora en los n días anteriores
# 2days历史信息提取
data_df['dt'] = data_df['day'].values + (data_df['month'].values - 3) * 31
for f in tqdm(['outdoorTemp','outdoorHum','outdoorAtmo','indoorHum','indoorAtmo']+ratio_feats):
    tmp_df = pd.DataFrame()
    for t in range(15, 45):
        tmp = data_df[data_df['dt'].isin([t-1,t-2])].groupby(['hour'])[f].agg({
    
    'mean'}).reset_index()
        tmp.columns = ['hour','hit2days_{}_mean'.format(f)]
        tmp['dt'] = t
        tmp_df = tmp_df.append(tmp)
    data_df = data_df.merge(tmp_df, on=['dt','hour'], how='left')
  1. Extracción de información histórica: la media y la diferencia de las características básicas (incluidas las características iniciales y las características cruzadas) en las primeras n horas (dh, usando la operación diff)
# 前1和2小时历史信息差分
data_df['dh'] = data_df['hour'].values + (data_df['dt'].values -14) * 24
for f in tqdm(['outdoorTemp','outdoorHum','outdoorAtmo','indoorHum','indoorAtmo']+ratio_feats):
    tmp_df = data_df.groupby(['dh'])[f].agg(['mean']).reset_index()
    tmp_df.columns = ['dh','bef_{}_mean'.format(f)]
    tmp_df['diff1_{}_mean'.format(f)] = tmp_df['bef_{}_mean'.format(f)].diff(1)
    tmp_df['diff2_{}_mean'.format(f)] = tmp_df['bef_{}_mean'.format(f)].diff(2)
    data_df = data_df.merge(tmp_df, on=['dh'], how='left')

3. Semifinales: No está permitido utilizar valores y características actuales para cruzar

Debido a que el tema de las semifinales ha cambiado mucho en comparación con las rondas preliminares, y cada uno de nosotros tiene un calendario apretado, no hay nada que hacer. Para obtener mejores soluciones, puede consultar el código fuente abierto de los mejores dioses. (¡Yo también estoy esperando!)


Cuatro, resumen

  1. Los datos y las características determinan el límite superior del aprendizaje automático, y los modelos y algoritmos solo se acercan a este límite superior. ¡La ingeniería de funciones es invencible e importante!
  2. ¡Una simple fusión ponderada de dos modelos con grandes diferencias de ingeniería de características puede obtener muy buenos resultados!
  3. ¡La estructura característica del problema de las series de tiempo es realmente una cuestión universitaria!
  4. ¡Es un proceso maravilloso hacer concursos de ciencia de datos y cambiar entre clasificaciones y clasificaciones AB todos los días!

Supongo que te gusta

Origin blog.csdn.net/xylbill97/article/details/108706620
Recomendado
Clasificación