学习Scala可能需要付出一定的努力,但它的语法更为简洁和富有表现力,代码也比Java更简洁。能够编写简短、富有表现力且类型安全、高性能的应用程序的工程师是非常有价值的。
在这个大学项目中,将探讨如何使用Scala编写CSV文件,并用它来创建一个基本的水果检测机器学习模型。
将使用的数据集可以在这里找到。数据集包含4种水果——苹果、柑橘、橙子和柠檬。将仅根据给定的高度、宽度、质量、颜色评分对它们进行分类。
尽管数据集已经清洗过,但如果想使用不同的数据集,请确保使用Python或其他方式清洗和预处理数据,以在训练模型时最大限度地利用数据。
为了编写CSV文件,将使用Scala的BufferedWriter、FileWriter和CSVWriter。需要在继续之前导入所有上述文件,以确定路径并为文件提供列标题。
将取一些数据作为训练数据集的输入,并用于编写CSV文件。
val out = new BufferedWriter(new FileWriter("D:/Academic/Assignments/Scala/Fruits.csv")) // 此行将文件定位在指定目录
val writer = new CSVWriter(out) // 这创建了一个CSVWriter对象
val FruitSchema = Array("fruit_label", "fruit_name", "fruit_subtype", "mass", "width", "height", "color_score") // 这些是CSV文件的模式/标题
然后根据模式计划创建数据集的数组。要将这些数据写入CSV文件,需要添加以下代码片段:
var listOfRecords = List() // 这创建了一个列表,用于保存数据
writer.writeAll(listOfRecords) // 这将数据添加到CSV文件中
out.close() // 关闭文件
成功完成了这一步。
已经使用Scala创建了CSV文件。还有另一种方法可以生成数据,即使用范围来生成数据,然后将其转换为列表。
首先,导入所有所需的库。然后,将创建包含需要的CSV文件数据的列表和范围。
val widthList = Range.BigDecimal(5.8, 9.6, 0.1).toList // BigDecimal(起始数字,结束数字,步数)用于接受范围内的浮点数,toList函数将此范围转换为列表
val random = new Random() // 此函数用于随机生成数据
现在将所有这些数据放入CSV中。
var listOfRecords = new ListBuffer[Array[String]]() // 这个缓冲区保存所有的数据
listOfRecords += csvFields // 这添加了模式/标题
for (i <- 1 until 50) {
listOfRecords += Array(i.toString, nameList(random.nextInt(nameList.length)), massList(random.nextInt(massList.length)).toString(), widthList(random.nextInt(widthList.length)).toString(), heightList(random.nextInt(heightList.length)).toString(), colorList(random.nextInt(colorList.length)).toString())
}
这段代码完全随机生成数据,因此在实际使用前需要非常小心。
为了构建模型,将使用Python的Jupyter IDE。在第一个CSV文件中添加了一些更多的数据行,以获得更准确的结果。
让开始导入所需的库。现在,最好将所有的CSV文件和Python文件放在同一个文件夹中,这样编码和组织起来更容易,Python也更容易找到文件。现在,将读取CSV文件。
还可以使用Python的seaborn库来可视化数据,以便更好地理解数据。暂时跳过了这一步。
让将数据分割为训练和测试数据。在分割数据后,让检查可以使用什么模型。首先尝试使用决策树,因为数据相对较少。
但可以清楚地看到,这个模型过拟合了,所以拒绝这个模型。现在,让检查K最近邻。
可以看到,训练和测试集的准确性都相当好,所以可以使用这个模型,因为它既不过拟合也不欠拟合。