使用scikit-learn分类鸢尾花数据集时出现ValueError解包错误如何解决
报错原因与代码修复
核心错误原因
你调用train_test_split时仅传入了1个未定义的变量df,根据该方法的规则,传入N个数组会返回2*N个拆分结果,仅传1个数组只会返回2个值,你用4个变量接收自然触发not enough values to unpack错误。如果要拆分特征和标签两组数据,需要同时传入特征矩阵和标签数组两个入参。
代码中存在的所有问题
- 存在大量未定义变量:
datasets、sklearn、df、training_set、testing_set均未提前声明,和你导入的模块、已定义的变量不匹配 train_test_split参数不符合需求:你原本的逻辑是遍历不同训练集占比,但写死了test_size=0.2,且未传入正确的特征、标签入参- 分类器调用参数错误:scikit-learn的传统机器学习分类器
fit方法没有batch_size、epochs参数,这两个是深度学习框架的训练参数,需要删除 - 冗余代码:你拼接的
labeled_data全程没有被使用,可以直接删除 - 自定义方法逻辑错误:
run_classifier传入的training、testing参数没有被使用,内部硬编码变量会导致逻辑混乱
修复后完整代码
from sklearn import naive_bayes, tree, metrics from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from random import seed from math import sqrt from math import pi from math import exp # 加载鸢尾花数据集 iris = load_iris() iris_data = iris.data iris_labels = iris.target # 运行分类器 def run_classifier(classifier, X_train, y_train, X_test): classifier.fit(X_train, y_train) predict = classifier.predict(X_test) return predict # 模拟不同训练集占比的准确率 def simulate(): nb_acc = [] tree_acc = [] # 训练集占比从0.5到0.825,步长0.025 training_fracs = [x/1000 for x in range(500, 850, 25)] for train_size in training_fracs: nb = naive_bayes.CategoricalNB() dt = tree.DecisionTreeClassifier() # 拆分数据集,test_size为1减去训练集占比 X_train, X_test, y_train, y_test = train_test_split(iris_data, iris_labels, train_size=train_size, random_state=25) nb_predict = run_classifier(nb, X_train, y_train, X_test) dt_predict = run_classifier(dt, X_train, y_train, X_test) nb_acc.append(metrics.accuracy_score(y_test, nb_predict)) tree_acc.append(metrics.accuracy_score(y_test, dt_predict)) return nb_acc, tree_acc, training_fracs nb_acc, tree_acc, training_fracs = simulate() print(f"Naive Bayes accuracy @ 50% training: {nb_acc[0]}") print(f"Decision Tree accuracy @ 50% training: {tree_acc[0]}")
内容的提问来源于stack exchange,提问作者meloqq
相关产品推荐
相关产品推荐

