在Ignite中使用线性回归算法 原 荐

栏目: 数据库 · 发布时间: 6年前

内容简介:在本系列前面的文章中,简单介绍了一下Ignite的机器学习网格,下面会趁热打铁,结合一些示例,深入介绍Ignite支持的一些机器学习算法。如果要找合适的数据集,会发现可用的有很多,但是对于线性回归来说,一个非常好的备选数据集就是房价,可以非常方便地从UCI网站获取在本文中会训练一个线性回归模型,并且计算R

在本系列前面的文章中,简单介绍了一下Ignite的机器学习网格,下面会趁热打铁,结合一些示例,深入介绍Ignite支持的一些机器学习算法。

如果要找合适的数据集,会发现可用的有很多,但是对于线性回归来说,一个非常好的备选数据集就是房价,可以非常方便地从UCI网站获取 合适的数据

在本文中会训练一个线性回归模型,并且计算R 2 得分。

需要先准备一些数据,并且要将数据转换成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网站上获取可用的数据集,执行了数据的拆分,然后计算了R 2 得分。返回值为0.745021053016975,或者为74.5%,之后会将此值与Ignite的进行对比。

当训练和测试数据准备好之后,就可以写应用了,本文的算法是:

  1. 读取训练数据和测试数据;
  2. 在Ignite中保存训练数据和测试数据;
  3. 使用训练数据拟合线性回归模型;
  4. 将模型应用于测试数据;
  5. 确定模型的R 2 得分。

由于数据集非常小,可以将其加载到标准 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 = row.split(",");
      double[] features = new double[cells.length - 1];

      for (int i = 0; i < cells.length - 1; i++)
         features[i] = Double.valueOf(cells[i]);
      double price = 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, 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 = getMeanPrice(testData);
double u = 0, v = 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 = mdl.apply(new DenseLocalOnHeapVector(observation.getFeatures()));

      u += Math.pow(realPrice - predictedPrice, 2);
      v += Math.pow(realPrice - meanPrice, 2);
   }
}

这里计算的是 残差平方和 (U)和 总平方和 (V)。

确定模型的R 2 得分

可以发现,R 2 的值为1 - u / v:

double score = 1 - u / v;

System.out.println("Score : " + score);

输出值为0.7450194305206714,或者74.5%,这与之前的值相同。

总结

Apache Ignite提供了一个机器学习算法库。通过线性回归示例,可以看到创建模型、测试模型和确定模型的R 2 得分的简单性,也可以用这个模型来做预测。

目前,可用的机器学习工具有很多,但它们不能多节点扩展,只能处理少量数据。相比之下,Ignite所带来的好处是它有能力扩展下面两种能力:

  1. 集群的大小(成百上千台机器)
  2. 存储的数据量(GB、TB甚至PB级数据)

因此,Ignite可以大规模地运行机器学习。它可以以分布式处理的方式,对大数据进行真正的机器学习管理。

在机器学习系列的下一篇中,将研究另一种机器学习算法。敬请期待!

在Ignite中使用线性回归算法 原 荐

以上所述就是小编给大家介绍的《在Ignite中使用线性回归算法 原 荐》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Spark技术内幕

Spark技术内幕

张安站 / 机械工业出版社 / 2015-9-1

Spark是不断壮大的大数据分析解决方案家族中备受关注的新增成员。它不仅为分布式数据集的处理提供一个有效框架,而且以高效的方式处理分布式数据集。它支持实时处理、流处理和批处理,提供了AllinOne的统一解决方案,使得Spark极具竞争力。 本书以源码为基础,深入分析Spark内核的设计理念和架构实现,系统讲解各个核心模块的实现,为性能调优、二次开发和系统运维提供理论支持;本文最后以项目实战......一起来看看 《Spark技术内幕》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试