根据分子运动预测双色球走势(三)-数据清洗和机器学习

一、问题

在爬取到双色球开奖的历史数据和开奖当日20-22点的气候数据之后,我们面临的问题是:

  1. 选择什么样的算法寻找天气数据和双色球开奖结果的关系(只选择蓝球)
  2. 为实现1的算法,需对数据做什么样的处理?
  3. 选择什么技术实现模型训练

首先,将问题简化。若只考虑天气(气温,露点,气压,风向,风速,天气情况)和双色球开奖结果蓝球(1-16)之间的关系。这就是一个多分类问题。模型的计算可选择两种方向:

  • Python 实现的 TensorFlow
  • Scala 实现的Spark MLlib

TensorFlow 是谷歌开源的Python 实现的包,TensorFlow项目领导Rajat Monga说到:“TensorFlow对于AlphaGo来说更多的是底层支撑技术,我们的作用是让AlphaGo运作更顺畅。而如何提升棋艺则是Deepmind团队的工作”。所以TensorFlow 是一个很好的选择。
Spark MLlib是基于Scala 实现的在Hadoop 的一站式大数据平台。所以Spark MLlib也是不错的选择。
由于一、二都是基于Scala 实现,所以我们选择方案二。

二、实现

1. 数据清洗

从双色球开奖的历史数据中,包含的列有
{ 期号,红球序列,蓝球,奖池金额,一等奖金额 }
数据格式:
(String, String, String, String,String)
样例数据:


image.png

对数据进行清洗,并实数化

def clean2ColorBall:Map[String,List[Int]] = {
    val data = Source.fromFile("/Users/hhl/mypro/SparkAppExamples/Hello.txt").getLines().filter(!_.contains("16115期"))
      .map(_.split(";")).map(x=>{
      val qh = x(0).substring(0,7)
      val date = x(1).replace("-","")
      val r1 = x(2).toInt
      val r2 = x(3).toInt
      val r3= x(4).toInt
      val r4 = x(5).toInt
      val r5 = x(6).toInt
      val r6 = x(7).toInt
      val b7 = x(8).toInt
      val saleroom = x(9).replace("元","").replace(",","").trim.toInt
      val jackpot = x(10).replace("元","").replace(",","").trim.toInt
       val res = List(r1,r2,r3,r4,r5,r6,b7,saleroom,jackpot)
      date -> res
    }).toMap
    data
  }
  1. feature 的选择和准备
    选择
    {气温,露点,气压,风向,风速,天气情况,奖池金额}
    作为Feature,按照下列逻辑做数据清洗,并转化为DataFrame,存储为Parquet.
def cleanWx(spark:SparkSession) = {
    val m = clean2ColorBall
    val data = Source.fromFile("/Users/hhl/mypro/SparkAppExamples/wx.txt").getLines()
      .map(_.split(";")).filter(_.size !=1)
      .map(x=>{
       // 气温,露点,湿度,气压,风向,风速,状况 6个feature
        val date = x(0)
      val time = x(1).replace("PM","").trim
      val qw = x(2).toDouble
      val ld = x(3).toDouble
      val sd = x(4).replace("%","").toDouble
        val qy = x(5).toDouble
        val fx = x(6)
        val fs = x(7).toDouble
        val zk = x(8)
        (date,time,qw,ld,sd,qy,fx,fs,zk)
    }).filter(_._6 != -1).toList
    // 归一化,实数化
    val fxList = data.map(_._7).distinct.zipWithIndex.toMap
    val zkList = data.map(_._9).distinct.zipWithIndex.toMap
    val res = data.map(x=>(x._1,x._2,x._3,x._4,x._5,x._6,
      fxList.getOrElse(x._7,-1).toDouble,x._8,zkList.getOrElse(x._9,-1).toDouble)).groupBy(_._1)
      .map(x=>x._2.sortBy(_._2).head).toList
    val res1 = res.sortBy(x=>(x._1,x._2)).map(x=>{
      val lq = m.getOrElse(x._1,List(-1,-1,-1,-1,-1,-1,-1))(6).toDouble
      val jc = m.getOrElse(x._1,List(-1,-1,-1,-1,-1,-1,-1))(7).toDouble
      val values = Array(x._3 + 100 ,x._4 + 100,x._5,x._6,x._7,x._8,x._9,jc) // naive beyes 不支持负值
      val featureVecotr =Vectors.dense(values.init)
      val lable = lq
      (lable,featureVecotr)
    })

    import spark.implicits._
    val df = spark.createDataset(res1).repartition(1).toDF("label","features")
    df.write.mode(SaveMode.Overwrite).parquet("/Users/hhl/mypro/SparkAppExamples/res.txt")
    //df.write.format("csv").mode(SaveMode.Overwrite).save("/Users/hhl/mypro/SparkAppExamples/res.txt")
  }
  1. 模型训练和结果预测
    选择朴素贝叶斯算法训练模型,并验证模型预测的准确度
 val data = spark.read.parquet("/Users/hhl/mypro/SparkAppExamples/res.txt")

    // Split the data into training and test sets (30% held out for testing)
    val Array(trainingData, testData) = data.randomSplit(Array(0.7, 0.3), seed = 1234L)

    // Train a NaiveBayes model.
    val model = new NaiveBayes()
      .fit(trainingData)

    // Select example rows to display.
    val predictions = model.transform(testData)
    predictions.show(100)

    // Select (prediction, true label) and compute test error
    val evaluator = new MulticlassClassificationEvaluator()
      .setLabelCol("label")
      .setPredictionCol("prediction")
      .setMetricName("accuracy")
    val accuracy = evaluator.evaluate(predictions)
    println("Test set accuracy = " + accuracy)
  1. 准确度
    对测试数据的预测结果:


    image.png

准确度:


image.png

只有 8%。。。。

四、总结

根据峰值运动预测双色球走势的流程基本上结束了。最终的结果如一盆冷水,透心凉。想通过技术手段赚大钱的愿望再次破灭了。不过,却有几点重要的经验:

  1. 如何编写一个并发的反反爬虫的Scala 爬虫
  2. 如何进行数据清洗
  3. 如何使用朴素贝叶斯训练模型

由此,又引起新的问题,为什么准确度这么低?如何提高准确度呢?这也许才是这个简单的Demo最大的收获。知道自己不知道,明确了方向,才能更进一步。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容