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

简介: 机器学习一般来说,一个学习问题通常会考虑一系列 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)
目录
相关文章
|
2天前
|
数据可视化 API 开发者
R1类模型推理能力评测手把手实战
随着DeepSeek-R1模型的广泛应用,越来越多的开发者开始尝试复现类似的模型,以提升其推理能力。
|
2月前
|
机器学习/深度学习 人工智能 算法
探索机器学习:从线性回归到深度学习
本文将带领读者从基础的线性回归模型开始,逐步深入到复杂的深度学习网络。我们将通过代码示例,展示如何实现这些算法,并解释其背后的数学原理。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和知识。让我们一起踏上这段激动人心的旅程吧!
|
3月前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的线性回归模型
本文深入探讨了机器学习中广泛使用的线性回归模型,从其基本概念和数学原理出发,逐步引导读者理解模型的构建、训练及评估过程。通过实例分析与代码演示,本文旨在为初学者提供一个清晰的学习路径,帮助他们在实践中更好地应用线性回归模型解决实际问题。
|
3月前
|
机器学习/深度学习 自然语言处理 算法
深入理解机器学习算法:从线性回归到神经网络
深入理解机器学习算法:从线性回归到神经网络
|
3月前
|
机器学习/深度学习 数据采集 数据可视化
Python数据科学实战:从Pandas到机器学习
Python数据科学实战:从Pandas到机器学习
|
3月前
|
机器学习/深度学习 TensorFlow API
机器学习实战:TensorFlow在图像识别中的应用探索
【10月更文挑战第28天】随着深度学习技术的发展,图像识别取得了显著进步。TensorFlow作为Google开源的机器学习框架,凭借其强大的功能和灵活的API,在图像识别任务中广泛应用。本文通过实战案例,探讨TensorFlow在图像识别中的优势与挑战,展示如何使用TensorFlow构建和训练卷积神经网络(CNN),并评估模型的性能。尽管面临学习曲线和资源消耗等挑战,TensorFlow仍展现出广阔的应用前景。
108 5
|
3月前
|
机器学习/深度学习 人工智能 TensorFlow
基于TensorFlow的深度学习模型训练与优化实战
基于TensorFlow的深度学习模型训练与优化实战
149 0
|
3月前
|
机器学习/深度学习 数据采集 人工智能
机器学习入门:Python与scikit-learn实战
机器学习入门:Python与scikit-learn实战
102 0
|
4月前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
142 2
|
4月前
|
机器学习/深度学习 数据挖掘 Serverless
手把手教你全面评估机器学习模型性能:从选择正确评价指标到使用Python与Scikit-learn进行实战演练的详细指南
【10月更文挑战第10天】评估机器学习模型性能是开发流程的关键,涉及准确性、可解释性、运行速度等多方面考量。不同任务(如分类、回归)采用不同评价指标,如准确率、F1分数、MSE等。示例代码展示了使用Scikit-learn库评估逻辑回归模型的过程,包括数据准备、模型训练、性能评估及交叉验证。
212 1