House Prices: Advanced Regression Techniques

1、背景说明

2、前期准备

3、程序设计

4、知识点说明

5、测试结果

6、总结

7、附录:解释特征

-----------------------------------------------

1、背景说明

1.1 项目名称:House Prices_Advanced Regression Techniques https://www.kaggle.com/c/house-prices-advanced-regression-techniques

1.2 实现目标:预测出测试集的售价,通过RMSE来进行评分

1.3 我的成绩:https://www.kaggle.com/gelhart 275/4076 7%

1.4 所需工具:python以及相关数据包、使用Sublime txt、iPython notebook调试程序

1.4 全部代码:

-----------------------------------------------

2、前期准备

2.1 安装组件:python3.6、numpy、pandas、scipy、matplotlib、sklearn、ipython、Sublime txt

2.2 下载数据:https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data 其中train.csv是训练集,test.csv是测试集,sample submission.csv是提交样例。

2.3 观察分析数据,掌握每个特征的名称、含义、数据类型和数据内容。

-----------------------------------------------

3、程序设计

3.1 头文件:

import pandas as pd#数据处理

import matplotlib.pyplot as plt #plot.scatter画散点图

import seaborn as sns#画热力图/箱型图

import numpy as np#数据处理

from scipy.stats import skew#求偏度

import warnings

warnings.filterwarnings("ignore")#忽略警告

from sklearn.base import BaseEstimator, TransformerMixin, RegressorMixin, clone# sklearn基础函数

from sklearn.preprocessing import LabelEncoder#转换

from sklearn.preprocessing import RobustScaler, StandardScaler#编码

from sklearn.preprocessing import Imputer#处理缺失值

from sklearn.metrics import mean_squared_error#均方误差

from sklearn.pipeline import Pipeline, make_pipeline#流水线

from sklearn.decomposition import PCA, KernelPCA#PCA改变维度技术

from sklearn.model_selection import cross_val_score,KFold,GridSearchCV#交叉搜索、交叉搜索、调参

#以下都是不同的机器学习算法

from sklearn.linear_model import LinearRegression

from sklearn.linear_model import Ridge

from sklearn.linear_model import Lasso

from sklearn.linear_model import ElasticNet, SGDRegressor, BayesianRidge

from sklearn.kernel_ridge import KernelRidge

from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor, ExtraTreesRegressor

from sklearn.svm import SVR, LinearSVR

3.2 导入数据

目的:将数据导入并且加工成适合于数据预处理的数据集。

在这一部分中,我们导入训练集和测试集。删除一些训练集中不符合实际情况的数据(怎么删除自己定),然后将两个数据集联合成一个整体,以便下文中进行预处理。

3.3 显示预测量基本情况

目的:对于售价这个特征有一个整体的认识,从分布到偏度峰度。

在这一部分中,我们对于预测量售价打印其属性。

3.4 数据的可视化

目的:通过建立特征和预测量的关系图以及关联热力图,我们对特征的重要性和相关性进行推测。那些没有起到什么作用的特征可以处理掉。从而达到剪枝的目的。

在这一部分需要三个函数,分别是热力图函数、箱型图函数和散点图函数。其中热力图函数是售价和多个特征变量之间的关系。箱型图是单个离散变量(比如建造年代)和售价的关系,散点图是单个连续变量(比如车库面积)和售价的关系。

以上的操作几乎对于原始数据没有什么修改和处理,以预览和观察规律为主。接下来就会进行数据的预处理和分析,对数据进行大幅度的修改。

3.5 数据的清洗与填充

目的:了解特征数据的缺失情况,对于不同种的特征数据利用不同方式进行填充。

首先我们构建一个函数来显示整个数据集(训练集+测试集)的条目缺失情况。然后分析这些缺失是由什么原因造成的。接下来对于缺失的特征数据,有些可以用None填充表示没有,有些如面积一类的情况用0填充,还有些用众数和中位数进行填充。

3.6 特征工程

目的:对那种标签型特征进行数值化,创建新的符合要求的特征并且删掉不需要的特征。

先通过建立需要修改的变量和售价的表格来进行数值确定,接下来通过map函数进行映射,最后删掉多余的条目。

3.7 构建流水线

目的:得到一个经过处理的训练集、测试集和预测值集。

先对年代进行标准化,然后对于标签特征进行one_hot矩阵编码。接下来划分新得到的数据集为测试集、训练集和预测集,其中对测试集和训练集的数值进行标准化,预测集进行对数化。

3.8 特征组合后进行流水线尝试

目的:在上一个层面的基础上,增加了特征组合这一流程,得到一个经过处理的训练集、测试集和预测值集,并且进行维度调整。

先对年代进行标准化,然后进行特征组合。对于标签特征进行one_hot矩阵编码。接下来划分新得到的数据集为测试集、训练集和预测集,其中对测试集和训练集的数值进行标准化,预测集进行对数化。最后调用PCA函数,对于测试集和训练集调整维度。

3.9、基本建模与参数评估

目的:在这一部分中,我们用一些模型来对上一部分的数据求得结果,并且调整参数实现效果最优。

在这一部分中,我们罗列出一些典型的模型。我们使用这些模型来对数据集进行预测,从而得出一个初步的预测结果。其中Ridge0.1172 Lasso0.1296 SVR0.1129 Ela0.1104 Bay0.1109 Ker0.1101的效果比较好。接下来我们通过枚举法,枚举出一个模型可能的参数,通过结果来推测参数如何设置可以获取最好的结果。

3.10、集成建模评估

目的:采取boosting方法集成多个模型进行学习,从而得出更好的预测结果。也采用stacking方法进行集成得到结果,并且对两者进行比对。

创建了权重评估函数,使用SKR和KER算法并且按照0.55:0.45的权重进行建模。Stacking算法中,使用svr,ker,ela,bay作为头层算法,使用KER作为第二层算法进行建模

3.11 提交

目的:分别生成权重建模法和Stacking建模法的结果。

格式为ID+预测数值,保存为CSV格式文件。

-----------------------------------------------

4、知识点说明

我们将在这一部分中列举出本次项目中的一些关键的、重要的知识点。

4.1 csv文件的导入和导出

DataFrame=pd.read_csv('文件位置')

result.to_csv("文件名字.csv")

4.2 删除数据表中的某一列

combine.drop(['Id'])#删除数据表中Id这一列

4.3 合并两个表格

combine=pd.concat([train,test])

4.4 峰度和偏度

峰度代表了集中程度,标准正态分布等于3,大于3是厚尾。偏度表示偏离程度,正偏离大于0,右侧范围更广。

4.5 散点图

data = pd.concat([train[seq], train[var]], axis=1)#联合数据,加入axis=1这个

data.plot.scatter(x=var, y=seq, ylim=(0,800000))

4.6 箱型图

data = pd.concat([train[seq], train[var]], axis=1)#联合数据,加入axis=1这个

fig = sns.boxplot(x=var, y=seq, data=data)

4.7 空缺统计以及排序输出数组

aa = combine.isnull().sum()#把缺少的统计出来

print(aa[aa>0].sort_values(ascending=False))#降序排列

4.8 中位数填充

combine['LotFrontage']=combine.groupby(['LotAreaCut'])['LotFrontage'].transform(lambda x: x.fillna(x.median()))

4.9 标签标准化:对于这种不规范的数字标签,使用这种方式可以让其标准化,

lab=LabelEncoder()

X["YearBuilt"] = lab.fit_transform(X["YearBuilt"])#由STR格式转换成了INT格式

4.10 偏度筛选与one-hot编码

X_numeric=X.select_dtypes(exclude=["object"])#选择出数值型特征

skewness = X_numeric.apply(lambda x: skew(x))#特征的集合,显示了上文每个特征的偏度

skewness_features = skewness[abs(skewness) >= self.skew].index#找出偏度大于1的特征

X[skewness_features] = np.log1p(X[skewness_features])#对数化处理

X = pd.get_dummies(X)#进行onehot编码升维,数值型保持不变,标签型进行矩阵编码

4.11 数值标准化:把不同范围的数字特征进行标准化,转换为数组。便于接下来进行处理和比对

scaler = RobustScaler()#设定RoubustScaler函数,进行标准化

X_scaled = scaler.fit(X).transform(X)#使用了ROBUST标准化训练集

4.12 数据处理的方法:

对于和售价有明显关联的变量,可以进行数字化,创建新的维度。对于标签变量,进行One_hot矩阵编码。对于数字变量进行标准化归一化处理。

4.13 显示重要性

lasso=Lasso(alpha=0.001)#定义一个含参的LASSO回归

lasso.fit(X_scaled,y_log)#使用LASSO进行训练模型

FI_lasso = pd.DataFrame({"Feature Importance":lasso.coef_}, index=data_pipe.columns)#对特征进行排序,按照其重要性,其中lasso.coef_是lasso中的向量参数。不同的方法权重略有不同,但是大体上还是差不多的。

4.14 主要成分分析

dimension=382

pca = PCA(n_components=dimension)#降维,主程序分析,参数可以调节

X_scaled=pca.fit_transform(X_scaled)#PCA处理,拟合数据标准化

4.15 均方误差

rmse = np.sqrt(-cross_val_score(model, X, y, scoring="neg_mean_squared_error", cv=5))#5折交叉验证,使用neg_mean_squared_error方法。

4.16 Stacking

https://blog.csdn.net/wstcjf/article/details/77989963

-----------------------------------------------

5、测试结果 越低越好

Weight:0.10774715296235023

Stacking:0.10192014905909956

-----------------------------------------------

6、总结

第一次完整的做一个机器学习的项目。

数据处理方面要比预想的重要许多。

大量的时间用于数据的预处理以及模型的调整参数中。

如果想要再提升的话,需要使用其他算法以及在预处理过程中调整map。

总结一下流程就是:了解特征的意义,然后清洗处理空缺和异常的数据。接下来把数据特征转换为可以让机器明白的样子,最后建模求解。

可以考虑使用其他的编码方式进行特征工程。

END

-----------------------------------------------

猜你喜欢

转载自blog.csdn.net/u010929628/article/details/88532886