You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

cross_val_score报错原因及修复:Windows环境连续标签适配问题

问题描述

我跟着一份机器学习教程写的代码,在MacBook Air上能正常运行,但在Windows机器上执行时报错。

报错代码行:

cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring='accuracy')

完整报错信息:

Traceback (most recent call last):
  File "D:\Applications\pythonProject\venv\lib\site-packages\joblib\parallel.py", line 862, in dispatch_one_batch
    tasks = self._ready_batches.get(block=False)
  File "C:\Users\danie\AppData\Local\Programs\Python\Python39\lib\queue.py", line 168, in get
    raise Empty
_queue.Empty

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\danie\AppData\Roaming\JetBrains\PyCharmCE2022.2\scratches\FY23 SCI FAIR\main.py", line 63, in <module>
    cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring=None)
  File "D:\Applications\pythonProject\venv\lib\site-packages\sklearn\model_selection\_validation.py", line 515, in cross_val_score
    cv_results = cross_validate(
  File "D:\Applications\pythonProject\venv\lib\site-packages\sklearn\model_selection\_validation.py", line 266, in cross_validate
    results = parallel(
  File "D:\Applications\pythonProject\venv\lib\site-packages\joblib\parallel.py", line 1085, in __call__
    if self.dispatch_one_batch(iterator):
  File "D:\Applications\pythonProject\venv\lib\site-packages\joblib\parallel.py", line 873, in dispatch_one_batch
    islice = list(itertools.islice(iterator, big_batch_size))
  File "D:\Applications\pythonProject\venv\lib\site-packages\sklearn\model_selection\_validation.py", line 266, in <genexpr>
    results = parallel(
  File "D:\Applications\pythonProject\venv\lib\site-packages\sklearn\model_selection\_split.py", line 340, in split
    for train, test in super().split(X, y, groups):
  File "D:\Applications\pythonProject\venv\lib\site-packages\sklearn\model_selection\_split.py", line 86, in split
    for test_index in self._iter_test_masks(X, y, groups):
  File "D:\Applications\pythonProject\venv\lib\site-packages\sklearn\model_selection\_split.py", line 717, in _iter_test_masks
    test_folds = self._make_test_folds(X, y)
  File "D:\Applications\pythonProject\venv\lib\site-packages\sklearn\model_selection\_split.py", line 660, in _make_test_folds
    raise ValueError(
ValueError: Supported target types are: ('binary', 'multiclass'). Got 'continuous' instead.

完整代码:

# Python version
import sys

print('Python: {}'.format(sys.version))
# scipy
import scipy

print('scipy: {}'.format(scipy.__version__))
# numpy
import numpy

print('numpy: {}'.format(numpy.__version__))
# matplotlib
import matplotlib

print('matplotlib: {}'.format(matplotlib.__version__))
# pandas
import pandas

print('pandas: {}'.format(pandas.__version__))
# scikit-learn
import sklearn

print('sklearn: {}'.format(sklearn.__version__))

# compare algorithms
from pandas import read_csv
from matplotlib import pyplot
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import StratifiedKFold
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC

# Load dataset
url = "energyFormatted.csv"
names = ['TOTAL', 'PURCHASED', 'NUCLEAR', 'SOLAR', 'WIND', 'NATURAL_GAS', 'COAL', 'OIL']
dataset = read_csv(url, names=names)
print(dataset.shape)

# Split-out validation dataset
array = dataset.values
X = array[:, 0:4]
y = array[:, 4]
X_train, X_validation, Y_train, Y_validation = train_test_split(X, y, test_size=0.20, random_state=1, shuffle=True)
# Spot Check Algorithms
models = []
models.append(('LR', LogisticRegression(solver='liblinear', multi_class='ovr')))
models.append(('LDA', LinearDiscriminantAnalysis()))
models.append(('KNN', KNeighborsClassifier()))
models.append(('CART', DecisionTreeClassifier()))
models.append(('NB', GaussianNB()))
models.append(('SVM', SVC(gamma='auto')))
# evaluate each model in turn
results = []
names = []
for name, model in models:
    kfold = StratifiedKFold(n_splits=10, random_state=1, shuffle=True)
    cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring='accuracy')
    results.append(cv_results)
    names.append(name)
    print('%s: %f (%f)' % (name, cv_results.mean(), cv_results.std()))

数据集(energyFormatted.csv):

28564,0,6284.08,1713.84,19.9948,19994.8,19.9948,19.9948
28411,0,6250.42,852.33,0,20740.03,568.22,0
27515,0,6053.3,550.3,0,20361.1,550.3,0
24586,491.72,5408.92,245.86,0,17947.78,491.72,0
26653,533.06,6130.19,0,0,18923.63,1066.12,0
26836,805.08,6172.28,0,0,18785.2,1073.44,0
26073,1303.65,5736.06,0,0,17990.37,1042.92,0
27055,1352.75,6222.65,0,0,18397.4,1082.2,0
26236,1311.8,6034.28,0,0,17578.12,1311.8,0
26020,1821.4,3903,0,0,18994.6,1040.8,260.2
26538,0,4246.08,265.38,13799.76,6369.12,0,1326.9
25800,3354,5160,0,0,14964,1290,1032
26682,3468.66,5603.22,0,0,14941.92,1600.92,1067.28
24997,3499.58,5499.34,0,0,13248.41,1499.82,1249.85
25100,3765,4769,0,0,13052,1506,2008
24651,4190.67,4930.2,0,0,12325.5,1232.55,1972.08
12053,0,1084.77,0,3133.78,6508.62,0,723.18
11500,2070,2415,0,0,4255,690,2070

问题分析与解决

1. 报错核心原因

从报错信息可以明确:

  • 你使用的全部是分类模型(LogisticRegression、DecisionTreeClassifier等),但目标变量y(对应数据集的WIND列)是连续数值类型(如19.9948、13799.76这类浮点数),属于回归任务的目标类型,分类模型无法直接处理。
  • 同时你用了StratifiedKFold交叉验证,这个方法是专门为分类任务设计的,需要保持每折的类别分布一致,完全不支持连续型目标变量。

2. 跨平台运行差异的原因

并非Mac和Windows系统本身的问题,而是两台机器的scikit-learn版本不一致:

  • 你的Mac上安装的是旧版本scikit-learn,对StratifiedKFold传入连续型目标变量的校验不严格,或者因数据分布巧合(比如目标变量唯一值较少)没有触发报错。
  • Windows机器上是较新版本scikit-learn,增加了严格的类型校验,直接抛出了正确的错误提示。

3. 修复方案

根据你的实际任务需求,有两种选择:

方案一:转为分类任务

如果你的目标是预测WIND的类别(比如划分成“低风电”“中风电”“高风电”),可以对目标变量进行离散化处理:

# 将WIND列分为3个类别
dataset['WIND'] = pandas.cut(dataset['WIND'], bins=3, labels=['low', 'medium', 'high'])

# 后续代码保持不变,此时y是分类变量,适配StratifiedKFold和分类模型

方案二:转为回归任务

如果你的目标是预测WIND的具体数值,需要更换为回归模型和适合回归的交叉验证方法:

  1. 替换分类模型为回归模型:
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.svm import SVR

models = []
models.append(('LR', LinearRegression()))
models.append(('KNN', KNeighborsRegressor()))
models.append(('CART', DecisionTreeRegressor()))
models.append(('SVM', SVR(gamma='auto')))
  1. 将StratifiedKFold替换为普通KFold(回归任务不需要保持类别分布):
from sklearn.model_selection import KFold

# 替换循环内的kfold定义
kfold = KFold(n_splits=10, random_state=1, shuffle=True)
  1. 更换回归任务的评估指标(不能用accuracy,改用回归常用指标):
# 示例:使用负均方误差作为评估指标
cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring='neg_mean_squared_error')
# 或者用R²分数
# cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring='r2')

内容的提问来源于stack exchange,提问作者donutgoos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 03:11:52