在本系列前面的文章中,简单介绍了一下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可以大规模地运行机器学习。它可以以分布式处理的方式,对大数据进行真正的机器学习管理。
相关文章
- 散户持股增厚工具:智能T0算法交易-1.选择交易平台:首先需要选择一个支持算法交易的平台,如大部分的证券交易平台都提供此服务。2. 开设账户:按照平台要求开设个人账户,并完成相关身份认证。3. 入金:向账户中转入足够的资金,以覆盖交易所需的保证金和手续费。4. 编写算法:根据自己的交易需求,编写相应的交易算法。这需要具备一定的编程基础和算法设计能力。5. 测试算法:在正式投入使用之前,务必对算法进行充分测试,以验证其有效性和稳健性。6. 部署算法:将编写的算法部署到交易平台上,并设置相应的参数。7. 监控交易:在算法执行过程中,密切关注账户的资金变动和交易记录,以便及时调整策略或应对异常情况。8. 出金:当不再需要使用算法交易时,将账户中的资金转出。第二:智能T0算法交易方式 一:先买后卖T0(正向T0)运用于相对底部具有上升趋势的时候,当日在股价紧急下挫情况下,大胆买入小于主仓的股数。然而在振荡拉升的时候,将获利的部分及时卖出*。适用场景:探底回升特点:避免价格二次杀跌
- 【机器学习】在【Pycharm】中的实践教程:使用【逻辑回归模型】进行【乳腺癌检测】
- Java 数据结构-特点: 代表一个队列,通常按照先进先出(FIFO)的顺序操作元素。 实现类: LinkedList, PriorityQueue, ArrayDeque。 堆(Heap) 堆(Heap)优先队列的基础,可以实现最大堆和最小堆。 PriorityQueue<Integer minHeap = new PriorityQueue<>; PriorityQueue<Integer maxHeap = new PriorityQueue<>(Collections.reverseOrder); 树(Trees) Java 提供了 TreeNode 类型,可以用于构建二叉树等数据结构。 class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 图(Graphs) 图的表示通常需要自定义数据结构或使用图库,Java 没有内建的图类。 以上介绍的只是 Java 中一些常见的数据结构,实际上还有很多其他的数据结构和算法可以根据具体问题选择使用。 其他一些说明 以下这些类是传统遗留的,在 Java2 中引入了一种新的框架-集合框架(Collection),我们后面再讨论。 枚举(Enumeration) 枚举(Enumeration)接口虽然它本身不属于数据结构,但它在其他数据结构的范畴里应用很广。 枚举(The Enumeration)接口定义了一种从数据结构中取回连续元素的方式。 例如,枚举定义了一个叫nextElement 的方法,该方法用来得到一个包含多元素的数据结构的下一个元素。 关于枚举接口的更多信息,请参见枚举(Enumeration)。 位集合(BitSet) 位集合类实现了一组可以单独设置和清除的位或标志。 该类在处理一组布尔值的时候非常有用,你只需要给每个值赋值一"位",然后对位进行适当的设置或清除,就可以对布尔值进行操作了。 关于该类的更多信息,请参见位集合(BitSet)。 向量(Vector) 向量(Vector)类和传统数组非常相似,但是Vector的大小能根据需要动态的变化。 和数组一样,Vector对象的元素也能通过索引访问。 使用Vector类最主要的好处就是在创建对象的时候不必给对象指定大小,它的大小会根据需要动态的变化。 关于该类的更多信息,请参见向量(Vector) 栈(Stack) 栈(Stack)实现了一个后进先出(LIFO)的数据结构。 你可以把栈理解为对象的垂直分布的栈,当你添加一个新元素时,就将新元素放在其他元素的顶部。 当你从栈中取元素的时候,就从栈顶取一个元素。换句话说,最后进栈的元素最先被取出。 关于该类的更多信息,请参见栈(Stack)。 字典(Dictionary) 字典(Dictionary) 类是一个抽象类,它定义了键映射到值的数据结构。 当你想要通过特定的键而不是整数索引来访问数据的时候,这时候应该使用 Dictionary。 由于 Dictionary 类是抽象类,所以它只提供了键映射到值的数据结构,而没有提供特定的实现。 关于该类的更多信息,请参见字典( Dictionary)。 Dictionary 类在较新的 Java 版本中已经被弃用(deprecated),推荐使用 Map 接口及其实现类,如 HashMap、TreeMap 等,来代替 Dictionary。
- 基于Python多元线性回归、机器学习、深度学习在近红外光谱分析中的实践应用
- 【数据挖掘&机器学习】招聘网站的职位招聘数据的分位数图、分位数-分位数图以及散点图、使用线性回归算法拟合散点图处理详解
- RSA算法及其在iOS中的使用
- 您可以使用什么算法在字符串中查找重复的短语?
- 在Ignite中使用线性回归算法
- 在matlab中实现线性回归和logistic回归
- 一致性Hash算法在Redis分布式中的使用