【机器学习 | 基于Lasso回归和随机森林的上海链家二手房房价预测】

文章目录

  • [🏳️‍🌈 1. 导入模块](#🏳️‍🌈 1. 导入模块)
  • [🏳️‍🌈 2. Pandas数据处理](#🏳️‍🌈 2. Pandas数据处理)
    • [2.1 读取数据](#2.1 读取数据)
    • [2.2 查看数据信息](#2.2 查看数据信息)
    • [2.3 去除重复数据](#2.3 去除重复数据)
    • [2.4 去除缺失数据](#2.4 去除缺失数据)
    • [2.5 面积、价格、单价、楼层、建筑时间数据提取](#2.5 面积、价格、单价、楼层、建筑时间数据提取)
    • [2.6 朝向数据处理](#2.6 朝向数据处理)
  • [🏳️‍🌈 3. 特征分析](#🏳️‍🌈 3. 特征分析)
    • [3.1 二手房面积分析](#3.1 二手房面积分析)
    • [3.2 二手房建筑时间分析](#3.2 二手房建筑时间分析)
    • [3.3 二手房楼层分析](#3.3 二手房楼层分析)
    • [3.4 二手房价格分析](#3.4 二手房价格分析)
  • [🏳️‍🌈 4. 模型分析](#🏳️‍🌈 4. 模型分析)
    • [4.1 Lasso回归](#4.1 Lasso回归)
    • [4.2 随机森林](#4.2 随机森林)
    • [4.3 总结](#4.3 总结)
  • [🏳️‍🌈 5. 可视化项目源码+数据](#🏳️‍🌈 5. 可视化项目源码+数据)

大家好,我是 👉 【Python当打之年(点击跳转)】

本期将利用Lasso回归和随机森林模型对上海链家二手房数据进行分析与预测 看看哪些特征对上海二手房房价影响比较大、不同算法模型对房价预测准确度如何等,希望对大家有所帮助,如有疑问或者需要改进的地方可以联系小编。

涉及到的库:

  • Pandas --- 数据处理
  • Matplotlib/Seaborn --- 数据可视化
  • Sklearn --- 机器学习

🏳️‍🌈 1. 导入模块

python 复制代码
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.linear_model import Lasso
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split

🏳️‍🌈 2. Pandas数据处理

2.1 读取数据

python 复制代码
df = pd.read_excel('./上海链家二手房数据.xlsx')

2.2 查看数据信息

python 复制代码
df.info()

一共有 28201 条数据

包含小区名称、户型、面积、区域、楼层、朝向、价格、单价、建筑时间等字段

2.3 去除重复数据

python 复制代码
df1 = df.drop_duplicates()

2.4 去除缺失数据

python 复制代码
df1 = df1.dropna()

2.5 面积、价格、单价、楼层、建筑时间数据提取

python 复制代码
df1['面积'] = pd.to_numeric(df1['面积'].str.extract(r'(\d+\.?\d+)', expand=False))
df1['价格'] = pd.to_numeric(df1['价格'].str.extract(r'(\d+)', expand=False))
df1['单价'] = pd.to_numeric(df1['单价'].str.extract(r'(\d+)', expand=False))
df1['楼层'] = pd.to_numeric(df1['楼层'].str.extract(r'(\d+)', expand=False))
df1['建筑时间'] = pd.to_numeric(df1['建筑时间'].str.replace('年建',''))

2.6 朝向数据处理

python 复制代码
df1['朝向'] = df1['朝向'].str.replace('朝','')
df1['朝向'] = df1['朝向'].str.replace('(进门) ','')
df1['朝向'] = df1['朝向'].str.replace('(进门)','')
df1 = df1[df1['朝向'] != '']

🏳️‍🌈 3. 特征分析

3.1 二手房面积分析

python 复制代码
def get_area_analyze():
    plt.figure(figsize=(12, 6), dpi=80)
    plt.subplot(1, 2, 1)
    sns.boxplot(df1['面积'],color=range_color[0])
    plt.title('面积分布箱线图')
    plt.xlabel('面积(㎡)')
    plt.ylabel('数量')
    plt.grid(True, which='both', linestyle='--', linewidth=0.5)
    plt.subplot(1, 2, 2)
    sns.histplot(df1['面积'], kde=True, bins=50,color=range_color[1])
    plt.title('面积分布直方图')
    plt.xlabel('面积(㎡)')
    plt.ylabel('数量')
    plt.grid(True, which='both', linestyle='--', linewidth=0.5)
  • 根据面积分布可以看出,大部分面积在200㎡以下,少部分在200㎡以上,所以过滤面积200㎡以下的数据。

3.2 二手房建筑时间分析

  • 根据建筑时间分布可以看出,大部分二手房建筑时间在1980年以后,所以过滤建筑时间1980年以后的数据。

3.3 二手房楼层分析

python 复制代码
def get_floor_analyze():
    plt.figure(figsize=(12, 6), dpi=80)
    plt.subplot(1, 2, 1)
    sns.boxplot(df1['楼层'],color=range_color[2])
    plt.title('楼层分布箱线图')
    plt.xlabel('楼层')
    plt.ylabel('数量')
    plt.grid(True, which='both', linestyle='--', linewidth=0.5)
    plt.subplot(1, 2, 2)
    sns.histplot(df1['楼层'], kde=True, bins=50,color=range_color[3])
    plt.title('楼层分布直方图')
    plt.xlabel('楼层')
    plt.ylabel('数量')
    plt.grid(True, which='both', linestyle='--', linewidth=0.5)
  • 根据楼层分布可以看出,大部分二手房楼层在30层以下,所以过滤楼层30层以下的数据。

3.4 二手房价格分析

  • 根据二手房价格分布可以看出,大部分二手房价格在1000万以下,所以过滤价格1000万以下的数据。

🏳️‍🌈 4. 模型分析

筛选需要用到的列数据:

python 复制代码
df_model = df1[['面积', '区域', '楼层', '朝向', '建筑时间', '室', '厅', '价格']]

各特征相关性:

python 复制代码
corrdf = df_model.corr()
plt.figure(figsize=(12, 12), dpi=80)
sns.heatmap(corrdf, annot=True,cmap="rainbow", linewidths=0.05,square=True,annot_kws={"size":8}, cbar_kws={'shrink': 0.8})
plt.title("各特征相关性热图",size=16)

4.1 Lasso回归

python 复制代码
# 建立模型
model = Lasso()
# 训练模型
model.fit(X_train, y_train)
print(f'训练集得分:{round(model.score(X_train, y_train), 2)}')
print(f'测试集得分:{round(model.score(X_test, y_test), 2)}')
# 预测
y_predict = model.predict(X_test)
# 评估
R_square = model.score(X_test, y_test)
print('模型决定系数: ', round(R_square,2))

训练集得分:0.77

测试集得分:0.77

模型决定系数:0.77

真实值预测值对比图

Loss预测:

python 复制代码
# 特征参数
mj = 99     # 面积(㎡)
lc = 3      # 楼层
sj = 1999   # 建筑时间
ws = 3      # 卧室数量
kt = 3      # 客厅数量
xzq = '闵行区'# 行政区
cx = '南北'   # 朝向
get_price()

闵行区、1999年、南北朝向、3室3厅、3层、99平米二手房预测价格:535万

4.2 随机森林

训练集得分:0.98

测试集得分:0.84

模型决定系数:0.84

真实值预测值对比图

随机森林预测:

python 复制代码
# 特征参数
mj = 99     # 面积(㎡)
lc = 3      # 楼层
sj = 1999   # 建筑时间
ws = 3      # 卧室数量
kt = 3      # 客厅数量
xzq = '闵行区'# 行政区
cx = '南北'   # 朝向
get_price()

闵行区、1999年、南北朝向、3室3厅、3层、99平米二手房预测价格:458万

4.3 总结

  • Loss回归与随机森林模型相比,随机森林在测试集和训练集上的表现均优于Loss回归。
  • Loss回归与随机森林预测的结果相差比较大,可采用多组数据进行预测对比。

🏳️‍🌈 5. 可视化项目源码+数据

点击跳转:【全部可视化项目源码+数据】


以上就是本期为大家整理的全部内容了,赶快练习起来吧,原创不易,喜欢的朋友可以点赞、收藏 也可以分享注明出处)让更多人知道。

相关推荐
江南野栀子1 小时前
数据可视化-1. 折线图
信息可视化·数据挖掘·数据分析
图表制作解说(目标1000个图表)1 小时前
ECharts散点图-SymbolShapeMorph,附视频讲解与代码下载
echarts·统计分析·数据可视化·散点图·大屏可视化
反方向的钟儿2 小时前
非结构化数据分析与应用(Unstructured data analysis and applications)(pt3)图像数据分析1
人工智能·计算机视觉·数据分析
感谢地心引力2 小时前
【数据分析】层次贝叶斯
机器学习·数据分析·概率论
勤劳的进取家4 小时前
多维高斯分布
人工智能·机器学习·概率论
荒古前4 小时前
线性代数期末总复习的点点滴滴(1)
人工智能·线性代数·机器学习
请你喝好果汁6418 小时前
机器学习架起了组学科学和植物育种之间的桥梁。
linux·人工智能·机器学习
殇淋狱陌8 小时前
第四章 列表(List)&元组(Tuple)以及代码格式基础语法及操作
数据结构·python·数据分析·list·元组
dundunmm9 小时前
机器学习之KNN算法
人工智能·算法·机器学习·数据挖掘·knn·分类算法
Python机器学习AI10 小时前
融合机器学习算法:用VotingClassifier实现分类多模型的投票集成
人工智能·机器学习·分类