在本系列前面的文章中,简单介绍了一下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. Object类的几个方法

    1.protected Object clone()创建并返回此对象的一个副本. 2. boolean equals(Object obj)指示其他某个对象是否与此对象“相等”. 3. protect ...

  2. 如何正确从他人机器MySQL数据库下拷贝出.sql,再导入到自己windows下MySQL数据库(图文详解)

    不多说,直接上干货! 我这里,是放在桌面上. 登陆数据库 然后, mysql -uroot -p 默认是回车. 创建数据库 CREATE DATABASE securityonion_db; 目的,就 ...

  3. AJPFX总结匿名类及其使用

    匿名类是一种特殊的内部类,它是在一个表达式内部包含一个完整的类定义.内部类是在一个类的内部嵌套定义的类,它可以是其它类的成员也可以在一个语句块的内部定义还可以在表达式内部匿名定义匿名类与其他类的不同就 ...

  4. Arduino中数据类型转换 float/double转换为char 亲测好使,dtostrf()函数

    如何轻松玩转Arduino单片机,当我在进行数据转换的时候,遇到了问题,尝试了C语言和C++中的好多函数,都没有达到将float型数据转换为char型的目的.苦苦查阅资料后,终于找到了一个大神级函数! ...

  5. SQLyog连接MySQL时出现的2058错误解决方法

    配置新连接报错:错误号码 2058,分析是 mysql 密码加密方法变了. 解决方法:windows 下cmd 登录 mysql -u root -p 登录你的 mysql 数据库,然后执行这条SQL ...

  6. UVA 1175 Ladies' Choice 女士的选择(稳定婚姻问题,GS算法)

    题意: 给出每个男的心目中的女神排序,给出每个女的心目中的男神排序,即两个n*n的矩阵,一旦任意两个非舞伴的男女同学觉得对方都比现任舞伴要好,他们就会抛弃舞伴而在一起.为了杜绝这种现象,求每个男的最后 ...

  7. SEO 第二章

    SEO第二章 1.  掌握搜索引擎工作原理(重点) 2.  了解百度算法 3.  关键词的分类 一.什么是搜索引擎? 搜索引擎是用来实现搜索服务的,说白了搜索引擎也属于一种网站. 浏览器是用来加载网站 ...

  8. SQLite -插入查询

     SQLite -插入查询 SQLite插入语句是用来添加新行数据到数据库中的一个表. 语法: 有两种基本的插入语句的语法如下: INSERT INTO TABLE_NAME (column1, co ...

  9. (转)编码剖析Spring依赖注入的原理

    http://blog.csdn.net/yerenyuan_pku/article/details/52834561 Spring的依赖注入 前面我们就已经讲过所谓依赖注入就是指:在运行期,由外部容 ...

  10. python程序的编辑和运行、变量

    第一个python程序 python是解释型弱类型高级语言 常见的python解释器CPython.IPython.pypy.JPython.IronPython 方法一.python程序可以写在命令 ...