机器学习入门之机器学习:Kaggle 项目(房价:先进的回归技术)
小标 2018-09-29 来源 : 阅读 2277 评论 0

摘要:本文主要向大家介绍了机器学习入门之机器学习:Kaggle 项目(房价:先进的回归技术),通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助。

本文主要向大家介绍了机器学习入门之机器学习:Kaggle 项目(房价:先进的回归技术),通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助。


 一、项目目录


(一)数据加载
基础统计
特征分类
基本分布(scatter)


 

(二)数据分析
正态性检验

偏离度分析 (hist | scatter)
峰度分析 (hist | scatter)


分散度分析 (box)

特征本身分散度
SalePrice 的分散度


方差齐次检验
方差分析 (bar)

scipy.stats.f_oneway()
pandas.Series.corr()


协方差分析(-1~+1)

协方差热图 (heatmap)
协方最大关联图 (pairplot)




 

(三)数据处理
无效数据处理

无效特征处理
离群点处理


缺失值处理

NaN和NA的处理函数
数值量:min,max,mean
字符量 -- 仅做类型转换


标准化(Normalization)处理
离散量编码

One-Hot Encoding
分组-均值-排序数值化
以SalePrice为参考的数据
没有房价可做基准的数据处理




 

(四)机器学习
模型

MXNet
pytorch
TensorFlow
PaddlePaddle


训练
炼丹
预测


 
二、数据加载
 1)将 train 数据集和 test 数据集合并

主要代码

all_data = pd.concat([train.loc[:,‘first_feature‘ : ‘last_feature‘], test.loc[:,‘first_feature‘ : ‘last_feature‘]])




‘first_feature‘:数据集的第一列,也就是第一种特征;
‘last_feature‘:数据集的最后一列,也就是最后一种特征;



注意:



合并数据集时,去掉 test 数据集的 “预测值:y” 对应的那一列;
合并目标:合并后的数据集的每一列都是特征,不含其它信息;train 数据集和 test 数据集都是 DataFrame 数据,如果数据集首列的 “Id”,合并后去除 “Id” 这一列;



查看合并之后的情况: 

print(train.shape, test.shape, all_data.shape)



项目代码



加载模块

%matplotlib inline
import numpy as np
import pandas as pd
import scipy as sp
from scipy import stats
from matplotlib import pyplot as plt
import seaborn as sns

 

本机的各模块的版本最好与 Kaggle 一致

import sys
print(sys.version)
print(np.__version__)
print(pd.__version__)
print(sp.__version__)



加载数据

train = pd.read_csv("./kaggle/train.csv")
test = pd.read_csv("./kaggle/test.csv")
all_data = pd.concat([train.loc[:,‘MSSubClass‘:‘SaleCondition‘],
                   test.loc[:,‘MSSubClass‘:‘SaleCondition‘]])
all_data = all_data.reset_index(drop=True)


# df_allX 少了 Id 和 SalePrice 两列
print(train.shape,  test.shape, all_data.shape) 




 
 2)read_csv() 中如何处理 NA

通常确实的值默认为 NA
pd.read_csv(file,... na_values=None, keep_default_na=True, ...)


na_values:遇到该参数指定的字符时,即解析为 np.NaN(float型),无论此列是 numeric 型还是 object 型。


默认值:‘‘、‘#N/A‘、‘#N/A N/A‘、‘#NA‘、‘-1.#IND‘、‘-1.#QNAN‘、‘-NaN‘、‘-nan‘、‘1.#IND‘、‘1.#QNAN‘、‘N/A‘、‘NA‘、‘NULL‘、‘NaN‘、‘nan‘

 

keep_default_na


True:将csv 文件中的数字or字符串与 na_values 的 default 值进行匹配,命中即解析为 np.NaN
False:

na_values=[...] :与自定义的 na_values 匹配,命中即解析为 np.NaN
na_values不赋值:不解析相关字符串,保留为原字符串,副作用:会把数值型的feature错误的认成 object 型 —— so,不可取



 
 3)基础统计


train.describe()


describe() 方法的用法,参考:Pandas 和 Series 的 describe() 方法



查看前五行的信息

train.head()


 
统计数据集

train.describe().T




 
  4)特征分类

 可以从不同的维度对特征进行分类:




 非字符量特征(此项目中为 numeric features)、字符量特征(object featrues)

# 数值量特征
feats_numeric = all_data.dtypes[all_data.dtypes != ‘object‘].index.values
# feats_numeric = [attr for attr in all_data.columns in all_data.dtypes[attr] != ‘boject‘]


# 字符量特征
feats_object = all_data.dtypes[all_data.dtypes == ‘object‘].index.values
# feats_object = [attr for attr in all_data.columns if all_data.dtypes[attr] == ‘object‘]
# feats_object = train.select_dtypes(include = [‘object‘]).columns

print(feats_numeric.shape, feats_object.shape)




 
总共79个特征,pandas自动识别的 36个数值量,43个字符量。 —— 这是上表中第一个维度;

离散特征、连续特征

# 离散的数值量,需要人工甄别
feats_numeric_discrete = [‘MSSubClass‘, ‘OverallQual‘, ‘OverallCond‘]#户型、整体质量打分、整体条件打分 -- 文档中明确定义的类型量
feats_numeric_discrete += [‘TotRmsAbvGrd‘, ‘KitchenAbvGr‘, ‘BedroomAbvGr‘, ‘GarageCars‘, ‘Fireplaces‘]# 房间数量
feats_numeric_discrete += [‘FullBath‘, ‘HalfBoth‘, ‘BsmtHalfBath‘, ‘BsmtFullBath‘]# 浴室
feats_numeric_discrete += [‘MoSold‘, ‘YrSold‘]# 年份、月份,看成离散型特征


# 连续型特征
feats_continu = feats_numeric.copy()

# 离散型特征
feats_discrete = feats_object.copy()

for f in feats_numeric_discrete:
    feats_continu = np.delete(feats_continu, np.where(feats_continu == f))
    feats_discrete = np.append(feats_discrete, f)
    
print(feats_continu.shape, feats_discrete.shape)

# (22, ) (57, ):经过处理,得到表中第2个维度: 22个连续型特征,57个离散型特征;


 
 5)基本分布(scatter)

绘图函数

def plotfeats(frame,feats,kind,cols=4):
    """批量绘图函数。
    
    Parameters
    ----------
    frame : pandas.DataFrame
        待绘图的数据
    
    feats : list 或 numpy.array
        待绘图的列名称
        
    kind : str
        绘图格式:‘hist‘-直方图;‘scatter‘-散点图;‘hs‘-直方图和散点图隔行交替;‘box‘-箱线图,每个feat一幅图;‘boxp‘-Price做纵轴,feat做横轴的箱线图。
        
    cols : int
        每行绘制几幅图
    """
    rows = int(np.ceil((len(feats))/cols))
    if rows==1 and len(feats)<cols:
        cols = len(feats)
    #print("输入%d个特征,分%d行、%d列绘图" % (len(feats), rows, cols))
    if kind == ‘hs‘: #hs:hist and scatter
        fig, axes = plt.subplots(nrows=rows*2,ncols=cols,figsize=(cols*5,rows*10))
    else:
        fig, axes = plt.subplots(nrows=rows,ncols=cols,figsize=(cols*5,rows*5))
        if rows==1 and cols==1:
            axes = np.array([axes])
        axes = axes.reshape(rows,cols) # 当 rows=1 时,axes.shape:(cols,),需要reshape一下
    i=0
    for f in feats:
        #print(int(i/cols),i%cols)
        if kind == ‘hist‘:
            #frame.hist(f,bins=100,ax=axes[int(i/cols),i%cols])
            frame.plot.hist(y=f,bins=100,ax=axes[int(i/cols),i%cols])
        elif kind == ‘scatter‘:
            frame.plot.scatter(x=f,y=‘SalePrice‘,ylim=(0,800000), ax=axes[int(i/cols),i%cols])
        elif kind == ‘hs‘:
            frame.plot.hist(y=f,bins=100,ax=axes[int(i/cols)*2,i%cols])
            frame.plot.scatter(x=f,y=‘SalePrice‘,ylim=(0,800000), ax=axes[int(i/cols)*2+1,i%cols])
        elif kind == ‘box‘:
            frame.plot.box(y=f,ax=axes[int(i/cols),i%cols])
        elif kind == ‘boxp‘:
            sns.boxplot(x=f,y=‘SalePrice‘, data=frame, ax=axes[int(i/cols),i%cols])
        i += 1
    plt.show()

 


绘图:连续性特征与房价的关系

plotfeats(train, feats_continu, kind=‘scatter‘, cols=6)




分析上图

LotFrontage、LotArea、GrLivArea、1stFlrSF、2stFlrSF、GarageArea、BsmtFinSF1、TotalBsmtSF: 这几个面积和距离和售价呈明显正相关趋势

LotFrontage:房子到街道的距离,大多在50-100英尺(15-30米),距离远的是不是大多是豪宅?躲在山林深处……
LotArea:占地面积(包括房屋、花园、前后院……),均值是10516平方英尺(900+平方米),向往啊……
GrLivArea:地面以上整体面积
1stFlrSF、2stFlrSF: 第1、 2层建筑面积
GarageArea:车库面积
BsmtFinSF1、BsmtFinSF2、TotalBsmtSF:地下室面积,很多房子还有第2个地下室


YearBuilt、YearRemodAdd、GarageYrBlt:从图中可以看出,建造年限对售价虽正相关,但坡度较小,关联度没有上面几个因素大,早点、晚点售价差不多


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标人工智能机器学习频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程