[Kaggle]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以及相关库(numpy,pandas,skelearn,matplotlib,seaborn)、使用Sublime txt、iPython notebook调试程序


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#数据处理,pandas的基础

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 导入数据

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

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

 

3.3 显示预测量基本情况

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

在这一部分中,我们先要搞懂各个特征的含义,官方已经给出了说明文档。然后考察每个特征的属性(离散/连续/对象),有哪些可能取值,以及取值的情况(describe())

 

3.4 数据的可视化

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

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

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

 

3.5 数据的清洗与填充

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

在这一部分中,我们需要先了解特征的缺失情况。然后根据不同的情况以及数据的类型,来考虑填充0,NONE,中位值/均值/众数,根据不同的所在街区的情况来进行填充(比如LotFrontage这个变量就是根据缺失值的LotArea的档位(根据频率分档)来划分的,计算出不同LotArea档位的LotFrontage均值,然后填充)

 

3.6 特征工程

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

特征工程的意义在于使得特征能够理解数据能够更好的被计算机理解。这里有很多很细节的内容操作如下:首先我们先把一些凌乱的数字转换成分类特征(本身就是离散值,不是连续数值),便于处理。然后将这些转换过的特征的取值通过和售价建立联系,作出一个哈希表,然后根据售价的均值进行映射成0~N的自然数变量,实现了LabelEncoder的目的。

 

3.7 特征工程2·构建流水线

目的:对于其他数据进行整体的特征处理,并且划分训练集和测试集

在上一部分对一些类别特征进行处理后,我们再对于其它特征进一步处理。像是年代这种的特征直接使用LabelEncoder即可。对于连续的数值特征,我们可以对一些偏度比较大的特征做对数平滑(np.log1p)以及独热编码。接下来对于所有的数据我们要进行标准化/归一化(这里可以考虑用标准化,最大最小化和鲁棒化,我采用了鲁棒使用为对outline数据效果最好),然后把两个集合划分开。

 

3.8 特征工程3·特征组合与PCA

目的:在上一个层面的基础上,进行特征组合增加特征维度,并且使用PCA来调整整个数据集的维度。

我们先通过lasso来计算特征的系数。lasso回归属于L1正则回归,可以让那些重要性不高的特征参数更容易为0,把重要性比较高的特征凸显出来。这时候计算绝对值,把其中一些不那么重要的特征删除掉(这个阈值还是自己不断测试来把握)。于此同时,通过特征本来的含义,我们可以组合一些特征混进去。这种特征虽然是可以根据其他特征求出来,但是通过这种方式加快运算速度,增加重要特征。最后将这些处理方法综合起来,进行一次完整流水线处理。然后通过PCA调整维度。

 

3.9、基本建模与参数评估

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

首先,我们构建均方根误差评分函数(采用交叉验证的方式)(误差越小越好)。采用了一些经典算法(LinearRegression Ridge Lasso Random Forrest Gradient Boosting Tree Support Vector Regression Linear Support Vector Regression ElasticNet Stochastic Gradient Descent BayesianRidge KernelRidge ExtraTreesRegressor XgBoost)来进行处理。首先我们采用默认的参数来跑一遍,看看大致的效果,然后选出几个算法(LR LASSO RIDGE RF GBDT SVR XGB GB)来进行参数的调整(使用网格搜索)

 

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、总结

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

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

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

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

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

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

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(机器学习,Kaggle,工程实践)