建模与调参+模型结果融合

一、建模与调参

1.线性回归模型

线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。
训练模型的过程其实就是根据训练集的这些(X,Y)样本来求出合适的权重w, 然后对新的测试集X预测相应的Ytest,这个Ytest其实就是我们想要的答案。这就是这部分的逻辑。

# 导入之前处理好的数据(我之前数据特征工程这块做得不好,需要再过一遍相关知识)
data = pd.read_csv('./pre_data/pre_data.csv')
data.head()

# 然后训练集和测试集分开
train = data[:train_data.shape[0]]
test = data[train_data.shape[0]:]    # 这个先不用

# 选择那些数值型的数据特征
continue_fea = ['power', 'kilometer', 'v_2', 'v_3', 'v_4', 'v_5', 'v_6', 'v_10', 'v_11', 'v_12', 'v_14',
                'v_std', 'fuelType_price_average', 'gearbox_std', 'bodyType_price_average', 'brand_price_average',
                'used_time', 'estivalue_price_average', 'estivalueprice_std', 'estivalue_price_min']
train_x = train[continue_fea]
train_y = train_data['price']

建立模型如果用sklearn的话还是非常简单的,包括训练和预测。

from sklearn.linear_model import LinearRegression

model = LinearRegression(normalize=True)
model.fit(train_x, train_y)
"""查看训练的线性回归模型的截距(intercept)与权重(coef)"""
print('intercept: ' + str(model.intercept_))
sorted(dict(zip(continue_fea, model.coef_)).items(), key=lambda x: x[1], reverse=True)
##:上面这行代码sorted(d.items()为待排序对象, key=lambda x: x[1]是为了用前面对象的第二维数据即value的值进行排序, reverse=True倒序),dict(zip()用于将两个可迭代对象中对应元素打包成一个个元组,然后返回这些元组组成的列表,dict进而把元组列表创建字典)

## 结果:
intercept: -178881.74591832393
[('v_6', 482008.29891714785),
 ('v_std', 23713.66414841167),
 ('v_10', 7035.056136559963),
 ('v_14', 1418.4037751433352),
 ('used_time', 186.48306334062053),
 ('power', 12.19202369791551),
 ('estivalue_price_average', 0.4082359327905722),
 ('brand_price_average', 0.38196351334425965),
 ('gearbox_std', 0.1716754674248321),
 ('fuelType_price_average', 0.023785798378739224),
 ('estivalueprice_std', -0.016868767797045624),
 ('bodyType_price_average', -0.21364358471329278),
 ('kilometer', -155.11999534761347),
 ('estivalue_price_min', -574.6952072539285),
 ('v_11', -1164.0263997737668),
 ('v_12', -1953.0558048250668),
 ('v_4', -2198.03802357537),
 ('v_3', -3811.7514971187525),
 ('v_2', -5116.825271420712),
 ('v_5', -447495.6394686485)]

上面的这些就是我们那个等式中每个x前面的系数, intercept这个代表那个b, 我们上面说过了,有了系数,我们就可以对新的样本进行预测。 预测也很简单,只需要

y_pred = model.predict(x_test)

在后面模型对比中会发现线性模型的效果不好,因为我们前面特征选择的时候也看到过了啊, 并不是所有的数值特征都和price有相关关系啊, 还有一些非线性关系吧, 这些线性模型就捕捉不到了,并且一般线性模型喜欢那种归一化或者标准化的数据, 导致和非线性模型的数据还得分开处理,所以这个比赛不会用到线性模型。
但是关于线性模型还有些好玩的东西我们得了解一下, 比如从这些权重中如何看出哪个特征对线性模型来说更加重要些? 这个其实我们看的是权重的绝对值,因为正相关和负相关都是相关, 越大的说明那个特征对线性模型影响就越大。
通过作图我们发现数据的标签(price)呈现长尾分布,不利于我们的建模预测。原因是很多模型都假设数据误差项符合正态分布,而长尾分布的数据违背了这一假设。(如果误差项满足正态分布,Q-Q Plot里的散点会近似的落在一条直线上。若不满足正态分布,则散点会偏离该直线。)
所以,我们不妨取对数一下:

train_y_ln = np.log1p(train_y)#log1p=log(x+1),log实现正态分布,+1能够避免x很小的的问题。还原的话用expm1
print('The transformed price seems like normal distribution')
plt.figure(figsize=(15,5))
plt.subplot(1,2,1)
sns.distplot(train_y_ln)
plt.subplot(1,2,2)
sns.distplot(train_y_ln[train_y_ln < np.quantile(train_y_ln, 0.9)])

2.1交叉验证

这个常用来做算法的评估,评估就是估计算法在预测新数据的时候能达到什么程度。
因为在实际的训练中,训练的结果对于训练集的拟合程度通常还是挺好的(初始条件敏感),但是对于训练集之外的数据的拟合程度通常就不那么令人满意了。因此我们通常并不会把所有的数据集都拿来训练,而是分出一部分来(这一部分不参加训练)对训练集生成的参数进行测试,相对客观的判断这些参数对训练集之外的数据的符合程度。这种思想就称为交叉验证(Cross Validation)。 交叉验证中,比较常用的就是K折交叉验证了,它有效的避免过拟合,最后得到的结果也比较具有说服性所以我们重点来看看这一块。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值