很多人或许都看过火影忍者,你是否对蛤蟆丸口中的预言之子感到很神奇,这个老蛤蟆预言了很多事情,他在梦里可以预见未来。如果我们在现实生活中也能预测未来该有多好,每天坐等买彩票就可以致富了(笑醒)。当然彩票因为其随机性,肯定是不能预测的,不过有些事情倒是可以预测,只是现有的技术还做不到百分百正确。那么哪些事情是可以预测的呢,比如预测天气、预测股票,预测世界杯或NBA,预测疾病,事故,公司明年的销量,未来的房价走向等等。其实预测可以用于几乎每个行业,通过预测可以对一些决策提供客观参考。那么怎么做到预测呢?下面我们通过一个简单的示例来理解预测。
假设有这样一个场景,每天上下班的时候,我们乘坐的电梯有时候会出故障,有的电梯一下掉十几楼,我每天坐电梯的时候心都是提着的。那么我们是否可以对某部电梯的故障进行预测,来减少未来发生故障的次数?当然可以的。
选用较为主流的一些工具来搭建我们的预测环境。
jupyter安装:https://www.cnblogs.com/bxyan/p/7203966.html可以参照该文章进行安装
hadoop安装:https://blog.csdn.net/hliq5399/article/details/78193113安装本地模式就可以了
spark安装:https://www.cnblogs.com/tijun/p/7561718.html 由于spark是运行在hdfs上,所以需要先安装好hadoop
以上环境搭建好了后,我们就以hadoop为数据源,来计算预测模型,再以该模型实时预测电梯故障。
我们采集到电梯正常运行和故障发生前的一些数据:
运行时长 | 200 | 370 | 130 | 245 | 360 | 365 | 345 | 361 | 112 | 190 | 234 | 564 | 670 | 200 | 240 | 490 | 785 | 280 | 150 | 530 | 489 | 389 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
载重 | 500 | 100 | 900 | 300 | 700 | 900 | 555 | 233 | 1000 | 1100 | 234 | 600 | 300 | 1100 | 900 | 400 | 1000 | 1200 | 1189 | 999 | 100 | 1009 |
是否高峰期 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 |
是否故障 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
我们将其中的70%作为训练数据,30%作为测试数据。首先利用训练数据训练出预测模型。我们用pyspark从hadoop中提取出数据:
import findspark
import os
#初始化pyspark的依赖
findspark.init()
%matplotlib inline
# 实例化sparksession
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.master("local") \
.appName("Python Spark SQL basic example") \
.config("spark.some.config.option", "some-value") \
.enableHiveSupport() \
.getOrCreate()
spark实例已经初始化成功,接下来从hadoop中提取数据到spark中,
#提取hadoop数据到DataFram
df_train = spark.read.format("csv").option("header","true")\
.option("inferSchema","true").load("hdfs://bigdata:8020/hive/warehousedir/db.db/lift/lift_train.txt")
df_train.show()
接下来需要将这些数据构造成特征矩阵,其中feature列就是转换后的特征矩阵
from pyspark.ml.feature import *
vectorizer = VectorAssembler()
vectorizer.setInputCols(["runtime", "weight", "ishight"])
vectorizer.setOutputCol("features")
#特征矩阵
df_vect = vectorizer.transform(df_train)
df_vect.show()
我们这里选用的是逻辑回归算法来生成模型,因为我们预测的目标属性是一个二元数值。生成模型的算法还有很多,按模型的训练方式分为:有监督训练、无监督训练和半监督训练。逻辑回归是监督训练中的一种,决策树算法,神经网络,多元线性回归等也都属于监督训练。
#构建逻辑回归模型
from pyspark.ml.classification import LogisticRegression
mlor = LogisticRegression(regParam=0.1, elasticNetParam=0, family="binomial")
#设置目标属性和特征矩阵
mlor.setLabelCol("isbroken")
mlor.setFeaturesCol("features")
#生成模型
model = mlor.fit(df_vect)
pyspark.ml库给我们提供了多种分类算法,我们可以根据业务场景选择合适的算法来生成模型。根据该模型,对测试数据进行预测
df_test = spark.read.format("csv").option("header","true")\
.option("inferSchema","true").load("hdfs://bigdata:8020/hive/warehousedir/db.db/lift/lift_test.txt")
#构建测试数据的特征矩阵
df_vtest = vectorizer.transform(df_test)
#预测
transformed = model.transform(df_vtest)
transformed.show()
其中prediction这列就是我们对测试数据预测的结果,当然,用于训练的数据越多,最后预测的结果就越准确。一个模型只要预测正确的概率大于随机概率,都是有意义的。