DC学院学习笔记(二十二):用scikit-learn实现数据挖掘建模全过程

大年初四了,哈哈,年快过完了,这套DC学院的《数据分析》课程也快要KO了( ̄︶ ̄)↗ 

一、探索型数据分析

1. 导入数据

import pandas as pd
import numpy as np
%matplotlib notebook
housing_df = pd.read_csv('housing.csv')#具体路径为housing.csv文件保存的绝对路径
housing_df.head(5)


IdMSSubClassMSZoningLotFrontageLotAreaStreetAlleyLotShapeLandContourUtilities...PoolAreaPoolQCFenceMiscFeatureMiscValMoSoldYrSoldSaleTypeSaleConditionSalePrice
0160RL65.08450PaveNaNRegLvlAllPub...0NaNNaNNaN022008WDNormal208500
1220RL80.09600PaveNaNRegLvlAllPub...0NaNNaNNaN052007WDNormal181500
2360RL68.011250PaveNaNIR1LvlAllPub...0NaNNaNNaN092008WDNormal223500
3470RL60.09550PaveNaNIR1LvlAllPub...0NaNNaNNaN022006WDAbnorml140000
4560RL84.014260PaveNaNIR1LvlAllPub...0NaNNaNNaN0122008WDNormal250000

5 rows × 81 columns


注意

  • 这里使用%matpoltlib notebook将绘制的图片内嵌在交互窗口,并且可以方便进一步操作和保存(新绘制另一张图形的时候需要首先点击关闭上一张图形)
  • 数据集下载链接: https://pan.baidu.com/s/1htSLy2g 密码: kdkh

2. 查看数据的属性

print(housing_df.columns)
Index(['Id', 'MSSubClass', 'MSZoning', 'LotFrontage', 'LotArea', 'Street',
       'Alley', 'LotShape', 'LandContour', 'Utilities', 'LotConfig',
       'LandSlope', 'Neighborhood', 'Condition1', 'Condition2', 'BldgType',
       'HouseStyle', 'OverallQual', 'OverallCond', 'YearBuilt', 'YearRemodAdd',
       'RoofStyle', 'RoofMatl', 'Exterior1st', 'Exterior2nd', 'MasVnrType',
       'MasVnrArea', 'ExterQual', 'ExterCond', 'Foundation', 'BsmtQual',
       'BsmtCond', 'BsmtExposure', 'BsmtFinType1', 'BsmtFinSF1',
       'BsmtFinType2', 'BsmtFinSF2', 'BsmtUnfSF', 'TotalBsmtSF', 'Heating',
       'HeatingQC', 'CentralAir', 'Electrical', '1stFlrSF', '2ndFlrSF',
       'LowQualFinSF', 'GrLivArea', 'BsmtFullBath', 'BsmtHalfBath', 'FullBath',
       'HalfBath', 'BedroomAbvGr', 'KitchenAbvGr', 'KitchenQual',
       'TotRmsAbvGrd', 'Functional', 'Fireplaces', 'FireplaceQu', 'GarageType',
       'GarageYrBlt', 'GarageFinish', 'GarageCars', 'GarageArea', 'GarageQual',
       'GarageCond', 'PavedDrive', 'WoodDeckSF', 'OpenPorchSF',
       'EnclosedPorch', '3SsnPorch', 'ScreenPorch', 'PoolArea', 'PoolQC',
       'Fence', 'MiscFeature', 'MiscVal', 'MoSold', 'YrSold', 'SaleType',
       'SaleCondition', 'SalePrice'],
      dtype='object')

属性的详细说明在文件中了,这里省略。

3. 绘制房屋价格分布图

import seaborn as sns
sns.distplot(housing_df['SalePrice'])
<IPython.core.display.Javascript object>

D6AlDPQLG0sZAAAAAElFTkSuQmCC

<matplotlib.axes._subplots.AxesSubplot at 0x223691f3e48>
  • 房屋价格对应的属性是’SalePrice’
  • 可以从图中看到,SalePrice的分布图大致服从右偏态分布,平均数大于中位数
  • 大部分房屋价格在100000到300000之间
  • 有少量的房屋价格大于500000

4. 绘制居住面积分布图

sns.distplot(housing_df['GrLivArea'])
<IPython.core.display.Javascript object>

3re6ZntSTrV8z8eva7qxb7P83aP6M+jAAYAAAAAA

<matplotlib.axes._subplots.AxesSubplot at 0x22369b44cc0>
  • 居住面积对应的属性是’GrLivArea’
  • 大部分房屋的居住面积在800到2000之间
  • 有少量的房屋居住面积大于4000

5. 地下室面积分布图

sns.distplot(housing_df['TotalBsmtSF'])
<IPython.core.display.Javascript object>

uA5R2WBktoogtg0SRgmnBLr2c0q3P03PRFwd9Zfm

<matplotlib.axes._subplots.AxesSubplot at 0x2236a7b4828>
  • 地下室面积对应的属性是’TotalBsmtSF’
  • 有一部分的房屋地下室面积为0,也就是没有地下室

6. 探索连续型变量之间的相关性

可以使用seaborn的regplot方法,探索探索两个连续型变量之间的相关性。

#连续变量之间的相关性
sns.regplot(x='GrLivArea', y='SalePrice', data=housing_df)
sns.regplot(x='TotalBsmtSF', y='SalePrice', data=housing_df)
<IPython.core.display.Javascript object>

H1L7lFq5WpihFsBAEjASbnE9g6zOwbnxQ8EZater

<matplotlib.axes._subplots.AxesSubplot at 0x2236a207c50>
  • 从代码生成的图中可以看到,GrLivArea和SalePrice呈现明显的正相关关系
  • 从代码生成的图中可以看到,TotalBsmtSF和SalePrice呈现明显的正相关关系

7. 探索离散型变量和连续型变量之间的相关性

可以使用seaborn的boxplot方法,探索离散型变量和连续型变量之间的相关性。

使用regplot绘制OverallQual和SalePrice之间的关系,比较跟boxplot的区别

#离散变量和连续变量之间的相关性
sns.regplot(x='OverallQual', y='SalePrice', data=housing_df)
<IPython.core.display.Javascript object>

j+FMmet6nJ8HgAAAABJRU5ErkJggg==

<matplotlib.axes._subplots.AxesSubplot at 0x2236bce10b8>
#使用boxplot绘制OverallQual和SalePrice之间的关系
sns.boxplot(x='OverallQual', y='SalePrice', data=housing_df)
#使用boxplot绘制CentralAir和SalePrice之间的关系
##sns.boxplot(x='CentralAir', y='SalePrice', data=housing_df)
#使用boxplot绘制Neighborhood和SalePrice之间的关系
##sns.boxplot(x='Neighborhood', y='SalePrice', data=housing_df)
<IPython.core.display.Javascript object>

Af7PnLahuM5oAAAAAElFTkSuQmCC

<matplotlib.axes._subplots.AxesSubplot at 0x2236c2f3c18>

8. 绘制相关系数矩阵热力图

从housing_df数据框中挑选出SalePrice,GrLivArea,TotalBsmtSF,GarageArea,YearBuilt,OverallQual等属性,计算这些属性之间的相关系数矩阵,并使用seaborn的heatmap方法绘制相关系数矩阵热力图,可以快速并且直观地探索出与SalePrice相关的属性。

#挑选属性
info = ['SalePrice','GrLivArea','TotalBsmtSF','GarageArea','YearBuilt','OverallQual']
#把图形中的字体设置为原来的0.7倍
sns.set(font_scale = 0.7)
#首先使用.corr()方法计算属性之间的相关系数矩阵,再使用heatmap绘制热力图
#annot=True的作用是把相关系数在图中注释出来
sns.heatmap(housing_df[info].corr(), annot = True, vmin = 0, vmax = 1)
<IPython.core.display.Javascript object>

IqjJx46CZ7YAAAAASUVORK5CYII=

<matplotlib.axes._subplots.AxesSubplot at 0x2236c313978>

从代码生成的热力图可以看出,SalePrice跟OverallQual的相关性最高,相关系数为0.79,SalePrice跟YearBuilt的相关性最低,相关系数为0.52

二、预测型数据分析

1. 预测型数据分析的注意事项

  • 首先使用探索型数据分析方法,探索出跟预测目标相关的特征
  • 对相关的特征进行数据处理使其更加符合数据建模的要求
  • 特征挑选应该同时注重模型的准确率和可解释性

2. 使用线性回归和逻辑森林回归建立预测模型

import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import cross_val_score

housing_df = data = pd.read_csv('housing.csv')
features = ['GrLivArea','TotalBsmtSF','GarageArea','YearBuilt','OverallQual']
target = 'SalePrice'
lr = LinearRegression()
rf = RandomForestRegressor(100)#可以改变括号里的值(也就是子树的个数)来得到更优的回归效果

models = [lr, rf]

for model in models:
    scores = cross_val_score(model, housing_df[features], housing_df[target], cv = 5, scoring = 'neg_mean_absolute_error')
    print(type(model).__name__, np.mean(scores))
LinearRegression -24462.4780632
RandomForestRegressor -20710.1090994

可以看到,随机森林还是效果好一些的。

3. 创建新的特征

可以根据数据集原来的特征,创建新的对于预测目标有帮助的新特征,用于得到更好的效果。

比如创建“有没有地下室”这个新的属性(因为之前在探索性数据分析看到地下室面积为零也占很大比例,且房价也有很大的波动

housing_df['HasBsmt'] = 0
#创建有没有地下室
housing_df.at[housing_df['TotalBsmtSF'] > 0, 'HasBsmt'] = 1

housing_df['LogArea'] = np.log(housing_df['GrLivArea'])

new_features = ['GrLivArea','TotalBsmtSF','GarageArea','YearBuilt','OverallQual','HasBsmt']

lr = LinearRegression()
rf = RandomForestRegressor(100)

models = [lr, rf]

for model in models:
    scores = cross_val_score(model, housing_df[new_features], housing_df[target],cv = 5, scoring = 'neg_mean_absolute_error')
    print(type(model).__name__, np.mean(scores))
LinearRegression -24357.2382512
RandomForestRegressor -20442.399757

ok!对比一下,两个模型的预测精度都有所提高!

  • 根据特征’TotalBsmtSF’创建一个新特征’HasBsmt’,也就是房屋是否有地下室。当’TotalBsmtSF’为0时’HasBsmt’为0,当’TotalBsmtSF’大于0时’HasBsmt’为1
  • 根据特征’GrLivArea’创建一个新特征’LogArea’,也就是取特征’GrLivArea’的对数,缩小特征’GrLivArea’之间的差异
  • 可以看到新特征对预测的效果有一定的帮助,其效果跟不同模型的内在机制存在一定的关系
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值