在本系列前面的文章中,简单介绍了一下Ignite的机器学习网格,下面会趁热打铁,结合一些示例,深入介绍Ignite支持的一些机器学习算法。
  
  如果要找合适的数据集,会发现可用的有很多,但是对于线性回归来说,一个非常好的备选数据集就是房价,可以非常方便地从UCI网站获取合适的数据。
  
  在本文中会训练一个线性回归模型,并且计算R2得分。
  
  需要先准备一些数据,并且要将数据转换成Ignite支持的格式,这通常是数据科学家需要花时间做的事。
  
  首先,需要获取原始数据并将其拆分成训练数据(80%)和测试数据(20%)。Ignite暂时还不支持专用的数据拆分,路线图中的未来版本会支持这个功能。但是就目前来说有许多可用的免费和开源工具可以执行这样的数据拆分,或者也可以用一种Ignite支持的编程语言自己编写这种代码。在本文中会使用下面自己编写的代码来实现此任务:
  
  from sklearn import datasets
  
  import pandas as pd
  
  # Load Boston housing dataset.
  
  boston_dataset = datasets.load_boston()
  
  x = boston_dataset.data
  
  y = boston_dataset.target
  
  # Split it into train and test subsets.
  
  from sklearn.model_selection import train_test_split
  
  x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=23)
  
  # Save train set.
  
  train_ds = pd.DataFrame(x_train, columns=boston_dataset.feature_names)
  
  train_ds["TARGET"] = y_train
  
  train_ds.to_csv("boston-housing-train.csv", index=False, header=None)
  
  # Save test set.
  
  test_ds = pd.DataFrame(x_test, columns=boston_dataset.feature_names)
  
  test_ds["TARGET"] = y_test
  
  test_ds.to_csv("boston-housing-test.csv", index=False, header=None)
  
  # Train linear regression model.
  
  from sklearn.linear_model import LinearRegression
  
  lr = LinearRegression()
  
  lr.fit(x_train, y_train)
  
  # Score result model.
  
  lr.score(x_test, y_test)
  
  这段代码从UCI网站上获取可用的数据集,执行了数据的拆分,然后计算了R2得分。返回值为0.745021053016975,或者为74.5%,之后会将此值与Ignite的进行对比。
  
  当训练和测试数据准备好之后,就可以写应用了,本文的算法是:
  
  读取训练数据和测试数据;
  
  在Ignite中保存训练数据和测试数据;
  
  使用训练数据拟合线性回归模型;
  
  将模型应用于测试数据;
  
  确定模型的R2得分。
  
  由于数据集非常小,可以将其加载到标准Java数据结构中,并直接从Java程序中运行线性回归。或者,也可以将数据加载到Ignite存储中,然后对存储的数据进行线性回归。使用Ignite存储的优点是数据将分布在整个集群中,因此将执行分布式训练。对于大规模数据集,使用Ignite存储就会有很大的好处。在本例中将把数据加载到Ignite存储中。
  
  读取训练数据和测试数据
  
  需要读取两个CSV文件,一个是训练数据,一个是测试数据。通过下面的代码,可以从CSV文件中读取数据:
  
  private static void loadData(String fileName, IgniteCache<Integer, HouseObservation> cache)
  
  throws FileNotFoundException {
  
  Scanner scanner = new Scanner(new File(fileName));
  
  int cnt = 0;
  
  while (scanner.hasNextLine()) {
  
  String row = scanner.nextLine();
  
  String[] cells =www.chuangshi88.cn row.split(",");
  
  double[] features = new double[cells.length - 1];
  
  for (int i = 0; i www.mingcheng178.com< cells.length -www.365soke.com/ 1; i++)
  
  features[i] = Double.valueOf(cells[i]);
  
  double price www.fengshen157.com= Double.valueOf(cells[cells.length - 1]);
  
  cache.put(cnt++, new HouseObservation(features, price));
  
  }
  
  }
  
  该代码简单地一行行的读取数据,然后对于每一行,使用CSV的分隔符拆分出字段,每个字段之后将转换成double类型并且存入Ignite。
  
  将训练数据和测试数据存入Ignite
  
  前面的代码将数据存入Ignite,要使用这个代码,首先要创建Ignite存储,如下:
  
  IgniteCache<Integer, HouseObservation> trainData = ignite.createCache("BOSTON_HOUSING_TRAIN");
  
  IgniteCache<Integer, www.leyouzaixian2.com HouseObservation> testData = ignite.createCache("BOSTON_HOUSING_TEST");
  
  使用训练数据创建线性回归模型
  
  数据存储之后,可以像下面这样创建训练器:
  
  DatasetTrainer<LinearRegressionModel, Double> trainer = new LinearRegressionLSQRTrainer();
  
  然后拟合训练数据,如下:
  
  LinearRegressionModel mdl = trainer.fit(
  
  ignite,
  
  trainData,
  
  (k, v) -> v.getFeatures(),
  
  // Feature extractor.
  
  (k, v) -> v.getPrice()
  
  // Label extractor.
  
  Ignite将数据保存为键-值(K-V)格式,因此上面的代码使用了值部分,目标值是Price,而特征位于其他列中。
  
  将模型应用于测试数据
  
  下一步,就可以用训练好的线性模型测试测试数据了,在Ignite的机器学习路线图中,有计划提供内置的得分计算器,但是就目前来说,可以这样做:
  
  double meanPrice =www.gcyl152.com/ getMeanPrice(testData);
  
  double u = 0, v www.gcyL157.com= 0;
  
  try (QueryCursor<Cache.Entry<Integer, HouseObservation>> cursor = testData.query(new ScanQuery<>())) {
  
  for (Cache.Entry<Integer, HouseObservation> testEntry : cursor) {
  
  HouseObservation observation = testEntry.getValue();
  
  double realPrice = observation.getPrice();
  
  double predictedPrice www.mhylpt.com/ = mdl.apply(new DenseLocalOnHeapVector(observation.getFeatures()));
  
  u += Math.pow(realPrice - predictedPrice, 2);
  
  v += Math.pow(realPrice -www.mcyllpt.com/ meanPrice, 2);
  
  }
  
  }
  
  这里计算的是残差平方和(U)和总平方和(V)。
  
  确定模型的R2得分
  
  可以发现,R2的值为1 - u / v:
  
  double score = 1 - u / v;
  
  System.out.println("Score : " + score);
  
  输出值为0.7450194305206714,或者74.5%,这与之前的值相同。
  
  总结
  
  Apache Ignite提供了一个机器学习算法库。通过线性回归示例,可以看到创建模型、测试模型和确定模型的R2得分的简单性,也可以用这个模型来做预测。
  
  目前,可用的机器学习工具有很多,但它们不能多节点扩展,只能处理少量数据。相比之下,Ignite所带来的好处是它有能力扩展下面两种能力:
  
  集群的大小(成百上千台机器)
  
  存储的数据量(GB、TB甚至PB级数据)
  
  因此,Ignite可以大规模地运行机器学习。它可以以分布式处理的方式,对大数据进行真正的机器学习管理。

在Ignite中使用线性回归算法的更多相关文章

  1. scikit-learn 线性回归算法库小结

    scikit-learn对于线性回归提供了比较多的类库,这些类库都可以用来做线性回归分析,本文就对这些类库的使用做一个总结,重点讲述这些线性回归算法库的不同和各自的使用场景. 线性回归的目的是要得到输 ...

  2. 在Ignite中使用k-最近邻(k-NN)分类算法

    在本系列前面的文章中,简单介绍了一下Ignite的线性回归算法,下面会尝试另一个机器学习算法,即k-最近邻(k-NN)分类.该算法基于对象k个最近邻中最常见的类来对对象进行分类,可用于确定类成员的关系 ...

  3. 《BI那点儿事》Microsoft 线性回归算法

    Microsoft 线性回归算法是 Microsoft 决策树算法的一种变体,有助于计算依赖变量和独立变量之间的线性关系,然后使用该关系进行预测.该关系采用的表示形式是最能代表数据序列的线的公式.例如 ...

  4. [机器学习Lesson 2]代价函数之线性回归算法

    本章内容主要是介绍:单变量线性回归算法(Linear regression with one variable) 1. 线性回归算法(linear regression) 1.1 预测房屋价格 该问题 ...

  5. Spark机器学习(1):线性回归算法

    线性回归算法,是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法. 1. 梯度下降法 线性回归可以使用最小二乘法,但是速度比较慢,因此一般使用梯度下降法(Grad ...

  6. day-12 python实现简单线性回归和多元线性回归算法

    1.问题引入  在统计学中,线性回归是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析.这种函数是一个或多个称为回归系数的模型参数的线性组合.一个带有一个自变 ...

  7. Spark中常用的算法

    Spark中常用的算法: 3.2.1 分类算法 分类算法属于监督式学习,使用类标签已知的样本建立一个分类函数或分类模型,应用分类模型,能把数据库中的类标签未知的数据进行归类.分类在数据挖掘中是一项重要 ...

  8. 通过机器学习的线性回归算法预测股票走势(用Python实现)

    在本人的新书里,将通过股票案例讲述Python知识点,让大家在学习Python的同时还能掌握相关的股票知识,所谓一举两得.这里给出以线性回归算法预测股票的案例,以此讲述通过Python的sklearn ...

  9. 机器学习---用python实现最小二乘线性回归算法并用随机梯度下降法求解 (Machine Learning Least Squares Linear Regression Application SGD)

    在<机器学习---线性回归(Machine Learning Linear Regression)>一文中,我们主要介绍了最小二乘线性回归算法以及简单地介绍了梯度下降法.现在,让我们来实践 ...

随机推荐

  1. Nginx重写规则

    Nginx的重写规则,依赖于pcre库(perl compatible regular expression).所以在安装的时候一定要让nginx支持这个功能,以及安装pcre-devel,prce. ...

  2. shell expect

    关键的action spawn     调用要执行的命令expect     捕捉用户输入的提示 send        发送需要交互的值,替代了用户手动输入内容set           设置变量值 ...

  3. [转]C#综合揭秘——细说多线程(上)

    引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发. 其中委托的BeginInvoke方法以及回调函数最为常用. 而 I/O线程 ...

  4. 刷ID卡的就餐系统

    需求分析:公司旧的考勤系统,缺 “就餐”功能模块,不能查询和统计每天的就餐人数.故需开发一个简易的“刷ID卡的就餐系统”,三 部 分组成,一部分为人事资料的增删改查,二部分为处理从“刷卡就餐机”采集的 ...

  5. 使用gitblit 在windows平台搭建git服务器

    1.下载jdk,安装并且配置好环境变量 2.下载gitblit 直接解压无需安装 3.配置gitblit 1.修改gitblit安装目录下的data文件下的gitblit.properties.将in ...

  6. AJPFX总结java开发常用类(包装,数字处理集合等)(二)

    二:进军集合类 集合其实就是存放对象的容器,专业点说就是集合是用来存储和管理其他对象的对象,即对象的容器.集合可以扩容,长度可变,可以存储多种类型的数据,而数组长度不可变,只能存储单一类型的元素 用一 ...

  7. 证明碰撞集问题(Hitting Set)是NP-complete

    证明碰撞集问题(Hitting Set)是NP-complete Problem In the HITTING SET problem, we are given a family of sets { ...

  8. HTTPS时代已来,你做好准备了吗?

    早在今年年初,Google在其安全博客上已经表明,从7月开始,Chrome68会将所有的HTTP网站标记为不安全.随后,Mozilla也表明,Firefox浏览器也准备将所有HTTP网站标记为不安全. ...

  9. ICEcoder显示汉字出现乱码的处理

    在网上看到icecoder这个小东西,是一个基于web的编辑器,很不错.唯一的缺点是打开的文件中汉字会变成乱码. 经查看源代码,在lib/file-control.php中,第89行是: echo ' ...

  10. docker 新手入门 (web项目的部署)

    web项目的部署 1.首先我们下载centos镜像.docker pull centos 2.下载完成之后,我们首先要安装的是java环境  tomcat 和jdk 3.将下载好的软件放入到nmt目录 ...