机器学习实战⑴之线性回归预测房价-阿里云开发者社区

开发者社区> 夜神moon> 正文

机器学习实战⑴之线性回归预测房价

简介: 机器学习 一般来说,一个学习问题通常会考虑一系列 n 个 样本 数据,然后尝试预测未知数据的属性。 如果每个样本是 多个属性的数据,比如说是一个多维记录),就说它有许多“属性”,或称 features(特征) 。
+关注继续查看

机器学习

一般来说,一个学习问题通常会考虑一系列 n 个 样本 数据,然后尝试预测未知数据的属性。 如果每个样本是 多个属性的数据,比如说是一个多维记录),就说它有许多“属性”,或称 features(特征)

我们可以将学习问题分为几大类:

  • [监督学习]其中数据带有一个附加属性,即我们想要预测的结果值。这个问题可以是:
> [分类]: 样本属于两个或更多个类,我们想从已经标记的数据中学习如何预测未标记数据的类别。 分类问题的一个例子是手写数字识别,其目的是将每个输入向量分配给有限数目的离散类别之一。 我们通常把分类视作监督学习的一个离散形式(区别于连续形式),从有限的类别中,给每个样本贴上正确的标签。
> [回归]: 如果期望的输出由一个或多个连续变量组成,则该任务称为 *回归* 。 回归问题的一个例子是预测鲑鱼的长度是其年龄和体重的函数。
  • [无监督学习]其中训练数据由没有任何相应目标值的一组输入向量x组成。这种问题的目标可能是在数据中发现彼此类似的示例所聚成的组,这种问题称为 [聚类], 或者,确定输入空间内的数据分布,称为 [密度估计],又或从高维数据投影数据空间缩小到二维或三维以进行 可视化

训练集和测试集

机器学习是从数据的属性中学习,并将它们应用到新数据的过程。 这就是为什么机器学习中评估算法的普遍实践是把数据分割成 训练集 (我们从中学习数据的属性)和 测试集 (我们测试这些性质)。

机器学习实战

  • 第一步:加载相应包和所需的数据集

我们这里选的是sklearn包,此包是python中比较常用的机器学习集成包,可以满足大多数模型需求。

# -*- coding: utf-8 -*-
"""
Created on Thu Oct 18 13:43:44 2018

@author: Administrator
"""

% reset -f
% clear

# In[*]
##########第一步  导入包和数据
# In[*]
from sklearn.model_selection import cross_val_score
from sklearn import linear_model
from sklearn import metrics
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns
import os
os.chdir("C:\\Users\\Administrator\\Desktop\\all")
# In[*]


train = pd.read_csv('train.csv',header = 0,index_col=0)
test  = pd.read_csv('test.csv',header = 0,index_col=0)



# In[*]

sns.distplot(train["SalePrice"])  
plt.show()
img_171c23518d725d98a50ffa75d714bd71.png

我们可以看到训练集train的房屋售价分布相对均匀

  • 第二步 删减和目标变量低相关的属性


# In[*]
##########第二步  删减和目标变量低相关的属性
# In[*]
data = train.corr()
sns.heatmap(data)
plt.show()
# In[*]
data = train.corr()
data["SalePrice"].sort_values()
KitchenAbvGr    -0.135907
EnclosedPorch   -0.128578
MSSubClass      -0.084284
OverallCond     -0.077856
YrSold          -0.028923
LowQualFinSF    -0.025606
MiscVal         -0.021190
BsmtHalfBath    -0.016844
BsmtFinSF2      -0.011378
3SsnPorch        0.044584
MoSold           0.046432
PoolArea         0.092404
ScreenPorch      0.111447
BedroomAbvGr     0.168213
BsmtUnfSF        0.214479
BsmtFullBath     0.227122
LotArea          0.263843
HalfBath         0.284108
OpenPorchSF      0.315856
2ndFlrSF         0.319334
WoodDeckSF       0.324413
LotFrontage      0.351799
BsmtFinSF1       0.386420
Fireplaces       0.466929
MasVnrArea       0.477493
GarageYrBlt      0.486362
YearRemodAdd     0.507101
YearBuilt        0.522897
TotRmsAbvGrd     0.533723
FullBath         0.560664
1stFlrSF         0.605852
TotalBsmtSF      0.613581
GarageArea       0.623431
GarageCars       0.640409
GrLivArea        0.708624
OverallQual      0.790982
SalePrice        1.000000
Name: SalePrice, dtype: float64
img_9a8eeba0700373e6e926c194609f3e35.png

该图为属性之间的相关系数,我们需要做的是删除掉与预测目标不相关或者低相关的变量。(一般来说我们同时也应该删除掉用来预测的变量之间高度相关的变量),所以我们删除了BsmtHalfBath,'BsmtFinSF2', '3SsnPorch', 'MoSold', 'PoolArea', 'ScreenPorch'这几个与预测目标低相关的变量。

  # In[*]

train = train.drop(['BsmtHalfBath',
                    'BsmtFinSF2',
                    '3SsnPorch',
                    'MoSold',
                    'PoolArea',
                    'ScreenPorch',
                    'BedroomAbvGr'], axis=1)

test = test.drop(['BsmtHalfBath',
                    'BsmtFinSF2',
                    '3SsnPorch',
                    'MoSold',
                    'PoolArea',
                    'ScreenPorch',
                    'BedroomAbvGr'], axis=1)



我们来挑几个变量,看一下变量与目标的相关


    # In[*] 
sns.lmplot(x="OverallQual", y="SalePrice", 
data=train,fit_reg=False,scatter=True)
plt.show()  
  
     # In[*]
   
   
sns.lmplot(x="TotalBsmtSF", y="SalePrice", 
data=train,fit_reg=False,scatter=True)
plt.show() 



img_c490db81302b4242f95f9e357f6d306b.png

img_de8e6f52158b9a220020a2bb3ded14b9.png
  • 第三步 删减和填充缺失值



# In[*]
##########第三步  删减和填充缺失值
# In[*]






  # In[*]
 for col in train.columns:
     if train[col].isnull().sum() > 0:
         print (col, train[col].isnull().sum())
 
 
  # In[*]

train = train.drop(["MiscFeature", "PoolQC", "Alley", 
                    "Fence",'FireplaceQu' ], axis=1)

test = test.drop(["MiscFeature", "PoolQC", "Alley", 
                    "Fence",'FireplaceQu' ], axis=1)
    
    # In[*] 
print(train.describe())    
    
  # In[*]
all_data = pd.concat((train, test))
 # In[*]
for col in train.columns:
    if train[col].isnull().sum() > 0:
        if train[col].dtypes == 'object':
            val = all_data[col].dropna().value_counts().idxmax()
            train[col] = train[col].fillna(val)
        else:
            val = all_data[col].dropna().mean()
            train[col] = train[col].fillna(val)
              # In[*]
 for col in test.columns:
     if test[col].isnull().sum() > 0:
         if test[col].dtypes == 'object':
             val = all_data[col].dropna().value_counts().idxmax()
             test[col] = test[col].fillna(val)
         else:
             val = all_data[col].dropna().mean()
             test[col] = test[col].fillna(val)

  # In[*]

  for col in all_data.select_dtypes(include = [object]).columns:
      train[col] = train[col].astype('category',
           categories = all_data[col].dropna().unique())
      
      test[col] = test[col].astype('category', 
          categories = all_data[col].dropna().unique())
  # In[*]
  for col in train.columns:
      if train[col].dtype.name == 'category':
         tmp = pd.get_dummies(train[col], prefix = col)
         train = train.join(tmp)
         train = train.drop(col, axis=1)
  # In[*]
  for col in test.columns:
      if test[col].dtype.name == 'category':
           tmp = pd.get_dummies(test[col], prefix = col)
           test = test.join(tmp)
           test = test.drop(col, axis=1)

  # In[*]
  

 for col in train.columns:
     if train[col].isnull().sum() > 0:
         print (col, train[col].isnull().sum())
 
  # In[*]

这一步的主要工作是删减和填充缺失值,首先是查看数据每一列缺失值的情况,我将其中缺失值大于一半观察值的属性删除掉。然后填充缺失值,填充的时候,数字型属性是用的中位值,而字符串类型的属性用的是最多的值

  • 第四步 建立线性回归预测模型


# In[*]
##########第四步  建立线性回归预测模型
# In[*]
  
   # In[*] 
 lr = linear_model.LinearRegression()
 X = train.drop("SalePrice", axis=1)
 y = np.log(train["SalePrice"])
 score = cross_val_score(lr, X,y, scoring='mean_squared_error')
   # In[*]
 
 print(score)
   # In[*]
lr = lr.fit(X, y)
results = lr.predict(test)
final = np.exp(results)
  • 第五步 保存预测结果

     # In[*]
##########第五步  保存预测结果     
     
 submission = pd.DataFrame()
 submission['Id'] = test.index
 submission['SalePrice'] = final

 submission.to_csv("submission1.csv", index= False)

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9485 0
Web开发工程师转型机器学习的实战经验
历经两个月对深度学习和计算机视觉领域进行探索,获得一些经验与总结。
2933 0
吴恩达机器学习 Coursera 笔记(二) - 单变量线性回归(中)
吴恩达机器学习 Coursera 笔记(二) - 单变量线性回归
17 0
《机器学习实战》决策树(ID3算法)的分析与实现
============================================================================================ 《机器学习实战》系列博客是博主阅读《机器学习实战》这本书的笔记,包含对其中算法的理解和算法的Pyt...
905 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13168 0
机器学习实战:K近邻算法(源码分析)
学习机器学习的总结: 先把代码放到这儿,话说一句一句看着打真的好累,还好可以通过debug一步一步观察变量,理解顿时快了许多。
969 0
基于Spark的机器学习实践 (三) - 实战环境搭建
0 相关源码 1 Spark环境安装 ◆ Spark 由scala语言编写,提供多种语言接口,需要JVM ◆ 官方为我们提供了Spark 编译好的版本,可以不必进行手动编译 ◆ Spark安装不难,配置需要注意,并且不一定需要Hadoop环境 下载 解压 tar zxvf spark-2.
1049 0
机器学习实战:基于概率论的分类方法:朴素贝叶斯(源码解析,错误分析)
按照惯例,先把代码粘到这里 from numpy import * def LoadDataSet(): postingList = [['my', 'dog', 'has', 'flea', 'proble...
835 0
+关注
夜神moon
南方医科大学外科硕士
83
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载