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

简介: 机器学习一般来说,一个学习问题通常会考虑一系列 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)
目录
相关文章
|
11月前
|
机器学习/深度学习 人工智能 算法
探索机器学习:从线性回归到深度学习
本文将带领读者从基础的线性回归模型开始,逐步深入到复杂的深度学习网络。我们将通过代码示例,展示如何实现这些算法,并解释其背后的数学原理。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和知识。让我们一起踏上这段激动人心的旅程吧!
211 3
|
机器学习/深度学习 人工智能 算法
探索机器学习中的线性回归模型
本文深入探讨了机器学习中广泛使用的线性回归模型,从其基本概念和数学原理出发,逐步引导读者理解模型的构建、训练及评估过程。通过实例分析与代码演示,本文旨在为初学者提供一个清晰的学习路径,帮助他们在实践中更好地应用线性回归模型解决实际问题。
160 3
|
机器学习/深度学习 自然语言处理 算法
深入理解机器学习算法:从线性回归到神经网络
深入理解机器学习算法:从线性回归到神经网络
|
机器学习/深度学习 TensorFlow 算法框架/工具
探索机器学习:从线性回归到深度学习
在这篇文章中,我们将一起踏上一场激动人心的旅程,穿越机器学习的广阔天地。我们将从最基本的线性回归开始,逐步深入到复杂的深度学习模型。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。让我们一起探索这个充满无限可能的世界吧!
|
机器学习/深度学习 API
机器学习入门(七):线性回归原理,损失函数和正规方程
机器学习入门(七):线性回归原理,损失函数和正规方程
1052 1
|
机器学习/深度学习 数据采集 算法
探索机器学习中的线性回归
【10月更文挑战第25天】本文将深入浅出地介绍线性回归模型,一个在机器学习领域中广泛使用的预测工具。我们将从理论出发,逐步引入代码示例,展示如何利用Python和scikit-learn库实现一个简单的线性回归模型。文章不仅适合初学者理解线性回归的基础概念,同时也为有一定基础的读者提供实践指导。
|
机器学习/深度学习 人工智能 自然语言处理
探索机器学习:从线性回归到深度学习
【9月更文挑战第4天】在这篇文章中,我们将深入探讨机器学习的世界,从基础的线性回归模型开始,逐步深入到复杂的深度学习网络。我们将通过实际的代码示例,揭示这些模型背后的数学原理,以及如何在现实世界的问题中应用它们。无论你是初学者还是有经验的数据科学家,这篇文章都将为你提供新的视角和深入的理解。
|
1月前
|
机器学习/深度学习 数据采集 人工智能
【机器学习算法篇】K-近邻算法
K近邻(KNN)是一种基于“物以类聚”思想的监督学习算法,通过计算样本间距离,选取最近K个邻居投票决定类别。支持多种距离度量,如欧式、曼哈顿、余弦相似度等,适用于分类与回归任务。结合Scikit-learn可高效实现,需合理选择K值并进行数据预处理,常用于鸢尾花分类等经典案例。(238字)
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
1154 6
|
6月前
|
机器学习/深度学习 数据采集 人工智能
20分钟掌握机器学习算法指南
在短短20分钟内,从零开始理解主流机器学习算法的工作原理,掌握算法选择策略,并建立对神经网络的直观认识。本文用通俗易懂的语言和生动的比喻,帮助你告别算法选择的困惑,轻松踏入AI的大门。