数据挖掘:汽车车交易价格预测(测评指标;EDA)

这篇具有很好参考价值的文章主要介绍了数据挖掘:汽车车交易价格预测(测评指标;EDA)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、前期工作

1.赛题介绍

 赛题分析:

分类和回归问题的评价指标有如下一些形式: (下文2.1和2.2会用到)

2.数据简介

3.探索性分析-EDA介绍

二、实战演练

2.1分类指标评价计算示例

 2.2回归指标评价计算示例

2.3数据探索性分析(EDA)

2.3.1 导入函数工具箱

2.3.2 数据信息查看及描述性分析

简略观察数据信息(head()+shape)

通过describe()来熟悉数据的相关统计量

判断数据缺失和异常

皮尔逊相关系数(热力图):

进行偏度和峰度分析:

数字特征相互之间的关系可视化

 类别特征分析(箱图,小提琴图,柱形图)

 类别特征分析(箱图,小提琴图,柱形图)

 2.3.3用pandas_profiling生成数据报告

 2.3.4特征与标签构建

2.4模型训练与预测

2.4.1 利用xgb进行五折交叉验证查看模型的参数效果

2.4.2 定义xgb和lgb模型函数

2.4.3 切分数据集(Train,Val)进行模型训练,评价和预测

2.4.4 进行两模型的结果加权融合

三、经验总结

 来源:


数据挖掘简介:

数据挖掘是一种通过自动或半自动方法从大规模数据集中提取出有用信息的过程。它通常涉及多个步骤,包括数据预处理、特征选择、建模和评估等。

在数据挖掘中,通常需要先对原始数据进行清洗和预处理,以保证数据的质量和准确性。接着,需要对数据进行探索性分析(EDA),以帮助理解数据的特征、关系和分布等信息。EDA 可以通过可视化和统计分析等方法来完成。

在完成数据预处理和EDA之后,需要进行特征选择和特征工程,以提取出最具有预测能力的特征。通常使用一些统计学和机器学习方法来完成特征选择和特征工程。

接着,可以使用各种机器学习和数据挖掘算法来建立模型,并对模型进行训练和优化。这些算法包括分类、回归、聚类、关联规则挖掘等。

最后,需要对建立的模型进行评估和测试,以确定模型的预测能力和准确性。评估指标通常包括精确度、召回率、F1 值等指标。

数据挖掘在各个领域都有广泛应用,包括商业、金融、医疗、社会科学等。它可以帮助人们更好地理解数据,从而发现其中的规律和趋势,以做出更加准确和有针对性的决策。

一、前期工作

原博主是基于一场阿里天池比赛写的笔记,深入浅出讲得非常好,所以本文着重复现+解析。

1.赛题介绍

比赛要求参赛选手根据给定的数据集,建立模型,二手汽车的交易价格。

来自 Ebay Kleinanzeigen 报废的二手车,数量超过 370,000,包含 20 列变量信息,为了保证比赛的公平性,将会从中抽取 10 万条作为训练集,5 万条作为测试集 A,5 万条作为测试集B。同时会对名称、车辆类型、变速箱、model、燃油类型、品牌、公里数、价格等信息进行脱敏。

一般而言,对于数据在比赛界面都有对应的数据概况介绍(匿名特征除外),说明列的性质特征。了解列的性质会有助于我们对于数据的理解和后续分析。
Tip:匿名特征,就是未告知数据列所属的性质的特征列。

 预测指标:本赛题的评价标准为MAE(Mean Absolute Error):

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

 其中代表第个样本的真实值,其中代表第 个样本的预测值。

一般问题评价指标说明:

评估指标即是我们对于一个模型效果的数值型量化。(有点类似与对于一个商品评价打分,而这是针对于模型效果和理想效果之间的一个打分)

 赛题分析:

  1. 此题为传统的数据挖掘问题,通过数据科学以及机器学习深度学习的办法来进行建模得到结果。
  2. 此题是一个典型的回归问题。
  3. 主要应用xgb、lgb、catboost,以及pandas、numpy、matplotlib、seabon、sklearn、keras等等数据挖掘常用库或者框架来进行数据挖掘任务。
  4. 通过EDA来挖掘数据的联系和自我熟悉数据

分类和回归问题的评价指标有如下一些形式: (下文2.1和2.2会用到)

分类算法常见的评估指标如下:

  • 对于二类分类器/分类算法,评价指标主要有accuracy, [Precision,Recall,F-score,Pr曲线],ROC-AUC曲线。
  • 对于多类分类器/分类算法,评价指标主要有accuracy, [宏平均和微平均,F-score]。

对于回归预测类常见的评估指标如下:

  • 平均绝对误差(Mean Absolute Error,MAE),均方误差(Mean Squared Error,MSE),平均绝对百分误差(Mean Absolute Percentage Error,MAPE),均方根误差(Root Mean Squared Error), R2(R-Square)

2.数据简介

我是用pycharm,在下面网址下载好放到对应目录即可。

http://tianchi-media.oss-cn-beijing.aliyuncs.com/dragonball/DM/data.zip

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

train.csv

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

  • name - 汽车编码
  • regDate - 汽车注册时间
  • model - 车型编码
  • brand - 品牌
  • bodyType - 车身类型
  • fuelType - 燃油类型
  • gearbox - 变速箱
  • power - 汽车功率
  • kilometer - 汽车行驶公里
  • notRepairedDamage - 汽车有尚未修复的损坏
  • regionCode - 看车地区编码
  • seller - 销售方
  • offerType - 报价类型
  • creatDate - 广告发布时间
  • price - 汽车价格
  • 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’(根据汽车的评论、标签等大量信息得到的embedding向量)【人工构造 匿名特征】

数字全都脱敏处理,都为label encoding形式,即数字形式

3.探索性分析-EDA介绍

EDA(Exploratory Data Analysis)是数据挖掘中的一个重要步骤,其目的是通过可视化和统计分析等手段对数据进行探索性分析,从而更好地理解数据,发现数据中的规律和特征,为后续的数据建模和分析提供基础。

EDA通常包括以下几个方面的内容:

  1. 数据质量分析:对数据的完整性、准确性、一致性、重复性等进行分析,发现和处理异常值和缺失值。

  2. 变量分布分析:对数据集中的每个变量进行分析,包括变量的类型、分布情况、离群值、异常值等。

  3. 变量间关系分析:通过统计分析和可视化手段来探索不同变量之间的相关性和联系,如相关系数分析、散点图、热力图等。

  4. 数据降维分析:通过降维技术,将高维数据转换为低维数据,以便更好地理解数据和发现数据中的规律。

  5. 模型验证:在数据分析中,往往需要构建模型来对数据进行预测和分类,EDA可以用于模型验证,包括模型的预测效果、泛化能力等。

二、实战演练

2.1分类指标评价计算示例

import pandas as pd
import numpy as np
import os, PIL, random, pathlib
data_dir = './data/'
data_dir = pathlib.Path(data_dir)

data_paths = list(data_dir.glob('*'))
classeNames = [str(path).split("\\")[1] for path in data_paths]
print(classeNames)

Train_data = pd.read_csv('data/train.csv', sep=' ')
Test_data = pd.read_csv('data/testA.csv', sep=' ')
print('Train data shape:',Train_data.shape) #包含了标签所以多一列
print('TestA data shape:',Test_data.shape)

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

from sklearn.metrics import accuracy_score
y_pred = [0, 1, 0, 1]
y_true = [0, 1, 1, 1]
print('ACC:',accuracy_score(y_true, y_pred))

用sklearn中的accuracy_score计算分类问题的准确率(accuracy)。

## Precision,Recall,F1-score
from sklearn import metrics
y_pred = [0, 1, 0, 0]
y_true = [0, 1, 0, 1]
print('Precision',metrics.precision_score(y_true, y_pred))
print('Recall',metrics.recall_score(y_true, y_pred))
print('F1-score:',metrics.f1_score(y_true, y_pred))

用sklearn中的precision_score、recall_score和f1_score计算分类问题的精确率(precision)、召回率(recall)和F1值(F1-score)。

import numpy as np
from sklearn.metrics import roc_auc_score
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
print('AUC socre:',roc_auc_score(y_true, y_scores))

 用sklearn中的roc_auc_score计算二分类问题的ROC曲线下面积(AUC score)。(下图三段代码运行结果)

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

 2.2回归指标评价计算示例

# coding=utf-8
import numpy as np
from sklearn import metrics
 
# MAPE需要自己实现
def mape(y_true, y_pred):
    return np.mean(np.abs((y_pred - y_true) / y_true))
 
y_true = np.array([1.0, 5.0, 4.0, 3.0, 2.0, 5.0, -3.0])
y_pred = np.array([1.0, 4.5, 3.8, 3.2, 3.0, 4.8, -2.2])
 
# MSE
print('MSE:',metrics.mean_squared_error(y_true, y_pred))
# RMSE
print('RMSE:',np.sqrt(metrics.mean_squared_error(y_true, y_pred)))
# MAE
print('MAE:',metrics.mean_absolute_error(y_true, y_pred))
# MAPE
print('MAPE:',mape(y_true, y_pred))

MSE: 0.2871428571428571
RMSE: 0.5358571238146014
MAE: 0.4142857142857143
MAPE: 0.1461904761904762

## R2-score
from sklearn.metrics import r2_score
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
print('R2-score:',r2_score(y_true, y_pred))

R2-score: 0.9486081370449679

2.3数据探索性分析(EDA)

2.3.1 导入函数工具箱

## 基础工具
import numpy as np
import pandas as pd
import warnings
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.special import jn
from IPython.display import display, clear_output
import time

warnings.filterwarnings('ignore')


## 模型预测的
from sklearn import linear_model
from sklearn import preprocessing
from sklearn.svm import SVR
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor

## 数据降维处理的
from sklearn.decomposition import PCA, FastICA, FactorAnalysis, SparsePCA

import lightgbm as lgb
import xgboost as xgb

## 参数搜索和评价的
from sklearn.model_selection import GridSearchCV, cross_val_score, StratifiedKFold, train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error
# coding:utf-8
# 导入warnings包,利用过滤器来实现忽略警告语句。
import warnings

warnings.filterwarnings('ignore')

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import missingno as msno

缺什么就pip install … 就行,注意关梯子 

2.3.2 数据信息查看及描述性分析

简略观察数据信息(head()+shape)

## 通过Pandas对于数据进行读取 (pandas是一个很友好的数据读取函数库)
Train_data = pd.read_csv('data/train.csv', sep=' ')
Test_data = pd.read_csv('data/testA.csv', sep=' ')

## 通过.head() 简要浏览读取数据的形式
print(Train_data.head())

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

 注意:如果想详细查看表格,不看中间的…,设置一下最大行数最大列数即可。

import pandas as pd

pd.set_option('display.max_columns', 500)  # 设置最大列数为500
pd.set_option('display.max_rows', 500)  # 设置最大行数为500

这样输出就没问题了

 可以查看开始和结尾信息:

## 2) 简略观察数据(head()+shape)
print(Train_data.head().append(Train_data.tail()))

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

 建议样成看数据集的head()以及shape的习惯。

通过describe()来熟悉数据的相关统计量

describe种有每列的统计量,个数count、平均值mean、方差std、最小值min、中位数25% 50% 75% 、以及最大值 看这个信息主要是瞬间掌握数据的大概的范围以及每个值的异常值的判断,比如有的时候会发现999 9999 -1 等值这些其实都是nan的另外一种表达方式,有的时候需要注意下

## 通过 .describe() 可以查看数值特征列的一些统计信息
print(Train_data.describe())

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

 详细查看后可得出power功率和price交易价格的std标准差较大,price的最小值只有11元,说明离散程度较严重。seller和offtertype标准差极小,属于异常数据,后续处理。

查看异常值检测(上面有数据概览时提及过notRepairedDamage、power功率和price字段可能存在异常。)

可以用info()熟悉数据类型

## 通过 .info() 简要可以看到对应一些数据列名,以及NAN缺失信息
Train_data.info()

查看值

print(Train_data['notRepairedDamage'].value_counts())
0.0    111361
-       24324
1.0     14315
Name: notRepairedDamage, dtype: int64

可以看出来‘ - ’也为空缺值,因为很多模型对nan有直接的处理,这里我们先不做处理,先替换成nan(可以看出notRepairedDamage字段中有2.4w个-缺失,由于很多模型对缺失值都有处理,因此将-替换为nan)

Train_data['notRepairedDamage'].replace('-', np.nan, inplace=True)

以下两个类别特征严重倾斜,一般不会对预测有什么帮助,故这边先删掉,当然你也可以继续挖掘,但是一般意义不大 ;没什么特征删除即可

判断数据缺失和异常

print(Train_data.isnull().sum())

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

 打印nan个数,可以直观的看到哪些字段存在缺失值,缺失数量是否庞大,如果较少可以填充,一般lgb等树模型可以空缺让模型自己处理,缺失值量较多则选择删除该字段。

了解预测值分布情况

对预测值分析+对预测值进行统计+对分布情况进行验证

print(Train_data['price'])

print(Train_data['price'].value_counts())

## 1) 总体分布概况(无界约翰逊分布等)
import scipy.stats as st

y = Train_data['price']
plt.figure(1);
plt.title('Johnson SU')
sns.distplot(y, kde=False, fit=st.johnsonsu)
plt.figure(2);
plt.title('Normal')
sns.distplot(y, kde=False, fit=st.norm)
plt.figure(3);
plt.title('Log Normal')
sns.distplot(y, kde=False, fit=st.lognorm)
plt.show()

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

 预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

 可以看出价格不服从正态分布,所以在进行回归之前,它必须进行转换。虽然对数变换做得很好,但最佳拟合是无界约翰逊分布。

如分布图所示,price不符合正态分布在回归之前要做转换。虽然对数拟合做得很好但是最佳拟合还是johnson SU。

注意:sns.distplot可以做单变量的直方图,参数kde=True直接绘制密度曲线图,参数fit=传入scipy.stats中的分布类型,用于在观察变量上抽取相关统计特征来强行拟合指定的分布。既不定义kde也不定义fit,返回图表为直方图纵坐标表示的是频数

 查看频数

plt.hist(Train_data['price'], orientation = 'vertical',histtype = 'bar', color ='red')
plt.show()

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

 大于20000得值极少,这里也可以把这些当作特殊得值(异常值)直接用填充或者删掉。

# log变换 z之后的分布较均匀,可以进行log变换进行预测,这也是预测问题常用的trick
plt.hist(np.log(Train_data['price']), orientation = 'vertical',histtype = 'bar', color ='red') 
plt.show()

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

将price进行log变换后趋近于正态分布,可以用来预测。

特征分为类别特征和数字特征,并对类别特征查看unique分布

# 分离label即预测值
Y_train = Train_data['price']
 
# 这个区别方式适用于没有直接label coding的数据
# 这里不适用,需要人为根据实际含义来区分
# 数字特征
# numeric_features = Train_data.select_dtypes(include=[np.number])
# numeric_features.columns
# # 类型特征
# categorical_features = Train_data.select_dtypes(include=[np.object])
# categorical_features.columns
 
 
numeric_features = ['power', 'kilometer', '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' ]
 
categorical_features = ['name', 'model', 'brand', 'bodyType', 'fuelType', 'gearbox', 'notRepairedDamage', 'regionCode',]
 
# 特征nunique分布
for cat_fea in categorical_features:
    print(cat_fea + "的特征分布如下:")
    print("{}特征有个{}不同的值".format(cat_fea, Train_data[cat_fea].nunique()))
    print(Train_data[cat_fea].value_counts())

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

数字特征分析

numeric_features.append('price')
print(numeric_features)
print(Train_data.head())

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

 数值特征和预测价格的相关性分析:

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

 相关性分析:

## 1) 相关性分析
price_numeric = Train_data[numeric_features]
correlation = price_numeric.corr()
print(correlation['price'].sort_values(ascending = False),'\n')

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

皮尔逊相关系数(热力图):

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

 注意:如果某两个相关性很高,不符合各个特征之间是相互独立的,会产生负贡献问题,这时候就要剔除某一个特征。比如v0与v5,v6和v1。

进行偏度和峰度分析:

del price_numeric['price']
 
## 2) 查看几个特征得 偏度和峰值
for col in numeric_features:
    print('{:15}'.format(col), 
          'Skewness: {:05.2f}'.format(Train_data[col].skew()) , 
          '   ' ,
          'Kurtosis: {:06.2f}'.format(Train_data[col].kurt())  
         )

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

 可见power,v_2,v_5,v_7,v_11,price的峰度和偏度都有异常。

数字特征相互之间的关系可视化

## 4) 数字特征相互之间的关系可视化
sns.set()
columns = ['price', 'v_12', 'v_8' , 'v_0', 'power', 'v_5',  'v_2', 'v_6', 'v_1', 'v_14']
sns.pairplot(Train_data[columns],size = 2 ,kind ='scatter',diag_kind='kde')
plt.show()

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

 类别特征分析(箱图,小提琴图,柱形图)

 可以明显看出,v1和v6呈明显线性关系。

## 5) 多变量互相回归关系可视化
fig, ((ax1, ax2), (ax3, ax4), (ax5, ax6), (ax7, ax8), (ax9, ax10)) = plt.subplots(nrows=5, ncols=2, figsize=(24, 20))
# ['v_12', 'v_8' , 'v_0', 'power', 'v_5',  'v_2', 'v_6', 'v_1', 'v_14']
v_12_scatter_plot = pd.concat([Y_train, Train_data['v_12']], axis=1)
sns.regplot(x='v_12', y='price', data=v_12_scatter_plot, scatter=True, fit_reg=True, ax=ax1)

v_8_scatter_plot = pd.concat([Y_train, Train_data['v_8']], axis=1)
sns.regplot(x='v_8', y='price', data=v_8_scatter_plot, scatter=True, fit_reg=True, ax=ax2)

v_0_scatter_plot = pd.concat([Y_train, Train_data['v_0']], axis=1)
sns.regplot(x='v_0', y='price', data=v_0_scatter_plot, scatter=True, fit_reg=True, ax=ax3)

power_scatter_plot = pd.concat([Y_train, Train_data['power']], axis=1)
sns.regplot(x='power', y='price', data=power_scatter_plot, scatter=True, fit_reg=True, ax=ax4)

v_5_scatter_plot = pd.concat([Y_train, Train_data['v_5']], axis=1)
sns.regplot(x='v_5', y='price', data=v_5_scatter_plot, scatter=True, fit_reg=True, ax=ax5)

v_2_scatter_plot = pd.concat([Y_train, Train_data['v_2']], axis=1)
sns.regplot(x='v_2', y='price', data=v_2_scatter_plot, scatter=True, fit_reg=True, ax=ax6)

v_6_scatter_plot = pd.concat([Y_train, Train_data['v_6']], axis=1)
sns.regplot(x='v_6', y='price', data=v_6_scatter_plot, scatter=True, fit_reg=True, ax=ax7)

v_1_scatter_plot = pd.concat([Y_train, Train_data['v_1']], axis=1)
sns.regplot(x='v_1', y='price', data=v_1_scatter_plot, scatter=True, fit_reg=True, ax=ax8)

v_14_scatter_plot = pd.concat([Y_train, Train_data['v_14']], axis=1)
sns.regplot(x='v_14', y='price', data=v_14_scatter_plot, scatter=True, fit_reg=True, ax=ax9)

v_13_scatter_plot = pd.concat([Y_train, Train_data['v_13']], axis=1)
sns.regplot(x='v_13', y='price', data=v_13_scatter_plot, scatter=True, fit_reg=True, ax=ax10)


plt.show()

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

 类别特征分析(箱图,小提琴图,柱形图)

  • 类别特征箱形图可视化
## 2) 类别特征箱形图可视化

# 因为 name和 regionCode的类别太稀疏了,这里我们把不稀疏的几类画一下
categorical_features = ['model',
                        'brand',
                        'bodyType',
                        'fuelType',
                        'gearbox',
                        'notRepairedDamage']
for c in categorical_features:
    Train_data[c] = Train_data[c].astype('category')
    if Train_data[c].isnull().any():
        Train_data[c] = Train_data[c].cat.add_categories(['MISSING'])
        Train_data[c] = Train_data[c].fillna('MISSING')


def boxplot(x, y, **kwargs):
    sns.boxplot(x=x, y=y)
    x = plt.xticks(rotation=90)


f = pd.melt(Train_data, id_vars=['price'], value_vars=categorical_features)  # 预测值
g = sns.FacetGrid(f, col="variable", col_wrap=2, sharex=False, sharey=False, height=5)
g = g.map(boxplot, "value", "price")
plt.show()

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

我有个报错: Traceback (most recent call last): File "D:/python_work/AAAShenDuXueXi/AIplay/B/B1.py", line 139, in <module> g = sns.FacetGrid(f, col="variable", col_wrap=2, sharex=False, sharey=False, size=5) TypeError: __init__() got an unexpected keyword argument 'size' 查了下是当前seaborn不支持size这个关键词,改成height即可

可以看出brand=24和37的车型价格区间较高离散程度较大,价位较低的离散程度较小;bodytype=6商务车价位稍高;混合动力和柴油的车价位稍高;自动挡汽车价位稍高。这些都可以作为特征在特征工程中使用。

类别特征的小提琴图可视化

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习
示意图
## 3) 类别特征的小提琴图可视化
catg_list = categorical_features
target = 'price'
for catg in catg_list :
    sns.violinplot(x=catg, y=target, data=Train_data)
    plt.show()

 类别特征的柱形图可视化

## 4) 类别特征的柱形图可视化
def bar_plot(x, y, **kwargs):
    sns.barplot(x=x, y=y)
    x=plt.xticks(rotation=90)
 
f = pd.melt(Train_data, id_vars=['price'], value_vars=categorical_features)
g = sns.FacetGrid(f, col="variable",  col_wrap=2, sharex=False, sharey=False, height=5)
g = g.map(bar_plot, "value", "price")

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

 这里的barplot默认计算平均值,因此能看出brand=24的车型均值在3w元,brand=34车型均值价位最低;商务车价位最高微型车价位最低;电动、混合动、柴油车价位偏高,液化石油气价位最低;

类别特征的每个类别频数可视化(count_plot)

##  5) 类别特征的每个类别频数可视化(count_plot)
def count_plot(x,  **kwargs):
    sns.countplot(x=x)
    x=plt.xticks(rotation=90)
 
f = pd.melt(Train_data,  value_vars=categorical_features)
g = sns.FacetGrid(f, col="variable",  col_wrap=2, sharex=False, sharey=False, height=5)
g = g.map(count_plot, "value")
plt.show()

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

 2.3.3用pandas_profiling生成数据报告

pfr = pandas_profiling.ProfileReport(Train_data)
pfr.to_file("./example.html")

 2.3.4特征与标签构建

  • 提取数值类型特征列名
numerical_cols = Train_data.select_dtypes(exclude='object').columns
print(numerical_cols)


categorical_cols = Train_data.select_dtypes(include='object').columns
print(categorical_cols)

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

  • 构建训练和测试样本
## 选择特征列
feature_cols = [col for col in numerical_cols if col not in ['SaleID','name','regDate','creatDate','price','model','brand','regionCode','seller']]
feature_cols = [col for col in feature_cols if 'Type' not in col]
 
## 提前特征列,标签列构造训练样本和测试样本
X_data = Train_data[feature_cols]
Y_data = Train_data['price']
 
X_test  = Test_data[feature_cols]
 
print('X train shape:',X_data.shape)
print('X test shape:',X_test.shape)
  1. X train shape: (150000, 18)

  2. X test shape: (50000, 18)

  • 统计标签的基本分布信息
## 定义了一个统计函数,方便后续信息统计
def Sta_inf(data):
    print('_min',np.min(data))
    print('_max:',np.max(data))
    print('_mean',np.mean(data))
    print('_ptp',np.ptp(data))
    print('_std',np.std(data))
    print('_var',np.var(data))
    
print('Sta of label:')
Sta_inf(Y_data)

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

## 绘制标签的统计图,查看标签分布
plt.hist(Y_data)
plt.show()

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

  •  缺省值用-1填补
X_data = X_data.fillna(-1)
X_test = X_test.fillna(-1)

2.4模型训练与预测

2.4.1 利用xgb进行五折交叉验证查看模型的参数效果

## xgb-Model
xgr = xgb.XGBRegressor(n_estimators=120, learning_rate=0.1, gamma=0, subsample=0.8,\
        colsample_bytree=0.9, max_depth=7) #,objective ='reg:squarederror'
#簇120,学习率0.1 ,深度为7
scores_train = []
scores = []
 
## 5折交叉验证方式,防止过拟合
sk=StratifiedKFold(n_splits=5,shuffle=True,random_state=0)
for train_ind,val_ind in sk.split(X_data,Y_data):
    
    train_x=X_data.iloc[train_ind].values
    train_y=Y_data.iloc[train_ind]
    val_x=X_data.iloc[val_ind].values
    val_y=Y_data.iloc[val_ind]
    
    xgr.fit(train_x,train_y)
    pred_train_xgb=xgr.predict(train_x)
    pred_xgb=xgr.predict(val_x)
    
    score_train = mean_absolute_error(train_y,pred_train_xgb)
    scores_train.append(score_train)
    score = mean_absolute_error(val_y,pred_xgb)
    scores.append(score)
 
print('Train mae:',np.mean(score_train))
print('Val mae',np.mean(scores))

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

 可以手动调参一下值:然后比较mae是否会下降,尤其是验证集上的值。

## xgb-Model
xgr = xgb.XGBRegressor(n_estimators=120, learning_rate=0.1, gamma=0, subsample=0.8,\
        colsample_bytree=0.9, max_depth=7) #,objective ='reg:squarederror'
 
learning_rate=0.1
subsample=0.8
max_depth=7
n_estimators=120

2.4.2 定义xgb和lgb模型函数

def build_model_xgb(x_train,y_train):
    model = xgb.XGBRegressor(n_estimators=150, learning_rate=0.1, gamma=0, subsample=0.8,\
        colsample_bytree=0.9, max_depth=7) #, objective ='reg:squarederror'
    model.fit(x_train, y_train)
    return model
 
def build_model_lgb(x_train,y_train):
    estimator = lgb.LGBMRegressor(num_leaves=127,n_estimators = 150)
    param_grid = {
        'learning_rate': [0.01, 0.05, 0.1, 0.2],
    }
    gbm = GridSearchCV(estimator, param_grid)  #网格搜索
    gbm.fit(x_train, y_train)
    return gbm

网格搜索自动调参方式,对param_grid中参数进行改正,可以添加学习率等等参数

 param_grid = {
        'learning_rate': [0.01, 0.05, 0.1, 0.2],
        'n_estimators': [100, 140, 120, 130],
         
    }

这里就有4*4=16种可能,选出交叉验证效果最好的。

2.4.3 切分数据集(Train,Val)进行模型训练,评价和预测

## Split data with val
x_train,x_val,y_train,y_val = train_test_split(X_data,Y_data,test_size=0.3)

 按比例切分,也可以4:1 即test_size=0.2

 print('Train lgb...')
model_lgb = build_model_lgb(x_train,y_train)
val_lgb = model_lgb.predict(x_val)
MAE_lgb = mean_absolute_error(y_val,val_lgb)
print('MAE of val with lgb:',MAE_lgb)
 
print('Predict lgb...')
model_lgb_pre = build_model_lgb(X_data,Y_data)
subA_lgb = model_lgb_pre.predict(X_test)
print('Sta of Predict lgb:')
Sta_inf(subA_lgb)

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

print('Train xgb...')
model_xgb = build_model_xgb(x_train,y_train)
val_xgb = model_xgb.predict(x_val)
MAE_xgb = mean_absolute_error(y_val,val_xgb)
print('MAE of val with xgb:',MAE_xgb)
 
print('Predict xgb...')
model_xgb_pre = build_model_xgb(X_data,Y_data)
subA_xgb = model_xgb_pre.predict(X_test)
print('Sta of Predict xgb:')
Sta_inf(subA_xgb)

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

可以看到预测结果:最小值为负值,价格应该为证,导致这个情况就是一些异常值存在,应该剔除。

2.4.4 进行两模型的结果加权融合

## 这里我们采取了简单的加权融合的方式
val_Weighted = (1-MAE_lgb/(MAE_xgb+MAE_lgb))*val_lgb+(1-MAE_xgb/(MAE_xgb+MAE_lgb))*val_xgb
val_Weighted[val_Weighted<0]=10 # 由于我们发现预测的最小值有负数,而真实情况下,price为负是不存在的,由此我们进行对应的后修正
print('MAE of val with Weighted ensemble:',mean_absolute_error(y_val,val_Weighted))

权重赋值:看两个模型的MAE,误差大的权重小,误差小的权重大点。

MAE of val with Weighted ensemble: 680.311014330194

比上述下降一些。

sub_Weighted = (1-MAE_lgb/(MAE_xgb+MAE_lgb))*subA_lgb+(1-MAE_xgb/(MAE_xgb+MAE_lgb))*subA_xgb
 
## 查看预测值的统计进行
plt.hist(Y_data)
plt.show()

预测汽车折扣的模型,机器学习,数据挖掘,汽车,人工智能,机器学习

三、经验总结

数据探索有利于我们发现数据的一些特性,数据之间的关联性,对于后续的特征构建是很有帮助的。

  1. 对于数据的初步分析(直接查看数据,或.sum(), .mean(),.descirbe()等统计函数)可以从:样本数量,训练集数量,是否有时间特征,是否是时许问题,特征所表示的含义(非匿名特征),特征类型(字符类似,int,float,time),特征的缺失情况(注意缺失的在数据中的表现形式,有些是空的有些是”NAN”符号等),特征的均值方差情况。

  2. 分析记录某些特征值缺失占比30%以上样本的缺失处理,有助于后续的模型验证和调节,分析特征应该是填充(填充方式是什么,均值填充,0填充,众数填充等),还是舍去,还是先做样本分类用不同的特征模型去预测。

  3. 对于异常值做专门的分析,分析特征异常的label是否为异常值(或者偏离均值较远或者事特殊符号),异常值是否应该剔除,还是用正常值填充,是记录异常,还是机器本身异常等

  4. 对于Label做专门的分析,分析标签的分布情况等。

  5. 进步分析可以通过对特征作图,特征和label联合做图(统计图,离散图),直观了解特征的分布情况,通过这一步也可以发现数据之中的一些异常值等,通过箱型图分析一些特征值的偏离情况,对于特征和特征联合作图,对于特征和label联合作图,分析其中的一些关联性。


 来源:

B.数据挖掘[一]---汽车车交易价格预测(测评指标;EDA)_汀、人工智能的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-760833.html

到了这里,关于数据挖掘:汽车车交易价格预测(测评指标;EDA)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python【二手车价格预测案例】数据挖掘

    随着代步工具的普及,“买卖车”需求激增。但对于部分预算有限的个体或家庭而言,购置一辆二手车更为明智。二手车的巨大供给需求催生了近年来日益壮大的二手车市场,但二手车的售卖面临着价格漂浮的问题。 因此,我们的目标是根据卖家或买家提供的参数信息计算价

    2023年04月09日
    浏览(56)
  • 数据挖掘:心脏病预测(测评指标;EDA)

    目录 一、前期准备 二、实战演练 2.1分类指标评价计算示例  2.2数据探索性分析(EDA) 2.2.1 导入函数工具箱 2.2.2 查看数据信息等相关数据 判断数据缺失和异常 数字特征相互之间的关系可视化  类别特征分析(箱图,小提琴图,柱形图)  2.2.3特征与标签构建 2.3模型训练与预

    2024年02月03日
    浏览(45)
  • 数据挖掘(4.1)--分类和预测

    目录 前言 一、分类和预测 分类 预测 二、关于分类和预测的问题 准备分类和预测的数据 评价分类和预测方法 混淆矩阵 评估准确率 参考资料 分类:离散型、分类新数据 预测:连续型、预测未知值 描述属性:连续、离散 类别属性:离散 有监督学习: 分类 训练样本有标签

    2023年04月21日
    浏览(45)
  • HNU-数据挖掘-实验4-链接预测

    计科210X 甘晴void 202108010XXX 节点分类(Node Classification)是图/图谱数据上常被采用的一个学习任务,既是用模型预测图中每个节点的类别。链接预测(Link Prediction)一般指的是,对存在多对象的总体中,每个对象之间的相互作用和相互依赖关系的推断过程。 利用已经掌握的深

    2024年01月22日
    浏览(54)
  • 【数据挖掘】数据挖掘、关联分析、分类预测、决策树、聚类、类神经网络与罗吉斯回归

      数据挖掘是20世纪末兴起的数据智能分析技术,由于有广阔的应用前景而备受重视   广大从事 数据库应用与决策支持 ,以及 数据分析 等学科的科研工作者和工程技术人员迫切需要了解和掌握。 数据挖掘涉及的内容较为广泛,已成为信息社会中广泛应用的一门综合性

    2024年02月08日
    浏览(52)
  • 数据分析与数据挖掘实战案例本地房价预测(716):

    2022 年首届钉钉杯大学生大数据挑战赛练习题目 练习题 A:二手房房价分析与预测 要点: 1、机器学习 2、数据挖掘 3、数据清洗、分析、pyeahcrs可视化 4、随机森林回归预测模型预测房价 1、读入数据、清洗数据: 2、解决相关问题: (一) 根据附件中的数据集,将二手房数据

    2024年02月07日
    浏览(55)
  • kaggle新赛:写作质量预测大赛【数据挖掘】

    赛题名称: Linking Writing Processes to Writing Quality 赛题链接: https://www.kaggle.com/competitions/linking-writing-processes-to-writing-quality 写作过程中存在复杂的行为动作和认知活动,不同作者可能采用不同的计划修订技术、展示不同的停顿模式或在全过程中策略性地分配时间,这些都可能影

    2024年02月07日
    浏览(44)
  • 用银行营销数据学习数据挖掘:探索预测客户购买行为的模型

    来源: UCI Machine Learning Repository (UCI Machine Learning Repository) 数据集信息: 这份数据与葡萄牙银行机构的直接营销活动有关。这些营销活动基于电话呼叫。通常需要多次联系同一客户,以确定是否会订阅产品(银行定期存款)。 属性信息: 输入变量: 1-age:年龄(数值型)

    2024年02月08日
    浏览(47)
  • 基于数据挖掘的共享单车骑行数据分析与预测

      完整代码下载: https://download.csdn.net/download/andrew_extra/88612623 共享单车系统在大城市越来越流行,通过提供价格合理的自行车租赁,让人们可以享受在城市里骑自行车的乐趣,而无需为自己购买自行车。本项目利用 Nice Ride MN 在双子城(明尼苏达州明尼阿波利斯市/圣保罗市)

    2024年02月11日
    浏览(42)
  • Python深度数据挖掘之电力系统负荷预测

      本案例将根据已收集到的电力数据,深度挖掘各电力设备的电流、电压和功率等情况,分析各电力设备的实际用电量,进而为电力公司制定电能能源策略提供一定的参考依据。更多详细内容请参考《Python数据挖掘:入门进阶与实用案例分析》一书。   为了更好地监测用

    2024年02月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包