一个有趣的模型组合预测模型
首先分别介绍一下这一对有趣的模型把: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 pltos.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])#把训练好的模型带入测试集并返回到测试集的表00plt.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])#把训练好的模型带入测试集并返回到测试集的表00test_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()#同样都是一个类别,但是效果相差甚大
综合两个模型来看:
很明显,模型一(左)的准确性比模型二(右)的准确性高很多(都是同一个类别的数据)
一个有趣的模型组合预测模型相关推荐
- 给小孩发布一个有趣的网站 在线动物园
给小孩发布一个有趣的网站 在线动物园,可以实时看到动物园里的动物实时摄像头. 非常有意思,大热天也不用到动物园里看了. http://zoo.baidu.com/video.html
- 如何更新你的机器学习模型?手把手带你设计一个可持续的预测模型!
作者 | CloudFactory 译者 | 天道酬勤 责编 | 徐威龙 出品 | AI科技大本营(ID:rgznai100) 高效的机器学习模型需要高质量的数据.训练你的机器学习模型并不是过程中的单 ...
- 一个有趣的实验:用0.1f 替换 0,性能提升 7 倍!
点击关注上方"视学算法",设为"置顶或星标",第一时间送达技术干货. 本文来源:http://cenalulu.github.io/linux/about-de ...
- 一个有趣的小例子,带你入门协程模块-asyncio
上篇文章写了关于yield from的用法,简单的了解异步模式,[上次的内容链接]这次让我们通过一个有趣例子带大家了解asyncio基本使用. 目标效果图 在控制台中显示一个由ASCII字符" ...
- 这是一个有趣的问题,Java 8 Lambda 表达式被编译成了什么?
在了解了Java 8 Lambda的一些基本概念和应用后, 我们会有这样的一个问题: Lambda表达式被编译成了什么? 这是一个有趣的问题,涉及到JDK的具体的实现.本文将介绍OpenJDK对Lam ...
- union一个有趣的应用
今天在读<Linux高性能服务器编程>时看到一个有趣的东西.书中用了一个特别的方法去求字节序.我们知道字节序分为大端和小端,大端就是数据的高位字节存储在内存的低地址处,小段则反之.那么我们 ...
- 分享一个有趣的学习方法,欢迎一起探讨如何提高学习兴趣作者:1-2-3 来源:博客园 发布时间:2009-03-09 16:20 阅读:2820 次 原文链接 [收藏]
分享一个有趣的学习方法,欢迎一起探讨如何提高学习兴趣 作者:1-2-3 来源:博客园 发布时间:2009-03-09 16:20 阅读:2820 次 原文链接 [收藏] 有些人似乎天生 ...
- 编写一个弹出式菜单的shell程序_分享一个有趣的shell脚本--实现抓阄程序
概述 今天主要分享一个有趣的shell脚本,用来实现抓阄,平时就不用剪刀石头布了. 需求 使用shell编写一个抓阄的程序: 1.执行脚本后,输入英文名字全拼,产生随机数01-99之间的数字,数字越大 ...
- firebug的一个有趣现象
firebug的一个有趣现象 var obj = {length:0,splice:function(){}}console.log(obj) 猜猜上面会打印出啥? 没错,打印出来的看起来是一个空数组 ...
- 一个有趣的问题,讨论讨论
昨天和一位同事讨论项目过程的一个问题,他提出一个有趣的案例: 假设制作一批茶壶,预定时间是10号,综合考虑10号之前肯定完成,于是定了10号的船,结果制作厂商5号就完成了,表面看起来提前完成是一个好事 ...
最新文章
- cordova 安装ssl证书_cordova环境配置(android)
- 【OpenCV】图像代数运算:平均值去噪,减去背景
- MySQL 中主键的几种表设计组合的实际应用效果
- HDU 6136 Death Podracing (堆)
- 注册表 ControlSet001、ControlSet002以及CurrentControlSet
- Fabric中的Transient Data与Private Data
- 蓝桥杯 ADV-176 算法提高 陶陶摘苹果
- %Error opening tftp://255.255.255.255/network config
- 求助:可以使用任何编程工具做成一个控件或组件,使得在VB中能调用并得到摄像头的参数及图片。...
- vwap 公式_「」当天平均价 股票 公式-通达信当日均价计算公式-TOP金融网
- 昂达平板不能开机刷机_昂达平板刷机V811 V701 V702 V711刷错固件刷回方法
- SPSS学习笔记【二】-回归分析
- Android中wifi认证的实现
- Java基础篇——选择结构
- 关于Lisp的一己之见
- Cocos Shader入门基础七:一文彻底读懂深度图。
- 基于mahout的动漫推荐系统
- Arduino 74HC595驱动数码管0-9循环显示+Proteus仿真
- 某电子计算机有400个终端,(概率四习题.doc
- anaconda配置h5py===2.10.0
热门文章
- RF(robotframework)安装后RIDE双击打不开的问题
- HackTheBox-Chaos-CTF_解题过程
- 魔界/指环王三部曲(加长版)在线观看免费bt下载
- 金三银四跳槽季,教你这几招提高面试成功率
- Unity Shader学习-单张纹理
- 计算机体系结构(国防科大)-第四章-指令级并行
- 贡献度分析--帕累托图
- Compiling for iOS 10.0, but module ‘xxx‘ has a minimum deployment target of iOS 12.0
- lan上网和adsl上网
- opencv Library QUIRC is not linked解决办法