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

简介: 机器学习一般来说,一个学习问题通常会考虑一系列 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)
目录
相关文章
|
4月前
|
机器学习/深度学习 存储 运维
机器学习异常检测实战:用Isolation Forest快速构建无标签异常检测系统
本研究通过实验演示了异常标记如何逐步完善异常检测方案和主要分类模型在欺诈检测中的应用。实验结果表明,Isolation Forest作为一个强大的异常检测模型,无需显式建模正常模式即可有效工作,在处理未见风险事件方面具有显著优势。
319 46
|
7月前
|
机器学习/深度学习 数据可视化 TensorFlow
Python 高级编程与实战:深入理解数据科学与机器学习
本文深入探讨了Python在数据科学与机器学习中的应用,介绍了pandas、numpy、matplotlib等数据科学工具,以及scikit-learn、tensorflow、keras等机器学习库。通过实战项目,如数据可视化和鸢尾花数据集分类,帮助读者掌握这些技术。最后提供了进一步学习资源,助力提升Python编程技能。
|
7月前
|
机器学习/深度学习 人工智能 Java
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
402 3
|
7月前
|
机器学习/深度学习 数据可视化 算法
Python 高级编程与实战:深入理解数据科学与机器学习
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化和调试技巧。本文将深入探讨 Python 在数据科学和机器学习中的应用,并通过实战项目帮助你掌握这些技术。
|
8月前
|
数据可视化 API 开发者
R1类模型推理能力评测手把手实战
R1类模型推理能力评测手把手实战
220 2
|
8月前
|
人工智能 自然语言处理 网络安全
基于阿里云 Milvus + DeepSeek + PAI LangStudio 的低成本高精度 RAG 实战
阿里云向量检索服务Milvus版是一款全托管向量检索引擎,并确保与开源Milvus的完全兼容性,支持无缝迁移。它在开源版本的基础上增强了可扩展性,能提供大规模AI向量数据的相似性检索服务。凭借其开箱即用的特性、灵活的扩展能力和全链路监控告警,Milvus云服务成为多样化AI应用场景的理想选择,包括多模态搜索、检索增强生成(RAG)、搜索推荐、内容风险识别等。您还可以利用开源的Attu工具进行可视化操作,进一步促进应用的快速开发和部署。
|
8月前
|
数据可视化 API 开发者
R1类模型推理能力评测手把手实战
随着DeepSeek-R1模型的广泛应用,越来越多的开发者开始尝试复现类似的模型,以提升其推理能力。
630 2
|
8月前
|
数据可视化 API 开发者
R1类模型推理能力评测手把手实战
随着DeepSeek-R1模型的广泛应用,越来越多的开发者开始尝试复现类似的模型,以提升其推理能力。
526 3
|
10月前
|
机器学习/深度学习 人工智能 算法
探索机器学习:从线性回归到深度学习
本文将带领读者从基础的线性回归模型开始,逐步深入到复杂的深度学习网络。我们将通过代码示例,展示如何实现这些算法,并解释其背后的数学原理。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和知识。让我们一起踏上这段激动人心的旅程吧!
185 3
|
11月前
|
机器学习/深度学习 人工智能 TensorFlow
基于TensorFlow的深度学习模型训练与优化实战
基于TensorFlow的深度学习模型训练与优化实战
484 3