二手车价格预估NN方案 baseline
此比赛为天池长期赛,可到天池算法大赛->学习赛里面去找。
早在6月份的时候,刚接触这个比赛,就做了个xgb的baseline,得分大概在670左右。最近又重新做这个比赛,这次直接上NN,线上提升了一百多分。
环境:Google Colab
1.获得google 云盘的权限
数据集放在Google 云盘上,所以需要获得相应权限来访问数据。
from google.colab import drive
drive.mount('/content/drive')
%cd /content/drive/My Drive
!ls
2.导入工具包
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from tensorflow import keras
from sklearn.metrics import mean_absolute_error
3.读取数据
# 1) 获取数据
data_train = pd.read_csv('比赛/二手车交易价格预估-天池/二手车交易价格预测/dataset/used_car_train_20200313.csv', sep=' ')
data_test = pd.read_csv('比赛/二手车交易价格预估-天池/二手车交易价格预测/dataset/used_car_testB_20200421.csv', sep=' ')
data_train.info()
4.数据预处理
4.1 数据清洗
# 缺失值处理
data_train.replace(to_replace='-', value=np.nan, inplace=True)
data_test.replace(to_replace='-', value=np.nan, inplace=True)
data_train.fillna(data_train.median(), inplace=True)
data_test.fillna(data_train.median(), inplace=True)
# 异常值处理
data_train['power'][data_train['power'] > 600] = 600
data_test['power'][data_test['power'] > 600] = 600
5.特征工程
选取合适的特征
tags = ['model', 'brand', 'bodyType', 'fuelType', 'regionCode', 'kilometer','regDate','creatDate',
'notRepairedDamage', 'power', 'car_age_year','v_0', 'v_1', 'v_2', 'v_3', 'v_4', 'v_5', 'v_6',
'v_7', 'v_8', 'v_9', 'v_10', 'v_11', 'v_12', 'v_13', 'v_14']
# 特征归一化
min_max_scaler = MinMaxScaler()
min_max_scaler.fit(data_train[tags].values)
x = min_max_scaler.transform(data_train[tags].values)
x_ = min_max_scaler.transform(data_test[tags].values)
# 因变量
y = data_train['price'].values
# 3) 数据集划分
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=22)
6.建立模型
model = keras.Sequential([
keras.layers.Dense(250, activation='relu', input_shape=[26]),
keras.layers.Dense(250, activation='relu'),
keras.layers.Dense(250, activation='relu'),
keras.layers.Dense(1)])
model.compile(loss='mean_absolute_error',
optimizer='Adam')
model.fit(x_train, y_train, batch_size=2048, epochs=50)
7.模型评估
# 比较训练集和测试集效果
error_train = mean_absolute_error(y_train, model.predict(x_train))
error_test = mean_absolute_error(y_test, model.predict(x_test))
print(error_train,error_test)
8.线上测试集
# 输出预测结果
y_ = model.predict(x_)
data_test_price = pd.DataFrame(y_, columns=['price'])
results = pd.concat([data_test['SaleID'], data_test_price], axis=1)
results.to_csv('比赛/二手车交易价格预估-天池/二手车交易价格预测/results0827.csv', sep=',', index=None)
这个baseline得分是570左右,没有做复杂的特征,也没有用多模型融合。
我加了车的使用年限之后得分提高了5分,说明这个也是比较重要的特征。
9. 后续努力
- 做一些交叉特征,选择和price相关比较大的特征
- 继续用单模型来提升,如果不行的话,再加入lgb等树模型来融合。
任重道远啊!争取明天继续上分!