使用Julia的ScikitLearn库运行KNN代码报语法错误求助
错误原因
你写的from ScikitLearn.neighbors import KNeighborsClassifier这类写法是Python的导入语法,Julia语法不支持这种写法,所以编译器在解析到from之后的ScikitLearn标识时无法识别,直接抛出语法错误。
修正方案
- 导入scikit-learn的Python模块要使用
ScikitLearn.jl提供的@sk_import宏,替换原有的三行Python风格导入代码 - 补充缺失的依赖导入(比如
Random包的shuffle函数) - 修正数据读取逻辑:你当前直接把数据集读成了纯字符串,无法直接做结构化处理,需要用
CSV.read解析为DataFrame,再拆分特征列和标签列 - 修正数据集拆分逻辑:你自定义的
splitTrainTest返回的是训练/测试全量数据集,不能直接赋值给特征X和标签y
修正后的完整可运行代码如下:
import Pkg # 首次运行需要安装依赖,后续运行可以注释掉下面的安装代码 Pkg.add("ScikitLearn") Pkg.add("DataFrames") Pkg.add("CSV") Pkg.add("DataStructures") Pkg.add("Random") using ScikitLearn: fit!, predict, @sk_import using DataFrames, CSV, DataStructures, Random # 替换原Python风格导入 @sk_import neighbors.KNeighborsClassifier: KNeighborsClassifier @sk_import model_selection: train_test_split @sk_import metrics: accuracy_score function splitTrainTest(data, at = 0.8) n = nrow(data) ind = shuffle(1:n) train_ind = view(ind, 1:floor(Int, at*n)) test_ind = view(ind, (floor(Int, at*n)+1):n) return data[train_ind,:], data[test_ind,:] end # 数据准备:解析为DataFrame,header=false是因为乳腺癌数据集默认不带表头 df = CSV.read("breast-cancer.data", DataFrame, header=false) # 拆分特征和标签,假设数据集最后一列是分类标签,可根据你的实际数据调整列索引 X = Matrix(df[:, 1:end-1]) y = Vector(df[:, end]) # 拆分训练集测试集,sklearn的train_test_split和你自定义的splitTrainTest选一个使用即可,这里直接用sklearn的实现 x_train, x_test, y_train, y_test = train_test_split(X, y, train_size=0.8, random_state=42) # 训练模型 knn = KNeighborsClassifier(n_neighbors=3) fit!(knn, x_train, y_train) # 输出准确率 println("模型准确率:", accuracy_score(y_test, predict(knn, x_test)))
内容的提问来源于stack exchange,提问作者Bill Moran
相关产品推荐
相关产品推荐

