[Mathorcup Cup Big Data Challenge Rematch A Question Valuación de autos usados] Ideas e implementación de Python


Hora de actualización: a las 8:30 del 10 de marzo de 2022, la
competencia finalizó, consulte el resumen de la competencia, este artículo ya no se actualizará

enlaces relacionados

(1) Resumen de la ronda preliminar y semifinales, código de programa y documento

(2) Idea completa de la pregunta 1 y descarga del código de implementación de Python

(3) Idea completa de la pregunta 2 y descarga del código de implementación de Python

tema

Pregunta 1: Sobre la base de la pregunta 2 de la ronda preliminar, si necesita estimar con precisión el ciclo de transacción del vehículo, ¿cómo lo modelará? Utilice el Anexo 4 "Almacenar datos de capacitación de transacciones" para crear un modelo de predicción del ciclo de transacciones y hacer predicciones en el Anexo 5 "Almacenar datos de verificación de transacciones" y guardar los resultados de la predicción en el archivo Anexo 6 ​​"Almacenar resultados del modelo de transacciones", tenga cuidado de no para modificar Formato. Entre ellos, el Anexo 5 "Almacenar datos de verificación de transacciones" solo incluye los primeros 1 a 4 campos del Anexo 4 "Almacenar datos de capacitación de transacciones". Todos los carid y otra información relacionada en el Anexo 5 se incluyen en el Anexo 2 "Datos de Verificación de Valuación".

Pregunta 2: En el proceso de venta de vehículos en las tiendas, además de predecir con precisión el futuro ciclo de transacciones de los vehículos en el almacén, también es necesario gestionar eficazmente el inventario (suponiendo que el sitio y las condiciones del personal de la tienda permanezcan sin cambios). durante el período de evaluación) para garantizar que el costo (los vehículos tienen costos de ocupación de capital, costos de ocupación de espacios de estacionamiento) para maximizar las ganancias de ventas de la tienda. El precio del vehículo es un factor muy importante que afecta la transacción del vehículo. Cuando la tienda realiza la gestión de inventario, es necesario fijar el precio o ajustar el precio del vehículo de acuerdo con las condiciones de los vehículos en el almacén y el nuevo vehículos recibidos. Por un lado, los vehículos más vendidos se pueden vender a un precio más adecuado. Haga un trato para preservar las ganancias de la tienda. Al mismo tiempo, es necesario reducir el precio de los vehículos no vendibles para evitar mayores pérdidas Basado en esto, suponiendo que usted es el gerente de la tienda, lo que puede decidir es cuándo ajustar el precio de un vehículo determinado y cuánto ajustar para garantizar que los objetivos comerciales de la tienda (maximizar la ganancia bruta de la tienda mientras se minimizan los costos), y los costos laborales y otros costos de los empleados no se consideran aquí. Describa usted mismo el modelo matemático del problema abstracto, construya el modelo de gestión de la tienda y brinde las ideas de solución y los pasos del algoritmo del modelo. Aquí, se supone que el objetivo comercial se evalúa una vez al mes.

Complete el documento preliminar basado en las respuestas a las preguntas 1 y 2, y aclare sus ideas, modelos, métodos y resultados.

1 idea

1.1 La primera pregunta

es un problema de regresión

Usando el Anexo 4 como conjunto de entrenamiento y el Anexo 5 como conjunto de prueba, el modelo de regresión LGB se usa para la predicción de regresión y el valor pronosticado se redondea hacia arriba. Es necesario prestar atención al cálculo del ciclo de transacción. . . Descarga la idea completa

La construcción de características del modelo de regresión, además de la intersección de características de la línea base que proporcioné a continuación, existen otros métodos de construcción de características. como sigue

Referencia: Métodos de construcción de características

(1) Transformación básica de una sola variable: x, x^2, sqrt x , log x, scaling

(2) Si la distribución de la variable es de cola larga, aplique la transformación de Box-Cox (usar la transformación logarítmica es rápido pero no necesariamente una buena opción)

(3) También puede verificar los residuos (Residuals) o log-odds (para modelos lineales) para analizar si es fuertemente no lineal.

(4) Para datos con una cardinalidad relativamente grande, para variables categóricas, es útil crear una función que represente la frecuencia de ocurrencia de cada categoría. Por supuesto, estas categorías también se pueden expresar como porcentajes o porcentajes del total.

(5) Para cada valor posible de la variable, estime la media de la variable objetivo y use el resultado como la característica de creación.

(6) Cree una función con la proporción de la variable objetivo.

(7) Seleccione las dos variables más importantes, calcule sus acciones cruzadas de segundo orden entre sí y con otras variables, póngalas en el modelo y compare los resultados del modelo resultante con los resultados del modelo lineal original.

(8) Si desea una solución más fluida, puede aplicar un núcleo de funciones de Kadial Basis. Esto es equivalente a aplicar una transición suave.

(9) Si cree que necesita covariables, puede aplicar núcleos polinómicos o agregar explícitamente sus covariables.

(10) Características de alta cardinalidad: en la etapa de preprocesamiento, se transforman en variables numéricas mediante un promedio fuera de pliegue.

。。。。

1.2 La segunda pregunta

Requisitos del título: modelo matemático de tres cosas: si se deben reducir los precios, el alcance de los recortes de precios y el momento de los recortes de precios

Si lo piensas de manera simple, también puede ser un problema de regresión, si quieres hacerlo complejo, es un problema de planificación. Debido a que no hay datos para esta pregunta, si se va a hacer por planificación, es pura modelación matemática teórica. Las ideas e implementaciones que doy a continuación.
. . . Omitido, descargue la idea completa del
problema 2, la idea completa y la descarga del código de implementación de Python

2 Implementación

2.1 TXT a CSV

import scipy.stats as st
import pandas as pd 
import seaborn as sns
from pylab import mpl 
import numpy as np
import matplotlib.pyplot as plt
from tqdm import tqdm
tqdm.pandas()
import warnings

warnings.filterwarnings('ignore')
# plt.rcParams['font.sans-serif'] = ['STSong']
# mpl.rcParams['font.sans-serif'] = ['STSong'] # 指定默认字体 
mpl.rcParams['axes.unicode_minus'] = False
import csv
import os
import pickle



data = pd.read_csv('./data/附件5:门店交易验证数据.txt',sep ='\t',header=None)
data.columns=['carid','pushDate','pushPrice','updatePriceTimeJson']
data.to_csv('./data/file5.csv',index=0)

2.2 Preprocesamiento de datos

df4 = pd.read_csv('./data/file4.csv')
df5 = pd.read_csv('./data/file5.csv')

(1) Calcular el ciclo de transacción

# 去除没卖出的样本
df_trans = df4[df4.withdrawDate.notna()]

。。。。略,请下载完整代码 https://mianbaoduo.com/o/bread/YpiXlpZx

train_cols = ['pushDate','pushPrice','transcycle']
df_train = df_trans[train_cols]
test_cols = ['pushDate','pushPrice']
df_test = df5[test_cols]
df_train

inserte la descripción de la imagen aquí

import scipy.stats as st
import seaborn as sns 
import matplotlib.pyplot as plt 

plt.figure(figsize=(14, 5))
plt.subplot(122)
plt.title('正态分布拟合-已处理', fontsize=20)
sns.distplot(np.log1p(df_train['pushPrice']), kde=False, fit=st.norm)
plt.xlabel('上架价格', fontsize=20)
plt.subplot(121)
plt.title('正态分布拟合-未处理', fontsize=20)
sns.distplot(df_train['pushPrice'], kde=False, fit=st.norm)
plt.xlabel('上架价格', fontsize=20)
plt.savefig('img/上架价格正态分布拟合.png',dpi=300)

inserte la descripción de la imagen aquí

(2) Extraer características temporales

# # 时间处理(提取年月日)
df_train['pushDate'] = pd.to_datetime(df_train['pushDate'])
df_test['pushDate'] = pd.to_datetime(df_test['pushDate'])
df_train['pushDate_year'] = df_train['pushDate'].dt.year
df_train['pushDate_month'] = df_train['pushDate'].dt.month
df_train['pushDate_day'] = df_train['pushDate'].dt.day

df_test['pushDate_year'] = df_test['pushDate'].dt.year
df_test['pushDate_month'] = df_test['pushDate'].dt.month
df_test['pushDate_day'] = df_test['pushDate'].dt.day

del df_train['pushDate']
del df_test['pushDate']

(3) Conversión de distribución de datos

df_train['pushPrice'] = np.log1p(df_train['pushPrice'])
df_test['pushPrice'] = np.log1p(df_test['pushPrice'])
df_train.columns

Index(['pushPrice', 'update_price', 'barging_times', 'barging_price', 'transcycle', 'pushDate_year', 'pushDate_month', 'pushDate_day'], dtype='object')

(4) Intersección de características

#定义交叉特征统计
def cross_cat_num(df, num_col, cat_col):
    for f1 in tqdm(cat_col):
        g = df.groupby(f1, as_index=False)
        for f2 in tqdm(num_col):
            feat = g[f2].agg({
    
    
                '{}_{}_max'.format(f1, f2): 'max', '{}_{}_min'.format(f1, f2): 'min',
                '{}_{}_median'.format(f1, f2): 'median',
                '{}_{}_sum'.format(f1, f2): 'sum',
                '{}_{}_mad'.format(f1, f2): 'mad',
            })
            df = df.merge(feat, on=f1, how='left')
    return(df)
### 用数值特征 与类别特征做交叉
cross_num = ['pushPrice']

cross_cat = ['pushDate_year', 'pushDate_month','pushDate_day']
data_train = cross_cat_num(df_train, cross_num, cross_cat)  # 一阶交叉
data_test = cross_cat_num(df_test, cross_num, cross_cat)  # 一阶交叉
data_train.shape

(8000, 20)

2.3 Entrenamiento modelo

(1) Entrenamiento modelo

from sklearn import metrics
from sklearn.model_selection import KFold
import lightgbm as lgb
import pandas as pd
from sklearn.model_selection import KFold

import numpy as np
from sklearn.preprocessing import StandardScaler

from sklearn.preprocessing import StandardScaler
train = data_train
test = data_test
train_y = train['transcycle']
del train['transcycle']
scaler = StandardScaler()
train_x = scaler.fit_transform(train)
test_x = scaler.fit_transform(test)

from sklearn import metrics

params = {
    
    
    'boosting_type': 'gbdt',
    'objective': 'regression_l1',
    'metric': 'mae',
    'num_leaves': 31,
    'learning_rate': 0.05,
    'feature_fraction': 0.9,
    'bagging_fraction': 0.8,
    'bagging_freq': 5,
    'verbose': -1,
}

def MAE_metric(y_true, y_pred):
    return metrics.mean_absolute_error(y_true, y_pred)

folds = 5
kfold = KFold(n_splits=folds, shuffle=True, random_state=5421)
preds_lgb = np.zeros(len(test_x))
for fold, (trn_idx, val_idx) in enumerate(kfold.split(train_x, train_y)):
    import lightgbm as lgb
    print('-------fold {}-------'.format(fold))
    x_tra, y_trn, x_val, y_val = train_x[trn_idx], train_y.iloc[trn_idx], train_x[val_idx], train_y.iloc[val_idx]

    train_set = lgb.Dataset(x_tra, y_trn)
    val_set = lgb.Dataset(x_val, y_val)
    # lgb
    lgbmodel =。。。。略,请下载完整代码
    
    val_pred_xgb = lgbmodel.predict(
        x_val, predict_disable_shape_check=True)
    preds_lgb += lgbmodel.predict(test_x,
                                    predict_disable_shape_check=True) / folds
    val_mae = MAE_metric(y_val, val_pred_xgb)
    print('lgb val_mae {}'.format(val_mae))

------- doblar 0 ------- lgb val_mae 0.808706443185115 -
------ doblar 1 ------- lgb val_mae 0.955760771009792
------- doblar 2 --- ---- lgb val_mae 0.897388380375197
------- doblar 3 ------- lgb val_mae 0.883798531878621
------- doblar 4 ------- lgb val_mae 0.878992579304203

(2) Almacene el resultado de la predicción como TXT

import math
file5 = pd.read_csv('./data/file5.csv')
submit_file  = pd.DataFrame(columns=['id'])
submit_file['id'] = file5['carid']
# 向上取整
submit_file['transcycle'] = [math.ceil(i) for i in list(preds_lgb)]
submit_file['transcycle'].astype(int)

i = 0
with open('./submit/附件6:门店交易模型结果.txt','a+', encoding='utf-8') as f:
    for line in submit_file.values:
        if i==0:
            i += 1
            continue
        else:
            i += 1
            f.write((str(line[0])+'\t'+str(line[1])+'\n'))

Consulte el enlace superior para obtener ideas completas y descargas de códigos.

Supongo que te gusta

Origin blog.csdn.net/weixin_43935696/article/details/123343796
Recomendado
Clasificación