3、预测模型笔记

预测模型

1、简介

预测建模(Predictive modeling)是一种用来预测系统未来行为的分析技术,它由一群能够识别独立输入变量与反馈目标关联关系的算法构成。根据观测值创建一个数学模型,然后用这个模型去预测未来发生的事情。
预测模型是用若干个可能对系统行为产生影响的特征构建的,当处理系统问题时,需要先判断哪些因素可能会影响系统的行为,然后在训练模型之前将这些因素添加进特征中。

2、用SVM建立线性分类器

SVM是用来构建分类器和回归器的监督学习模型,SVM通过对数学方程组求解,可以找出两组数据之间的最佳分割边界。下面先使用第2章的创建简单分类器将数据分类并画出。

# 1、加载数据
import numpy as np
import matplotlib.pyplot as plt
input_file = 'data_multivar.txt'def load_data(input_file):X = []y = []with open(input_file, 'r') as f:for line in f.readlines():data = [float(x) for x in line.split(',')]X.append(data[:-1])y.append(data[-1])X=np.array(X)y = np.array(y)return X,y
X,y=load_data(input_file)# 2、分类
class_0=np.array([X[i] for i in range(len(X)) if y[i]==0])
class_1=np.array([X[i] for i in range(len(X)) if y[i]==1])
print(class_0)
# 3、画图
plt.figure()
plt.scatter(class_0[:,0],class_0[:,1],facecolor='black',edgecolors='black',marker='s')
plt.scatter(class_1[:,0],class_1[:,1],facecolor='none',edgecolors='black',marker='s')
plt.show()# 定义画图函数
def plot_classifier(classifier, X, y):# 获取x,y的最大最小值,并设置余值x_min, x_max = min(X[:, 0]) - 1.0, max(X[:, 0] + 1.0)y_min, y_max = min(X[:, 1]) - 1.0, max(X[:, 1] + 1.0)# 设置网格步长step_size = 0.01# 设置网格x_values, y_values = np.meshgrid(np.arange(x_min, x_max, step_size), np.arange(y_min, y_max, step_size))# 计算出分类器的分类结果mesh_output = classifier.predict(np.c_[x_values.ravel(), y_values.ravel()])mesh_output = mesh_output.reshape(x_values.shape)# 画图plt.figure()# 选择配色方案plt.pcolormesh(x_values, y_values, mesh_output, cmap=plt.cm.gray)# 画点plt.scatter(X[:, 0], X[:, 1], c=y, s=80, edgecolors='black', linewidths=1, cmap=plt.cm.Paired)# 设置图片取值范围plt.xlim(x_values.min(), x_values.max())plt.ylim(y_values.min(), y_values.max())# 设置x与y轴plt.xticks((np.arange(int(min(X[:, 0]) - 1), int(max(X[:, 0]) + 1), 1.0)))plt.yticks((np.arange(int(min(X[:, 1]) - 1), int(max(X[:, 1]) + 1), 1.0)))plt.show()

如图:

JY0omBB.png

从上面的结果可以看出,空心和实心分别为不同类。下面使用SVM将不同类分开。结果如下图:

qRjBUWN.png
代码如下:

# 使用SVM
from sklearn.svm import SVC
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=5)
params = {'kernel': 'linear'}
classifier = SVC(**params)
# 训练线性SVM分类器,并查看结果边界
classifier.fit(X_train, y_train)
plot_classifier(classifier, X_train, y_train)
# 测试数据集
y_test_pred = classifier.predict(X_test)
plot_classifier(classifier, X_test, y_test)
# 查看数据的精准性,训练数据集的分类报告
from sklearn.metrics import classification_report
print(classification_report(y_train,classifier.predict(X_train),target_names=['Class-'+str(int(i)) for i in set(y)]))
# 测试数据集的分类报告
print(classification_report(y_test,classifier.predict(X_test),target_names=['Class-'+str(int(i)) for i in set(y)]))

3、用SVM建立非线性分类器

从上面的分类报告可知,我们的分类情况并不理想,而且,最开始的数据可视化也可看出,实心完全被空心包围着,所以,我们需要尝试非线性分类器。
SVM为建立非线性分类器提供了许多选项,需要用不同的核函数建立费线性分类器。为了简单起见,考虑一下两种情况。

3.1、多项式函数

直接将线性中的params={'kernel':'linear'}替换成params={'kernel':'poly','degree':3},其中degree表示三次多项式,随着次数增加,可让曲线变得更弯,但是训练时间也会越长,计算强度越大。结果如下图:

LNgrHrT.png

3.2、径向基函数(Radial Basis Function,RBF)

直接将线性中的params={'kernel':'linear'}替换成params={'kernel':'rbf'},结果如下图:

wKLUSLS.png

4、解决类型数量不平衡问题

在现实生活中,我们得到的数据可能会出现某类数据比其他类型数据多很多的情况,在这种情况下分类器会有偏差,边界线也不会反应数据的真实性,所以需要对数据进行调和。
换一个数据,以上面线性SVM为例,将数据换成data_multivar_imbalance.txt之后,显示为

klX1zOu.png

由图可知,没有边界线,这是因为分类器不能区分这两种类型,所以,将参数改为params={'kernel':'linear','class_weight':'balanced'}即可。结果如下:

jRMND85.png

5、提取置信度

当一个信的数据点被分类为某一个已知类别时,我们可训练SVM来计算输出类型的置信度。

input_datapoints = np.array([[2, 1.5], [8, 9], [4.8, 5.2], [4, 4], [2.5, 7], [7.6, 2], [5.4, 5.9]])for i in input_datapoints:print(i, '-->', classifier.decision_function(i)[0])# 测量点到边界的距离params = {'kernel': 'rbf', 'probability': True}
classifier = SVC(**params)
classifier.fit(X_train, y_train)for i in input_datapoints:print(i, '-->', classifier.predict_proba(i)[0])# 这里要求params中probability必须为True,计算输入数据点的置信度plot_classifier(classifier, input_datapoints, [0]*len(input_datapoints))

6、寻找最优超参数

超参数对分类器的性能至关重要。寻找步骤如下:

# 1、加载数据,通过交叉验证
parameter_grid = [{'kernel': ['linear'], 'C': [1, 10, 50, 600]},{'kernel': ['poly'], 'degree': [2, 3]},{'kernel': ['rbf'], 'gamma': [0.01, 0.001], 'C': [1, 10, 50, 600]},]metrics = ['precision', 'recall_weighted']from sklearn import svm, grid_search, cross_validation
from sklearn.metrics import classification_report
# 2、为每个指标搜索最优超参数
for metric in metrics:classifier = grid_search.GridSearchCV(svm.SVC(C=1), parameter_grid, cv=5, scoring=metric)# 获取对象classifier.fit(X_train, y_train)# 训练for params, avg_score, _ in classifier.grid_scores_:# 看指标得分print(params, '-->', round(avg_score, 3))print('最好参数集:',classifier.best_params_)# 最优参数集y_true, y_pred = y_test, classifier.predict(X_test)print(classification_report(y_true, y_pred))# 打印一下性能报告

7、建立时间预测器

这个例子和之前的差不多,主要是记住步骤。

# 1、读取数据
input_file='building_event_multiclass.txt'
# input_file='building_event_binary.txt'X=[]
y=[]
with open(input_file,'r') as f:for line in f.readlines():data=line[:-1].split(',')X.append([data[0]]+data[2:])
X=np.array(X)
# 2、编码器编码
from sklearn import preprocessing
label_encoder=[]
X_encoder=np.empty(X.shape)
for i,item in enumerate(X[0]):if item.isdigit():X_encoder[:,i]=X[:,i]else:label_encoder.append(preprocessing.LabelEncoder())X_encoder[:,i]=label_encoder[-1].fit_transform(X[:,i])
X=np.array(X_encoder[:,:-1]).astype(int)
y=np.array(X_encoder[:,-1]).astype(int)
# 3、进行分类
from sklearn.svm import SVC
params={'kernel':'rbf','probability':True,'class_weight':'balanced'}
classifier=SVC(**params)
classifier.fit(X,y)
# 4、交叉验证
from sklearn.model_selection import cross_val_score
accuracy=cross_val_score(classifier,X,y,scoring='accuracy',cv=3)
print('accuracy:',accuracy.mean())
# 5、对新数据进行验证
input_data = ['Tuesday', '12:30:00','21','23']
input_data_encoder=[-1]*len(input_data)
count=0for i,item in enumerate(input_data):if item.isdigit():input_data_encoder[i]=int(input_data[i])else:label=[]label.append(input_data[i])input_data_encoder[i]=label_encoder[count].transform(label)count=count+1result=int(classifier.predict(np.array(input_data_encoder)))
print('result:',label_encoder[-1].inverse_transform(result))

8、估算交通流量

在之前的SVM都是用作分类器,现在展示一个回归器的例子:

# 1、获取数据
X=[]
input_file='traffic_data.txt'
with open(input_file,'r') as f:for line in f.readlines():data=line[:-1].split(',')X.append(data)X=np.array(X)# 2、编码
from sklearn import preprocessing
label_encoder=[]
X_encoder=np.empty(X.shape)
for i,item in enumerate(X[0]):if item.isdigit():X_encoder[:,i]=X[:,i]else:label_encoder.append(preprocessing.LabelEncoder())X_encoder[:,i]=label_encoder[-1].fit_transform(X[:,i])X=X_encoder[:,:-1].astype(int)
y=X_encoder[:,-1].astype(int)# 3、线性回归
from sklearn.svm import SVR
# params = {'kernel': 'rbf', 'C': 10.0, 'epsilon': 0.2}
params={'kernel':'rbf','C':10.0,'epsilon':0.2}# C表示对分类的惩罚,参数epsilon表示不使用惩罚的限制
regressor=SVR(**params)
regressor.fit(X,y)
# 4、验证
from sklearn.metrics import mean_absolute_error
y_pred=regressor.predict(X)
print('mean_absolute_error:',mean_absolute_error(y,y_pred))
# 5、预测新值
input_data = ['Tuesday', '13:35', 'San Francisco', 'yes']
input_data_encoder=[-1]*len(input_data)
count=0
for i,item in enumerate(input_data):if item.isdigit():input_data_encoder[i]=int(input_data[i])else:label=[]label.append(input_data[i])input_data_encoder[i]=int(label_encoder[count].transform(label))count=count+1result=regressor.predict(input_data_encoder)
print(result)

转载于:https://www.cnblogs.com/NSGUF/p/8278119.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369906.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见问题_智能切膜机常见问题

hoco.智能切膜机,如果使用了错误方式,会导致操作失误,整理4个常见问题,还有错误示范,请跟随视频去了解,你使用正确了吗?1. 膜切反这个需要留意切割膜的正反,有文字面就是正面,无文字…

bootstrap的栅格系统和响应式工具

关于bootstrap的响应式布局&#xff0c;昨天看了杨老师的视频教学https://www.bilibili.com/video/av18357039豁然开朗&#xff0c;在这里记录一下 一&#xff1a;meta标签的引用 <meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" conte…

小熊错误_新手爸妈第一年带娃时,很容易犯的7个错误,对照看看你中了没

文 /关注小熊育儿&#xff0c;帮您轻松育儿带娃不是一件容易的事&#xff0c;对爸妈的时间和体力都是一种考验&#xff0c;不仅“熊孩子”让人头疼&#xff0c;育儿知识差&#xff0c;不懂科学育儿理念的“熊爸妈”也是让人很无奈的&#xff0c;最终受伤的还是孩子&#xff0c;…

python--装饰器、生成器、迭代器、元类

一、装饰器 def w1(func):def inner():func()return innerw1 def f1():print(1111111) 1.只要python解释器执行到装饰器&#xff0c;就会自动进行装饰&#xff0c;而不是等到调用的时候才进行装饰。 2.有参数的函数&#xff0c;装饰器定义方法 def w1(func):def inner(*args, *…

scss的使用方式(环境搭建)

我用的是Koala。 IDE是intellij_idea&#xff08;其他IDE也可&#xff09; 下载Koala&#xff1a;http://koala-app.com/ 2.安装&#xff08;选好位置&#xff0c;下一步即可&#xff09; 3.打开Koala&#xff0c;创建项目 》创建css文件夹》创建XXX.scss文件&#xff0c;拖到…

小程序 按需_小程序想要留住用户需哪些举措?

**当下许多企业在进行长沙小程序开发后&#xff0c;都会费劲心思在推广引流上&#xff0c;很多企业也确实起到了不错的效果&#xff0c;用户们也是纷纷来到企业的小程序中。只不过有的小程序却无法将用户留下来&#xff0c;导致用户流失&#xff0c;令推广付之东流。下面长沙小…

渍渍渍~来一发豆瓣自动登录玩玩~

今天来一个比较屌的自动化登陆工具&#xff0c;selenium模块&#xff0c;这个模块&#xff0c;比较装逼啦~具体自行百度吧&#xff01;这篇博客实现了什么功能呢~可以自动使用用户名和密码登录&#xff0c;当然&#xff0c;豆瓣对登录次数还有ip地址做了一些策略&#xff0c;例…

Redis数据库入门学习(下载与安装、常用命令、在Java中操作Redis)

简介 下载与安装 数据类型 常用命令 1.字符串操作命令 2.哈希操作命令 3.列表操作命令 push是将元素总是插入到第一个 0表示第一个&#xff0c;1表示第二个。-1表示倒数第一个&#xff0c;-2表示倒数第二个。当前命令的意思是第一个到倒数第一个&#xff0c;即就是全部元素 rpo…

.NET使用Office Open XML导出大量数据到 Excel

我相信很多人在做项目的都碰到过Excel数据导出的需求&#xff0c;我从最开始使用最原始的HTML拼接&#xff08;将需要导出的数据拼接成TABLE标签&#xff09;到后来happy的使用开源的NPOI, EPPlus等开源组件导出EXCEL&#xff0c;但不久前&#xff0c;我在一个项目碰到一个需求…

CSS自定义消息提示

1.效果 2.源码 <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head><style type"text/css">#confirm{position: absolute;z-index: 1;display: inline-block;border: 1px solid black;backgr…

file 选择的文件胖多有多大_如何删除 macOS 压缩包中的隐藏文件?

如何删除 macOS 压缩包中的隐藏文件&#xff1f;在工作中&#xff0c;压缩打包文件是不可缺少的一项工作。为了避免文件的损坏和缺失&#xff0c;我们通常在macOS系统中&#xff0c;把多个文件或文件夹压缩后进行传输&#xff0c;我们一般使用访达&#xff08;Finder&#xff0…

CSS画各种二维图形

1.效果 2.源码 <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head><style type"text/css">#triangle_top{display: inline-block;width:0;height:0;border-left:50px solid transparent;bor…

数据库的开启与关闭

今天&#xff0c;为了一些原因&#xff0c;要重启数据库&#xff0c;但因为当时安装的时候&#xff0c;同学随便装了&#xff0c;导致很多文件都找不到&#xff0c;想使用绝对路径重启数据的计划卡死在了路上。以下&#xff0c;我写下我的数据库开启、关闭的方法&#xff0c;方…

leetcode怎么用时间刷_刷完700多题后的首次总结:LeetCode应该怎么刷?

推荐观看&#xff1a;java技术进阶&#xff1a;膜拜&#xff01;字节大神总结的666页大师级算法宝典&#xff0c;分分钟团灭LeetCode​zhuanlan.zhihu.com2020最新马士兵老师联手左程云老师丨数据结构与算法丨面试BATJ必备​www.bilibili.com我是大二的时候开始接触LeetCode的&…

IntelliJ IDEA:使用Google Guava生成equals,hashCode和toString

问题 在Java领域&#xff0c;我们经常需要编写equals &#xff0c; hashCode和toString方法。 老实说&#xff0c;这通常只是一个样板义务。 得益于智能IDE&#xff0c;我们通常不再自己这样做。 我们只是让和IDE一起努力。 不过有一个问题。 生成的代码通常非常丑陋。 让我们…

Appscan_web安全测试工具 (含修改启动浏览器的方法)

安全测试应该是测试中非常重要的一部分&#xff0c;但他常常最容易被忽视掉。 尽管国内经常出现各种安全事件&#xff0c;但没有真正的引起人们的注意。不管是开发还是测试都不太关注产品的安全。当然&#xff0c;这也不能怪我们苦B的“民工兄弟”。因为公司的所给我们的时间与…

传说之下地图素材_【开阔眼界】地图上的史记——名著轻松读

购买链接&#xff1a;https://j.youzan.com/Zns-38我读了无数次《史记》&#xff0c;每次都是读了开头没几页就放弃&#xff0c;文言文看不懂&#xff0c;翻译的白话文内容又太枯燥&#xff0c;现在居然有图画版的史记&#xff0c;还附有说明&#xff0c;真是太好了&#xff0c…

go int 转切片_「快学 Go 语言」第 4 课——低调的数组

数组就是一篇连续的内存&#xff0c;几乎所有的计算机语言都有数组&#xff0c;只不过 Go 语言里面的数组其实并不常用&#xff0c;这是因为数组是定长的静态的&#xff0c;一旦定义好长度就无法更改&#xff0c;而且不同长度的数组属于不同的类型&#xff0c;之间不能相互转换…

从XaaS到Java EE – 2012年哪一种该死的云最适合我?

您是否曾经想过要让Java EE在某个地方启动和运行需要什么&#xff1f; 是的 多年。 从托管我自己的主机开始&#xff0c;转到一些托管产品 &#xff0c;最后偶然发现了PaaS运动。 老实说&#xff0c;我并没有太认真。 我只是想把我的东西放到某个地方&#xff0c;而不在乎解决…

正方体最快最简单画_素描新手入门第一幅画可不只是“正方体”

很多素描教程都把正方体作为入门第一幅画学习内容。这种现象也成了约定俗成的规矩但是&#xff0c;学过画画的人大概都知道有很多人画了多年石膏几何形、静物、人头像甚至半身像全身像。到最后落得只会画这些学过的东西。这就说明学习出了问题。绘画练习一定要弄清楚每个物体练…