ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

GoLearn:Go 语言机器学习库的入门实战——从 CSV 数据加载到 KNN 分类评估

GoLearn:Go 语言机器学习库的入门实战——从 CSV 数据加载到 KNN 分类评估 机器学习人工智能【免费下载链接】golearnMachine Learning for Go项目地址https://gitcode.com/gh_mirrors/go/golearn点击查看免费下载GoLearn 是一个 batteries included开箱即用的 Go 语言机器学习库其设计目标是在简洁性与可定制性之间取得平衡见 README.md。本篇技术文章围绕仓库根目录 README.md 展开带你完整走一遍 GoLearn 的核心工作流把 CSV 数据读入Instances数据结构、按 scikit-learn 风格的Fit/Predict接口训练估计器、用混淆矩阵计算精度与召回率并结合仓库源码解释每一行示例代码背后的实现细节读完即可在 Go 项目中落地一个可运行的 KNN 分类与评估流程。项目定位与设计理念GoLearn 的自我定位是一句GoLearn is a batteries included machine learning library for Go.Simplicity, paired with customisability, is the goal.见 README.md。这句话包含两层含义开箱即用仓库自带从数据读取base、分类knn、linear_models、trees、naive、聚类clustering、降维pca、评估evaluation到集成学习ensemble的完整模块覆盖常见的监督与非监督学习任务简洁优先API 刻意对齐 scikit-learn 的Fit/Predict惯例使得不同估计器之间可以低成本互换方便做试错式建模。模块层面根目录的 golearn.go 只声明了顶层包文档//Package golearn is a machine learning library for Go.实际的实现分散在各个子目录中。go.mod 显示该库基于go 1.15依赖gonum矩阵/线性代数与dataframe-go等外部包因此使用 Go Modules 即可安装go get github.com/sjwhitworth/golearn仓库还自带文档系统简体中文与繁体中文文档入口分别为 doc/zh_CN/Home.md 与 doc/zh_TW/Home.md可按需深入阅读。核心工作流Instances 数据模型README 的 Getting Started 一节见 README.md概括了整个库的使用范式数据以Instances形式读入。可以把Instances类比 R 或 Pandas 中的 Data Frame它同时持有数值/类别属性和类标签对Instances可以做类似矩阵的操作再传给估计器估计器统一实现Fit/Predict接口可以随时替换估计器做对比实验库内置交叉验证、训练/测试划分等辅助函数。从源码结构看Fit/Predict这一约定由 base/classifier.go 中的Classifier接口显式定义// Classifier implementations predict categorical class labels. type Classifier interface { // Takes a set of Instances, copies the class Attribute // and constructs a new set of Instances of equivalent // length with only the class Attribute and fills it in // with predictions. Predict(FixedDataGrid) (FixedDataGrid, error) // Takes a set of instances and updates the Classifiers // internal structures to enable prediction Fit(FixedDataGrid) error String() string Save(string) error Load(string) error GetMetadata() ClassifierMetadataV1 SaveWithPrefix(*ClassifierSerializer, string) error LoadWithPrefix(*ClassifierDeserializer, string) error }注意接口中还有Save/Load分类器持久化和GetMetadata集成学习所需方法——这意味着 GoLearn 里换估计器的代价不只是换个构造函数而是所有分类器都遵守同一套生命周期约定。从 CSV 加载数据ParseCSVToInstancesREADME 示例的第一步是base.ParseCSVToInstances(datasets/iris.csv, true)。第二个布尔参数true表示 CSV 首行是表头列名会被保留下来。这个函数在 base/csv.go 中实现调用链为ParseCSVGetRowsFromReader先扫描一遍文件统计总行数若有表头则减一用于预分配DenseInstancesParseCSVGetAttributesFromReader推断每一列的类型——从源码base/csv.go可以看到类型判断只看第一行数据用正则^[-]?[0-9]*\.?[0-9]([eE][-]?[0-9])?$匹配数值列匹配成功建为FloatAttribute否则建为CategoricalAttribute同时通过ParseCSVEstimateFilePrecisionFromReader估计文件中小数点后最大位数作为浮点列的PrecisionParseCSVBuildInstancesFromReader逐行把值写入网格空字符串按缺失值处理最后instances.AddClassAttribute(attrs[len(attrs)-1])把最后一列指定为类别属性class attribute——这是 GoLearn 的约定CSV 的最后一列是标签。因此使用ParseCSVToInstances时有两个前提需要注意文件第一行是表头或传false以及标签必须位于最后一列。仓库中用于示例的 examples/datasets/iris.csv 正是这种布局。此外README 中提到也可以从零开始构造 InstancesYou can also create instances from scratch仓库的 examples/instances/instances.go 演示了这一用法。完整示例Iris 数据集上的 KNN 分类下面是 README.md 给出的完整可运行示例配合源码注释逐步拆解package main import ( fmt github.com/sjwhitworth/golearn/base github.com/sjwhitworth/golearn/evaluation github.com/sjwhitworth/golearn/knn ) func main() { // Load in a dataset, with headers. Header attributes will be stored. // Think of instances as a Data Frame structure in R or Pandas. // You can also create instances from scratch. rawData, err : base.ParseCSVToInstances(datasets/iris.csv, true) if err ! nil { panic(err) } // Print a pleasant summary of your data. fmt.Println(rawData) //Initialises a new KNN classifier cls : knn.NewKnnClassifier(euclidean, linear, 2) //Do a training-test split trainData, testData : base.InstancesTrainTestSplit(rawData, 0.50) cls.Fit(trainData) //Calculates the Euclidean distance and returns the most popular label predictions, err : cls.Predict(testData) if err ! nil { panic(err) } // Prints precision/recall metrics confusionMat, err : evaluation.GetConfusionMatrix(testData, predictions) if err ! nil { panic(fmt.Sprintf(Unable to get confusion matrix: %s, err.Error())) } fmt.Println(evaluation.GetSummary(confusionMat)) }各关键步骤说明步骤代码源码依据读入数据base.ParseCSVToInstances(datasets/iris.csv, true)base/csv.go返回*DenseInstances初始化 KNNknn.NewKnnClassifier(euclidean, linear, 2)knn/knn.go签名NewKnnClassifier(distfunc, algorithm string, neighbours int)即距离函数euclidean、搜索算法linear线性扫描、邻居数k2训练/测试划分base.InstancesTrainTestSplit(rawData, 0.50)base/util_instances.go按 0.5 比例切分训练cls.Fit(trainData)Classifier.Fit(FixedDataGrid) error见 base/classifier.go预测cls.Predict(testData)返回只含类标签列的FixedDataGrid评估evaluation.GetConfusionMatrix/GetSummaryevaluation/confusion.goKNN 预测的注释说得很直白Calculates the Euclidean distance and returns the most popular label——即对每个待预测样本计算与训练样本的欧氏距离取k个最近邻中票数最高的标签。这里k2是偶数出现平票时由 KNN 内部逻辑处理可参考 knn/knn.go 及其测试 knn/knn_test.go。运行结果解读README 给出的示例输出README.md是GetSummary打印的评估表Iris-virginica 28 2 56 0.9333 0.9333 0.9333 Iris-setosa 29 0 59 1.0000 1.0000 1.0000 Iris-versicolor 27 2 57 0.9310 0.9310 0.9310 Overall accuracy: 0.9545从 evaluation/confusion.go 的GetSummary实现可知每个类一行依次为真实类名、True Positives正确预测数、False Positives被误判为该类的数量、True Negatives、Precision精确率、Recall召回率、F1 Score最后一行输出整体准确率对角线元素之和除以总数。以 Iris-setosa 为例29 个测试样本全部预测正确精确率与召回率均为 1.0000三个类别整体准确率为 0.9545。混淆矩阵本身在 evaluation/confusion.go 中被定义为map[string]map[string]int外层键为真实类内层键为预测类行不匹配时GetConfusionMatrix会返回 Row count mismatch 错误。除GetSummary外evaluation包还提供了GetMicroPrecision、GetMacroRecall等多类聚合指标以及用于打印矩阵本体的ShowConfusionMatrixevaluation/confusion.go。仓库内置示例直接运行的三个入口README 的 Examples 一节README.md指出仓库自带可运行的实战示例原文给出了 GOPATH 时代的路径写法。在当前仓库中这三个入口分别位于示例仓库内路径说明KNN 分类 Irisexamples/knnclassifier/knnclassifier_iris.go与 README 主示例几乎一致数据文件为 examples/datasets/iris_headers.csvInstances 基础操作examples/instances/instances.go演示从零构建与操作 Instances决策树examples/trees/含 ID3examples/trees/id3/trees.go、CARTexamples/trees/cart/cart.go、孤立森林examples/trees/isolationForest/isolation_forest.go等子目录由于当前仓库使用 Go Modules见 go.mod在模块外部直接go run示例文件即可无需再按cd $GOPATH/src/github.com/sjwhitworth/golearn/...的方式操作示例内部以相对路径引用数据集例如../datasets/iris_headers.csv注意保持运行工作目录与示例文件位置的关系不变。除上述三个入口外examples/datasets/目录下还备有大量可直接用于实验的数据集如 examples/datasets/iris.csv、examples/datasets/wine.arff、examples/datasets/tennis.csv、examples/datasets/titanic.csv、examples/datasets/boston_house_prices.csv回归等examples/下还有averageperceptron、crossfold、serialization等示例可分别感知感知机、交叉验证与序列化功能。评估与验证工具链除了前述混淆矩阵evaluation包还提供交叉验证支持evaluation/cross_fold.go 实现 K 折划分配套测试见 evaluation/cross_fold_test.go配合base.InstancesTrainTestSplitbase/util_instances.go构成了 README 所说的 helper functions for data, like cross validation, and train and test splitting。训练集切分后trainData与testData都是FixedDataGrid接口的实现Fit只消费训练集Predict返回的预测网格只包含类属性列这与GetConfusionMatrix(ref, gen)的签名两个FixedDataGrid逐行比较base.GetClass相吻合。小结与延伸阅读回到 README.md 的主线GoLearn 提供的最小闭环是base.ParseCSVToInstances把 CSV 读成带类型与标签的Instances最后一列为类标签表头作为列名任意实现base.Classifier接口的估计器都遵循Fit/Predict可自由替换KNN、liblinear、朴素贝叶斯、决策树等均在仓库对应子目录中base.InstancesTrainTestSplit与evaluation包完成数据划分、混淆矩阵、Precision/Recall/F1 与整体准确率的计算。若要继续深入可按以下顺序阅读仓库中文文档首页 doc/zh_CN/Home.md含 CSV 读取、过滤、KNN、决策树、liblinear、回归等主题的链接索引、分类接口 base/classifier.go、CSV 解析 base/csv.go、KNN 实现 knn/knn.go、评估实现 evaluation/confusion.go以及examples/目录下的各可运行示例。README 最后也提到项目处于活跃开发中欢迎使用者反馈——对 Go 技术栈的工程师来说这套 数据 → 估计器 → 评估 的约定是与 scikit-learn 用户心智最接近的迁移路径。赞分享机器学习人工智能【免费下载链接】golearnMachine Learning for Go项目地址https://gitcode.com/gh_mirrors/go/golearn点击查看免费下载相关推荐GoLearnGo语言机器学习库新范式零基础入门到实战全指南GoLearnGo语言机器学习库新范式零基础入门到实战全指南 你还在为Go语言缺乏高效机器学习工具而烦恼吗还在纠结如何用Go实现数据分析与预测功能吗本文机器学习人工智能【亲测免费】 GoLearnGo语言的机器学习库GoLearnGo语言的机器学习库 项目基础介绍和主要编程语言 GoLearn是一个为Go语言设计的“即插即用”的机器学习库。它旨在提供简单易用的接口同时保机器学习人工智能Python数据分析实战从入门到量子机器学习的未来之路Python数据分析实战从入门到量子机器学习的未来之路 你是否还在为海量数据处理效率低下而烦恼是否想突破传统分析方法的瓶颈本文将带你从Python数据分析教程文档数据分析上一篇10分钟掌握React Native Elements打造跨平台移动UI的终极指南下一篇终极指南如何使用FOSRestBundle实现格式无关的RESTful API控制器设计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表