二手车价格预测——模型融合
一、bagging/boosting
(一)bagging
1.从原始样本集中使用Bootstraping方法随机抽取n个训练样本,共进行k轮抽取,得到k个训练集。(k个训练集之间相互独立,元素可以有重复)
2.对于k个训练集,我们训练k个模型(这k个模型可以根据具体问题而定,比如决策树,knn等)
3.对于分类问题:由投票表决产生分类结果;对于回归问题:由k个模型预测结果的均值作为最后预测结果。(所有模型的重要性相同)
(二)boosting
1.对于训练集中的每个样本建立权值wi,表示对每个样本的关注度。当某个样本被误分类的概率很高时,需要加大对该样本的权值。
2.进行迭代的过程中,每一步迭代都是一个弱分类器。我们需要用某种策略将其组合,作为最终模型。
(例如AdaBoost给每个弱分类器一个权值,将其线性组合最为最终分类器。误差越小的弱分类器,权值越大)
(三)区别
bagginng | boosting | |
---|---|---|
样本选择 | 随机有放回抽样 | 每一轮的训练集是不变的,改变的只是每一个样本的权重 |
样本权重 | 均匀取样,每个样本权重相等 | 根据错误率调整样本权重,错误率越大的样本权重越大 |
预测函数 | 所有的预测函数的权重相等 | 误差越小的预测函数其权重越大 |
并行运算 | 各个预测函数可以并行生成 | 各个预测函数必须按顺序迭代生成 |
二、stacking/blending
(一)stacking
1.stacking是一种分层模型集成框架。
2.以两层为例,第一层由多个基学习器组成,其输入为原始训练集,第二层的模型则是以第一层基学习器的输出作为特征加入训练集
进行再训练,从而得到完整的stacking模型。
(二)blending
Blending相较于Stacking来说要简单一些,其流程大致分为以下几步:
1. 将数据划分为训练集和测试集(test_set),其中训练集需要再次划分为训练集(train_set)和验证集(val_set);
2. 创建第一层的多个模型,这些模型可以使同质的也可以是异质的;
3. 使用train_set训练步骤2中的多个模型,然后用训练好的模型预测val_set和test_set得到val_predict, test_predict1;
4. 创建第二层的模型,使用val_predict作为训练集训练第二层的模型;
5. 使用第二层训练好的模型对第二层测试集test_predict1进行预测,该结果为整个测试集的结果
三、预览数据
## 基础工具
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')
%matplotlib inline
## 模型预测的
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
数据读取
## 通过Pandas对于数据进行读取 (pandas是一个很友好的数据读取函数库)
path = './datacsv/'
Train_data = pd.read_csv(path+'used_car_train_20200313.csv', sep=' ')
TestA_data = pd.read_csv(path+'used_car_testA_20200313.csv', sep=' ')
## 输出数据的大小信息
print('Train data shape:',Train_data.shape)
print('TestA data shape:',TestA_data.shape