首先分别介绍一下这一对有趣的模型把:K-Means与随机森林(后文将其称为模型一),为什么要要介绍这一对模型呢?是因为小编在一次项目上机缘巧合的产生了这样一个想法:如果我先将数据集进行K-Means进行聚类,然后再分别对每一类进行预测,这样的出来的结果误差会不会更小呢?根据这次试验的结果,答案是肯定的,误差变小的原理小编也没怎么琢磨透,估计就是聚类后,已经将数据自觉地分为一类,这样可能会相对比起直接全部堆在一起误差会更小把?(小编的猜想)

今天小编要用这一对组合模型对房价进行预测实验,在这里小编将会放上一个对照模型:随机森林(后文将其称为模型二)。随后小编将分别用这两对模型进行预测,并将其结果的变化过程展示给各位童鞋看看!

那么先简单的介绍一下两个模型的原理:

一、K-Means

k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。

(数据来源https://baike.baidu.com/item/K%E5%9D%87%E5%80%BC%E8%81%9A%E7%B1%BB%E7%AE%97%E6%B3%95/15779627?fromtitle=K-means&fromid=4934806&fr=aladdin)

二、随机森林回归

首先利用bootstrap方法又放回的从原始训练集中随机抽取n个样本,并构建n个决策树;然后假设在训练样本数据中有m个特征,那么每次分裂时选择最好的特征进行分裂 每棵树都一直这样分裂下去,直到该节点的所有训练样例都属于同一类;接着让每颗决策树在不做任何修剪的前提下最大限度的生长;最后将生成的多棵分类树组成随机森林,用随机森林分类器对新的数据进行分类与回归。

对于回归问题,则由多棵树预测值的均值决定最终预测结果。

先给童鞋们看看数据的大概长什么样:

对,一共有76个变量,而最高房价与房价中位数是我们将要预测的两个变量。

模型一步骤如下:

1、先将数据进行聚类,分到直到没有缺失值的类别才停止

2、分别将每一类进行随机森林预测

代码如下:

import pandas as pd
import os
from sklearn.cluster import KMeans
import seaborn as sns
import matplotlib.pyplot as plt

os.chdir(r'C:\Users\HHX\Desktop\神经网络预测')

data_1=pd.read_excel(r'test1.xlsx')

new_list_id=[]
new_list_content=[]
for i in range(5,30,1):
    clf = KMeans(n_clusters=i)
    s = clf.fit(data_1.iloc[:,:-3])
    new_list_id.append(i)
    new_list_content.append(clf.inertia_)
    
plt.figure()
plt.scatter(new_list_id,new_list_content)
sns.lineplot(x=new_list_id,y=new_list_content)
plt.show()

clf = KMeans(n_clusters=10)
ypred = clf.fit_predict(data_1.iloc[:,:-3])
data_1['结果']=list(ypred)

最终小编将数据集分为了10类(这里你也可以试试15或20等,不过不建议太高)

接着将其进行随机森林预测,代码如下:

from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(n_estimators=100,max_features= 0.7)

test_data=data_1.loc[(data_1['结果']==2) & (data_1['房价中位数_201903']==0)]
train_data=data_1.loc[(data_1['结果']==2) & (data_1['房价中位数_201903']!=0)]

#test_data=data_1.loc[(data_1['最高房价_201903']==0)]
#train_data=data_1.loc[(data_1['最高房价_201903']!=0)][:-4]

X=train_data.iloc[:,1:-4]
y=train_data.iloc[:,-2]
#树
rf.fit(X,y)# 训练模型
test_data.iloc[:,-2]= rf.predict(test_data.iloc[:,1:-4])#把训练好的模型带入测试集并返回到测试集的表00

plt.figure()
plt.scatter(train_data['_id'].tolist(),train_data['房价中位数_201903'].tolist())
plt.scatter(test_data['_id'].tolist(),test_data['房价中位数_201903'].tolist())
sns.lineplot(x=train_data['_id'].tolist(),y=train_data['房价中位数_201903'].tolist())
sns.lineplot(x=test_data['_id'].tolist(),y=test_data['房价中位数_201903'].tolist())
plt.show()

train_mean=train_data.iloc[:,-2].mean()
test_mean=test_data.iloc[:,-2].mean()

print(abs(test_mean-train_mean))

#final.to_csv('树回归all_predict.csv')
#dataset是包含poi和房中房低的数据

#这个图表面在同一类的数据基本上都处于同一个区间,效果还不错

模型二:随机森林

步骤如下:

直接进行随机森林预测,代码如下:

test_data=data_1.loc[(data_1['房价中位数_201903']==0)]
train_data=data_1.loc[(data_1['房价中位数_201903']!=0)]

X=train_data.iloc[:,1:-4]
y=train_data.iloc[:,-2]
#树
rf.fit(X,y)# 训练模型
test_data.iloc[:,-2]= rf.predict(test_data.iloc[:,1:-4])#把训练好的模型带入测试集并返回到测试集的表00

test_data_1=test_data.loc[(test_data['结果']==2)]
train_data_1=train_data.loc[(train_data['结果']==2)]

train_mean=test_data_1.iloc[:,-2].mean()
test_mean=train_data_1.iloc[:,-2].mean()

print(abs(test_mean-train_mean))

plt.figure()
plt.scatter(train_data_1['_id'].tolist(),train_data_1['房价中位数_201903'].tolist())
plt.scatter(test_data_1['_id'].tolist(),test_data_1['房价中位数_201903'].tolist())
sns.lineplot(x=train_data_1['_id'].tolist(),y=train_data_1['房价中位数_201903'].tolist())
sns.lineplot(x=test_data_1['_id'].tolist(),y=test_data_1['房价中位数_201903'].tolist())
plt.show()

#同样都是一个类别,但是效果相差甚大

综合两个模型来看:

很明显,模型一(左)的准确性比模型二(右)的准确性高很多(都是同一个类别的数据)

一个有趣的模型组合预测模型相关推荐

  1. 给小孩发布一个有趣的网站 在线动物园

    给小孩发布一个有趣的网站 在线动物园,可以实时看到动物园里的动物实时摄像头. 非常有意思,大热天也不用到动物园里看了. http://zoo.baidu.com/video.html

  2. 如何更新你的机器学习模型?手把手带你设计一个可持续的预测模型!

    作者 | CloudFactory 译者 | 天道酬勤 责编 | 徐威龙 出品 | AI科技大本营(ID:rgznai100) 高效的机器学习模型需要高质量的数据.训练你的机器学习模型并不是过程中的单 ...

  3. 一个有趣的实验:用0.1f 替换 0,性能提升 7 倍!

    点击关注上方"视学算法",设为"置顶或星标",第一时间送达技术干货. 本文来源:http://cenalulu.github.io/linux/about-de ...

  4. 一个有趣的小例子,带你入门协程模块-asyncio

    上篇文章写了关于yield from的用法,简单的了解异步模式,[上次的内容链接]这次让我们通过一个有趣例子带大家了解asyncio基本使用. 目标效果图 在控制台中显示一个由ASCII字符" ...

  5. 这是一个有趣的问题,Java 8 Lambda 表达式被编译成了什么?

    在了解了Java 8 Lambda的一些基本概念和应用后, 我们会有这样的一个问题: Lambda表达式被编译成了什么? 这是一个有趣的问题,涉及到JDK的具体的实现.本文将介绍OpenJDK对Lam ...

  6. union一个有趣的应用

    今天在读<Linux高性能服务器编程>时看到一个有趣的东西.书中用了一个特别的方法去求字节序.我们知道字节序分为大端和小端,大端就是数据的高位字节存储在内存的低地址处,小段则反之.那么我们 ...

  7. 分享一个有趣的学习方法,欢迎一起探讨如何提高学习兴趣作者:1-2-3 来源:博客园 发布时间:2009-03-09 16:20 阅读:2820 次 原文链接 [收藏]

    分享一个有趣的学习方法,欢迎一起探讨如何提高学习兴趣 作者:1-2-3  来源:博客园  发布时间:2009-03-09 16:20  阅读:2820 次  原文链接   [收藏]   有些人似乎天生 ...

  8. 编写一个弹出式菜单的shell程序_分享一个有趣的shell脚本--实现抓阄程序

    概述 今天主要分享一个有趣的shell脚本,用来实现抓阄,平时就不用剪刀石头布了. 需求 使用shell编写一个抓阄的程序: 1.执行脚本后,输入英文名字全拼,产生随机数01-99之间的数字,数字越大 ...

  9. firebug的一个有趣现象

    firebug的一个有趣现象 var obj = {length:0,splice:function(){}}console.log(obj) 猜猜上面会打印出啥? 没错,打印出来的看起来是一个空数组 ...

  10. 一个有趣的问题,讨论讨论

    昨天和一位同事讨论项目过程的一个问题,他提出一个有趣的案例: 假设制作一批茶壶,预定时间是10号,综合考虑10号之前肯定完成,于是定了10号的船,结果制作厂商5号就完成了,表面看起来提前完成是一个好事 ...

最新文章

  1. cordova 安装ssl证书_cordova环境配置(android)
  2. 【OpenCV】图像代数运算:平均值去噪,减去背景
  3. MySQL 中主键的几种表设计组合的实际应用效果
  4. HDU 6136 Death Podracing (堆)
  5. 注册表 ControlSet001、ControlSet002以及CurrentControlSet
  6. Fabric中的Transient Data与Private Data
  7. 蓝桥杯 ADV-176 算法提高 陶陶摘苹果
  8. %Error opening tftp://255.255.255.255/network config
  9. 求助:可以使用任何编程工具做成一个控件或组件,使得在VB中能调用并得到摄像头的参数及图片。...
  10. vwap 公式_「」当天平均价 股票 公式-通达信当日均价计算公式-TOP金融网
  11. 昂达平板不能开机刷机_昂达平板刷机V811 V701 V702 V711刷错固件刷回方法
  12. SPSS学习笔记【二】-回归分析
  13. Android中wifi认证的实现
  14. Java基础篇——选择结构
  15. 关于Lisp的一己之见
  16. Cocos Shader入门基础七:一文彻底读懂深度图。
  17. 基于mahout的动漫推荐系统
  18. Arduino 74HC595驱动数码管0-9循环显示+Proteus仿真
  19. 某电子计算机有400个终端,(概率四习题.doc
  20. anaconda配置h5py===2.10.0

热门文章

  1. RF(robotframework)安装后RIDE双击打不开的问题
  2. HackTheBox-Chaos-CTF_解题过程
  3. 魔界/指环王三部曲(加长版)在线观看免费bt下载
  4. 金三银四跳槽季,教你这几招提高面试成功率
  5. Unity Shader学习-单张纹理
  6. 计算机体系结构(国防科大)-第四章-指令级并行
  7. 贡献度分析--帕累托图
  8. Compiling for iOS 10.0, but module ‘xxx‘ has a minimum deployment target of iOS 12.0
  9. lan上网和adsl上网
  10. opencv Library QUIRC is not linked解决办法