Python数据分析——California房价的线性梯度提升回归模型学习笔记

目 录

1 需求分析

2 数据探索

3 数据预处理

4 构建模型与评估


1 需求分析

这是个输出模型,模型的输出是某个地区的房价。显而易见是监督学习的任务。另外,因为这是个预测准确值的任务,所以它也是个回归任务。

1)监督学习(Supervised learning):根据已有的数据集,知道输入和输出结果之间的关系。根据这种已知的关系,训练得到一个最优的模型。也就是说,在监督学习中训练数据既有特征(feature)又有标签(label),通过训练,让机器可以自己找到特征和标签之间的联系,在面对只有特征没有标签的数据时,可以判断出标签。通俗一点,可以把机器学习理解为我们教机器如何做事情。回归(Regression)、分类(Classification)  

2)无监督学习(Unsupervised Learning ),我们不知道数据集中数据、特征之间的关系,而是要根据聚类或一定的模型得到数据之间的关系。可以这么说,比起监督学习,无监督学习更像是自学,让机器学会自己做事情,是没有标签(label)的。

2 数据探索

2.1 初步探索

1) 导入数据

import pandas as pd

def LoadData(file):
    return pd.read_csv('D:/Project/Anaconda/Lib/site-packages/sklearn/datasets/data/'+file,encoding='gbk')
data = LoadData('California.csv')
data.head(5)

查看导入的结果,每个数据有十个特征,分别是经度,纬度,房屋年龄中位数,房间总数,卧室总数,地区人口数,家庭数量,收入中位数,房价中位数以及一个位置属性(是否接近湾区)。

 

 2) 使用Info()和describe()函数查看数据属性

data.info()

info()函数
功能: 给出样本数据的相关信息概览 :行数,列数,列索引,列非空值个数,列类型,内存占用
使用格式:DataFrame.info(verbose=None, memory_usage=True, null_counts=True) 
参数解释:

verbose:True or False,字面意思是冗长的,也就说如何DataFrame有很多列,是否显示所有列的信息;如果为否,那么会省略一部分;
memory_usage:True or False,默认为True,是否查看DataFrame的内存使用情况;
null_counts:True or False,默认为True,是否统计NaN值的个数 

运行结果如图:

 可以看到有的属性有缺失值,有的属性类型不为数值型。

data.describe()

功能:直接给出样本数据的一些基本的统计量,包括均值,标准差,最大值,最小值,分位数等。
使用格式:data.describe()
可以传递一些参数,如percentiles = [0.2,0.4,0.6,0.8]就是指定0.2,0.4,0.6,0.8分位数,而不是默认的0.25,0.5,0.75分位数

 

 拿房屋年龄中位数举例,它的25%显示是18,表示有25%的地区房子年龄少于18年,50%的地区房子年龄少于29年,75%的房子年龄少于37年。这三个属性有助于我们了解数据的基本分布情况。

2.2 数据集分割 

from sklearn.model_selection import train_test_split

house_train,house_test = train_test_split(data, test_size=0.2, random_state=24)
print("train :",len(house_train)," test:",len(house_test) )

train : 16512  test: 4128

功能是从样本中随机的按比例选取traindata和testdata,形式为:
X_train,X_test, y_train, y_test = cross_validation.train_test_split(train_data,train_target,test_size=0.4, random_state=0)

参数解释:
 train_data:所要划分的样本特征集
 train_target:所要划分的样本结果 
 test_size:样本占比,如果是整数的话就是样本的数量 
 random_state:是随机数的种子。
随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。
比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。 
随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则: 
种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。

 2.3 相关性探索

housing = house_train.copy()
corr_matrix = housing.corr()
corr_matrix["median_house_value"].sort_values(ascending=False)

 运行结果如下,这是计算每个属性之间的标准相关系数(也称作皮尔逊相关系数),查看每个属性和median_house_value的相关系数,数值在[-1,1]之间。 接近1时,说明两个特征有很明显的正相关关系;相反则是有很明显的负相关关系;如果是0,则说明没有相关关系。

再看一下热力图:

 

heatmap热度图,拿到一批数据一般会求特征之间的相关系数,可以用padas直接求出来相关系数,放到heatmap,可以很清楚的看到两个特征的相关程度,这是一个固定的数据思维。

3 数据预处理

数据预处理是构建特征工程的基本环境,并且是提高算法精确度的有效手段。数据预处理需要根据数据本身的特性进行,不同的格式有不同的处理要求,比如无效的要剔除,缺失值要回填和冗余维度的选择等。

3.1 SKLearn进行数据预处理介绍

1)无量纲化

在机器学习算法实践中,我们往往有着将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布的需求,这种需求统称为将数据无量纲化。数据的无量纲化可以是线性的,也可以是非线性的。

2)缺失值处理

数据处理过程中,不可避免的会出现很多空值,这时就需要我们通过业务经验选择性的进行数值填充,尽量保证模型的准确性。

 sklearn.impute.SimpleImputer(missing_values=nan,strategy=‘mean’, fill_value=None, verbose=0, copy=True)

参数介绍:
1.missing_values:告诉SimpleImputer,数据中的缺失值长什么样,默认空值np.nan
2.strategy:我们填补缺失值的策略,默认均值。
输入“mean”使用均值填补(仅对数值型特征可用)
输入“median"用中值填补(仅对数值型特征可用)
输入"most_frequent”用众数填补(对数值型和字符型特征都可用)
输入“constant"表示请参考参数“fill_value"中的值(对数值型和字符型特征都可用)
3.fill_value:当参数startegy为”constant"的时候可用,可输入字符串或数字表示要填充的值,常用0。
4.copy:默认为True,将创建特征矩阵的副本,反之则会将缺失值填补到原本的特征矩阵中去。

 3)分类型特征处理

由于很多的机器学习算法是计算数值型数据的,但现实情况下特征数据中包含很多文本数据,又不能忽略掉。在这种情况下,为了让数据适应算法和库,我们必须将数据进行编码,即是说,将文字型数据转换为数值型。

preprocessing.LabelEncoder 标签专用,能够将分类转换为分类数值,是对不连续的数字或者文本进行
编号(连续的会是同一个编号)。
preprocessing.OrdinalEncoder 特征专用,能够将分类特征转换为分类数值,其主要处理有序变量。
preprocessing.OneHotEncoder 独热编码,创建哑变量,其处理名义变量

举个例子: 

自然状态码为:000,001,010,011,100,101
独热编码为:000001,000010,000100,001000,010000,100000
可以这样理解,对于每一个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个二元特征
(如成绩这个特征有好,中,差变成one-hot就是011, 010, 001)。并且,这些特征互斥,每次只有一个激活;而且,可以表示原始数据的大小。)

4)连续型特征处理

sklearn.preprocessing.Binarizer类
根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量。

preprocessing.KBinsDiscretizer
这是将连续型变量划分为分类变量的类,能够将连续型变量排序后按顺序分箱后编码。

3.2 本项目中的实现

 

from  sklearn.pipeline  import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder


#拆分数据,获得特征矩阵H以及只含有median_house_value作为真实的label值,y值 
housing=house_train.drop("median_house_value",axis=1)
housing_labels=house_train["median_house_value"].copy()
housing_copy = housing.drop("ocean_proximity",axis=1)#去掉干扰值

num_attribs = list(housing_copy)
cat_attribs = ['ocean_proximity']

num_type_pipeline=Pipeline([
    ('simputer',SimpleImputer(strategy="median")),     #用中位数填充
    ('std_scaler',StandardScaler())
    
])

full_pipeline = ColumnTransformer([
        ("num", num_type_pipeline, num_attribs),
        ("cat", OneHotEncoder(), cat_attribs),        #使用独热编码
    ])

housing_prepared = full_pipeline.fit_transform(housing)#x值
housing_prepared.shape

输出:(16512, 13)

介绍这个流水线式的处理思想:

在Sklearn当中有三大模型:Transformer 转换器、Estimator 估计器、Pipeline 管道

  • Transformer转换器 (StandardScaler,MinMaxScaler)。
  • Estimator 估计器(LinearRegression、LogisticRegression、LASSO、Ridge),所有的机器学习算法模型,都被称为估计器。
  • Pipeline 管道:将Transformer、Estimator 组合起来成为一个大模型。输入→□→□→□→■→ 输出                                     □:Transformer ; ■:Estimator ;Transformer放在管道前几个模型中,而Estimator 只能放到管道的最后一个模型中。

pipeline用于对特征处理、数据转换、回归或分类等多个步骤进行串联,功能是实现多个estimator的串行处理。

featureunion用于对特征的处理,功能是实现多个transformer的并行处理,最终输出它们的结果的并集。每个transformer的输入都是全部的原始特征。

ColumnTransformer用于对特征的处理,功能是针对不同的列做不同的处理,最终输出各自结果的合集。与featureunion不同的是,它各个transformer的输入是原始特征的一部分。

4 构建模型与评估

  • 根据分析过程中输出和输入的关系,又可以分类成回归分析、聚类分析、分类和关联规则分析等。
  • 根据输入的特征,可以分为监督学习、无监督学习和半监督学习等。
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_squared_error,explained_variance_score,mean_absolute_error,median_absolute_error,r2_score

#预测模型
GBR_house = GradientBoostingRegressor().fit(housing_prepared,housing_labels)
GBR_housing_predictions = GBR_house.predict(housing_prepared)

#评价模型
GBR_mse = mean_squared_error(housing_labels,GBR_housing_predictions)
GBR_ab = mean_absolute_error(housing_labels,GBR_housing_predictions)
GBR_va = explained_variance_score(housing_labels,GBR_housing_predictions)
GBR_mab = median_absolute_error(housing_labels,GBR_housing_predictions)
GBR_r2 = r2_score(housing_labels,GBR_housing_predictions)
GBR_rmse = np.sqrt(GBR_mse)

#输出评价结果
print('GBR回归模型的平均值绝对值为:',GBR_ab)
print('GBR回归模型的中值绝对值为:',GBR_mab)
print('GBR回归模型的可解释方差值为:',GBR_va)
print('GBR回归的决定系数为:',GBR_r2)
print ('GBR回归模型的标准差为:',GBR_rmse)

 

评价结果输出:

GBR回归模型的平均值绝对值为: 37309.044287613804
GBR回归模型的中值绝对值为: 26495.989202691184
GBR回归模型的可解释方差值为: 0.7861164571729515
GBR回归的决定系数为: 0.7861164571729515
GBR回归模型的标准差为: 53398.51873035388

 

参考链接:sklearn.ensemble.GradientBoostingRegressor官方文档:https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html#sklearn.ensemble.GradientBoostingRegressor

GBR模型解释:https://blog.csdn.net/xlsj228/article/details/105122816

                        https://blog.csdn.net/zhsworld/article/details/102951061

 

评估指标解释:
    mean_squared_error:均方差(Mean squared error, MSE),
    该指标计算的是拟合数据和原始数据对应样本点的误差的平方和的均值,其值越小说明拟合效果越好。

     mean_absolute_error:平均绝对误差(Mean Absolute Error, MAE),
    用于评估预测结果和真实数据集的接近程度的程度,其值越小说明拟合效果越好。

    explained_variance_score:解释回归模型的方差得分,其值取值范围是[0,1],
    越接近于1说明自变量越能解释因变量的方差变化,值越小则说明效果越差。

    r2_score:判定系数,其含义是也是解释回归模型的方差得分,其值取值范围是[0,1],
    越接近于1说明自变量越能解释因变量的方差变化,值越小则说明效果越差。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章